{"version":3,"file":"client-app-omnivise-web-23bfae986d6900e46f07b8186ec94db6.js","names":["_exports","default","_class","DS","JSONAPIAdapter","extend","constructor","args","super","this","_descriptor","_defineProperty","config","api","namespace","host","headers","Authorization","session","ownAccessToken","prototype","service","configurable","enumerable","writable","initializer","AssetDescriptor","ApplicationAdapter","NotificationAlert","Preference","updateRecord","_store","_type","snapshot","data","serialize","includeId","userId","user","id","url","Object","assign","Promise","resolve","reject","fetch","method","body","JSON","stringify","then","json","error","User","urlForQueryRecord","query","originalUrl","me","include","checkIsFeatureEnabled","featureName","isEnvVarValue","featureFlags","toLowerCase","isBooleanValue","Sentry","init","dsn","sentryDSN","integrations","replayIntegration","tracesSampleRate","replaysSessionSampleRate","replaysOnErrorSampleRate","debug","environment","instanceConfiguration","envName","browserTracingOptions","tracePropagationTargets","App","Application","modulePrefix","podModulePrefix","Resolver","loadInitializers","__COLOCATED_TEMPLATE__","_templateFactory","createTemplateFactory","block","moduleName","isStrictMode","_component","setComponentTemplate","templateOnly","FooterComponent","Component","_initializerDefineProperty","_descriptor2","_descriptor3","_descriptor4","_descriptor5","currentLocale","intl","primaryLocale","corporateInformation","terms","cookies","privacy","licenses","router","urlFor","currentModule","moduleId","currentRoute","attributes","internalView","module","get","store","peekRecord","console","log","version","APP","match","shortVersion","delimiter","includes","indexOfDelimiter","lastIndexOf","substring","currentYear","Date","getFullYear","showVersion","toggleLongVersion","isShowingLongVersion","toggleModuleDetailsModal","isModalShowing","hideModuleDetailsModal","_applyDecoratedDescriptor","tracked","action","getOwnPropertyDescriptor","ForceDownloadButtonComponent","_dec","task","maxConcurrency","downloadFile","path","fileName","response","blob","link","document","createElement","href","URL","createObjectURL","download","click","remove","HeaderComponent","handleAuthenticationChange","runTask","isAuthenticated","showDetails","accordion","ApplicationHeaderLanguageComponent","changeLocale","locale","closeMenu","setLocale","currentUserPreference","preferences","save","TETHERED","HeaderMenuModalComponent","arguments","modifier","element","resizeObserver","ResizeObserver","window","requestAnimationFrame","mode","positionDialog","dialogElement","observe","documentElement","disconnect","triggerElement","resetMode","open","showModal","close","onClose","stopPropagation","event","toggle","hasAttribute","detach","resetPosition","attach","triggerRect","getBoundingClientRect","dialogRect","positionLeft","left","width","positionTop","bottom","style","top","removeProperty","maximized","HeaderOesNotifications","HeaderOesTickets","HeaderTooltipComponent","toggleShouldShowTooltip","currentValue","showTooltipService","shouldShowTooltip","setShouldShowTooltip","HeaderUserMenu","firstName","currentUserFirstName","lastName","currentUserLastName","fullName","email","currentUserEmail","initials","toggleUserMenu","userMenuOpen","header","wrapper","overlay","HelpMaterials","owner","_descriptor6","_descriptor7","selectedModule","loadModules","perform","loadAssetDescriptors","modules","findAll","assetDescriptors","filter","onModuleSelect","e","target","value","trackHelpMaterialsUsageEvent","assetDescriptor","omniviseMetricsService","externalAssets","asset","category","fileAssets","LICENSES_NAMESPACE","LicensesListComponent","shadowRoot","attachShadow","innerHTML","selectedLicenseHTML","getApiUrl","loadLicenses","openLicenseModal","license","selectedLicense","loadLicenseHtml","paths","html","closeLicenseModal","getLicensePath","ok","errorText","text","logErrorUtil","logError","htmlText","htmlSafe","errors","responseJSON","files","wallpaper","LoginComponent","isShowingContactUsButton","isShowingContactUsForm","ContactUsFormComponent","submitForm","companyName","message","errorMessage","successMessage","apiHost","name","company","result","_postData","formSubmitted","options","isAbortError","menu","LoginFormComponent","authConfig","getOwner","resolveRegistration","mainIdps","split","secondaryIdps","login","provider","ModulesLauncher","formElement","loadCategories","uncategorizedModules","moduleCategories","length","handleSearch","formData","FormData","currentTarget","searchString","clearSearch","reset","join","categories","scrollIntoView","elementSelector","querySelector","behavior","ModulesLauncherListComponent","initDefaultModulePage","defaultModulePage","defaultPage","filteredModules","normalizedSearchString","trim","setAsDefault","modulePage","card","ModulesLauncherTileComponent","loadViews","views","findFirstViewByType","type","find","view","modelName","defaultView","hasDefaultView","isDefaultViewInternal","isDefaultViewOfType","handleIconError","icon","changeDefault","checked","isDefault","launchModule","preventDefault","transitionTo","onModuleLaunched","toggleShowDevData","isDevDataShowing","showModuleDetailsModal","toggleLauncher","ModulesLauncherDevData","selectView","selectedView","RETRY_DELAY","NOTIFICATION_TYPES","NotificationsManager","keepLatest","_dec2","drop","allowToConnect","features","isEnabled","_descriptor8","_descriptor9","_descriptor10","_descriptor11","_descriptor12","_descriptor13","_descriptor14","_descriptor15","_descriptor16","_descriptor17","initNotifications","notification","on","unloadNotifications","wasAuthenticatedBefore","setupWebSocketAndLoadNotifications","fetchUnreadNotificationsCount","peekAll","forEach","unloadRecord","isWebSocketAlive","webSocket","WebSocket","CLOSING","CLOSED","readyState","initialiseWebSocket","loadUnreadNotifications","loadReadNotifications","Error","cause","page","currentTime","ownClaims","exp","notificationAlertsManyArray","recent_read","per_page","notificationAlertsCount","search","meta","pageCountUnread","pagination","page_count","totalOfNotifications","totalUnreadCount","isRead","totalReadCount","currentPageUnread","startIndex","endIndex","notificationAlertsUnread","slice","hasNotificationsBeenLoadedOnce","retryAfterDelay","pageCountRead","currentPageRead","notificationAlertsRead","timeout","searchForInput","refreshNotifications","loadNextPageUnread","isRunning","loadNextPageRead","refreshReadNotifications","cleanupAfterLogOut","cancelAll","isDestroyed","isDestroying","unreadNotifications","sortedUnreadNotificationAlerts","readNotifications","sortedReadNotificationAlerts","sort","a","b","timeStamp","getTime","accessToken","webSocketHost","webSocketDestructor","registerDestructor","addEventListener","unregisterDestructor","onNotficationConnectionClose","onNotficationConnectionMessage","unreadCount","summaries","summary","is_read","reduce","acc","total","unreadNotificationsCount","liveNotificationAlertPayload","parse","modelClass","modelFor","liveNotificationAlertNormalizedPayload","serializerFor","normalize","liveNotificationAlert","push","wsNotification","Array","isArray","isEmpty","existingNotification","n","some","pdsBasicConfiguredComponentId","notificationTarget","route","model","queryParams","state","n_id","notificationTargetUrl","notificationIcon","notificationType","transitionToNotification","selectedList","splice","clickedNotification","markAsRead","isNotificationSelected","notificationId","root","active","NotificationsManagerList","TrackedArray","someNotificationsSelected","indeterminateCheckbox","toggleNotificationSelection","indexOf","selectedNotificationsCount","toggleAllNotifications","selectAllClicked","indeterminate","idsToUpdate","map","x","idToUpdate","ids","setupViewport","loader","onEnter","inViewport","watchElement","viewportTolerance","handleEnterViewport","bind","cleanupViewport","stopWatching","activeTab","NAV_VC_ID","NOTIFICATION_VC_ID","OesView","loadComponents","stackedView","findRecord","widgets","configuredWidgets","widget","ccs","configuredComponents","navVc","cc","notificationVc","ccsOnRightSide","components","normalizedAvc","avc","activeVc","required","dropzone","ALLOWED_FILE_TYPES","CreateTicketFormComponent","enqueue","_descriptor18","loadRequestTypesAndPriorities","attachmentFromVisualizationComponent","from","file","vcFileUpload","queue","fileQueue","findOrCreate","titleFromVisualizationComponent","omniviseTickets","eventDetail","title","descriptionFromVisualizationComponent","description","attachment","defaultModule","selectedModuleName","selectModule","moduleNames","el","serviceDeskID","_getRequest","requestTypes","values","responseJSONPrio","priorities","Headers","isError","dataType","uploadPhoto","resetValidationErrors","validateFile","processFilePromise","async","fileUploadPromise","errorType","attachments","vcAttachments","processFile","_postDataUploadPhoto","pendingAttachments","upload","authorization","status","temporaryAttachments","firstObject","fileVc","File","append","res","vcAttachment","requestType","priority","allSettled","currentView","params","view_id","currentURLState","urlState","urlStateFor","selectedModuleLabel","replace","enhancedDescription","_","temporaryAttachmentId","vcTemporaryAttachments","serviceDeskId","requestTypeId","requestFieldValues","labels","issueKey","capture","setOmniviseTicketsVisibility","stream","navigator","mediaDevices","getDisplayMedia","video","mediaSource","canvas","takeScreenshot","takeScreenshotWithImageCapture","takeScreenshotWithVideoPlay","showScreenshotHelpScreen","toBlob","uploadFile","UploadFile","fromBlob","defineProperty","writeable","onShowTakeScreenshotHelpChange","isFileTypeValid","isFileSizeValid","size","fileType","uploadImage","onFileDeleted","willDestroy","CreateTicketTakeScreenshotHelpComponent","imgSrc","toDataURL","CropScreenshotModalComponent","home","Home","openTicketCreationForm","closeTicketCreationForm","shouldShowTicketCreationForm","OmniviseTickets","openTicketDialog","registerTrigger","trigger","maximizeOmniviseTicketsModal","dialogDetach","showMaximizedOmniviseTickets","minimizeOmniviseTicketsModal","dialogAttach","setShowTakeScreenshotHelp","showTakeScreenshotHelp","toggleOmniviseTicketsModule","dialogClose","resetMaximizedState","RedirectToAuthIfAuthenticated","onAuthenticationChange","redirectUri","redirectToDestinationAfterAuthentication","RedirectToLoginIfUnauthenticated","isTokenValid","stopListeningForLogoutEvents","location","pathname","promise","VisualizationComponentRenderer","_dec3","_dec4","accessTokens","componentDescriptor","configuredComponent","authScopes","getProperties","fromEntries","scope","nonPrefixedConfiguredComponentId","viewRoute","urlStateForAllConfiguredComponents","instanceConfigurationResult","toString","deviceState","deviceStateService","deviceStateFor","oldState","newState","dispatchStateToView","encodedUrlStates","freeze","handleUrlStateChangeEvent","detail","handleOpenTicketsEvent","handleSetDeviceStateEvent","updateDeviceStatesPerCC","handleOnFleetFavoritesChangeEvent","handleRaiseErrorEvent","logRaiseError","vcId","vcVersion","handleNavigationChangeEvent","urlStates","newUrlState","urlStateService","configuredComponentId","entries","keys","handleActiveVcChange","component","stateFormatted","undefined","handleCreateResolvedUrl","validateResolveUrlParams","resolvedUrlsRequests","add","handleDeleteResolvedUrl","pair","sameView","sameUrlStates","delete","isPresent","resolvedUrls","resolvedUrlsMap","resolvedUrlsRequest","key","calculateUrlForId","hostUrl","calculateUrlFor","currentUrlStates","mergedUrlStates","routeInfo","origin","TrackedSet","prepare","embedUrl","isReady","all","loadVisualizationComponent","ensureAccessTokensForAuthScopes","calculateCustomElementName","loadInstanceConfiguration","registerVisualizationComponent","URLSearchParams","ic","ensureAccessTokenFor","authScope","downloadUrl","iat","remaining","alert","reload","ecmaScriptModule","Ember","testing","folder","substr","import","schema","visualizationComponentHostURL","visualizationComponent","customElementName","customElements","define","visualizationComponentName","downloadUrlHash","str","TextEncoder","encode","hashBuffer","crypto","subtle","digest","Uint8Array","padStart","hashString","far","fas","i","r","l","call","reverse","onKey","keyResponder","_class2","Controller","toggleHeaderFooterVisibility","currentPage","isSomeKindOfOESView","isHeaderFooterVisible","userPreferences","removeDefaultAndGoToHomePage","removeDefault","AuthView","isOESView","startsWith","time","hhmmss","hour","minute","second","date","mmddyyhhmmss","month","day","year","hourCycle","number","compact","notation","EUR","currency","minimumFractionDigits","maximumFractionDigits","USD","addEventListenerToElement","functions","fn","helper","appVersion","hash","versionOnly","hideSha","shaOnly","hideVersion","showExtended","versionExtendedRegExp","versionRegExp","shaRegExp","CreateElementHelper","Helper","compute","tagName","attribute","removeAttribute","serializedValue","getAttribute","setAttribute","jsonStringify","styles","pluralize","singularize","initialize","initializerFactory","setupContainer","Config","load","ENV","registerLibrary","attr","defaultValue","_dec5","_dec6","_dec7","Model","hasMany","inverse","releaseChannel","belongsTo","polymorphic","ViewModel","as","normalizeLocaleToApi","_dec8","benefits","contactFullName","contactFirstName","contactLastName","_dec9","_dec10","_dec11","_dec12","_dec13","hasInformationDetail","serialized","timezone","Modifier","modify","userCentric","onRestartEmbeddings","Router","EmberRouter","locationType","rootURL","Route","beforeModel","pickupSessionState","afterModel","routeChangeService","listenForRouteChanges","verifyUCEvents","transition","loadOwnUser","updateLocale","intent","featuresManager","setFeatures","ViewErrorRoute","refreshModel","parameters","moduleOptions","code","redirect","InfoCookiesRoute","InfoCorporateRoute","InfoPrivacyRoute","InfoTermsRoute","LicensesRoute","isComingFromAuthenticatedRoute","abort","onLocalStorageChanged","newValue","ownTrustZone","focused","onWindowFocus","onWindowBlur","activate","deactivate","removeEventListener","JSONAPISerializer","keyForAttribute","keyForRelationship","Service","currentRouteName","authViewRoute","viewId","t","hoverText","localStorage","ccId","loadManageableFeaturesList","defaultConfig","featuresConfig","enable","disable","_default","Features","setup","userLocale","userBrowserLocale","browserLang","language","supportedLocales","locales","supportedLocale","NotificationService","Evented","_OmniviseMetrics_brand","WeakSet","_classPrivateMethodInitSpec","gaAdapter","userProperties","_assertClassBrand","_getUserInfoProps","_getGuestUserInfoProps","environments","OWC_GA4_ID","anonymize_ip","debug_mode","send_page_view","user_properties","ucPerformanceGAId","userConsents","adapters","consent","metrics","activateAdapters","clear","domain","trackPageView","_populateMetricsContextWithUserInfo","_populateMetricsContextWithGuestUserInfo","currentURL","trackPage","trackEvent","context","_isInternalUser","sub","endsWith","oid","isInternalUser","gaUserId","isInternal","UrlStateService","updateUrlStatesPerView","UnauthenticatedError","LOGOUT_COOKIE_DOMAIN","hostname","LOGOUT_COOKIE_NAME","IdentityProviderFactory","createFacade","requiredIdps","isUserValid","jwtDecode","now","ownAuthTrustZone","setLogoutCookie","Cookies","set","expires","sessionStorage","getItem","setItem","clearRedirectUri","removeItem","targetUrl","isInternalUrl","followRedirects","setTimeout","cleanUpAfterLogout","accessTokenInfo","idp","setupUserInSentry","updateLocalStorageAccessToken","tokenExpired","scheduleTokenRefreshProcess","listenForLogoutEvents","trustZone","existingAccessToken","ensureAccessTokenForDefaultTrustZone","logoutListenerIntervalId","setInterval","logoutTime","parseInt","timeOfLogoutCheck","clearTimeout","stopRefreshTokenProcess","tokenRefreshIntervalId","token","lockExists","accessTokenRefreshLock","thirtySecondsAgo","lockIsRecent","updatedAccessToken","update","invalidate","unloadAll","clearUserInSentry","logout","queryRecord","setUser","currentUserId","uid","_classPrivateFieldInitSpec","_urlStatesPerView","TrackedMap","_classPrivateFieldGet","to","activateAnalytics","deactivateAnalytics","filteredConsents","UC_UI","getServicesBaseInfo","isEssential","openSecondLayerConsent","isInitialized","showSecondLayer","restartEmbeddings","namespaceOverride","Intl","getCanonicalLocales","AzureFederatedIdentityProvider","OktaIdentityProvider","azureAdUrl","AzureIdentityProvider","IdentityProvider","msal","PublicClientApplication","azureConfig","graphScope","azureScopes","auth","clientId","scopes","account","azureInstance","getAllAccounts","acquireTokenSilentAzure","handleRedirectPromise","loginRedirect","resp","acquireTokenSilent","forceRefresh","currentAccounts","sso","logoutRedirect","mainWindowRedirectUri","ssoSilent","IdentityProviderFacade","idps","idpName","createIdp","KeycloakIdentityProvider","TestIdentityProvider","realm","keycloakConfig","kc","Keycloak","_initKC","didInitialize","onLoad","logoutOptions","post_logout_redirect_uri","postLogoutRedirectUri","client_id","updateToken","UnknownAuthError","oktaConfig","authorizationServerId","oktaDomain","issuer","pkce","oktaUrl","authClient","revokeAccessToken","closeSession","fetchAccessToken","sessionToken","responseType","getWithoutPrompt","tokens","fetchOwnAccessToken","OktaAuth","generateAccessToken","customClaims","defaults","Math","floor","valueOf","first_name","last_name","claims","btoa","captureMessage","captureException","setTag","componentId","setContext","siemensIdUrl","track","getVideoTracks","imageCapture","ImageCapture","bitmap","grabFrame","stop","height","getContext","drawImage","srcObject","videoWidth","videoHeight","play","metaName","prefix","rawConfig","exports","decodeURIComponent","err","runningTests","require","create"],"sources":["vendor/ember-cli/app-prefix.js","client-app-omnivise-web/adapters/application.ts","client-app-omnivise-web/adapters/asset-descriptor.ts","client-app-omnivise-web/adapters/notification-alert.ts","client-app-omnivise-web/adapters/preference.js","client-app-omnivise-web/adapters/user.ts","client-app-omnivise-web/app.js","client-app-omnivise-web/components/contact-support-link.js","client-app-omnivise-web/components/footer/index.css.js","client-app-omnivise-web/components/footer/index.ts","client-app-omnivise-web/components/footer/link.js","client-app-omnivise-web/components/force-download-button.js","client-app-omnivise-web/components/header/index.js","client-app-omnivise-web/components/header/language.css.js","client-app-omnivise-web/components/header/language.js","client-app-omnivise-web/components/header/menu-modal.css.js","client-app-omnivise-web/components/header/menu-modal.js","client-app-omnivise-web/components/header/modules-launcher.js","client-app-omnivise-web/components/header/oes/notifications.css.js","client-app-omnivise-web/components/header/oes/notifications.ts","client-app-omnivise-web/components/header/oes/tickets.ts","client-app-omnivise-web/components/header/special-my-health-button.js","client-app-omnivise-web/components/header/tooltip.js","client-app-omnivise-web/components/header/top-line.css.js","client-app-omnivise-web/components/header/top-line.js","client-app-omnivise-web/components/header/user-menu.css.js","client-app-omnivise-web/components/header/user-menu.js","client-app-omnivise-web/components/help-materials/external-material.js","client-app-omnivise-web/components/help-materials/file-asset.js","client-app-omnivise-web/components/help-materials/header.css.js","client-app-omnivise-web/components/help-materials/header.js","client-app-omnivise-web/components/help-materials/index.css.js","client-app-omnivise-web/components/help-materials/index.js","client-app-omnivise-web/components/help-materials/main.css.js","client-app-omnivise-web/components/help-materials/main.js","client-app-omnivise-web/components/licenses-list.js","client-app-omnivise-web/components/login.css.js","client-app-omnivise-web/components/login.js","client-app-omnivise-web/components/login/contact-us-form.js","client-app-omnivise-web/components/login/login-form.css.js","client-app-omnivise-web/components/login/login-form.js","client-app-omnivise-web/components/modules-launcher/category.css.js","client-app-omnivise-web/components/modules-launcher/category.js","client-app-omnivise-web/components/modules-launcher/index.css.js","client-app-omnivise-web/components/modules-launcher/index.js","client-app-omnivise-web/components/modules-launcher/list.js","client-app-omnivise-web/components/modules-launcher/tile.css.js","client-app-omnivise-web/components/modules-launcher/tile.js","client-app-omnivise-web/components/modules-launcher/tile/dev-data.css.js","client-app-omnivise-web/components/modules-launcher/tile/dev-data.js","client-app-omnivise-web/components/modules-launcher/tile/header.css.js","client-app-omnivise-web/components/modules-launcher/tile/header.js","client-app-omnivise-web/components/modules-launcher/tile/module-info.css.js","client-app-omnivise-web/components/modules-launcher/tile/module-info.js","client-app-omnivise-web/components/notifications-manager/index.css.js","client-app-omnivise-web/components/notifications-manager/index.js","client-app-omnivise-web/components/notifications-manager/item.css.js","client-app-omnivise-web/components/notifications-manager/item.js","client-app-omnivise-web/components/notifications-manager/list.css.js","client-app-omnivise-web/components/notifications-manager/list.js","client-app-omnivise-web/components/notifications-manager/toggler.css.js","client-app-omnivise-web/components/notifications-manager/toggler.js","client-app-omnivise-web/components/oes-view.ts","client-app-omnivise-web/components/omnivise-tickets/create-ticket-form.css.js","client-app-omnivise-web/components/omnivise-tickets/create-ticket-form.js","client-app-omnivise-web/components/omnivise-tickets/create-ticket-take-screenshot-help.css.js","client-app-omnivise-web/components/omnivise-tickets/create-ticket-take-screenshot-help.js","client-app-omnivise-web/components/omnivise-tickets/crop-screenshot-modal.js","client-app-omnivise-web/components/omnivise-tickets/error-screen.js","client-app-omnivise-web/components/omnivise-tickets/header.css.js","client-app-omnivise-web/components/omnivise-tickets/header.js","client-app-omnivise-web/components/omnivise-tickets/home.css.js","client-app-omnivise-web/components/omnivise-tickets/home.js","client-app-omnivise-web/components/omnivise-tickets/index.css.js","client-app-omnivise-web/components/omnivise-tickets/index.js","client-app-omnivise-web/components/redirect-to-auth-if-authenticated.js","client-app-omnivise-web/components/redirect-to-login-if-unauthenticated.js","client-app-omnivise-web/components/regular-view.js","client-app-omnivise-web/components/second-level-navigation.js","client-app-omnivise-web/components/token-expired-modal.js","client-app-omnivise-web/components/visualization-component-renderer.js","client-app-omnivise-web/config/icons.js","client-app-omnivise-web/controllers/application.js","client-app-omnivise-web/controllers/auth/view-error.js","client-app-omnivise-web/controllers/auth/view.js","client-app-omnivise-web/formats.js","client-app-omnivise-web/helpers/add-event-listener-to-element.js","client-app-omnivise-web/helpers/app-version.js","client-app-omnivise-web/helpers/create-element.js","client-app-omnivise-web/helpers/json-stringify.js","client-app-omnivise-web/helpers/log-error.js","client-app-omnivise-web/helpers/module-badge.js","client-app-omnivise-web/helpers/pluralize.js","client-app-omnivise-web/helpers/singularize.js","client-app-omnivise-web/initializers/app-version.js","client-app-omnivise-web/initializers/ember-cli-mirage.js","client-app-omnivise-web/initializers/ember-data.js","client-app-omnivise-web/initializers/ensure-local-class-included.js","client-app-omnivise-web/initializers/load-bootstrap-config.js","client-app-omnivise-web/instance-initializers/ember-data.js","client-app-omnivise-web/models/asset-descriptor.js","client-app-omnivise-web/models/component-descriptor.js","client-app-omnivise-web/models/configured-component.js","client-app-omnivise-web/models/configured-widget.js","client-app-omnivise-web/models/external-view.js","client-app-omnivise-web/models/internal-view.js","client-app-omnivise-web/models/module-badge.js","client-app-omnivise-web/models/module-category.js","client-app-omnivise-web/models/module-information-detail.js","client-app-omnivise-web/models/module.js","client-app-omnivise-web/models/notification-alert.js","client-app-omnivise-web/models/preference.js","client-app-omnivise-web/models/stacked-view.js","client-app-omnivise-web/models/user.js","client-app-omnivise-web/models/view.js","client-app-omnivise-web/modifiers/restart-uc-embeddings.js","client-app-omnivise-web/modifiers/save-redirect-uri.js","client-app-omnivise-web/router.js","client-app-omnivise-web/routes/application.js","client-app-omnivise-web/routes/auth.js","client-app-omnivise-web/routes/auth/index.js","client-app-omnivise-web/routes/auth/view-error.js","client-app-omnivise-web/routes/auth/view.js","client-app-omnivise-web/routes/index.js","client-app-omnivise-web/routes/info/cookies.js","client-app-omnivise-web/routes/info/corporate.js","client-app-omnivise-web/routes/info/privacy.js","client-app-omnivise-web/routes/info/terms.js","client-app-omnivise-web/routes/licenses.js","client-app-omnivise-web/routes/login.js","client-app-omnivise-web/serializers/application.ts","client-app-omnivise-web/serializers/notification-alert.ts","client-app-omnivise-web/serializers/preference.ts","client-app-omnivise-web/services/current-page.js","client-app-omnivise-web/services/device-state.js","client-app-omnivise-web/services/features-manager.js","client-app-omnivise-web/services/features.js","client-app-omnivise-web/services/locale.js","client-app-omnivise-web/services/notification.js","client-app-omnivise-web/services/omnivise-metrics.js","client-app-omnivise-web/services/omnivise-tickets.js","client-app-omnivise-web/services/route-change.js","client-app-omnivise-web/services/session.js","client-app-omnivise-web/services/show-tooltip.js","client-app-omnivise-web/services/url-state.js","client-app-omnivise-web/services/user-centric.js","client-app-omnivise-web/styles/app.js","client-app-omnivise-web/utils/get-api-url.js","client-app-omnivise-web/utils/get-normalized-locale.js","client-app-omnivise-web/utils/identity-providers/azure-federated-idp.js","client-app-omnivise-web/utils/identity-providers/azure-idp.js","client-app-omnivise-web/utils/identity-providers/idp-facade.js","client-app-omnivise-web/utils/identity-providers/idp-factory.js","client-app-omnivise-web/utils/identity-providers/idp-interface.js","client-app-omnivise-web/utils/identity-providers/keycloak-idp.js","client-app-omnivise-web/utils/identity-providers/okta-idp.js","client-app-omnivise-web/utils/identity-providers/test-idp.js","client-app-omnivise-web/utils/log-error.js","client-app-omnivise-web/utils/redirect-to-siemens-id-url.js","client-app-omnivise-web/utils/take-screenshot.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["'use strict';\n\n\n","import DS from 'ember-data';\nimport { inject as service } from '@ember/service';\n\nimport config from '../config/environment';\n\nexport default class Application extends DS.JSONAPIAdapter.extend({\n  // anything which *must* be merged on the prototype\n}) {\n  // normal class body\n  @service session;\n\n  namespace = config.api.namespace;\n  host = config.api.host;\n\n  get headers() {\n    let accessToken = this.session.ownAccessToken;\n\n    return {\n      Authorization: `Bearer ${accessToken}`,\n      'Cache-Control': 'no-cache',\n    };\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your adapters.\ndeclare module 'ember-data/types/registries/adapter' {\n  export default interface AdapterRegistry {\n    application: Application;\n  }\n}\n","import ApplicationAdapter from './application';\n\nexport default class AssetDescriptor extends ApplicationAdapter {\n  namespace = 'api/v1';\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your adapters.\ndeclare module 'ember-data/types/registries/adapter' {\n  export default interface AdapterRegistry {\n    moduleBadge: AssetDescriptor;\n  }\n}\n","import ApplicationAdapter from './application';\n\nexport default class NotificationAlert extends ApplicationAdapter {\n  namespace = 'api/v3';\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your adapters.\ndeclare module 'ember-data/types/registries/adapter' {\n  export default interface AdapterRegistry {\n    'notification-alert': NotificationAlert;\n  }\n}\n","import ApplicationAdapter from './application';\nimport fetch from 'fetch';\n\nexport default class Preference extends ApplicationAdapter {\n  namespace = 'api/v1';\n\n  updateRecord(_store, _type, snapshot) {\n    const data = this.serialize(snapshot, { includeId: true });\n    const userId = this.session.user.id;\n    const url = `${this.host}/${this.namespace}/users/${userId}/preferences`;\n    const headers = Object.assign({}, this.headers, {\n      'Content-Type': 'application/json',\n    });\n\n    return new Promise(function (resolve, reject) {\n      fetch(url, {\n        method: 'PUT',\n        body: JSON.stringify(data),\n        headers,\n      }).then(\n        function (data) {\n          resolve(data.json());\n        },\n        function (error) {\n          reject(error);\n        },\n      );\n    });\n  }\n}\n","import ApplicationAdapter from './application';\n\ninterface UserQuery {\n  me?: boolean;\n  include?: string;\n}\n\nexport default class User extends ApplicationAdapter {\n  namespace = 'api/v1';\n\n  urlForQueryRecord(query: UserQuery) {\n    let originalUrl = super.urlForQueryRecord(query, 'user');\n    if (query.me) {\n      delete query.me;\n      query.include = 'preferences';\n      return `${originalUrl}/me`;\n    }\n\n    return originalUrl;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your adapters.\ndeclare module 'ember-data/types/registries/adapter' {\n  export default interface AdapterRegistry {\n    user: User;\n  }\n}\n","import Application from '@ember/application';\nimport Resolver from 'ember-resolver';\nimport loadInitializers from 'ember-load-initializers';\nimport config from 'client-app-omnivise-web/config/environment';\nimport * as Sentry from '@sentry/ember';\n\n// It will be derived from process.env and then would be changed as booleans,\n// or it might be a string in case of ONPREM build and have to be manually checked like this\nconst checkIsFeatureEnabled = (config, featureName) => {\n  const isEnvVarValue =\n    typeof config.featureFlags[featureName] === 'string' &&\n    config.featureFlags[featureName].toLowerCase() === 'true';\n  const isBooleanValue =\n    typeof config.featureFlags[featureName] === 'boolean' &&\n    config.featureFlags[featureName];\n\n  return isEnvVarValue || isBooleanValue;\n};\n\n// Due to how early this file is executed, we need to check the feature flag from config file, not service\nif (checkIsFeatureEnabled(config, 'sentry')) {\n  Sentry.init({\n    dsn: config.sentryDSN,\n    integrations: [\n      Sentry.replayIntegration({\n        // Additional SDK configuration goes in here, for example:\n      }),\n    ],\n\n    // Set tracesSampleRate to 1.0 to capture 100%\n    // of transactions for performance monitoring.\n    // We recommend adjusting this value in production,\n    tracesSampleRate: 0.5,\n\n    // Capture Replay for 10% of all sessions,\n    // plus for 100% of sessions with an error\n    replaysSessionSampleRate: 0.1,\n    replaysOnErrorSampleRate: 1.0,\n\n    // TODO: remove it before merge\n    debug: true,\n    environment: config.instanceConfiguration.envName,\n    browserTracingOptions: {\n      tracePropagationTargets: [\n        'visualization-components.omnivise.siemens-energy.com/',\n        'svc-api-gateway.omnivise-dev.siemens-energy.cloud',\n        'svc-api-gateway.omnivise-qa.siemens-energy.cloud',\n        'svc-api-gateway.omnivise.siemens-energy.cloud',\n      ],\n    },\n  });\n}\n\nexport default class App extends Application {\n  modulePrefix = config.modulePrefix;\n  podModulePrefix = config.podModulePrefix;\n  Resolver = Resolver;\n}\n\nloadInitializers(App, config.modulePrefix);\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<span class=\\\"text-secondary me-1\\\" data-test-contact-us-mail-icon>\\n  <Icon @icon=\\\"email\\\" />\\n</span>\\n<a\\n  href=\\\"mailto:contact-oap-team@siemens-energy.com\\\"\\n  data-test-contact-us-mail-link\\n>\\n  {{t \\\"form.button.contact-support\\\"}}\\n</a>\", {\"contents\":\"<span class=\\\"text-secondary me-1\\\" data-test-contact-us-mail-icon>\\n  <Icon @icon=\\\"email\\\" />\\n</span>\\n<a\\n  href=\\\"mailto:contact-oap-team@siemens-energy.com\\\"\\n  data-test-contact-us-mail-link\\n>\\n  {{t \\\"form.button.contact-support\\\"}}\\n</a>\",\"moduleName\":\"client-app-omnivise-web/components/contact-support-link.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/contact-support-link.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"font-smaller\": \"_font-smaller_u1d0xy\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<footer\\n  id=\\\"omnivise-application-footer\\\"\\n  class=\\\"mt-auto ms-0 mb-0 me-0 pt-1 text-secondary bg-white\\n    {{local-class 'font-smaller'}}\\\"\\n  ...attributes\\n>\\n  <div class=\\\"d-flex flex-column flex-lg-row mx-2\\\">\\n    <div\\n      class=\\\"d-flex align-items-center w-100 flex-column justify-content-lg-between flex-sm-row\\\"\\n    >\\n      <div\\n        class=\\\"d-flex flex-column align-items-sm-center align-items-md-center flex-sm-row\\\"\\n      >\\n        <p\\n          class=\\\"me-sm-2 me-md-2 me-lg-4 mb-1 text-dark\\\"\\n          data-test-copyright-info\\n        >\\n          {{t \\\"footer.branding\\\"}}\\n          {{this.currentYear}}\\n        </p>\\n      </div>\\n      <div\\n        class=\\\"d-flex flex-column align-items-sm-center align-items-md-end flex-sm-row\\\"\\n      >\\n        {{#if this.currentModule}}\\n          <button\\n            class=\\\"btn btn-tertiary border border-secondary rounded-0 text-secondary shadow-none small mb-1 px-0 py-1\\\"\\n            data-test-footer-vc-details-launch-button\\n            type=\\\"button\\\"\\n            {{on \\\"click\\\" this.toggleModuleDetailsModal}}\\n          >\\n            {{#if this.showVersion}}\\n              <span\\n                class=\\\"px-1 {{local-class 'font-smaller'}}\\\"\\n                data-test-short-version\\n              >\\n                {{this.shortVersion}}\\n              </span>\\n            {{/if}}\\n          </button>\\n        {{else}}\\n          <span\\n            role=\\\"button\\\"\\n            class=\\\"mb-1 px-1 py-1 border border-secondary rounded-sm\\\"\\n            data-test-version\\n            {{on \\\"click\\\" this.toggleLongVersion}}\\n          >\\n            {{#if this.isShowingLongVersion}}\\n              <span data-test-long-version class=\\\"small\\\">\\n                {{this.version}}\\n              </span>\\n            {{else}}\\n              <span data-test-short-version class=\\\"small\\\">\\n                {{this.shortVersion}}\\n              </span>\\n            {{/if}}\\n          </span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div\\n      class=\\\"d-flex mb-1 mt-2 mt-sm-0 mt-md-0 mt-lg-1 align-items-center flex-lg-shrink-0\\\"\\n    >\\n      <ul\\n        class=\\\"m-0 d-flex flex-wrap flex-shrink-1 flex-lg-row flex-md-row justify-content-end list-unstyled\\\"\\n      >\\n        {{#if (feature-flag \\\"dynamic-footer-links\\\")}}\\n          {{yield (component \\\"footer/link\\\") to=\\\"links\\\"}}\\n        {{/if}}\\n\\n        {{#if (feature-flag \\\"licenses\\\")}}\\n          <Footer::Link @href={{this.licenses}}>\\n            {{t \\\"footer.licenses\\\"}}\\n          </Footer::Link>\\n        {{/if}}\\n\\n        {{#if (feature-flag \\\"dynamic-footer-links\\\")}}\\n          <Footer::Link @href={{this.terms}}>\\n            {{t \\\"footer.terms-of-use\\\"}}\\n          </Footer::Link>\\n\\n          <Footer::Link @href={{this.privacy}}>\\n            {{t \\\"footer.privacy-notice\\\"}}\\n          </Footer::Link>\\n\\n          <Footer::Link @href={{this.corporateInformation}}>\\n            {{t \\\"footer.corporate-information\\\"}}\\n          </Footer::Link>\\n\\n          <Footer::Link @href={{this.cookies}}>\\n            {{t \\\"footer.cookie-notice\\\"}}\\n          </Footer::Link>\\n        {{else}}\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.terms\\\">\\n              {{t \\\"footer.terms-of-use\\\"}}\\n            </LinkTo>\\n          </li>\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.privacy\\\">\\n              {{t \\\"footer.privacy-notice\\\"}}\\n            </LinkTo>\\n          </li>\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.corporate\\\">\\n              {{t \\\"footer.corporate-information\\\"}}\\n            </LinkTo>\\n          </li>\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.cookies\\\">\\n              {{t \\\"footer.cookie-notice\\\"}}\\n            </LinkTo>\\n          </li>\\n        {{/if}}\\n      </ul>\\n    </div>\\n  </div>\\n  <Modal\\n    @open={{this.isModalShowing}}\\n    @backdropClose={{true}}\\n    @onHidden={{this.hideModuleDetailsModal}}\\n    data-test-footer-vc-module-details-modal\\n    class=\\\"text-secondary\\\"\\n    @size=\\\"lg\\\"\\n    as |modal|\\n  >\\n    <modal.header>\\n      <h5 class=\\\"m-1\\\" data-test-footer-vc-module-info-modal-title>\\n        {{this.currentModule.name}}\\n      </h5>\\n    </modal.header>\\n    <modal.body>\\n      <ModulesLauncher::Tile::DevData @module={{this.currentModule}} />\\n    </modal.body>\\n  </Modal>\\n</footer>\", {\"contents\":\"<footer\\n  id=\\\"omnivise-application-footer\\\"\\n  class=\\\"mt-auto ms-0 mb-0 me-0 pt-1 text-secondary bg-white\\n    {{local-class 'font-smaller'}}\\\"\\n  ...attributes\\n>\\n  <div class=\\\"d-flex flex-column flex-lg-row mx-2\\\">\\n    <div\\n      class=\\\"d-flex align-items-center w-100 flex-column justify-content-lg-between flex-sm-row\\\"\\n    >\\n      <div\\n        class=\\\"d-flex flex-column align-items-sm-center align-items-md-center flex-sm-row\\\"\\n      >\\n        <p\\n          class=\\\"me-sm-2 me-md-2 me-lg-4 mb-1 text-dark\\\"\\n          data-test-copyright-info\\n        >\\n          {{t \\\"footer.branding\\\"}}\\n          {{this.currentYear}}\\n        </p>\\n      </div>\\n      <div\\n        class=\\\"d-flex flex-column align-items-sm-center align-items-md-end flex-sm-row\\\"\\n      >\\n        {{#if this.currentModule}}\\n          <button\\n            class=\\\"btn btn-tertiary border border-secondary rounded-0 text-secondary shadow-none small mb-1 px-0 py-1\\\"\\n            data-test-footer-vc-details-launch-button\\n            type=\\\"button\\\"\\n            {{on \\\"click\\\" this.toggleModuleDetailsModal}}\\n          >\\n            {{#if this.showVersion}}\\n              <span\\n                class=\\\"px-1 {{local-class 'font-smaller'}}\\\"\\n                data-test-short-version\\n              >\\n                {{this.shortVersion}}\\n              </span>\\n            {{/if}}\\n          </button>\\n        {{else}}\\n          <span\\n            role=\\\"button\\\"\\n            class=\\\"mb-1 px-1 py-1 border border-secondary rounded-sm\\\"\\n            data-test-version\\n            {{on \\\"click\\\" this.toggleLongVersion}}\\n          >\\n            {{#if this.isShowingLongVersion}}\\n              <span data-test-long-version class=\\\"small\\\">\\n                {{this.version}}\\n              </span>\\n            {{else}}\\n              <span data-test-short-version class=\\\"small\\\">\\n                {{this.shortVersion}}\\n              </span>\\n            {{/if}}\\n          </span>\\n        {{/if}}\\n      </div>\\n    </div>\\n    <div\\n      class=\\\"d-flex mb-1 mt-2 mt-sm-0 mt-md-0 mt-lg-1 align-items-center flex-lg-shrink-0\\\"\\n    >\\n      <ul\\n        class=\\\"m-0 d-flex flex-wrap flex-shrink-1 flex-lg-row flex-md-row justify-content-end list-unstyled\\\"\\n      >\\n        {{#if (feature-flag \\\"dynamic-footer-links\\\")}}\\n          {{yield (component \\\"footer/link\\\") to=\\\"links\\\"}}\\n        {{/if}}\\n\\n        {{#if (feature-flag \\\"licenses\\\")}}\\n          <Footer::Link @href={{this.licenses}}>\\n            {{t \\\"footer.licenses\\\"}}\\n          </Footer::Link>\\n        {{/if}}\\n\\n        {{#if (feature-flag \\\"dynamic-footer-links\\\")}}\\n          <Footer::Link @href={{this.terms}}>\\n            {{t \\\"footer.terms-of-use\\\"}}\\n          </Footer::Link>\\n\\n          <Footer::Link @href={{this.privacy}}>\\n            {{t \\\"footer.privacy-notice\\\"}}\\n          </Footer::Link>\\n\\n          <Footer::Link @href={{this.corporateInformation}}>\\n            {{t \\\"footer.corporate-information\\\"}}\\n          </Footer::Link>\\n\\n          <Footer::Link @href={{this.cookies}}>\\n            {{t \\\"footer.cookie-notice\\\"}}\\n          </Footer::Link>\\n        {{else}}\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.terms\\\">\\n              {{t \\\"footer.terms-of-use\\\"}}\\n            </LinkTo>\\n          </li>\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.privacy\\\">\\n              {{t \\\"footer.privacy-notice\\\"}}\\n            </LinkTo>\\n          </li>\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.corporate\\\">\\n              {{t \\\"footer.corporate-information\\\"}}\\n            </LinkTo>\\n          </li>\\n          <li class=\\\"ms-3 p-1\\\">\\n            <LinkTo @route=\\\"info.cookies\\\">\\n              {{t \\\"footer.cookie-notice\\\"}}\\n            </LinkTo>\\n          </li>\\n        {{/if}}\\n      </ul>\\n    </div>\\n  </div>\\n  <Modal\\n    @open={{this.isModalShowing}}\\n    @backdropClose={{true}}\\n    @onHidden={{this.hideModuleDetailsModal}}\\n    data-test-footer-vc-module-details-modal\\n    class=\\\"text-secondary\\\"\\n    @size=\\\"lg\\\"\\n    as |modal|\\n  >\\n    <modal.header>\\n      <h5 class=\\\"m-1\\\" data-test-footer-vc-module-info-modal-title>\\n        {{this.currentModule.name}}\\n      </h5>\\n    </modal.header>\\n    <modal.body>\\n      <ModulesLauncher::Tile::DevData @module={{this.currentModule}} />\\n    </modal.body>\\n  </Modal>\\n</footer>\",\"moduleName\":\"client-app-omnivise-web/components/footer/index.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/footer/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport type RouterService from '@ember/routing/router-service';\nimport config from 'client-app-omnivise-web/config/environment';\nimport { type Registry as Services, service } from '@ember/service';\n\nexport default class FooterComponent extends Component {\n  @service declare router: RouterService;\n  @service declare intl: Services['intl'];\n  @service store: any;\n\n  @tracked isShowingLongVersion = false;\n  @tracked isModalShowing = false;\n\n  get currentLocale(): string {\n    return this.intl.primaryLocale ?? 'en-us';\n  }\n\n  get corporateInformation(): string {\n    switch (this.currentLocale) {\n      case 'de-de':\n        return 'https://www.siemens-energy.com/de/de/home/general/impressum.html';\n      case 'en-us':\n      default:\n        return 'https://www.siemens-energy.com/global/en/home/general/corporate-information.html';\n    }\n  }\n\n  get terms(): string {\n    switch (this.currentLocale) {\n      case 'de-de':\n        return 'https://www.siemens-energy.com/de/de/home/general/nutzungsbedingungen.html';\n      case 'en-us':\n      default:\n        return 'https://www.siemens-energy.com/global/en/home/general/terms-of-use.html';\n    }\n  }\n\n  get cookies(): string {\n    switch (this.currentLocale) {\n      case 'de-de':\n        return 'https://www.siemens-energy.com/de/de/home/general/cookie-richtlinien.html';\n      case 'en-us':\n      default:\n        return 'https://www.siemens-energy.com/global/en/home/general/cookie-notice.html';\n    }\n  }\n\n  get privacy(): string {\n    switch (this.currentLocale) {\n      case 'de-de':\n        return 'https://www.siemens-energy.com/de/de/home/general/datenschutz.html';\n      case 'en-us':\n      default:\n        return 'https://www.siemens-energy.com/global/en/home/general/privacy-notice.html';\n    }\n  }\n\n  get licenses(): string {\n    return this.router.urlFor('licenses');\n  }\n\n  get currentModule() {\n    const moduleId = this.router.currentRoute.attributes?.internalView?.module?.get('id');\n    if (moduleId) {\n      return this.store.peekRecord('module', moduleId);\n    } else {\n      console.log('The relationship is not loaded.');\n    }\n  }\n\n  /**\n   * Version of this application.\n   *\n   * It's prefixed with `v` if it's a semver version\n   *\n   * @prop {string} version\n   * @private\n   */\n  get version(): string {\n    const version = config.APP.version;\n    const startsWithNumber = version.match(/^\\d/);\n    return startsWithNumber ? `v${version}` : version;\n  }\n\n  /**\n   * Base version only containing semver part or branch name.\n   *\n   * @prop {string} shortVersion\n   * @private\n   */\n  get shortVersion(): string {\n    const semverVersion = this.version.match(/^v?\\d+\\.\\d+\\.\\d+/);\n    const delimiter = semverVersion && this.version.includes('-') ? '-' : '+';\n    const indexOfDelimiter = this.version.lastIndexOf(delimiter);\n    return indexOfDelimiter !== -1\n      ? this.version.substring(0, indexOfDelimiter)\n      : this.version;\n  }\n\n  get currentYear(): number {\n    return new Date().getFullYear();\n  }\n\n  get showVersion(): boolean {\n    return !!this.version;\n  }\n\n  @action\n  toggleLongVersion(): void {\n    this.isShowingLongVersion = !this.isShowingLongVersion;\n  }\n\n  @action\n  toggleModuleDetailsModal(): void {\n    this.isModalShowing = !this.isModalShowing;\n  }\n\n  @action\n  hideModuleDetailsModal() {\n    this.isModalShowing = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<li class=\\\"ms-3 p-1\\\">\\n  <a href={{@href}} target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">\\n    {{yield}}\\n  </a>\\n</li>\", {\"contents\":\"<li class=\\\"ms-3 p-1\\\">\\n  <a href={{@href}} target=\\\"_blank\\\" rel=\\\"noopener noreferrer\\\">\\n    {{yield}}\\n  </a>\\n</li>\",\"moduleName\":\"client-app-omnivise-web/components/footer/link.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/footer/link.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<button\\n  type=\\\"button\\\"\\n  class=\\\"btn btn-secondary btn-sm text-primary\\\"\\n  {{on \\\"click\\\" (perform this.downloadFile @path @fileName)}}\\n  ...attributes\\n>\\n  {{yield}}\\n</button>\", {\"contents\":\"<button\\n  type=\\\"button\\\"\\n  class=\\\"btn btn-secondary btn-sm text-primary\\\"\\n  {{on \\\"click\\\" (perform this.downloadFile @path @fileName)}}\\n  ...attributes\\n>\\n  {{yield}}\\n</button>\",\"moduleName\":\"client-app-omnivise-web/components/force-download-button.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/force-download-button.hbs\"}});\nimport Component from '@glimmer/component';\nimport { task } from 'ember-concurrency-decorators';\nimport fetch from 'fetch';\n\nexport default class ForceDownloadButtonComponent extends Component {\n  @task({ maxConcurrency: 1 })\n  *downloadFile(path, fileName) {\n    const response = yield fetch(path, {\n      headers: {\n        'Content-Type': 'text/txt; charset=utf-8',\n        'Cache-Control': 'no-cache',\n      },\n    });\n    const blob = yield response.blob();\n\n    const link = document.createElement('a');\n    link.href = URL.createObjectURL(blob);\n    link.download = fileName;\n    link.click();\n\n    link.remove();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{did-update-helper\\n  this.handleAuthenticationChange\\n  this.session.isAuthenticated\\n}}\\n\\n<Header::TopLine\\n  @currentModule={{this.currentPage.header}}\\n  @hoverText={{this.currentPage.hoverText}}\\n>\\n\\n  {{#if this.session.isAuthenticated}}\\n    <div class=\\\"d-flex flex-row align-items-md-center gap-2 me-2 ms-md-4\\\">\\n      <Header::ModulesLauncher />\\n      <NotificationsManager />\\n      <Header::Oes::Notifications />\\n      <HelpMaterials />\\n      <OmniviseTickets />\\n      <Header::Oes::Tickets />\\n\\n      <Header::Tooltip />\\n      <Header::SpecialMyHealthButton />\\n\\n      <Header::UserMenu />\\n    </div>\\n  {{else}}\\n    {{! Here would go public page behavior }}\\n  {{/if}}\\n\\n</Header::TopLine>\\n\\n<TokenExpiredModal />\", {\"contents\":\"{{did-update-helper\\n  this.handleAuthenticationChange\\n  this.session.isAuthenticated\\n}}\\n\\n<Header::TopLine\\n  @currentModule={{this.currentPage.header}}\\n  @hoverText={{this.currentPage.hoverText}}\\n>\\n\\n  {{#if this.session.isAuthenticated}}\\n    <div class=\\\"d-flex flex-row align-items-md-center gap-2 me-2 ms-md-4\\\">\\n      <Header::ModulesLauncher />\\n      <NotificationsManager />\\n      <Header::Oes::Notifications />\\n      <HelpMaterials />\\n      <OmniviseTickets />\\n      <Header::Oes::Tickets />\\n\\n      <Header::Tooltip />\\n      <Header::SpecialMyHealthButton />\\n\\n      <Header::UserMenu />\\n    </div>\\n  {{else}}\\n    {{! Here would go public page behavior }}\\n  {{/if}}\\n\\n</Header::TopLine>\\n\\n<TokenExpiredModal />\",\"moduleName\":\"client-app-omnivise-web/components/header/index.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\nimport { runTask } from 'ember-lifeline';\n\nexport default class HeaderComponent extends Component {\n  @service session;\n  @service currentPage;\n\n  @action\n  handleAuthenticationChange() {\n    // Don't ask me why we need to delay this to the next runloop. I guess\n    // because we execute this function by a helper. All I know is that _not_\n    // delaying it to the next runloop invalidates `isAuthenticated`, which\n    // leads to an endless loop.\n    runTask(\n      this,\n      () => {\n        const { isAuthenticated } = this.session;\n        if (!isAuthenticated) {\n          this.showDetails = null;\n        }\n      },\n      1,\n    );\n  }\n}\n","export default {\n  \"accordion\": \"_accordion_e4e2ts\",\n  \"language-flag\": \"_language-flag_e4e2ts\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (and (feature-flag \\\"i18n\\\") (feature-flag \\\"multi-language\\\"))}}\\n  <Accordion\\n    class={{local-class \\\"accordion\\\"}}\\n    data-test-application-header-language\\n    as |acc|\\n  >\\n    <acc.item @value=\\\"1\\\" @title={{t \\\"header.language.button\\\"}}>\\n      <div class=\\\"d-flex flex-column\\\">\\n        {{#each this.intl.locales as |locale|}}\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"btn btn-light text-start\\n              {{if (eq this.intl.primaryLocale locale) 'btn-tertiary'}}\\\"\\n            {{on \\\"click\\\" (fn this.changeLocale locale)}}\\n          >\\n            <img\\n              aria-hidden=\\\"true\\\"\\n              data-test-application-header-language-flag={{locale}}\\n              class={{local-class \\\"language-flag\\\"}}\\n              src=\\\"/assets/icons/flags/{{locale}}.svg\\\"\\n              data-test-application-header-language-option={{locale}}\\n            />\\n            {{t (concat \\\"header.language.\\\" locale)}}\\n          </button>\\n        {{/each}}\\n      </div>\\n    </acc.item>\\n\\n  </Accordion>\\n{{/if}}\", {\"contents\":\"{{#if (and (feature-flag \\\"i18n\\\") (feature-flag \\\"multi-language\\\"))}}\\n  <Accordion\\n    class={{local-class \\\"accordion\\\"}}\\n    data-test-application-header-language\\n    as |acc|\\n  >\\n    <acc.item @value=\\\"1\\\" @title={{t \\\"header.language.button\\\"}}>\\n      <div class=\\\"d-flex flex-column\\\">\\n        {{#each this.intl.locales as |locale|}}\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"btn btn-light text-start\\n              {{if (eq this.intl.primaryLocale locale) 'btn-tertiary'}}\\\"\\n            {{on \\\"click\\\" (fn this.changeLocale locale)}}\\n          >\\n            <img\\n              aria-hidden=\\\"true\\\"\\n              data-test-application-header-language-flag={{locale}}\\n              class={{local-class \\\"language-flag\\\"}}\\n              src=\\\"/assets/icons/flags/{{locale}}.svg\\\"\\n              data-test-application-header-language-option={{locale}}\\n            />\\n            {{t (concat \\\"header.language.\\\" locale)}}\\n          </button>\\n        {{/each}}\\n      </div>\\n    </acc.item>\\n\\n  </Accordion>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/header/language.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/language.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { service } from '@ember/service';\n\nexport default class ApplicationHeaderLanguageComponent extends Component {\n  @service intl;\n  @service session;\n\n  @action\n  async changeLocale(locale, closeMenu) {\n    // Persistence layer\n    this.intl.setLocale([locale]);\n\n    if (closeMenu && typeof closeMenu === 'function') {\n      closeMenu();\n    }\n\n    const currentUserPreference = this.session.user.preferences;\n    currentUserPreference.locale = locale;\n    await currentUserPreference.save();\n\n    // return false for `onclick` of <a> to prevent default action (page navigation)\n    return false;\n  }\n}\n","export default {};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-invalid-interactive }}\\n<div ...attributes>\\n\\n  {{yield\\n    (hash toggle=this.toggle close=this.close trigger=this.trigger)\\n    to=\\\"trigger\\\"\\n  }}\\n\\n  {{! Click on dialog backdrop registered as click on dialog itself by browser\\n  this is a workaround to close dialog on backdrop click, but allow clicks\\n  inside of dialog to be handled by the dialog content }}\\n  <dialog\\n    class={{this.mode}}\\n    {{on \\\"close\\\" this.close}}\\n    {{on \\\"click\\\" this.close}}\\n    {{this.register}}\\n  >\\n    <div {{on \\\"click\\\" this.stopPropagation}}>\\n      {{yield\\n        (hash\\n          toggle=this.toggle\\n          close=this.close\\n          detach=this.detach\\n          attach=this.attach\\n        )\\n        to=\\\"content\\\"\\n      }}\\n    </div>\\n  </dialog>\\n\\n</div>\", {\"contents\":\"{{! template-lint-disable no-invalid-interactive }}\\n<div ...attributes>\\n\\n  {{yield\\n    (hash toggle=this.toggle close=this.close trigger=this.trigger)\\n    to=\\\"trigger\\\"\\n  }}\\n\\n  {{! Click on dialog backdrop registered as click on dialog itself by browser\\n  this is a workaround to close dialog on backdrop click, but allow clicks\\n  inside of dialog to be handled by the dialog content }}\\n  <dialog\\n    class={{this.mode}}\\n    {{on \\\"close\\\" this.close}}\\n    {{on \\\"click\\\" this.close}}\\n    {{this.register}}\\n  >\\n    <div {{on \\\"click\\\" this.stopPropagation}}>\\n      {{yield\\n        (hash\\n          toggle=this.toggle\\n          close=this.close\\n          detach=this.detach\\n          attach=this.attach\\n        )\\n        to=\\\"content\\\"\\n      }}\\n    </div>\\n  </dialog>\\n\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/header/menu-modal.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/menu-modal.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { modifier } from 'ember-modifier';\nimport { service } from '@ember/service';\n\nconst MAXIMIZED = 'maximized-dialog';\nconst TETHERED = 'tethered-dialog';\nconst DETACHED = 'detached-dialog';\n\nexport default class HeaderMenuModalComponent extends Component {\n  @service('omnivise-tickets') omniviseTickets;\n  @tracked mode = TETHERED;\n\n  dialogElement = null;\n  triggerElement = null;\n\n  constructor() {\n    super(...arguments);\n    this.resetMode();\n  }\n\n  register = modifier((element) => {\n    const resizeObserver = new ResizeObserver(() => {\n      window.requestAnimationFrame(() => {\n        if (this.mode === TETHERED) {\n          this.positionDialog();\n        }\n      });\n    });\n\n    this.dialogElement = element;\n\n    resizeObserver.observe(window.document.documentElement);\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  });\n\n  trigger = modifier((element) => {\n    this.triggerElement = element;\n  });\n\n  open() {\n    this.dialogElement.showModal();\n\n    if (this.mode === TETHERED) {\n      this.positionDialog();\n    }\n  }\n\n  @action\n  close() {\n    this.dialogElement.close();\n    this.resetMode();\n    this.args.onClose && this.args.onClose();\n  }\n\n  @action\n  stopPropagation(event) {\n    event.stopPropagation();\n  }\n\n  @action\n  toggle() {\n    if (this.dialogElement.hasAttribute('open')) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  @action\n  detach() {\n    this.mode = DETACHED;\n    this.resetPosition();\n  }\n\n  @action\n  attach() {\n    this.mode = TETHERED;\n    this.positionDialog();\n  }\n\n  positionDialog() {\n    const triggerRect = this.triggerElement.getBoundingClientRect();\n    const dialogRect = this.dialogElement.getBoundingClientRect();\n\n    this.positionLeft = triggerRect.left - dialogRect.width + triggerRect.width;\n    this.positionTop = triggerRect.bottom + 10;\n\n    this.dialogElement.style.top = `${this.positionTop}px`;\n    this.dialogElement.style.left = `${this.positionLeft}px`;\n  }\n\n  resetPosition() {\n    this.dialogElement.style.removeProperty('top');\n    this.dialogElement.style.removeProperty('left');\n  }\n\n  resetMode() {\n    if (this.args.maximized) {\n      this.mode = MAXIMIZED;\n    } else {\n      this.mode = TETHERED;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Header::MenuModal @maximized={{true}}>\\n  <:trigger as |trigger|>\\n    <Button\\n      {{trigger.trigger}}\\n      @type=\\\"tertiary\\\"\\n      class=\\\"text-secondary\\\"\\n      title={{t \\\"header.modules-launcher\\\"}}\\n      @onClick={{trigger.toggle}}\\n      data-test-application=\\\"toggle-modules-launcher\\\"\\n    >\\n      <img\\n        class=\\\"launcher_icon me-0\\\"\\n        src=\\\"/assets/icons/applications.svg\\\"\\n        alt={{t \\\"header.modules-launcher\\\"}}\\n      />\\n    </Button>\\n\\n  </:trigger>\\n  <:content as |dialog|>\\n    <ModulesLauncher\\n      @onModuleLaunched={{dialog.close}}\\n      @toggleLauncher={{dialog.toggle}}\\n      data-test-application=\\\"modules-launcher\\\"\\n    />\\n  </:content>\\n</Header::MenuModal>\", {\"contents\":\"<Header::MenuModal @maximized={{true}}>\\n  <:trigger as |trigger|>\\n    <Button\\n      {{trigger.trigger}}\\n      @type=\\\"tertiary\\\"\\n      class=\\\"text-secondary\\\"\\n      title={{t \\\"header.modules-launcher\\\"}}\\n      @onClick={{trigger.toggle}}\\n      data-test-application=\\\"toggle-modules-launcher\\\"\\n    >\\n      <img\\n        class=\\\"launcher_icon me-0\\\"\\n        src=\\\"/assets/icons/applications.svg\\\"\\n        alt={{t \\\"header.modules-launcher\\\"}}\\n      />\\n    </Button>\\n\\n  </:trigger>\\n  <:content as |dialog|>\\n    <ModulesLauncher\\n      @onModuleLaunched={{dialog.close}}\\n      @toggleLauncher={{dialog.toggle}}\\n      data-test-application=\\\"modules-launcher\\\"\\n    />\\n  </:content>\\n</Header::MenuModal>\",\"moduleName\":\"client-app-omnivise-web/components/header/modules-launcher.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/modules-launcher.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"oes-notifications\": \"_oes-notifications_1bdsse\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"oes-notifications\\\")}}\\n  <Header::MenuModal @offset=\\\"-10px 0\\\">\\n    <:trigger as |trigger|>\\n      <Button\\n        {{trigger.trigger}}\\n        @type=\\\"tertiary\\\"\\n        class=\\\"text-secondary\\\"\\n        data-test-oes-notifications\\n        title={{t \\\"header.notifications\\\"}}\\n        @onClick={{trigger.toggle}}\\n      >\\n        <svg\\n          class=\\\"notification-icon\\\"\\n          xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n          width=\\\"24\\\"\\n          height=\\\"24\\\"\\n          viewBox=\\\"0 0 24 24\\\"\\n          fill=\\\"none\\\"\\n          stroke=\\\"purple\\\"\\n          stroke-width=\\\"2\\\"\\n          stroke-linecap=\\\"round\\\"\\n          stroke-linejoin=\\\"round\\\"\\n        >\\n          <path d=\\\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\\\"></path>\\n          <path d=\\\"M13.73 21a2 2 0 0 1-3.46 0\\\"></path>\\n        </svg>\\n      </Button>\\n    </:trigger>\\n\\n    <:content>\\n      <div class=\\\"{{local-class 'oes-notifications'}} d-flex\\\">\\n        <FromElsewhere @name=\\\"oes-notifications\\\" />\\n      </div>\\n    </:content>\\n  </Header::MenuModal>\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"oes-notifications\\\")}}\\n  <Header::MenuModal @offset=\\\"-10px 0\\\">\\n    <:trigger as |trigger|>\\n      <Button\\n        {{trigger.trigger}}\\n        @type=\\\"tertiary\\\"\\n        class=\\\"text-secondary\\\"\\n        data-test-oes-notifications\\n        title={{t \\\"header.notifications\\\"}}\\n        @onClick={{trigger.toggle}}\\n      >\\n        <svg\\n          class=\\\"notification-icon\\\"\\n          xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n          width=\\\"24\\\"\\n          height=\\\"24\\\"\\n          viewBox=\\\"0 0 24 24\\\"\\n          fill=\\\"none\\\"\\n          stroke=\\\"purple\\\"\\n          stroke-width=\\\"2\\\"\\n          stroke-linecap=\\\"round\\\"\\n          stroke-linejoin=\\\"round\\\"\\n        >\\n          <path d=\\\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\\\"></path>\\n          <path d=\\\"M13.73 21a2 2 0 0 1-3.46 0\\\"></path>\\n        </svg>\\n      </Button>\\n    </:trigger>\\n\\n    <:content>\\n      <div class=\\\"{{local-class 'oes-notifications'}} d-flex\\\">\\n        <FromElsewhere @name=\\\"oes-notifications\\\" />\\n      </div>\\n    </:content>\\n  </Header::MenuModal>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/header/oes/notifications.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/oes/notifications.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport interface HeaderOesNotificationsSignature {\n  // The arguments accepted by the component\n  Args: {};\n  // Any blocks yielded by the component\n  Blocks: {\n    default: []\n  };\n  // The element to which `...attributes` is applied in the component template\n  Element: null;\n}\n\nexport default class HeaderOesNotifications extends Component<HeaderOesNotificationsSignature> {}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"oes-tickets\\\")}}\\n  <div>\\n    <svg\\n      class=\\\"ticket-icon\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      fill=\\\"none\\\"\\n      stroke=\\\"purple\\\"\\n      stroke-width=\\\"2\\\"\\n      stroke-linecap=\\\"round\\\"\\n      stroke-linejoin=\\\"round\\\"\\n    >\\n      <path d=\\\"M15 5v2\\\"></path>\\n      <path d=\\\"M15 11v2\\\"></path>\\n      <path d=\\\"M15 17v2\\\"></path>\\n      <rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"2\\\"></rect>\\n      <path d=\\\"M3 8h18\\\"></path>\\n      <path d=\\\"M3 16h18\\\"></path>\\n    </svg>\\n  </div>\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"oes-tickets\\\")}}\\n  <div>\\n    <svg\\n      class=\\\"ticket-icon\\\"\\n      xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n      width=\\\"24\\\"\\n      height=\\\"24\\\"\\n      viewBox=\\\"0 0 24 24\\\"\\n      fill=\\\"none\\\"\\n      stroke=\\\"purple\\\"\\n      stroke-width=\\\"2\\\"\\n      stroke-linecap=\\\"round\\\"\\n      stroke-linejoin=\\\"round\\\"\\n    >\\n      <path d=\\\"M15 5v2\\\"></path>\\n      <path d=\\\"M15 11v2\\\"></path>\\n      <path d=\\\"M15 17v2\\\"></path>\\n      <rect x=\\\"3\\\" y=\\\"4\\\" width=\\\"18\\\" height=\\\"16\\\" rx=\\\"2\\\"></rect>\\n      <path d=\\\"M3 8h18\\\"></path>\\n      <path d=\\\"M3 16h18\\\"></path>\\n    </svg>\\n  </div>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/header/oes/tickets.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/oes/tickets.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport interface HeaderOesTicketsSignature {\n  // The arguments accepted by the component\n  Args: {};\n  // Any blocks yielded by the component\n  Blocks: {\n    default: []\n  };\n  // The element to which `...attributes` is applied in the component template\n  Element: null;\n}\n\nexport default class HeaderOesTickets extends Component<HeaderOesTicketsSignature> {}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"omnivise-tickets-myhealth\\\")}}\\n  <a\\n    class=\\\"px-2 me-3\\\"\\n    href=\\\"mailto:myhealth.energy@siemens-energy.com\\\"\\n    data-test-omnivise-tickets-myhealth-mail-link\\n  >\\n    <img\\n      class=\\\"text-secondary\\\"\\n      src=\\\"/assets/icons/omnivise-ticket-mail-icon.svg\\\"\\n      alt={{t \\\"omnivise-tickets.mail-icon-alt\\\"}}\\n      title={{t \\\"omnivise-tickets.mail-button-title\\\"}}\\n      data-test-omnivise-tickets-icon=\\\"help-icon\\\"\\n    />\\n  </a>\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"omnivise-tickets-myhealth\\\")}}\\n  <a\\n    class=\\\"px-2 me-3\\\"\\n    href=\\\"mailto:myhealth.energy@siemens-energy.com\\\"\\n    data-test-omnivise-tickets-myhealth-mail-link\\n  >\\n    <img\\n      class=\\\"text-secondary\\\"\\n      src=\\\"/assets/icons/omnivise-ticket-mail-icon.svg\\\"\\n      alt={{t \\\"omnivise-tickets.mail-icon-alt\\\"}}\\n      title={{t \\\"omnivise-tickets.mail-button-title\\\"}}\\n      data-test-omnivise-tickets-icon=\\\"help-icon\\\"\\n    />\\n  </a>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/header/special-my-health-button.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/special-my-health-button.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"tooltip-button\\\")}}\\n  <Button\\n    @type=\\\"tertiary\\\"\\n    class=\\\"me-1 text-secondary\\\"\\n    @onClick={{this.toggleShouldShowTooltip}}\\n    data-test-application=\\\"toggle-is-show-tooltip\\\"\\n    title={{t \\\"header.show-tooltips\\\"}}\\n  >\\n    <img\\n      class=\\\"text-secondary\\\"\\n      src=\\\"/assets/icons/information.svg\\\"\\n      alt={{t \\\"header.show-tooltips\\\"}}\\n      data-test-omnivise-tickets-icon=\\\"information-icon\\\"\\n    />\\n  </Button>\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"tooltip-button\\\")}}\\n  <Button\\n    @type=\\\"tertiary\\\"\\n    class=\\\"me-1 text-secondary\\\"\\n    @onClick={{this.toggleShouldShowTooltip}}\\n    data-test-application=\\\"toggle-is-show-tooltip\\\"\\n    title={{t \\\"header.show-tooltips\\\"}}\\n  >\\n    <img\\n      class=\\\"text-secondary\\\"\\n      src=\\\"/assets/icons/information.svg\\\"\\n      alt={{t \\\"header.show-tooltips\\\"}}\\n      data-test-omnivise-tickets-icon=\\\"information-icon\\\"\\n    />\\n  </Button>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/header/tooltip.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/tooltip.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\n\nexport default class HeaderTooltipComponent extends Component {\n  @service('show-tooltip') showTooltipService;\n\n  @action\n  toggleShouldShowTooltip() {\n    const currentValue = this.showTooltipService.shouldShowTooltip;\n    this.showTooltipService.setShouldShowTooltip(!currentValue);\n  }\n}\n","export default {\n  \"main-content\": \"_main-content_n68ih6\",\n  \"application-name\": \"_application-name_n68ih6\",\n  \"current-module\": \"_current-module_n68ih6\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<header\\n  data-test-application-header=\\\"root\\\"\\n  class=\\\"bg-white flex-grow-0 flex-shrink-0\\\"\\n  ...attributes\\n>\\n  <div\\n    class=\\\"d-flex flex-row justify-content-between px-2 align-items-center\\n      {{local-class 'main-content'}}\\\"\\n  >\\n    <div class=\\\"d-flex flex-column flex-md-row align-items-md-center px-2\\\">\\n      <LinkTo\\n        class=\\\"me-md-2\\\"\\n        @route=\\\"index\\\"\\n        data-test-application-header=\\\"logo-link\\\"\\n      >\\n        <img src=\\\"/assets/logos/SE_logo.svg\\\" alt={{t \\\"brand.siemens-energy\\\"}} />\\n      </LinkTo>\\n    </div>\\n    <div\\n      class=\\\"d-flex flex-column flex-md-row align-items-end align-items-md-center px-2\\\"\\n    >\\n      <h4\\n        class=\\\"m-0 mt-1 mt-md-0 text-primary {{local-class 'current-module'}} \\\"\\n        data-test-application-header=\\\"current-module\\\"\\n        title={{@hoverText}}\\n      >\\n        {{@currentModule}}\\n      </h4>\\n\\n      {{yield}}\\n\\n    </div>\\n  </div>\\n</header>\", {\"contents\":\"<header\\n  data-test-application-header=\\\"root\\\"\\n  class=\\\"bg-white flex-grow-0 flex-shrink-0\\\"\\n  ...attributes\\n>\\n  <div\\n    class=\\\"d-flex flex-row justify-content-between px-2 align-items-center\\n      {{local-class 'main-content'}}\\\"\\n  >\\n    <div class=\\\"d-flex flex-column flex-md-row align-items-md-center px-2\\\">\\n      <LinkTo\\n        class=\\\"me-md-2\\\"\\n        @route=\\\"index\\\"\\n        data-test-application-header=\\\"logo-link\\\"\\n      >\\n        <img src=\\\"/assets/logos/SE_logo.svg\\\" alt={{t \\\"brand.siemens-energy\\\"}} />\\n      </LinkTo>\\n    </div>\\n    <div\\n      class=\\\"d-flex flex-column flex-md-row align-items-end align-items-md-center px-2\\\"\\n    >\\n      <h4\\n        class=\\\"m-0 mt-1 mt-md-0 text-primary {{local-class 'current-module'}} \\\"\\n        data-test-application-header=\\\"current-module\\\"\\n        title={{@hoverText}}\\n      >\\n        {{@currentModule}}\\n      </h4>\\n\\n      {{yield}}\\n\\n    </div>\\n  </div>\\n</header>\",\"moduleName\":\"client-app-omnivise-web/components/header/top-line.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/top-line.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"user-menu-button\": \"_user-menu-button_kbch3h\",\n  \"menu-item\": \"_menu-item_kbch3h\",\n  \"menu-item-icon\": \"_menu-item-icon_kbch3h\",\n  \"menu-item-name\": \"_menu-item-name_kbch3h\",\n  \"menu-item-email\": \"_menu-item-email_kbch3h\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-application-header-user-menu class=\\\"btn-group w-100 mt-2 mb-2\\\">\\n  <Header::MenuModal @offset=\\\"-10px 0\\\">\\n    <:trigger as |trigger|>\\n      <Button\\n        {{trigger.trigger}}\\n        @type=\\\"warning\\\"\\n        class=\\\"rounded-circle px-0 {{local-class 'user-menu-button'}}\\\"\\n        data-test-application-header-user-menu-button\\n        title={{t \\\"userMenu.title\\\"}}\\n        @onClick={{trigger.toggle}}\\n      >\\n        <h6 class=\\\"text-uppercase text-white text-center my-1 me-0\\\">\\n          {{this.initials}}\\n        </h6>\\n      </Button>\\n    </:trigger>\\n\\n    <:content>\\n      <div class=\\\"p-2\\\">\\n        <div class=\\\"mb-2\\\">\\n          <div class=\\\"px-2 py-1 text-start {{local-class 'menu-item'}}\\\">\\n            <Icon\\n              @icon=\\\"user-circle\\\"\\n              class=\\\"my-auto me-2 {{local-class 'menu-item-icon'}}\\\"\\n            />\\n            <div\\n              class=\\\"{{local-class 'menu-item-name'}}\\\"\\n              data-test-application-header-menu-item-name\\n            >\\n              {{this.fullName}}\\n            </div>\\n            <small\\n              class=\\\"text-primary {{local-class 'menu-item-email'}}\\\"\\n              data-test-application-header-menu-item-email\\n            >\\n              {{this.email}}\\n            </small>\\n          </div>\\n        </div>\\n\\n        <Header::Language />\\n        {{#unless (feature-flag \\\"hide-logout\\\")}}\\n          <div class=\\\"dropdown-item mx-0 px-2\\\">\\n            <Button\\n              @type=\\\"light\\\"\\n              @onClick={{this.session.invalidate}}\\n              class=\\\"w-100 text-start mx-0 px-0\\\"\\n              data-test-application-header-logout-button\\n            >\\n              <Icon @icon=\\\"sign-out\\\" class=\\\"my-auto me-2\\\" />\\n              {{t \\\"userMenu.logout\\\"}}\\n            </Button>\\n          </div>\\n        {{/unless}}\\n      </div>\\n    </:content>\\n  </Header::MenuModal>\\n</div>\", {\"contents\":\"<div data-test-application-header-user-menu class=\\\"btn-group w-100 mt-2 mb-2\\\">\\n  <Header::MenuModal @offset=\\\"-10px 0\\\">\\n    <:trigger as |trigger|>\\n      <Button\\n        {{trigger.trigger}}\\n        @type=\\\"warning\\\"\\n        class=\\\"rounded-circle px-0 {{local-class 'user-menu-button'}}\\\"\\n        data-test-application-header-user-menu-button\\n        title={{t \\\"userMenu.title\\\"}}\\n        @onClick={{trigger.toggle}}\\n      >\\n        <h6 class=\\\"text-uppercase text-white text-center my-1 me-0\\\">\\n          {{this.initials}}\\n        </h6>\\n      </Button>\\n    </:trigger>\\n\\n    <:content>\\n      <div class=\\\"p-2\\\">\\n        <div class=\\\"mb-2\\\">\\n          <div class=\\\"px-2 py-1 text-start {{local-class 'menu-item'}}\\\">\\n            <Icon\\n              @icon=\\\"user-circle\\\"\\n              class=\\\"my-auto me-2 {{local-class 'menu-item-icon'}}\\\"\\n            />\\n            <div\\n              class=\\\"{{local-class 'menu-item-name'}}\\\"\\n              data-test-application-header-menu-item-name\\n            >\\n              {{this.fullName}}\\n            </div>\\n            <small\\n              class=\\\"text-primary {{local-class 'menu-item-email'}}\\\"\\n              data-test-application-header-menu-item-email\\n            >\\n              {{this.email}}\\n            </small>\\n          </div>\\n        </div>\\n\\n        <Header::Language />\\n        {{#unless (feature-flag \\\"hide-logout\\\")}}\\n          <div class=\\\"dropdown-item mx-0 px-2\\\">\\n            <Button\\n              @type=\\\"light\\\"\\n              @onClick={{this.session.invalidate}}\\n              class=\\\"w-100 text-start mx-0 px-0\\\"\\n              data-test-application-header-logout-button\\n            >\\n              <Icon @icon=\\\"sign-out\\\" class=\\\"my-auto me-2\\\" />\\n              {{t \\\"userMenu.logout\\\"}}\\n            </Button>\\n          </div>\\n        {{/unless}}\\n      </div>\\n    </:content>\\n  </Header::MenuModal>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/header/user-menu.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/header/user-menu.hbs\"}});\nimport Component from '@glimmer/component';\nimport { service } from '@ember/service';\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class HeaderUserMenu extends Component {\n  @service session;\n  @service features;\n\n  @tracked userMenuOpen = false;\n\n  get firstName() {\n    return this.session.currentUserFirstName;\n  }\n\n  get lastName() {\n    return this.session.currentUserLastName;\n  }\n\n  get fullName() {\n    return `${this.firstName} ${this.lastName}`;\n  }\n\n  get email() {\n    return this.session.currentUserEmail;\n  }\n\n  get initials() {\n    const { firstName, lastName } = this;\n    const firstNameInitial = firstName ? firstName[0] : '';\n    const lastNameInitial = lastName ? lastName[0] : '';\n    return firstNameInitial + lastNameInitial || 'U';\n  }\n\n  @action\n  toggleUserMenu() {\n    this.userMenuOpen = !this.userMenuOpen;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (get @assetDescriptor.assets \\\"0\\\") as |asset|}}\\n  <div class=\\\"d-flex border p-2 my-1\\\">\\n    <div class=\\\"w-50\\\">\\n      <img\\n        src={{asset.previewURL}}\\n        class=\\\"pe-2 mt-2 w-100\\\"\\n        alt={{asset.title}}\\n      />\\n    </div>\\n\\n    <Card\\n      class=\\\"border-white bg-white w-50\\\"\\n      ...attributes\\n      data-test-module={{@module.id}}\\n      as |card|\\n    >\\n      <card.header class=\\\"bg-white border-white\\\" data-test-module-header>\\n\\n        {{@assetDescriptor.title}}\\n      </card.header>\\n      <card.body class=\\\"p-0 ps-2\\\">\\n        <p class=\\\"text-secondary\\\" data-test-module-description>\\n          {{@assetDescriptor.description}}\\n        </p>\\n        <a\\n          class=\\\"btn btn-primary\\\"\\n          target=\\\"_blank\\\"\\n          rel=\\\"noopener noreferrer\\\"\\n          {{on\\n            \\\"click\\\"\\n            (fn @trackHelpMaterialsUsageEvent @assetDescriptor asset.title)\\n          }}\\n          href={{asset.externalURL}}\\n        >{{asset.title}}</a>\\n      </card.body>\\n    </Card>\\n  </div>\\n{{/let}}\", {\"contents\":\"{{#let (get @assetDescriptor.assets \\\"0\\\") as |asset|}}\\n  <div class=\\\"d-flex border p-2 my-1\\\">\\n    <div class=\\\"w-50\\\">\\n      <img\\n        src={{asset.previewURL}}\\n        class=\\\"pe-2 mt-2 w-100\\\"\\n        alt={{asset.title}}\\n      />\\n    </div>\\n\\n    <Card\\n      class=\\\"border-white bg-white w-50\\\"\\n      ...attributes\\n      data-test-module={{@module.id}}\\n      as |card|\\n    >\\n      <card.header class=\\\"bg-white border-white\\\" data-test-module-header>\\n\\n        {{@assetDescriptor.title}}\\n      </card.header>\\n      <card.body class=\\\"p-0 ps-2\\\">\\n        <p class=\\\"text-secondary\\\" data-test-module-description>\\n          {{@assetDescriptor.description}}\\n        </p>\\n        <a\\n          class=\\\"btn btn-primary\\\"\\n          target=\\\"_blank\\\"\\n          rel=\\\"noopener noreferrer\\\"\\n          {{on\\n            \\\"click\\\"\\n            (fn @trackHelpMaterialsUsageEvent @assetDescriptor asset.title)\\n          }}\\n          href={{asset.externalURL}}\\n        >{{asset.title}}</a>\\n      </card.body>\\n    </Card>\\n  </div>\\n{{/let}}\",\"moduleName\":\"client-app-omnivise-web/components/help-materials/external-material.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/help-materials/external-material.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let @assetDescriptor.assets as |fileDescriptors|}}\\n  <Card\\n    class=\\\"bg-white my-1 p-2\\\"\\n    ...attributes\\n    data-test-module={{@module.id}}\\n    as |card|\\n  >\\n    <card.header class=\\\"bg-white border-white\\\" data-test-module-header>\\n\\n      {{@assetDescriptor.title}}\\n    </card.header>\\n    <card.body class=\\\"p-2\\\">\\n      <p class=\\\"text-secondary\\\" data-test-module-description>\\n        {{@assetDescriptor.description}}\\n      </p>\\n      {{#each fileDescriptors as |fileDescriptor|}}\\n        <div>\\n          <a\\n            {{on\\n              \\\"click\\\"\\n              (fn\\n                @trackHelpMaterialsUsageEvent\\n                @assetDescriptor\\n                fileDescriptor.title\\n              )\\n            }}\\n            href={{fileDescriptor.fileURL}}\\n            rel=\\\"noopener noreferrer\\\"\\n            target=\\\"_blank\\\"\\n            download\\n          >\\n            <img\\n              class=\\\"me-1\\\"\\n              alt={{fileDescriptor.fileType}}\\n              src=\\\"/assets/icons/doc-and-trainings/{{fileDescriptor.fileType}}.svg\\\"\\n              data-test-omnivise-tickets-icon=\\\"close-icon\\\"\\n            />\\n            {{fileDescriptor.title}}\\n          </a>\\n        </div>\\n      {{/each}}\\n    </card.body>\\n\\n  </Card>\\n{{/let}}\", {\"contents\":\"{{#let @assetDescriptor.assets as |fileDescriptors|}}\\n  <Card\\n    class=\\\"bg-white my-1 p-2\\\"\\n    ...attributes\\n    data-test-module={{@module.id}}\\n    as |card|\\n  >\\n    <card.header class=\\\"bg-white border-white\\\" data-test-module-header>\\n\\n      {{@assetDescriptor.title}}\\n    </card.header>\\n    <card.body class=\\\"p-2\\\">\\n      <p class=\\\"text-secondary\\\" data-test-module-description>\\n        {{@assetDescriptor.description}}\\n      </p>\\n      {{#each fileDescriptors as |fileDescriptor|}}\\n        <div>\\n          <a\\n            {{on\\n              \\\"click\\\"\\n              (fn\\n                @trackHelpMaterialsUsageEvent\\n                @assetDescriptor\\n                fileDescriptor.title\\n              )\\n            }}\\n            href={{fileDescriptor.fileURL}}\\n            rel=\\\"noopener noreferrer\\\"\\n            target=\\\"_blank\\\"\\n            download\\n          >\\n            <img\\n              class=\\\"me-1\\\"\\n              alt={{fileDescriptor.fileType}}\\n              src=\\\"/assets/icons/doc-and-trainings/{{fileDescriptor.fileType}}.svg\\\"\\n              data-test-omnivise-tickets-icon=\\\"close-icon\\\"\\n            />\\n            {{fileDescriptor.title}}\\n          </a>\\n        </div>\\n      {{/each}}\\n    </card.body>\\n\\n  </Card>\\n{{/let}}\",\"moduleName\":\"client-app-omnivise-web/components/help-materials/file-asset.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/help-materials/file-asset.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"header\": \"_header_1d6axl\",\n  \"main-icon\": \"_main-icon_1d6axl\",\n  \"screen-capture-help-screen-header\": \"_screen-capture-help-screen-header_1d6axl\",\n  \"white-icon\": \"_white-icon_1d6axl\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  data-test-help-materials-header\\n  class=\\\"text-white p-2 {{local-class 'header'}}\\\"\\n>\\n  <div class=\\\"p-2\\\" data-test-help-materials-contact>\\n    <h4>\\n      <img\\n        class={{local-class \\\"white-icon\\\"}}\\n        src=\\\"/assets/icons/help-materials-icon.svg\\\"\\n        alt={{t \\\"help-materials.floating-icon-alt\\\"}}\\n        width=\\\"32\\\"\\n        data-test-help-materials-icon=\\\"help-materials-icon\\\"\\n      />\\n      <span data-test-help-materials-welcome class=\\\"mx-2\\\">\\n\\n        {{t \\\"help-materials.welcome-message\\\"}}\\n      </span>\\n    </h4>\\n  </div>\\n  <div\\n    class=\\\"mt-25 d-flex flex-column justify-content-between\\\"\\n    data-test-help-materials-description\\n  >\\n    <div class=\\\"mx-2\\\">\\n      <p>\\n        {{t \\\"help-materials.description-message\\\"}}\\n      </p>\\n    </div>\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  data-test-help-materials-header\\n  class=\\\"text-white p-2 {{local-class 'header'}}\\\"\\n>\\n  <div class=\\\"p-2\\\" data-test-help-materials-contact>\\n    <h4>\\n      <img\\n        class={{local-class \\\"white-icon\\\"}}\\n        src=\\\"/assets/icons/help-materials-icon.svg\\\"\\n        alt={{t \\\"help-materials.floating-icon-alt\\\"}}\\n        width=\\\"32\\\"\\n        data-test-help-materials-icon=\\\"help-materials-icon\\\"\\n      />\\n      <span data-test-help-materials-welcome class=\\\"mx-2\\\">\\n\\n        {{t \\\"help-materials.welcome-message\\\"}}\\n      </span>\\n    </h4>\\n  </div>\\n  <div\\n    class=\\\"mt-25 d-flex flex-column justify-content-between\\\"\\n    data-test-help-materials-description\\n  >\\n    <div class=\\\"mx-2\\\">\\n      <p>\\n        {{t \\\"help-materials.description-message\\\"}}\\n      </p>\\n    </div>\\n  </div>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/help-materials/header.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/help-materials/header.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"wrapper\": \"_wrapper_16xrch\",\n  \"launch-button\": \"_launch-button_16xrch\",\n  \"overlay\": \"_overlay_16xrch\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"help-materials\\\")}}\\n  <Header::MenuModal>\\n    <:trigger as |trigger|>\\n      <div class=\\\"d-flex\\\" data-test-help-materials-wrapper>\\n        <Button\\n          {{trigger.trigger}}\\n          @type=\\\"tertiary\\\"\\n          title={{t \\\"help-materials.doc-and-materials\\\"}}\\n          class=\\\"{{local-class 'launch-button'}}\\\"\\n          data-test-help-materials-button=\\\"launch-button\\\"\\n          @onClick={{trigger.toggle}}\\n        >\\n          <img\\n            class=\\\"text-secondary\\\"\\n            src=\\\"/assets/icons/help-materials-icon.svg\\\"\\n            alt={{t \\\"help-materials.floating-icon-alt\\\"}}\\n            width=\\\"24\\\"\\n            data-test-help-materials-icon=\\\"help-materials-icon\\\"\\n          />\\n        </Button>\\n      </div>\\n    </:trigger>\\n    <:content>\\n      <HelpMaterials::Header />\\n      <HelpMaterials::Main />\\n    </:content>\\n  </Header::MenuModal>\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"help-materials\\\")}}\\n  <Header::MenuModal>\\n    <:trigger as |trigger|>\\n      <div class=\\\"d-flex\\\" data-test-help-materials-wrapper>\\n        <Button\\n          {{trigger.trigger}}\\n          @type=\\\"tertiary\\\"\\n          title={{t \\\"help-materials.doc-and-materials\\\"}}\\n          class=\\\"{{local-class 'launch-button'}}\\\"\\n          data-test-help-materials-button=\\\"launch-button\\\"\\n          @onClick={{trigger.toggle}}\\n        >\\n          <img\\n            class=\\\"text-secondary\\\"\\n            src=\\\"/assets/icons/help-materials-icon.svg\\\"\\n            alt={{t \\\"help-materials.floating-icon-alt\\\"}}\\n            width=\\\"24\\\"\\n            data-test-help-materials-icon=\\\"help-materials-icon\\\"\\n          />\\n        </Button>\\n      </div>\\n    </:trigger>\\n    <:content>\\n      <HelpMaterials::Header />\\n      <HelpMaterials::Main />\\n    </:content>\\n  </Header::MenuModal>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/help-materials/index.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/help-materials/index.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"help-materials\": \"_help-materials_dnddv6\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"m-2 d-flex flex-column {{local-class 'help-materials'}}\\\">\\n  <label for=\\\"module-select\\\" class=\\\"d-none\\\">{{t\\n      \\\"help-materials.select-module\\\"\\n    }}</label>\\n  {{#if (or this.loadAssetDescriptors.isRunning this.loadModules.isRunning)}}\\n    <p class=\\\"text-center m-4\\\" data-test-modules-launcher=\\\"loading\\\">\\n      <Spinner @size=\\\"md\\\" />\\n    </p>\\n\\n  {{else}}\\n    {{!-- <select\\n    class=\\\"form-select mb-2\\\"\\n    id=\\\"module-select\\\"\\n    onchange={{this.onModuleSelect}}\\n  >\\n    {{#each this.modules as |module|}}\\n      <option\\n        selected={{eq module.name this.selectedModule}}\\n        value={{module.name}}\\n      >{{module.name}}</option>\\n    {{/each}}\\n  </select> --}}\\n    <div>\\n      <ul class=\\\"nav nav-tabs\\\">\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'files') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"files\\\")}}\\n          >{{t \\\"help-materials.documentation\\\"}}</button>\\n        </li>\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'externals') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"externals\\\")}}\\n          >{{t \\\"help-materials.trainings\\\"}}</button></li>\\n      </ul></div>\\n\\n    <div class=\\\"flex-grow-1\\\">\\n      {{#if (eq this.activeTab \\\"externals\\\")}}\\n        {{#if this.externalAssets.length}}\\n          <div>\\n            {{#each this.externalAssets as |externalAsset|}}\\n              <HelpMaterials::ExternalMaterial\\n                @assetDescriptor={{externalAsset}}\\n                @trackHelpMaterialsUsageEvent={{this.trackHelpMaterialsUsageEvent}}\\n              />\\n            {{/each}}\\n          </div>\\n        {{else}}\\n          <p\\n            class=\\\"text-center text-secondary d-flex flex-column justify-content-center h-100\\\"\\n          >\\n            {{t \\\"help-materials.no-content\\\"}}\\n          </p>\\n        {{/if}}\\n      {{else}}\\n        {{#if this.fileAssets.length}}\\n          <div>\\n            {{#each this.fileAssets as |fileAsset|}}\\n              <HelpMaterials::FileAsset\\n                @assetDescriptor={{fileAsset}}\\n                @trackHelpMaterialsUsageEvent={{this.trackHelpMaterialsUsageEvent}}\\n              />\\n            {{/each}}\\n          </div>\\n        {{else}}\\n          <p\\n            class=\\\"text-center text-secondary d-flex flex-column justify-content-center h-100\\\"\\n          >\\n            {{t \\\"help-materials.no-content\\\"}}\\n          </p>\\n        {{/if}}\\n      {{/if}}</div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"m-2 d-flex flex-column {{local-class 'help-materials'}}\\\">\\n  <label for=\\\"module-select\\\" class=\\\"d-none\\\">{{t\\n      \\\"help-materials.select-module\\\"\\n    }}</label>\\n  {{#if (or this.loadAssetDescriptors.isRunning this.loadModules.isRunning)}}\\n    <p class=\\\"text-center m-4\\\" data-test-modules-launcher=\\\"loading\\\">\\n      <Spinner @size=\\\"md\\\" />\\n    </p>\\n\\n  {{else}}\\n    {{!-- <select\\n    class=\\\"form-select mb-2\\\"\\n    id=\\\"module-select\\\"\\n    onchange={{this.onModuleSelect}}\\n  >\\n    {{#each this.modules as |module|}}\\n      <option\\n        selected={{eq module.name this.selectedModule}}\\n        value={{module.name}}\\n      >{{module.name}}</option>\\n    {{/each}}\\n  </select> --}}\\n    <div>\\n      <ul class=\\\"nav nav-tabs\\\">\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'files') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"files\\\")}}\\n          >{{t \\\"help-materials.documentation\\\"}}</button>\\n        </li>\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'externals') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"externals\\\")}}\\n          >{{t \\\"help-materials.trainings\\\"}}</button></li>\\n      </ul></div>\\n\\n    <div class=\\\"flex-grow-1\\\">\\n      {{#if (eq this.activeTab \\\"externals\\\")}}\\n        {{#if this.externalAssets.length}}\\n          <div>\\n            {{#each this.externalAssets as |externalAsset|}}\\n              <HelpMaterials::ExternalMaterial\\n                @assetDescriptor={{externalAsset}}\\n                @trackHelpMaterialsUsageEvent={{this.trackHelpMaterialsUsageEvent}}\\n              />\\n            {{/each}}\\n          </div>\\n        {{else}}\\n          <p\\n            class=\\\"text-center text-secondary d-flex flex-column justify-content-center h-100\\\"\\n          >\\n            {{t \\\"help-materials.no-content\\\"}}\\n          </p>\\n        {{/if}}\\n      {{else}}\\n        {{#if this.fileAssets.length}}\\n          <div>\\n            {{#each this.fileAssets as |fileAsset|}}\\n              <HelpMaterials::FileAsset\\n                @assetDescriptor={{fileAsset}}\\n                @trackHelpMaterialsUsageEvent={{this.trackHelpMaterialsUsageEvent}}\\n              />\\n            {{/each}}\\n          </div>\\n        {{else}}\\n          <p\\n            class=\\\"text-center text-secondary d-flex flex-column justify-content-center h-100\\\"\\n          >\\n            {{t \\\"help-materials.no-content\\\"}}\\n          </p>\\n        {{/if}}\\n      {{/if}}</div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/help-materials/main.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/help-materials/main.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { inject as service } from '@ember/service';\nimport { task } from 'ember-concurrency-decorators';\nimport { action } from '@ember/object';\n\nexport default class HelpMaterials extends Component {\n  @service\n  store;\n\n  @service('omnivise-metrics') omniviseMetricsService;\n\n  @tracked\n  modules = [];\n\n  @tracked\n  assetDescriptors = [];\n\n  @tracked\n  activeTab = 'files';\n\n  @tracked\n  selectedModule = null;\n\n  @service router;\n\n  constructor(owner, args) {\n    super(owner, args);\n    this.selectedModule =\n      this.router.currentRoute.attributes?.internalView?.module?.get('name') ??\n      'Home';\n    this.loadModules.perform();\n    this.loadAssetDescriptors.perform();\n  }\n\n  @task\n  *loadModules() {\n    try {\n      this.modules = yield this.store.findAll('module');\n    } catch (error) {\n      // throw 'An unexpected error occurred';\n      // eslint-disable-next-line no-console\n      console.log('An unexpected error occurred');\n    }\n  }\n\n  @task\n  *loadAssetDescriptors() {\n    try {\n      this.assetDescriptors = yield this.store.query('asset-descriptor', {\n        filter: {\n          module: this.selectedModule,\n        },\n      });\n    } catch (error) {\n      // throw 'An unexpected error occurred';\n      // eslint-disable-next-line no-console\n      console.log('An unexpected error occurred');\n    }\n  }\n\n  @action\n  onModuleSelect(e) {\n    this.selectedModule = e.target.value;\n    this.loadAssetDescriptors.perform();\n    e.stopPropagation();\n  }\n\n  @action\n  trackHelpMaterialsUsageEvent(assetDescriptor, fileName) {\n    this.omniviseMetricsService.trackHelpMaterialsUsageEvent(\n      assetDescriptor,\n      fileName,\n    );\n  }\n\n  get externalAssets() {\n    return this.assetDescriptors.filter(\n      (asset) => asset.category === 'training',\n    );\n  }\n\n  get fileAssets() {\n    return this.assetDescriptors.filter(\n      (assetDescriptor) => assetDescriptor.category === 'documentation',\n    );\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"m-3\\\">\\n  {{#if this.loadLicenses.isRunning}}\\n    <p class=\\\"text-center m-4\\\" data-test-licenses=\\\"loading\\\">\\n      <Spinner @size=\\\"md\\\" />\\n    </p>\\n  {{else}}\\n    <ul class=\\\"m-0 d-flex flex-wrap flex-column list-unstyled\\\">\\n      {{#each this.files as |license|}}\\n        <li\\n          class=\\\"align-items-center d-flex flex-grow-1 flex-shrink-1 justify-content-between\\\"\\n        >\\n          {{license.name}}\\n\\n          <div>\\n            <button\\n              type=\\\"button\\\"\\n              class=\\\"btn btn-secondary btn-sm\\\"\\n              {{on \\\"click\\\" (fn this.openLicenseModal license)}}\\n              title={{t \\\"licenses.preview\\\"}}\\n            >\\n              <svg\\n                width=\\\"20\\\"\\n                height=\\\"16\\\"\\n                viewBox=\\\"0 0 20 16\\\"\\n                fill=\\\"none\\\"\\n                xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n              >\\n                <path\\n                  fill-rule=\\\"evenodd\\\"\\n                  clip-rule=\\\"evenodd\\\"\\n                  d=\\\"M10 4.5C8.067 4.5 6.5 6.067 6.5 8C6.5 9.933 8.067 11.5 10 11.5C11.933 11.5 13.5 9.933 13.5 8C13.5 6.067 11.933 4.5 10 4.5ZM10 6.5C10.8284 6.5 11.5 7.17157 11.5 8C11.5 8.82843 10.8284 9.5 10 9.5C9.17157 9.5 8.5 8.82843 8.5 8C8.5 7.17157 9.17157 6.5 10 6.5Z\\\"\\n                  fill=\\\"currentColor\\\"\\n                />\\n                <path\\n                  fill-rule=\\\"evenodd\\\"\\n                  clip-rule=\\\"evenodd\\\"\\n                  d=\\\"M10 0C3 0 0 8 0 8C0 8 3 16 10 16C17 16 20 8 20 8C20 8 17 0 10 0ZM10 2C14.42 2 17 6.28 17.81 8C17 9.72 14.42 14 10 14C5.58 14 3 9.72 2.19 8C3 6.28 5.58 2 10 2Z\\\"\\n                  fill=\\\"currentColor\\\"\\n                />\\n              </svg>\\n            </button>\\n            <ForceDownloadButton\\n              @path={{this.getLicensePath license.paths.txt}}\\n              @fileName=\\\"{{license.name}}.txt\\\"\\n              title={{t \\\"licenses.download\\\"}}\\n              class=\\\"btn btn-secondary btn-sm text-primary\\\"\\n            >\\n              <svg\\n                width=\\\"20\\\"\\n                height=\\\"16\\\"\\n                viewBox=\\\"0 0 16 16\\\"\\n                fill=\\\"none\\\"\\n                xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n              >\\n                <path\\n                  d=\\\"M11.41 0H0V16H16V4.59L11.41 0ZM8 2H10V5H6V2H8ZM6 14V11H10V14H6ZM14 14H12V9H4V14H2V2H4V7H12V3.41L14 5.41V14Z\\\"\\n                  fill=\\\"currentColor\\\"\\n                />\\n              </svg>\\n            </ForceDownloadButton>\\n          </div>\\n        </li>\\n      {{else}}\\n        <li>{{t \\\"licenses.no-licenses\\\"}}</li>\\n      {{/each}}\\n    </ul>\\n  {{/if}}\\n</div>\\n\\n<Modal\\n  @open={{this.selectedLicense}}\\n  @closeButton={{true}}\\n  @backdropClose={{true}}\\n  @onHidden={{this.closeLicenseModal}}\\n  data-test-license-information\\n  @size=\\\"lg\\\"\\n  as |modal|\\n>\\n  <modal.header>\\n    <h5 class=\\\"m-1\\\">\\n      {{this.selectedLicense.name}}\\n    </h5>\\n  </modal.header>\\n  <modal.body>\\n    {{#if this.loadLicenseHtml.isRunning}}\\n      <p class=\\\"text-center m-4\\\" data-test-licenses=\\\"loading\\\">\\n        <Spinner @size=\\\"md\\\" />\\n      </p>\\n    {{else}}\\n      <article {{this.licenseRenderer}} />\\n    {{/if}}\\n  </modal.body>\\n</Modal>\", {\"contents\":\"<div class=\\\"m-3\\\">\\n  {{#if this.loadLicenses.isRunning}}\\n    <p class=\\\"text-center m-4\\\" data-test-licenses=\\\"loading\\\">\\n      <Spinner @size=\\\"md\\\" />\\n    </p>\\n  {{else}}\\n    <ul class=\\\"m-0 d-flex flex-wrap flex-column list-unstyled\\\">\\n      {{#each this.files as |license|}}\\n        <li\\n          class=\\\"align-items-center d-flex flex-grow-1 flex-shrink-1 justify-content-between\\\"\\n        >\\n          {{license.name}}\\n\\n          <div>\\n            <button\\n              type=\\\"button\\\"\\n              class=\\\"btn btn-secondary btn-sm\\\"\\n              {{on \\\"click\\\" (fn this.openLicenseModal license)}}\\n              title={{t \\\"licenses.preview\\\"}}\\n            >\\n              <svg\\n                width=\\\"20\\\"\\n                height=\\\"16\\\"\\n                viewBox=\\\"0 0 20 16\\\"\\n                fill=\\\"none\\\"\\n                xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n              >\\n                <path\\n                  fill-rule=\\\"evenodd\\\"\\n                  clip-rule=\\\"evenodd\\\"\\n                  d=\\\"M10 4.5C8.067 4.5 6.5 6.067 6.5 8C6.5 9.933 8.067 11.5 10 11.5C11.933 11.5 13.5 9.933 13.5 8C13.5 6.067 11.933 4.5 10 4.5ZM10 6.5C10.8284 6.5 11.5 7.17157 11.5 8C11.5 8.82843 10.8284 9.5 10 9.5C9.17157 9.5 8.5 8.82843 8.5 8C8.5 7.17157 9.17157 6.5 10 6.5Z\\\"\\n                  fill=\\\"currentColor\\\"\\n                />\\n                <path\\n                  fill-rule=\\\"evenodd\\\"\\n                  clip-rule=\\\"evenodd\\\"\\n                  d=\\\"M10 0C3 0 0 8 0 8C0 8 3 16 10 16C17 16 20 8 20 8C20 8 17 0 10 0ZM10 2C14.42 2 17 6.28 17.81 8C17 9.72 14.42 14 10 14C5.58 14 3 9.72 2.19 8C3 6.28 5.58 2 10 2Z\\\"\\n                  fill=\\\"currentColor\\\"\\n                />\\n              </svg>\\n            </button>\\n            <ForceDownloadButton\\n              @path={{this.getLicensePath license.paths.txt}}\\n              @fileName=\\\"{{license.name}}.txt\\\"\\n              title={{t \\\"licenses.download\\\"}}\\n              class=\\\"btn btn-secondary btn-sm text-primary\\\"\\n            >\\n              <svg\\n                width=\\\"20\\\"\\n                height=\\\"16\\\"\\n                viewBox=\\\"0 0 16 16\\\"\\n                fill=\\\"none\\\"\\n                xmlns=\\\"http://www.w3.org/2000/svg\\\"\\n              >\\n                <path\\n                  d=\\\"M11.41 0H0V16H16V4.59L11.41 0ZM8 2H10V5H6V2H8ZM6 14V11H10V14H6ZM14 14H12V9H4V14H2V2H4V7H12V3.41L14 5.41V14Z\\\"\\n                  fill=\\\"currentColor\\\"\\n                />\\n              </svg>\\n            </ForceDownloadButton>\\n          </div>\\n        </li>\\n      {{else}}\\n        <li>{{t \\\"licenses.no-licenses\\\"}}</li>\\n      {{/each}}\\n    </ul>\\n  {{/if}}\\n</div>\\n\\n<Modal\\n  @open={{this.selectedLicense}}\\n  @closeButton={{true}}\\n  @backdropClose={{true}}\\n  @onHidden={{this.closeLicenseModal}}\\n  data-test-license-information\\n  @size=\\\"lg\\\"\\n  as |modal|\\n>\\n  <modal.header>\\n    <h5 class=\\\"m-1\\\">\\n      {{this.selectedLicense.name}}\\n    </h5>\\n  </modal.header>\\n  <modal.body>\\n    {{#if this.loadLicenseHtml.isRunning}}\\n      <p class=\\\"text-center m-4\\\" data-test-licenses=\\\"loading\\\">\\n        <Spinner @size=\\\"md\\\" />\\n      </p>\\n    {{else}}\\n      <article {{this.licenseRenderer}} />\\n    {{/if}}\\n  </modal.body>\\n</Modal>\",\"moduleName\":\"client-app-omnivise-web/components/licenses-list.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/licenses-list.hbs\"}});\nimport Component from '@glimmer/component';\nimport { task } from 'ember-concurrency-decorators';\nimport fetch from 'fetch';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport getApiUrl from 'client-app-omnivise-web/utils/get-api-url';\nimport { tracked } from '@glimmer/tracking';\nimport { htmlSafe } from '@ember/template';\nimport { action } from '@ember/object';\nimport { modifier } from 'ember-modifier';\n\nconst LICENSES_URL = 'licenses/files.json';\nconst LICENSES_NAMESPACE = 'api/v1';\n\nexport default class LicensesListComponent extends Component {\n  @tracked files = null;\n  @tracked selectedLicense = null;\n  @tracked selectedLicenseHTML = null;\n\n  constructor() {\n    super(...arguments);\n\n    this.loadLicenses.perform();\n  }\n\n  @action\n  openLicenseModal(license) {\n    this.selectedLicense = license;\n    this.loadLicenseHtml.perform(license.paths.html);\n  }\n\n  @action\n  closeLicenseModal() {\n    this.selectedLicense = null;\n  }\n\n  @task\n  *loadLicenseHtml(path) {\n    const url = new URL(this.getLicensePath(path));\n\n    try {\n      const response = yield fetch(url, {\n        headers: {\n          'Content-Type': 'text/html',\n          'Cache-Control': 'no-cache',\n        },\n      });\n      if (response.ok) {\n        const htmlText = yield response.text();\n        this.selectedLicenseHTML = htmlSafe(htmlText);\n      } else {\n        const errorText = yield response.text();\n        logErrorUtil.logError(errorText);\n        return false;\n      }\n    } catch (error) {\n      logErrorUtil.logError(error.errors);\n      return false;\n    }\n  }\n\n  licenseRenderer = modifier((element) => {\n    const shadowRoot = element.attachShadow({ mode: 'open' });\n    shadowRoot.innerHTML = this.selectedLicenseHTML;\n\n    return () => {\n      shadowRoot.innerHTML = '';\n    };\n  });\n\n  @task\n  *loadLicenses() {\n    const url = new URL(getApiUrl(LICENSES_URL, LICENSES_NAMESPACE));\n\n    try {\n      const response = yield fetch(url, {\n        headers: {\n          'Content-Type': 'application/json',\n          'Cache-Control': 'no-cache',\n        },\n      });\n      if (response.ok) {\n        const responseJSON = yield response.json();\n        this.files = responseJSON;\n      } else {\n        const errorText = yield response.text();\n        logErrorUtil.logError(errorText);\n        return false;\n      }\n    } catch (error) {\n      logErrorUtil.logError(error.errors);\n      return false;\n    }\n  }\n\n  getLicensePath = (path) => getApiUrl(path, LICENSES_NAMESPACE);\n}\n","export default {\n  \"login-card\": \"_login-card_1yxvuc\",\n  \"background-purple\": \"_background-purple_1yxvuc\",\n  \"wallpaper\": \"_wallpaper_1yxvuc\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  {{save-redirect-uri}}\\n  class=\\\"{{local-class 'background-purple'}}\\n    d-flex flex-fill overflow-hidden position-relative\\\"\\n>\\n  <div class=\\\"container d-flex flex-fill p-3 align-items-center\\\">\\n    <Card\\n      class=\\\"border-white flex-shrink-0 mx-auto {{local-class 'login-card'}}\\\"\\n      as |card|\\n    >\\n      <div class=\\\"d-flex ps-2 py-3\\\">\\n        <img src=\\\"/assets/logos/SE_logo.svg\\\" alt={{t \\\"brand.siemens-energy\\\"}} />\\n      </div>\\n      <card.body>\\n        {{#if this.isShowingContactUsForm}}\\n          <Login::ContactUsForm\\n            @onBackToLogin={{set this \\\"isShowingContactUsForm\\\" false}}\\n          />\\n        {{else}}\\n          <Login::LoginForm />\\n        {{/if}}\\n      </card.body>\\n      {{#if this.isShowingContactUsButton}}\\n        <div class=\\\"m-4 m-md-3 m-lg-2 p-lg-1\\\">\\n          <Button\\n            class=\\\"d-flex mt-4 align-items-center\\\"\\n            @type=\\\"tertiary\\\"\\n            @onClick={{set this \\\"isShowingContactUsForm\\\" true}}\\n            data-test-contact-us-button\\n          >\\n\\n            <Icon class=\\\"me-1\\\" @icon=\\\"email\\\" />\\n            {{t \\\"screen.login.contact-us.title\\\"}}\\n\\n          </Button>\\n        </div>\\n      {{/if}}\\n    </Card>\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  {{save-redirect-uri}}\\n  class=\\\"{{local-class 'background-purple'}}\\n    d-flex flex-fill overflow-hidden position-relative\\\"\\n>\\n  <div class=\\\"container d-flex flex-fill p-3 align-items-center\\\">\\n    <Card\\n      class=\\\"border-white flex-shrink-0 mx-auto {{local-class 'login-card'}}\\\"\\n      as |card|\\n    >\\n      <div class=\\\"d-flex ps-2 py-3\\\">\\n        <img src=\\\"/assets/logos/SE_logo.svg\\\" alt={{t \\\"brand.siemens-energy\\\"}} />\\n      </div>\\n      <card.body>\\n        {{#if this.isShowingContactUsForm}}\\n          <Login::ContactUsForm\\n            @onBackToLogin={{set this \\\"isShowingContactUsForm\\\" false}}\\n          />\\n        {{else}}\\n          <Login::LoginForm />\\n        {{/if}}\\n      </card.body>\\n      {{#if this.isShowingContactUsButton}}\\n        <div class=\\\"m-4 m-md-3 m-lg-2 p-lg-1\\\">\\n          <Button\\n            class=\\\"d-flex mt-4 align-items-center\\\"\\n            @type=\\\"tertiary\\\"\\n            @onClick={{set this \\\"isShowingContactUsForm\\\" true}}\\n            data-test-contact-us-button\\n          >\\n\\n            <Icon class=\\\"me-1\\\" @icon=\\\"email\\\" />\\n            {{t \\\"screen.login.contact-us.title\\\"}}\\n\\n          </Button>\\n        </div>\\n      {{/if}}\\n    </Card>\\n  </div>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/login.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/login.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class LoginComponent extends Component {\n  @tracked isShowingContactUsForm = false;\n\n  get isShowingContactUsButton() {\n    return !this.isShowingContactUsForm;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<h5 data-test-contact-us-title>\\n  {{t \\\"screen.login.contact-us.title\\\"}}\\n</h5>\\n{{#if this.formSubmitted}}\\n  {{#if this.successMessage}}\\n    <div class=\\\"mt-3 mb-3\\\" data-test-contact-us-success-message>\\n      <Alert @type=\\\"success\\\" @dismissible={{false}}>\\n        <:header>\\n          {{t \\\"screen.login.contact-us.success-message.title\\\"}}\\n        </:header>\\n        <:body>\\n          <p>\\n            {{this.successMessage}}\\n          </p>\\n          <p class=\\\"pt-3 pb-1\\\">\\n            {{t \\\"screen.login.contact-us.success-message.thank-you\\\"}}\\n          </p>\\n          <p class=\\\"pt-1 pb-3\\\">\\n            {{t \\\"screen.login.contact-us.success-message.details\\\"}}\\n          </p>\\n          <Button\\n            @type=\\\"secondary\\\"\\n            data-test-contact-us-back-login-button\\n            {{on \\\"click\\\" @onBackToLogin}}\\n          >\\n            {{t \\\"form.button.back-to-login\\\"}}\\n          </Button>\\n        </:body>\\n      </Alert>\\n    </div>\\n  {{/if}}\\n  {{#if this.errorMessage}}\\n    <div class=\\\"mt-3 mb-3\\\" data-test-contact-us-error-message>\\n      <Alert @type=\\\"danger\\\" @dismissible={{false}}>\\n        <:header>\\n          {{t \\\"screen.login.contact-us.error-message.title\\\"}}\\n        </:header>\\n        <:body>\\n          <p>\\n            {{this.errorMessage}}\\n          </p>\\n          <p class=\\\"pt-1 pb-3\\\">\\n            {{t \\\"screen.login.contact-us.error-message.explanation\\\"}}\\n          </p>\\n          <p class=\\\"pt-1 pb-3\\\">\\n            {{t \\\"screen.login.contact-us.error-message.explanation-2\\\"}}\\n          </p>\\n          <Button\\n            @type=\\\"secondary\\\"\\n            data-test-contact-us-back-login-button\\n            {{on \\\"click\\\" @onBackToLogin}}\\n          >\\n            {{t \\\"form.button.back-to-login\\\"}}\\n          </Button>\\n        </:body>\\n      </Alert>\\n    </div>\\n  {{/if}}\\n{{else}}\\n  <Form\\n    @formLayout=\\\"vertical\\\"\\n    @model={{changeset\\n      (hash)\\n      (hash\\n        email=(array (validate-presence true) (validate-format type=\\\"email\\\"))\\n        fullName=(validate-presence true)\\n        companyName=(validate-presence true)\\n        message=(validate-presence true)\\n      )\\n    }}\\n    @onSubmit={{this.submitForm}}\\n    class=\\\"mt-3 mb-3\\\"\\n    as |form|\\n  >\\n    <form.element\\n      @controlType=\\\"email\\\"\\n      @label={{t \\\"form.label.email\\\"}}\\n      @property=\\\"email\\\"\\n      data-test-contact-us-form-email-input\\n    />\\n    <form.element\\n      @controlType=\\\"text\\\"\\n      @label={{t \\\"form.label.full-name\\\"}}\\n      @property=\\\"fullName\\\"\\n      data-test-contact-us-form-full-name-input\\n    />\\n    <form.element\\n      @controlType=\\\"text\\\"\\n      @label={{t \\\"form.label.company-name\\\"}}\\n      @property=\\\"companyName\\\"\\n      data-test-contact-us-form-company-name-input\\n    />\\n    <form.element\\n      @controlType=\\\"textarea\\\"\\n      @label={{t \\\"form.label.message\\\"}}\\n      @property=\\\"message\\\"\\n      data-test-contact-us-form-message-input\\n    />\\n    <div class=\\\"d-flex justify-content-between mt-4\\\">\\n      <form.submitButton data-test-contact-us-submit-button>\\n        {{if\\n          form.isSubmitting\\n          (t \\\"form.button.sending\\\")\\n          (t \\\"form.button.send\\\")\\n        }}\\n      </form.submitButton>\\n      <Button\\n        class=\\\"d-block\\\"\\n        @type=\\\"tertiary\\\"\\n        data-test-contact-us-back-to-login-button\\n        @onClick={{@onBackToLogin}}\\n      >\\n        {{t \\\"form.button.back-to-login\\\"}}\\n      </Button>\\n    </div>\\n  </Form>\\n{{/if}}\", {\"contents\":\"<h5 data-test-contact-us-title>\\n  {{t \\\"screen.login.contact-us.title\\\"}}\\n</h5>\\n{{#if this.formSubmitted}}\\n  {{#if this.successMessage}}\\n    <div class=\\\"mt-3 mb-3\\\" data-test-contact-us-success-message>\\n      <Alert @type=\\\"success\\\" @dismissible={{false}}>\\n        <:header>\\n          {{t \\\"screen.login.contact-us.success-message.title\\\"}}\\n        </:header>\\n        <:body>\\n          <p>\\n            {{this.successMessage}}\\n          </p>\\n          <p class=\\\"pt-3 pb-1\\\">\\n            {{t \\\"screen.login.contact-us.success-message.thank-you\\\"}}\\n          </p>\\n          <p class=\\\"pt-1 pb-3\\\">\\n            {{t \\\"screen.login.contact-us.success-message.details\\\"}}\\n          </p>\\n          <Button\\n            @type=\\\"secondary\\\"\\n            data-test-contact-us-back-login-button\\n            {{on \\\"click\\\" @onBackToLogin}}\\n          >\\n            {{t \\\"form.button.back-to-login\\\"}}\\n          </Button>\\n        </:body>\\n      </Alert>\\n    </div>\\n  {{/if}}\\n  {{#if this.errorMessage}}\\n    <div class=\\\"mt-3 mb-3\\\" data-test-contact-us-error-message>\\n      <Alert @type=\\\"danger\\\" @dismissible={{false}}>\\n        <:header>\\n          {{t \\\"screen.login.contact-us.error-message.title\\\"}}\\n        </:header>\\n        <:body>\\n          <p>\\n            {{this.errorMessage}}\\n          </p>\\n          <p class=\\\"pt-1 pb-3\\\">\\n            {{t \\\"screen.login.contact-us.error-message.explanation\\\"}}\\n          </p>\\n          <p class=\\\"pt-1 pb-3\\\">\\n            {{t \\\"screen.login.contact-us.error-message.explanation-2\\\"}}\\n          </p>\\n          <Button\\n            @type=\\\"secondary\\\"\\n            data-test-contact-us-back-login-button\\n            {{on \\\"click\\\" @onBackToLogin}}\\n          >\\n            {{t \\\"form.button.back-to-login\\\"}}\\n          </Button>\\n        </:body>\\n      </Alert>\\n    </div>\\n  {{/if}}\\n{{else}}\\n  <Form\\n    @formLayout=\\\"vertical\\\"\\n    @model={{changeset\\n      (hash)\\n      (hash\\n        email=(array (validate-presence true) (validate-format type=\\\"email\\\"))\\n        fullName=(validate-presence true)\\n        companyName=(validate-presence true)\\n        message=(validate-presence true)\\n      )\\n    }}\\n    @onSubmit={{this.submitForm}}\\n    class=\\\"mt-3 mb-3\\\"\\n    as |form|\\n  >\\n    <form.element\\n      @controlType=\\\"email\\\"\\n      @label={{t \\\"form.label.email\\\"}}\\n      @property=\\\"email\\\"\\n      data-test-contact-us-form-email-input\\n    />\\n    <form.element\\n      @controlType=\\\"text\\\"\\n      @label={{t \\\"form.label.full-name\\\"}}\\n      @property=\\\"fullName\\\"\\n      data-test-contact-us-form-full-name-input\\n    />\\n    <form.element\\n      @controlType=\\\"text\\\"\\n      @label={{t \\\"form.label.company-name\\\"}}\\n      @property=\\\"companyName\\\"\\n      data-test-contact-us-form-company-name-input\\n    />\\n    <form.element\\n      @controlType=\\\"textarea\\\"\\n      @label={{t \\\"form.label.message\\\"}}\\n      @property=\\\"message\\\"\\n      data-test-contact-us-form-message-input\\n    />\\n    <div class=\\\"d-flex justify-content-between mt-4\\\">\\n      <form.submitButton data-test-contact-us-submit-button>\\n        {{if\\n          form.isSubmitting\\n          (t \\\"form.button.sending\\\")\\n          (t \\\"form.button.send\\\")\\n        }}\\n      </form.submitButton>\\n      <Button\\n        class=\\\"d-block\\\"\\n        @type=\\\"tertiary\\\"\\n        data-test-contact-us-back-to-login-button\\n        @onClick={{@onBackToLogin}}\\n      >\\n        {{t \\\"form.button.back-to-login\\\"}}\\n      </Button>\\n    </div>\\n  </Form>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/login/contact-us-form.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/login/contact-us-form.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport config from 'client-app-omnivise-web/config/environment';\nimport fetch from 'fetch';\nimport { isAbortError } from 'ember-fetch/errors';\n\nexport default class ContactUsFormComponent extends Component {\n  @tracked formSubmitted = false;\n  @tracked errorMessage = false;\n  @tracked successMessage = false;\n\n  @action\n  async submitForm({ email, fullName, companyName, message }) {\n    this.errorMessage = null;\n    this.successMessage = null;\n\n    const apiHost = config.api.host;\n\n    const data = {\n      email,\n      name: fullName,\n      company: companyName,\n      message,\n    };\n\n    try {\n      const result = await this._postData(\n        `${apiHost}/api/v1/apps/contact`,\n        data,\n      );\n      this.successMessage = result.message;\n    } catch (error) {\n      this.errorMessage = error;\n    } finally {\n      this.formSubmitted = true;\n    }\n  }\n\n  async _postData(url, data) {\n    const options = {\n      method: 'POST',\n      headers: { 'Content-Type': 'application/json' },\n      body: JSON.stringify(data),\n    };\n\n    try {\n      const response = await fetch(url, options);\n      if (response.ok) {\n        return response.json();\n      } else {\n        throw 'An unexpected error occurred';\n      }\n    } catch (error) {\n      if (isAbortError(error)) {\n        // handle aborted network error\n        throw 'A Network Error occurred, Make sure you are connected to the network';\n      }\n      throw 'An unexpected error occurred';\n    }\n  }\n}\n","export default {\n  \"menu\": \"_menu_1c94jl\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#each this.mainIdps as |mainIdp|}}\\n  <Button\\n    class=\\\"w-100 mt-3 mb-2\\\"\\n    @type=\\\"primary\\\"\\n    data-test-login-main-idp-option={{mainIdp}}\\n    {{on \\\"click\\\" (fn this.login mainIdp)}}\\n  >\\n    {{t (concat \\\"screen.login.main-options.\\\" mainIdp)}}\\n  </Button>\\n{{/each}}\\n{{#if this.secondaryIdps}}\\n  <div class=\\\"ember-view btn-group show w-100 mt-3 mb-2\\\">\\n    <Button\\n      data-test-login-others-button\\n      class=\\\"dropdown-toggle\\\"\\n      type=\\\"secondary\\\"\\n      @onClick={{set this \\\"showSecondaryIdps\\\" (not this.showSecondaryIdps)}}\\n    >\\n      {{t \\\"screen.login.secondary-options.title\\\"}}\\n    </Button>\\n\\n    {{#if this.showSecondaryIdps}}\\n      <div class=\\\"bg-white dropdown-menu show w-100 {{local-class 'menu'}}\\\">\\n        {{#each this.secondaryIdps as |otherIdp|}}\\n          <div\\n            class=\\\"w-100 text-secondary dropdown-item\\\"\\n            type=\\\"light\\\"\\n            role=\\\"button\\\"\\n            {{on \\\"click\\\" (fn this.login otherIdp)}}\\n            data-test-login-other-idp-option={{otherIdp}}\\n          >\\n            {{t (concat \\\"screen.login.secondary-options.\\\" otherIdp)}}\\n          </div>\\n        {{/each}}\\n      </div>\\n    {{/if}}\\n  </div>\\n{{/if}}\", {\"contents\":\"{{#each this.mainIdps as |mainIdp|}}\\n  <Button\\n    class=\\\"w-100 mt-3 mb-2\\\"\\n    @type=\\\"primary\\\"\\n    data-test-login-main-idp-option={{mainIdp}}\\n    {{on \\\"click\\\" (fn this.login mainIdp)}}\\n  >\\n    {{t (concat \\\"screen.login.main-options.\\\" mainIdp)}}\\n  </Button>\\n{{/each}}\\n{{#if this.secondaryIdps}}\\n  <div class=\\\"ember-view btn-group show w-100 mt-3 mb-2\\\">\\n    <Button\\n      data-test-login-others-button\\n      class=\\\"dropdown-toggle\\\"\\n      type=\\\"secondary\\\"\\n      @onClick={{set this \\\"showSecondaryIdps\\\" (not this.showSecondaryIdps)}}\\n    >\\n      {{t \\\"screen.login.secondary-options.title\\\"}}\\n    </Button>\\n\\n    {{#if this.showSecondaryIdps}}\\n      <div class=\\\"bg-white dropdown-menu show w-100 {{local-class 'menu'}}\\\">\\n        {{#each this.secondaryIdps as |otherIdp|}}\\n          <div\\n            class=\\\"w-100 text-secondary dropdown-item\\\"\\n            type=\\\"light\\\"\\n            role=\\\"button\\\"\\n            {{on \\\"click\\\" (fn this.login otherIdp)}}\\n            data-test-login-other-idp-option={{otherIdp}}\\n          >\\n            {{t (concat \\\"screen.login.secondary-options.\\\" otherIdp)}}\\n          </div>\\n        {{/each}}\\n      </div>\\n    {{/if}}\\n  </div>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/login/login-form.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/login/login-form.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\nimport { getOwner } from '@ember/application';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class LoginFormComponent extends Component {\n  @service session;\n  @tracked showSecondaryIdps = false;\n\n  get authConfig() {\n    return getOwner(this).resolveRegistration('config:environment').authConfig;\n  }\n\n  get mainIdps() {\n    return this.authConfig.mainIdps\n      ? this.authConfig.mainIdps?.split(',')\n      : null;\n  }\n\n  get secondaryIdps() {\n    return this.authConfig.secondaryIdps\n      ? this.authConfig.secondaryIdps?.split(',')\n      : null;\n  }\n\n  @action\n  login(provider) {\n    this.session.login(provider);\n  }\n}\n","export default {\n  \"category-title\": \"_category-title_1hybl6\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"text-primary mt-1 mb-1 ms-2 {{local-class 'category-title'}}\\\"\\n  data-test-category\\n  id={{concat \\\"modules-launcher-category-\\\" @categoryId}}\\n>\\n  <span class=\\\"ms-2\\\">\\n    {{@title}}\\n  </span>\\n</div>\\n<ModulesLauncher::List\\n  @modules={{@modules}}\\n  @onModuleLaunched={{@onModuleLaunched}}\\n  @searchString={{@searchString}}\\n/>\", {\"contents\":\"<div\\n  class=\\\"text-primary mt-1 mb-1 ms-2 {{local-class 'category-title'}}\\\"\\n  data-test-category\\n  id={{concat \\\"modules-launcher-category-\\\" @categoryId}}\\n>\\n  <span class=\\\"ms-2\\\">\\n    {{@title}}\\n  </span>\\n</div>\\n<ModulesLauncher::List\\n  @modules={{@modules}}\\n  @onModuleLaunched={{@onModuleLaunched}}\\n  @searchString={{@searchString}}\\n/>\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/category.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/category.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"search-input-field\": \"_search-input-field_16lknm\",\n  \"search-input-field-clear\": \"_search-input-field-clear_16lknm\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-modules-launcher=\\\"root\\\" ...attributes>\\n  {{#if this.loadModules.isRunning}}\\n    <p class=\\\"text-center m-4\\\" data-test-modules-launcher=\\\"loading\\\">\\n      <Spinner @size=\\\"md\\\" />\\n    </p>\\n  {{else}}\\n    <div class=\\\"row my-3 p-2\\\">\\n      <form\\n        class=\\\"col-12 col-md-5 col-lg-4 col-xl-3\\\"\\n        {{this.register}}\\n        {{on \\\"input\\\" this.handleSearch}}\\n      >\\n        <label class=\\\"sr-only\\\" for=\\\"search-input\\\">\\n          {{t \\\"screen.modules.search\\\"}}\\n        </label>\\n\\n        <div class=\\\"position-relative\\\">\\n          <input\\n            name=\\\"search\\\"\\n            class=\\\"form-control bg-white {{local-class 'search-input-field'}}\\\"\\n            id=\\\"search-input\\\"\\n            data-test-modules-launcher=\\\"search\\\"\\n            placeholder={{t \\\"screen.modules.search\\\"}}\\n          />\\n          {{#if this.searchString}}\\n            <img\\n              src=\\\"/assets/icons/close_black.svg\\\"\\n              alt={{t \\\"screen.modules.clear-search\\\"}}\\n              class=\\\"{{local-class 'search-input-field-clear'}}\\\"\\n              data-test-modules-launcher=\\\"clear\\\"\\n              role=\\\"button\\\"\\n              {{on \\\"click\\\" this.clearSearch}}\\n            />\\n          {{/if}}\\n        </div>\\n      </form>\\n      <Form\\n        class=\\\"col-12 col-md-7 col-lg-8 col-xl-9 d-flex align-items-center mt-1\\\"\\n        as |form|\\n      >\\n        <form.element\\n          data-test-modules-launcher=\\\"group-by-category\\\"\\n          @label={{t \\\"screen.modules.group-by-category\\\"}}\\n          @controlType=\\\"switch\\\"\\n          @onChange={{fn (mut this.shouldGroupByCategory)}}\\n          @value={{this.shouldGroupByCategory}}\\n          @disableCustomErrorComponent={{true}}\\n          class=\\\"w-100 mt-2\\\"\\n        />\\n      </Form>\\n      {{#if this.shouldGroupByCategory}}\\n        <div class=\\\"d-flex ps-2\\\">\\n          <span class=\\\"pt-1 text-secondary\\\">\\n            {{t \\\"screen.modules.quick-access\\\"}}\\n          </span>\\n          <ul class=\\\"list-inline\\\">\\n            {{#each this.categories as |category|}}\\n              <li class=\\\"list-inline-item\\\">\\n                <Button\\n                  @type=\\\"button\\\"\\n                  class=\\\"btn-outline-primary btn-sm\\\"\\n                  data-test-quick-access-button={{category.id}}\\n                  {{on\\n                    \\\"click\\\"\\n                    (fn\\n                      this.scrollIntoView\\n                      (concat \\\"#modules-launcher-category-\\\" category.id)\\n                    )\\n                  }}\\n                >\\n                  {{category.title}}\\n                </Button>\\n              </li>\\n            {{/each}}\\n          </ul>\\n        </div>\\n      {{/if}}\\n    </div>\\n    {{#if this.shouldGroupByCategory}}\\n      <div data-test-modules-launcher=\\\"categories-view\\\">\\n        {{#each this.categories as |category|}}\\n          <div data-test-modules-launcher=\\\"category-{{category.id}}\\\">\\n            <ModulesLauncher::Category\\n              @categoryId={{category.id}}\\n              @title={{category.title}}\\n              @modules={{category.modules}}\\n              @searchString={{this.searchString}}\\n              @onModuleLaunched={{@onModuleLaunched}}\\n            />\\n          </div>\\n        {{/each}}\\n        {{#if this.uncategorizedModules}}\\n          <div data-test-modules-launcher=\\\"category-uncategorized\\\">\\n            <ModulesLauncher::Category\\n              @title={{t \\\"screen.modules.uncategorized\\\"}}\\n              @modules={{this.uncategorizedModules}}\\n              @searchString={{this.searchString}}\\n              @onModuleLaunched={{@onModuleLaunched}}\\n            />\\n          </div>\\n        {{/if}}\\n      </div>\\n    {{else}}\\n      <ModulesLauncher::List\\n        @modules={{this.modules}}\\n        @onModuleLaunched={{@onModuleLaunched}}\\n        @toggleLauncher={{@toggleLauncher}}\\n        @searchString={{this.searchString}}\\n      />\\n    {{/if}}\\n  {{/if}}\\n</div>\", {\"contents\":\"<div data-test-modules-launcher=\\\"root\\\" ...attributes>\\n  {{#if this.loadModules.isRunning}}\\n    <p class=\\\"text-center m-4\\\" data-test-modules-launcher=\\\"loading\\\">\\n      <Spinner @size=\\\"md\\\" />\\n    </p>\\n  {{else}}\\n    <div class=\\\"row my-3 p-2\\\">\\n      <form\\n        class=\\\"col-12 col-md-5 col-lg-4 col-xl-3\\\"\\n        {{this.register}}\\n        {{on \\\"input\\\" this.handleSearch}}\\n      >\\n        <label class=\\\"sr-only\\\" for=\\\"search-input\\\">\\n          {{t \\\"screen.modules.search\\\"}}\\n        </label>\\n\\n        <div class=\\\"position-relative\\\">\\n          <input\\n            name=\\\"search\\\"\\n            class=\\\"form-control bg-white {{local-class 'search-input-field'}}\\\"\\n            id=\\\"search-input\\\"\\n            data-test-modules-launcher=\\\"search\\\"\\n            placeholder={{t \\\"screen.modules.search\\\"}}\\n          />\\n          {{#if this.searchString}}\\n            <img\\n              src=\\\"/assets/icons/close_black.svg\\\"\\n              alt={{t \\\"screen.modules.clear-search\\\"}}\\n              class=\\\"{{local-class 'search-input-field-clear'}}\\\"\\n              data-test-modules-launcher=\\\"clear\\\"\\n              role=\\\"button\\\"\\n              {{on \\\"click\\\" this.clearSearch}}\\n            />\\n          {{/if}}\\n        </div>\\n      </form>\\n      <Form\\n        class=\\\"col-12 col-md-7 col-lg-8 col-xl-9 d-flex align-items-center mt-1\\\"\\n        as |form|\\n      >\\n        <form.element\\n          data-test-modules-launcher=\\\"group-by-category\\\"\\n          @label={{t \\\"screen.modules.group-by-category\\\"}}\\n          @controlType=\\\"switch\\\"\\n          @onChange={{fn (mut this.shouldGroupByCategory)}}\\n          @value={{this.shouldGroupByCategory}}\\n          @disableCustomErrorComponent={{true}}\\n          class=\\\"w-100 mt-2\\\"\\n        />\\n      </Form>\\n      {{#if this.shouldGroupByCategory}}\\n        <div class=\\\"d-flex ps-2\\\">\\n          <span class=\\\"pt-1 text-secondary\\\">\\n            {{t \\\"screen.modules.quick-access\\\"}}\\n          </span>\\n          <ul class=\\\"list-inline\\\">\\n            {{#each this.categories as |category|}}\\n              <li class=\\\"list-inline-item\\\">\\n                <Button\\n                  @type=\\\"button\\\"\\n                  class=\\\"btn-outline-primary btn-sm\\\"\\n                  data-test-quick-access-button={{category.id}}\\n                  {{on\\n                    \\\"click\\\"\\n                    (fn\\n                      this.scrollIntoView\\n                      (concat \\\"#modules-launcher-category-\\\" category.id)\\n                    )\\n                  }}\\n                >\\n                  {{category.title}}\\n                </Button>\\n              </li>\\n            {{/each}}\\n          </ul>\\n        </div>\\n      {{/if}}\\n    </div>\\n    {{#if this.shouldGroupByCategory}}\\n      <div data-test-modules-launcher=\\\"categories-view\\\">\\n        {{#each this.categories as |category|}}\\n          <div data-test-modules-launcher=\\\"category-{{category.id}}\\\">\\n            <ModulesLauncher::Category\\n              @categoryId={{category.id}}\\n              @title={{category.title}}\\n              @modules={{category.modules}}\\n              @searchString={{this.searchString}}\\n              @onModuleLaunched={{@onModuleLaunched}}\\n            />\\n          </div>\\n        {{/each}}\\n        {{#if this.uncategorizedModules}}\\n          <div data-test-modules-launcher=\\\"category-uncategorized\\\">\\n            <ModulesLauncher::Category\\n              @title={{t \\\"screen.modules.uncategorized\\\"}}\\n              @modules={{this.uncategorizedModules}}\\n              @searchString={{this.searchString}}\\n              @onModuleLaunched={{@onModuleLaunched}}\\n            />\\n          </div>\\n        {{/if}}\\n      </div>\\n    {{else}}\\n      <ModulesLauncher::List\\n        @modules={{this.modules}}\\n        @onModuleLaunched={{@onModuleLaunched}}\\n        @toggleLauncher={{@toggleLauncher}}\\n        @searchString={{this.searchString}}\\n      />\\n    {{/if}}\\n  {{/if}}\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/index.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { task } from 'ember-concurrency-decorators';\nimport { action } from '@ember/object';\nimport { modifier } from 'ember-modifier';\nexport default class ModulesLauncher extends Component {\n  @service store;\n\n  @tracked modules = [];\n  @tracked searchString = '';\n  @tracked shouldGroupByCategory = false;\n  formElement = null;\n\n  constructor(owner, args) {\n    super(owner, args);\n\n    this.loadModules.perform();\n    this.loadCategories.perform();\n  }\n\n  register = modifier((element) => {\n    this.formElement = element;\n  });\n\n  get uncategorizedModules() {\n    return this.modules.filter((module) => !module.moduleCategories.length);\n  }\n\n  @action\n  handleSearch(event) {\n    const formData = new FormData(event.currentTarget);\n\n    this.searchString = formData.get('search');\n  }\n\n  @action\n  clearSearch() {\n    this.searchString = '';\n    this.formElement.reset();\n  }\n\n  @task\n  *loadModules() {\n    this.modules = yield this.store.findAll('module', {\n      include: ['moduleBadges', 'views', 'moduleCategories'].join(','),\n    });\n  }\n\n  @task\n  *loadCategories() {\n    this.categories = yield this.store.findAll('module-category');\n  }\n\n  @action\n  scrollIntoView(elementSelector) {\n    document\n      .querySelector(elementSelector)\n      .scrollIntoView({ behavior: 'smooth' });\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ul\\n  class=\\\"list-inline row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5\\\"\\n  data-test-modules-launcher=\\\"modules\\\"\\n>\\n  {{#each this.filteredModules as |module|}}\\n    <li class=\\\"list-inline-item col mx-0\\\">\\n      <ModulesLauncher::Tile\\n        @module={{module}}\\n        @onModuleLaunched={{@onModuleLaunched}}\\n        @toggleLauncher={{@toggleLauncher}}\\n        @setAsDefault={{this.setAsDefault}}\\n        @defaultModulePage={{this.defaultModulePage}}\\n        data-test-modules-launcher=\\\"module\\\"\\n      />\\n    </li>\\n  {{else}}\\n    {{#if @searchString}}\\n      <li\\n        class=\\\"text-center p-4 flex-grow-1\\\"\\n        data-test-modules-launcher=\\\"empty-search-result-message\\\"\\n      >\\n        {{t \\\"screen.modules.empty-search-results-message\\\"}}\\n        <span class=\\\"fw-bold px-1\\\">\\n          {{@searchString}}\\n        </span>\\n      </li>\\n    {{else}}\\n      <li\\n        class=\\\"text-center p-4\\\"\\n        data-test-modules-launcher=\\\"empty-modules-list-message\\\"\\n      >\\n        {{t \\\"screen.modules.empty-modules-list-message\\\"}}\\n      </li>\\n    {{/if}}\\n  {{/each}}\\n</ul>\", {\"contents\":\"<ul\\n  class=\\\"list-inline row row-cols-1 row-cols-sm-2 row-cols-md-3 row-cols-lg-4 row-cols-xl-5\\\"\\n  data-test-modules-launcher=\\\"modules\\\"\\n>\\n  {{#each this.filteredModules as |module|}}\\n    <li class=\\\"list-inline-item col mx-0\\\">\\n      <ModulesLauncher::Tile\\n        @module={{module}}\\n        @onModuleLaunched={{@onModuleLaunched}}\\n        @toggleLauncher={{@toggleLauncher}}\\n        @setAsDefault={{this.setAsDefault}}\\n        @defaultModulePage={{this.defaultModulePage}}\\n        data-test-modules-launcher=\\\"module\\\"\\n      />\\n    </li>\\n  {{else}}\\n    {{#if @searchString}}\\n      <li\\n        class=\\\"text-center p-4 flex-grow-1\\\"\\n        data-test-modules-launcher=\\\"empty-search-result-message\\\"\\n      >\\n        {{t \\\"screen.modules.empty-search-results-message\\\"}}\\n        <span class=\\\"fw-bold px-1\\\">\\n          {{@searchString}}\\n        </span>\\n      </li>\\n    {{else}}\\n      <li\\n        class=\\\"text-center p-4\\\"\\n        data-test-modules-launcher=\\\"empty-modules-list-message\\\"\\n      >\\n        {{t \\\"screen.modules.empty-modules-list-message\\\"}}\\n      </li>\\n    {{/if}}\\n  {{/each}}\\n</ul>\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/list.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/list.hbs\"}});\nimport Component from '@glimmer/component';\nimport { task } from 'ember-concurrency-decorators';\n\nimport { action } from '@ember/object';\nimport { tracked } from '@glimmer/tracking';\nimport { inject as service } from '@ember/service';\n\nexport default class ModulesLauncherListComponent extends Component {\n  @service session;\n  @tracked defaultModulePage;\n\n  constructor(owner, args) {\n    super(owner, args);\n\n    this.initDefaultModulePage();\n    this.loadModules.perform();\n  }\n\n  @task\n  *loadModules() {\n    yield this.args.modules;\n  }\n\n  initDefaultModulePage() {\n    this.defaultModulePage = this.session.user?.preferences?.defaultPage;\n  }\n\n  get filteredModules() {\n    const { modules, searchString } = this.args;\n    const normalizedSearchString = searchString.toLowerCase().trim();\n\n    if (!normalizedSearchString) {\n      return modules;\n    }\n\n    return modules.filter(({ name }) => {\n      const normalizedName = name.toLowerCase();\n      return normalizedName.includes(normalizedSearchString);\n    });\n  }\n\n  @action\n  async setAsDefault(modulePage) {\n    this.defaultModulePage = modulePage;\n\n    const currentUserPreference = this.session.user?.preferences;\n    currentUserPreference.defaultPage = this.defaultModulePage;\n    await currentUserPreference.save();\n  }\n}\n","export default {\n  \"card\": \"_card_gw0oxz\",\n  \"card-info\": \"_card-info_gw0oxz\",\n  \"module-screenshot\": \"_module-screenshot_gw0oxz\",\n  \"module-description-placeholder\": \"_module-description-placeholder_gw0oxz\",\n  \"module-description-container\": \"_module-description-container_gw0oxz\",\n  \"fade-in-loader\": \"_fade-in-loader_gw0oxz\",\n  \"fade-in\": \"_fade-in_gw0oxz\",\n  \"min-height-four-lines\": \"_min-height-four-lines_gw0oxz\",\n  \"truncate-after-four-lines\": \"_truncate-after-four-lines_gw0oxz\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if this.loadViews.isRunning}}\\n  <p class=\\\"text-center m-4\\\" data-test-modules-launcher=\\\"loading\\\">\\n    <Spinner @size=\\\"md\\\" />\\n  </p>\\n{{else}}\\n\\n  <Card\\n    class=\\\"border-dark bg-white {{local-class 'card'}}\\\"\\n    ...attributes\\n    data-test-module={{@module.id}}\\n    as |card|\\n  >\\n    <card.header\\n      class=\\\"bg-white border-white p-0 {{local-class 'card-header'}}\\\"\\n      data-test-module-header\\n    >\\n      <img\\n        src={{@module.icon}}\\n        class=\\\"ps-2 mt-2\\\"\\n        height=\\\"24\\\"\\n        alt={{t \\\"screen.modules.icon\\\"}}\\n        {{on \\\"error\\\" this.handleIconError}}\\n      />\\n      {{#if @module.hasInformationDetail}}\\n        <button\\n          class=\\\"ms-1 mt-2 pe-2 border-0 bg-transparent float-end d-none\\n            {{local-class 'card-info'}}\\\"\\n          data-test-module-details-launch-button={{@module.id}}\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" this.showModuleDetailsModal}}\\n        >\\n          <Icon @icon=\\\"information\\\" />\\n        </button>\\n      {{/if}}\\n      <a\\n        class=\\\"text-decoration-none\\\"\\n        target=\\\"_blank\\\"\\n        rel=\\\"noopener noreferrer\\\"\\n        href={{this.url}}\\n        {{on \\\"click\\\" this.launchModule}}\\n        data-test-module-name-link\\n      >\\n        <ModulesLauncher::Tile::Header @module={{@module}} />\\n      </a>\\n    </card.header>\\n    <a\\n      class=\\\"text-decoration-none pt-1\\\"\\n      href={{this.url}}\\n      {{on \\\"click\\\" this.launchModule}}\\n      data-test-module-description-link\\n    >\\n      <card.body class=\\\"d-none d-md-block pt-2\\\">\\n        <p\\n          class=\\\"text-secondary\\n            {{local-class 'min-height-four-lines'}}\\n            {{local-class 'truncate-after-four-lines'}}\\\"\\n          data-test-module-description\\n        >\\n          {{@module.description}}\\n        </p>\\n      </card.body>\\n    </a>\\n    <div class=\\\"d-flex p-2\\\">\\n      {{#if this.url}}\\n        <label>\\n          <input\\n            type=\\\"checkbox\\\"\\n            class=\\\"text-align-left\\\"\\n            data-test-module-checkbox={{@module.id}}\\n            checked={{this.isDefault}}\\n            {{on \\\"change\\\" this.changeDefault}}\\n          />\\n          <span>{{t \\\"screen.modules.default\\\"}}</span>\\n        </label>\\n      {{/if}}\\n    </div>\\n  </Card>\\n\\n  {{#let @module.informationDetail.isPending as |isLoading|}}\\n    <Modal\\n      @open={{this.isModalShowing}}\\n      @backdropClose={{true}}\\n      @onHidden={{this.hideModuleDetailsModal}}\\n      data-test-module-details-modal={{@module.id}}\\n      class=\\\"text-secondary\\\"\\n      @size=\\\"lg\\\"\\n      as |modal|\\n    >\\n      <modal.header>\\n        <h5 class=\\\"m-1\\\" data-test-module-details-modal-title={{@module.id}}>\\n          {{@module.name}}\\n        </h5>\\n        <Button\\n          @type=\\\"tertiary\\\"\\n          class=\\\"text-secondary shadow-none\\\"\\n          data-test-module-dev-data-link\\n          {{on \\\"click\\\" this.toggleShowDevData}}\\n        >\\n          <Icon\\n            class=\\\"mt-1 text-secondary\\\"\\n            @icon={{if this.isDevDataShowing \\\"eye-slash\\\" \\\"eye\\\"}}\\n          />\\n        </Button>\\n      </modal.header>\\n      <modal.body>\\n        {{#if this.isDevDataShowing}}\\n          <ModulesLauncher::Tile::DevData @module={{@module}} />\\n        {{else}}\\n          <ModulesLauncher::Tile::ModuleInfo\\n            @module={{@module}}\\n            @isLoading={{isLoading}}\\n          />\\n\\n        {{/if}}\\n      </modal.body>\\n      <modal.footer\\n        class=\\\"d-flex flex-column\\\"\\n        data-test-module-details-modal-footer={{@module.id}}\\n      >\\n        {{#if isLoading}}\\n          <div\\n            class=\\\"w-50 rounded\\n              {{local-class 'module-description-placeholder fade-in-loader'}}\\\"\\n          ></div>\\n          <div\\n            class=\\\"w-75 bg-secondary rounded\\n              {{local-class 'module-description-placeholder fade-in-loader'}}\\\"\\n          ></div>\\n        {{else}}\\n          <p class=\\\"text-center\\\">\\n            {{t \\\"screen.modules.for-more-info-reach\\\"}}\\n          </p>\\n          <p class=\\\"text-center\\\">\\n            <span\\n              class=\\\"fw-bold\\\"\\n              data-test-module-details-modal-contact-name={{@module.id}}\\n            >\\n              {{@module.informationDetail.contactFullName}}\\n            </span>\\n            {{t \\\"screen.modules.at\\\"}}\\n            <a\\n              href={{concat \\\"mailto:\\\" @module.informationDetail.contactEmail}}\\n              data-test-module-details-modal-contact-email={{@module.id}}\\n            >\\n              {{@module.informationDetail.contactEmail}}\\n            </a>\\n            {{!-- <span class=\\\"bold\\\">\\n        {{@module.informationDetail.contactEmail}}\\n      </span> --}}\\n          </p>\\n        {{/if}}\\n      </modal.footer>\\n    </Modal>\\n  {{/let}}\\n{{/if}}\", {\"contents\":\"{{#if this.loadViews.isRunning}}\\n  <p class=\\\"text-center m-4\\\" data-test-modules-launcher=\\\"loading\\\">\\n    <Spinner @size=\\\"md\\\" />\\n  </p>\\n{{else}}\\n\\n  <Card\\n    class=\\\"border-dark bg-white {{local-class 'card'}}\\\"\\n    ...attributes\\n    data-test-module={{@module.id}}\\n    as |card|\\n  >\\n    <card.header\\n      class=\\\"bg-white border-white p-0 {{local-class 'card-header'}}\\\"\\n      data-test-module-header\\n    >\\n      <img\\n        src={{@module.icon}}\\n        class=\\\"ps-2 mt-2\\\"\\n        height=\\\"24\\\"\\n        alt={{t \\\"screen.modules.icon\\\"}}\\n        {{on \\\"error\\\" this.handleIconError}}\\n      />\\n      {{#if @module.hasInformationDetail}}\\n        <button\\n          class=\\\"ms-1 mt-2 pe-2 border-0 bg-transparent float-end d-none\\n            {{local-class 'card-info'}}\\\"\\n          data-test-module-details-launch-button={{@module.id}}\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" this.showModuleDetailsModal}}\\n        >\\n          <Icon @icon=\\\"information\\\" />\\n        </button>\\n      {{/if}}\\n      <a\\n        class=\\\"text-decoration-none\\\"\\n        target=\\\"_blank\\\"\\n        rel=\\\"noopener noreferrer\\\"\\n        href={{this.url}}\\n        {{on \\\"click\\\" this.launchModule}}\\n        data-test-module-name-link\\n      >\\n        <ModulesLauncher::Tile::Header @module={{@module}} />\\n      </a>\\n    </card.header>\\n    <a\\n      class=\\\"text-decoration-none pt-1\\\"\\n      href={{this.url}}\\n      {{on \\\"click\\\" this.launchModule}}\\n      data-test-module-description-link\\n    >\\n      <card.body class=\\\"d-none d-md-block pt-2\\\">\\n        <p\\n          class=\\\"text-secondary\\n            {{local-class 'min-height-four-lines'}}\\n            {{local-class 'truncate-after-four-lines'}}\\\"\\n          data-test-module-description\\n        >\\n          {{@module.description}}\\n        </p>\\n      </card.body>\\n    </a>\\n    <div class=\\\"d-flex p-2\\\">\\n      {{#if this.url}}\\n        <label>\\n          <input\\n            type=\\\"checkbox\\\"\\n            class=\\\"text-align-left\\\"\\n            data-test-module-checkbox={{@module.id}}\\n            checked={{this.isDefault}}\\n            {{on \\\"change\\\" this.changeDefault}}\\n          />\\n          <span>{{t \\\"screen.modules.default\\\"}}</span>\\n        </label>\\n      {{/if}}\\n    </div>\\n  </Card>\\n\\n  {{#let @module.informationDetail.isPending as |isLoading|}}\\n    <Modal\\n      @open={{this.isModalShowing}}\\n      @backdropClose={{true}}\\n      @onHidden={{this.hideModuleDetailsModal}}\\n      data-test-module-details-modal={{@module.id}}\\n      class=\\\"text-secondary\\\"\\n      @size=\\\"lg\\\"\\n      as |modal|\\n    >\\n      <modal.header>\\n        <h5 class=\\\"m-1\\\" data-test-module-details-modal-title={{@module.id}}>\\n          {{@module.name}}\\n        </h5>\\n        <Button\\n          @type=\\\"tertiary\\\"\\n          class=\\\"text-secondary shadow-none\\\"\\n          data-test-module-dev-data-link\\n          {{on \\\"click\\\" this.toggleShowDevData}}\\n        >\\n          <Icon\\n            class=\\\"mt-1 text-secondary\\\"\\n            @icon={{if this.isDevDataShowing \\\"eye-slash\\\" \\\"eye\\\"}}\\n          />\\n        </Button>\\n      </modal.header>\\n      <modal.body>\\n        {{#if this.isDevDataShowing}}\\n          <ModulesLauncher::Tile::DevData @module={{@module}} />\\n        {{else}}\\n          <ModulesLauncher::Tile::ModuleInfo\\n            @module={{@module}}\\n            @isLoading={{isLoading}}\\n          />\\n\\n        {{/if}}\\n      </modal.body>\\n      <modal.footer\\n        class=\\\"d-flex flex-column\\\"\\n        data-test-module-details-modal-footer={{@module.id}}\\n      >\\n        {{#if isLoading}}\\n          <div\\n            class=\\\"w-50 rounded\\n              {{local-class 'module-description-placeholder fade-in-loader'}}\\\"\\n          ></div>\\n          <div\\n            class=\\\"w-75 bg-secondary rounded\\n              {{local-class 'module-description-placeholder fade-in-loader'}}\\\"\\n          ></div>\\n        {{else}}\\n          <p class=\\\"text-center\\\">\\n            {{t \\\"screen.modules.for-more-info-reach\\\"}}\\n          </p>\\n          <p class=\\\"text-center\\\">\\n            <span\\n              class=\\\"fw-bold\\\"\\n              data-test-module-details-modal-contact-name={{@module.id}}\\n            >\\n              {{@module.informationDetail.contactFullName}}\\n            </span>\\n            {{t \\\"screen.modules.at\\\"}}\\n            <a\\n              href={{concat \\\"mailto:\\\" @module.informationDetail.contactEmail}}\\n              data-test-module-details-modal-contact-email={{@module.id}}\\n            >\\n              {{@module.informationDetail.contactEmail}}\\n            </a>\\n            {{!-- <span class=\\\"bold\\\">\\n        {{@module.informationDetail.contactEmail}}\\n      </span> --}}\\n          </p>\\n        {{/if}}\\n      </modal.footer>\\n    </Modal>\\n  {{/let}}\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/tile.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/tile.hbs\"}});\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport { task } from 'ember-concurrency-decorators';\n\nexport default class ModulesLauncherTileComponent extends Component {\n  @service router;\n  @tracked isModalShowing = false;\n  @tracked isDevDataShowing = false;\n  @tracked views;\n\n  constructor(owner, args) {\n    super(owner, args);\n    this.loadViews.perform();\n  }\n\n  @task\n  *loadViews() {\n    this.views = yield this.args.module?.views || [];\n  }\n\n  findFirstViewByType(type) {\n    const views = this.views;\n    return views.find((view) => view.constructor.modelName === type);\n  }\n\n  get defaultView() {\n    return (\n      this.findFirstViewByType('internal-view') ||\n      this.findFirstViewByType('external-view')\n    );\n  }\n\n  get hasDefaultView() {\n    return !!this.defaultView;\n  }\n\n  get isDefaultViewInternal() {\n    return this.isDefaultViewOfType('internal-view');\n  }\n\n  get url() {\n    return this.isDefaultViewInternal\n      ? this.router.urlFor('auth.view', this.defaultView.id)\n      : this.defaultView?.url;\n  }\n\n  isDefaultViewOfType(type) {\n    return this.defaultView?.constructor.modelName === type;\n  }\n\n  @action\n  handleIconError() {\n    this.args.module.icon = '/assets/icons/SE_Home.svg';\n  }\n\n  @action\n  changeDefault(event) {\n    if (!this.url) {\n      event.target.checked = false;\n      return;\n    }\n    event.target.checked\n      ? this.args.setAsDefault(this.url)\n      : this.args.setAsDefault(null);\n  }\n\n  get isDefault() {\n    return (\n      this.url &&\n      this.args.defaultModulePage &&\n      this.args.defaultModulePage === this.url\n    );\n  }\n\n  @action\n  async launchModule(event) {\n    // External views have an external URL. Browser defaults handle this case very well.\n    if (this.isDefaultViewInternal) {\n      // Transition to internal view using Ember router\n      event.preventDefault();\n      await this.router.transitionTo('auth.view', this.defaultView.id);\n      this.args.onModuleLaunched();\n    } else if (!this.hasDefaultView) {\n      // A module without a view is considered corrupted data.\n      logErrorUtil.logError(\n        `Module ${this.args.module.name} can not be launched because it does not have any view`,\n      );\n    }\n  }\n\n  @action\n  toggleShowDevData() {\n    this.isDevDataShowing = !this.isDevDataShowing;\n  }\n\n  @action\n  showModuleDetailsModal() {\n    this.isModalShowing = true;\n    this.args.toggleLauncher && this.args.toggleLauncher();\n  }\n\n  @action\n  hideModuleDetailsModal() {\n    this.isModalShowing = false;\n    this.isDevDataShowing = false;\n    this.args.toggleLauncher && this.args.toggleLauncher();\n  }\n}\n","export default {\n  \"vc-table\": \"_vc-table_iodrgi\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-dev-data>\\n  <h5 data-test-dev-data-module-info-title>\\n    {{t \\\"screen.modules.module-info\\\"}}\\n    [{{@module.id}}]\\n  </h5>\\n  <div class=\\\"d-flex\\\">\\n    <p data-test-dev-data-module-info-created-title class=\\\"w-25\\\">\\n      {{t \\\"screen.modules.created\\\"}}\\n    </p>\\n    <p data-test-dev-data-module-info-created-value class=\\\"w-25\\\">\\n      {{format-date @module.createdAt format=\\\"mmddyyhhmmss\\\"}}\\n    </p>\\n\\n    <p data-test-dev-data-module-info-updated-title class=\\\"w-25\\\">\\n      {{t \\\"screen.modules.updated\\\"}}\\n    </p>\\n    <p data-test-dev-data-module-info-updated-value class=\\\"w-25\\\">\\n      {{format-date @module.updatedAt format=\\\"mmddyyhhmmss\\\"}}\\n    </p>\\n\\n  </div>\\n  <h5 data-test-dev-data-views-info-title>\\n    {{t \\\"screen.modules.views-info\\\"}}\\n  </h5>\\n  <Accordion\\n    data-test-dev-data-views-info-accordion\\n    @onchange={{this.selectView}}\\n    @selected={{this.selectedView}}\\n    class=\\\"overflow-auto\\\"\\n    as |acc|\\n  >\\n    {{#each @module.views as |view idx|}}\\n      <acc.item\\n        data-test-dev-data-views-info-accordion-item\\n        class=\\\"bg-white {{local-class 'vc-table'}}\\\"\\n        @value={{idx}}\\n        @title={{concat view.id \\\" - \\\" view.constructor.modelName}}\\n      >\\n        <table data-test-dev-data-cd-table class=\\\"table table-striped\\\">\\n          <thead data-test-dev-data-cd-table-header>\\n            <tr>\\n              <th data-test-dev-data-cd-table-header-for=\\\"cd-id\\\" scope=\\\"col\\\">\\n                {{t \\\"screen.modules.cd-id\\\"}}\\n              </th>\\n              <th\\n                data-test-dev-data-cd-table-header-for=\\\"cd-version\\\"\\n                scope=\\\"col\\\"\\n              >\\n                {{t \\\"screen.modules.cd-version\\\"}}\\n              </th>\\n              <th\\n                data-test-dev-data-cd-table-header-for=\\\"release-channel\\\"\\n                scope=\\\"col\\\"\\n              >\\n                {{t \\\"screen.modules.release-channel\\\"}}\\n              </th>\\n              <th\\n                data-test-dev-data-cd-table-header-for=\\\"auth-scope\\\"\\n                scope=\\\"col\\\"\\n              >\\n                {{t \\\"screen.modules.auth-scope\\\"}}\\n              </th>\\n              <th data-test-dev-data-cd-table-header-for=\\\"updated\\\" scope=\\\"col\\\">\\n                {{t \\\"screen.modules.updated\\\"}}</th>\\n            </tr>\\n          </thead>\\n          <tbody data-test-dev-data-cd-table-body>\\n            {{#each view.configuredWidgets as |configuredWidget|}}\\n              {{#each configuredWidget.configuredComponents as |cc|}}\\n                <tr data-test-user-list=\\\"table-row-{{idx}}\\\">\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"cd-id\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  > {{cc.componentDescriptor.id}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"cd-version\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  > {{cc.componentDescriptor.version}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"release-channel\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  >\\n                    {{cc.componentDescriptor.releaseChannel}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"auth-scope\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  >{{cc.componentDescriptor.authScopes}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"updated\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  >\\n                    {{format-date\\n                      cc.componentDescriptor.updatedAt\\n                      format=\\\"mmddyyhhmmss\\\"\\n                    }}</td>\\n                </tr>\\n\\n              {{/each}}\\n            {{/each}}\\n          </tbody>\\n\\n        </table>\\n\\n      </acc.item>\\n    {{/each}}\\n  </Accordion>\\n</div>\", {\"contents\":\"<div data-test-dev-data>\\n  <h5 data-test-dev-data-module-info-title>\\n    {{t \\\"screen.modules.module-info\\\"}}\\n    [{{@module.id}}]\\n  </h5>\\n  <div class=\\\"d-flex\\\">\\n    <p data-test-dev-data-module-info-created-title class=\\\"w-25\\\">\\n      {{t \\\"screen.modules.created\\\"}}\\n    </p>\\n    <p data-test-dev-data-module-info-created-value class=\\\"w-25\\\">\\n      {{format-date @module.createdAt format=\\\"mmddyyhhmmss\\\"}}\\n    </p>\\n\\n    <p data-test-dev-data-module-info-updated-title class=\\\"w-25\\\">\\n      {{t \\\"screen.modules.updated\\\"}}\\n    </p>\\n    <p data-test-dev-data-module-info-updated-value class=\\\"w-25\\\">\\n      {{format-date @module.updatedAt format=\\\"mmddyyhhmmss\\\"}}\\n    </p>\\n\\n  </div>\\n  <h5 data-test-dev-data-views-info-title>\\n    {{t \\\"screen.modules.views-info\\\"}}\\n  </h5>\\n  <Accordion\\n    data-test-dev-data-views-info-accordion\\n    @onchange={{this.selectView}}\\n    @selected={{this.selectedView}}\\n    class=\\\"overflow-auto\\\"\\n    as |acc|\\n  >\\n    {{#each @module.views as |view idx|}}\\n      <acc.item\\n        data-test-dev-data-views-info-accordion-item\\n        class=\\\"bg-white {{local-class 'vc-table'}}\\\"\\n        @value={{idx}}\\n        @title={{concat view.id \\\" - \\\" view.constructor.modelName}}\\n      >\\n        <table data-test-dev-data-cd-table class=\\\"table table-striped\\\">\\n          <thead data-test-dev-data-cd-table-header>\\n            <tr>\\n              <th data-test-dev-data-cd-table-header-for=\\\"cd-id\\\" scope=\\\"col\\\">\\n                {{t \\\"screen.modules.cd-id\\\"}}\\n              </th>\\n              <th\\n                data-test-dev-data-cd-table-header-for=\\\"cd-version\\\"\\n                scope=\\\"col\\\"\\n              >\\n                {{t \\\"screen.modules.cd-version\\\"}}\\n              </th>\\n              <th\\n                data-test-dev-data-cd-table-header-for=\\\"release-channel\\\"\\n                scope=\\\"col\\\"\\n              >\\n                {{t \\\"screen.modules.release-channel\\\"}}\\n              </th>\\n              <th\\n                data-test-dev-data-cd-table-header-for=\\\"auth-scope\\\"\\n                scope=\\\"col\\\"\\n              >\\n                {{t \\\"screen.modules.auth-scope\\\"}}\\n              </th>\\n              <th data-test-dev-data-cd-table-header-for=\\\"updated\\\" scope=\\\"col\\\">\\n                {{t \\\"screen.modules.updated\\\"}}</th>\\n            </tr>\\n          </thead>\\n          <tbody data-test-dev-data-cd-table-body>\\n            {{#each view.configuredWidgets as |configuredWidget|}}\\n              {{#each configuredWidget.configuredComponents as |cc|}}\\n                <tr data-test-user-list=\\\"table-row-{{idx}}\\\">\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"cd-id\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  > {{cc.componentDescriptor.id}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"cd-version\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  > {{cc.componentDescriptor.version}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"release-channel\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  >\\n                    {{cc.componentDescriptor.releaseChannel}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"auth-scope\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  >{{cc.componentDescriptor.authScopes}}</td>\\n                  <td\\n                    data-test-dev-data-cd-table-value-for=\\\"updated\\\"\\n                    class=\\\"py-1 w-25 align-middle\\\"\\n                  >\\n                    {{format-date\\n                      cc.componentDescriptor.updatedAt\\n                      format=\\\"mmddyyhhmmss\\\"\\n                    }}</td>\\n                </tr>\\n\\n              {{/each}}\\n            {{/each}}\\n          </tbody>\\n\\n        </table>\\n\\n      </acc.item>\\n    {{/each}}\\n  </Accordion>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/tile/dev-data.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/tile/dev-data.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\n\nexport default class ModulesLauncherDevData extends Component {\n  @tracked selectedView = 0;\n\n  @action\n  selectView(view) {\n    this.selectedView = view;\n  }\n}\n","export default {\n  \"height-one-line\": \"_height-one-line_1fxrmt\",\n  \"min-height-two-lines\": \"_min-height-two-lines_1fxrmt\",\n  \"truncate-after-two-lines\": \"_truncate-after-two-lines_1fxrmt\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<ul class=\\\"mt-1 ps-2 mb-0 list-unstyled {{local-class 'height-one-line'}}\\\">\\n  {{#each @module.moduleBadges as |badge|}}\\n    <li data-test-module-badge class=\\\"badge {{module-badge badge.style}}\\\">\\n      {{badge.text}}\\n    </li>\\n  {{/each}}\\n</ul>\\n<h5\\n  class=\\\"mt-2 ps-2 text-primary mb-0\\n    {{local-class 'min-height-two-lines'}}\\n    {{local-class 'truncate-after-two-lines'}}\\\"\\n  data-test-module-name\\n>\\n  {{@module.name}}\\n</h5>\", {\"contents\":\"<ul class=\\\"mt-1 ps-2 mb-0 list-unstyled {{local-class 'height-one-line'}}\\\">\\n  {{#each @module.moduleBadges as |badge|}}\\n    <li data-test-module-badge class=\\\"badge {{module-badge badge.style}}\\\">\\n      {{badge.text}}\\n    </li>\\n  {{/each}}\\n</ul>\\n<h5\\n  class=\\\"mt-2 ps-2 text-primary mb-0\\n    {{local-class 'min-height-two-lines'}}\\n    {{local-class 'truncate-after-two-lines'}}\\\"\\n  data-test-module-name\\n>\\n  {{@module.name}}\\n</h5>\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/tile/header.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/tile/header.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"module-screenshot\": \"_module-screenshot_1ryxcz\",\n  \"module-description-placeholder\": \"_module-description-placeholder_1ryxcz\",\n  \"module-description-container\": \"_module-description-container_1ryxcz\",\n  \"fade-in-loader\": \"_fade-in-loader_1ryxcz\",\n  \"fade-in\": \"_fade-in_1ryxcz\",\n  \"min-height-four-lines\": \"_min-height-four-lines_1ryxcz\",\n  \"truncate-after-four-lines\": \"_truncate-after-four-lines_1ryxcz\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"py-3 d-flex flex-column flex-lg-row\\\">\\n  {{#if @isLoading}}\\n    <div\\n      data-test-module-details-loader-screenshot-placeholder\\n      class=\\\"flex-grow-1 w-100 bg-secondary rounded\\n        {{local-class 'module-screenshot-placeholder fade-in-loader'}}\\\"\\n    ></div>\\n  {{else}}\\n    <div class=\\\"flex-grow-1\\\">\\n      <img\\n        src={{get @module.informationDetail.images \\\"0\\\"}}\\n        alt={{t \\\"screen.modules.alt-module-screenshot\\\"}}\\n        class=\\\"w-100 {{local-class 'module-screenshot'}}\\\"\\n        data-test-module-details-modal-screenshot={{@module.id}}\\n      />\\n    </div>\\n  {{/if}}\\n  <div\\n    class=\\\"flex-grow-1 flex-shrink-0 ps-3 mt-3 mt-lg-0\\n      {{if @isLoading 'd-flex flex-column justify-content-between'}}\\\"\\n  >\\n    {{#if @isLoading}}\\n      <div\\n        class=\\\"mb-3\\n          {{local-class 'module-description-container fade-in-loader'}}\\\"\\n      >\\n        <div\\n          class=\\\"w-100 rounded {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-100 my-1 rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-75 rounded {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n      </div>\\n      <div\\n        class=\\\"{{local-class 'module-description-container fade-in-loader'}}\\\"\\n      >\\n        <div\\n          class=\\\"w-25 bg-secondary rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-75 bg-secondary my-1 rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-100 bg-secondary rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n      </div>\\n    {{else}}\\n      <div\\n        class=\\\"d-flex flex-column justify-content-between h-100\\n          {{local-class 'module-description-container'}}\\\"\\n      >\\n        <div data-test-module-details-modal-description={{@module.id}}>\\n          {{@module.description}}\\n        </div>\\n        {{#if @module.informationDetail.benefits.length}}\\n          <div data-test-module-details-modal-benefits={{@module.id}}>\\n            <h4>\\n              {{t \\\"screen.modules.benefits-title\\\"}}\\n            </h4>\\n            <ul class=\\\"mb-0 list-unstyled\\\">\\n              {{#each @module.informationDetail.benefits as |benefit index|}}\\n                <li\\n                  class=\\\"mb-1\\\"\\n                  data-test-module-details-modal-benefit={{index}}\\n                >\\n                  <span class=\\\"px-1 py-1 text-white rounded-lg bg-success\\\">\\n                    {{benefit}}\\n                  </span>\\n                </li>\\n              {{/each}}\\n            </ul>\\n          </div>\\n        {{/if}}\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<div class=\\\"py-3 d-flex flex-column flex-lg-row\\\">\\n  {{#if @isLoading}}\\n    <div\\n      data-test-module-details-loader-screenshot-placeholder\\n      class=\\\"flex-grow-1 w-100 bg-secondary rounded\\n        {{local-class 'module-screenshot-placeholder fade-in-loader'}}\\\"\\n    ></div>\\n  {{else}}\\n    <div class=\\\"flex-grow-1\\\">\\n      <img\\n        src={{get @module.informationDetail.images \\\"0\\\"}}\\n        alt={{t \\\"screen.modules.alt-module-screenshot\\\"}}\\n        class=\\\"w-100 {{local-class 'module-screenshot'}}\\\"\\n        data-test-module-details-modal-screenshot={{@module.id}}\\n      />\\n    </div>\\n  {{/if}}\\n  <div\\n    class=\\\"flex-grow-1 flex-shrink-0 ps-3 mt-3 mt-lg-0\\n      {{if @isLoading 'd-flex flex-column justify-content-between'}}\\\"\\n  >\\n    {{#if @isLoading}}\\n      <div\\n        class=\\\"mb-3\\n          {{local-class 'module-description-container fade-in-loader'}}\\\"\\n      >\\n        <div\\n          class=\\\"w-100 rounded {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-100 my-1 rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-75 rounded {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n      </div>\\n      <div\\n        class=\\\"{{local-class 'module-description-container fade-in-loader'}}\\\"\\n      >\\n        <div\\n          class=\\\"w-25 bg-secondary rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-75 bg-secondary my-1 rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n        <div\\n          class=\\\"w-100 bg-secondary rounded\\n            {{local-class 'module-description-placeholder'}}\\\"\\n        ></div>\\n      </div>\\n    {{else}}\\n      <div\\n        class=\\\"d-flex flex-column justify-content-between h-100\\n          {{local-class 'module-description-container'}}\\\"\\n      >\\n        <div data-test-module-details-modal-description={{@module.id}}>\\n          {{@module.description}}\\n        </div>\\n        {{#if @module.informationDetail.benefits.length}}\\n          <div data-test-module-details-modal-benefits={{@module.id}}>\\n            <h4>\\n              {{t \\\"screen.modules.benefits-title\\\"}}\\n            </h4>\\n            <ul class=\\\"mb-0 list-unstyled\\\">\\n              {{#each @module.informationDetail.benefits as |benefit index|}}\\n                <li\\n                  class=\\\"mb-1\\\"\\n                  data-test-module-details-modal-benefit={{index}}\\n                >\\n                  <span class=\\\"px-1 py-1 text-white rounded-lg bg-success\\\">\\n                    {{benefit}}\\n                  </span>\\n                </li>\\n              {{/each}}\\n            </ul>\\n          </div>\\n        {{/if}}\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/modules-launcher/tile/module-info.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/modules-launcher/tile/module-info.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"search-input-field-clear\": \"_search-input-field-clear_hgsm4j\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"notifications\\\")}}\\n  {{! load notifications when user authenticates _after_ component has been rendered }}\\n  {{! template-lint-disable no-at-ember-render-modifiers }}\\n  {{! template-lint-disable no-builtin-form-components }}\\n  {{did-update-helper\\n    this.handleAuthenticationChange\\n    this.session.isAuthenticated\\n  }}\\n\\n  <Header::MenuModal>\\n    <:trigger as |trigger|>\\n      <NotificationsManager::Toggler\\n        {{trigger.trigger}}\\n        @unreadNotificationsCount={{this.totalUnreadCount.length}}\\n        @shouldShowError={{this.setupWebSocketAndLoadNotifications.last.isError}}\\n        @onClick={{trigger.toggle}}\\n      />\\n    </:trigger>\\n\\n    <:content as |dialog|>\\n      <div\\n        class=\\\"d-flex w-100 pt-3 px-3 pb-0 col-12 col-md-5 col-lg-4 col-xl-3\\\"\\n      >\\n        <label class=\\\"sr-only\\\" for=\\\"search-input\\\">\\n          {{t \\\"notification.search\\\"}}\\n        </label>\\n        <div class=\\\"d-flex w-100 position-relative\\\">\\n          <Input\\n            name=\\\"search\\\"\\n            class=\\\"form-control bg-body\\\"\\n            id=\\\"search-input\\\"\\n            data-test-notifications-search=\\\"search\\\"\\n            placeholder={{t \\\"notification.search\\\"}}\\n            @value={{this.query}}\\n            {{on \\\"input\\\" (perform this.searchForInput)}}\\n          />\\n          {{#if this.query.length}}\\n            <img\\n              src=\\\"/assets/icons/close_black.svg\\\"\\n              alt={{t \\\"screen.modules.clear-search\\\"}}\\n              class=\\\"{{local-class 'search-input-field-clear'}}\\\"\\n              data-test-notifications-search=\\\"clear\\\"\\n              role=\\\"button\\\"\\n              {{on \\\"click\\\" this.clearSearch}}\\n            />\\n          {{/if}}\\n        </div>\\n      </div>\\n      <NotificationsManager::List\\n        @unreadNotifications={{this.unreadNotifications}}\\n        @readNotifications={{this.readNotifications}}\\n        @isNotificationsLoading={{not this.hasNotificationsBeenLoadedOnce}}\\n        @isFetchingMoreUnreadNotifications={{this.loadUnreadNotifications.isRunning}}\\n        @isFetchingMoreReadNotifications={{this.loadReadNotifications.isRunning}}\\n        @query={{this.query}}\\n        @refreshNotifications={{perform this.loadUnreadNotifications}}\\n        @refreshReadNotifications={{perform this.loadReadNotifications}}\\n        @loadNextPageUnread={{this.loadNextPageUnread}}\\n        @loadNextPageRead={{this.loadNextPageRead}}\\n        @unreadNotificationsCount={{this.totalUnreadCount}}\\n        @readNotificationsCount={{this.totalReadCount}}\\n        @toggleLauncher={{dialog.close}}\\n      />\\n    </:content>\\n  </Header::MenuModal>\\n\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"notifications\\\")}}\\n  {{! load notifications when user authenticates _after_ component has been rendered }}\\n  {{! template-lint-disable no-at-ember-render-modifiers }}\\n  {{! template-lint-disable no-builtin-form-components }}\\n  {{did-update-helper\\n    this.handleAuthenticationChange\\n    this.session.isAuthenticated\\n  }}\\n\\n  <Header::MenuModal>\\n    <:trigger as |trigger|>\\n      <NotificationsManager::Toggler\\n        {{trigger.trigger}}\\n        @unreadNotificationsCount={{this.totalUnreadCount.length}}\\n        @shouldShowError={{this.setupWebSocketAndLoadNotifications.last.isError}}\\n        @onClick={{trigger.toggle}}\\n      />\\n    </:trigger>\\n\\n    <:content as |dialog|>\\n      <div\\n        class=\\\"d-flex w-100 pt-3 px-3 pb-0 col-12 col-md-5 col-lg-4 col-xl-3\\\"\\n      >\\n        <label class=\\\"sr-only\\\" for=\\\"search-input\\\">\\n          {{t \\\"notification.search\\\"}}\\n        </label>\\n        <div class=\\\"d-flex w-100 position-relative\\\">\\n          <Input\\n            name=\\\"search\\\"\\n            class=\\\"form-control bg-body\\\"\\n            id=\\\"search-input\\\"\\n            data-test-notifications-search=\\\"search\\\"\\n            placeholder={{t \\\"notification.search\\\"}}\\n            @value={{this.query}}\\n            {{on \\\"input\\\" (perform this.searchForInput)}}\\n          />\\n          {{#if this.query.length}}\\n            <img\\n              src=\\\"/assets/icons/close_black.svg\\\"\\n              alt={{t \\\"screen.modules.clear-search\\\"}}\\n              class=\\\"{{local-class 'search-input-field-clear'}}\\\"\\n              data-test-notifications-search=\\\"clear\\\"\\n              role=\\\"button\\\"\\n              {{on \\\"click\\\" this.clearSearch}}\\n            />\\n          {{/if}}\\n        </div>\\n      </div>\\n      <NotificationsManager::List\\n        @unreadNotifications={{this.unreadNotifications}}\\n        @readNotifications={{this.readNotifications}}\\n        @isNotificationsLoading={{not this.hasNotificationsBeenLoadedOnce}}\\n        @isFetchingMoreUnreadNotifications={{this.loadUnreadNotifications.isRunning}}\\n        @isFetchingMoreReadNotifications={{this.loadReadNotifications.isRunning}}\\n        @query={{this.query}}\\n        @refreshNotifications={{perform this.loadUnreadNotifications}}\\n        @refreshReadNotifications={{perform this.loadReadNotifications}}\\n        @loadNextPageUnread={{this.loadNextPageUnread}}\\n        @loadNextPageRead={{this.loadNextPageRead}}\\n        @unreadNotificationsCount={{this.totalUnreadCount}}\\n        @readNotificationsCount={{this.totalReadCount}}\\n        @toggleLauncher={{dialog.close}}\\n      />\\n    </:content>\\n  </Header::MenuModal>\\n\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/notifications-manager/index.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/notifications-manager/index.hbs\"}});\nimport { inject as service } from '@ember/service';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { task } from 'ember-concurrency-decorators';\nimport { timeout } from 'ember-concurrency';\nimport { runTask } from 'ember-lifeline';\nimport { isEmpty } from '@ember/utils';\nimport { action } from '@ember/object';\nimport config from 'client-app-omnivise-web/config/environment';\nimport { registerDestructor, unregisterDestructor } from '@ember/destroyable';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport fetch from 'fetch';\nimport getApiUrl from 'client-app-omnivise-web/utils/get-api-url';\n\nexport const RETRY_DELAY = 30000;\nconst NOTIFICATION_ALERTS_SUMMARIES_URL = 'notification-alerts/summaries';\nconst NOTIFICATION_TYPES = [\n  'failed_sensor_comment',\n  'report',\n  'report_comment',\n  'alert',\n];\n\nexport default class NotificationsManager extends Component {\n  @service\n  store;\n\n  @service session;\n  @service features;\n\n  @service notification;\n\n  @tracked hasNotificationsBeenLoadedOnce = false;\n  @tracked notificationAlertsUnread = [];\n  @tracked notificationAlertsRead = [];\n  @tracked query = '';\n  @tracked currentPageUnread = 1;\n  @tracked currentPageRead = 1;\n  @tracked pageCountUnread = 0;\n  @tracked pageCountRead = 0;\n  @tracked unreadNotificationsCount = 0;\n  @tracked totalOfNotifications = [];\n  @tracked totalUnreadCount = [];\n  @tracked totalReadCount = [];\n  @tracked webSocket;\n\n  wasAuthenticatedBefore;\n\n  get allowToConnect() {\n    return (\n      this.session.isAuthenticated && this.features.isEnabled('notifications')\n    );\n  }\n\n  constructor(owner, args) {\n    super(owner, args);\n\n    if (this.features.isEnabled('notifications')) {\n      this.initNotifications();\n\n      this.notification.on('refreshNotifications', () => {\n        this.unloadNotifications();\n        this.initNotifications();\n      });\n    }\n  }\n\n  initNotifications() {\n    this.wasAuthenticatedBefore = this.session.isAuthenticated;\n    if (this.allowToConnect) {\n      this.setupWebSocketAndLoadNotifications.perform();\n      this.fetchUnreadNotificationsCount.perform();\n    }\n  }\n\n  unloadNotifications() {\n    this.store\n      .peekAll('notificationAlert')\n      .forEach((notification) => notification.unloadRecord());\n  }\n\n  get isWebSocketAlive() {\n    return (\n      this.webSocket &&\n      ![WebSocket.CLOSING, WebSocket.CLOSED].includes(this.webSocket.readyState)\n    );\n  }\n\n  @task({ keepLatest: true })\n  *setupWebSocketAndLoadNotifications() {\n    // WebSocket connection should be established _before_ fetching existing\n    // notifications via HTTP API to avoid missing notifications created or\n    // updated between fetching over HTTP and establishing WebSocket connection\n    try {\n      yield this.initialiseWebSocket.perform();\n    } catch (error) {\n      // notifications should be loaded over HTTP regardless if WebSocket\n      // connection was established successfully or not\n\n      // log the error for debugging\n      logErrorUtil.logError(error);\n\n      // fetch notifications over HTTP\n      yield this.loadUnreadNotifications.perform(1);\n      yield this.loadReadNotifications.perform(1);\n\n      // task should be considered as having an error anyways\n      throw new Error(\n        'Successfully loaded notifications over HTTP but initializing WebSocket failed',\n        { cause: error },\n      );\n    }\n\n    // We have code duplication instead of using finally because if task is canceled\n    // finally will still be executed. loadUnreadNotifications must not be called when\n    // canceling the task\n    yield this.loadUnreadNotifications.perform(1);\n    yield this.loadReadNotifications.perform(1);\n  }\n\n  @task\n  *loadUnreadNotifications(page = 1) {\n    if (this.session.currentTime / 1000 < this.session.ownClaims.exp) {\n      try {\n        const notificationAlertsManyArray = yield this.store.query(\n          'notificationAlert',\n          {\n            type: NOTIFICATION_TYPES.join(','),\n            recent_read: 30,\n            page,\n            per_page: 20,\n          },\n        );\n\n        const notificationAlertsCount = yield this.store.query(\n          'notificationAlert',\n          {\n            type: NOTIFICATION_TYPES.join(','),\n            page: -1,\n            search: this.query,\n          },\n        );\n\n        const meta = notificationAlertsManyArray.meta;\n        this.pageCountUnread = meta?.pagination?.page_count || 1;\n\n        this.totalOfNotifications = notificationAlertsCount;\n        this.totalUnreadCount = this.totalOfNotifications.filter(\n          (notification) => !notification.isRead,\n        );\n        this.totalReadCount = this.totalOfNotifications.filter(\n          (notification) => notification.isRead,\n        );\n        this.currentPageUnread = page;\n\n        const startIndex = (this.currentPageUnread - 1) * 20;\n        const endIndex = startIndex + 20;\n\n        if (page === 1) {\n          this.notificationAlertsUnread = this.totalUnreadCount.slice(\n            startIndex,\n            endIndex,\n          );\n        } else {\n          this.notificationAlertsUnread = [\n            ...this.notificationAlertsUnread,\n            ...this.totalUnreadCount.slice(startIndex, endIndex),\n          ];\n        }\n\n        this.hasNotificationsBeenLoadedOnce = true;\n      } catch (e) {\n        logErrorUtil.logError(e);\n        if (this.session.isAuthenticated) {\n          this.retryAfterDelay.perform();\n        }\n        throw e;\n      }\n    }\n  }\n\n  @task\n  *loadReadNotifications(page = 1) {\n    if (this.session.currentTime / 1000 < this.session.ownClaims.exp) {\n      try {\n        const notificationAlertsManyArray = yield this.store.query(\n          'notificationAlert',\n          {\n            type: NOTIFICATION_TYPES.join(','),\n            recent_read: 30,\n            page,\n            per_page: 20,\n          },\n        );\n\n        const meta = notificationAlertsManyArray.meta;\n        this.pageCountRead = meta?.pagination?.page_count || 1;\n        this.currentPageRead = page;\n\n        const startIndex = (this.currentPageRead - 1) * 20;\n        const endIndex = startIndex + 20;\n\n        if (page === 1) {\n          this.notificationAlertsRead = this.totalReadCount.slice(\n            startIndex,\n            endIndex,\n          );\n        } else {\n          this.notificationAlertsRead = [\n            ...this.notificationAlertsRead,\n            ...this.totalReadCount.slice(startIndex, endIndex),\n          ];\n        }\n\n        this.hasNotificationsBeenLoadedOnce = true;\n      } catch (e) {\n        logErrorUtil.logError(e);\n        if (this.session.isAuthenticated) {\n          this.retryAfterDelay.perform();\n        }\n        throw e;\n      }\n    }\n  }\n\n  @task({ drop: true })\n  *retryAfterDelay() {\n    yield timeout(RETRY_DELAY);\n    if (this.allowToConnect) {\n      this.setupWebSocketAndLoadNotifications.perform();\n    }\n  }\n\n  @task\n  *searchForInput(event) {\n    const { value } = event.target;\n    this.query = value;\n\n    yield timeout(400);\n    this.refreshNotifications();\n  }\n\n  @action\n  loadNextPageUnread() {\n    if (\n      this.currentPageUnread < this.pageCountUnread &&\n      !this.loadUnreadNotifications.isRunning\n    ) {\n      this.loadUnreadNotifications.perform(this.currentPageUnread + 1);\n    }\n  }\n\n  @action\n  loadNextPageRead() {\n    if (\n      this.currentPageRead < this.pageCountRead &&\n      !this.loadReadNotifications.isRunning\n    ) {\n      this.loadReadNotifications.perform(this.currentPageRead + 1);\n    }\n  }\n\n  @action\n  clearSearch() {\n    this.query = '';\n    this.refreshNotifications();\n    this.refreshReadNotifications();\n  }\n\n  @action\n  handleAuthenticationChange() {\n    // Don't ask me why we need to delay this to the next runloop. I guess\n    // because we execute this function by a helper. All I know is that _not_\n    // delaying it to the next runloop invalides `isAuthenticated`, which\n    // leads to an endless loop.\n    runTask(\n      this,\n      () => {\n        const { isAuthenticated } = this.session;\n        const { wasAuthenticatedBefore } = this;\n        const hasAuthenticationChanged =\n          isAuthenticated !== wasAuthenticatedBefore;\n\n        if (!hasAuthenticationChanged) {\n          // Skip if authentication has not changed\n          return;\n        }\n\n        if (this.allowToConnect) {\n          this.setupWebSocketAndLoadNotifications.perform();\n        } else {\n          this.cleanupAfterLogOut();\n        }\n\n        this.wasAuthenticatedBefore = isAuthenticated;\n      },\n      1,\n    );\n  }\n\n  cleanupAfterLogOut() {\n    // close active Websocket connection\n    if (this.isWebSocketAlive) {\n      this.webSocket.close();\n    }\n\n    // make sure not retries or running connection attempts after log out\n    this.retryAfterDelay.cancelAll();\n    this.setupWebSocketAndLoadNotifications.cancelAll();\n\n    // only set tracked variable if component is not destroyed\n    if (!this.isDestroyed && !this.isDestroying) {\n      this.hasNotificationsBeenLoadedOnce = false;\n    }\n  }\n\n  get unreadNotifications() {\n    const notificationAlerts = this.sortedUnreadNotificationAlerts.filter(\n      (notification) => !notification.isRead,\n    );\n    return notificationAlerts;\n  }\n\n  get readNotifications() {\n    const readNotifications = this.sortedReadNotificationAlerts.filter(\n      (notification) => notification.isRead,\n    );\n    return readNotifications;\n  }\n\n  get sortedUnreadNotificationAlerts() {\n    return [...this.notificationAlertsUnread].sort(\n      (a, b) =>\n        new Date(b.timeStamp).getTime() - new Date(a.timeStamp).getTime(),\n    );\n  }\n\n  get sortedReadNotificationAlerts() {\n    return [...this.notificationAlertsRead].sort(\n      (a, b) =>\n        new Date(b.timeStamp).getTime() - new Date(a.timeStamp).getTime(),\n    );\n  }\n\n  @task\n  *initialiseWebSocket() {\n    if (this.isWebSocketAlive) {\n      return;\n    }\n    const { ownAccessToken: accessToken } = this.session;\n    const { webSocketHost } = config.api;\n    let webSocket;\n\n    yield new Promise((resolve, reject) => {\n      webSocket = new WebSocket(\n        `${webSocketHost}/notification-alerts-ws?authorization=${accessToken}`,\n      );\n      const webSocketDestructor = registerDestructor(this, () => {\n        this.cleanupAfterLogOut();\n      });\n      webSocket.addEventListener('close', () => {\n        if (!this.isDestroyed && !this.isDestroying) {\n          unregisterDestructor(this, webSocketDestructor);\n        }\n      });\n      webSocket.addEventListener('open', function () {\n        resolve();\n      });\n      webSocket.addEventListener('error', function (error) {\n        reject(\n          new Error(\n            'Establishing PDC Notifications WebSocket failed or established connection dropped unexpected',\n            { cause: error },\n          ),\n        );\n      });\n      webSocket.addEventListener('close', this.onNotficationConnectionClose);\n      webSocket.addEventListener(\n        'message',\n        this.onNotficationConnectionMessage,\n      );\n    });\n    this.webSocket = webSocket;\n  }\n\n  @task\n  *fetchUnreadNotificationsCount() {\n    try {\n      const url = new URL(\n        getApiUrl(NOTIFICATION_ALERTS_SUMMARIES_URL, 'api/v3'),\n      );\n      const options = {\n        method: 'GET',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.session.ownAccessToken}`,\n        },\n      };\n      const response = yield fetch(url, options);\n      const data = yield response.json();\n      const unreadCount = data.summaries\n        .filter((summary) => !summary.is_read)\n        .reduce((acc, summary) => acc + summary.total, 0);\n      this.unreadNotificationsCount = unreadCount;\n    } catch (error) {\n      logErrorUtil.logError(error);\n    }\n  }\n\n  @action\n  onNotficationConnectionClose() {\n    // close event is also fired when Websocket is closed by calling `close` method on it\n    // but we only close Websocket with intent when it is unauthenticated\n    if (this.session.isAuthenticated) {\n      this.retryAfterDelay.perform();\n    }\n  }\n\n  @action\n  onNotficationConnectionMessage(e) {\n    try {\n      const liveNotificationAlertPayload = JSON.parse(e.data);\n      const modelClass = this.store.modelFor('notification-alert');\n      const serializer = this.store.serializerFor('notification-alert');\n      const liveNotificationAlertNormalizedPayload = serializer.normalize(\n        modelClass,\n        liveNotificationAlertPayload.data,\n      );\n\n      const liveNotificationAlert = this.store.push(\n        liveNotificationAlertNormalizedPayload,\n      );\n\n      const wsNotification = Array.isArray(liveNotificationAlert)\n        ? liveNotificationAlert[0]\n        : liveNotificationAlert;\n\n      if (!wsNotification || isEmpty(wsNotification)) {\n        throw new Error('PDC Notification message is empty or invalid.');\n      }\n\n      const existingNotification = this.notificationAlertsUnread.find(\n        (n) => n?.id === wsNotification.id,\n      );\n\n      if (existingNotification) {\n        Object.assign(existingNotification, wsNotification);\n      } else {\n        this.notificationAlertsUnread = [\n          wsNotification,\n          ...this.notificationAlertsUnread,\n        ];\n      }\n\n      const isNewLiveNotificationAlert = !this.notificationAlertsUnread.some(\n        (n) => n.id === liveNotificationAlert.id,\n      );\n\n      if (isNewLiveNotificationAlert) {\n        this.notificationAlertsUnread = [\n          liveNotificationAlert,\n          ...this.notificationAlertsUnread,\n        ];\n        this.refreshNotifications();\n      }\n    } catch (error) {\n      // log the error for debugging\n      logErrorUtil.logError(error);\n\n      // fetch notifications over HTTP\n      this.refreshNotifications();\n\n      // Don't throw - optionally notify the user or log a warning instead\n      // eslint-disable-next-line no-console\n      console.log(\n        'WebSocket notification fetch failed. Fallback to HTTP used.',\n      );\n    }\n  }\n\n  @action\n  refreshNotifications() {\n    this.loadUnreadNotifications.perform(1);\n    this.loadReadNotifications.perform(1);\n    this.fetchUnreadNotificationsCount.perform();\n  }\n\n  @action\n  refreshReadNotifications() {\n    this.loadReadNotifications.perform(1);\n  }\n}\n","export default {\n  \"notification-heading\": \"_notification-heading_3rs2co\",\n  \"notification-read\": \"_notification-read_3rs2co\",\n  \"notification-title\": \"_notification-title_3rs2co\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  class=\\\"d-flex flex-row align-items-start py-2 m-1 bg-white\\\"\\n  data-test-notification-item-list\\n>\\n  {{#unless @notification.isRead}}\\n    <label\\n      class=\\\"sr-only\\\"\\n      for=\\\"checkbox-notification-{{@notification.id}}\\\"\\n      data-test-notification-item-checkbox\\n    >\\n      {{t \\\"notification.mark-selected-as-read\\\"}}\\n    </label>\\n    <input\\n      type=\\\"checkbox\\\"\\n      class=\\\"ms-2 form-check-input {{local-class 'notification-checkbox'}}\\\"\\n      id=\\\"checkbox-notification-{{@notification.id}}\\\"\\n      data-test-notification-item-checkbox={{@notification.id}}\\n      checked={{this.isNotificationSelected @notification.id}}\\n      {{on \\\"change\\\" (fn @toggleNotificationSelection @notification)}}\\n    />\\n  {{/unless}}\\n  <li\\n    class=\\\"relative d-flex flex-row p-0 border-0\\n      {{local-class (if @notification.isRead 'notification-read')}}\\\"\\n    data-test-notification-item={{@notification.id}}\\n  >\\n    <div class=\\\"flex flex-1 m-0 px-2 form-check\\\">\\n      <a\\n        class=\\\"flex fa-sm text-body lh-sm text-decoration-none\\n          {{local-class 'notification-heading'}}\\\"\\n        href={{this.notificationTargetUrl}}\\n        {{on \\\"click\\\" this.transitionToNotification}}\\n        data-test-notification-item-heading={{@notification.id}}\\n      >\\n        <Icon\\n          @icon={{this.notificationIcon}}\\n          class=\\\"fa-1x me-2 ms-1 {{unless @notification.isRead 'text-primary'}}\\\"\\n          data-test-notification-item-title-icon\\n        />\\n        <span\\n          class=\\\"relative text-dark {{local-class 'notification-title'}}\\\"\\n          data-test-notification-item-title-text\\n        >\\n          {{#if (eq @notification.notificationType \\\"report\\\")}}\\n            {{t\\n              \\\"notification.report-comment\\\"\\n              unitName=@notification.unitName\\n              applicationDescription=@notification.applicationTypeDescription\\n            }}\\n          {{else if\\n            (eq @notification.notificationType \\\"failed_sensor_comment\\\")\\n          }}\\n            {{t\\n              \\\"notification.failed-sensor-comment\\\"\\n              unitName=@notification.unitName\\n            }}\\n          {{else if (eq @notification.notificationType \\\"alert\\\")}}\\n            {{t\\n              \\\"notification.alert\\\"\\n              unitName=@notification.unitName\\n              title=@notification.title\\n            }}\\n          {{else}}\\n            {{t\\n              \\\"notification.pds-report-comment\\\"\\n              unitName=@notification.unitName\\n            }}\\n          {{/if}}\\n        </span>\\n      </a>\\n      <small\\n        class=\\\"d-block ms-2 my-2 lh-sm text-black-50\\n          {{local-class 'notification-description'}}\\\"\\n        data-test-notification-item-description\\n      >\\n        {{#if (eq @notification.notificationType \\\"alert\\\")}}\\n          {{@notification.title}}\\n        {{else}}\\n          {{@notification.description}}\\n        {{/if}}\\n      </small>\\n      <small\\n        class=\\\"ms-2 text-black-50 fa-2xs {{local-class 'notification-date'}}\\\"\\n        data-test-notification-item-date\\n      >\\n        {{format-date\\n          @notification.timeStamp\\n          day=\\\"numeric\\\"\\n          month=\\\"long\\\"\\n          year=\\\"numeric\\\"\\n          hour=\\\"numeric\\\"\\n          minute=\\\"numeric\\\"\\n          second=\\\"numeric\\\"\\n        }}\\n      </small>\\n    </div>\\n  </li>\\n</div>\", {\"contents\":\"<div\\n  class=\\\"d-flex flex-row align-items-start py-2 m-1 bg-white\\\"\\n  data-test-notification-item-list\\n>\\n  {{#unless @notification.isRead}}\\n    <label\\n      class=\\\"sr-only\\\"\\n      for=\\\"checkbox-notification-{{@notification.id}}\\\"\\n      data-test-notification-item-checkbox\\n    >\\n      {{t \\\"notification.mark-selected-as-read\\\"}}\\n    </label>\\n    <input\\n      type=\\\"checkbox\\\"\\n      class=\\\"ms-2 form-check-input {{local-class 'notification-checkbox'}}\\\"\\n      id=\\\"checkbox-notification-{{@notification.id}}\\\"\\n      data-test-notification-item-checkbox={{@notification.id}}\\n      checked={{this.isNotificationSelected @notification.id}}\\n      {{on \\\"change\\\" (fn @toggleNotificationSelection @notification)}}\\n    />\\n  {{/unless}}\\n  <li\\n    class=\\\"relative d-flex flex-row p-0 border-0\\n      {{local-class (if @notification.isRead 'notification-read')}}\\\"\\n    data-test-notification-item={{@notification.id}}\\n  >\\n    <div class=\\\"flex flex-1 m-0 px-2 form-check\\\">\\n      <a\\n        class=\\\"flex fa-sm text-body lh-sm text-decoration-none\\n          {{local-class 'notification-heading'}}\\\"\\n        href={{this.notificationTargetUrl}}\\n        {{on \\\"click\\\" this.transitionToNotification}}\\n        data-test-notification-item-heading={{@notification.id}}\\n      >\\n        <Icon\\n          @icon={{this.notificationIcon}}\\n          class=\\\"fa-1x me-2 ms-1 {{unless @notification.isRead 'text-primary'}}\\\"\\n          data-test-notification-item-title-icon\\n        />\\n        <span\\n          class=\\\"relative text-dark {{local-class 'notification-title'}}\\\"\\n          data-test-notification-item-title-text\\n        >\\n          {{#if (eq @notification.notificationType \\\"report\\\")}}\\n            {{t\\n              \\\"notification.report-comment\\\"\\n              unitName=@notification.unitName\\n              applicationDescription=@notification.applicationTypeDescription\\n            }}\\n          {{else if\\n            (eq @notification.notificationType \\\"failed_sensor_comment\\\")\\n          }}\\n            {{t\\n              \\\"notification.failed-sensor-comment\\\"\\n              unitName=@notification.unitName\\n            }}\\n          {{else if (eq @notification.notificationType \\\"alert\\\")}}\\n            {{t\\n              \\\"notification.alert\\\"\\n              unitName=@notification.unitName\\n              title=@notification.title\\n            }}\\n          {{else}}\\n            {{t\\n              \\\"notification.pds-report-comment\\\"\\n              unitName=@notification.unitName\\n            }}\\n          {{/if}}\\n        </span>\\n      </a>\\n      <small\\n        class=\\\"d-block ms-2 my-2 lh-sm text-black-50\\n          {{local-class 'notification-description'}}\\\"\\n        data-test-notification-item-description\\n      >\\n        {{#if (eq @notification.notificationType \\\"alert\\\")}}\\n          {{@notification.title}}\\n        {{else}}\\n          {{@notification.description}}\\n        {{/if}}\\n      </small>\\n      <small\\n        class=\\\"ms-2 text-black-50 fa-2xs {{local-class 'notification-date'}}\\\"\\n        data-test-notification-item-date\\n      >\\n        {{format-date\\n          @notification.timeStamp\\n          day=\\\"numeric\\\"\\n          month=\\\"long\\\"\\n          year=\\\"numeric\\\"\\n          hour=\\\"numeric\\\"\\n          minute=\\\"numeric\\\"\\n          second=\\\"numeric\\\"\\n        }}\\n      </small>\\n    </div>\\n  </li>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/notifications-manager/item.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/notifications-manager/item.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport config from 'client-app-omnivise-web/config/environment';\nimport { action } from '@ember/object';\n\nexport default class ModulesLauncher extends Component {\n  @service router;\n\n  get pdsBasicConfiguredComponentId() {\n    return config.pdsBasicConfiguredComponentId;\n  }\n\n  get notificationTarget() {\n    return {\n      route: 'auth.view',\n      model: 'pds',\n      queryParams: {\n        state: JSON.stringify({\n          [this.pdsBasicConfiguredComponentId]: `#${JSON.stringify({\n            n_id: this.args.notification.id,\n          })}`,\n        }),\n      },\n    };\n  }\n\n  get notificationTargetUrl() {\n    const { route, model, queryParams } = this.notificationTarget;\n    return this.router.urlFor(route, model, { queryParams });\n  }\n\n  get notificationIcon() {\n    const type = this.args.notification.notificationType;\n    if (type === 'alert') {\n      return 'information';\n    } else if (type === 'report') {\n      return 'report';\n    } else {\n      return 'comment';\n    }\n  }\n\n  @action\n  transitionToNotification(event) {\n    event.preventDefault();\n\n    const { route, model, queryParams } = this.notificationTarget;\n    this.args.toggleLauncher && this.args.toggleLauncher();\n    this.router.transitionTo(route, model, { queryParams });\n    this.args.selectedList.splice(0, this.args.selectedList.length);\n    this.args.clickedNotification.push(this.args.notification);\n    this.args.markAsRead();\n    this.args.refreshNotifications();\n    this.args.clickedNotification.splice(\n      0,\n      this.args.clickedNotification.length,\n    );\n  }\n\n  @action\n  isNotificationSelected(notificationId) {\n    return this.args.selectedList.find((n) => n.id === notificationId);\n  }\n}\n","export default {\n  \"root\": \"_root_8pzt4v\",\n  \"notifications-list\": \"_notifications-list_8pzt4v\",\n  \"notifications-launcher-list-style\": \"_notifications-launcher-list-style_8pzt4v\",\n  \"notif-button\": \"_notif-button_8pzt4v\",\n  \"notifications-container-empty\": \"_notifications-container-empty_8pzt4v\",\n  \"notifications-nav-tabs\": \"_notifications-nav-tabs_8pzt4v\",\n  \"active\": \"_active_8pzt4v\",\n  \"scroll-observer\": \"_scroll-observer_8pzt4v\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-at-ember-render-modifiers }}\\n<div ...attributes data-test-notifications-list>\\n  {{#if @isNotificationsLoading}}\\n    <div\\n      class=\\\"pt-2 {{local-class 'notifications-container-empty'}}\\\"\\n      data-test-notifications-launcher-spinner\\n    >\\n      <div class=\\\"d-flex flex-column align-items-center\\\">\\n        <Spinner @size=\\\"sm\\\" />\\n        <p class=\\\"m-2 text-center\\\">\\n          {{t \\\"notification.loading-notifications\\\"}}\\n        </p>\\n      </div>\\n    </div>\\n  {{else}}\\n    <div>\\n      <ul class=\\\"nav nav-tabs {{local-class 'notifications-nav-tabs'}}\\\">\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'unread') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"unread\\\")}}\\n            data-test-application-notifications-unread-tab\\n          >\\n            {{#if (eq this.activeTab \\\"unread\\\")}}\\n              <img\\n                src=\\\"/assets/icons/unread_selected.svg\\\"\\n                alt={{t \\\"notification.unread.image-unread-alt\\\"}}\\n              />\\n            {{else}}\\n              <img\\n                src=\\\"/assets/icons/unread.svg\\\"\\n                alt={{t \\\"notification.unread.image-unread-alt\\\"}}\\n              />\\n            {{/if}}\\n            {{t \\\"notification.unread.unread-txt\\\"}}\\n          </button>\\n        </li>\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'read') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"read\\\")}}\\n            data-test-application-notifications-read-tab\\n          >\\n            {{#if (eq this.activeTab \\\"read\\\")}}\\n              <img\\n                src=\\\"/assets/icons/read_selected.svg\\\"\\n                alt={{t \\\"notification.read.image-read-alt\\\"}}\\n              />\\n            {{else}}\\n              <img\\n                src=\\\"/assets/icons/read.svg\\\"\\n                alt={{t \\\"notification.read.image-read-alt\\\"}}\\n              />\\n            {{/if}}\\n            {{t \\\"notification.read.read-txt\\\"}}\\n          </button>\\n        </li>\\n      </ul>\\n      {{#if (eq this.activeTab \\\"unread\\\")}}\\n        <div\\n          class=\\\"d-flex w-100 justify-content-between flex-row align-items-center bg-body\\\"\\n        >\\n          {{#if @unreadNotificationsCount.length}}\\n            <div class=\\\"py-2 ms-1\\\">\\n              <input\\n                type=\\\"checkbox\\\"\\n                class=\\\"ms-2 form-check-input\\\"\\n                id=\\\"select-all\\\"\\n                data-test-notification-list-select-all-checkbox\\n                checked={{this.selectAllClicked}}\\n                indeterminate={{this.indeterminateCheckbox}}\\n                onchange={{this.toggleAllNotifications}}\\n              />\\n              <label\\n                for=\\\"select-all\\\"\\n                class=\\\"text-dark fa-sm px-2\\\"\\n                data-test-notification-list-select-all-text\\n              >\\n                <strong>\\n                  {{#if this.selectAllClicked}}\\n                    {{t \\\"notification.unselect-notifications\\\"}}\\n                  {{else if\\n                    (or this.selectAllClicked this.someNotificationsSelected)\\n                  }}\\n                    {{t \\\"notification.select-more\\\"}}\\n                  {{else}}\\n                    {{t \\\"notification.select-all-notifications\\\"}}\\n                  {{/if}}\\n                  {{#if\\n                    (or this.selectAllClicked this.someNotificationsSelected)\\n                  }}\\n                    ({{this.selectedNotificationsCount.length}})\\n                  {{/if}}\\n                </strong>\\n              </label>\\n            </div>\\n            {{#if this.someNotificationsSelected}}\\n              <Button\\n                type=\\\"button\\\"\\n                class=\\\"text-center py-0 px-2 me-2 shadow d-flex align-items-center bg-white border-0 text-body\\\"\\n                {{on \\\"click\\\" this.markAsRead}}\\n                data-test-application-notifications-mark-as-read\\n              >\\n                <img\\n                  class=\\\"mx-1\\\"\\n                  src=\\\"/assets/icons/read.svg\\\"\\n                  alt={{t \\\"notification.unread.image-unread-alt\\\"}}\\n                />\\n                <p class=\\\"fa-sm my-2 py-1 me-1 d-flex align-items-center\\\">\\n                  {{#if this.selectAllClicked}}\\n                    {{t \\\"notification.mark-all-as-read\\\"}}\\n                  {{else}}\\n                    {{t \\\"notification.mark-selected-as-read\\\"}}\\n                  {{/if}}\\n                </p>\\n              </Button>\\n            {{/if}}\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n      <div class=\\\"{{local-class 'notifications-list'}}\\\">\\n        {{#if (eq this.activeTab \\\"unread\\\")}}\\n          {{#if @unreadNotifications.length}}\\n            <div\\n              class=\\\"{{local-class 'notifications-launcher-list-style'}}\\\"\\n              data-test-notifications-launcher\\n            >\\n              <ul\\n                class=\\\"p-0 m-0 list-unstyled bg-body\\\"\\n                data-test-notifications-launcher-list\\n              >\\n                {{#each @unreadNotifications as |notification|}}\\n                  <NotificationsManager::Item\\n                    @notification={{notification}}\\n                    @onNotificationSelected={{@onNotificationSelected}}\\n                    @selectedList={{this.selectedList}}\\n                    @toggleNotificationSelection={{this.toggleNotificationSelection}}\\n                    @patchNotificationRecords={{this.patchNotificationRecords}}\\n                    @toggleLauncher={{@toggleLauncher}}\\n                    @refreshNotifications={{@refreshNotifications}}\\n                    @clickedNotification={{this.clickedNotification}}\\n                    @markAsRead={{this.markAsRead}}\\n                  />\\n                {{/each}}\\n                <div\\n                  class=\\\"{{local-class 'scroll-observer'}}\\\"\\n                  {{did-insert this.setupViewport}}\\n                  {{will-destroy this.cleanupViewport}}\\n                />\\n                {{#if @isFetchingMoreUnreadNotifications}}\\n                  <div class=\\\"text-center mt-2\\\">\\n                    <Spinner @size=\\\"sm\\\" />\\n                  </div>\\n                {{/if}}\\n              </ul>\\n            </div>\\n          {{else if\\n            (and (eq @query.length 0) (eq @unreadNotificationsCount.length 0))\\n          }}\\n            <div\\n              class=\\\"pt-2 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-no-notifications-container\\n            >\\n              <div class=\\\"d-flex flex-column\\\">\\n                <img\\n                  src=\\\"/assets/icons/icon-party-popper.svg\\\"\\n                  alt={{t \\\"notification.no-notification-image-alt\\\"}}\\n                  data-test-no-notifications-image\\n                />\\n                <p class=\\\"m-2 text-center\\\" data-test-no-notifications-message>\\n                  {{t \\\"notification.no-notification-message\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if (and @refreshNotifications (not @query))}}\\n            <div\\n              class=\\\"pt-2 w-100 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-notifications-launcher-spinner\\n            >\\n              <div class=\\\"d-flex flex-column align-items-center\\\">\\n                <Spinner @size=\\\"sm\\\" />\\n                <p class=\\\"m-2 text-center\\\">\\n                  {{t \\\"notification.loading-notifications\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if @query}}\\n            <li\\n              class=\\\"text-center p-4 flex-grow-1 list-unstyled\\\"\\n              data-test-unread-notifications-empty-search-result-message\\n            >\\n              {{t \\\"notification.empty-search-results-message\\\"}}\\n              <span class=\\\"fw-bold px-1\\\">\\n                {{@query}}\\n              </span>\\n            </li>\\n          {{/if}}\\n        {{else}}\\n          {{#if @readNotifications.length}}\\n            <div\\n              class=\\\"{{local-class 'notifications-list'}}\\\"\\n              data-test-notifications-launcher\\n            >\\n              <div class=\\\"{{local-class 'notifications-launcher-list-style'}}\\\">\\n                <ul\\n                  class=\\\"w-100 p-0 m-0 list-unstyled\\\"\\n                  data-test-notifications-launcher-list-read\\n                >\\n                  {{#each @readNotifications as |notification|}}\\n                    <NotificationsManager::Item\\n                      @notification={{notification}}\\n                      @onNotificationSelected={{@onNotificationSelected}}\\n                      @toggleNotificationSelection={{this.toggleNotificationSelection}}\\n                      @patchNotificationRecords={{this.patchNotificationRecords}}\\n                      @toggleLauncher={{@toggleLauncher}}\\n                      @refreshNotifications={{@refreshNotifications}}\\n                    />\\n                  {{/each}}\\n                  <div\\n                    class=\\\"{{local-class 'scroll-observer'}}\\\"\\n                    {{did-insert this.setupViewport}}\\n                    {{will-destroy this.cleanupViewport}}\\n                  />\\n                  {{#if @isFetchingMoreReadNotifications}}\\n                    <div class=\\\"text-center mt-2\\\">\\n                      <Spinner @size=\\\"sm\\\" />\\n                    </div>\\n                  {{/if}}\\n                </ul>\\n              </div>\\n            </div>\\n          {{else if\\n            (and (eq @query.length 0) (eq @readNotificationsCount.length 0))\\n          }}\\n            <div\\n              class=\\\"pt-2 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-no-notifications-container\\n            >\\n              <div class=\\\"d-flex flex-column\\\">\\n                <img\\n                  src=\\\"/assets/icons/icon-party-popper.svg\\\"\\n                  alt={{t \\\"notification.no-notification-image-alt\\\"}}\\n                  data-test-no-notifications-image\\n                />\\n                <p class=\\\"m-2 text-center\\\" data-test-no-notifications-message>\\n                  {{t \\\"notification.no-notification-message\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if (and @refreshNotifications (not @query))}}\\n            <div\\n              class=\\\"pt-2 w-100 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-notifications-launcher-spinner\\n            >\\n              <div class=\\\"d-flex flex-column align-items-center\\\">\\n                <Spinner @size=\\\"sm\\\" />\\n                <p class=\\\"m-2 text-center\\\">\\n                  {{t \\\"notification.loading-notifications\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if @query}}\\n            <li\\n              class=\\\"text-center p-4 flex-grow-1 list-unstyled\\\"\\n              data-test-read-notifications-empty-search-result-message\\n            >\\n              {{t \\\"notification.empty-search-results-message\\\"}}\\n              <span class=\\\"fw-bold px-1\\\">\\n                {{@query}}\\n              </span>\\n            </li>\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n    </div>\\n    <label\\n      class=\\\"d-flex w-100 justify-content-center text-dark p-3 bg-body fa-sm\\\"\\n    >\\n      {{t \\\"notification.showing\\\"}}\\n      {{#if (eq this.activeTab \\\"unread\\\")}}\\n        {{@unreadNotifications.length}}\\n        {{t \\\"notification.of\\\"}}\\n        {{@unreadNotificationsCount.length}}\\n        {{#if @query.length}}\\n          (<strong>\\n            {{t \\\"notification.search-results\\\"}}\\n          </strong>)\\n        {{else}}\\n          ({{t \\\"notification.unread.unread-txt\\\"}})\\n        {{/if}}\\n      {{else if (eq this.activeTab \\\"read\\\")}}\\n        {{@readNotifications.length}}\\n        {{t \\\"notification.of\\\"}}\\n        {{@readNotificationsCount.length}}\\n        {{#if @query.length}}\\n          (<strong>\\n            {{t \\\"notification.search-results\\\"}}\\n          </strong>)\\n        {{else}}\\n          ({{t \\\"notification.read.read-txt\\\"}})\\n        {{/if}}\\n      {{/if}}\\n    </label>\\n  {{/if}}\\n</div>\", {\"contents\":\"{{! template-lint-disable no-at-ember-render-modifiers }}\\n<div ...attributes data-test-notifications-list>\\n  {{#if @isNotificationsLoading}}\\n    <div\\n      class=\\\"pt-2 {{local-class 'notifications-container-empty'}}\\\"\\n      data-test-notifications-launcher-spinner\\n    >\\n      <div class=\\\"d-flex flex-column align-items-center\\\">\\n        <Spinner @size=\\\"sm\\\" />\\n        <p class=\\\"m-2 text-center\\\">\\n          {{t \\\"notification.loading-notifications\\\"}}\\n        </p>\\n      </div>\\n    </div>\\n  {{else}}\\n    <div>\\n      <ul class=\\\"nav nav-tabs {{local-class 'notifications-nav-tabs'}}\\\">\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'unread') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"unread\\\")}}\\n            data-test-application-notifications-unread-tab\\n          >\\n            {{#if (eq this.activeTab \\\"unread\\\")}}\\n              <img\\n                src=\\\"/assets/icons/unread_selected.svg\\\"\\n                alt={{t \\\"notification.unread.image-unread-alt\\\"}}\\n              />\\n            {{else}}\\n              <img\\n                src=\\\"/assets/icons/unread.svg\\\"\\n                alt={{t \\\"notification.unread.image-unread-alt\\\"}}\\n              />\\n            {{/if}}\\n            {{t \\\"notification.unread.unread-txt\\\"}}\\n          </button>\\n        </li>\\n        <li class=\\\"nav-item p-0 w-50\\\">\\n          <button\\n            type=\\\"button\\\"\\n            class=\\\"nav-link text-center p-0 w-100\\n              {{if (eq this.activeTab 'read') 'active'}}\\\"\\n            {{on \\\"click\\\" (fn (mut this.activeTab) \\\"read\\\")}}\\n            data-test-application-notifications-read-tab\\n          >\\n            {{#if (eq this.activeTab \\\"read\\\")}}\\n              <img\\n                src=\\\"/assets/icons/read_selected.svg\\\"\\n                alt={{t \\\"notification.read.image-read-alt\\\"}}\\n              />\\n            {{else}}\\n              <img\\n                src=\\\"/assets/icons/read.svg\\\"\\n                alt={{t \\\"notification.read.image-read-alt\\\"}}\\n              />\\n            {{/if}}\\n            {{t \\\"notification.read.read-txt\\\"}}\\n          </button>\\n        </li>\\n      </ul>\\n      {{#if (eq this.activeTab \\\"unread\\\")}}\\n        <div\\n          class=\\\"d-flex w-100 justify-content-between flex-row align-items-center bg-body\\\"\\n        >\\n          {{#if @unreadNotificationsCount.length}}\\n            <div class=\\\"py-2 ms-1\\\">\\n              <input\\n                type=\\\"checkbox\\\"\\n                class=\\\"ms-2 form-check-input\\\"\\n                id=\\\"select-all\\\"\\n                data-test-notification-list-select-all-checkbox\\n                checked={{this.selectAllClicked}}\\n                indeterminate={{this.indeterminateCheckbox}}\\n                onchange={{this.toggleAllNotifications}}\\n              />\\n              <label\\n                for=\\\"select-all\\\"\\n                class=\\\"text-dark fa-sm px-2\\\"\\n                data-test-notification-list-select-all-text\\n              >\\n                <strong>\\n                  {{#if this.selectAllClicked}}\\n                    {{t \\\"notification.unselect-notifications\\\"}}\\n                  {{else if\\n                    (or this.selectAllClicked this.someNotificationsSelected)\\n                  }}\\n                    {{t \\\"notification.select-more\\\"}}\\n                  {{else}}\\n                    {{t \\\"notification.select-all-notifications\\\"}}\\n                  {{/if}}\\n                  {{#if\\n                    (or this.selectAllClicked this.someNotificationsSelected)\\n                  }}\\n                    ({{this.selectedNotificationsCount.length}})\\n                  {{/if}}\\n                </strong>\\n              </label>\\n            </div>\\n            {{#if this.someNotificationsSelected}}\\n              <Button\\n                type=\\\"button\\\"\\n                class=\\\"text-center py-0 px-2 me-2 shadow d-flex align-items-center bg-white border-0 text-body\\\"\\n                {{on \\\"click\\\" this.markAsRead}}\\n                data-test-application-notifications-mark-as-read\\n              >\\n                <img\\n                  class=\\\"mx-1\\\"\\n                  src=\\\"/assets/icons/read.svg\\\"\\n                  alt={{t \\\"notification.unread.image-unread-alt\\\"}}\\n                />\\n                <p class=\\\"fa-sm my-2 py-1 me-1 d-flex align-items-center\\\">\\n                  {{#if this.selectAllClicked}}\\n                    {{t \\\"notification.mark-all-as-read\\\"}}\\n                  {{else}}\\n                    {{t \\\"notification.mark-selected-as-read\\\"}}\\n                  {{/if}}\\n                </p>\\n              </Button>\\n            {{/if}}\\n          {{/if}}\\n        </div>\\n      {{/if}}\\n      <div class=\\\"{{local-class 'notifications-list'}}\\\">\\n        {{#if (eq this.activeTab \\\"unread\\\")}}\\n          {{#if @unreadNotifications.length}}\\n            <div\\n              class=\\\"{{local-class 'notifications-launcher-list-style'}}\\\"\\n              data-test-notifications-launcher\\n            >\\n              <ul\\n                class=\\\"p-0 m-0 list-unstyled bg-body\\\"\\n                data-test-notifications-launcher-list\\n              >\\n                {{#each @unreadNotifications as |notification|}}\\n                  <NotificationsManager::Item\\n                    @notification={{notification}}\\n                    @onNotificationSelected={{@onNotificationSelected}}\\n                    @selectedList={{this.selectedList}}\\n                    @toggleNotificationSelection={{this.toggleNotificationSelection}}\\n                    @patchNotificationRecords={{this.patchNotificationRecords}}\\n                    @toggleLauncher={{@toggleLauncher}}\\n                    @refreshNotifications={{@refreshNotifications}}\\n                    @clickedNotification={{this.clickedNotification}}\\n                    @markAsRead={{this.markAsRead}}\\n                  />\\n                {{/each}}\\n                <div\\n                  class=\\\"{{local-class 'scroll-observer'}}\\\"\\n                  {{did-insert this.setupViewport}}\\n                  {{will-destroy this.cleanupViewport}}\\n                />\\n                {{#if @isFetchingMoreUnreadNotifications}}\\n                  <div class=\\\"text-center mt-2\\\">\\n                    <Spinner @size=\\\"sm\\\" />\\n                  </div>\\n                {{/if}}\\n              </ul>\\n            </div>\\n          {{else if\\n            (and (eq @query.length 0) (eq @unreadNotificationsCount.length 0))\\n          }}\\n            <div\\n              class=\\\"pt-2 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-no-notifications-container\\n            >\\n              <div class=\\\"d-flex flex-column\\\">\\n                <img\\n                  src=\\\"/assets/icons/icon-party-popper.svg\\\"\\n                  alt={{t \\\"notification.no-notification-image-alt\\\"}}\\n                  data-test-no-notifications-image\\n                />\\n                <p class=\\\"m-2 text-center\\\" data-test-no-notifications-message>\\n                  {{t \\\"notification.no-notification-message\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if (and @refreshNotifications (not @query))}}\\n            <div\\n              class=\\\"pt-2 w-100 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-notifications-launcher-spinner\\n            >\\n              <div class=\\\"d-flex flex-column align-items-center\\\">\\n                <Spinner @size=\\\"sm\\\" />\\n                <p class=\\\"m-2 text-center\\\">\\n                  {{t \\\"notification.loading-notifications\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if @query}}\\n            <li\\n              class=\\\"text-center p-4 flex-grow-1 list-unstyled\\\"\\n              data-test-unread-notifications-empty-search-result-message\\n            >\\n              {{t \\\"notification.empty-search-results-message\\\"}}\\n              <span class=\\\"fw-bold px-1\\\">\\n                {{@query}}\\n              </span>\\n            </li>\\n          {{/if}}\\n        {{else}}\\n          {{#if @readNotifications.length}}\\n            <div\\n              class=\\\"{{local-class 'notifications-list'}}\\\"\\n              data-test-notifications-launcher\\n            >\\n              <div class=\\\"{{local-class 'notifications-launcher-list-style'}}\\\">\\n                <ul\\n                  class=\\\"w-100 p-0 m-0 list-unstyled\\\"\\n                  data-test-notifications-launcher-list-read\\n                >\\n                  {{#each @readNotifications as |notification|}}\\n                    <NotificationsManager::Item\\n                      @notification={{notification}}\\n                      @onNotificationSelected={{@onNotificationSelected}}\\n                      @toggleNotificationSelection={{this.toggleNotificationSelection}}\\n                      @patchNotificationRecords={{this.patchNotificationRecords}}\\n                      @toggleLauncher={{@toggleLauncher}}\\n                      @refreshNotifications={{@refreshNotifications}}\\n                    />\\n                  {{/each}}\\n                  <div\\n                    class=\\\"{{local-class 'scroll-observer'}}\\\"\\n                    {{did-insert this.setupViewport}}\\n                    {{will-destroy this.cleanupViewport}}\\n                  />\\n                  {{#if @isFetchingMoreReadNotifications}}\\n                    <div class=\\\"text-center mt-2\\\">\\n                      <Spinner @size=\\\"sm\\\" />\\n                    </div>\\n                  {{/if}}\\n                </ul>\\n              </div>\\n            </div>\\n          {{else if\\n            (and (eq @query.length 0) (eq @readNotificationsCount.length 0))\\n          }}\\n            <div\\n              class=\\\"pt-2 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-no-notifications-container\\n            >\\n              <div class=\\\"d-flex flex-column\\\">\\n                <img\\n                  src=\\\"/assets/icons/icon-party-popper.svg\\\"\\n                  alt={{t \\\"notification.no-notification-image-alt\\\"}}\\n                  data-test-no-notifications-image\\n                />\\n                <p class=\\\"m-2 text-center\\\" data-test-no-notifications-message>\\n                  {{t \\\"notification.no-notification-message\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if (and @refreshNotifications (not @query))}}\\n            <div\\n              class=\\\"pt-2 w-100 {{local-class 'notifications-container-empty'}}\\\"\\n              data-test-notifications-launcher-spinner\\n            >\\n              <div class=\\\"d-flex flex-column align-items-center\\\">\\n                <Spinner @size=\\\"sm\\\" />\\n                <p class=\\\"m-2 text-center\\\">\\n                  {{t \\\"notification.loading-notifications\\\"}}\\n                </p>\\n              </div>\\n            </div>\\n          {{else if @query}}\\n            <li\\n              class=\\\"text-center p-4 flex-grow-1 list-unstyled\\\"\\n              data-test-read-notifications-empty-search-result-message\\n            >\\n              {{t \\\"notification.empty-search-results-message\\\"}}\\n              <span class=\\\"fw-bold px-1\\\">\\n                {{@query}}\\n              </span>\\n            </li>\\n          {{/if}}\\n        {{/if}}\\n      </div>\\n    </div>\\n    <label\\n      class=\\\"d-flex w-100 justify-content-center text-dark p-3 bg-body fa-sm\\\"\\n    >\\n      {{t \\\"notification.showing\\\"}}\\n      {{#if (eq this.activeTab \\\"unread\\\")}}\\n        {{@unreadNotifications.length}}\\n        {{t \\\"notification.of\\\"}}\\n        {{@unreadNotificationsCount.length}}\\n        {{#if @query.length}}\\n          (<strong>\\n            {{t \\\"notification.search-results\\\"}}\\n          </strong>)\\n        {{else}}\\n          ({{t \\\"notification.unread.unread-txt\\\"}})\\n        {{/if}}\\n      {{else if (eq this.activeTab \\\"read\\\")}}\\n        {{@readNotifications.length}}\\n        {{t \\\"notification.of\\\"}}\\n        {{@readNotificationsCount.length}}\\n        {{#if @query.length}}\\n          (<strong>\\n            {{t \\\"notification.search-results\\\"}}\\n          </strong>)\\n        {{else}}\\n          ({{t \\\"notification.read.read-txt\\\"}})\\n        {{/if}}\\n      {{/if}}\\n    </label>\\n  {{/if}}\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/notifications-manager/list.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/notifications-manager/list.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\nimport fetch from 'fetch';\nimport getApiUrl from 'client-app-omnivise-web/utils/get-api-url';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport { TrackedArray } from 'tracked-built-ins';\n\nconst NOTIFICATIONS_READ_STATUS_URL = 'notification-alerts/read-status';\n\nexport default class NotificationsManagerList extends Component {\n  @service inViewport;\n  @tracked activeTab = 'unread';\n  selectedList = new TrackedArray([]);\n  clickedNotification = new TrackedArray([]);\n  @tracked selectAllClicked = false;\n  @tracked selectedNotificationsCount = [];\n  @tracked idsToUpdate = [];\n  @service store;\n  @service session;\n\n  get someNotificationsSelected() {\n    return this.selectedList.length > 0;\n  }\n\n  get indeterminateCheckbox() {\n    return (\n      this.selectedList.length > 0 &&\n      this.selectedList.length !== this.args.unreadNotifications.length\n    );\n  }\n\n  // Conditionals for some selected notification(s) to push or remove on the tracked array\n  @action\n  toggleNotificationSelection(notification) {\n    if (this.selectedList.includes(notification)) {\n      this.selectedList.splice(this.selectedList.indexOf(notification), 1);\n      this.selectedNotificationsCount = [...this.selectedList];\n    } else {\n      this.selectedList.push(notification);\n      this.selectedNotificationsCount = [...this.selectedList];\n    }\n  }\n\n  @action\n  toggleAllNotifications(event) {\n    this.selectedList.splice(0, this.selectedList.length);\n    if (event.target.checked) {\n      this.selectedList.push(...this.args.unreadNotifications);\n      this.selectAllClicked = true;\n      this.selectedNotificationsCount = [...this.selectedList];\n    } else {\n      event.target.indeterminate = false;\n      this.selectAllClicked = false;\n      this.selectedNotificationsCount = [...this.selectedList];\n    }\n  }\n\n  // Mark as read the checked notification(s) from the array\n  // Endpoint to POST read status of notifications\n  @action\n  async markAsRead() {\n    const idsToUpdate = this.selectedList.map((x) => {\n      return x.id;\n    });\n    const idToUpdate = this.clickedNotification.map((x) => {\n      return x.id;\n    });\n\n    if (this.selectedList.length > 0) {\n      this.idsToUpdate = idsToUpdate;\n    } else if (this.clickedNotification.length > 0) {\n      this.idsToUpdate = idToUpdate;\n    }\n    const url = new URL(getApiUrl(NOTIFICATIONS_READ_STATUS_URL, 'api/v3'));\n    const options = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${this.session.ownAccessToken}`,\n      },\n      body: JSON.stringify({\n        ids: this.idsToUpdate,\n      }),\n    };\n    const response = await fetch(url, options);\n\n    if (response.ok) {\n      this.selectedList.splice(0, this.selectedList.length);\n      this.clickedNotification.splice(0, this.clickedNotification.length);\n      this.selectAllClicked = false;\n      this.args.refreshNotifications();\n      return await response.json();\n    } else {\n      const errorText = await response.text();\n      logErrorUtil.logError(errorText);\n    }\n  }\n\n  @action\n  setupViewport(element) {\n    const loader = element;\n    const viewportTolerance = { bottom: 200 };\n    const { onEnter } = this.inViewport.watchElement(loader, {\n      viewportTolerance,\n    });\n    this.args.refreshReadNotifications();\n    onEnter(this.handleEnterViewport.bind(this));\n  }\n\n  @action\n  cleanupViewport(element) {\n    this.inViewport.stopWatching(element);\n  }\n\n  @action\n  handleEnterViewport() {\n    if (this.args.loadNextPageUnread && this.activeTab === 'unread') {\n      this.args.loadNextPageUnread();\n      this.selectAllClicked = false;\n    } else if (this.args.loadNextPageRead && this.activeTab === 'read') {\n      this.args.loadNextPageRead();\n      this.selectAllClicked = false;\n    }\n  }\n}\n","export default {\n  \"toggler-badge\": \"_toggler-badge_1696mf\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-bare-strings  }}\\n<Button\\n  ...attributes\\n  @type=\\\"tertiary\\\"\\n  class=\\\"text-secondary\\\"\\n  title={{t \\\"header.notifications\\\"}}\\n  @onClick={{@onClick}}\\n  data-test-application=\\\"toggle-notifications\\\"\\n>\\n  <div class=\\\"position-relative me-0\\\">\\n    <Icon\\n      @icon=\\\"notification-bell\\\"\\n      @size=\\\"lg\\\"\\n      data-test-application=\\\"notification-bell\\\"\\n    />\\n\\n    {{#if @shouldShowError}}\\n      <div data-test-application=\\\"notification-error-badge\\\">\\n        <span\\n          class=\\\"position-absolute translate-middle badge rounded-pill bg-danger text-white\\n            {{local-class 'toggler-badge'}}\\\"\\n        >\\n          <Icon\\n            @icon=\\\"exclamation\\\"\\n            @size=\\\"lg\\\"\\n            data-test-icon=\\\"exclamation-icon\\\"\\n          />\\n        </span>\\n      </div>\\n    {{else if (gt @unreadNotificationsCount 0)}}\\n      <div data-test-application=\\\"notification-count\\\">\\n        <span\\n          class=\\\"position-absolute translate-middle badge rounded-pill bg-danger text-white\\n            {{local-class 'toggler-badge'}}\\\"\\n        >\\n          {{#if (gt @unreadNotificationsCount 99)}}\\n            99+\\n          {{else}}\\n            {{@unreadNotificationsCount}}\\n          {{/if}}\\n        </span>\\n      </div>\\n    {{/if}}\\n  </div>\\n</Button>\", {\"contents\":\"{{! template-lint-disable no-bare-strings  }}\\n<Button\\n  ...attributes\\n  @type=\\\"tertiary\\\"\\n  class=\\\"text-secondary\\\"\\n  title={{t \\\"header.notifications\\\"}}\\n  @onClick={{@onClick}}\\n  data-test-application=\\\"toggle-notifications\\\"\\n>\\n  <div class=\\\"position-relative me-0\\\">\\n    <Icon\\n      @icon=\\\"notification-bell\\\"\\n      @size=\\\"lg\\\"\\n      data-test-application=\\\"notification-bell\\\"\\n    />\\n\\n    {{#if @shouldShowError}}\\n      <div data-test-application=\\\"notification-error-badge\\\">\\n        <span\\n          class=\\\"position-absolute translate-middle badge rounded-pill bg-danger text-white\\n            {{local-class 'toggler-badge'}}\\\"\\n        >\\n          <Icon\\n            @icon=\\\"exclamation\\\"\\n            @size=\\\"lg\\\"\\n            data-test-icon=\\\"exclamation-icon\\\"\\n          />\\n        </span>\\n      </div>\\n    {{else if (gt @unreadNotificationsCount 0)}}\\n      <div data-test-application=\\\"notification-count\\\">\\n        <span\\n          class=\\\"position-absolute translate-middle badge rounded-pill bg-danger text-white\\n            {{local-class 'toggler-badge'}}\\\"\\n        >\\n          {{#if (gt @unreadNotificationsCount 99)}}\\n            99+\\n          {{else}}\\n            {{@unreadNotificationsCount}}\\n          {{/if}}\\n        </span>\\n      </div>\\n    {{/if}}\\n  </div>\\n</Button>\",\"moduleName\":\"client-app-omnivise-web/components/notifications-manager/toggler.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/notifications-manager/toggler.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"row gx-0 flex-grow-1\\\">\\n  {{#if this.loadComponents.isRunning}}\\n    <Spinner @size=\\\"md\\\" />\\n  {{else}}\\n    {{#if this.notificationVc}}\\n      <ToElsewhere\\n        @named=\\\"oes-notifications\\\"\\n        @send={{component\\n          \\\"visualization-component-renderer\\\"\\n          configuredComponent=this.notificationVc\\n        }}\\n      />\\n    {{/if}}\\n    <div class=\\\"col-2 d-flex flex-grow-1\\\">\\n      {{#if this.navVc}}\\n        <VisualizationComponentRenderer\\n          @configuredComponent={{this.navVc}}\\n          @navVc={{true}}\\n        />\\n      {{/if}}\\n    </div>\\n    <div class=\\\"col-10 d-flex flex-grow-1\\\">\\n      {{#if this.activeVc}}\\n        <VisualizationComponentRenderer\\n          @configuredComponent={{this.activeVc}}\\n          @readOnly={{@model.internalView.module.readOnly}}\\n        />\\n      {{/if}}\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"<div class=\\\"row gx-0 flex-grow-1\\\">\\n  {{#if this.loadComponents.isRunning}}\\n    <Spinner @size=\\\"md\\\" />\\n  {{else}}\\n    {{#if this.notificationVc}}\\n      <ToElsewhere\\n        @named=\\\"oes-notifications\\\"\\n        @send={{component\\n          \\\"visualization-component-renderer\\\"\\n          configuredComponent=this.notificationVc\\n        }}\\n      />\\n    {{/if}}\\n    <div class=\\\"col-2 d-flex flex-grow-1\\\">\\n      {{#if this.navVc}}\\n        <VisualizationComponentRenderer\\n          @configuredComponent={{this.navVc}}\\n          @navVc={{true}}\\n        />\\n      {{/if}}\\n    </div>\\n    <div class=\\\"col-10 d-flex flex-grow-1\\\">\\n      {{#if this.activeVc}}\\n        <VisualizationComponentRenderer\\n          @configuredComponent={{this.activeVc}}\\n          @readOnly={{@model.internalView.module.readOnly}}\\n        />\\n      {{/if}}\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/oes-view.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/oes-view.hbs\"}});\nimport Component from '@glimmer/component';\nimport { type Registry as Services, service } from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\nimport { task } from 'ember-concurrency-decorators';\nimport config from 'client-app-omnivise-web/config/environment';\n\nexport interface OesViewSignature {\n  // The arguments accepted by the component\n  Args: {\n    model: any;\n    avc: string;\n  };\n  // Any blocks yielded by the component\n  Blocks: {\n    default: [];\n  };\n  // The element to which `...attributes` is applied in the component template\n  Element: null;\n}\n\nconst NAV_VC_ID = '--oes--oes_oes-nav';\nconst NOTIFICATION_VC_ID = '--oes--oes_oes-notifications';\nconst OES = '--oes--oes_oes';\n\nexport default class OesView extends Component<OesViewSignature> {\n  @service declare urlState: Services['url-state'];\n  @service declare store: Services['store'];\n\n  components = [];\n  @tracked navVc = null;\n  @tracked notificationVc = null;\n  @tracked _activeVc = null;\n\n  constructor(owner: unknown, args: OesViewSignature['Args']) {\n    super(owner, args);\n    this.loadComponents.perform();\n    const instanceConfiguration = config.instanceConfiguration;\n    instanceConfiguration.stackedView = true;\n  }\n\n  @task\n  *loadComponents() {\n    const internalView = yield this.store.findRecord(\n      'internal-view',\n      this.args.model.internalView.id,\n      {\n        include: [\n          'module',\n          'configuredWidgets.configuredComponents.componentDescriptor',\n        ].join(','),\n      },\n    );\n\n    const widgets = yield internalView.configuredWidgets;\n\n    for (const widget of widgets) {\n      const ccs = yield widget.configuredComponents;\n\n      this.navVc = ccs.find((cc) => cc.id === NAV_VC_ID);\n      this.notificationVc = ccs.find((cc) => cc.id === NOTIFICATION_VC_ID);\n      // this._activeVc = ccs.find((cc) => cc.id === this.args.avc);\n\n      const ccsOnRightSide = ccs.filter(\n        (cc) => cc.id !== NAV_VC_ID && cc.id !== NOTIFICATION_VC_ID,\n      );\n      this.components.push(...ccsOnRightSide);\n    }\n  }\n\n  get normalizedAvc() {\n    return `--oes--oes_${this.args.avc}`;\n  }\n\n  get activeVc() {\n    // if (this._activeVc?.id === this.args.avc) {\n    //   return this._activeVc;\n    // }\n    // this._activeVc = this.components.find((cc) => cc.id === this.args.avc);\n    // return this._activeVc;\n    return (\n      this.components.find((cc) => cc.id == this.normalizedAvc) ??\n      this.components.find((cc) => cc.id == OES)\n    );\n  }\n}\n","export default {\n  \"required\": \"_required_ribypp\",\n  \"form-element\": \"_form-element_ribypp\",\n  \"form-wrapper\": \"_form-wrapper_ribypp\",\n  \"home-add-ticket\": \"_home-add-ticket_ribypp\",\n  \"spinner-wrapper\": \"_spinner-wrapper_ribypp\",\n  \"action-buttons\": \"_action-buttons_ribypp\",\n  \"success-message\": \"_success-message_ribypp\",\n  \"attachments-wrapper\": \"_attachments-wrapper_ribypp\",\n  \"attachments-wrapper-error\": \"_attachments-wrapper-error_ribypp\",\n  \"drop-to-upload\": \"_drop-to-upload_ribypp\",\n  \"file-list\": \"_file-list_ribypp\",\n  \"dropzone\": \"_dropzone_ribypp\",\n  \"file-upload\": \"_file-upload_ribypp\",\n  \"attachments-footer\": \"_attachments-footer_ribypp\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div class=\\\"{{local-class 'home-add-ticket'}}\\\">\\n  {{#if\\n    (or this.loadRequestTypesAndPriorities.isRunning this.loadModules.isRunning)\\n  }}\\n    <div\\n      data-test-omnivise-tickets-spinner\\n      class=\\\"d-flex justify-content-center align-items-center\\n        {{local-class 'spinner-wrapper'}}\\\"\\n    >\\n      <Spinner @size=\\\"lg\\\" />\\n    </div>\\n  {{else if this.isError}}\\n    <OmniviseTickets::ErrorScreen @onCancel={{@onCancel}} />\\n  {{else if this.formSubmitted}}\\n    <Alert\\n      @type=\\\"success\\\"\\n      @dismissible={{false}}\\n      class=\\\"px-3 py-2\\\"\\n      data-test-create-ticket-form-success-message\\n    >\\n      <:header>\\n        {{t \\\"omnivise-tickets.success-message.title\\\"}}\\n      </:header>\\n      <:body>\\n        <div class=\\\"pt-2 pb-3 {{local-class 'success-message'}}\\\">\\n          <p>{{t \\\"omnivise-tickets.success-message.explanation\\\"}}\\n          </p>\\n          <p class=\\\"mt-4 mb-0\\\">\\n            {{t\\n              \\\"omnivise-tickets.success-message.case-id\\\"\\n              caseId=this.issueKey\\n            }}\\n          </p>\\n        </div>\\n        <Button\\n          class=\\\"d-block me-2 border-0\\\"\\n          @type=\\\"primary\\\"\\n          data-test-omnivise-tickets-button=\\\"cancel\\\"\\n          {{on \\\"click\\\" @onCancel}}\\n        >\\n          {{t \\\"omnivise-tickets.back\\\"}}\\n        </Button>\\n      </:body>\\n    </Alert>\\n  {{else}}\\n    {{#if @showTakeScreenshotHelp}}\\n      <div class=\\\"px-2\\\">\\n        <OmniviseTickets::CreateTicketTakeScreenshotHelp\\n          @onCapture={{this.capture}}\\n          @onAttach={{this.attach}}\\n          @canvas={{this.canvas}}\\n          @onHidden={{set this \\\"canvas\\\" null}}\\n        />\\n      </div>\\n    {{/if}}\\n    <Form\\n      class=\\\"{{if @showTakeScreenshotHelp 'd-none'}}\\\"\\n      data-test-omnivise-tickets-create-ticket-form\\n      @formLayout=\\\"horizontal\\\"\\n      @horizontalLabelGridClass=\\\"col-md-5\\\"\\n      @model={{changeset\\n        (hash\\n          selectedModule=this.defaultModule\\n          title=this.titleFromVisualizationComponent\\n          description=this.descriptionFromVisualizationComponent\\n        )\\n        (hash\\n          requestType=(validate-presence true)\\n          selectedModule=(validate-presence true)\\n          title=(array (validate-presence true) (validate-length max=60))\\n          description=(array\\n            (validate-presence true) (validate-length max=5000)\\n          )\\n          priority=(validate-presence true)\\n        )\\n      }}\\n      @onSubmit={{this.submitForm}}\\n      as |form|\\n    >\\n      <div class=\\\"p-2 {{local-class 'form-wrapper'}}\\\">\\n        <h6 class=\\\"mb-2\\\">\\n          {{t \\\"omnivise-tickets.create-ticket\\\"}}\\n        </h6>\\n        <form.element\\n          @controlType=\\\"select\\\"\\n          @property=\\\"requestType\\\"\\n          @label={{t \\\"omnivise-tickets.request-type\\\"}}\\n          @options={{this.requestTypes}}\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"request-type\\\"\\n          as |el|\\n        >\\n          <el.control @placeholder={{t \\\"omnivise-tickets.select\\\"}} as |option|>\\n            {{option.name}}\\n          </el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"select\\\"\\n          @property=\\\"selectedModule\\\"\\n          @label={{t \\\"omnivise-tickets.module-name\\\"}}\\n          @options={{this.moduleNames}}\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"module-name\\\"\\n          as |el|\\n        >\\n          <el.control @placeholder={{t \\\"omnivise-tickets.select\\\"}} as |option|>\\n            {{option}}\\n          </el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"text\\\"\\n          @label={{t \\\"omnivise-tickets.title\\\"}}\\n          @property=\\\"title\\\"\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class 'required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"title\\\"\\n          as |el|\\n        >\\n          <el.control placeholder={{t \\\"omnivise-tickets.title\\\"}}>\\n            {{this.titleFromVisualizationComponent}}\\n          </el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"textarea\\\"\\n          @label={{t \\\"omnivise-tickets.description\\\"}}\\n          @property=\\\"description\\\"\\n          @placeholder=\\\"Case description\\\"\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"description\\\"\\n          as |el|\\n        >\\n          <el.control placeholder={{t \\\"omnivise-tickets.case-description\\\"}}>\\n            {{this.descriptionFromVisualizationComponent}}</el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"select\\\"\\n          @property=\\\"priority\\\"\\n          @label={{t \\\"omnivise-tickets.priority\\\"}}\\n          @options={{this.priorities}}\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"priority\\\"\\n          as |el|\\n        >\\n          <el.control @placeholder={{t \\\"omnivise-tickets.select\\\"}} as |option|>\\n            {{option.name}}\\n          </el.control>\\n        </form.element>\\n\\n        <div data-test-attachments-container>\\n          <label>\\n            {{t \\\"omnivise-tickets.attachments\\\"}}\\n          </label>\\n          {{#let\\n            (file-queue name=\\\"ticket-files\\\" onFileAdded=this.uploadImage)\\n            as |queue|\\n          }}\\n            <FileDropzone\\n              data-test-file-dropzone\\n              @queue={{queue}}\\n              @filter={{this.validateFile}}\\n              as |dropzone|\\n            >\\n              <div\\n                data-test-omnivise-tickets-file-upload=\\\"drag-and-drop\\\"\\n                class=\\\"text-center pt-1 pb-2\\n                  {{local-class\\n                    (if\\n                      (or this.errorType)\\n                      'attachments-wrapper-error'\\n                      'attachments-wrapper'\\n                    )\\n                  }}\\\"\\n              >\\n\\n                {{#if dropzone.active}}\\n                  <div class=\\\"{{local-class 'drop-to-upload'}}\\\">\\n                    {{t \\\"omnivise-tickets.drop-to-upload\\\"}}\\n                  </div>\\n                {{else if (and queue.files.length (not this.errorType))}}\\n                  <div\\n                    class=\\\"{{local-class 'drop-to-upload'}}\\\"\\n                    data-test-message=\\\"file-uploading\\\"\\n                  >\\n                    {{t\\n                      \\\"omnivise-tickets.uploading\\\"\\n                      length=queue.files.length\\n                      progress=queue.progress\\n                    }}\\n                  </div>\\n\\n                {{else}}\\n                  <p class=\\\"{{local-class 'dropzone'}}\\\">\\n                    {{#if dropzone.supported}}\\n                      {{t \\\"omnivise-tickets.drag-drop-message\\\"}}\\n                      <br />\\n                    {{/if}}\\n                    <label\\n                      data-test-issue-details-attachment-file-input-label\\n                      for=\\\"attachment-file-input\\\"\\n                      role=\\\"button\\\"\\n                      class=\\\"btn btn-outline-primary mt-2\\\"\\n                    >{{t \\\"omnivise-tickets.browse-files\\\"}}</label>\\n                    <input\\n                      data-test-issue-details-attachment-file-input\\n                      class=\\\"d-none\\\"\\n                      id=\\\"attachment-file-input\\\"\\n                      type=\\\"file\\\"\\n                      accept=\\\"image/*,application/pdf,text/plain\\\"\\n                      multiple={{true}}\\n                      {{queue.selectFile filter=this.validateFile}}\\n                    />\\n\\n                  </p>\\n                  <p class=\\\"mt-2\\\">\\n                    {{t \\\"omnivise-tickets.or\\\"}}\\n                  </p>\\n                  <Button\\n                    @type=\\\"outline-primary\\\"\\n                    @onClick={{fn @onShowTakeScreenshotHelpChange true}}\\n                    data-test-omnivise-tickets-button=\\\"take-screenshots\\\"\\n                  >\\n                    {{t \\\"omnivise-tickets.take-screenshots\\\"}}\\n                  </Button>\\n                {{/if}}\\n              </div>\\n\\n            </FileDropzone>\\n          {{/let}}\\n          <div class=\\\"mt-1\\\">\\n            <p\\n              class=\\\"text-danger\\\"\\n              data-test-omnivise-tickets-file-upload=\\\"file-upload-fails\\\"\\n            >\\n              {{#if this.errorType}}\\n                {{t (concat \\\"omnivise-tickets.\\\" this.errorType)}}\\n              {{/if}}\\n            </p>\\n          </div>\\n\\n          <div class=\\\"mt-1 {{local-class 'attachments-footer'}}\\\">\\n            <p>\\n              {{t \\\"omnivise-tickets.max-file-size-mb\\\"}}\\n            </p>\\n            <p>\\n              {{t \\\"omnivise-tickets.file-types\\\"}}\\n            </p>\\n          </div>\\n        </div>\\n\\n        <div class=\\\"mt-1\\\">\\n          <ul class=\\\"ps-0\\\" data-test-omnivise-tickets-file=\\\"file\\\">\\n            {{#if this.attachments.length}}\\n              {{#each this.attachments as |file|}}\\n                <li class=\\\"list-unstyled\\\">\\n                  {{file.fileName}}\\n                  <Button\\n                    @type=\\\"btn-link text-danger p-0\\\"\\n                    data-test-omnivise-tickets-file=\\\"delete-{{file.temporaryAttachmentId}}\\\"\\n                    {{on \\\"click\\\" (fn this.onFileDeleted file)}}\\n                  >\\n                    <Icon @icon=\\\"trash\\\" @size=\\\"sm\\\" />\\n                  </Button>\\n                </li>\\n              {{/each}}\\n            {{else if this.vcAttachments}}\\n              {{#each this.vcAttachments as |vc_file|}}\\n                <li class=\\\"list-unstyled\\\">\\n                  {{vc_file.fileName}}\\n                  <Button\\n                    @type=\\\"btn-link text-danger p-0\\\"\\n                    data-test-omnivise-tickets-file=\\\"delete-{{vc_file.temporaryAttachmentId}}\\\"\\n                    {{on \\\"click\\\" (fn this.onFileDeleted vc_file)}}\\n                  >\\n                    <Icon @icon=\\\"trash\\\" @size=\\\"sm\\\" />\\n                  </Button>\\n                </li>\\n              {{/each}}\\n            {{/if}}\\n          </ul>\\n        </div>\\n      </div>\\n      <div\\n        class=\\\"d-flex justify-content-end p-2 {{local-class 'action-buttons'}}\\\"\\n      >\\n        <Button\\n          class=\\\"d-block me-2 border-0\\\"\\n          @type=\\\"outline-secondary\\\"\\n          data-test-omnivise-tickets-button=\\\"cancel\\\"\\n          {{on \\\"click\\\" @onCancel}}\\n        >\\n          {{t \\\"omnivise-tickets.cancel\\\"}}\\n        </Button>\\n        <form.submitButton>\\n          {{if\\n            form.isSubmitting\\n            (t \\\"form.button.sending\\\")\\n            (t \\\"form.button.send\\\")\\n          }}\\n        </form.submitButton>\\n      </div>\\n    </Form>\\n  {{/if}}\\n</div>\\n{{!-- {{#if this.canvas}}\\n  <OmniviseTickets::CropScreenshotModal\\n    @onAttach={{this.attach}}\\n    @canvas={{this.canvas}}\\n    @onHidden={{set this \\\"canvas\\\" null}}\\n  />\\n{{/if}} --}}\", {\"contents\":\"<div class=\\\"{{local-class 'home-add-ticket'}}\\\">\\n  {{#if\\n    (or this.loadRequestTypesAndPriorities.isRunning this.loadModules.isRunning)\\n  }}\\n    <div\\n      data-test-omnivise-tickets-spinner\\n      class=\\\"d-flex justify-content-center align-items-center\\n        {{local-class 'spinner-wrapper'}}\\\"\\n    >\\n      <Spinner @size=\\\"lg\\\" />\\n    </div>\\n  {{else if this.isError}}\\n    <OmniviseTickets::ErrorScreen @onCancel={{@onCancel}} />\\n  {{else if this.formSubmitted}}\\n    <Alert\\n      @type=\\\"success\\\"\\n      @dismissible={{false}}\\n      class=\\\"px-3 py-2\\\"\\n      data-test-create-ticket-form-success-message\\n    >\\n      <:header>\\n        {{t \\\"omnivise-tickets.success-message.title\\\"}}\\n      </:header>\\n      <:body>\\n        <div class=\\\"pt-2 pb-3 {{local-class 'success-message'}}\\\">\\n          <p>{{t \\\"omnivise-tickets.success-message.explanation\\\"}}\\n          </p>\\n          <p class=\\\"mt-4 mb-0\\\">\\n            {{t\\n              \\\"omnivise-tickets.success-message.case-id\\\"\\n              caseId=this.issueKey\\n            }}\\n          </p>\\n        </div>\\n        <Button\\n          class=\\\"d-block me-2 border-0\\\"\\n          @type=\\\"primary\\\"\\n          data-test-omnivise-tickets-button=\\\"cancel\\\"\\n          {{on \\\"click\\\" @onCancel}}\\n        >\\n          {{t \\\"omnivise-tickets.back\\\"}}\\n        </Button>\\n      </:body>\\n    </Alert>\\n  {{else}}\\n    {{#if @showTakeScreenshotHelp}}\\n      <div class=\\\"px-2\\\">\\n        <OmniviseTickets::CreateTicketTakeScreenshotHelp\\n          @onCapture={{this.capture}}\\n          @onAttach={{this.attach}}\\n          @canvas={{this.canvas}}\\n          @onHidden={{set this \\\"canvas\\\" null}}\\n        />\\n      </div>\\n    {{/if}}\\n    <Form\\n      class=\\\"{{if @showTakeScreenshotHelp 'd-none'}}\\\"\\n      data-test-omnivise-tickets-create-ticket-form\\n      @formLayout=\\\"horizontal\\\"\\n      @horizontalLabelGridClass=\\\"col-md-5\\\"\\n      @model={{changeset\\n        (hash\\n          selectedModule=this.defaultModule\\n          title=this.titleFromVisualizationComponent\\n          description=this.descriptionFromVisualizationComponent\\n        )\\n        (hash\\n          requestType=(validate-presence true)\\n          selectedModule=(validate-presence true)\\n          title=(array (validate-presence true) (validate-length max=60))\\n          description=(array\\n            (validate-presence true) (validate-length max=5000)\\n          )\\n          priority=(validate-presence true)\\n        )\\n      }}\\n      @onSubmit={{this.submitForm}}\\n      as |form|\\n    >\\n      <div class=\\\"p-2 {{local-class 'form-wrapper'}}\\\">\\n        <h6 class=\\\"mb-2\\\">\\n          {{t \\\"omnivise-tickets.create-ticket\\\"}}\\n        </h6>\\n        <form.element\\n          @controlType=\\\"select\\\"\\n          @property=\\\"requestType\\\"\\n          @label={{t \\\"omnivise-tickets.request-type\\\"}}\\n          @options={{this.requestTypes}}\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"request-type\\\"\\n          as |el|\\n        >\\n          <el.control @placeholder={{t \\\"omnivise-tickets.select\\\"}} as |option|>\\n            {{option.name}}\\n          </el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"select\\\"\\n          @property=\\\"selectedModule\\\"\\n          @label={{t \\\"omnivise-tickets.module-name\\\"}}\\n          @options={{this.moduleNames}}\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"module-name\\\"\\n          as |el|\\n        >\\n          <el.control @placeholder={{t \\\"omnivise-tickets.select\\\"}} as |option|>\\n            {{option}}\\n          </el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"text\\\"\\n          @label={{t \\\"omnivise-tickets.title\\\"}}\\n          @property=\\\"title\\\"\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class 'required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"title\\\"\\n          as |el|\\n        >\\n          <el.control placeholder={{t \\\"omnivise-tickets.title\\\"}}>\\n            {{this.titleFromVisualizationComponent}}\\n          </el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"textarea\\\"\\n          @label={{t \\\"omnivise-tickets.description\\\"}}\\n          @property=\\\"description\\\"\\n          @placeholder=\\\"Case description\\\"\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"description\\\"\\n          as |el|\\n        >\\n          <el.control placeholder={{t \\\"omnivise-tickets.case-description\\\"}}>\\n            {{this.descriptionFromVisualizationComponent}}</el.control>\\n        </form.element>\\n        <form.element\\n          @controlType=\\\"select\\\"\\n          @property=\\\"priority\\\"\\n          @label={{t \\\"omnivise-tickets.priority\\\"}}\\n          @options={{this.priorities}}\\n          class=\\\"mb-0 text-nowrap\\n            {{local-class ' required'}}\\n            {{local-class 'form-element'}}\\\"\\n          data-test-form-element-for=\\\"priority\\\"\\n          as |el|\\n        >\\n          <el.control @placeholder={{t \\\"omnivise-tickets.select\\\"}} as |option|>\\n            {{option.name}}\\n          </el.control>\\n        </form.element>\\n\\n        <div data-test-attachments-container>\\n          <label>\\n            {{t \\\"omnivise-tickets.attachments\\\"}}\\n          </label>\\n          {{#let\\n            (file-queue name=\\\"ticket-files\\\" onFileAdded=this.uploadImage)\\n            as |queue|\\n          }}\\n            <FileDropzone\\n              data-test-file-dropzone\\n              @queue={{queue}}\\n              @filter={{this.validateFile}}\\n              as |dropzone|\\n            >\\n              <div\\n                data-test-omnivise-tickets-file-upload=\\\"drag-and-drop\\\"\\n                class=\\\"text-center pt-1 pb-2\\n                  {{local-class\\n                    (if\\n                      (or this.errorType)\\n                      'attachments-wrapper-error'\\n                      'attachments-wrapper'\\n                    )\\n                  }}\\\"\\n              >\\n\\n                {{#if dropzone.active}}\\n                  <div class=\\\"{{local-class 'drop-to-upload'}}\\\">\\n                    {{t \\\"omnivise-tickets.drop-to-upload\\\"}}\\n                  </div>\\n                {{else if (and queue.files.length (not this.errorType))}}\\n                  <div\\n                    class=\\\"{{local-class 'drop-to-upload'}}\\\"\\n                    data-test-message=\\\"file-uploading\\\"\\n                  >\\n                    {{t\\n                      \\\"omnivise-tickets.uploading\\\"\\n                      length=queue.files.length\\n                      progress=queue.progress\\n                    }}\\n                  </div>\\n\\n                {{else}}\\n                  <p class=\\\"{{local-class 'dropzone'}}\\\">\\n                    {{#if dropzone.supported}}\\n                      {{t \\\"omnivise-tickets.drag-drop-message\\\"}}\\n                      <br />\\n                    {{/if}}\\n                    <label\\n                      data-test-issue-details-attachment-file-input-label\\n                      for=\\\"attachment-file-input\\\"\\n                      role=\\\"button\\\"\\n                      class=\\\"btn btn-outline-primary mt-2\\\"\\n                    >{{t \\\"omnivise-tickets.browse-files\\\"}}</label>\\n                    <input\\n                      data-test-issue-details-attachment-file-input\\n                      class=\\\"d-none\\\"\\n                      id=\\\"attachment-file-input\\\"\\n                      type=\\\"file\\\"\\n                      accept=\\\"image/*,application/pdf,text/plain\\\"\\n                      multiple={{true}}\\n                      {{queue.selectFile filter=this.validateFile}}\\n                    />\\n\\n                  </p>\\n                  <p class=\\\"mt-2\\\">\\n                    {{t \\\"omnivise-tickets.or\\\"}}\\n                  </p>\\n                  <Button\\n                    @type=\\\"outline-primary\\\"\\n                    @onClick={{fn @onShowTakeScreenshotHelpChange true}}\\n                    data-test-omnivise-tickets-button=\\\"take-screenshots\\\"\\n                  >\\n                    {{t \\\"omnivise-tickets.take-screenshots\\\"}}\\n                  </Button>\\n                {{/if}}\\n              </div>\\n\\n            </FileDropzone>\\n          {{/let}}\\n          <div class=\\\"mt-1\\\">\\n            <p\\n              class=\\\"text-danger\\\"\\n              data-test-omnivise-tickets-file-upload=\\\"file-upload-fails\\\"\\n            >\\n              {{#if this.errorType}}\\n                {{t (concat \\\"omnivise-tickets.\\\" this.errorType)}}\\n              {{/if}}\\n            </p>\\n          </div>\\n\\n          <div class=\\\"mt-1 {{local-class 'attachments-footer'}}\\\">\\n            <p>\\n              {{t \\\"omnivise-tickets.max-file-size-mb\\\"}}\\n            </p>\\n            <p>\\n              {{t \\\"omnivise-tickets.file-types\\\"}}\\n            </p>\\n          </div>\\n        </div>\\n\\n        <div class=\\\"mt-1\\\">\\n          <ul class=\\\"ps-0\\\" data-test-omnivise-tickets-file=\\\"file\\\">\\n            {{#if this.attachments.length}}\\n              {{#each this.attachments as |file|}}\\n                <li class=\\\"list-unstyled\\\">\\n                  {{file.fileName}}\\n                  <Button\\n                    @type=\\\"btn-link text-danger p-0\\\"\\n                    data-test-omnivise-tickets-file=\\\"delete-{{file.temporaryAttachmentId}}\\\"\\n                    {{on \\\"click\\\" (fn this.onFileDeleted file)}}\\n                  >\\n                    <Icon @icon=\\\"trash\\\" @size=\\\"sm\\\" />\\n                  </Button>\\n                </li>\\n              {{/each}}\\n            {{else if this.vcAttachments}}\\n              {{#each this.vcAttachments as |vc_file|}}\\n                <li class=\\\"list-unstyled\\\">\\n                  {{vc_file.fileName}}\\n                  <Button\\n                    @type=\\\"btn-link text-danger p-0\\\"\\n                    data-test-omnivise-tickets-file=\\\"delete-{{vc_file.temporaryAttachmentId}}\\\"\\n                    {{on \\\"click\\\" (fn this.onFileDeleted vc_file)}}\\n                  >\\n                    <Icon @icon=\\\"trash\\\" @size=\\\"sm\\\" />\\n                  </Button>\\n                </li>\\n              {{/each}}\\n            {{/if}}\\n          </ul>\\n        </div>\\n      </div>\\n      <div\\n        class=\\\"d-flex justify-content-end p-2 {{local-class 'action-buttons'}}\\\"\\n      >\\n        <Button\\n          class=\\\"d-block me-2 border-0\\\"\\n          @type=\\\"outline-secondary\\\"\\n          data-test-omnivise-tickets-button=\\\"cancel\\\"\\n          {{on \\\"click\\\" @onCancel}}\\n        >\\n          {{t \\\"omnivise-tickets.cancel\\\"}}\\n        </Button>\\n        <form.submitButton>\\n          {{if\\n            form.isSubmitting\\n            (t \\\"form.button.sending\\\")\\n            (t \\\"form.button.send\\\")\\n          }}\\n        </form.submitButton>\\n      </div>\\n    </Form>\\n  {{/if}}\\n</div>\\n{{!-- {{#if this.canvas}}\\n  <OmniviseTickets::CropScreenshotModal\\n    @onAttach={{this.attach}}\\n    @canvas={{this.canvas}}\\n    @onHidden={{set this \\\"canvas\\\" null}}\\n  />\\n{{/if}} --}}\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/create-ticket-form.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/create-ticket-form.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { task } from 'ember-concurrency-decorators';\nimport { inject as service } from '@ember/service';\nimport config from 'client-app-omnivise-web/config/environment';\nimport { action } from '@ember/object';\nimport { isAbortError } from 'ember-fetch/errors';\nimport takeScreenshot from 'client-app-omnivise-web/utils/take-screenshot';\nimport { UploadFile } from 'ember-file-upload';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\n\nconst MAX_FILE_UPLOAD_SIZE = 10000000;\nconst ALLOWED_FILE_TYPES = [\n  'application/pdf',\n  'image/png',\n  'image/jpeg',\n  'text/plain',\n];\n\nexport default class CreateTicketFormComponent extends Component {\n  @service session;\n  @service fileQueue;\n  @service urlState;\n  @service router;\n  @service('omnivise-tickets') omniviseTickets;\n  @service store;\n\n  @tracked requestTypes = [];\n  @tracked moduleNames = [];\n  @tracked priorities = [];\n  @tracked issueKey;\n  @tracked formSubmitted = false;\n  @tracked isError = false;\n  @tracked attachments = [];\n  @tracked vcAttachments = [];\n  @tracked pendingAttachments = [];\n  @tracked canvas;\n  @tracked errorType;\n  @tracked selectModule = null;\n\n  constructor(owner, args) {\n    super(owner, args);\n\n    this.loadModules.perform();\n    this.loadRequestTypesAndPriorities.perform();\n    if (this.attachmentFromVisualizationComponent) {\n      Array.from(this.attachmentFromVisualizationComponent).forEach((file) => {\n        this.vcFileUpload(file);\n      });\n    }\n  }\n\n  get queue() {\n    return this.fileQueue.findOrCreate('attachments');\n  }\n\n  get titleFromVisualizationComponent() {\n    return this.omniviseTickets.eventDetail.title;\n  }\n\n  get descriptionFromVisualizationComponent() {\n    return this.omniviseTickets.eventDetail.description;\n  }\n\n  get attachmentFromVisualizationComponent() {\n    return this.omniviseTickets.eventDetail.attachment;\n  }\n\n  get defaultModule() {\n    const selectedModuleName =\n      this.router.currentRoute.attributes?.internalView?.module?.get('name') ??\n      'Home';\n\n    if (selectedModuleName === 'Home' || selectedModuleName === 'My Tickets') {\n      return this.selectModule;\n    } else {\n      return this.moduleNames.find((el) => el === selectedModuleName);\n    }\n  }\n\n  @task\n  *loadModules() {\n    // loadModules\n    const modules = yield this.store.findAll('module');\n    this.moduleNames = modules.map((el) => el.name);\n  }\n\n  @task\n  *loadRequestTypesAndPriorities() {\n    // loadRequestTypes\n    const apiHost = config.api.host;\n    const serviceDeskID = config.serviceDeskID;\n    const responseJSON = yield this._getRequest(\n      `${apiHost}/api/v1/q/servicedeskapi/servicedesk/${serviceDeskID}/requesttype`,\n    );\n    this.requestTypes = responseJSON ? responseJSON.values : [];\n\n    // loadPriorities\n    const responseJSONPrio = yield this._getRequest(\n      `${apiHost}/api/v1/q/api/2/priority`,\n    );\n    this.priorities = responseJSONPrio || [];\n  }\n\n  async _getRequest(url) {\n    const response = await fetch(url, {\n      headers: new Headers(this.headers),\n    });\n    if (response.ok) {\n      return await response.json();\n    }\n    const errorText = await response.text();\n    logErrorUtil.logError(errorText);\n    this.isError = true;\n  }\n\n  get headers() {\n    const accessToken = this.session ? this.session.ownAccessToken : '';\n\n    return {\n      'Content-Type': 'application/vnd.api+json',\n      Authorization: `Bearer ${accessToken}`,\n      dataType: 'json',\n    };\n  }\n\n  @task({\n    maxConcurrency: 5,\n    enqueue: true,\n  })\n  *uploadPhoto(file) {\n    this.resetValidationErrors();\n    if (!this.validateFile(file)) {\n      // remove invalid files from upload queue\n      this.queue.remove(file);\n      return;\n    }\n    const fileUploadPromise = this._postDataUploadPhoto(file);\n\n    const processFile = async (fileUploadPromise) => {\n      const attachment = await fileUploadPromise;\n      if (attachment) {\n        this.attachments = [...this.attachments, attachment];\n        if (this.vcAttachments.length) {\n          this.attachments.push(...this.vcAttachments);\n        }\n      } else {\n        // remove invalid files from upload queue\n        this.queue.remove(file);\n        this.errorType = 'server-error';\n        throw 'Internal server error';\n      }\n    };\n    const processFilePromise = processFile(fileUploadPromise);\n    this.pendingAttachments = [...this.pendingAttachments, processFilePromise];\n    yield processFilePromise;\n  }\n\n  async _postDataUploadPhoto(file) {\n    try {\n      const apiHost = config.api.host;\n      const accessToken = this.session.ownAccessToken;\n      const response = await file.upload(\n        `${apiHost}/api/v1/files/upload-file`,\n        {\n          // add headers required for authentication\n          headers: { authorization: `Bearer ${accessToken}` },\n          data: file,\n        },\n      );\n      if (response.status === 200 || response.status === 201) {\n        const responseJSON = await response.json();\n        return responseJSON.temporaryAttachments.firstObject;\n      }\n      throw 'Internal server error';\n    } catch (e) {\n      logErrorUtil.logError(e);\n      return false;\n    }\n  }\n\n  // Needed to write a similar function as ember file upload because the process on handling\n  // the file object is different inside the OWC (ember-file-upload library) and\n  // the file object received from the VC\n  @action\n  async vcFileUpload(file) {\n    if (!this.validateFile(file)) {\n      // remove invalid files from upload queue\n      this.queue.remove(file);\n      return;\n    }\n    const formData = new FormData();\n    const fileVc = new File([file], file.name, {\n      type: 'image/png',\n    });\n    formData.append('file', fileVc);\n    try {\n      const apiHost = config.api.host;\n      const url = `${apiHost}/api/v1/files/upload-file`;\n      const options = {\n        method: 'POST',\n        headers: {\n          Authorization: `Bearer ${this.session.ownAccessToken}`,\n        },\n        body: formData,\n      };\n      const response = await fetch(url, options);\n      if (response.status === 200 || response.status === 201) {\n        const responseJSON = await response.json();\n        const res = responseJSON.temporaryAttachments.firstObject;\n\n        const processFile = async (res) => {\n          const vcAttachment = await res;\n          if (vcAttachment) {\n            this.vcAttachments = [...this.vcAttachments, vcAttachment];\n          } else {\n            // remove invalid files from upload queue\n            file.queue.remove(file);\n            this.errorType = 'server-error';\n            throw 'Internal server error';\n          }\n        };\n        return processFile(res);\n      } else {\n        this.resetValidationErrors();\n        if (!this.validateFile(file)) {\n          // remove invalid files from upload queue\n          this.queue.remove(file);\n          return;\n        }\n      }\n    } catch (e) {\n      logErrorUtil.logError(e);\n      return false;\n    }\n  }\n\n  @action\n  async submitForm({\n    requestType,\n    selectedModule,\n    title,\n    description,\n    priority,\n  }) {\n    await Promise.allSettled(this.pendingAttachments);\n\n    const apiHost = config.api.host;\n    const serviceDeskID = config.serviceDeskID;\n\n    const currentView = this.router.currentRoute.params.view_id ?? 'home';\n    const currentURLState = this.urlState.urlStateFor(currentView) ?? 'none';\n    const selectedModuleLabel = selectedModule\n      .replace(/\\s/g, '-')\n      .toLowerCase();\n    const enhancedDescription = `${description}\\n\\nURLState: ${JSON.stringify(\n      currentURLState,\n    )}\\n\\nViewID: ${currentView}\\n\\nSelectedModule: ${selectedModule}`;\n    const temporaryAttachments = this.attachments.map(\n      (_) => _.temporaryAttachmentId,\n    );\n    const vcTemporaryAttachments = this.vcAttachments.map(\n      (_) => _.temporaryAttachmentId,\n    );\n\n    const data = {\n      body: {\n        serviceDeskId: serviceDeskID,\n        requestTypeId: requestType.id,\n        requestFieldValues: {\n          summary: title,\n          description: enhancedDescription,\n          priority: { id: priority.id },\n          labels:\n            currentView && currentView == selectedModuleLabel\n              ? [currentView]\n              : [currentView, selectedModuleLabel],\n          attachment: temporaryAttachments.length\n            ? temporaryAttachments\n            : vcTemporaryAttachments,\n        },\n      },\n    };\n\n    try {\n      const result = await this._postData(\n        `${apiHost}/api/v1/q/createIssue/servicedeskapi/request`,\n        data,\n      );\n      this.issueKey = result.issueKey;\n    } catch (error) {\n      this.isError = true;\n      logErrorUtil.logError(error);\n    } finally {\n      this.formSubmitted = true;\n    }\n  }\n\n  @action\n  async capture() {\n    this.args.setOmniviseTicketsVisibility(false);\n    try {\n      const stream = await navigator.mediaDevices.getDisplayMedia({\n        video: { mediaSource: 'screen' },\n      });\n      if ('ImageCapture' in window) {\n        this.canvas =\n          await takeScreenshot.takeScreenshotWithImageCapture(stream);\n      } else {\n        this.canvas = await takeScreenshot.takeScreenshotWithVideoPlay(stream);\n      }\n    } finally {\n      this.args.setOmniviseTicketsVisibility(true);\n    }\n  }\n\n  async _postData(url, data) {\n    const accessToken = this.session.ownAccessToken;\n    const options = {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${accessToken}`,\n      },\n      body: JSON.stringify(data),\n    };\n\n    try {\n      const response = await fetch(url, options);\n      if (response.ok) {\n        return response.json();\n      } else {\n        const error = await response.json();\n        if (error?.errorMessage) {\n          throw error.errorMessage;\n        }\n        throw 'An unexpected error occurred';\n      }\n    } catch (error) {\n      if (isAbortError(error)) {\n        // handle aborted network error\n        throw 'A Network Error occurred, Make sure you are connected to the network';\n      }\n      throw error;\n    }\n  }\n\n  @action\n  attach() {\n    this.showScreenshotHelpScreen = false;\n    this.canvas.toBlob((blob) => {\n      const fileName = `screenshot-${new Date().getTime()}.png`;\n      blob.name = fileName;\n      const uploadFile = UploadFile.fromBlob(blob, 'blob');\n      Object.defineProperty(uploadFile.file, 'blob', {\n        writeable: false,\n        enumerable: false,\n        value: blob,\n      });\n      Object.defineProperty(uploadFile.file, 'source', {\n        writeable: false,\n        value: 'blob',\n      });\n      uploadFile.name = fileName;\n      this.uploadPhoto.perform(uploadFile);\n      this.canvas = null;\n      this.args.onShowTakeScreenshotHelpChange(false);\n    }, 'image/png');\n  }\n\n  resetValidationErrors() {\n    this.errorType = null;\n  }\n\n  @action\n  validateFile(file) {\n    if (!this.isFileTypeValid(file.type)) {\n      this.errorType = 'file-type-invalid';\n      return false;\n    }\n    if (!this.isFileSizeValid(file.size)) {\n      this.errorType = 'file-size-invalid';\n      return false;\n    }\n    return true;\n  }\n\n  isFileTypeValid(fileType) {\n    return ALLOWED_FILE_TYPES.includes(fileType);\n  }\n\n  isFileSizeValid(size) {\n    return size <= MAX_FILE_UPLOAD_SIZE;\n  }\n\n  @action\n  uploadImage(file) {\n    this.uploadPhoto.perform(file);\n  }\n\n  @action\n  onFileDeleted(file) {\n    this.attachments = this.attachments.filter(function (_) {\n      return _.temporaryAttachmentId != file.temporaryAttachmentId;\n    });\n    this.vcAttachments = this.vcAttachments.filter(function (_) {\n      return _.temporaryAttachmentId != file.temporaryAttachmentId;\n    });\n  }\n\n  willDestroy() {\n    this.args.onShowTakeScreenshotHelpChange(false);\n    const queue = this.fileQueue.find('ticket-files');\n    if (queue) {\n      while (queue.files.length) {\n        const file = queue.files[0];\n        file.queue.remove(file);\n      }\n    }\n    super.willDestroy(...arguments);\n  }\n}\n","export default {\n  \"screen-capture-help-screen-body\": \"_screen-capture-help-screen-body_165vhp\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{! template-lint-disable no-bare-strings  }}\\n<div\\n  class=\\\"p-2 {{local-class 'screen-capture-help-screen-body'}}\\\"\\n  data-test-omnivise-tickets-take-screenshots-help-wrapper\\n>\\n  {{#if @canvas}}\\n\\n    <img\\n      class=\\\"w-100\\\"\\n      src={{this.imgSrc}}\\n      alt={{t\\n        \\\"omnivise-tickets.crop-screenshots-modal-section.body.alt-screenshot-img\\\"\\n      }}\\n      data-test-crop-screenshot-modal-image\\n    />\\n    <div>\\n      <Button\\n        @type=\\\"light\\\"\\n        @onClick={{@onHidden}}\\n        data-test-crop-screenshot-modal-cancel\\n      >\\n        {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.cancel\\\"}}\\n      </Button>\\n      <Button\\n        @type=\\\"primary\\\"\\n        @onClick={{fn @onAttach @canvas}}\\n        data-test-crop-screenshot-modal-attach\\n      >\\n        {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.attach\\\"}}\\n      </Button>\\n    </div>\\n  {{else}}\\n    <h6\\n      class=\\\"mb-3\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-title\\n    >{{t \\\"omnivise-tickets.take-screenshots-help.title\\\"}}</h6>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-1\\n    ><span class=\\\"me-1\\\">1.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-1\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-2\\n    ><span class=\\\"me-1\\\">2.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-2\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-3\\n    ><span class=\\\"me-1\\\">3.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-3\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-4\\n    ><span class=\\\"me-1\\\">4.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-4\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-5\\n    ><span class=\\\"me-1\\\">5.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-5\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-6\\n    ><span class=\\\"me-1\\\">6.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-6\\\"}}</p></span>\\n    <div>\\n      <Button\\n        @type=\\\"primary\\\"\\n        class=\\\"d-flex mt-1 mx-auto\\\"\\n        @onClick={{@onCapture}}\\n        data-test-omnivise-tickets-take-screenshots-help-section-body-capture\\n      >\\n        {{t \\\"omnivise-tickets.take-screenshots-help.capture\\\"}}\\n      </Button>\\n    </div>\\n  {{/if}}\\n</div>\", {\"contents\":\"{{! template-lint-disable no-bare-strings  }}\\n<div\\n  class=\\\"p-2 {{local-class 'screen-capture-help-screen-body'}}\\\"\\n  data-test-omnivise-tickets-take-screenshots-help-wrapper\\n>\\n  {{#if @canvas}}\\n\\n    <img\\n      class=\\\"w-100\\\"\\n      src={{this.imgSrc}}\\n      alt={{t\\n        \\\"omnivise-tickets.crop-screenshots-modal-section.body.alt-screenshot-img\\\"\\n      }}\\n      data-test-crop-screenshot-modal-image\\n    />\\n    <div>\\n      <Button\\n        @type=\\\"light\\\"\\n        @onClick={{@onHidden}}\\n        data-test-crop-screenshot-modal-cancel\\n      >\\n        {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.cancel\\\"}}\\n      </Button>\\n      <Button\\n        @type=\\\"primary\\\"\\n        @onClick={{fn @onAttach @canvas}}\\n        data-test-crop-screenshot-modal-attach\\n      >\\n        {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.attach\\\"}}\\n      </Button>\\n    </div>\\n  {{else}}\\n    <h6\\n      class=\\\"mb-3\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-title\\n    >{{t \\\"omnivise-tickets.take-screenshots-help.title\\\"}}</h6>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-1\\n    ><span class=\\\"me-1\\\">1.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-1\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-2\\n    ><span class=\\\"me-1\\\">2.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-2\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-3\\n    ><span class=\\\"me-1\\\">3.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-3\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-4\\n    ><span class=\\\"me-1\\\">4.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-4\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-5\\n    ><span class=\\\"me-1\\\">5.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-5\\\"}}</p></span>\\n    <span\\n      class=\\\"d-flex\\\"\\n      data-test-omnivise-tickets-take-screenshots-help-section-body-point-6\\n    ><span class=\\\"me-1\\\">6.</span>\\n      <p>{{t \\\"omnivise-tickets.take-screenshots-help.point-6\\\"}}</p></span>\\n    <div>\\n      <Button\\n        @type=\\\"primary\\\"\\n        class=\\\"d-flex mt-1 mx-auto\\\"\\n        @onClick={{@onCapture}}\\n        data-test-omnivise-tickets-take-screenshots-help-section-body-capture\\n      >\\n        {{t \\\"omnivise-tickets.take-screenshots-help.capture\\\"}}\\n      </Button>\\n    </div>\\n  {{/if}}\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/create-ticket-take-screenshot-help.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/create-ticket-take-screenshot-help.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class CreateTicketTakeScreenshotHelpComponent extends Component {\n  get imgSrc() {\n    return this.args.canvas.toDataURL();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<Modal\\n  @backdropClose={{false}}\\n  @closeButton={{false}}\\n  @size=\\\"lg\\\"\\n  @onHidden={{@onHidden}}\\n  data-test-crop-screenshot-modal-wrapper\\n  as |modal|\\n>\\n  <modal.header>\\n    <h5 data-test-crop-screenshot-modal-header>\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.header.screenshot\\\"}}\\n    </h5>\\n  </modal.header>\\n  <modal.body class=\\\"p-2\\\">\\n    <div class=\\\"mb-1\\\">\\n      <img\\n        class=\\\"w-100\\\"\\n        src={{this.imgSrc}}\\n        alt={{t\\n          \\\"omnivise-tickets.crop-screenshots-modal-section.body.alt-screenshot-img\\\"\\n        }}\\n        data-test-crop-screenshot-modal-image\\n      />\\n    </div>\\n    {{! temp comment because crop functionality is not implemented yet }}\\n    {{!-- <small class=\\\"text-muted\\\" data-test-crop-screenshot-modal-help-text>\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.body.help-text\\\"}}\\n    </small> --}}\\n  </modal.body>\\n  <modal.footer>\\n    <Button\\n      @type=\\\"light\\\"\\n      @onClick={{modal.close}}\\n      data-test-crop-screenshot-modal-cancel\\n    >\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.cancel\\\"}}\\n    </Button>\\n    <Button\\n      @type=\\\"primary\\\"\\n      @onClick={{fn @onAttach @canvas}}\\n      data-test-crop-screenshot-modal-attach\\n    >\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.attach\\\"}}\\n    </Button>\\n  </modal.footer>\\n</Modal>\", {\"contents\":\"<Modal\\n  @backdropClose={{false}}\\n  @closeButton={{false}}\\n  @size=\\\"lg\\\"\\n  @onHidden={{@onHidden}}\\n  data-test-crop-screenshot-modal-wrapper\\n  as |modal|\\n>\\n  <modal.header>\\n    <h5 data-test-crop-screenshot-modal-header>\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.header.screenshot\\\"}}\\n    </h5>\\n  </modal.header>\\n  <modal.body class=\\\"p-2\\\">\\n    <div class=\\\"mb-1\\\">\\n      <img\\n        class=\\\"w-100\\\"\\n        src={{this.imgSrc}}\\n        alt={{t\\n          \\\"omnivise-tickets.crop-screenshots-modal-section.body.alt-screenshot-img\\\"\\n        }}\\n        data-test-crop-screenshot-modal-image\\n      />\\n    </div>\\n    {{! temp comment because crop functionality is not implemented yet }}\\n    {{!-- <small class=\\\"text-muted\\\" data-test-crop-screenshot-modal-help-text>\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.body.help-text\\\"}}\\n    </small> --}}\\n  </modal.body>\\n  <modal.footer>\\n    <Button\\n      @type=\\\"light\\\"\\n      @onClick={{modal.close}}\\n      data-test-crop-screenshot-modal-cancel\\n    >\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.cancel\\\"}}\\n    </Button>\\n    <Button\\n      @type=\\\"primary\\\"\\n      @onClick={{fn @onAttach @canvas}}\\n      data-test-crop-screenshot-modal-attach\\n    >\\n      {{t \\\"omnivise-tickets.crop-screenshots-modal-section.footer.attach\\\"}}\\n    </Button>\\n  </modal.footer>\\n</Modal>\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/crop-screenshot-modal.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/crop-screenshot-modal.hbs\"}});\nimport Component from '@glimmer/component';\n\nexport default class CropScreenshotModalComponent extends Component {\n  get imgSrc() {\n    return this.args.canvas.toDataURL();\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div data-test-error-screen>\\n  <Alert\\n    @type=\\\"danger\\\"\\n    @dismissible={{false}}\\n    class=\\\"mb-0\\\"\\n    data-test-error-screen-alert\\n  >\\n    <:header>\\n      <span data-test-error-screen-title>\\n        {{t \\\"omnivise-tickets.loading-failed.title\\\"}}\\n      </span>\\n    </:header>\\n    <:body>\\n      <p data-test-error-screen-explanation>\\n        {{t \\\"omnivise-tickets.loading-failed.explanation\\\"}}\\n      </p>\\n      <p data-test-error-screen-explanation-2>\\n        {{t \\\"omnivise-tickets.loading-failed.explanation-2\\\"}}\\n      </p>\\n      <p data-test-error-screen-explanation-3>\\n        {{t \\\"omnivise-tickets.loading-failed.explanation-3\\\"}}\\n      </p>\\n      <div class=\\\"d-flex justify-content-between align-items-center\\\">\\n        <span class=\\\"mt-1\\\">\\n          <ContactSupportLink />\\n        </span>\\n        <Button\\n          class=\\\"d-block me-2 border-0 ms-1\\\"\\n          @type=\\\"primary\\\"\\n          data-test-omnivise-tickets-button=\\\"cancel\\\"\\n          {{on \\\"click\\\" @onCancel}}\\n        >\\n          {{t \\\"omnivise-tickets.back\\\"}}\\n        </Button>\\n      </div>\\n    </:body>\\n  </Alert>\\n</div>\", {\"contents\":\"<div data-test-error-screen>\\n  <Alert\\n    @type=\\\"danger\\\"\\n    @dismissible={{false}}\\n    class=\\\"mb-0\\\"\\n    data-test-error-screen-alert\\n  >\\n    <:header>\\n      <span data-test-error-screen-title>\\n        {{t \\\"omnivise-tickets.loading-failed.title\\\"}}\\n      </span>\\n    </:header>\\n    <:body>\\n      <p data-test-error-screen-explanation>\\n        {{t \\\"omnivise-tickets.loading-failed.explanation\\\"}}\\n      </p>\\n      <p data-test-error-screen-explanation-2>\\n        {{t \\\"omnivise-tickets.loading-failed.explanation-2\\\"}}\\n      </p>\\n      <p data-test-error-screen-explanation-3>\\n        {{t \\\"omnivise-tickets.loading-failed.explanation-3\\\"}}\\n      </p>\\n      <div class=\\\"d-flex justify-content-between align-items-center\\\">\\n        <span class=\\\"mt-1\\\">\\n          <ContactSupportLink />\\n        </span>\\n        <Button\\n          class=\\\"d-block me-2 border-0 ms-1\\\"\\n          @type=\\\"primary\\\"\\n          data-test-omnivise-tickets-button=\\\"cancel\\\"\\n          {{on \\\"click\\\" @onCancel}}\\n        >\\n          {{t \\\"omnivise-tickets.back\\\"}}\\n        </Button>\\n      </div>\\n    </:body>\\n  </Alert>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/error-screen.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/error-screen.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"header\": \"_header_16psw2\",\n  \"main-icon\": \"_main-icon_16psw2\",\n  \"header-modal\": \"_header-modal_16psw2\",\n  \"close-icon\": \"_close-icon_16psw2\",\n  \"screen-capture-help-screen-header\": \"_screen-capture-help-screen-header_16psw2\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<div\\n  data-test-omnivise-tickets-header\\n  class=\\\"text-white w-100\\n    {{local-class (if @showMaximizedOmniviseTickets 'header-modal' 'header')}}\\\"\\n>\\n  <div\\n    class=\\\"d-flex h-25 justify-content-between\\\"\\n    data-test-omnivise-tickets-contact\\n  >\\n    <div class=\\\"m-2\\\">\\n      <img\\n        class={{local-class \\\"main-icon\\\"}}\\n        src=\\\"/assets/icons/omnivise-ticket-header-icon.svg\\\"\\n        alt={{t \\\"omnivise-tickets.header-icon-alt\\\"}}\\n        data-test-omnivise-tickets-icon=\\\"help-icon\\\"\\n      />\\n    </div>\\n    <div class=\\\"m-2\\\">\\n      {{#if @showMaximizedOmniviseTickets}}\\n        <button\\n          class=\\\"bg-transparent border-0\\\"\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" @minimizeOmniviseTicketsModal}}\\n        >\\n          <img\\n            class={{local-class \\\"main-icon\\\"}}\\n            src=\\\"/assets/icons/minimize.svg\\\"\\n            alt={{t \\\"omnivise-tickets.header-minimize-icon-alt\\\"}}\\n            data-test-omnivise-tickets-icon=\\\"minimize-icon\\\"\\n          />\\n        </button>\\n        <button\\n          class=\\\"bg-transparent border-0\\\"\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" @onClose}}\\n        >\\n          <img\\n            class={{local-class \\\"close-icon\\\"}}\\n            src=\\\"/assets/icons/close.svg\\\"\\n            alt={{t \\\"omnivise-tickets.header-close-icon-alt\\\"}}\\n            data-test-omnivise-tickets-icon=\\\"close-icon\\\"\\n          />\\n        </button>\\n      {{else}}\\n        <button\\n          class=\\\"bg-transparent border-0\\\"\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" @maximizeOmniviseTicketsModal}}\\n        >\\n          <img\\n            class={{local-class \\\"main-icon\\\"}}\\n            src=\\\"/assets/icons/maximize.svg\\\"\\n            alt={{t \\\"omnivise-tickets.header-maximize-icon-alt\\\"}}\\n            data-test-omnivise-tickets-icon=\\\"maximize-icon\\\"\\n          />\\n        </button>\\n      {{/if}}\\n    </div>\\n  </div>\\n  <div\\n    class=\\\"h-75 d-flex flex-column justify-content-between\\\"\\n    data-test-omnivise-tickets-description\\n  >\\n    <h4 class=\\\"mx-2\\\">\\n      {{t \\\"omnivise-tickets.welcome-message\\\"}}\\n    </h4>\\n    {{#if @showTakeScreenshotHelp}}\\n      <div\\n        class=\\\"px-2 pt-2 pb-3\\n          {{local-class 'screen-capture-help-screen-header'}}\\\"\\n        data-test-omnivise-tickets-take-screenshots-help-header\\n      >\\n        <div class=\\\"d-flex justify-content-between\\\">\\n          <h6\\n            class=\\\"text-white\\\"\\n            data-test-omnivise-tickets-take-screenshots-help-header-title\\n          >{{t \\\"omnivise-tickets.take-screenshots-help-header\\\"}}</h6>\\n          <Button\\n            class=\\\"border-0 bg-transparent d-flex vertical-align-top p-0\\\"\\n            {{on \\\"click\\\" (fn @onShowTakeScreenshotHelpChange false)}}\\n            data-test-omnivise-tickets-take-screenshots-help-header-close\\n          >\\n            <Icon class=\\\"text-white\\\" @icon=\\\"close\\\" @size=\\\"lg\\\" />\\n          </Button>\\n        </div>\\n        <p\\n          data-test-omnivise-tickets-take-screenshots-help-section-header-content\\n        >{{t \\\"omnivise-tickets.take-screenshots-help-content\\\"}}</p>\\n      </div>\\n    {{else}}\\n      <div class=\\\"mx-2\\\">\\n        <p>\\n          {{t \\\"omnivise-tickets.description-message\\\"}}\\n        </p>\\n        <p>\\n          {{t \\\"omnivise-tickets.question\\\"}}\\n        </p>\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\", {\"contents\":\"<div\\n  data-test-omnivise-tickets-header\\n  class=\\\"text-white w-100\\n    {{local-class (if @showMaximizedOmniviseTickets 'header-modal' 'header')}}\\\"\\n>\\n  <div\\n    class=\\\"d-flex h-25 justify-content-between\\\"\\n    data-test-omnivise-tickets-contact\\n  >\\n    <div class=\\\"m-2\\\">\\n      <img\\n        class={{local-class \\\"main-icon\\\"}}\\n        src=\\\"/assets/icons/omnivise-ticket-header-icon.svg\\\"\\n        alt={{t \\\"omnivise-tickets.header-icon-alt\\\"}}\\n        data-test-omnivise-tickets-icon=\\\"help-icon\\\"\\n      />\\n    </div>\\n    <div class=\\\"m-2\\\">\\n      {{#if @showMaximizedOmniviseTickets}}\\n        <button\\n          class=\\\"bg-transparent border-0\\\"\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" @minimizeOmniviseTicketsModal}}\\n        >\\n          <img\\n            class={{local-class \\\"main-icon\\\"}}\\n            src=\\\"/assets/icons/minimize.svg\\\"\\n            alt={{t \\\"omnivise-tickets.header-minimize-icon-alt\\\"}}\\n            data-test-omnivise-tickets-icon=\\\"minimize-icon\\\"\\n          />\\n        </button>\\n        <button\\n          class=\\\"bg-transparent border-0\\\"\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" @onClose}}\\n        >\\n          <img\\n            class={{local-class \\\"close-icon\\\"}}\\n            src=\\\"/assets/icons/close.svg\\\"\\n            alt={{t \\\"omnivise-tickets.header-close-icon-alt\\\"}}\\n            data-test-omnivise-tickets-icon=\\\"close-icon\\\"\\n          />\\n        </button>\\n      {{else}}\\n        <button\\n          class=\\\"bg-transparent border-0\\\"\\n          type=\\\"button\\\"\\n          {{on \\\"click\\\" @maximizeOmniviseTicketsModal}}\\n        >\\n          <img\\n            class={{local-class \\\"main-icon\\\"}}\\n            src=\\\"/assets/icons/maximize.svg\\\"\\n            alt={{t \\\"omnivise-tickets.header-maximize-icon-alt\\\"}}\\n            data-test-omnivise-tickets-icon=\\\"maximize-icon\\\"\\n          />\\n        </button>\\n      {{/if}}\\n    </div>\\n  </div>\\n  <div\\n    class=\\\"h-75 d-flex flex-column justify-content-between\\\"\\n    data-test-omnivise-tickets-description\\n  >\\n    <h4 class=\\\"mx-2\\\">\\n      {{t \\\"omnivise-tickets.welcome-message\\\"}}\\n    </h4>\\n    {{#if @showTakeScreenshotHelp}}\\n      <div\\n        class=\\\"px-2 pt-2 pb-3\\n          {{local-class 'screen-capture-help-screen-header'}}\\\"\\n        data-test-omnivise-tickets-take-screenshots-help-header\\n      >\\n        <div class=\\\"d-flex justify-content-between\\\">\\n          <h6\\n            class=\\\"text-white\\\"\\n            data-test-omnivise-tickets-take-screenshots-help-header-title\\n          >{{t \\\"omnivise-tickets.take-screenshots-help-header\\\"}}</h6>\\n          <Button\\n            class=\\\"border-0 bg-transparent d-flex vertical-align-top p-0\\\"\\n            {{on \\\"click\\\" (fn @onShowTakeScreenshotHelpChange false)}}\\n            data-test-omnivise-tickets-take-screenshots-help-header-close\\n          >\\n            <Icon class=\\\"text-white\\\" @icon=\\\"close\\\" @size=\\\"lg\\\" />\\n          </Button>\\n        </div>\\n        <p\\n          data-test-omnivise-tickets-take-screenshots-help-section-header-content\\n        >{{t \\\"omnivise-tickets.take-screenshots-help-content\\\"}}</p>\\n      </div>\\n    {{else}}\\n      <div class=\\\"mx-2\\\">\\n        <p>\\n          {{t \\\"omnivise-tickets.description-message\\\"}}\\n        </p>\\n        <p>\\n          {{t \\\"omnivise-tickets.question\\\"}}\\n        </p>\\n      </div>\\n    {{/if}}\\n  </div>\\n</div>\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/header.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/header.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","export default {\n  \"home\": \"_home_16xhxi\",\n  \"custom-border-color\": \"_custom-border-color_16xhxi\",\n  \"custom-button\": \"_custom-button_16xhxi\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (feature-flag \\\"cep-tickets\\\") as |showCEPTickets|}}\\n  {{#if this.shouldShowTicketCreationForm}}\\n    <div class=\\\"border {{local-class 'custom-border-color'}}\\\">\\n      <OmniviseTickets::CreateTicketForm\\n        @onCancel={{this.closeTicketCreationForm}}\\n        @onShowTakeScreenshotHelpChange={{@onShowTakeScreenshotHelpChange}}\\n        @showTakeScreenshotHelp={{@showTakeScreenshotHelp}}\\n        @setOmniviseTicketsVisibility={{@setOmniviseTicketsVisibility}}\\n      />\\n    </div>\\n  {{else}}\\n    <div\\n      data-test-omnivise-tickets-home\\n      class=\\\"d-flex p-1 text-center text-secondary border\\n        {{local-class 'home custom-border-color'}}\\n        {{if showCEPTickets 'flex-column' ''}}\\n        \\\"\\n    >\\n      {{#if showCEPTickets}}\\n        <div\\n          class=\\\"d-flex border-bottom justify-content-start align-items-center h-100 w-100\\n            {{local-class 'custom-border-color'}}\\\"\\n        >\\n\\n          <a\\n            class=\\\"btn btn-lg btn-light {{local-class 'custom-button'}}\\\"\\n            data-test-omnivise-tickets-button=\\\"add-cep-ticket\\\"\\n            href=\\\"https://cep.siemens-energy.com/CC/s/support-dashboard\\\"\\n            target=\\\"_blank\\\"\\n            rel=\\\"noopener noreferrer\\\"\\n          >\\n            <Icon\\n              @icon=\\\"add\\\"\\n              @size=\\\"lg\\\"\\n              data-test-omnivise-tickets-icon=\\\"add-cep-ticket\\\"\\n            />\\n            {{t \\\"omnivise-tickets.create-cep-ticket\\\"}}\\n          </a>\\n        </div>\\n      {{/if}}\\n      <div\\n        class=\\\"d-flex align-items-center h-100\\n          {{if\\n            showCEPTickets\\n            'w-100 border-bottom justify-content-start'\\n            'w-50 border-end justify-content-center'\\n          }}\\n          {{local-class 'custom-border-color'}}\\\"\\n      >\\n        <Button\\n          class=\\\"{{local-class 'custom-button'}}\\\"\\n          @type=\\\"light\\\"\\n          @size=\\\"lg\\\"\\n          data-test-omnivise-tickets-button=\\\"add-tickets\\\"\\n          {{on \\\"click\\\" this.openTicketCreationForm}}\\n        >\\n          <Icon\\n            @icon=\\\"add\\\"\\n            @size=\\\"lg\\\"\\n            data-test-omnivise-tickets-icon=\\\"add-ticket\\\"\\n          />\\n          {{t \\\"omnivise-tickets.create-ticket\\\"}}\\n        </Button>\\n      </div>\\n      <div\\n        class=\\\"d-flex align-items-center h-100\\n          {{if\\n            showCEPTickets\\n            'w-100 justify-content-start'\\n            'w-50 justify-content-center'\\n          }}\\\"\\n      >\\n        <Button\\n          @type=\\\"light\\\"\\n          @size=\\\"lg\\\"\\n          class=\\\"btn {{local-class 'custom-button'}}\\\"\\n          data-test-omnivise-tickets-button=\\\"open-module\\\"\\n          @onClick={{@toggleOmniviseTicketsModule}}\\n        >\\n          <Icon\\n            @icon=\\\"file\\\"\\n            @size=\\\"lg\\\"\\n            data-test-omnivise-tickets-icon=\\\"open-module\\\"\\n          />\\n          {{t \\\"omnivise-tickets.my-tickets\\\"}}\\n        </Button>\\n      </div>\\n    </div>\\n  {{/if}}\\n{{/let}}\", {\"contents\":\"{{#let (feature-flag \\\"cep-tickets\\\") as |showCEPTickets|}}\\n  {{#if this.shouldShowTicketCreationForm}}\\n    <div class=\\\"border {{local-class 'custom-border-color'}}\\\">\\n      <OmniviseTickets::CreateTicketForm\\n        @onCancel={{this.closeTicketCreationForm}}\\n        @onShowTakeScreenshotHelpChange={{@onShowTakeScreenshotHelpChange}}\\n        @showTakeScreenshotHelp={{@showTakeScreenshotHelp}}\\n        @setOmniviseTicketsVisibility={{@setOmniviseTicketsVisibility}}\\n      />\\n    </div>\\n  {{else}}\\n    <div\\n      data-test-omnivise-tickets-home\\n      class=\\\"d-flex p-1 text-center text-secondary border\\n        {{local-class 'home custom-border-color'}}\\n        {{if showCEPTickets 'flex-column' ''}}\\n        \\\"\\n    >\\n      {{#if showCEPTickets}}\\n        <div\\n          class=\\\"d-flex border-bottom justify-content-start align-items-center h-100 w-100\\n            {{local-class 'custom-border-color'}}\\\"\\n        >\\n\\n          <a\\n            class=\\\"btn btn-lg btn-light {{local-class 'custom-button'}}\\\"\\n            data-test-omnivise-tickets-button=\\\"add-cep-ticket\\\"\\n            href=\\\"https://cep.siemens-energy.com/CC/s/support-dashboard\\\"\\n            target=\\\"_blank\\\"\\n            rel=\\\"noopener noreferrer\\\"\\n          >\\n            <Icon\\n              @icon=\\\"add\\\"\\n              @size=\\\"lg\\\"\\n              data-test-omnivise-tickets-icon=\\\"add-cep-ticket\\\"\\n            />\\n            {{t \\\"omnivise-tickets.create-cep-ticket\\\"}}\\n          </a>\\n        </div>\\n      {{/if}}\\n      <div\\n        class=\\\"d-flex align-items-center h-100\\n          {{if\\n            showCEPTickets\\n            'w-100 border-bottom justify-content-start'\\n            'w-50 border-end justify-content-center'\\n          }}\\n          {{local-class 'custom-border-color'}}\\\"\\n      >\\n        <Button\\n          class=\\\"{{local-class 'custom-button'}}\\\"\\n          @type=\\\"light\\\"\\n          @size=\\\"lg\\\"\\n          data-test-omnivise-tickets-button=\\\"add-tickets\\\"\\n          {{on \\\"click\\\" this.openTicketCreationForm}}\\n        >\\n          <Icon\\n            @icon=\\\"add\\\"\\n            @size=\\\"lg\\\"\\n            data-test-omnivise-tickets-icon=\\\"add-ticket\\\"\\n          />\\n          {{t \\\"omnivise-tickets.create-ticket\\\"}}\\n        </Button>\\n      </div>\\n      <div\\n        class=\\\"d-flex align-items-center h-100\\n          {{if\\n            showCEPTickets\\n            'w-100 justify-content-start'\\n            'w-50 justify-content-center'\\n          }}\\\"\\n      >\\n        <Button\\n          @type=\\\"light\\\"\\n          @size=\\\"lg\\\"\\n          class=\\\"btn {{local-class 'custom-button'}}\\\"\\n          data-test-omnivise-tickets-button=\\\"open-module\\\"\\n          @onClick={{@toggleOmniviseTicketsModule}}\\n        >\\n          <Icon\\n            @icon=\\\"file\\\"\\n            @size=\\\"lg\\\"\\n            data-test-omnivise-tickets-icon=\\\"open-module\\\"\\n          />\\n          {{t \\\"omnivise-tickets.my-tickets\\\"}}\\n        </Button>\\n      </div>\\n    </div>\\n  {{/if}}\\n{{/let}}\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/home.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/home.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nexport default class Home extends Component {\n  @tracked shouldShowTicketCreationForm = false;\n  @service('omnivise-tickets') omniviseTickets;\n\n  constructor() {\n    super(...arguments);\n    this.omniviseTickets.openTicketCreationForm = this.openTicketCreationForm;\n  }\n\n  @action\n  closeTicketCreationForm() {\n    this.shouldShowTicketCreationForm = false;\n    this.omniviseTickets.eventDetail = {};\n  }\n\n  @action\n  openTicketCreationForm() {\n    this.shouldShowTicketCreationForm = true;\n  }\n}\n","export default {\n  \"launch-button\": \"_launch-button_1r1hby\",\n  \"non-modal-container\": \"_non-modal-container_1r1hby\",\n  \"modal-container\": \"_modal-container_1r1hby\"\n};\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (feature-flag \\\"omnivise-tickets\\\")}}\\n  <Header::MenuModal @onClose={{this.resetMaximizedState}}>\\n    <:trigger as |trigger|>\\n      {{did-insert-helper (fn this.registerTrigger trigger)}}\\n      <Button\\n        {{trigger.trigger}}\\n        @type=\\\"tertiary\\\"\\n        class=\\\"{{local-class 'launch-button'}}\\\"\\n        data-test-omnivise-tickets-button=\\\"launch-button\\\"\\n        title={{t \\\"omnivise-tickets.launch-button-title\\\"}}\\n        @onClick={{trigger.toggle}}\\n      >\\n        <img\\n          class=\\\"text-secondary me-0\\\"\\n          src=\\\"/assets/icons/omnivise-ticket-floating-icon.svg\\\"\\n          alt={{t \\\"omnivise-tickets.floating-icon-alt\\\"}}\\n          data-test-omnivise-tickets-icon=\\\"help-icon\\\"\\n        />\\n      </Button>\\n    </:trigger>\\n\\n    <:content as |dialog|>\\n      <div\\n        class=\\\"{{local-class\\n            (if\\n              this.showMaximizedOmniviseTickets\\n              'modal-container'\\n              'non-modal-container'\\n            )\\n          }}\\\"\\n        data-test-omnivise-tickets-wrapper\\n      >\\n        <OmniviseTickets::Header\\n          @showTakeScreenshotHelp={{this.showTakeScreenshotHelp}}\\n          @onShowTakeScreenshotHelpChange={{this.setShowTakeScreenshotHelp}}\\n          @showMaximizedOmniviseTickets={{this.showMaximizedOmniviseTickets}}\\n          @onClose={{dialog.close}}\\n          @maximizeOmniviseTicketsModal={{fn\\n            this.maximizeOmniviseTicketsModal\\n            dialog.detach\\n          }}\\n          @minimizeOmniviseTicketsModal={{fn\\n            this.minimizeOmniviseTicketsModal\\n            dialog.attach\\n          }}\\n        />\\n        <OmniviseTickets::Home\\n          @showTakeScreenshotHelp={{this.showTakeScreenshotHelp}}\\n          @onShowTakeScreenshotHelpChange={{this.setShowTakeScreenshotHelp}}\\n          @setOmniviseTicketsVisibility={{dialog.toggle}}\\n          @toggleOmniviseTicketsModule={{fn\\n            this.toggleOmniviseTicketsModule\\n            dialog.close\\n          }}\\n        />\\n      </div>\\n    </:content>\\n  </Header::MenuModal>\\n{{/if}}\", {\"contents\":\"{{#if (feature-flag \\\"omnivise-tickets\\\")}}\\n  <Header::MenuModal @onClose={{this.resetMaximizedState}}>\\n    <:trigger as |trigger|>\\n      {{did-insert-helper (fn this.registerTrigger trigger)}}\\n      <Button\\n        {{trigger.trigger}}\\n        @type=\\\"tertiary\\\"\\n        class=\\\"{{local-class 'launch-button'}}\\\"\\n        data-test-omnivise-tickets-button=\\\"launch-button\\\"\\n        title={{t \\\"omnivise-tickets.launch-button-title\\\"}}\\n        @onClick={{trigger.toggle}}\\n      >\\n        <img\\n          class=\\\"text-secondary me-0\\\"\\n          src=\\\"/assets/icons/omnivise-ticket-floating-icon.svg\\\"\\n          alt={{t \\\"omnivise-tickets.floating-icon-alt\\\"}}\\n          data-test-omnivise-tickets-icon=\\\"help-icon\\\"\\n        />\\n      </Button>\\n    </:trigger>\\n\\n    <:content as |dialog|>\\n      <div\\n        class=\\\"{{local-class\\n            (if\\n              this.showMaximizedOmniviseTickets\\n              'modal-container'\\n              'non-modal-container'\\n            )\\n          }}\\\"\\n        data-test-omnivise-tickets-wrapper\\n      >\\n        <OmniviseTickets::Header\\n          @showTakeScreenshotHelp={{this.showTakeScreenshotHelp}}\\n          @onShowTakeScreenshotHelpChange={{this.setShowTakeScreenshotHelp}}\\n          @showMaximizedOmniviseTickets={{this.showMaximizedOmniviseTickets}}\\n          @onClose={{dialog.close}}\\n          @maximizeOmniviseTicketsModal={{fn\\n            this.maximizeOmniviseTicketsModal\\n            dialog.detach\\n          }}\\n          @minimizeOmniviseTicketsModal={{fn\\n            this.minimizeOmniviseTicketsModal\\n            dialog.attach\\n          }}\\n        />\\n        <OmniviseTickets::Home\\n          @showTakeScreenshotHelp={{this.showTakeScreenshotHelp}}\\n          @onShowTakeScreenshotHelpChange={{this.setShowTakeScreenshotHelp}}\\n          @setOmniviseTicketsVisibility={{dialog.toggle}}\\n          @toggleOmniviseTicketsModule={{fn\\n            this.toggleOmniviseTicketsModule\\n            dialog.close\\n          }}\\n        />\\n      </div>\\n    </:content>\\n  </Header::MenuModal>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/omnivise-tickets/index.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/omnivise-tickets/index.hbs\"}});\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nexport default class OmniviseTickets extends Component {\n  @service router;\n  @service('omnivise-tickets') omniviseTickets;\n\n  @tracked showTakeScreenshotHelp = false;\n  @tracked isOmniviseTicketsVisible = true;\n  @tracked showMaximizedOmniviseTickets = false;\n\n  trigger = null;\n\n  constructor() {\n    super(...arguments);\n    this.omniviseTickets.openTicketDialog = this.openTicketDialog;\n  }\n\n  @action\n  registerTrigger(trigger) {\n    this.trigger = trigger;\n  }\n\n  @action\n  maximizeOmniviseTicketsModal(dialogDetach) {\n    this.showMaximizedOmniviseTickets = true;\n    dialogDetach && dialogDetach();\n  }\n\n  @action\n  minimizeOmniviseTicketsModal(dialogAttach) {\n    this.showMaximizedOmniviseTickets = false;\n    dialogAttach && dialogAttach();\n  }\n\n  @action\n  setShowTakeScreenshotHelp(value) {\n    this.showTakeScreenshotHelp = value;\n  }\n\n  @action\n  openTicketDialog() {\n    this.trigger.toggle();\n  }\n\n  @action\n  async toggleOmniviseTicketsModule(dialogClose) {\n    dialogClose && dialogClose();\n    await this.router.transitionTo('auth.view', 'my-tickets');\n  }\n\n  @action\n  resetMaximizedState() {\n    this.showMaximizedOmniviseTickets = false;\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{did-update-helper this.onAuthenticationChange this.session.isAuthenticated}}\", {\"contents\":\"{{did-update-helper this.onAuthenticationChange this.session.isAuthenticated}}\",\"moduleName\":\"client-app-omnivise-web/components/redirect-to-auth-if-authenticated.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/redirect-to-auth-if-authenticated.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\n\n/**\n * This component observes the `isAuthenticated` state of session service. If\n * it changes to `true`, the component triggers a transition to `auth` route.\n *\n * Changes to `isAuthenticated` state are observed using `{{did-update-helper}}`\n * helper from `ember-render-helpers`.\n *\n * Conceptually this is an observer pattern. But observers aren't part of\n * Ember's programming modal anymore since Octane. So kind of misuing a\n * component to have an observer style pattern.\n *\n * Ember is currently missing a good pattern for this kind of situations.\n * There as been a proposal to add `@use` and `Resources` for this use case.\n * But it's still an experiment. We might want to refactor to that one when\n * it's more stable. Please find more information about it in this RFC\n * https://github.com/emberjs/rfcs/pull/567 and this blog post\n * https://www.pzuraq.com/introducing-use/.\n */\nexport default class RedirectToAuthIfAuthenticated extends Component {\n  @service session;\n  @service router;\n\n  @action\n  async onAuthenticationChange() {\n    if (this.session.isAuthenticated) {\n      if (!this.session.redirectUri) {\n        const { redirectUri } = this.router.currentRoute.queryParams;\n        this.session.redirectUri = redirectUri;\n      }\n      await this.session.redirectToDestinationAfterAuthentication();\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{did-update-helper this.onAuthenticationChange this.session.isAuthenticated}}\", {\"contents\":\"{{did-update-helper this.onAuthenticationChange this.session.isAuthenticated}}\",\"moduleName\":\"client-app-omnivise-web/components/redirect-to-login-if-unauthenticated.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/redirect-to-login-if-unauthenticated.hbs\"}});\nimport Component from '@glimmer/component';\nimport { inject as service } from '@ember/service';\nimport { action } from '@ember/object';\n\n/**\n * This component observes the `isAuthenticated` state of session service. If\n * it changes to `false`, the component triggers a transition to `login` route.\n *\n * Changes to `isAuthenticated` state are observed using `{{did-update-helper}}`\n * helper from `ember-render-helpers`.\n *\n * Conceptually this is an observer pattern. But observers aren't part of\n * Ember's programming modal anymore since Octane. So kind of misuing a\n * component to have an observer style pattern.\n *\n * Ember is currently missing a good pattern for this kind of situations.\n * There as been a proposal to add `@use` and `Resources` for this use case.\n * But it's still an experiment. We might want to refactor to that one when\n * it's more stable. Please find more information about it in this RFC\n * https://github.com/emberjs/rfcs/pull/567 and this blog post\n * https://www.pzuraq.com/introducing-use/.\n */\nexport default class RedirectToLoginIfUnauthenticated extends Component {\n  @service session;\n  @service router;\n\n  @action\n  async onAuthenticationChange() {\n    if (!this.session.isTokenValid) {\n      this.session.stopListeningForLogoutEvents();\n\n      this.session.redirectUri = window.location.pathname;\n      await this.router.transitionTo('login').promise;\n    }\n  }\n}\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"<SecondLevelNavigation @views={{@model.internalView.module.views}} />\\n{{#each @model.internalView.configuredWidgets as |configuredWidget|}}\\n  {{#each configuredWidget.configuredComponents as |configuredComponent|}}\\n    <div class=\\\"d-flex flex-grow-1\\\">\\n      <VisualizationComponentRenderer\\n        @configuredComponent={{configuredComponent}}\\n        @readOnly={{@model.internalView.module.readOnly}}\\n      />\\n    </div>\\n  {{/each}}\\n{{/each}}\", {\"contents\":\"<SecondLevelNavigation @views={{@model.internalView.module.views}} />\\n{{#each @model.internalView.configuredWidgets as |configuredWidget|}}\\n  {{#each configuredWidget.configuredComponents as |configuredComponent|}}\\n    <div class=\\\"d-flex flex-grow-1\\\">\\n      <VisualizationComponentRenderer\\n        @configuredComponent={{configuredComponent}}\\n        @readOnly={{@model.internalView.module.readOnly}}\\n      />\\n    </div>\\n  {{/each}}\\n{{/each}}\",\"moduleName\":\"client-app-omnivise-web/components/regular-view.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/regular-view.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#if (gt @views.length 1)}}\\n  <div data-test-second-level-navigation class=\\\"flex-grow-0 flex-shrink-0\\\">\\n    {{#each @views as |moduleView|}}\\n      {{#if (eq moduleView.constructor.modelName \\\"internal-view\\\")}}\\n        <LinkTo\\n          @route=\\\"auth.view\\\"\\n          @model={{moduleView.id}}\\n          class=\\\"btn btn-primary m-1\\\"\\n          data-test-second-level-internal-link={{moduleView.id}}\\n        >\\n          {{or moduleView.title moduleView.id}}\\n        </LinkTo>\\n      {{else}}\\n        <a\\n          href={{moduleView.url}}\\n          class=\\\"btn btn-primary m-1\\\"\\n          data-test-second-level-external-link={{moduleView.id}}\\n        >\\n          {{or moduleView.title moduleView.id}}\\n          <Icon @icon=\\\"external-link\\\" class=\\\"ms-1 text-white-50\\\" />\\n        </a>\\n      {{/if}}\\n    {{/each}}\\n  </div>\\n{{/if}}\", {\"contents\":\"{{#if (gt @views.length 1)}}\\n  <div data-test-second-level-navigation class=\\\"flex-grow-0 flex-shrink-0\\\">\\n    {{#each @views as |moduleView|}}\\n      {{#if (eq moduleView.constructor.modelName \\\"internal-view\\\")}}\\n        <LinkTo\\n          @route=\\\"auth.view\\\"\\n          @model={{moduleView.id}}\\n          class=\\\"btn btn-primary m-1\\\"\\n          data-test-second-level-internal-link={{moduleView.id}}\\n        >\\n          {{or moduleView.title moduleView.id}}\\n        </LinkTo>\\n      {{else}}\\n        <a\\n          href={{moduleView.url}}\\n          class=\\\"btn btn-primary m-1\\\"\\n          data-test-second-level-external-link={{moduleView.id}}\\n        >\\n          {{or moduleView.title moduleView.id}}\\n          <Icon @icon=\\\"external-link\\\" class=\\\"ms-1 text-white-50\\\" />\\n        </a>\\n      {{/if}}\\n    {{/each}}\\n  </div>\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/second-level-navigation.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/second-level-navigation.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{#let (service \\\"session\\\") as |session|}}\\n  <Modal\\n    @open={{get session \\\"tokenExpired\\\"}}\\n    @backdropClose={{false}}\\n    @closeButton={{false}}\\n    @onSubmit={{get session \\\"invalidate\\\"}}\\n    data-test-token-expired-modal\\n    as |modal|\\n  >\\n    <modal.header>\\n      <h5 class=\\\"m-1\\\">\\n        {{t \\\"screen.login.token-expired.error-message.title\\\"}}\\n      </h5>\\n    </modal.header>\\n    <modal.body>\\n      <p>\\n        {{t \\\"screen.login.token-expired.error-message.explanation\\\"}}\\n      </p>\\n      <p>\\n        {{t \\\"screen.login.token-expired.error-message.explanation-2\\\"}}\\n      </p>\\n      <p>\\n        {{t \\\"screen.login.token-expired.error-message.explanation-3\\\"}}\\n      </p>\\n    </modal.body>\\n    <modal.footer>\\n      <div class=\\\"d-flex float-end\\\">\\n        <span class=\\\"mt-1\\\">\\n          <ContactSupportLink />\\n        </span>\\n        <Button\\n          @type=\\\"primary\\\"\\n          class=\\\"ms-2\\\"\\n          data-test-token-expired-back-login-button\\n          @onClick={{modal.submit}}\\n        >\\n          {{t \\\"form.button.back-to-login\\\"}}\\n        </Button>\\n      </div>\\n    </modal.footer>\\n  </Modal>\\n{{/let}}\", {\"contents\":\"{{#let (service \\\"session\\\") as |session|}}\\n  <Modal\\n    @open={{get session \\\"tokenExpired\\\"}}\\n    @backdropClose={{false}}\\n    @closeButton={{false}}\\n    @onSubmit={{get session \\\"invalidate\\\"}}\\n    data-test-token-expired-modal\\n    as |modal|\\n  >\\n    <modal.header>\\n      <h5 class=\\\"m-1\\\">\\n        {{t \\\"screen.login.token-expired.error-message.title\\\"}}\\n      </h5>\\n    </modal.header>\\n    <modal.body>\\n      <p>\\n        {{t \\\"screen.login.token-expired.error-message.explanation\\\"}}\\n      </p>\\n      <p>\\n        {{t \\\"screen.login.token-expired.error-message.explanation-2\\\"}}\\n      </p>\\n      <p>\\n        {{t \\\"screen.login.token-expired.error-message.explanation-3\\\"}}\\n      </p>\\n    </modal.body>\\n    <modal.footer>\\n      <div class=\\\"d-flex float-end\\\">\\n        <span class=\\\"mt-1\\\">\\n          <ContactSupportLink />\\n        </span>\\n        <Button\\n          @type=\\\"primary\\\"\\n          class=\\\"ms-2\\\"\\n          data-test-token-expired-back-login-button\\n          @onClick={{modal.submit}}\\n        >\\n          {{t \\\"form.button.back-to-login\\\"}}\\n        </Button>\\n      </div>\\n    </modal.footer>\\n  </Modal>\\n{{/let}}\",\"moduleName\":\"client-app-omnivise-web/components/token-expired-modal.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/token-expired-modal.hbs\"}});\nimport templateOnly from '@ember/component/template-only';\n\nexport default templateOnly();\n","import { hbs } from 'ember-cli-htmlbars';\nconst __COLOCATED_TEMPLATE__ = hbs(\"{{did-update-helper (perform this.prepare) @configuredComponent.id}}\\n\\n{{#if this.isReady}}\\n  {{add-event-listener-to-element\\n    (create-element\\n      this.customElementName\\n      accessTokens=(json-stringify this.accessTokens)\\n      urlState=this.urlState\\n      deviceState=this.deviceState\\n      hostUrl=this.hostUrl\\n      resolvedUrls=(json-stringify this.resolvedUrls)\\n      embedUrl=this.embedUrl\\n      readOnly=@readOnly\\n      instanceConfiguration=(json-stringify this.instanceConfiguration)\\n      shouldShowTooltip=this.shouldShowTooltip\\n      preferences=(json-stringify this.session.user.preferences.serialized)\\n    )\\n    (hash\\n      urlStateChange=this.handleUrlStateChangeEvent\\n      setDeviceState=this.handleSetDeviceStateEvent\\n      navigationChange=this.handleNavigationChangeEvent\\n      activeVcChange=this.handleActiveVcChange\\n      onFleetFavoritesChange=this.handleOnFleetFavoritesChangeEvent\\n      raiseError=this.handleRaiseErrorEvent\\n      createResolvedUrl=this.handleCreateResolvedUrl\\n      deleteResolvedUrl=this.handleDeleteResolvedUrl\\n      createTicket=this.handleOpenTicketsEvent\\n    )\\n  }}\\n{{else if this.isError}}\\n  <Alert @type=\\\"danger\\\" @dismissible={{false}}>\\n    <:header>\\n      {{t \\\"screen.internal-view.loading-failed.title\\\"}}\\n    </:header>\\n    <:body>\\n      <p>\\n        {{t \\\"screen.internal-view.loading-failed.explanation\\\"}}\\n      </p>\\n    </:body>\\n  </Alert>\\n{{else}}\\n  <Spinner @size=\\\"md\\\" />\\n{{/if}}\", {\"contents\":\"{{did-update-helper (perform this.prepare) @configuredComponent.id}}\\n\\n{{#if this.isReady}}\\n  {{add-event-listener-to-element\\n    (create-element\\n      this.customElementName\\n      accessTokens=(json-stringify this.accessTokens)\\n      urlState=this.urlState\\n      deviceState=this.deviceState\\n      hostUrl=this.hostUrl\\n      resolvedUrls=(json-stringify this.resolvedUrls)\\n      embedUrl=this.embedUrl\\n      readOnly=@readOnly\\n      instanceConfiguration=(json-stringify this.instanceConfiguration)\\n      shouldShowTooltip=this.shouldShowTooltip\\n      preferences=(json-stringify this.session.user.preferences.serialized)\\n    )\\n    (hash\\n      urlStateChange=this.handleUrlStateChangeEvent\\n      setDeviceState=this.handleSetDeviceStateEvent\\n      navigationChange=this.handleNavigationChangeEvent\\n      activeVcChange=this.handleActiveVcChange\\n      onFleetFavoritesChange=this.handleOnFleetFavoritesChangeEvent\\n      raiseError=this.handleRaiseErrorEvent\\n      createResolvedUrl=this.handleCreateResolvedUrl\\n      deleteResolvedUrl=this.handleDeleteResolvedUrl\\n      createTicket=this.handleOpenTicketsEvent\\n    )\\n  }}\\n{{else if this.isError}}\\n  <Alert @type=\\\"danger\\\" @dismissible={{false}}>\\n    <:header>\\n      {{t \\\"screen.internal-view.loading-failed.title\\\"}}\\n    </:header>\\n    <:body>\\n      <p>\\n        {{t \\\"screen.internal-view.loading-failed.explanation\\\"}}\\n      </p>\\n    </:body>\\n  </Alert>\\n{{else}}\\n  <Spinner @size=\\\"md\\\" />\\n{{/if}}\",\"moduleName\":\"client-app-omnivise-web/components/visualization-component-renderer.hbs\",\"parseOptions\":{\"srcName\":\"client-app-omnivise-web/components/visualization-component-renderer.hbs\"}});\nimport { assert } from '@ember/debug';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { isPresent } from '@ember/utils';\nimport Component from '@glimmer/component';\nimport { tracked } from '@glimmer/tracking';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport config from 'client-app-omnivise-web/config/environment';\nimport Ember from 'ember';\nimport { all } from 'ember-concurrency';\nimport { task } from 'ember-concurrency-decorators';\nimport { TrackedSet } from 'tracked-built-ins';\nimport fetch from 'fetch';\nimport getApiUrl from 'client-app-omnivise-web/utils/get-api-url';\n\nconst URL_STATE_MAX_LENGTH = 500;\nconst DEVICE_STATE_MAX_LENGTH = 5000;\nconst INSTANCE_CONFIGURATION_URL = 'env';\n\n/**\n * Returns the SHA-1 hash for a given string.\n *\n * This utility function is highly inspired by Mozilla Developer Network:\n * https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest\n *\n * @param {string} str\n * @returns {string}\n */\nasync function hashString(str) {\n  const encoder = new TextEncoder();\n  const data = encoder.encode(str);\n  const hashBuffer = await crypto.subtle.digest('SHA-1', data);\n  const hashArray = Array.from(new Uint8Array(hashBuffer));\n  const hashHex = hashArray\n    .map((b) => b.toString(16).padStart(2, '0'))\n    .join('');\n  return hashHex;\n}\n\nexport default class VisualizationComponentRenderer extends Component {\n  @service('omnivise-tickets') omniviseTickets;\n  @tracked customElementName;\n  @tracked isError = false;\n  @tracked isReady = false;\n  @tracked visualizationComponent;\n  @tracked instanceConfigurationResult = {};\n  resolvedUrlsRequests = new TrackedSet();\n\n  @service router;\n  @service session;\n  @service notification;\n  @service('url-state') urlStateService;\n  @service('device-state') deviceStateService;\n  @service('show-tooltip') showTooltipService;\n\n  get accessTokens() {\n    const { componentDescriptor } = this.args.configuredComponent;\n    const { authScopes } = componentDescriptor.getProperties('authScopes');\n    const accessTokens = this.session.accessTokens;\n    return authScopes.length > 0\n      ? Object.fromEntries(\n          authScopes.map((scope) => {\n            return [scope, accessTokens[scope]];\n          }),\n        )\n      : null;\n  }\n\n  get nonPrefixedConfiguredComponentId() {\n    return this.args.configuredComponent.id.replace(\n      `${this.viewRoute.params.view_id}_`,\n      '',\n    );\n  }\n\n  /**\n   * URL State for this visualization component.\n   *\n   * The URL state might be either a string or undefined.\n   */\n  get urlState() {\n    const { urlStateForAllConfiguredComponents } = this;\n    const urlState =\n      urlStateForAllConfiguredComponents[this.nonPrefixedConfiguredComponentId];\n    return urlState;\n  }\n\n  get instanceConfiguration() {\n    return Object.assign(\n      {},\n      config.instanceConfiguration,\n      this.instanceConfigurationResult,\n    );\n  }\n\n  get shouldShowTooltip() {\n    return this.showTooltipService.shouldShowTooltip.toString();\n  }\n\n  get deviceState() {\n    const deviceState = this.deviceStateService.deviceStateFor(\n      this.nonPrefixedConfiguredComponentId,\n    );\n    return deviceState;\n  }\n\n  set urlState(value) {\n    const { urlStateForAllConfiguredComponents: oldState } = this;\n    const newState = Object.assign({}, oldState);\n    // The argument MUST be either a string representing the state or null to\n    // reset the state.\n    if (value === null) {\n      delete newState[this.nonPrefixedConfiguredComponentId];\n    } else {\n      newState[this.nonPrefixedConfiguredComponentId] = value;\n    }\n    this.dispatchStateToView(newState);\n  }\n\n  /**\n   * The URL state for all configured components.\n   *\n   * It's persisted in the URL as query parameter `vcState`. The value of the\n   * query parameter is a key-value map. The key is the ID of a configured\n   * component. The value is the current URL state for that configured\n   * component.\n   *\n   * The query parameter is registered on the `view` route.\n   */\n  get urlStateForAllConfiguredComponents() {\n    const { viewRoute } = this;\n    const { queryParams } = viewRoute;\n    const { state: encodedUrlStates } = queryParams;\n\n    return encodedUrlStates ? Object.freeze(JSON.parse(encodedUrlStates)) : {};\n  }\n\n  @action\n  handleUrlStateChangeEvent(event) {\n    const { detail: value } = event;\n    if (value && value.length > URL_STATE_MAX_LENGTH) {\n      logErrorUtil.logError('A maximum length of urlState exceeded');\n    } else {\n      this.urlState = value;\n    }\n  }\n\n  @action\n  handleOpenTicketsEvent(event) {\n    const { detail } = event;\n    this.omniviseTickets.eventDetail = detail;\n    this.omniviseTickets.openTicketDialog();\n    this.omniviseTickets.openTicketCreationForm();\n  }\n\n  @action\n  handleSetDeviceStateEvent(event) {\n    const { detail: value } = event;\n    if (value && value.length > DEVICE_STATE_MAX_LENGTH) {\n      logErrorUtil.logError('A maximum length of urlState exceeded');\n    } else {\n      this.deviceStateService.updateDeviceStatesPerCC(\n        this.nonPrefixedConfiguredComponentId,\n        value,\n      );\n    }\n  }\n\n  @action\n  handleOnFleetFavoritesChangeEvent() {\n    this.notification.refreshNotifications();\n  }\n\n  @action\n  handleRaiseErrorEvent(event) {\n    const { detail: errorMessage } = event;\n    const cc = this.args.configuredComponent;\n\n    logErrorUtil.logRaiseError(errorMessage, {\n      urlState: this.urlState ?? 'none',\n      instanceConfiguration: this.instanceConfiguration,\n      moduleId: cc.id,\n      vcId: cc.get('componentDescriptor.id'),\n      vcVersion: cc.get('componentDescriptor.version'),\n    });\n  }\n\n  @action\n  async handleNavigationChangeEvent(event) {\n    const { view, urlStates } = event.detail;\n\n    if (!view) {\n      logErrorUtil.logError('Argument for view is mandatory');\n      return;\n    }\n\n    if (view && typeof view !== 'string') {\n      logErrorUtil.logError(\n        `View argument must be string, ${typeof view} given`,\n      );\n      return;\n    }\n\n    if (urlStates && typeof urlStates !== 'object') {\n      logErrorUtil.logError(\n        `If argument for urlStates exist it must be object, ${typeof urlStates} given`,\n      );\n      return;\n    }\n\n    const newUrlState = Object.assign(\n      {},\n      this.urlStateService.urlStateFor(view),\n    );\n\n    if (urlStates) {\n      for (const [configuredComponentId, value] of Object.entries(urlStates)) {\n        if (typeof value !== 'string' && value !== null) {\n          logErrorUtil.logError(\n            `urlStates ${configuredComponentId} value must be string or null, ${typeof value} given`,\n          );\n          return;\n        }\n        if (typeof value === 'string' && value.length > 500) {\n          // log to Sentry\n          logErrorUtil.logError(\n            `urlStates ${configuredComponentId} value must be equal to or less than 500 characters. Given string has ${value.length} characters`,\n          );\n          return;\n        }\n      }\n\n      // The argument MUST be either a string representing the state or null to\n      // reset the state.\n      Object.keys(urlStates).forEach((configuredComponentId) => {\n        // construct new url state\n        if (urlStates[configuredComponentId] === null) {\n          delete newUrlState[configuredComponentId];\n        } else {\n          newUrlState[configuredComponentId] = urlStates[configuredComponentId];\n        }\n      });\n    }\n\n    this.dispatchStateToView(newUrlState, view);\n  }\n\n  @action\n  async handleActiveVcChange(event) {\n    const { component, urlStates } = event.detail;\n\n    if (!component) {\n      logErrorUtil.logError('Argument for `component` is mandatory');\n      return;\n    }\n\n    if (component && typeof component !== 'string') {\n      logErrorUtil.logError(\n        `Component argument must be string, ${typeof component} given`,\n      );\n      return;\n    }\n\n    if (urlStates && typeof urlStates !== 'object') {\n      logErrorUtil.logError(\n        `If argument for urlStates exist it must be object, ${typeof urlStates} given`,\n      );\n      return;\n    }\n\n    const newUrlState = Object.assign(\n      {},\n      this.urlStateService.urlStateFor(this.viewRoute),\n    );\n\n    if (urlStates) {\n      for (const [configuredComponentId, value] of Object.entries(urlStates)) {\n        if (typeof value !== 'string' && value !== null) {\n          logErrorUtil.logError(\n            `urlStates ${configuredComponentId} value must be string or null, ${typeof value} given`,\n          );\n          return;\n        }\n        if (typeof value === 'string' && value.length > 500) {\n          // log to Sentry\n          logErrorUtil.logError(\n            `urlStates ${configuredComponentId} value must be equal to or less than 500 characters. Given string has ${value.length} characters`,\n          );\n          return;\n        }\n      }\n\n      // The argument MUST be either a string representing the state or null to\n      // reset the state.\n      Object.keys(urlStates).forEach((configuredComponentId) => {\n        // construct new url state\n        if (urlStates[configuredComponentId] === null) {\n          delete newUrlState[configuredComponentId];\n        } else {\n          newUrlState[configuredComponentId] = urlStates[configuredComponentId];\n        }\n      });\n    }\n\n    const stateFormatted =\n      Object.keys(newUrlState).length > 0\n        ? JSON.stringify(newUrlState)\n        : undefined;\n\n    this.router.transitionTo({\n      queryParams: {\n        state: stateFormatted,\n        avc: component,\n      },\n    });\n  }\n\n  // 3 cases:\n  // No URLState passed = set same state as it is right now\n  // URLState empty = reset URLState to nothing\n  // Some URLState = prepare for it\n  // If viewId and ccId not passed\n  @action\n  handleCreateResolvedUrl(event) {\n    const { view, urlStates } = event.detail;\n\n    if (!this.validateResolveUrlParams(view, urlStates)) {\n      return;\n    }\n\n    this.resolvedUrlsRequests.add({ view, urlStates });\n  }\n\n  @action handleDeleteResolvedUrl(event) {\n    const { view, urlStates } = event.detail;\n\n    if (!this.validateResolveUrlParams(view, urlStates)) {\n      return;\n    }\n\n    this.resolvedUrlsRequests.forEach((pair) => {\n      const sameView = pair.view === view;\n\n      // NOTE: this is not perfect, and order dependent if urlStates is an object.\n      // But it gives good performance and we already require same order of fields in urlStates\n      // object. Need improvement in future.\n      const sameUrlStates =\n        JSON.stringify(pair.urlStates) === JSON.stringify(urlStates);\n\n      if (sameView && sameUrlStates) {\n        this.resolvedUrlsRequests.delete(pair);\n      }\n    });\n  }\n\n  validateResolveUrlParams(view, urlStates) {\n    // Validate view param\n    if (isPresent(view) && typeof view !== 'string') {\n      logErrorUtil.logError(\n        `View argument must be string, ${typeof view} given`,\n      );\n      return false;\n    }\n\n    // Validate urlStates\n    if (\n      urlStates &&\n      !(typeof urlStates === 'object' || typeof urlStates === 'string')\n    ) {\n      logErrorUtil.logError(\n        `If argument for urlStates exist it must be object or string, ${typeof urlStates} given`,\n      );\n      return false;\n    }\n\n    if (urlStates && typeof urlStates === 'object') {\n      for (const [configuredComponentId, value] of Object.entries(urlStates)) {\n        if (typeof value !== 'string' && value !== null) {\n          logErrorUtil.logError(\n            `urlStates ${configuredComponentId} value must be string or null, ${typeof value} given`,\n          );\n          return false;\n        }\n        if (typeof value === 'string' && value.length > URL_STATE_MAX_LENGTH) {\n          // log to Sentry\n          logErrorUtil.logError(\n            `urlStates ${configuredComponentId} value must be equal to or less than ${URL_STATE_MAX_LENGTH} characters. Given string has ${value.length} characters`,\n          );\n          return false;\n        }\n      }\n    }\n\n    return true;\n  }\n\n  get resolvedUrls() {\n    const resolvedUrlsMap = {};\n    for (const resolvedUrlsRequest of this.resolvedUrlsRequests) {\n      const key = this.calculateUrlForId(resolvedUrlsRequest);\n      const resolvedUrls = `${this.hostUrl}${this.calculateUrlFor(\n        resolvedUrlsRequest,\n      )}`;\n      resolvedUrlsMap[key] = resolvedUrls;\n    }\n    return resolvedUrlsMap;\n  }\n\n  calculateUrlFor(resolvedUrlsRequest) {\n    let { view, urlStates } = resolvedUrlsRequest;\n    let currentUrlStates = {};\n    // default to current view if view is not set\n    if (!view) {\n      view = this.router.currentRoute.params.view_id;\n    }\n    // initialize urlStates if not passed\n    if (urlStates === undefined) {\n      urlStates = {};\n    }\n\n    // reset state if urlStates passed as null;\n    if (urlStates !== null) {\n      currentUrlStates = this.urlStateService.urlStateFor(view) ?? {};\n    }\n\n    // apply url state for the component descriptor itself\n    if (typeof urlStates === 'string') {\n      urlStates = {\n        [this.nonPrefixedConfiguredComponentId]: urlStates,\n      };\n    }\n\n    // merge url states with current url states\n    const mergedUrlStates = Object.assign(currentUrlStates, urlStates);\n    const state =\n      Object.keys(mergedUrlStates).length > 0\n        ? JSON.stringify(mergedUrlStates)\n        : undefined;\n\n    return this.router.urlFor('auth.view', view, {\n      queryParams: {\n        state,\n      },\n    });\n  }\n\n  calculateUrlForId(resolvedUrlsRequest) {\n    // normalize order of keys in object\n    return JSON.stringify(resolvedUrlsRequest);\n  }\n\n  /**\n   * `RouteInfo` for the `auth.view` route\n   */\n  get viewRoute() {\n    const viewRoute = this.router.currentRoute.find(\n      (routeInfo) => routeInfo.name === 'auth.view',\n    );\n\n    assert(\n      '<VisualizationComponentRenderer /> component must only be used on view route',\n      viewRoute,\n    );\n\n    return viewRoute;\n  }\n\n  get hostUrl() {\n    return window.location.origin;\n  }\n\n  constructor() {\n    super(...arguments);\n\n    this.prepare.perform();\n  }\n\n  get embedUrl() {\n    return this.args.configuredComponent.embedUrl;\n  }\n\n  /**\n   * Execute all bootstrapping tasks required before a visualization component\n   * defined by a component descriptor can be rendered.\n   */\n  @task\n  *prepare() {\n    // lazy-load visualization component\n    this.isReady = false;\n    yield all([\n      this.loadVisualizationComponent.perform(),\n      this.ensureAccessTokensForAuthScopes.perform(),\n      this.calculateCustomElementName.perform(),\n      this.loadInstanceConfiguration.perform(),\n    ]);\n\n    // register it as a custom element\n    this.registerVisualizationComponent();\n\n    this.isReady = true;\n  }\n\n  @task\n  *loadInstanceConfiguration() {\n    const { componentDescriptor } = this.args.configuredComponent;\n    const { instanceConfiguration } = componentDescriptor.getProperties(\n      'instanceConfiguration',\n    );\n\n    if (!instanceConfiguration.length) {\n      return true;\n    }\n\n    const url = new URL(getApiUrl(INSTANCE_CONFIGURATION_URL));\n    url.search = new URLSearchParams({\n      keys: instanceConfiguration.map((ic) => ic.name).join(','),\n    });\n\n    try {\n      const response = yield fetch(url, {\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.session.ownAccessToken}`,\n        },\n      });\n\n      if (response.ok) {\n        this.instanceConfigurationResult = yield response.json();\n        return true;\n      }\n      const errorText = yield response.text();\n      logErrorUtil.logError(errorText);\n      return false;\n    } catch (error) {\n      const errorText = 'Failed to load instance configuration, ' + error;\n      logErrorUtil.logError(errorText);\n      return false;\n    }\n  }\n\n  @task\n  *ensureAccessTokensForAuthScopes() {\n    const { componentDescriptor } = this.args.configuredComponent;\n    const { authScopes } = componentDescriptor.getProperties('authScopes');\n    yield all(\n      authScopes.map(async (authScope) => {\n        await this.session.ensureAccessTokenFor(authScope);\n      }),\n    );\n  }\n\n  /**\n   * Lazy-load a visualization component\n   */\n  @task\n  *loadVisualizationComponent() {\n    const { componentDescriptor } = this.args.configuredComponent;\n    const { downloadUrl } = componentDescriptor.getProperties('downloadUrl');\n\n    if (\n      !downloadUrl ||\n      typeof downloadUrl !== 'string' ||\n      downloadUrl.length === 0\n    ) {\n      // what state is configuredComponent in?\n      // eslint-disable-next-line no-console\n      console.error(\n        'Component descriptor has no downloadUrl and is not valid',\n        this.args.configuredComponent,\n        componentDescriptor,\n      );\n\n      logErrorUtil.logError(\n        `Component descriptor has no downloadUrl and is not valid -\n        configuredComponent: ${JSON.stringify(this.args?.configuredComponent)}\n        componentDescriptor: ${JSON.stringify(componentDescriptor)}`,\n      );\n\n      try {\n        // If our theory is correct, we have an expired token.\n        // Lets try to log the expired token details:\n        const { iat, exp } = this.session.ownClaims;\n        const remaining = exp - iat;\n        logErrorUtil.logError(\n          `The OWC session has expired and the component descriptor has no\n          downloadUrl. The token was issued at: ${iat} and expires at:\n          ${exp}. It has ${remaining} seconds remaining.`,\n        );\n      } catch (error) {\n        // eslint-disable-next-line no-console\n        console.error('Failed to log expired session error', error);\n        logErrorUtil.logError('Failed to log expired session error', error);\n      }\n\n      // display an alert message to the user and when the user clicks the alert message, reload the page\n      alert('Your session has expired. The page will be reloaded.');\n      window.location.reload();\n      return;\n    }\n\n    let ecmaScriptModule;\n    try {\n      if (Ember.testing) {\n        // Ember CLI does not serve tests from root folder if run with\n        // `ember serve`. We need to determine the folder name from\n        // window.location in that case as it's dynamically changing.\n        const folder = window.location.pathname.substr(\n          0,\n          window.location.pathname.indexOf('/tests'),\n        );\n        ecmaScriptModule = yield import(\n          `//${window.location.host}${folder}${downloadUrl}`\n        );\n      } else {\n        const [schema, host] =\n          config.visualizationComponentHostURL.split('://');\n        if (schema === 'https') {\n          ecmaScriptModule = yield import(`https://${host}${downloadUrl}`);\n        } else {\n          ecmaScriptModule = yield import(`http://${host}${downloadUrl}`);\n        }\n      }\n    } catch (error) {\n      // TODO: Distinguish between different errors to provide a better user\n      //       experience. For example we may want to show a different message\n      //       if it failed\n      //       a) due to network connectivity issue or\n      //       b) because the file referenced as `downloadUrl` does not exist.\n      //       In the first case we may want to ask the user to check the\n      //       internet connection. In the second case we may want to inform\n      //       the user that something went wrong on our end, that the error\n      //       has been locked and that he should retry later.\n      this.isError = true;\n\n      // TODO: Do not rethrow network connectivity errors as there is no value\n      //       for us to log them.\n      throw error;\n    }\n\n    const { default: visualizationComponent } = ecmaScriptModule;\n    this.visualizationComponent = visualizationComponent;\n  }\n\n  dispatchStateToView(state, view) {\n    const stateFormatted =\n      Object.keys(state).length > 0 ? JSON.stringify(state) : undefined;\n\n    if (view) {\n      this.router.transitionTo('auth.view', view, {\n        queryParams: {\n          state: stateFormatted,\n        },\n      });\n    } else {\n      this.router.transitionTo({\n        queryParams: {\n          state: stateFormatted,\n        },\n      });\n    }\n  }\n\n  /**\n   * Register a visualization component as a custom element\n   */\n  registerVisualizationComponent() {\n    const { customElementName, visualizationComponent } = this;\n    assert(\n      'Visualization component must be loaded before it could be registered',\n      visualizationComponent,\n    );\n\n    const { customElements } = window;\n\n    // check if the custom element is already defined\n    if (customElements.get(customElementName) !== undefined) {\n      assert(\n        'Another visualization component has already been registered with this name',\n        customElements.get(customElementName) === visualizationComponent,\n      );\n\n      return;\n    }\n\n    // register custom element\n    customElements.define(customElementName, visualizationComponent);\n  }\n\n  /**\n   * Calculates the tag name used for the custom element.\n   *\n   * The tag name must be unique for each version of a visualization component.\n   * It must be the same for a given version of a visualization component\n   * regardless of the channel this version is referenced by.\n   *\n   * To achieve both, the tag name is derived from the `downloadUrl` of the\n   * component descriptor. Two different versions of a visualization component\n   * have different `downloadUrl`s. The `downloadUrl` is independent of the\n   * channel it is used for.\n   *\n   * The `downloadUrl` contains characters, which are not allowed in a tag\n   * name. To encode it for usage in tag name without introducing the risk\n   * of collisions, a hash of the download URL is used.\n   *\n   * To ease debugging it is prefixed by `visualization-component-` and the\n   * name of the visualization component.\n   *\n   * E.g. for a `component-descriptors` with ID `foo@next` and a `downloadUrl`\n   * `/foo/index-abc123.js` the custom element name is expected to be\n   * `visualization-component-foo-dee0fab8bd852021ac3365a66baa1588783d355a`.\n   *\n   * Browser provides native APIs to calculate a hash these days. But these\n   * APIs are async. Therefore a getter can not be used.\n   */\n  @task\n  *calculateCustomElementName() {\n    const { componentDescriptor } = this.args.configuredComponent;\n    const { downloadUrl, id } = componentDescriptor.getProperties(\n      'downloadUrl',\n      'id',\n    );\n    // The name of a visualization component is the ID of the component\n    // descriptor resource, which represents it, without the channel suffix.\n    // A visualization component with the name `foo` may have the following\n    // component descriptor IDs: `foo`, `foo@next` and `foo@latest`\n    const visualizationComponentName = id.includes('@')\n      ? id.substring(0, id.indexOf('@'))\n      : id;\n    // Download URL contains characters, which are not allowed in a\n    // tag name. To use it as part of the tag name while still ensuring\n    // that it is unique, we hash it.\n    const downloadUrlHash = yield hashString(downloadUrl);\n    this.customElementName = `visualization-component-${visualizationComponentName}-${downloadUrlHash}`;\n  }\n}\n","export default function () {\n  return {\n    far: ['bell', 'circle-user'],\n    fas: ['plus', 'file-lines', 'right-from-bracket'],\n  };\n}\n","/* eslint-disable ember/no-controllers */\nimport Controller from '@ember/controller';\nimport { tracked } from '@glimmer/tracking';\nimport { service } from '@ember/service';\n\nimport { keyResponder, onKey } from 'ember-keyboard';\n\n@keyResponder\nexport default class ApplicationController extends Controller {\n  @service currentPage;\n\n  @tracked isHeaderFooterVisible = true;\n\n  @onKey('alt+h')\n  toggleHeaderFooterVisibility() {\n    if (this.currentPage.isSomeKindOfOESView) {\n      this.isHeaderFooterVisible = !this.isHeaderFooterVisible;\n    }\n  }\n}\n","/* eslint-disable ember/no-controllers */\nimport Controller from '@ember/controller';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\n\nexport default class AuthViewError extends Controller {\n  @service router;\n  @service session;\n\n  get userPreferences() {\n    return this.session.user?.preferences;\n  }\n\n  @action\n  async removeDefaultAndGoToHomePage() {\n    const defaultPage = this.userPreferences?.defaultPage;\n\n    if (defaultPage) {\n      await this.removeDefault();\n    }\n    this.router.transitionTo('/');\n  }\n\n  async removeDefault() {\n    this.userPreferences.defaultPage = null;\n    await this.userPreferences.save();\n  }\n}\n","import Controller from '@ember/controller';\n\nexport default class AuthView extends Controller {\n  queryParams = ['state', 'avc'];\n\n  // TODO: by this call we will know if EOS view\n  get isOESView() {\n    return this.model.internalView.id.startsWith('--oes--');\n  }\n}\n","export default {\n  time: {\n    hhmmss: {\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric',\n    },\n  },\n  date: {\n    mmddyyhhmmss: {\n      month: 'numeric',\n      day: 'numeric',\n      year: 'numeric',\n      hour: 'numeric',\n      minute: 'numeric',\n      second: 'numeric',\n      hourCycle: 'h24',\n    },\n  },\n  number: {\n    compact: { notation: 'compact' },\n    EUR: {\n      style: 'currency',\n      currency: 'EUR',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    },\n    USD: {\n      style: 'currency',\n      currency: 'USD',\n      minimumFractionDigits: 2,\n      maximumFractionDigits: 2,\n    },\n  },\n};\n","import { helper } from '@ember/component/helper';\nimport { assert } from '@ember/debug';\n\nexport function addEventListenerToElement([element, functions]) {\n  assert(\n    'First argument must be an HTML element',\n    element instanceof HTMLElement,\n  );\n  assert(\n    'Second argument must be hash of functions',\n    typeof functions === 'object',\n  );\n  assert(\n    'Second argument must have at least one function',\n    Object.keys(functions).length !== 0,\n  );\n  assert(\n    'Second argument must have functions only',\n    Object.values(functions).every((fnValue) => typeof fnValue === 'function'),\n  );\n  Object.keys(functions).forEach((fn) => {\n    element.addEventListener(fn, functions[fn]);\n  });\n\n  // return element to make usage in template more ergonomic\n  return element;\n}\n\nexport default helper(addEventListenerToElement);\n","import { helper } from '@ember/component/helper';\nimport config from '../config/environment';\nimport {\n  shaRegExp,\n  versionRegExp,\n  versionExtendedRegExp,\n} from 'ember-cli-app-version/utils/regexp';\n\nexport function appVersion(_, hash = {}) {\n  const version = config.APP.version;\n  // e.g. 1.0.0-alpha.1+4jds75hf\n\n  // Allow use of 'hideSha' and 'hideVersion' For backwards compatibility\n  let versionOnly = hash.versionOnly || hash.hideSha;\n  let shaOnly = hash.shaOnly || hash.hideVersion;\n\n  let match = null;\n\n  if (versionOnly) {\n    if (hash.showExtended) {\n      match = version.match(versionExtendedRegExp); // 1.0.0-alpha.1\n    }\n    // Fallback to just version\n    if (!match) {\n      match = version.match(versionRegExp); // 1.0.0\n    }\n  }\n\n  if (shaOnly) {\n    match = version.match(shaRegExp); // 4jds75hf\n  }\n\n  return match ? match[0] : version;\n}\n\nexport default helper(appVersion);\n","import Helper from '@ember/component/helper';\nimport { assert } from '@ember/debug';\n\nexport default class CreateElementHelper extends Helper {\n  element = null;\n\n  compute([tagName = 'div'], attributes) {\n    // initialize element on first computation\n    if (this.element === null) {\n      this.element = document.createElement(tagName);\n    }\n\n    const { element } = this;\n\n    assert(\n      'Tag name passed to create element helper must not change over time.',\n      tagName.toUpperCase() === element.tagName,\n    );\n\n    for (const attribute in attributes) {\n      const value = attributes[attribute];\n\n      assert(\n        `Values for attributes passed to {{create-element}} helper must be either strings, boolean, null or undefined. ${typeof value} given for attribute ${attribute}`,\n        ['string', 'boolean'].includes(typeof value) ||\n          [null, undefined].includes(value),\n      );\n\n      // update attribute\n      if (value === null || value === undefined || value === false) {\n        // remove attribute if value is `null`, `undefined` or `false`\n        if (element.hasAttribute(attribute)) {\n          element.removeAttribute(attribute);\n        }\n      } else {\n        // update attribute if needed\n        const serializedValue =\n          typeof value === 'object' ? JSON.stringify(value) : value;\n\n        if (serializedValue !== element.getAttribute(attribute)) {\n          element.setAttribute(attribute, serializedValue);\n        }\n      }\n    }\n\n    return element;\n  }\n}\n","import { helper } from '@ember/component/helper';\n\nexport function jsonStringify([value]) {\n  if (value === null || value === undefined) {\n    return null;\n  }\n\n  return JSON.stringify(value);\n}\n\nexport default helper(jsonStringify);\n","import { helper } from '@ember/component/helper';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\n\nexport function logError([error]) {\n  logErrorUtil.logError(error);\n}\n\nexport default helper(logError);\n","import { helper } from '@ember/component/helper';\n\nexport default helper(function moduleBadge([styles]) {\n  if (styles !== 'paid' && styles !== 'free') {\n    throw `${styles} is not a valid style for a modules badge. Only 'paid'  and 'free' are supported`;\n  }\n  return styles === 'paid' ? 'bg-warning text-dark' : 'bg-secondary';\n});\n","import pluralize from 'ember-inflector/lib/helpers/pluralize';\nexport default pluralize;\n","import singularize from 'ember-inflector/lib/helpers/singularize';\nexport default singularize;\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n  name = config.APP.name;\n  version = config.APP.version;\n}\n\nexport default {\n  name: 'App Version',\n  initialize: initializerFactory(name, version),\n};\n","\n        export default {\n          name: 'ember-cli-mirage',\n          initialize() {}\n        };\n      ","import 'ember-data';\n\nimport setupContainer from 'ember-data/setup-container';\n\n/*\n  This code initializes EmberData in an Ember application.\n*/\nexport default {\n  name: 'ember-data',\n  initialize: setupContainer,\n};\n","import 'ember-css-modules/templates/static-helpers-hack';\n\nexport default {\n  initialize() {\n    // This file exists to support Embroider's `staticHelpers` option.\n    // ECM relies on the existence of a `local-class` helper, but that\n    // helper may never be statically referenced in an application template.\n    // Instead, we reference it in our own template, and then import that\n    // template from a file (an initializer) that we know must always\n    // be loaded in order to boot the app and/or run tests.\n  },\n};\n","import ENV from '../config/environment';\nimport Config from 'ember-bootstrap/config';\nimport { registerLibrary } from 'ember-bootstrap/version';\n\nexport function initialize(/* container, application */) {\n  Config.load(ENV['ember-bootstrap'] || {});\n  registerLibrary();\n}\n\nexport default {\n  name: 'load-bootstrap-config',\n  initialize,\n};\n","/* exists only for things that historically used \"after\" or \"before\" */\nexport default {\n  name: 'ember-data',\n  initialize() {},\n};\n","import Model, { attr } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr('string') title;\n  @attr('string') description;\n  @attr('string') category;\n  @attr({ defaultValue: () => [] }) assets;\n  @attr('date') createdAt;\n  @attr('date') updatedAt;\n  @attr('date') publishedAt;\n}\n","import Model, { attr, hasMany } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr({ defaultValue: () => [] }) authScopes;\n  @attr({ defaultValue: () => [] }) instanceConfiguration;\n  @attr('string') downloadUrl;\n  @attr('string') version;\n  @attr('date') createdAt;\n  @attr('date') updatedAt;\n\n  @hasMany('configured-component', {\n    inverse: 'componentDescriptor',\n    async: true,\n  })\n  configuredComponents;\n\n  get releaseChannel() {\n    const { id } = this;\n    if (id.includes('@next')) {\n      return 'next';\n    } else if (id.includes('@latest')) {\n      return 'latest';\n    } else if (id.match(/[@](\\d+\\.)?(\\d+\\.)?(\\*|\\d+)/)) {\n      return `fixed`;\n    }\n    return 'stable';\n  }\n}\n","import Model, { belongsTo, attr } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr('string') embedUrl;\n\n  @belongsTo('configured-widget', {\n    inverse: 'configuredComponents',\n    async: true,\n  })\n  configuredWidget;\n\n  @belongsTo('component-descriptor', {\n    inverse: 'configuredComponents',\n    async: true,\n  })\n  componentDescriptor;\n\n  @attr('string') ccType;\n}\n","import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\n\nexport default class extends Model {\n  @belongsTo('view', {\n    polymorphic: true,\n    async: true,\n    inverse: 'configuredWidgets',\n  })\n  view;\n\n  @hasMany('configured-component', {\n    inverse: 'configuredWidget',\n    async: true,\n  })\n  configuredComponents;\n\n  @attr('string')\n  widgetType;\n}\n","import { attr } from '@ember-data/model';\nimport ViewModel from 'client-app-omnivise-web/models/view';\n\nexport default class extends ViewModel {\n  @attr('string') url;\n}\n","import { hasMany } from '@ember-data/model';\nimport ViewModel from 'client-app-omnivise-web/models/view';\n\nexport default class extends ViewModel {\n  @hasMany('configured-widget', {\n    inverse: 'view',\n    as: 'view',\n    async: true,\n  })\n  configuredWidgets;\n}\n","import Model, { attr, hasMany } from '@ember-data/model';\nimport { inject as service } from '@ember/service';\nimport normalizeLocaleToApi from 'client-app-omnivise-web/utils/get-normalized-locale';\n\nexport default class ModuleBadgeModel extends Model {\n  @service intl;\n\n  @attr('string') style;\n  @attr('string') 'text_de-DE';\n  @attr('string') 'text_en-US';\n\n  @hasMany('module', { inverse: 'moduleBadges', async: true }) modules;\n\n  get text() {\n    return this[`text_${normalizeLocaleToApi(this.intl.primaryLocale)}`];\n  }\n}\n","import Model from '@ember-data/model';\nimport { hasMany, attr } from '@ember-data/model';\nimport normalizeLocaleToApi from 'client-app-omnivise-web/utils/get-normalized-locale';\nimport { inject as service } from '@ember/service';\n\nexport default class ModuleCategoryModel extends Model {\n  @service intl;\n\n  @attr('string') 'title_en-US';\n  @attr('string') 'title_de-DE';\n  @hasMany('module', { inverse: 'moduleCategories', async: false }) modules;\n\n  get title() {\n    return this[`title_${normalizeLocaleToApi(this.intl.primaryLocale)}`];\n  }\n}\n","import Model, { attr, belongsTo } from '@ember-data/model';\nimport { inject as service } from '@ember/service';\nimport normalizeLocaleToApi from 'client-app-omnivise-web/utils/get-normalized-locale';\n\nexport default class extends Model {\n  @service intl;\n\n  // the following lines will be autogenerated by\n  // @localizedAttr benefits;\n  @attr({ defaultValue: () => [] }) 'benefits_de-DE';\n  @attr({ defaultValue: () => [] }) 'benefits_en-US';\n  @attr('string') contactEmail;\n  @attr('string') contactFirstName;\n  @attr('string') contactLastName;\n  @attr('string') contactPhoneNumber;\n  @attr({ defaultValue: () => [] }) images;\n\n  @belongsTo('module', { inverse: 'informationDetail', async: true }) module;\n\n  get benefits() {\n    return this[`benefits_${normalizeLocaleToApi(this.intl.primaryLocale)}`];\n  }\n  get contactFullName() {\n    return `${this.contactFirstName} ${this.contactLastName}`;\n  }\n}\n","import Model, { attr, belongsTo, hasMany } from '@ember-data/model';\nimport { inject as service } from '@ember/service';\nimport normalizeLocaleToApi from 'client-app-omnivise-web/utils/get-normalized-locale';\n\nexport default class extends Model {\n  @service intl;\n\n  @attr('string') 'description_de-DE';\n  @attr('string') 'description_en-US';\n  @attr('string') icon;\n  @attr('string') name;\n  @attr('string') hoverText;\n  @attr('boolean') readOnly;\n  @attr('date') createdAt;\n  @attr('date') updatedAt;\n  @attr({ defaultValue: () => ({}) }) moduleOptions;\n\n  @hasMany('module-badge', { inverse: 'modules', async: true }) moduleBadges;\n  @belongsTo('module-information-detail', { inverse: 'module', async: true })\n  informationDetail;\n  @hasMany('module-category', { inverse: 'modules', async: true })\n  moduleCategories;\n  @hasMany('view', {\n    inverse: 'module',\n    polymorphic: true,\n    async: true,\n  })\n  views;\n\n  get description() {\n    return this[`description_${normalizeLocaleToApi(this.intl.primaryLocale)}`];\n  }\n\n  get hasInformationDetail() {\n    // To avoid lazy loading\n    return !!this.belongsTo('informationDetail').id();\n  }\n}\n","import Model, { attr } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr('string')\n  description;\n\n  @attr('string')\n  timeStamp;\n\n  @attr('string')\n  notificationType;\n\n  @attr('boolean')\n  isRead;\n\n  @attr('string')\n  applicationTypeDescription;\n\n  @attr('string')\n  unitName;\n\n  @attr('string')\n  title;\n}\n","import Model, { attr, belongsTo } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr('string', {\n    defaultValue: () => {\n      return 'en-us';\n    },\n  })\n  locale;\n\n  @attr('string')\n  timezone;\n\n  @attr('string')\n  defaultPage;\n\n  @belongsTo('user', { async: false, inverse: 'preferences' })\n  user;\n\n  get serialized() {\n    return {\n      locale: this.locale,\n      timezone: this.timezone,\n      defaultPage: this.defaultPage,\n    };\n  }\n}\n","import { hasMany } from '@ember-data/model';\nimport ViewModel from 'client-app-omnivise-web/models/view';\nexport default class extends ViewModel {\n  @hasMany('configured-widget', {\n    inverse: 'view',\n    as: 'view',\n    async: true,\n  })\n  configuredWidgets;\n}\n","import Model, { attr, belongsTo } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr('string') email;\n\n  @belongsTo('preference', { async: false, inverse: 'user' })\n  preferences;\n}\n","import Model, { belongsTo, hasMany, attr } from '@ember-data/model';\n\nexport default class extends Model {\n  @attr('string') title;\n  @belongsTo('module', {\n    inverse: 'views',\n    async: true,\n    as: 'view',\n  })\n  module;\n\n  // NOTE: this must be defined here, even if we don't use it in external views\n  @hasMany('configured-widget', {\n    inverse: 'view',\n    as: null,\n    async: true,\n  })\n  configuredWidgets;\n}\n","import Modifier from 'ember-modifier';\nimport { inject as service } from '@ember/service';\n\nexport default class RestartUcEmbeddingsModifier extends Modifier {\n  @service userCentric;\n\n  modify(/*element, positional, named*/) {\n    this.userCentric.onRestartEmbeddings();\n  }\n}\n","import Modifier from 'ember-modifier';\nimport { inject as service } from '@ember/service';\n\nexport default class SaveRedirectUriModifier extends Modifier {\n  @service session;\n  @service router;\n\n  modify(/*element, positional, named*/) {\n    const currentRoute = this.router.currentRoute;\n    if (currentRoute) {\n      const { redirectUri } = currentRoute.queryParams;\n      if (redirectUri) {\n        this.session.redirectUri = redirectUri;\n      }\n    }\n  }\n}\n","import EmberRouter from '@ember/routing/router';\nimport config from 'client-app-omnivise-web/config/environment';\n\nexport default class Router extends EmberRouter {\n  location = config.locationType;\n  rootURL = config.rootURL;\n}\n\nRouter.map(function () {\n  this.route('auth', function () {\n    this.route('view', { path: '/v/:view_id' });\n  });\n  this.route('login');\n  this.route('licenses');\n\n  this.route('info', function () {\n    this.route('terms');\n    this.route('privacy');\n    this.route('corporate');\n    this.route('cookies');\n  });\n});\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class Application extends Route {\n  @service session;\n  @service userCentric;\n  @service intl;\n\n  @service('route-change') routeChangeService;\n\n  async beforeModel() {\n    try {\n      this.intl.setLocale(['en-us']);\n      // eslint-disable-next-line\n      console.log('application route');\n\n      // Ensure that a valid session is picked up. This also ensures that a\n      // valid access token for own trust zone is present.\n      await this.session.pickupSessionState();\n\n      if (this.session.isAuthenticated && this.session.redirectUri) {\n        await this.session.redirectToDestinationAfterAuthentication();\n      }\n    } catch (error) {\n      // eslint-disable-next-line\n      console.log('beforeModel application error', error);\n    }\n  }\n  afterModel() {\n    this.routeChangeService.listenForRouteChanges();\n\n    //Call the usercentric\n    this.userCentric.verifyUCEvents();\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class AuthRoute extends Route {\n  @service router;\n  @service session;\n  @service locale;\n  @service features;\n\n  async beforeModel(transition) {\n    if (!this.session.isTokenValid) {\n      this.session.redirectUri = transition.intent.url;\n      return this.router.transitionTo('login');\n    }\n    await this.session.loadOwnUser();\n    if (this.features.isEnabled('i18n')) {\n      this.locale.updateLocale();\n    }\n    return true;\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class AuthIndexRoute extends Route {\n  @service router;\n  @service session;\n  @service featuresManager;\n\n  async beforeModel() {\n    this.featuresManager.setFeatures();\n    return true;\n  }\n\n  afterModel() {\n    const defaultPage = this.session.user?.preferences?.defaultPage;\n\n    if (defaultPage) {\n      this.router.transitionTo(defaultPage);\n    }\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default class ViewErrorRoute extends Route {}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nconst DEFAULT_LOCALE = 'en-us';\nexport default class ViewRoute extends Route {\n  @service store;\n  @service router;\n  @service featuresManager;\n  @service locale;\n\n  queryParams = {\n    state: {\n      refreshModel: false,\n    },\n  };\n\n  async model(parameters) {\n    try {\n      const internalView = await this.store.findRecord(\n        'internal-view',\n        parameters.view_id,\n        {\n          include: [\n            'module',\n            'configuredWidgets.configuredComponents.componentDescriptor',\n          ].join(','),\n        },\n      );\n      const module = await internalView.module;\n      this.changeLocale(module.moduleOptions);\n      this.featuresManager.setFeatures(module.moduleOptions);\n      return { internalView };\n    } catch (e) {\n      if (e?.errors?.firstObject?.code === 403) {\n        this.router.transitionTo('auth');\n      }\n      throw e;\n    }\n  }\n\n  changeLocale(moduleOptions) {\n    let locale;\n    if (moduleOptions['multi-language'] === false) locale = DEFAULT_LOCALE;\n    this.locale.updateLocale(locale);\n  }\n}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\n\nexport default class IndexRoute extends Route {\n  @service router;\n\n  redirect() {\n    return this.router.transitionTo('auth.index');\n  }\n}\n","import Route from '@ember/routing/route';\n\nexport default class InfoCookiesRoute extends Route {}\n","import Route from '@ember/routing/route';\n\nexport default class InfoCorporateRoute extends Route {}\n","import Route from '@ember/routing/route';\n\nexport default class InfoPrivacyRoute extends Route {}\n","import Route from '@ember/routing/route';\n\nexport default class InfoTermsRoute extends Route {}\n","import Route from '@ember/routing/route';\n\nexport default class LicensesRoute extends Route {}\n","import Route from '@ember/routing/route';\nimport { inject as service } from '@ember/service';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\n\nexport default class LoginRoute extends Route {\n  @service session;\n  @service router;\n\n  focused = true;\n\n  async beforeModel(transition) {\n    if (this.session.isAuthenticated) {\n      // A valid Okta session exists. Redirect user either to given redirect URL or\n      // to default page for authenticated users.\n      this.isComingFromAuthenticatedRoute(transition)\n        ? transition.abort()\n        : this.session.redirectToDestinationAfterAuthentication();\n    } else {\n      // Try to get an OKTA session by redirecting to OKTA.\n      // If the OKTA server detects that the user has a valid SiemensID session,\n      // it will establish an OKTA session and redirect back to our application\n      try {\n        return await this.session.pickupSessionState();\n      } catch (error) {\n        // In case SiemensID or AzureAD sessions do not not exist proceed to login page\n        if (error.error !== 'login_required') {\n          logErrorUtil.logError(error);\n        }\n      }\n    }\n  }\n\n  isComingFromAuthenticatedRoute(transition) {\n    return transition.from?.name.startsWith('auth');\n  }\n\n  // User should be transitioned to /apps if he authenticates in another browser window.\n  // Observing localStorage for changes cause that one indicates that access token was\n  // changed inanother instance. Storage event is not fired for current instance.\n  onLocalStorageChanged({ key, newValue }) {\n    // ignore changes that aren't affecting access token or removing access token\n    if (key !== this.session.ownTrustZone || !newValue || this.focused) {\n      return;\n    }\n    this.router.transitionTo('auth');\n  }\n\n  onWindowFocus() {\n    if (!(this.isDestroyed || this.isDestroying)) {\n      this.focused = true;\n    }\n  }\n\n  onWindowBlur() {\n    if (!(this.isDestroyed || this.isDestroying)) {\n      this.focused = false;\n    }\n  }\n\n  activate() {\n    window.addEventListener('focus', this.onWindowFocus.bind(this));\n    window.addEventListener('blur', this.onWindowBlur.bind(this));\n    window.addEventListener('storage', this.onLocalStorageChanged.bind(this));\n  }\n\n  deactivate() {\n    window.removeEventListener('focus', this.onWindowFocus.bind(this));\n    window.removeEventListener('blur', this.onWindowBlur.bind(this));\n    window.removeEventListener(\n      'storage',\n      this.onLocalStorageChanged.bind(this),\n    );\n  }\n}\n","import DS from 'ember-data';\n\nexport default class Application extends DS.JSONAPISerializer.extend({}) {\n  keyForAttribute(key: string) {\n    return key;\n  }\n\n  keyForRelationship(key: string) {\n    return key;\n  }\n}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your serializers.\ndeclare module 'ember-data/types/registries/serializer' {\n  export default interface SerializerRegistry {\n    application: Application;\n  }\n}\n","import DS from 'ember-data';\n\nexport default class NotificationAlert extends DS.JSONAPISerializer.extend({}) {\n}\n// DO NOT DELETE: this is how TypeScript knows how to look up your serializers.\ndeclare module 'ember-data/types/registries/serializer' {\n  export default interface SerializerRegistry {\n    'notification-alert': NotificationAlert;\n  }\n}\n","import DS from 'ember-data';\n\nexport default class Preference extends DS.JSONAPISerializer.extend({}) {}\n\n// DO NOT DELETE: this is how TypeScript knows how to look up your serializers.\ndeclare module 'ember-data/types/registries/serializer' {\n  export default interface SerializerRegistry {\n    preference: Preference;\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport { assert } from '@ember/debug';\nimport { isPresent } from '@ember/utils';\n\nexport default class CurrentPageService extends Service {\n  @service intl;\n  @service router;\n  @service store;\n\n  // TODO: Needs to be refactored https://guides.emberjs.com/release/components/helper-functions/#toc_the-in-element-helper\n  get header() {\n    const { currentRouteName } = this.router;\n\n    if (currentRouteName.startsWith('auth.view')) {\n      const authViewRoute = this.router.currentRoute.find(\n        (route) => route.name === 'auth.view',\n      );\n\n      const { view_id: viewId } = authViewRoute.params;\n      const view = this.store.peekRecord('internal-view', viewId);\n      if (view) {\n        const moduleRef = view.belongsTo('module');\n        const moduleId = moduleRef.id();\n\n        let header = '';\n\n        if (isPresent(moduleId)) {\n          const module = this.store.peekRecord('module', moduleId);\n          header = module.name;\n        } else {\n          assert('The relationship is not loaded.');\n        }\n\n        return header;\n      }\n      return null;\n    }\n\n    return this.intl.t(`heading-for-module.${currentRouteName}`);\n  }\n\n  get isSomeKindOfOESView() {\n    return this.header.toLowerCase().includes('oes');\n  }\n\n  get hoverText() {\n    const { currentRouteName } = this.router;\n\n    if (currentRouteName.startsWith('auth.view')) {\n      const authViewRoute = this.router.currentRoute.find(\n        (route) => route.name === 'auth.view',\n      );\n\n      const { view_id: viewId } = authViewRoute.params;\n      const view = this.store.peekRecord('internal-view', viewId);\n      if (view) {\n        const moduleRef = view.belongsTo('module');\n        const moduleId = moduleRef.id();\n\n        if (isPresent(moduleId)) {\n          const module = this.store.peekRecord('module', moduleId);\n          return module.hoverText;\n        } else {\n          assert('The relationship is not loaded.');\n        }\n      }\n      return null;\n    }\n\n    return null;\n  }\n}\n","import Service from '@ember/service';\nimport localStorage from 'ember-local-storage-decorator';\n\nexport default class UrlStateService extends Service {\n  @localStorage() deviceState;\n\n  deviceStateFor(ccId) {\n    return this.deviceState && this.deviceState[ccId];\n  }\n\n  updateDeviceStatesPerCC(ccId, value) {\n    const newState = Object.assign({}, this.deviceState);\n    // The argument MUST be either a string representing the state or null to\n    // reset the state.\n    if (value === null) {\n      delete newState[ccId];\n    } else {\n      newState[ccId] = value;\n    }\n\n    this.deviceState = newState;\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport fetch from 'fetch';\nimport { task } from 'ember-concurrency-decorators';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport getApiUrl from 'client-app-omnivise-web/utils/get-api-url';\n\nconst ENV_URL = 'env';\nconst OWC_MANAGEABLE_FEATURES_URL = 'OWC_MANAGEABLE_FEATURES';\n\nexport default class FeaturesManagerService extends Service {\n  @service features;\n  @service session;\n\n  defaultConfig = {};\n\n  @task\n  *loadManageableFeaturesList() {\n    try {\n      const url = new URL(getApiUrl(ENV_URL));\n      url.search = new URLSearchParams({\n        keys: OWC_MANAGEABLE_FEATURES_URL,\n      });\n      const response = yield fetch(url, {\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${this.session.ownAccessToken}`,\n        },\n      });\n      if (response.ok) {\n        const responseJSON = yield response.json();\n        this.defaultConfig = responseJSON['OWC_MANAGEABLE_FEATURES']\n          ? JSON.parse(responseJSON['OWC_MANAGEABLE_FEATURES'])\n          : {};\n      }\n      const errorText = yield response.text();\n      logErrorUtil.logError(errorText);\n    } catch (error) {\n      const errorText = 'Failed to load manageable features list, ' + error;\n      logErrorUtil.logError(errorText);\n    }\n  }\n\n  async setFeatures(featuresConfig = {}) {\n    if (!this.defaultConfig) {\n      await this.loadManageableFeaturesList.perform();\n    }\n\n    Object.keys(this.defaultConfig).forEach((featureName) => {\n      const featureValue =\n        featuresConfig[featureName] === undefined\n          ? this.defaultConfig[featureName].value\n          : featuresConfig[featureName];\n\n      featureValue\n        ? this.features.enable(featureName)\n        : this.features.disable(featureName);\n    });\n  }\n}\n","import Features from 'ember-feature-flags/services/features';\nimport config from '../config/environment';\n\nexport default class extends Features {\n  config = config;\n\n  constructor() {\n    super(...arguments);\n\n    if (config.featureFlags) {\n      this.setup(config.featureFlags);\n    }\n  }\n}\n","import Service from '@ember/service';\nimport { inject as service } from '@ember/service';\n\nexport default class UrlStateService extends Service {\n  @service intl;\n  @service session;\n\n  updateLocale(locale) {\n    let userLocale = this.session.user?.preferences?.locale;\n    userLocale = userLocale ?? this.userBrowserLocale;\n    this.intl.setLocale([locale ?? userLocale]);\n  }\n\n  get userBrowserLocale() {\n    const browserLang = navigator.language.toLowerCase().split('-')[0];\n    // only take care of the first part of the language code\n    const supportedLocales = this.intl.locales;\n    const locale = supportedLocales.find((supportedLocale) => {\n      return supportedLocale.startsWith(browserLang);\n    });\n    return locale ?? supportedLocales[0];\n  }\n}\n","import Service from '@ember/service';\nimport Evented from '@ember/object/evented';\n\nexport default class NotificationService extends Service.extend(Evented) {\n  refreshNotifications() {\n    this.trigger('refreshNotifications');\n  }\n}\n","import Service, { inject as service } from '@ember/service';\nimport config from 'client-app-omnivise-web/config/environment';\n\nexport default class OmniviseMetrics extends Service {\n  @service router;\n  @service metrics;\n  @service session;\n  @service features;\n  @service cookies;\n\n  get gaAdapter() {\n    let userProperties = {};\n    //ember-metrics configuration\n    if (this.session.isAuthenticated) {\n      userProperties = this.#getUserInfoProps();\n    } else {\n      userProperties = this.#getGuestUserInfoProps();\n    }\n    return {\n      name: 'GoogleAnalyticsFour',\n      environments: ['all'],\n      config: {\n        id: config.OWC_GA4_ID,\n        options: {\n          anonymize_ip: true,\n          debug_mode: config.environment !== 'production',\n          send_page_view: false,\n          user_properties: userProperties,\n        },\n      },\n    };\n  }\n\n  get ucPerformanceGAId() {\n    return config.featureFlags['google-analytics']\n      ? config.ucPerformanceGAId\n      : null;\n  }\n\n  activate(userConsents = []) {\n    this.deactivate();\n    const adapters = [];\n\n    userConsents.forEach((consent) => {\n      if (this.ucPerformanceGAId && consent.id === this.ucPerformanceGAId) {\n        adapters.push(this.gaAdapter);\n      }\n    });\n\n    this.metrics.activateAdapters(adapters);\n  }\n\n  deactivate() {\n    this.cookies?.clear('_ga', { domain: '.siemens-energy.com', path: '/' });\n    this.cookies?.clear('_gat', { domain: '.siemens-energy.com', path: '/' });\n    this.cookies?.clear('_gid', { domain: '.siemens-energy.com', path: '/' });\n    // this will destroy GA metric but not clear the cookies..\n    this.metrics.willDestroy();\n  }\n\n  trackPageView() {\n    if (!this.features.isEnabled('google-analytics')) {\n      return;\n    }\n    if (this.session.isAuthenticated) {\n      this.#populateMetricsContextWithUserInfo();\n    } else {\n      this.#populateMetricsContextWithGuestUserInfo();\n    }\n\n    const page = this.router.currentURL;\n    const title = this.router.currentRouteName || 'unknown';\n\n    this.metrics.trackPage({ page, title });\n  }\n\n  trackHelpMaterialsUsageEvent(assetDescriptor, fileName) {\n    if (!this.features.isEnabled('google-analytics')) {\n      return;\n    }\n    this.metrics.trackEvent({\n      event: 'help_materials',\n      category: assetDescriptor.category,\n      title: assetDescriptor.title,\n      fileName,\n    });\n  }\n\n  #populateMetricsContextWithUserInfo() {\n    const userProperties = this.#getUserInfoProps();\n    this.metrics.context['user_properties'] = userProperties;\n  }\n\n  #populateMetricsContextWithGuestUserInfo() {\n    const userProperties = this.#getGuestUserInfoProps();\n    this.metrics.context['user_properties'] = userProperties;\n  }\n\n  #isInternalUser(sub) {\n    // Not sure how reliable this approach is.\n    // Should be replaced with a more robust business rule that comes from the PO.\n    return (\n      sub?.endsWith('@siemens.com') || sub?.endsWith('@siemens-energy.com')\n    );\n  }\n\n  #getUserInfoProps() {\n    const { oid, email } = this.session.ownClaims;\n    const { user } = this.session;\n    const isInternalUser = this.#isInternalUser(email) + '';\n    return {\n      oid,\n      gaUserId: user?.id,\n      isInternal: isInternalUser,\n    };\n  }\n\n  #getGuestUserInfoProps() {\n    return {\n      oid: 'Guest User',\n      gaUserId: 'Guest User',\n      isInternal: 'guest',\n    };\n  }\n}\n","import Service from '@ember/service';\n\nexport default class UrlStateService extends Service {\n  openTicketDialog;\n  openTicketCreationForm;\n  eventDetail = {};\n}\n","import Service, { inject as service } from '@ember/service';\n\nexport default class RouteChangeService extends Service {\n  @service router;\n  @service('omnivise-metrics') omniviseMetricsService;\n  @service('url-state') urlStateService;\n  @service userCentric;\n\n  listenForRouteChanges() {\n    this.router.on('routeDidChange', (transition) => {\n      this.updateUrlStatesPerView(transition);\n      this.trackPageView();\n    });\n  }\n\n  updateUrlStatesPerView(transition) {\n    this.urlStateService.updateUrlStatesPerView(transition);\n  }\n\n  trackPageView() {\n    this.omniviseMetricsService.trackPageView();\n  }\n}\n","import Service from '@ember/service';\nimport { registerDestructor } from '@ember/destroyable';\nimport { action } from '@ember/object';\nimport { inject as service } from '@ember/service';\nimport { getOwner } from '@ember/application';\nimport { jwtDecode } from 'jwt-decode';\nimport Cookies from 'js-cookie';\nimport { tracked } from '@glimmer/tracking';\nimport localStorage from 'ember-local-storage-decorator';\nimport * as Sentry from '@sentry/ember';\nimport logErrorUtil from 'client-app-omnivise-web/utils/log-error';\nimport IdentityProviderFactory from 'client-app-omnivise-web/utils/identity-providers/idp-factory';\nimport { runTask } from 'ember-lifeline';\n\nclass UnauthenticatedError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = 'UnauthenticatedError';\n  }\n}\n\n// Internal to check for logout events in milliseconds\nconst INTERVAL_TO_CHECK_FOR_LOGOUT_EVENTS = 500;\n\n// Time an access token will be refreshed before it expires in seconds\nconst REFRESH_THRESHOLD = 300;\n\nexport const LOGOUT_COOKIE_DOMAIN = window.location.hostname.replace(\n  'home.',\n  '',\n);\nconst LOGOUT_COOKIE_NAME = 'logout-time';\n\nexport default class SessionService extends Service {\n  @service router;\n  @service store;\n  @service intl;\n  @localStorage() accessTokens = {};\n  @localStorage() provider = null;\n  @localStorage() accessTokenRefreshLock = null;\n  idp = IdentityProviderFactory.createFacade(this.requiredIdps);\n\n  timeOfLogoutCheck;\n  @tracked tokenExpired = false;\n\n  /**\n   * @public\n   */\n  get isAuthenticated() {\n    return this.isTokenValid && this.isUserValid;\n  }\n\n  get isTokenValid() {\n    const accessToken = this.accessTokens[this.ownTrustZone];\n    if (!accessToken) return false;\n    const { exp } = jwtDecode(accessToken);\n    const isTokenValid = exp > Date.now() / 1000;\n    return isTokenValid;\n  }\n\n  get isUserValid() {\n    return (\n      this.config.environment === 'test' ||\n      this.config.instanceConfiguration.envName === 'on-prem' ||\n      !!this.user\n    );\n  }\n\n  get config() {\n    return getOwner(this).resolveRegistration('config:environment');\n  }\n\n  get ownTrustZone() {\n    return this.config.authConfig.ownAuthTrustZone;\n  }\n\n  get environment() {\n    return this.config.environment;\n  }\n\n  get requiredIdps() {\n    const authConfig = this.config.authConfig;\n    const mainIdps = authConfig.mainIdps ? authConfig.mainIdps.split(',') : [];\n\n    const secondaryIdps = authConfig.secondaryIdps\n      ? authConfig.secondaryIdps.split(',')\n      : [];\n    return [...mainIdps, ...secondaryIdps];\n  }\n\n  get currentTime() {\n    return new Date().getTime();\n  }\n\n  /**\n   * @method setLogoutCookie\n   * @return void\n   * @private\n   */\n  setLogoutCookie() {\n    Cookies.set(LOGOUT_COOKIE_NAME, this.currentTime, {\n      domain: LOGOUT_COOKIE_DOMAIN,\n      expires: 1, // expiration time in days\n    });\n  }\n\n  get redirectUri() {\n    return window.sessionStorage.getItem('redirectUri');\n  }\n\n  set redirectUri(redirectUri) {\n    if (redirectUri) {\n      window.sessionStorage.setItem('redirectUri', redirectUri);\n    } else {\n      this.clearRedirectUri();\n    }\n  }\n\n  clearRedirectUri() {\n    window.sessionStorage.removeItem('redirectUri');\n  }\n\n  async redirectToDestinationAfterAuthentication() {\n    const targetUrl = this.redirectUri ?? '/auth';\n    const isInternalUrl = targetUrl.startsWith('/');\n\n    this.clearRedirectUri();\n\n    if (isInternalUrl) {\n      const transition = this.router.transitionTo(targetUrl);\n      await transition.followRedirects();\n    } else {\n      window.location.href = targetUrl;\n      await new Promise((resolve, reject) => setTimeout(reject, 0));\n    }\n  }\n\n  get ownAccessToken() {\n    const accessToken = this.accessTokens[this.ownTrustZone];\n\n    // TODO: Verify not only that something exists in local storage but also\n    //       that it's a valid access token and that it's not expired.\n    if (!accessToken) {\n      throw new UnauthenticatedError(\n        'Tried to use access token for own scope, which does not exist',\n      );\n    }\n\n    return accessToken;\n  }\n\n  async pickupSessionState() {\n    //To handle the edge case with azureAD Logging OUT\n    if (this.provider === 'loggingOut') {\n      // eslint-disable-next-line\n      console.log('loggingOut');\n      this.cleanUpAfterLogout();\n      return;\n    }\n\n    if (!this.isTokenValid) {\n      this.cleanUpAfterLogout();\n    }\n\n    const accessTokenInfo = await this.idp.pickupSessionState(this.provider);\n    if (accessTokenInfo) {\n      this.setupUserInSentry();\n      this.updateLocalStorageAccessToken(\n        this.ownTrustZone,\n        accessTokenInfo.accessToken,\n        accessTokenInfo.provider,\n      );\n      await this.loadOwnUser();\n\n      this.tokenExpired = false;\n      this.scheduleTokenRefreshProcess();\n      this.listenForLogoutEvents();\n    }\n  }\n\n  // This method ensures that a valid access token exists for the trust zone\n  // given as first argument.\n  //\n  // It does so by following three steps:\n  // 1. It first checks if a valid, not yet expired access token exists in\n  //    local storage for this trust zone.\n  // 2. If not, it tries to fetch an access token from Okta. If that failes\n  //    (e.g. because no Okta session exists), it let's the consumer handle\n  //    the error.\n  // 3. If it has fetched an access token successfully, that token is persisted\n  //    in local storage.\n  async ensureAccessTokenFor(trustZone) {\n    // Check if we have an access token for that scope already\n    const existingAccessToken = this.accessTokens[trustZone];\n    if (existingAccessToken) {\n      // try to parse the existing access token as JWT\n      try {\n        const { exp } = jwtDecode(existingAccessToken);\n        if (exp - new Date().getTime() / 1000 > REFRESH_THRESHOLD) {\n          // existing access token is valid and not expired yet\n          return;\n        }\n      } catch (error) {\n        // existing access token can not be parsed as JWT\n        // we need to fetch a new one\n        logErrorUtil.logError(error);\n      }\n    }\n    const accessToken = await this.idp.ensureAccessTokenFor(\n      trustZone,\n      this.provider,\n    );\n\n    this.setupUserInSentry();\n    this.updateLocalStorageAccessToken(\n      trustZone,\n      accessToken || this.accessTokens[this.ownTrustZone],\n      this.provider,\n    );\n  }\n\n  async ensureAccessTokenForDefaultTrustZone() {\n    return this.ensureAccessTokenFor(this.ownTrustZone);\n  }\n\n  listenForLogoutEvents() {\n    if (this.logoutListenerIntervalId) {\n      // if we are already listening, dont create another interval listener\n      return;\n    }\n\n    this.logoutListenerIntervalId = setInterval(async () => {\n      if (!this.isAuthenticated) {\n        return;\n      }\n      const logoutTime = parseInt(\n        Cookies.get(LOGOUT_COOKIE_NAME, {\n          domain: LOGOUT_COOKIE_DOMAIN,\n        }),\n      );\n      const logoutDetected = logoutTime && logoutTime >= this.timeOfLogoutCheck;\n\n      // No need to guard against `NaN` (not a number). Comparing two values\n      // always returns `false` if one of them is `NaN`.\n      if (logoutDetected) {\n        this.stopListeningForLogoutEvents();\n        this.accessTokens = {};\n      } else {\n        this.timeOfLogoutCheck = this.currentTime;\n      }\n    }, INTERVAL_TO_CHECK_FOR_LOGOUT_EVENTS);\n\n    registerDestructor(this, () => clearTimeout(this.logoutListenerIntervalId));\n  }\n\n  stopListeningForLogoutEvents() {\n    clearTimeout(this.logoutListenerIntervalId);\n  }\n\n  stopRefreshTokenProcess() {\n    clearTimeout(this.tokenRefreshIntervalId);\n    this.tokenRefreshIntervalId = null;\n  }\n\n  updateLocalStorageAccessToken(scope, token, provider) {\n    this.accessTokens = {\n      ...this.accessTokens,\n      [scope]: token,\n    };\n    this.provider = provider;\n  }\n\n  scheduleTokenRefreshProcess() {\n    if (this.tokenRefreshIntervalId) return;\n    const lockExists = this.accessTokenRefreshLock !== null;\n    const thirtySecondsAgo = Date.now() - 30 * 1000;\n    const lockIsRecent = this.accessTokenRefreshLock > thirtySecondsAgo;\n\n    this.tokenRefreshIntervalId = setInterval(async () => {\n      // check lock\n      if (lockExists && lockIsRecent) {\n        // some other instance must be handling it\n        return;\n      }\n      // Either the lock is not present or it is older than 30 secs.\n      // so let's check each token to see if we need to refresh\n\n      //set the lock ourselves\n      this.accessTokenRefreshLock = Date.now();\n\n      try {\n        for (const [authScope, accessToken] of Object.entries(\n          this.accessTokens,\n        )) {\n          const { exp } = jwtDecode(accessToken);\n          if (exp - Date.now() / 1000 < REFRESH_THRESHOLD) {\n            const updatedAccessToken = await this.idp.update(\n              this.provider,\n              authScope,\n            );\n            if (updatedAccessToken) {\n              this.updateLocalStorageAccessToken(\n                authScope,\n                updatedAccessToken,\n                this.provider,\n              );\n              // update lock\n              this.accessTokenRefreshLock = Date.now();\n            }\n          }\n        }\n      } finally {\n        // remove lock\n        this.accessTokenRefreshLock = null;\n        if (this.tokenExpired) this.stopRefreshTokenProcess();\n      }\n    }, 30 * 1000);\n\n    registerDestructor(this, () => clearTimeout(this.tokenRefreshIntervalId));\n  }\n\n  @action\n  async invalidate() {\n    try {\n      await this.store.unloadAll();\n\n      this.clearUserInSentry();\n\n      this.provider = 'loggingOut';\n      await this.idp.logout();\n    } finally {\n      this.cleanUpAfterLogout();\n    }\n  }\n\n  cleanUpAfterLogout() {\n    // Unloading all records from store to avoid any data leakage between users.\n    // Why are we using runTask? Because I think we want to run this task in the next runloop.\n    // in case this is still relevant: https://github.com/emberjs/data/issues/5447#issuecomment-845672812\n    runTask(\n      this,\n      () => {\n        this.store.unloadAll();\n      },\n      0,\n    );\n\n    // delete all access tokens from local storage\n    // It informs other running instances that a logout event has happend.\n    // It must be done _after_ the Okta session is destroyed otherwise we\n    // may see crazy timing issues.\n    //modifying  accesstokens triggers modifier (redirect-to-login-if-unauthenticated) and navigates to login with queryParams\n    // We dont need to listen to logout events.\n\n    this.stopListeningForLogoutEvents();\n    //We dont need to refresh token anymore.\n    this.stopRefreshTokenProcess();\n    // Set Logout Cookie for other application to get logout.\n    this.setLogoutCookie();\n    this.accessTokens = {};\n  }\n\n  async login(provider) {\n    this.provider = provider;\n    const accessToken = await this.idp.login(provider);\n\n    if (accessToken) {\n      this.setupUserInSentry();\n\n      this.updateLocalStorageAccessToken(\n        this.ownTrustZone,\n        accessToken,\n        this.provider,\n      );\n      await this.loadOwnUser();\n    }\n  }\n\n  async loadOwnUser() {\n    if (this.user) return;\n    if (this.config.instanceConfiguration.envName === 'on-prem') return;\n\n    try {\n      const user = await this.store.queryRecord('user', { me: true });\n      this.user = user;\n    } catch (e) {\n      logErrorUtil.logError(e);\n    }\n  }\n\n  setupUserInSentry() {\n    Sentry.setUser({ email: this.currentUserEmail });\n  }\n\n  clearUserInSentry() {\n    Sentry.setUser(null);\n  }\n  /**\n   * The claims that are encoded in our own access token.\n   *\n   * @property ownClaims\n   * @type {Object}\n   * @private\n   */\n  get ownClaims() {\n    return jwtDecode(this.ownAccessToken);\n  }\n\n  get currentUserId() {\n    return this.ownClaims.uid;\n  }\n\n  get currentUserFirstName() {\n    if (this.isAuthenticated) {\n      return (\n        this.ownClaims['given_name'] ||\n        this.ownClaims['first_name'] ||\n        this.ownClaims['name']\n      );\n    }\n    return false;\n  }\n\n  get currentUserLastName() {\n    if (this.isAuthenticated) {\n      return this.ownClaims['family_name'] || this.ownClaims['last_name'] || '';\n    }\n    return false;\n  }\n\n  get currentUserEmail() {\n    if (this.isAuthenticated) {\n      return this.ownClaims['email'];\n    }\n    return false;\n  }\n}\n","import Service from '@ember/service';\nimport { tracked } from '@glimmer/tracking';\n\nexport default class ShowTooltipService extends Service {\n  @tracked shouldShowTooltip = false;\n\n  setShouldShowTooltip(value) {\n    this.shouldShowTooltip = value;\n  }\n}\n","import Service from '@ember/service';\nimport { TrackedMap } from 'tracked-built-ins';\n\nexport default class UrlStateService extends Service {\n  #urlStatesPerView = new TrackedMap();\n\n  urlStateFor(view) {\n    return this.#urlStatesPerView.get(view);\n  }\n\n  updateUrlStatesPerView(transition) {\n    const { name, params, queryParams } = transition.to;\n\n    if (name !== 'auth.view') {\n      return;\n    }\n    if (queryParams.state) {\n      this.#urlStatesPerView.set(params.view_id, JSON.parse(queryParams.state));\n    } else {\n      this.#urlStatesPerView.delete(params.view_id);\n    }\n  }\n}\n","import Service, { inject as service } from '@ember/service';\n\nexport default class UserCentricService extends Service {\n  @service metrics;\n  @service session;\n  @service('omnivise-metrics') omniviseMetricsService;\n\n  verifyUCEvents() {\n    window.addEventListener(\n      'UC_UI_INITIALIZED',\n      this.activateAnalytics.bind(this),\n    );\n    window.addEventListener('UC_UI_CMP_EVENT', (event) => {\n      if (event.detail.type === 'SAVE' || event.detail.type === 'ACCEPT_ALL') {\n        this.activateAnalytics();\n      } else if (event.detail.type === 'DENY_ALL') {\n        this.deactivateAnalytics();\n      }\n    });\n  }\n\n  activateAnalytics() {\n    const filteredConsents = window?.UC_UI?.getServicesBaseInfo()?.filter(\n      (data) => !data.isEssential && data.consent.status,\n    );\n\n    this.omniviseMetricsService.activate(filteredConsents);\n  }\n\n  deactivateAnalytics() {\n    this.omniviseMetricsService.deactivate();\n  }\n\n  openSecondLayerConsent() {\n    if (window.UC_UI && window.UC_UI.isInitialized()) {\n      window.UC_UI.showSecondLayer();\n    } else {\n      window.addEventListener('UC_UI_INITIALIZED', function () {\n        window.UC_UI.showSecondLayer();\n      });\n    }\n  }\n\n  onRestartEmbeddings() {\n    window?.UC_UI?.restartEmbeddings();\n  }\n}\n","export default {};\n","import config from 'client-app-omnivise-web/config/environment';\nexport default function getApiUrl(url, namespaceOverride) {\n  return `${config.api.host}/${namespaceOverride ?? config.api.namespace}/${url}`;\n}\n","export default function normalizeLocaleToApi(locale) {\n  return Intl.getCanonicalLocales(locale);\n}\n","import OktaIdentityProvider from 'client-app-omnivise-web/utils/identity-providers/okta-idp';\nimport config from 'client-app-omnivise-web/config/environment';\n\nexport default class AzureFederatedIdentityProvider extends OktaIdentityProvider {\n  get azureAdUrl() {\n    return config.authConfig.azureAdUrl;\n  }\n\n  login() {\n    window.location.href = this.azureAdUrl;\n  }\n}\n","import IdentityProvider from 'client-app-omnivise-web/utils/identity-providers/idp-interface';\nimport msal from '@azure/msal-browser';\nimport config from 'client-app-omnivise-web/config/environment';\n\nclass UnauthenticatedError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = 'UnauthenticatedError';\n  }\n}\n\nexport default class AzureIdentityProvider extends IdentityProvider {\n  azureInstance = new msal.PublicClientApplication(this.azureConfig);\n\n  get ownTrustZone() {\n    return config.authConfig.ownAuthTrustZone;\n  }\n\n  get graphScope() {\n    return config.authConfig.graphScope;\n  }\n\n  get azureConfig() {\n    return config.authConfig.azureConfig;\n  }\n\n  get environment() {\n    return config.environment;\n  }\n\n  get azureScopes() {\n    return [`${this.azureConfig.auth.clientId}/.default`];\n  }\n\n  async ensureAccessTokenFor(authScope) {\n    const isGraphScope = authScope === this.graphScope;\n    const scopes = isGraphScope ? [this.graphScope] : this.azureScopes;\n    const account = this.azureInstance.getAllAccounts()[0];\n    return await this.acquireTokenSilentAzure(scopes, account);\n  }\n\n  async login() {\n    // eslint-disable-next-line\n    console.log('loginRedirectAzure');\n    try {\n      //This wrapper required to resolve the interaction_in_progress issue\n      //https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-browser/docs/errors.md#interaction_in_progress\n      const response = await this.azureInstance.handleRedirectPromise();\n\n      if (response) {\n        return response.accessToken;\n      }\n      await this.azureInstance.loginRedirect({\n        scopes: this.azureScopes,\n      });\n    } catch (error) {\n      throw new UnauthenticatedError(\n        `Fetching access token for with scopes failed with ${error.message}`,\n      );\n    }\n  }\n\n  async acquireTokenSilentAzure(scopes, account) {\n    // eslint-disable-next-line\n    console.log('acquireTokenSilentAzure');\n    try {\n      this.resp = await this.azureInstance.acquireTokenSilent({\n        forceRefresh: true,\n        scopes,\n        account,\n      });\n      return this.resp.accessToken;\n    } catch (error) {\n      // eslint-disable-next-line\n      console.log(\n        `Fetching access token for with scopes failed with ${error.message}`,\n      );\n      return null;\n    }\n  }\n\n  async update(authScope) {\n    let accessToken;\n    const isGraphScope = authScope === this.graphScope;\n    const scopes = isGraphScope ? [this.graphScope] : this.azureScopes;\n    const currentAccounts = this.azureInstance.getAllAccounts();\n    if (currentAccounts.length === 0) {\n      //sso is not working with the current local tests setup\n      if (config.environment === 'test') {\n        return null;\n      }\n\n      accessToken = await this.sso(scopes);\n      // eslint-disable-next-line\n      console.log('ssoSilentAzure success');\n    } else {\n      const account = currentAccounts[0];\n      accessToken = await this.acquireTokenSilentAzure(scopes, account);\n      // eslint-disable-next-line\n      console.log('acquireTokenSilentAzure success');\n    }\n\n    return accessToken;\n  }\n\n  async logout() {\n    const account = this.azureInstance.getAllAccounts()[0];\n    this.resp = await this.azureInstance.logoutRedirect({\n      mainWindowRedirectUri: this.azureConfig.auth.mainWindowRedirectUri,\n      scopes: this.azureScopes,\n      account,\n    });\n  }\n\n  async sso(scopes) {\n    // eslint-disable-next-line\n    console.log('ssoSilentAzure');\n    try {\n      this.resp = await this.azureInstance.ssoSilent({\n        scopes: scopes || this.azureScopes,\n      });\n      return this.resp.accessToken;\n    } catch (error) {\n      // eslint-disable-next-line\n      console.log(`SSO failed with ${error.message}`);\n    }\n  }\n\n  async pickupSessionState() {\n    // eslint-disable-next-line\n    console.log('pickupAzureSessionState');\n    try {\n      const response = await this.azureInstance.handleRedirectPromise();\n\n      let accessToken;\n      if (response) {\n        accessToken = response.accessToken;\n        // eslint-disable-next-line\n        console.log('handleRedirectPromise success');\n      } else {\n        accessToken = await this.update();\n      }\n\n      return accessToken\n        ? {\n            accessToken,\n            provider: 'azure',\n          }\n        : null;\n    } catch (error) {\n      throw new UnauthenticatedError(\n        `AzureAD handle redirect promise fail ${error.message}`,\n      );\n    }\n  }\n}\n","import IdentityProvider from 'client-app-omnivise-web/utils/identity-providers/idp-interface';\nimport IdentityProviderFactory from 'client-app-omnivise-web/utils/identity-providers/idp-factory';\n\nexport default class IdentityProviderFacade extends IdentityProvider {\n  constructor(requiredIdps) {\n    super(requiredIdps);\n\n    this.requiredIdps = requiredIdps;\n    this.idps = {};\n    this.requiredIdps.forEach(\n      (idpName) =>\n        (this.idps[idpName] = IdentityProviderFactory.createIdp(idpName)),\n    );\n  }\n\n  async login(idpName) {\n    return await this.idps[idpName].login();\n  }\n\n  logout() {\n    this.requiredIdps.reverse().forEach((idpName) => {\n      this.idps[idpName].logout();\n    });\n  }\n\n  async update(provider, authScope) {\n    return await this.idps[provider].update(authScope);\n  }\n\n  async ensureAccessTokenFor(authScope, provider) {\n    return await this.idps[provider].ensureAccessTokenFor(authScope);\n  }\n\n  async pickupSessionState(provider) {\n    let accessTokenInfo = null;\n    accessTokenInfo =\n      provider && (await this.idps[provider]?.pickupSessionState());\n    for (const idpName of this.requiredIdps) {\n      if (!accessTokenInfo) {\n        accessTokenInfo = await this.idps[idpName].pickupSessionState();\n      }\n    }\n    return accessTokenInfo;\n  }\n}\n","import AzureIdentityProvider from 'client-app-omnivise-web/utils/identity-providers/azure-idp';\nimport OktaIdentityProvider from 'client-app-omnivise-web/utils/identity-providers/okta-idp';\nimport KeycloakIdentityProvider from 'client-app-omnivise-web/utils/identity-providers/keycloak-idp';\nimport AzureFederatedIdentityProvider from 'client-app-omnivise-web/utils/identity-providers/azure-federated-idp';\nimport TestIdentityProvider from 'client-app-omnivise-web/utils/identity-providers/test-idp';\nimport IdentityProviderFacade from 'client-app-omnivise-web/utils/identity-providers/idp-facade';\n\nexport default class IdentityProviderFactory {\n  static createIdp(idpName) {\n    switch (idpName) {\n      case 'azure':\n        return new AzureIdentityProvider();\n      case 'keycloak':\n        return new KeycloakIdentityProvider();\n      case 'okta':\n        return new OktaIdentityProvider();\n      case 'azurefederated':\n        return new AzureFederatedIdentityProvider();\n      case 'testIdp':\n      default:\n        return new TestIdentityProvider();\n    }\n  }\n\n  static createFacade(idpName) {\n    return new IdentityProviderFacade(idpName);\n  }\n}\n","//Abstract class for defining interface\nexport default class IdentityProvider {\n  login() {\n    // eslint-disable-next-line\n    console.log('Abstract login');\n  }\n\n  logout() {\n    // eslint-disable-next-line\n    console.log('Abstract logout');\n  }\n\n  update() {\n    // eslint-disable-next-line\n    console.log('Abstract update');\n  }\n\n  pickupSessionState() {\n    // eslint-disable-next-line\n    console.log('Abstract pickupSessionState');\n  }\n\n  ensureAccessTokenFor() {\n    // eslint-disable-next-line\n    console.log('Abstract ensureAccessTokenFor');\n  }\n}\n","import IdentityProvider from 'client-app-omnivise-web/utils/identity-providers/idp-interface';\nimport Keycloak from 'keycloak-js';\nimport config from 'client-app-omnivise-web/config/environment';\n\nclass UnauthenticatedError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = 'UnauthenticatedError';\n  }\n}\nexport default class KeycloakIdentityProvider extends IdentityProvider {\n  kc;\n  isAuthenticated = false;\n\n  constructor(message) {\n    super(message);\n    const { url, realm, clientId } = config.authConfig.keycloakConfig;\n    this.kc = new Keycloak({ url, realm, clientId });\n  }\n\n  get ownTrustZone() {\n    return config.authConfig.ownAuthTrustZone;\n  }\n\n  async _initKC(mode) {\n    // _initKC is a private method that is called by `login` and `pickupSessionState`\n    // depending on which of the invocations are done, the mode is different\n    // login -> login-required\n    // pickupSessionState -> check-sso\n    // once the initialization is done, the `this.kc.didInitialize` flag is set to true and it is safe to\n    // call apis on the keycloak instance, (i,e, `login()`, `logout()`, and access the `token` property)\n\n    if (this.kc.didInitialize) {\n      return;\n    }\n    try {\n      return await this.kc.init({ onLoad: mode });\n    } catch (error) {\n      throw new UnauthenticatedError(\n        `KeyCloak Login failed with ${error?.message}`,\n      );\n    }\n  }\n\n  async login() {\n    this.kc.didInitialize\n      ? await this.kc.login()\n      : await this._initKC('login-required');\n  }\n\n  async logout() {\n    const logoutOptions = {\n      post_logout_redirect_uri:\n        config.authConfig.keycloakConfig.postLogoutRedirectUri,\n      client_id: config.authConfig.keycloakConfig.clientId,\n    };\n\n    return this.kc.didInitialize && (await this.kc.logout(logoutOptions));\n  }\n\n  async pickupSessionState() {\n    if (!this.kc.didInitialize) {\n      this.isAuthenticated = await this._initKC('check-sso');\n    }\n\n    if (!this.isAuthenticated) {\n      return null;\n    }\n\n    return {\n      accessToken: this.kc.token,\n      provider: 'keycloak',\n    };\n  }\n\n  async update() {\n    if (!this.kc.didInitialize) {\n      this.isAuthenticated = await this._initKC('check-sso');\n    }\n\n    if (!this.isAuthenticated) {\n      return null;\n    }\n\n    await this.kc.updateToken();\n    return this.kc.token;\n  }\n\n  async ensureAccessTokenFor() {\n    // eslint-disable-next-line\n    console.log('Keycloak ensureAccessTokenFor');\n  }\n}\n","import IdentityProvider from 'client-app-omnivise-web/utils/identity-providers/idp-interface';\nimport { OktaAuth } from '@okta/okta-auth-js';\nimport { assert } from '@ember/debug';\nimport config from 'client-app-omnivise-web/config/environment';\n\nclass UnauthenticatedError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = 'UnauthenticatedError';\n  }\n}\n\nclass UnknownAuthError extends Error {\n  constructor(message) {\n    super(message);\n    this.name = 'UnknownAuthError';\n  }\n}\n\nexport default class OktaIdentityProvider extends IdentityProvider {\n  get oktaConfig() {\n    const { clientId, authorizationServerId, oktaDomain } = config.authConfig;\n\n    assert('clientId config is missing', !!clientId);\n    assert('authorizationServerId config is missing', !!authorizationServerId);\n    assert('oktaDomain config is missing', !!oktaDomain);\n\n    return {\n      clientId,\n      issuer: `${oktaDomain}/oauth2/${authorizationServerId}`,\n      pkce: false,\n      redirectUri: `${window.location.origin}/callback`,\n    };\n  }\n\n  login() {\n    window.location.href = config.authConfig.oktaUrl;\n  }\n\n  async logout() {\n    await this.authClient.revokeAccessToken();\n    await this.authClient.closeSession();\n  }\n\n  async update(authScope) {\n    return await this.fetchAccessToken([authScope]);\n  }\n\n  async ensureAccessTokenFor(authScope) {\n    return await this.fetchAccessToken([authScope]);\n  }\n\n  async pickupSessionState() {\n    // eslint-disable-next-line\n    console.log('pickupOktaSessionState');\n    let accessToken;\n    try {\n      accessToken = await this.fetchAccessToken([this.ownTrustZone]);\n      // eslint-disable-next-line\n      console.log('pickupOktaSessionState success');\n    } catch (e) {\n      // eslint-disable-next-line\n      console.log('pickupOktaSessionState error', e);\n      return false;\n    }\n\n    return {\n      accessToken,\n      provider: 'okta',\n    };\n  }\n\n  /*\n   * Fetches an access token from Okta.\n   *\n   * Consumer may pass an Okta session token. In that case it will not only\n   * fetch the access token but also establish an Okta cookie session in\n   * parallel.\n   */\n  async fetchAccessToken(scopes, sessionToken) {\n    const options = {\n      responseType: 'token',\n      scopes,\n    };\n\n    if (sessionToken) {\n      options.sessionToken = sessionToken;\n    }\n\n    let response;\n    try {\n      response = await this.authClient.token.getWithoutPrompt(options);\n    } catch (error) {\n      // TODO: Implement granular error indicating the reasons:\n      //\n      // - If Okta session does not exist, is expired or is invalid (`LOCKED_OUT`): Reject with `UnauthenticatedError`.\n      // - If valid Okta session exists but trust zone is not configured\n      //   correctly: Log to Sentry and reject with `InvalidOktaConfiguration`.\n      // - If network is not available: Reject with `NetworkError`.\n      // - ...\n      // - In all other cases: Reject with `UnknownAuthError`.\n      throw new UnauthenticatedError(\n        `Fetching access token for with scopes ${scopes.join(\n          ' ',\n        )} failed with ${error.message}`,\n      );\n    }\n\n    const accessToken = response?.tokens?.accessToken?.value;\n\n    if (!accessToken) {\n      throw new UnknownAuthError(\n        `Fetching access token for with scopes ${scopes.join(\n          ' ',\n        )} failed. AuthClient.token.getWithoutPrompt() resolved but response ` +\n          'did not contain an access token.',\n      );\n    }\n\n    return accessToken;\n  }\n\n  async fetchOwnAccessToken({ sessionToken }) {\n    return await this.fetchAccessToken([this.ownTrustZone], sessionToken);\n  }\n\n  get ownTrustZone() {\n    return config.authConfig.ownAuthTrustZone;\n  }\n\n  constructor(message) {\n    super(message);\n    this.authClient = new OktaAuth(this.oktaConfig);\n  }\n}\n","//Abstract class for defining interface\nimport IdentityProvider from 'client-app-omnivise-web/utils/identity-providers/idp-interface';\nimport config from 'client-app-omnivise-web/config/environment';\nimport localStorage from 'ember-local-storage-decorator';\n\nexport default class TestIdentityProvider extends IdentityProvider {\n  @localStorage() accessTokens = {};\n  @localStorage() provider = null;\n  generateAccessToken(customClaims) {\n    const defaults = {\n      exp: Math.floor(Date.now().valueOf() / 1000) + 3600,\n      iat: Math.floor(Date.now().valueOf() / 1000) - 3600,\n      uid: 'FAKE_UID',\n      sub: 'xxxx@siemens.com',\n      first_name: 'Tom',\n      last_name: 'Hamster',\n    };\n    const claims = Object.assign({}, defaults, customClaims);\n    return 'a.' + window.btoa(JSON.stringify(claims)) + '.b';\n  }\n\n  get ownTrustZone() {\n    return config.authConfig.ownAuthTrustZone;\n  }\n\n  login() {\n    window.sessionStorage.removeItem('redirectUri');\n    this.updateLocalStorageAccessToken(\n      this.ownTrustZone,\n      this.generateAccessToken(),\n      'testIdp',\n    );\n  }\n\n  logout() {\n    // eslint-disable-next-line\n    console.log('TestIdp logout');\n  }\n\n  update() {\n    return this.generateAccessToken();\n  }\n\n  pickupSessionState() {\n    const accessTokenInfo = {\n      accessToken: this.generateAccessToken(),\n      provider: 'testIdp',\n    };\n    window.sessionStorage.removeItem('redirectUri');\n    return accessTokenInfo;\n  }\n\n  ensureAccessTokenFor(trustZone) {\n    return this.generateAccessToken({ scopes: [trustZone] });\n  }\n\n  updateLocalStorageAccessToken(scope, token, provider) {\n    this.accessTokens = {\n      ...this.accessTokens,\n      [scope]: token,\n    };\n    this.provider = provider;\n  }\n}\n","import * as Sentry from '@sentry/browser';\n\nconst logError = function (error) {\n  Sentry.captureMessage(error);\n\n  /* eslint-disable no-console */\n  console.error(error);\n};\n\nconst logRaiseError = function (error, context) {\n  Sentry.captureException(error, (scope) => {\n    scope.setTag('componentId', context.componentId);\n    scope.setContext('state', { type: 'owc', value: context });\n  });\n\n  /* eslint-disable no-console */\n  console.error({ error, context });\n};\n\nexport default {\n  logError,\n  logRaiseError,\n};\n","import config from 'client-app-omnivise-web/config/environment';\n\nexport async function redirectToSiemensIdUrl() {\n  window.location.href = config.authConfig.siemensIdUrl;\n  await new Promise((resolve, reject) =>\n    setTimeout(\n      () => reject(new Error('Could not set window.location.href in time')),\n      0,\n    ),\n  );\n}\n","const takeScreenshotWithImageCapture = async function (stream) {\n  const track = stream.getVideoTracks()[0];\n  const imageCapture = new ImageCapture(track);\n  const bitmap = await imageCapture.grabFrame();\n  track.stop();\n  const canvas = document.createElement('canvas');\n  canvas.width = bitmap.width;\n  canvas.height = bitmap.height;\n  const context = canvas.getContext('2d');\n  context.drawImage(bitmap, 0, 0, bitmap.width, bitmap.height);\n  return canvas;\n};\n\nconst takeScreenshotWithVideoPlay = function (stream) {\n  return new Promise((resolve, reject) => {\n    const video = document.createElement('video');\n    const canvas = document.createElement('canvas');\n    const context = canvas.getContext('2d');\n\n    video.srcObject = stream;\n    video.addEventListener('loadeddata', async () => {\n      const { videoWidth, videoHeight } = video;\n      canvas.width = videoWidth;\n      canvas.height = videoHeight;\n      await video.play();\n      context.drawImage(video, 0, 0, videoWidth, videoHeight);\n      stream.getVideoTracks()[0].stop();\n      resolve(canvas);\n    });\n    video.addEventListener('onerror', function () {\n      reject(video.error);\n    });\n  });\n};\n\nexport default {\n  takeScreenshotWithImageCapture,\n  takeScreenshotWithVideoPlay,\n};\n","define('client-app-omnivise-web/config/environment', [], function() {\n  var prefix = 'client-app-omnivise-web';\ntry {\n  var metaName = prefix + '/config/environment';\n  var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n  var config = JSON.parse(decodeURIComponent(rawConfig));\n\n  var exports = { 'default': config };\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n  return exports;\n}\ncatch(err) {\n  throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","\n          if (!runningTests) {\n            require(\"client-app-omnivise-web/app\")[\"default\"].create({\"name\":\"client-app-omnivise-web\",\"version\":\"21.34.1+67eee8b3\"});\n          }\n        \n"],"mappings":"AAAA;;;;;;;;ACKgCA,EAAAC,SAAAC,EAAjB,cAA0BC,UAAGC,eAAeC,OAAO,CAChE,IACCC,eAAAC,G;AAAAC,SAAAD,G,EACDE,K,EAAA,U,EAAAA,M,EAAAC,I,sJAAAC,EAAAF,KAAA,YAGYG,UAAOC,IAAIC,WAASH,EAAAF,KAAA,OACzBG,UAAOC,IAAIE,KAAI,CAEtB,WAAIC,GAGF,MAAO,CACLC,cAAe,UAHCR,KAAKS,QAAQC,iBAI7B,gBAAiB,WAErB,G,EACDjB,EAAAkB,U,EAAA,U,EAAA,CAbEC,U,EAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAaTf,O,wDAbSR;eAeV,I;;;;;;ACtBe,MAAMwB,UAAwBC,UAAmBrB,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,YAClD,SAAQ,EAGtBT,EAAAC,QAAAyB,CAAA,I;;;;;;ACJe,MAAME,UAA0BD,UAAmBrB,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,YACpD,SAAQ,EAGtBT,EAAAC,QAAA2B,CAAA,I;;;;;;ACHe,MAAMC,UAAmBF,UAAmBrB,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,YAC7C,SAAQ,CAEpBqB,aAAaC,EAAQC,EAAOC,GAC1B,MAAMC,EAAOzB,KAAK0B,UAAUF,EAAU,CAAEG,WAAW,IAC7CC,EAAS5B,KAAKS,QAAQoB,KAAKC,GAC3BC,EAAM,GAAG/B,KAAKM,QAAQN,KAAKK,mBAAmBuB,gBAC9CrB,EAAUyB,OAAOC,OAAO,CAAC,EAAGjC,KAAKO,QAAS,CAC9C,eAAgB;AAGlB,OAAO,IAAI2B,SAAQ,SAAUC,EAASC,IACpC,EAAAC,WAAMN,EAAK,CACTO,OAAQ,MACRC,KAAMC,KAAKC,UAAUhB,GACrBlB,YACCmC,MACD,SAAUjB,GACRU,EAAQV,EAAKkB,OACf,IACA,SAAUC,GACRR,EAAOQ,EACT,GAEJ,GACF,EACDrD,EAAAC,QAAA4B,CAAA,I;;;;;;ACtBc,MAAMyB,UAAa3B,UAAmBrB,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,YACvC,SAAQ,CAEpB8C,kBAAkBC,GAChB,IAAIC,EAAcjD,MAAM+C,kBAAkBC,EAAO;AACjD,OAAIA,EAAME,WACDF,EAAME,GACbF,EAAMG,QAAU,cACT,GAAGF,QAGLA,CACT,EAGFzD,EAAAC,QAAAqD,CAAA,I;;;;;mMCd8BM,EAAChD,EAAQiD,KACrC,MAAMC,EACwC,iBAArClD,EAAOmD,aAAaF,IACwB,SAAnDjD,EAAOmD,aAAaF,GAAaG,cAC7BC,EACwC,kBAArCrD,EAAOmD,aAAaF,IAC3BjD,EAAOmD,aAAaF;AAEtB,OAAOC,GAAiBG,CAAc,EAIpCL,CAAsBhD,UAAQ,WAChCsD,EAAOC,KAAK,CACVC,IAAKxD,UAAOyD,UACZC,aAAc,CACZJ,EAAOK,kBAAkB,CACvB,IAOJC,iBAAkB,GAIlBC,yBAA0B,GAC1BC,yBAA0B,EAG1BC,OAAO,EACPC,YAAahE,UAAOiE,sBAAsBC,QAC1CC,sBAAuB,CACrBC,wBAAyB,CACvB,wDACA,oDACA,mDACA;AAMO,MAAMC,UAAYC,UAAY5E,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,eAC5BG,UAAOuE,cAAYxE,EAAAF,KAAA,kBAChBG,UAAOwE,iBAAezE,EAAAF,KAAA,WAC7B4E,UAAQ,EACpBrF,EAAAC,QAAAgF,GAED,EAAAK,WAAiBL,EAAKrE,UAAOuE,aAAc,I;;;AC1D3C,MAAMI,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,gTAAAC,WAAA,8DAAAC,cAAA;AAA8qB5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAG3rB,EAAAQ,aAAc,I;UCJd,CACb,eAAgB,uBACjB,I;;;ACDD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,6yKAAAC,WAAA,sDAAAC,cAAA;AAAo0R,IAQ30RI,EAAehG,EAAAC,SAAAC,EAArB,cAA8B+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,OAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,QAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,uBAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,iBAAA6F,EAAA7F,KAAA,CAQrD,iBAAI8F,GACF,OAAO9F,KAAK+F,KAAKC,eAAiB,OACpC,CAEA,wBAAIC,GACF,MACO,UADCjG,KAAK8F,cAEF,mEAGA,kFAEb,CAEA,SAAII,GACF,MACO,UADClG,KAAK8F,cAEF,6EAGA,yEAEb,CAEA,WAAIK,GACF,MACO,UADCnG,KAAK8F,cAEF,4EAGA,0EAEb,CAEA,WAAIM,GACF,MACO,UADCpG,KAAK8F,cAEF,qEAGA,2EAEb,CAEA,YAAIO,GACF,OAAOrG,KAAKsG,OAAOC,OAAO,WAC5B,CAEA,iBAAIC,GACF,MAAMC,EAAWzG,KAAKsG,OAAOI,aAAaC,YAAYC,cAAcC,QAAQC,IAAI;AAChF,GAAIL,EACF,OAAOzG,KAAK+G,MAAMC,WAAW,SAAUP;AAEvCQ,QAAQC,IAAI,kCAEhB,CAUA,WAAIC,GACF,MAAMA,EAAUhH,UAAOiH,IAAID;AAE3B,OADyBA,EAAQE,MAAM,OACb,IAAIF,IAAYA,CAC5C,CAQA,gBAAIG,GACF,MACMC,EADgBvH,KAAKmH,QAAQE,MAAM,qBACNrH,KAAKmH,QAAQK,SAAS,KAAO,IAAM,IAChEC,EAAmBzH,KAAKmH,QAAQO,YAAYH;AAClD,OAA6B,IAAtBE,EACHzH,KAAKmH,QAAQQ,UAAU,EAAGF,GAC1BzH,KAAKmH,OACX,CAEA,eAAIS,GACF,OAAO,IAAIC,MAAOC,aACpB,CAEA,eAAIC,GACF,QAAS/H,KAAKmH,OAChB,CAGAa,oBACEhI,KAAKiI,sBAAwBjI,KAAKiI,oBACpC,CAGAC,2BACElI,KAAKmI,gBAAkBnI,KAAKmI,cAC9B,CAGAC,yBACEpI,KAAKmI,gBAAiB,CACxB,GACDlI,EAAAoI,EAAA5I,EAAAkB,UAAA,UAnHEC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,QACPC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,SACPC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,wBAEP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAwB,CAAK,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,kBACpC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAkB,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,qBAgG9B4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,qBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,4BAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,4BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAhHYS,EAAe,I;ACRpC,MAAMT,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,6OAAAC,WAAA,qDAAAC,cAAA;AAAga5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAG7a,EAAAQ,aAAc,I;;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,2SAAAC,WAAA,+DAAAC,cAAA;AAAojB,IAK3jBsD,EAA4BlJ,EAAAC,SAAAkJ,GAC9C,EAAAC,QAAK,CAAEC,eAAgB,IAAInJ,EADf,cAA2C+F,UACxD,aACCqD,CAAaC,EAAMC,GAClB,MAAMC,QAAiB,EAAA3G,WAAMyG,EAAM,CACjCvI,QAAS,CACP,eAAgB,0BAChB,gBAAiB,cAGf0I,QAAaD,EAASC,OAEtBC,EAAOC,SAASC,cAAc;AACpCF,EAAKG,KAAOC,IAAIC,gBAAgBN,GAChCC,EAAKM,SAAWT,EAChBG,EAAKO,QAELP,EAAKQ,QACP,G,EACDjK,EAAAkB,U,EAAA,e,EAAA,CAAA+H,G,EAAA1G,OAAAwG,yBAAA/I,EAAAkB,UAAA,gB,EAAAlB,EAAAkB,U,8XAAAlB;iBAAA,EAAA2F,EAAAC,sBAAAP,EAlBoB2D,EAA4B,I;;;ACLjD,MAAM3D,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,kpCAAAC,WAAA,sDAAAC,cAAA;AAA4nD,IAMnoDwE,EAAepK,EAAAC,SAAAC,EAArB,cAA8B+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,cAAA0F,EAAA1F,KAAA,CAKrD4J,8BAKE,EAAAC,WACE7J,MACA,KACE,MAAM8J,gBAAEA,GAAoB9J,KAAKS;AAC5BqJ,IACH9J,KAAK+J,YAAc,KACrB,GAEF,EAEJ,GACD9J,EAAAoI,EAAA5I,EAAAkB,UAAA,WApBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,eACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,8BAEP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,8BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAJY6E,EAAe,I;UCPrB,CACbK,UAAa,oBACb,gBAAiB,wBAClB,I;;;ACFD,MAAMlF,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,81CAAAC,WAAA,yDAAAC,cAAA;AAA4wE,IAKnxE8E,EAAkC1K,EAAAC,SAAAC,EAAxC,cAAiD+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,KAAA,CAIxE,kBACMkK,CAAaC,EAAQC,GAEzBpK,KAAK+F,KAAKsE,UAAU,CAACF,IAEjBC,GAAkC,mBAAdA,GACtBA;AAGF,MAAME,EAAwBtK,KAAKS,QAAQoB,KAAK0I;AAKhD,OAJAD,EAAsBH,OAASA,QACzBG,EAAsBE,QAGrB,CACT,GACDvK,EAAAoI,EAAA5I,EAAAkB,UAAA,QAnBEC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,gBAEP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAJYmF,EAAkC,I;UCNxC,CAAC,CAAC,I;;;;;;;;ACCjB,MAAMnF,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,4rBAAAC,WAAA,2DAAAC,cAAA,IAQtBsF,EAAW;AACkB,IAEdC,EAAwBnL,EAAAC,SAAAkJ,GAC1C,EAAA9H,WAAQ,oBAAmBnB,EADf,cAAuC+F,UAOpD3F,cACEE,SAAS4K,WAAWlF,EAAAzF,KAAA,kBAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,OAAA0F,EAAA1F,MAAAE,EAAAF,KAAA,gBAJN,MAAIE,EAAAF,KAAA,iBACH,MAAIE,EAAAF,KAAA,YAOV,EAAA4K,aAAUC,IACnB,MAAMC,EAAiB,IAAIC,gBAAe,KACxCC,OAAOC,uBAAsB,KACvBjL,KAAKkL,OAAST,GAChBzK,KAAKmL,gBACP,GACA;AAOJ,OAJAnL,KAAKoL,cAAgBP,EAErBC,EAAeO,QAAQL,OAAO7B,SAASmC,iBAEhC,KACLR,EAAeS,YAAY,CAC5B,KACDrL,EAAAF,KAAA,WAEQ,EAAA4K,aAAUC,IAClB7K,KAAKwL,eAAiBX,CAAO,KAtB7B7K,KAAKyL,WACP,CAwBAC,OACE1L,KAAKoL,cAAcO,YAEf3L,KAAKkL,OAAST,GAChBzK,KAAKmL,gBAET,CAGAS,QACE5L,KAAKoL,cAAcQ,QACnB5L,KAAKyL,YACLzL,KAAKF,KAAK+L,SAAW7L,KAAKF,KAAK+L,SACjC,CAGAC,gBAAgBC,GACdA,EAAMD,iBACR,CAGAE,SACMhM,KAAKoL,cAAca,aAAa,QAClCjM,KAAK4L,QAEL5L,KAAK0L,MAET,CAGAQ,SACElM,KAAKkL,KAnEQ,kBAoEblL,KAAKmM,eACP,CAGAC,SACEpM,KAAKkL,KAAOT,EACZzK,KAAKmL,gBACP,CAEAA,iBACE,MAAMkB,EAAcrM,KAAKwL,eAAec,wBAClCC,EAAavM,KAAKoL,cAAckB;AAEtCtM,KAAKwM,aAAeH,EAAYI,KAAOF,EAAWG,MAAQL,EAAYK,MACtE1M,KAAK2M,YAAcN,EAAYO,OAAS,GAExC5M,KAAKoL,cAAcyB,MAAMC,IAAM,GAAG9M,KAAK2M,gBACvC3M,KAAKoL,cAAcyB,MAAMJ,KAAO,GAAGzM,KAAKwM,gBAC1C,CAEAL,gBACEnM,KAAKoL,cAAcyB,MAAME,eAAe,OACxC/M,KAAKoL,cAAcyB,MAAME,eAAe,OAC1C,CAEAtB,YACMzL,KAAKF,KAAKkN,UACZhN,KAAKkL,KAjGO,mBAmGZlL,KAAKkL,KAAOT,CAEhB,GACDxK,EAAAoI,EAAA5I,EAAAkB,UAAA,mBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,QAhGE2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAQyJ,CAAQ,IAAApC,EAAA5I,EAAAkB,UAAA,SAwCvB4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,SAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,mBAON4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,mBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,UAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,UAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,UASN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,UAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,UAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,UAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EArEY4F,EAAwB,I;ACX7C,MAAM5F,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,guBAAAC,WAAA,iEAAAC,cAAA;AAA4mD5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGznD,EAAAQ,aAAc,I;UCJd,CACb,oBAAqB,4BACtB,I;ACDD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,80CAAAC,WAAA,kEAAAC,cAAA;AAcb,MAAM8H,UAA+BzH,WAA6CjG,EAAAC,QAAAyN,GAAA,EAAA7H,EAAAC,sBAAAP,EAA5EmI,EAAsB,I;ACd3C,MAAMnI,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,m4BAAAC,WAAA,4DAAAC,cAAA;AAcb,MAAM+H,UAAyB1H,WAAuCjG,EAAAC,QAAA0N,GAAA,EAAA9H,EAAAC,sBAAAP,EAAhEoI,EAAgB,I;ACdrC,MAAMpI,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,ieAAAC,WAAA,yEAAAC,cAAA;AAA8pC5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAG3qC,EAAAQ,aAAc,I;;;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,seAAAC,WAAA,wDAAAC,cAAA;AAAgnC,IAKvnCgI,EAAsB5N,EAAAC,SAAAkJ,GACxC,EAAA9H,UAAQ,gBAAenB,EADX,cAAqC+F,UAAU3F,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,qB,EAAAA,M,EAAAC,I,qJAAA,CAI5DmN,0BACE,MAAMC,EAAerN,KAAKsN,mBAAmBC;AAC7CvN,KAAKsN,mBAAmBE,sBAAsBH,EAChD,GACDpN,EAAAoI,EAAA5I,EAAAkB,UAAA,sBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,2BALE4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,2BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAHYqI,EAAsB,I;UCN5B,CACb,eAAgB,uBAChB,mBAAoB,2BACpB,iBAAkB,yBACnB,I;ACHD,MAAMrI,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,ytCAAAC,WAAA,yDAAAC,cAAA;AAA0jE5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGvkE,EAAAQ,aAAc,I;UCJd,CACb,mBAAoB,2BACpB,YAAa,oBACb,iBAAkB,yBAClB,iBAAkB,yBAClB,kBAAmB,0BACpB,I;;;ACLD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,+0EAAAC,WAAA,0DAAAC,cAAA;AAAo9H,IAM39HsI,EAAclO,EAAAC,SAAAC,EAApB,cAA6B+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,WAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,eAAA2F,EAAA3F,KAAA,CAMpD,aAAI0N,GACF,OAAO1N,KAAKS,QAAQkN,oBACtB,CAEA,YAAIC,GACF,OAAO5N,KAAKS,QAAQoN,mBACtB,CAEA,YAAIC,GACF,MAAO,GAAG9N,KAAK0N,aAAa1N,KAAK4N,UACnC,CAEA,SAAIG,GACF,OAAO/N,KAAKS,QAAQuN,gBACtB,CAEA,YAAIC,GACF,MAAMP,UAAEA,EAASE,SAAEA,GAAa5N;AAGhC,OAFyB0N,EAAYA,EAAU,GAAK,KAC5BE,EAAWA,EAAS,GAAK,KACJ,GAC/C,CAGAM,iBACElO,KAAKmO,cAAgBnO,KAAKmO,YAC5B,GACDlO,EAAAoI,EAAA5I,EAAAkB,UAAA,WAhCEC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,YACPC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,gBAEP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgB,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,kBAyB5B4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,kBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EA7BY2I,EAAc,I;ACNnC,MAAM3I,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,8qCAAAC,WAAA,0EAAAC,cAAA;AAAwyE5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGrzE,EAAAQ,aAAc,I;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,kvCAAAC,WAAA,mEAAAC,cAAA;AAA0tF5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGvuF,EAAAQ,aAAc;;UCJd,CACb8I,OAAU,iBACV,YAAa,oBACb,oCAAqC,4CACrC,aAAc,qBACf,I;ACJD,MAAMtJ,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,qgCAAAC,WAAA,+DAAAC,cAAA;AAAwzD5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGr0D,EAAAQ,aAAc,I;UCJd,CACb+I,QAAW,kBACX,gBAAiB,wBACjBC,QAAW,kBACZ,I;ACHD,MAAMxJ,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,sgCAAAC,WAAA,8DAAAC,cAAA;AAA4+D5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGz/D,EAAAQ,aAAc,I;UCJd,CACb,iBAAkB,yBACnB,I;;;ACDD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,s+FAAAC,WAAA,6DAAAC,cAAA;AAA0lL,IAOjmLoJ,EAAahP,EAAAC,SAAAkJ,GAI/B,EAAA9H,UAAQ,oBAAmBnB,EAJf,cAA4B+F,UAoBzC3F,YAAY2O,EAAO1O,GACjBC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,yBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,UAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,mBAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,YAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,iBAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,SAAA0O,EAAA1O,MACnBA,KAAK2O,eACH3O,KAAKsG,OAAOI,aAAaC,YAAYC,cAAcC,QAAQC,IAAI,SAC/D,OACF9G,KAAK4O,YAAYC,UACjB7O,KAAK8O,qBAAqBD,SAC5B,CAEA,YACCD,GACC,IACE5O,KAAK+O,cAAgB/O,KAAK+G,MAAMiI,QAAQ,SAC1C,CAAE,MAAOpM,GAGPqE,QAAQC,IAAI,+BACd,CACF,CAEA,qBACC4H,GACC,IACE9O,KAAKiP,uBAAyBjP,KAAK+G,MAAMhE,MAAM,mBAAoB,CACjEmM,OAAQ,CACNrI,OAAQ7G,KAAK2O,iBAGnB,CAAE,MAAO/L,GAGPqE,QAAQC,IAAI,+BACd,CACF,CAGAiI,eAAeC,GACbpP,KAAK2O,eAAiBS,EAAEC,OAAOC,MAC/BtP,KAAK8O,qBAAqBD,UAC1BO,EAAEtD,iBACJ,CAGAyD,6BAA6BC,EAAiBzG,GAC5C/I,KAAKyP,uBAAuBF,6BAC1BC,EACAzG,EAEJ,CAEA,kBAAI2G,GACF,OAAO1P,KAAKiP,iBAAiBC,QAC1BS,GAA6B,aAAnBA,EAAMC,UAErB,CAEA,cAAIC,GACF,OAAO7P,KAAKiP,iBAAiBC,QAC1BM,GAAiD,kBAA7BA,EAAgBI,UAEzC,GACD3P,EAAAoI,EAAA5I,EAAAkB,UAAA,SAhFEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,0BAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,WAKP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBACE,EAAE,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,oBAEX2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBACW,EAAE,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,aAEpB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBACI,OAAO,IAAAyN,EAAApG,EAAA5I,EAAAkB,UAAA,kBAElB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBACS,IAAI,IAAA0N,EAAArG,EAAA5I,EAAAkB,UAAA,UAEpBC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,eAWPgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,wBAWJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,wBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,kBAeJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,kBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gCAON4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gCAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EA9DYyJ,EAAa,I;;;;;;;;ACPlC,MAAMzJ,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,ygHAAAC,WAAA,uDAAAC,cAAA,IAYtB2K,EAAqB;AAAS,IAEfC,EAAqBxQ,EAAAC,SAAAC,EAA3B,cAAoC+F,UAKjD3F,cACEE,SAAS4K,WAAWlF,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,kBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,sBAAA2F,EAAA3F,MAAAE,EAAAF,KAAA,mBAyCJ,EAAA4K,aAAUC,IAC1B,MAAMmF,EAAanF,EAAQoF,aAAa,CAAE/E,KAAM;AAGhD,OAFA8E,EAAWE,UAAYlQ,KAAKmQ,oBAErB,KACLH,EAAWE,UAAY,EAAE,CAC1B,KACDhQ,EAAAF,KAAA,kBA2BgB8I,IAAS,EAAAsH,WAAUtH,EAAMgH,KAzEzC9P,KAAKqQ,aAAaxB,SACpB,CAGAyB,iBAAiBC,GACfvQ,KAAKwQ,gBAAkBD,EACvBvQ,KAAKyQ,gBAAgB5B,QAAQ0B,EAAQG,MAAMC,KAC7C,CAGAC,oBACE5Q,KAAKwQ,gBAAkB,IACzB,CAEA,gBACCC,CAAgB3H,GACf,MAAM/G,EAAM,IAAIuH,IAAItJ,KAAK6Q,eAAe/H;AAExC,IACE,MAAME,QAAiB,EAAA3G,WAAMN,EAAK,CAChCxB,QAAS,CACP,eAAgB,YAChB,gBAAiB;AAGrB,IAAIyI,EAAS8H,GAGN,CACL,MAAMC,QAAkB/H,EAASgI;AAEjC,OADAC,UAAaC,SAASH,IACf,CACT,CAPiB,CACf,MAAMI,QAAiBnI,EAASgI;AAChChR,KAAKmQ,qBAAsB,EAAAiB,YAASD,EACtC,CAKF,CAAE,MAAOvO,GAEP,OADAqO,UAAaC,SAAStO,EAAMyO,SACrB,CACT,CACF,CAWA,aACChB,GACC,MAAMtO,EAAM,IAAIuH,KAAI,EAAA8G,WA7DH,sBA6D2BN;AAE5C,IACE,MAAM9G,QAAiB,EAAA3G,WAAMN,EAAK,CAChCxB,QAAS,CACP,eAAgB,mBAChB,gBAAiB;AAGrB,IAAIyI,EAAS8H,GAGN,CACL,MAAMC,QAAkB/H,EAASgI;AAEjC,OADAC,UAAaC,SAASH,IACf,CACT,CAPiB,CACf,MAAMO,QAAqBtI,EAASrG;AACpC3C,KAAKuR,MAAQD,CACf,CAKF,CAAE,MAAO1O,GAEP,OADAqO,UAAaC,SAAStO,EAAMyO,SACrB,CACT,CACF,GAGDpR,EAAAoI,EAAA5I,EAAAkB,UAAA,SAjFE2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAS,IAAI,IAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,mBACpB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAmB,IAAI,IAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,uBAC9B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAuB,IAAI,IAAAqH,EAAA5I,EAAAkB,UAAA,oBAQlC4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,oBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,qBAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,qBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,mBAKNgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,mBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gBAkCJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAxDciL,EAAqB,I;UCf3B,CACb,aAAc,qBACd,oBAAqB,4BACrByB,UAAa,oBACd,I;;ACHD,MAAM1M,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,muDAAAC,WAAA,+CAAAC,cAAA;AAAkmF,IAIzmFsM,EAAclS,EAAAC,SAAAC,EAApB,cAA6B+F,UAAU3F,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,yB,EAAAA,M,EAAAC,I,qJAAA,CAGpD,4BAAIyR,GACF,OAAQ1R,KAAK2R,sBACf,G,EACDlS,EAAAkB,U,EAAA,yB,EAAA,CALE2H,W,EAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAA0B,CAAK,G,yUAKxCf,O,wDALwCR;iBAAA,EAAA2F,EAAAC,sBAAAP,EADpB2M,EAAc,I;;;ACJnC,MAAM3M,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,ozHAAAC,WAAA,+DAAAC,cAAA;AAAwlO,IAQ/lOyM,EAAsBrS,EAAAC,SAAAC,EAA5B,cAAqC+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,gBAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,eAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,iBAAA2F,EAAA3F,KAAA,CAK5D,gBACM6R,EAAW9D,MAAEA,EAAKD,SAAEA,EAAQgE,YAAEA,EAAWC,QAAEA,IAC/C/R,KAAKgS,aAAe,KACpBhS,KAAKiS,eAAiB;AAEtB,MAAMC,EAAU/R,UAAOC,IAAIE,KAErBmB,EAAO,CACXsM,QACAoE,KAAMrE,EACNsE,QAASN,EACTC;AAGF,IACE,MAAMM,QAAerS,KAAKsS,UACxB,GAAGJ,wBACHzQ;AAEFzB,KAAKiS,eAAiBI,EAAON,OAC/B,CAAE,MAAOnP,GACP5C,KAAKgS,aAAepP,CACtB,CAAC,QACC5C,KAAKuS,eAAgB,CACvB,CACF,CAEA,eAAMD,CAAUvQ,EAAKN,GACnB,MAAM+Q,EAAU,CACdlQ,OAAQ,OACR/B,QAAS,CAAE,eAAgB,oBAC3BgC,KAAMC,KAAKC,UAAUhB;AAGvB,IACE,MAAMuH,QAAiB,EAAA3G,WAAMN,EAAKyQ;AAClC,GAAIxJ,EAAS8H,GACX,OAAO9H,EAASrG;AAEhB,KAAM,8BAEV,CAAE,MAAOC,GACP,IAAI,EAAA6P,gBAAa7P,GAEf,KAAM;AAER,KAAM,8BACR,CACF,GACD3C,EAAAoI,EAAA5I,EAAAkB,UAAA,iBArDE2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAiB,CAAK,IAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,gBAC7B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgB,CAAK,IAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,kBAC5B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAkB,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,cAE9B4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,cAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EALY8M,EAAsB,I;UCT5B,CACbc,KAAQ,eACT,I;;;ACDD,MAAM5N,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,wjDAAAC,WAAA,0DAAAC,cAAA;AAAokF,IAO3kFwN,EAAkBpT,EAAAC,SAAAC,EAAxB,cAAiC+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,oBAAA0F,EAAA1F,KAAA,CAIxD,cAAI4S,GACF,OAAO,EAAAC,YAAS7S,MAAM8S,oBAAoB,sBAAsBF,UAClE,CAEA,YAAIG,GACF,OAAO/S,KAAK4S,WAAWG,SACnB/S,KAAK4S,WAAWG,UAAUC,MAAM,KAChC,IACN,CAEA,iBAAIC,GACF,OAAOjT,KAAK4S,WAAWK,cACnBjT,KAAK4S,WAAWK,eAAeD,MAAM,KACrC,IACN,CAGAE,MAAMC,GACJnT,KAAKS,QAAQyS,MAAMC,EACrB,GACDlT,EAAAoI,EAAA5I,EAAAkB,UAAA,WAvBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,qBACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAqB,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,SAkBjC4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,SAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EApBY6N,EAAkB,I;UCRxB,CACb,iBAAkB,yBACnB,I;ACDD,MAAM7N,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,gkBAAAC,WAAA,mEAAAC,cAAA;AAA84B5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAG35B,EAAAQ,aAAc,I;UCJd,CACb,qBAAsB,6BACtB,2BAA4B,mCAC7B,I;;;;;;;;ACFD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,89HAAAC,WAAA,gEAAAC,cAAA;AAAkgQ,IAOzgQiO,EAAe7T,EAAAC,SAAAC,EAArB,cAA8B+F,UAQ3C3F,YAAY2O,EAAO1O,GACjBC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,eAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,wBAAA4F,EAAA5F,MAAAE,EAAAF,KAAA,cAHP,MAAIE,EAAAF,KAAA,YASP,EAAA4K,aAAUC,IACnB7K,KAAKqT,YAAcxI,CAAO,KAL1B7K,KAAK4O,YAAYC,UACjB7O,KAAKsT,eAAezE,SACtB,CAMA,wBAAI0E,GACF,OAAOvT,KAAK+O,QAAQG,QAAQrI,IAAYA,EAAO2M,iBAAiBC,QAClE,CAGAC,aAAa3H,GACX,MAAM4H,EAAW,IAAIC,SAAS7H,EAAM8H;AAEpC7T,KAAK8T,aAAeH,EAAS7M,IAAI,SACnC,CAGAiN,cACE/T,KAAK8T,aAAe,GACpB9T,KAAKqT,YAAYW,OACnB,CAEA,YACCpF,GACC5O,KAAK+O,cAAgB/O,KAAK+G,MAAMiI,QAAQ,SAAU,CAChD9L,QAAS,CAAC,eAAgB,QAAS,oBAAoB+Q,KAAK,MAEhE,CAEA,eACCX,GACCtT,KAAKkU,iBAAmBlU,KAAK+G,MAAMiI,QAAQ,kBAC7C,CAGAmF,eAAeC,GACbjL,SACGkL,cAAcD,GACdD,eAAe,CAAEG,SAAU,UAChC,GACDrU,EAAAoI,EAAA5I,EAAAkB,UAAA,SArDEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WAEP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAW,EAAE,IAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,gBACpB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAgB,EAAE,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,yBACzB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAyB,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,gBAkBrC4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,eAON4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,eAMNgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,kBAOJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,kBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,kBAKJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,kBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAhDYsO,EAAe,I;;;ACPpC,MAAMtO,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,mnCAAAC,WAAA,+DAAAC,cAAA;AAA85E,IAQr6EoP,EAA4BhV,EAAAC,SAAAC,EAAlC,cAA2C+F,UAIxD3F,YAAY2O,EAAO1O,GACjBC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,oBAAA0F,EAAA1F,MAEnBA,KAAKwU,wBACLxU,KAAK4O,YAAYC,SACnB,CAEA,YACCD,SACO5O,KAAKF,KAAKiP,OAClB,CAEAyF,wBACExU,KAAKyU,kBAAoBzU,KAAKS,QAAQoB,MAAM0I,aAAamK,WAC3D,CAEA,mBAAIC,GACF,MAAM5F,QAAEA,EAAO+E,aAAEA,GAAiB9T,KAAKF,KACjC8U,EAAyBd,EAAavQ,cAAcsR;AAE1D,OAAKD,EAIE7F,EAAQG,QAAO,EAAGiD,UACAA,EAAK5O,cACNiE,SAASoN,KALxB7F,CAOX,CAEA,kBACM+F,CAAaC,GACjB/U,KAAKyU,kBAAoBM;AAEzB,MAAMzK,EAAwBtK,KAAKS,QAAQoB,MAAM0I;AACjDD,EAAsBoK,YAAc1U,KAAKyU,wBACnCnK,EAAsBE,MAC9B,GACDvK,EAAAoI,EAAA5I,EAAAkB,UAAA,WAzCEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,qBACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,eASPgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gBAuBJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAlCYyP,EAA4B,I;UCTlC,CACbS,KAAQ,eACR,YAAa,oBACb,oBAAqB,4BACrB,iCAAkC,yCAClC,+BAAgC,uCAChC,iBAAkB,yBAClB,UAAW,kBACX,wBAAyB,gCACzB,4BAA6B,oCAC9B,I;;;ACTD,MAAMlQ,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,qtKAAAC,WAAA,+DAAAC,cAAA;AAAsoT,IAQ7oT8P,EAA4B1V,EAAAC,SAAAC,EAAlC,cAA2C+F,UAMxD3F,YAAY2O,EAAO1O,GACjBC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,iBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,mBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,QAAA4F,EAAA5F,MACnBA,KAAKkV,UAAUrG,SACjB,CAEA,UACCqG,GACClV,KAAKmV,YAAcnV,KAAKF,KAAK+G,QAAQsO,OAAS,EAChD,CAEAC,oBAAoBC,GAElB,OADcrV,KAAKmV,MACNG,MAAMC,GAASA,EAAK1V,YAAY2V,YAAcH,GAC7D,CAEA,eAAII,GACF,OACEzV,KAAKoV,oBAAoB,kBACzBpV,KAAKoV,oBAAoB,gBAE7B,CAEA,kBAAIM,GACF,QAAS1V,KAAKyV,WAChB,CAEA,yBAAIE,GACF,OAAO3V,KAAK4V,oBAAoB,gBAClC,CAEA,OAAI7T,GACF,OAAO/B,KAAK2V,sBACR3V,KAAKsG,OAAOC,OAAO,YAAavG,KAAKyV,YAAY3T,IACjD9B,KAAKyV,aAAa1T,GACxB,CAEA6T,oBAAoBP,GAClB,OAAOrV,KAAKyV,aAAa5V,YAAY2V,YAAcH,CACrD,CAGAQ,kBACE7V,KAAKF,KAAK+G,OAAOiP,KAAO,2BAC1B,CAGAC,cAAchK,GACP/L,KAAK+B,IAIVgK,EAAMsD,OAAO2G,QACThW,KAAKF,KAAKgV,aAAa9U,KAAK+B,KAC5B/B,KAAKF,KAAKgV,aAAa,MALzB/I,EAAMsD,OAAO2G,SAAU,CAM3B,CAEA,aAAIC,GACF,OACEjW,KAAK+B,KACL/B,KAAKF,KAAK2U,mBACVzU,KAAKF,KAAK2U,oBAAsBzU,KAAK+B,GAEzC,CAEA,kBACMmU,CAAanK,GAEb/L,KAAK2V,uBAEP5J,EAAMoK,uBACAnW,KAAKsG,OAAO8P,aAAa,YAAapW,KAAKyV,YAAY3T,IAC7D9B,KAAKF,KAAKuW,oBACArW,KAAK0V,gBAEfzE,UAAaC,SACX,UAAUlR,KAAKF,KAAK+G,OAAOsL,6DAGjC,CAGAmE,oBACEtW,KAAKuW,kBAAoBvW,KAAKuW,gBAChC,CAGAC,yBACExW,KAAKmI,gBAAiB,EACtBnI,KAAKF,KAAK2W,gBAAkBzW,KAAKF,KAAK2W,gBACxC,CAGArO,yBACEpI,KAAKmI,gBAAiB,EACtBnI,KAAKuW,kBAAmB,EACxBvW,KAAKF,KAAK2W,gBAAkBzW,KAAKF,KAAK2W,gBACxC,GACDxW,EAAAoI,EAAA5I,EAAAkB,UAAA,UAtGEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,kBACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAkB,CAAK,IAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,oBAC9B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAoB,CAAK,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,SAChC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,aAOPgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,aAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,mBAmCJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,mBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,iBAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,iBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gBAmBN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,qBAgBN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,qBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAjGYmQ,EAA4B,I;UCTlC,CACb,WAAY,mBACb,I;;;ACDD,MAAMnQ,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,oqHAAAC,WAAA,wEAAAC,cAAA;AAAgjQ,IAKvjQuR,EAAsBnX,EAAAC,SAAAC,EAA5B,cAAqC+F,UAAU3F,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,e,EAAAA,M,EAAAC,I,qJAAA,CAI5D0W,WAAWpB,GACTvV,KAAK4W,aAAerB,CACtB,GACDtV,EAAAoI,EAAA5I,EAAAkB,UAAA,gBANE2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgB,CAAC,IAAAqH,EAAA5I,EAAAkB,UAAA,cAExB4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,cAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAHY4R,EAAsB,I;UCN5B,CACb,kBAAmB,0BACnB,uBAAwB,+BACxB,2BAA4B,mCAC7B,I;ACHD,MAAM5R,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,u4BAAAC,WAAA,sEAAAC,cAAA;AAA4kC5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGzlC,EAAAQ,aAAc,I;UCJd,CACb,oBAAqB,4BACrB,iCAAkC,yCAClC,+BAAgC,uCAChC,iBAAkB,yBAClB,UAAW,kBACX,wBAAyB,gCACzB,4BAA6B,oCAC9B,I;ACPD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,y3HAAAC,WAAA,2EAAAC,cAAA;AAAw2L5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGr3L,EAAAQ,aAAc;;UCJd,CACb,2BAA4B,mCAC7B,I;;;;;;;;ACDD,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,ymFAAAC,WAAA,qEAAAC,cAAA,IAef0R,EAAWtX,EAAAsX,YAAG,IAErBC,EAAqB,CACzB,wBACA,SACA,iBACA;AACA,IAEmBC,EAAoBxX,EAAAC,SAAAkJ,GAiEtC,EAAAC,QAAK,CAAEqO,YAAY,IAAOC,GAyI1B,EAAAtO,QAAK,CAAEuO,MAAM,IAAOzX,EA1MR,cAAmC+F,UAyBhD,kBAAI2R,GACF,OACEnX,KAAKS,QAAQqJ,iBAAmB9J,KAAKoX,SAASC,UAAU,gBAE5D,CAEAxX,YAAY2O,EAAO1O,GACjBC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,WAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,eAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,iCAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,2BAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,yBAAA0O,EAAA1O,MAAAyF,EAAAzF,KAAA,QAAAsX,EAAAtX,MAAAyF,EAAAzF,KAAA,oBAAAuX,EAAAvX,MAAAyF,EAAAzF,KAAA,kBAAAwX,EAAAxX,MAAAyF,EAAAzF,KAAA,kBAAAyX,EAAAzX,MAAAyF,EAAAzF,KAAA,gBAAA0X,EAAA1X,MAAAyF,EAAAzF,KAAA,2BAAA2X,EAAA3X,MAAAyF,EAAAzF,KAAA,uBAAA4X,EAAA5X,MAAAyF,EAAAzF,KAAA,mBAAA6X,EAAA7X,MAAAyF,EAAAzF,KAAA,iBAAA8X,EAAA9X,MAAAyF,EAAAzF,KAAA,YAAA+X,EAAA/X,MAAAE,EAAAF,KAAA,iCAEfA,KAAKoX,SAASC,UAAU,mBAC1BrX,KAAKgY,oBAELhY,KAAKiY,aAAaC,GAAG,wBAAwB,KAC3ClY,KAAKmY,sBACLnY,KAAKgY,mBAAmB,IAG9B,CAEAA,oBACEhY,KAAKoY,uBAAyBpY,KAAKS,QAAQqJ,gBACvC9J,KAAKmX,iBACPnX,KAAKqY,mCAAmCxJ,UACxC7O,KAAKsY,8BAA8BzJ,UAEvC,CAEAsJ,sBACEnY,KAAK+G,MACFwR,QAAQ,qBACRC,SAASP,GAAiBA,EAAaQ,gBAC5C,CAEA,oBAAIC,GACF,OACE1Y,KAAK2Y,YACJ,CAACC,UAAUC,QAASD,UAAUE,QAAQtR,SAASxH,KAAK2Y,UAAUI,WAEnE,CAEA,mCACCV,GAIC,UACQrY,KAAKgZ,oBAAoBnK,SACjC,CAAE,MAAOjM,GAYP,MAPAqO,UAAaC,SAAStO,SAGhB5C,KAAKiZ,wBAAwBpK,QAAQ,SACrC7O,KAAKkZ,sBAAsBrK,QAAQ,GAGnC,IAAIsK,MACR,gFACA,CAAEC,MAAOxW,GAEb,OAKM5C,KAAKiZ,wBAAwBpK,QAAQ,SACrC7O,KAAKkZ,sBAAsBrK,QAAQ,EAC3C,CAEA,wBACCoK,CAAwBI,EAAO,GAC9B,GAAIrZ,KAAKS,QAAQ6Y,YAAc,IAAOtZ,KAAKS,QAAQ8Y,UAAUC,IAC3D,IACE,MAAMC,QAAoCzZ,KAAK+G,MAAMhE,MACnD,oBACA,CACEsS,KAAMyB,EAAmB7C,KAAK,KAC9ByF,YAAa,GACbL,OACAM,SAAU,KAIRC,QAAgC5Z,KAAK+G,MAAMhE,MAC/C,oBACA,CACEsS,KAAMyB,EAAmB7C,KAAK,KAC9BoF,MAAO,EACPQ,OAAQ7Z,KAAK+C,QAIX+W,EAAOL,EAA4BK;AACzC9Z,KAAK+Z,gBAAkBD,GAAME,YAAYC,YAAc,EAEvDja,KAAKka,qBAAuBN,EAC5B5Z,KAAKma,iBAAmBna,KAAKka,qBAAqBhL,QAC/C+I,IAAkBA,EAAamC,SAElCpa,KAAKqa,eAAiBra,KAAKka,qBAAqBhL,QAC7C+I,GAAiBA,EAAamC,SAEjCpa,KAAKsa,kBAAoBjB;AAEzB,MAAMkB,EAA4C,IAA9Bva,KAAKsa,kBAAoB,GACvCE,EAAWD,EAAa;AAG5Bva,KAAKya,yBADM,IAATpB,EAC8BrZ,KAAKma,iBAAiBO,MACpDH,EACAC,GAG8B,IAC3Bxa,KAAKya,4BACLza,KAAKma,iBAAiBO,MAAMH,EAAYC,IAI/Cxa,KAAK2a,gCAAiC,CACxC,CAAE,MAAOvL,GAKP,MAJA6B,UAAaC,SAAS9B,GAClBpP,KAAKS,QAAQqJ,iBACf9J,KAAK4a,gBAAgB/L,UAEjBO,CACR,CAEJ,CAEA,sBACC8J,CAAsBG,EAAO,GAC5B,GAAIrZ,KAAKS,QAAQ6Y,YAAc,IAAOtZ,KAAKS,QAAQ8Y,UAAUC,IAC3D,IACE,MAUMM,SAVoC9Z,KAAK+G,MAAMhE,MACnD,oBACA,CACEsS,KAAMyB,EAAmB7C,KAAK,KAC9ByF,YAAa,GACbL,OACAM,SAAU,MAI2BG;AACzC9Z,KAAK6a,cAAgBf,GAAME,YAAYC,YAAc,EACrDja,KAAK8a,gBAAkBzB;AAEvB,MAAMkB,EAA0C,IAA5Bva,KAAK8a,gBAAkB,GACrCN,EAAWD,EAAa;AAG5Bva,KAAK+a,uBADM,IAAT1B,EAC4BrZ,KAAKqa,eAAeK,MAChDH,EACAC,GAG4B,IACzBxa,KAAK+a,0BACL/a,KAAKqa,eAAeK,MAAMH,EAAYC,IAI7Cxa,KAAK2a,gCAAiC,CACxC,CAAE,MAAOvL,GAKP,MAJA6B,UAAaC,SAAS9B,GAClBpP,KAAKS,QAAQqJ,iBACf9J,KAAK4a,gBAAgB/L,UAEjBO,CACR,CAEJ,CAEA,gBACCwL,SACO,EAAAI,WAAQnE,GACV7W,KAAKmX,gBACPnX,KAAKqY,mCAAmCxJ,SAE5C,CAEA,eACCoM,CAAelP,GACd,MAAMuD,MAAEA,GAAUvD,EAAMsD;AACxBrP,KAAK+C,MAAQuM,QAEP,EAAA0L,WAAQ,KACdhb,KAAKkb,sBACP,CAGAC,qBAEInb,KAAKsa,kBAAoBta,KAAK+Z,kBAC7B/Z,KAAKiZ,wBAAwBmC,WAE9Bpb,KAAKiZ,wBAAwBpK,QAAQ7O,KAAKsa,kBAAoB,EAElE,CAGAe,mBAEIrb,KAAK8a,gBAAkB9a,KAAK6a,gBAC3B7a,KAAKkZ,sBAAsBkC,WAE5Bpb,KAAKkZ,sBAAsBrK,QAAQ7O,KAAK8a,gBAAkB,EAE9D,CAGA/G,cACE/T,KAAK+C,MAAQ,GACb/C,KAAKkb,uBACLlb,KAAKsb,0BACP,CAGA1R,8BAKE,EAAAC,WACE7J,MACA,KACE,MAAM8J,gBAAEA,GAAoB9J,KAAKS,SAC3B2X,uBAAEA,GAA2BpY;AAEjC8J,IAAoBsO,IAOlBpY,KAAKmX,eACPnX,KAAKqY,mCAAmCxJ,UAExC7O,KAAKub,qBAGPvb,KAAKoY,uBAAyBtO,EAAe,GAE/C,EAEJ,CAEAyR,qBAEMvb,KAAK0Y,kBACP1Y,KAAK2Y,UAAU/M,QAIjB5L,KAAK4a,gBAAgBY,YACrBxb,KAAKqY,mCAAmCmD,YAGnCxb,KAAKyb,aAAgBzb,KAAK0b,eAC7B1b,KAAK2a,gCAAiC,EAE1C,CAEA,uBAAIgB,GAIF,OAH2B3b,KAAK4b,+BAA+B1M,QAC5D+I,IAAkBA,EAAamC,QAGpC,CAEA,qBAAIyB,GAIF,OAH0B7b,KAAK8b,6BAA6B5M,QACzD+I,GAAiBA,EAAamC,QAGnC,CAEA,kCAAIwB,GACF,MAAO,IAAI5b,KAAKya,0BAA0BsB,MACxC,CAACC,EAAGC,IACF,IAAIpU,KAAKoU,EAAEC,WAAWC,UAAY,IAAItU,KAAKmU,EAAEE,WAAWC,WAE9D,CAEA,gCAAIL,GACF,MAAO,IAAI9b,KAAK+a,wBAAwBgB,MACtC,CAACC,EAAGC,IACF,IAAIpU,KAAKoU,EAAEC,WAAWC,UAAY,IAAItU,KAAKmU,EAAEE,WAAWC,WAE9D,CAEA,oBACCnD,GACC,GAAIhZ,KAAK0Y,iBACP;AAEF,MAAQhY,eAAgB0b,GAAgBpc,KAAKS,SACvC4b,cAAEA,GAAkBlc,UAAOC;AACjC,IAAIuY;MAEE,IAAIzW,SAAQ,CAACC,EAASC,KAC1BuW,EAAY,IAAIC,UACd,GAAGyD,0CAAsDD;AAE3D,MAAME,GAAsB,EAAAC,sBAAmBvc,MAAM,KACnDA,KAAKub,oBAAoB;AAE3B5C,EAAU6D,iBAAiB,SAAS,KAC7Bxc,KAAKyb,aAAgBzb,KAAK0b,eAC7B,EAAAe,wBAAqBzc,KAAMsc,EAC7B,IAEF3D,EAAU6D,iBAAiB,QAAQ,WACjCra,GACF,IACAwW,EAAU6D,iBAAiB,SAAS,SAAU5Z,GAC5CR,EACE,IAAI+W,MACF,+FACA,CAAEC,MAAOxW,IAGf,IACA+V,EAAU6D,iBAAiB,QAASxc,KAAK0c,8BACzC/D,EAAU6D,iBACR,UACAxc,KAAK2c,+BACN,IAEH3c,KAAK2Y,UAAYA,CACnB,CAEA,8BACCL,GACC,IACE,MAAMvW,EAAM,IAAIuH,KACd,EAAA8G,WAtXkC,gCAsXW,WAEzCoC,EAAU,CACdlQ,OAAQ,MACR/B,QAAS,CACP,eAAgB,mBAChBC,cAAe,UAAUR,KAAKS,QAAQC,mBAGpCsI,QAAiB,EAAA3G,WAAMN,EAAKyQ,GAE5BoK,SADa5T,EAASrG,QACHka,UACtB3N,QAAQ4N,IAAaA,EAAQC,UAC7BC,QAAO,CAACC,EAAKH,IAAYG,EAAMH,EAAQI,OAAO;AACjDld,KAAKmd,yBAA2BP,CAClC,CAAE,MAAOha,GACPqO,UAAaC,SAAStO,EACxB,CACF,CAGA8Z,+BAGM1c,KAAKS,QAAQqJ,iBACf9J,KAAK4a,gBAAgB/L,SAEzB,CAGA8N,+BAA+BvN,GAC7B,IACE,MAAMgO,EAA+B5a,KAAK6a,MAAMjO,EAAE3N,MAC5C6b,EAAatd,KAAK+G,MAAMwW,SAAS,sBAEjCC,EADaxd,KAAK+G,MAAM0W,cAAc,sBACcC,UACxDJ,EACAF,EAA6B3b,MAGzBkc,EAAwB3d,KAAK+G,MAAM6W,KACvCJ,GAGIK,EAAiBC,MAAMC,QAAQJ,GACjCA,EAAsB,GACtBA;AAEJ,IAAKE,IAAkB,EAAAG,WAAQH,GAC7B,MAAM,IAAI1E,MAAM;AAGlB,MAAM8E,EAAuBje,KAAKya,yBAAyBnF,MACxD4I,GAAMA,GAAGpc,KAAO+b,EAAe/b;AAG9Bmc,EACFjc,OAAOC,OAAOgc,EAAsBJ,GAEpC7d,KAAKya,yBAA2B,CAC9BoD,KACG7d,KAAKya;CAIwBza,KAAKya,yBAAyB0D,MAC/DD,GAAMA,EAAEpc,KAAO6b,EAAsB7b,OAItC9B,KAAKya,yBAA2B,CAC9BkD,KACG3d,KAAKya,0BAEVza,KAAKkb,uBAET,CAAE,MAAOtY,GAEPqO,UAAaC,SAAStO,GAGtB5C,KAAKkb,uBAILjU,QAAQC,IACN,8DAEJ,CACF,CAGAgU,uBACElb,KAAKiZ,wBAAwBpK,QAAQ,GACrC7O,KAAKkZ,sBAAsBrK,QAAQ,GACnC7O,KAAKsY,8BAA8BzJ,SACrC,CAGAyM,2BACEtb,KAAKkZ,sBAAsBrK,QAAQ,EACrC,GACD5O,EAAAoI,EAAA5I,EAAAkB,UAAA,SAndEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WAGPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,YACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,gBAEPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,kCAEP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAkC,CAAK,IAAAyN,EAAApG,EAAA5I,EAAAkB,UAAA,4BAC9C2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAA4B,EAAE,IAAA0N,EAAArG,EAAA5I,EAAAkB,UAAA,0BACrC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAA0B,EAAE,IAAAsW,EAAAjP,EAAA5I,EAAAkB,UAAA,SACnC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAS,EAAE,IAAAuW,EAAAlP,EAAA5I,EAAAkB,UAAA,qBAClB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAqB,CAAC,IAAAwW,EAAAnP,EAAA5I,EAAAkB,UAAA,mBAC7B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAmB,CAAC,IAAAyW,EAAApP,EAAA5I,EAAAkB,UAAA,mBAC3B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAmB,CAAC,IAAA0W,EAAArP,EAAA5I,EAAAkB,UAAA,iBAC3B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAiB,CAAC,IAAA2W,EAAAtP,EAAA5I,EAAAkB,UAAA,4BACzB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAA4B,CAAC,IAAA4W,EAAAvP,EAAA5I,EAAAkB,UAAA,wBACpC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAwB,EAAE,IAAA6W,EAAAxP,EAAA5I,EAAAkB,UAAA,oBACjC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAoB,EAAE,IAAA8W,EAAAzP,EAAA5I,EAAAkB,UAAA,kBAC7B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAkB,EAAE,IAAA+W,EAAA1P,EAAA5I,EAAAkB,UAAA,aAC3B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,sCAAA+H,GAAA1G,OAAAwG,yBAAA/I,EAAAkB,UAAA,sCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,2BA4EPgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,2BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,yBA6DJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,yBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,mBAAAsW,GAAAjV,OAAAwG,yBAAA/I,EAAAkB,UAAA,mBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,kBAoDJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,kBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,sBASJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,sBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,oBAUN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,oBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,eAUN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,8BAON4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,8BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,uBA2ENgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,uBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,iCAyCJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,iCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gCAwBJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,kCASN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,kCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,wBA8DN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,wBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,4BAON4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,4BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAhdYiS,EAAoB,I;UCzB1B,CACb,uBAAwB,+BACxB,oBAAqB,4BACrB,qBAAsB,6BACvB,I;;;ACHD,MAAMjS,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,m/GAAAC,WAAA,oEAAAC,cAAA;AAA81N,IAMr2NiO,EAAe7T,EAAAC,SAAAC,EAArB,cAA8B+F,UAAU3F,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,S,EAAAA,M,EAAAC,I,qJAAA,CAGrD,iCAAIme,GACF,OAAOje,UAAOie,6BAChB,CAEA,sBAAIC,GACF,MAAO,CACLC,MAAO,YACPC,MAAO,MACPC,YAAa,CACXC,MAAOjc,KAAKC,UAAU,CACpB,CAACzC,KAAKoe,+BAAgC,IAAI5b,KAAKC,UAAU,CACvDic,KAAM1e,KAAKF,KAAKmY,aAAanW,UAKvC,CAEA,yBAAI6c,GACF,MAAML,MAAEA,EAAKC,MAAEA,EAAKC,YAAEA,GAAgBxe,KAAKqe;AAC3C,OAAOre,KAAKsG,OAAOC,OAAO+X,EAAOC,EAAO,CAAEC,eAC5C,CAEA,oBAAII,GACF,MAAMvJ,EAAOrV,KAAKF,KAAKmY,aAAa4G;AACpC,MAAa,UAATxJ,EACK,cACW,WAATA,EACF,SAEA,SAEX,CAGAyJ,yBAAyB/S,GACvBA,EAAMoK;AAEN,MAAMmI,MAAEA,EAAKC,MAAEA,EAAKC,YAAEA,GAAgBxe,KAAKqe;AAC3Cre,KAAKF,KAAK2W,gBAAkBzW,KAAKF,KAAK2W,iBACtCzW,KAAKsG,OAAO8P,aAAakI,EAAOC,EAAO,CAAEC,gBACzCxe,KAAKF,KAAKif,aAAaC,OAAO,EAAGhf,KAAKF,KAAKif,aAAatL,QACxDzT,KAAKF,KAAKmf,oBAAoBrB,KAAK5d,KAAKF,KAAKmY,cAC7CjY,KAAKF,KAAKof,aACVlf,KAAKF,KAAKob,uBACVlb,KAAKF,KAAKmf,oBAAoBD,OAC5B,EACAhf,KAAKF,KAAKmf,oBAAoBxL,OAElC,CAGA0L,uBAAuBC,GACrB,OAAOpf,KAAKF,KAAKif,aAAazJ,MAAM4I,GAAMA,EAAEpc,KAAOsd,GACrD,GACDnf,EAAAoI,EAAA5I,EAAAkB,UAAA,UAzDEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,4BAoCP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,4BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAiBN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAtDYsO,EAAe,I;UCPrB,CACbiM,KAAQ,eACR,qBAAsB,6BACtB,oCAAqC,4CACrC,eAAgB,uBAChB,gCAAiC,wCACjC,yBAA0B,iCAC1BC,OAAU,iBACV,kBAAmB,0BACpB,I;;;;;;;;ACRD,MAAMxa,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,44ZAAAC,WAAA,oEAAAC,cAAA;AAU4C,IAEnDoa,EAAwBhgB,EAAAC,SAAAC,EAA9B,cAAuC+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,aAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,YAAA0F,EAAA1F,MAAAE,EAAAF,KAAA,eAG/C,IAAIwf,eAAa,KAAGtf,EAAAF,KAAA,sBACb,IAAIwf,eAAa,KAAG/Z,EAAAzF,KAAA,mBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,6BAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,cAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,QAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,UAAA0O,EAAA1O,KAAA,CAO1C,6BAAIyf,GACF,OAAOzf,KAAK+e,aAAatL,OAAS,CACpC,CAEA,yBAAIiM,GACF,OACE1f,KAAK+e,aAAatL,OAAS,GAC3BzT,KAAK+e,aAAatL,SAAWzT,KAAKF,KAAK6b,oBAAoBlI,MAE/D,CAIAkM,4BAA4B1H,GACtBjY,KAAK+e,aAAavX,SAASyQ,IAC7BjY,KAAK+e,aAAaC,OAAOhf,KAAK+e,aAAaa,QAAQ3H,GAAe,GAClEjY,KAAK6f,2BAA6B,IAAI7f,KAAK+e,gBAE3C/e,KAAK+e,aAAanB,KAAK3F,GACvBjY,KAAK6f,2BAA6B,IAAI7f,KAAK+e,cAE/C,CAGAe,uBAAuB/T,GACrB/L,KAAK+e,aAAaC,OAAO,EAAGhf,KAAK+e,aAAatL,QAC1C1H,EAAMsD,OAAO2G,SACfhW,KAAK+e,aAAanB,QAAQ5d,KAAKF,KAAK6b,qBACpC3b,KAAK+f,kBAAmB,EACxB/f,KAAK6f,2BAA6B,IAAI7f,KAAK+e,gBAE3ChT,EAAMsD,OAAO2Q,eAAgB,EAC7BhgB,KAAK+f,kBAAmB,EACxB/f,KAAK6f,2BAA6B,IAAI7f,KAAK+e,cAE/C,CAIA,gBACMG,GACJ,MAAMe,EAAcjgB,KAAK+e,aAAamB,KAAKC,GAClCA,EAAEre,KAELse,EAAapgB,KAAKif,oBAAoBiB,KAAKC,GACxCA,EAAEre;AAGP9B,KAAK+e,aAAatL,OAAS,EAC7BzT,KAAKigB,YAAcA,EACVjgB,KAAKif,oBAAoBxL,OAAS,IAC3CzT,KAAKigB,YAAcG;AAErB,MAAMre,EAAM,IAAIuH,KAAI,EAAA8G,WAlEc,kCAkE2B,WACvDoC,EAAU,CACdlQ,OAAQ,OACR/B,QAAS,CACP,eAAgB,mBAChBC,cAAe,UAAUR,KAAKS,QAAQC,kBAExC6B,KAAMC,KAAKC,UAAU,CACnB4d,IAAKrgB,KAAKigB,eAGRjX,QAAiB,EAAA3G,WAAMN,EAAKyQ;AAElC,GAAIxJ,EAAS8H,GAKX,OAJA9Q,KAAK+e,aAAaC,OAAO,EAAGhf,KAAK+e,aAAatL,QAC9CzT,KAAKif,oBAAoBD,OAAO,EAAGhf,KAAKif,oBAAoBxL,QAC5DzT,KAAK+f,kBAAmB,EACxB/f,KAAKF,KAAKob,6BACGlS,EAASrG;AACjB,CACL,MAAMoO,QAAkB/H,EAASgI;AACjCC,UAAaC,SAASH,EACxB,CACF,CAGAuP,cAAczV,GACZ,MAAM0V,EAAS1V,GAET2V,QAAEA,GAAYxgB,KAAKygB,WAAWC,aAAaH,EAAQ,CACvDI,kBAFwB,CAAE/T,OAAQ;AAIpC5M,KAAKF,KAAKwb,2BACVkF,EAAQxgB,KAAK4gB,oBAAoBC,KAAK7gB,MACxC,CAGA8gB,gBAAgBjW,GACd7K,KAAKygB,WAAWM,aAAalW,EAC/B,CAGA+V,sBACM5gB,KAAKF,KAAKqb,oBAAyC,WAAnBnb,KAAKghB,WACvChhB,KAAKF,KAAKqb,qBACVnb,KAAK+f,kBAAmB,GACf/f,KAAKF,KAAKub,kBAAuC,SAAnBrb,KAAKghB,YAC5ChhB,KAAKF,KAAKub,mBACVrb,KAAK+f,kBAAmB,EAE5B,GACD9f,EAAAoI,EAAA5I,EAAAkB,UAAA,cAlHEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,aACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAa,QAAQ,IAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,oBAG5B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAoB,CAAK,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,8BAChC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAA8B,EAAE,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,eACvC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAe,EAAE,IAAAyN,EAAApG,EAAA5I,EAAAkB,UAAA,SACxBC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,+BAcP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,+BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAWN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,cAgBN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,cAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,iBAuCN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,iBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,mBAWN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,mBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,uBAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,uBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAzGYya,EAAwB,I;UCb9B,CACb,gBAAiB,wBAClB,I;ACDD,MAAMza,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,u4CAAAC,WAAA,uEAAAC,cAAA;AAA4zF5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGz0F,EAAAQ,aAAc,I;;;;;;;;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,8/BAAAC,WAAA,kDAAAC,cAAA,IAqBtB8b,EAAY,qBACZC,EAAqB;AACE,IAERC,EAAO5hB,EAAAC,SAAAC,EAAb,cAAsB+F,UASnC3F,YAAY2O,EAAgB1O,GAC1BC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,WAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,QAAA0F,EAAA1F,MAAAE,EAAAF,KAAA,aANR,IAAEyF,EAAAzF,KAAA,QAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,iBAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,YAAA6F,EAAA7F,MAObA,KAAKohB,eAAevS;AACU1O,UAAOiE,sBACfid,aAAc,CACtC,CAEA,eACCD,GACC,MAAMxa,QAAqB5G,KAAK+G,MAAMua,WACpC,gBACAthB,KAAKF,KAAKye,MAAM3X,aAAa9E,GAC7B,CACEoB,QAAS,CACP,SACA,8DACA+Q,KAAK,OAILsN,QAAgB3a,EAAa4a;AAEnC,IAAK,MAAMC,KAAUF,EAAS,CAC5B,MAAMG,QAAYD,EAAOE;AAEzB3hB,KAAK4hB,MAAQF,EAAIpM,MAAMuM,GAAOA,EAAG/f,KAAOmf,IACxCjhB,KAAK8hB,eAAiBJ,EAAIpM,MAAMuM,GAAOA,EAAG/f,KAAOof;AAGjD,MAAMa,EAAiBL,EAAIxS,QACxB2S,GAAOA,EAAG/f,KAAOmf,GAAaY,EAAG/f,KAAOof;AAE3ClhB,KAAKgiB,WAAWpE,QAAQmE,EAC1B,CACF,CAEA,iBAAIE,GACF,MAAO,cAAcjiB,KAAKF,KAAKoiB,KACjC,CAEA,YAAIC,GAMF,OACEniB,KAAKgiB,WAAW1M,MAAMuM,GAAOA,EAAG/f,IAAM9B,KAAKiiB,iBAC3CjiB,KAAKgiB,WAAW1M,MAAMuM,GA3DhB,kBA2DuBA,EAAG/f,IAEpC,GACD7B,EAAAoI,EAAA5I,EAAAkB,UAAA,YA3DEC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,SACPC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,SAGP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAS,IAAI,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,kBACpB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAkB,IAAI,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,aAC7B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAa,IAAI,IAAAqH,EAAA5I,EAAAkB,UAAA,kBASxBgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,kBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAhBcqc,EAAO,I;UC1Bb,CACbiB,SAAY,mBACZ,eAAgB,uBAChB,eAAgB,uBAChB,kBAAmB,0BACnB,kBAAmB,0BACnB,iBAAkB,yBAClB,kBAAmB,0BACnB,sBAAuB,8BACvB,4BAA6B,oCAC7B,iBAAkB,yBAClB,YAAa,oBACbC,SAAY,mBACZ,cAAe,sBACf,qBAAsB,6BACvB,I;;;ACdD,MAAMvd,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,4yZAAAC,WAAA,6EAAAC,cAAA,IAatBmd,EAAqB,CACzB,kBACA,YACA,aACA;AACA,IAEmBC,EAAyBhjB,EAAAC,SAAAkJ,GAK3C,EAAA9H,UAAQ,oBAAmBqW,GAsG3B,EAAAtO,QAAK,CACJC,eAAgB,EAChB4Z,SAAS,IACT/iB,EA9GW,cAAwC+F,UAqBrD3F,YAAY2O,EAAO1O,GACjBC,MAAMyO,EAAO1O,GAAM2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,YAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,WAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,SAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,kBAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,QAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,eAAA0O,EAAA1O,MAAAyF,EAAAzF,KAAA,cAAAsX,EAAAtX,MAAAyF,EAAAzF,KAAA,aAAAuX,EAAAvX,MAAAyF,EAAAzF,KAAA,WAAAwX,EAAAxX,MAAAyF,EAAAzF,KAAA,gBAAAyX,EAAAzX,MAAAyF,EAAAzF,KAAA,UAAA0X,EAAA1X,MAAAyF,EAAAzF,KAAA,cAAA2X,EAAA3X,MAAAyF,EAAAzF,KAAA,gBAAA4X,EAAA5X,MAAAyF,EAAAzF,KAAA,qBAAA6X,EAAA7X,MAAAyF,EAAAzF,KAAA,SAAA8X,EAAA9X,MAAAyF,EAAAzF,KAAA,YAAA+X,EAAA/X,MAAAyF,EAAAzF,KAAA,eAAAyiB,EAAAziB,MAEnBA,KAAK4O,YAAYC,UACjB7O,KAAK0iB,8BAA8B7T,UAC/B7O,KAAK2iB,sCACP7E,MAAM8E,KAAK5iB,KAAK2iB,sCAAsCnK,SAASqK,IAC7D7iB,KAAK8iB,aAAaD,EAAK,GAG7B,CAEA,SAAIE,GACF,OAAO/iB,KAAKgjB,UAAUC,aAAa,cACrC,CAEA,mCAAIC,GACF,OAAOljB,KAAKmjB,gBAAgBC,YAAYC,KAC1C,CAEA,yCAAIC,GACF,OAAOtjB,KAAKmjB,gBAAgBC,YAAYG,WAC1C,CAEA,wCAAIZ,GACF,OAAO3iB,KAAKmjB,gBAAgBC,YAAYI,UAC1C,CAEA,iBAAIC,GACF,MAAMC,EACJ1jB,KAAKsG,OAAOI,aAAaC,YAAYC,cAAcC,QAAQC,IAAI,SAC/D;AAEF,MAA2B,SAAvB4c,GAAwD,eAAvBA,EAC5B1jB,KAAK2jB,aAEL3jB,KAAK4jB,YAAYtO,MAAMuO,GAAOA,IAAOH,GAEhD,CAEA,YACC9U,GAEC,MAAMG,QAAgB/O,KAAK+G,MAAMiI,QAAQ;AACzChP,KAAK4jB,YAAc7U,EAAQmR,KAAK2D,GAAOA,EAAG1R,MAC5C,CAEA,8BACCuQ,GAEC,MAAMxQ,EAAU/R,UAAOC,IAAIE,KACrBwjB,EAAgB3jB,UAAO2jB,cACvBxS,QAAqBtR,KAAK+jB,YAC9B,GAAG7R,yCAA+C4R;AAEpD9jB,KAAKgkB,aAAe1S,EAAeA,EAAa2S,OAAS;AAGzD,MAAMC,QAAyBlkB,KAAK+jB,YAClC,GAAG7R;AAELlS,KAAKmkB,WAAaD,GAAoB,EACxC,CAEA,iBAAMH,CAAYhiB,GAChB,MAAMiH,QAAiB3G,MAAMN,EAAK,CAChCxB,QAAS,IAAI6jB,QAAQpkB,KAAKO;AAE5B,GAAIyI,EAAS8H,GACX,aAAa9H,EAASrG;AAExB,MAAMoO,QAAkB/H,EAASgI;AACjCC,UAAaC,SAASH,GACtB/Q,KAAKqkB,SAAU,CACjB,CAEA,WAAI9jB,GAGF,MAAO,CACL,eAAgB,2BAChBC,cAAe,UAJGR,KAAKS,QAAUT,KAAKS,QAAQC,eAAiB,KAK/D4jB,SAAU,OAEd,CAEA,YAICC,CAAY1B,GAEX,GADA7iB,KAAKwkB,yBACAxkB,KAAKykB,aAAa5B,GAGrB,YADA7iB,KAAK+iB,MAAMrZ,OAAOmZ;AAGpB,MAgBM6B,EAdcC,WAClB,MAAMnB,QAAmBoB;AACzB,IAAIpB,EASF,MAFAxjB,KAAK+iB,MAAMrZ,OAAOmZ,GAClB7iB,KAAK6kB,UAAY,eACX;AARN7kB,KAAK8kB,YAAc,IAAI9kB,KAAK8kB,YAAatB,GACrCxjB,KAAK+kB,cAActR,QACrBzT,KAAK8kB,YAAYlH,QAAQ5d,KAAK+kB,cAOlC,EAEyBC,CAhBDhlB,KAAKilB,qBAAqBpC;AAiBpD7iB,KAAKklB,mBAAqB,IAAIllB,KAAKklB,mBAAoBR,SACjDA,CACR,CAEA,0BAAMO,CAAqBpC,GACzB,IACE,MAAM3Q,EAAU/R,UAAOC,IAAIE,KACrB8b,EAAcpc,KAAKS,QAAQC,eAC3BsI,QAAiB6Z,EAAKsC,OAC1B,GAAGjT,6BACH,CAEE3R,QAAS,CAAE6kB,cAAe,UAAUhJ,KACpC3a,KAAMohB;AAGV,GAAwB,MAApB7Z,EAASqc,QAAsC,MAApBrc,EAASqc,OAAgB,CAEtD,aAD2Brc,EAASrG,QAChB2iB,qBAAqBC,WAC3C,CACA,KAAM,uBACR,CAAE,MAAOnW,GAEP,OADA6B,UAAaC,SAAS9B,IACf,CACT,CACF,CAKA,kBACM0T,CAAaD,GACjB,IAAK7iB,KAAKykB,aAAa5B,GAGrB,YADA7iB,KAAK+iB,MAAMrZ,OAAOmZ;AAGpB,MAAMlP,EAAW,IAAIC,SACf4R,EAAS,IAAIC,KAAK,CAAC5C,GAAOA,EAAK1Q,KAAM,CACzCkD,KAAM;AAER1B,EAAS+R,OAAO,OAAQF;AACxB,IACE,MACMzjB,EAAM,GADI5B,UAAOC,IAAIE,gCAErBkS,EAAU,CACdlQ,OAAQ,OACR/B,QAAS,CACPC,cAAe,UAAUR,KAAKS,QAAQC,kBAExC6B,KAAMoR,GAEF3K,QAAiB3G,MAAMN,EAAKyQ;AAClC,GAAwB,MAApBxJ,EAASqc,QAAsC,MAApBrc,EAASqc,OAAgB,CACtD,MACMM,SADqB3c,EAASrG,QACX2iB,qBAAqBC,YAExCP,EAAcL,UAClB,MAAMiB,QAAqBD;AAC3B,IAAIC,EAMF,MAFA/C,EAAKE,MAAMrZ,OAAOmZ,GAClB7iB,KAAK6kB,UAAY,eACX;AALN7kB,KAAK+kB,cAAgB,IAAI/kB,KAAK+kB,cAAea,EAM/C;AAEF,OAAOZ,EAAYW,EACrB,CAEE,GADA3lB,KAAKwkB,yBACAxkB,KAAKykB,aAAa5B,GAGrB,YADA7iB,KAAK+iB,MAAMrZ,OAAOmZ,EAIxB,CAAE,MAAOzT,GAEP,OADA6B,UAAaC,SAAS9B,IACf,CACT,CACF,CAEA,gBACMyC,EAAWgU,YACfA,EAAWlX,eACXA,EAAc0U,MACdA,EAAKE,YACLA,EAAWuC,SACXA,UAEM5jB,QAAQ6jB,WAAW/lB,KAAKklB;AAE9B,MAAMhT,EAAU/R,UAAOC,IAAIE,KACrBwjB,EAAgB3jB,UAAO2jB,cAEvBkC,EAAchmB,KAAKsG,OAAOI,aAAauf,OAAOC,SAAW,OACzDC,EAAkBnmB,KAAKomB,SAASC,YAAYL,IAAgB,OAC5DM,EAAsB3X,EACzB4X,QAAQ,MAAO,KACfhjB,cACGijB,EAAsB,GAAGjD,kBAA4B/gB,KAAKC,UAC9D0jB,iBACcH,wBAAkCrX,IAC5C2W,EAAuBtlB,KAAK8kB,YAAY5E,KAC3CuG,GAAMA,EAAEC,wBAELC,EAAyB3mB,KAAK+kB,cAAc7E,KAC/CuG,GAAMA,EAAEC,wBAGLjlB,EAAO,CACXc,KAAM,CACJqkB,cAAe9C,EACf+C,cAAehB,EAAY/jB,GAC3BglB,mBAAoB,CAClBhK,QAASuG,EACTE,YAAaiD,EACbV,SAAU,CAAEhkB,GAAIgkB,EAAShkB,IACzBilB,OACEf,GAAeA,GAAeM,EAC1B,CAACN,GACD,CAACA,EAAaM,GACpB9C,WAAY8B,EAAqB7R,OAC7B6R,EACAqB;AAKV,IACE,MAAMtU,QAAerS,KAAKsS,UACxB,GAAGJ,gDACHzQ;AAEFzB,KAAKgnB,SAAW3U,EAAO2U,QACzB,CAAE,MAAOpkB,GACP5C,KAAKqkB,SAAU,EACfpT,UAAaC,SAAStO,EACxB,CAAC,QACC5C,KAAKuS,eAAgB,CACvB,CACF,CAEA,aACM0U,GACJjnB,KAAKF,KAAKonB,8BAA6B;AACvC,IACE,MAAMC,QAAeC,UAAUC,aAAaC,gBAAgB,CAC1DC,MAAO,CAAEC,YAAa;AAEpB,iBAAkBxc,OACpBhL,KAAKynB,aACGC,UAAeC,+BAA+BR,GAEtDnnB,KAAKynB,aAAeC,UAAeE,4BAA4BT,EAEnE,CAAC,QACCnnB,KAAKF,KAAKonB,8BAA6B,EACzC,CACF,CAEA,eAAM5U,CAAUvQ,EAAKN,GACnB,MACM+Q,EAAU,CACdlQ,OAAQ,OACR/B,QAAS,CACP,eAAgB,mBAChBC,cAAe,UALCR,KAAKS,QAAQC,kBAO/B6B,KAAMC,KAAKC,UAAUhB;AAGvB,IACE,MAAMuH,QAAiB3G,MAAMN,EAAKyQ;AAClC,GAAIxJ,EAAS8H,GACX,OAAO9H,EAASrG;AACX,CACL,MAAMC,QAAcoG,EAASrG;AAC7B,GAAIC,GAAOoP,aACT,MAAMpP,EAAMoP;AAEd,KAAM,8BACR,CACF,CAAE,MAAOpP,GACP,IAAI,EAAA6P,gBAAa7P,GAEf,KAAM;AAER,MAAMA,CACR,CACF,CAGAwJ,SACEpM,KAAK6nB,0BAA2B,EAChC7nB,KAAKynB,OAAOK,QAAQ7e,IAClB,MAAMF,EAAW,eAAc,IAAIlB,MAAOsU;AAC1ClT,EAAKkJ,KAAOpJ;AACZ,MAAMgf,EAAaC,aAAWC,SAAShf,EAAM;AAC7CjH,OAAOkmB,eAAeH,EAAWlF,KAAM,OAAQ,CAC7CsF,WAAW,EACXrnB,YAAY,EACZwO,MAAOrG,IAETjH,OAAOkmB,eAAeH,EAAWlF,KAAM,SAAU,CAC/CsF,WAAW,EACX7Y,MAAO,SAETyY,EAAW5V,KAAOpJ,EAClB/I,KAAKukB,YAAY1V,QAAQkZ,GACzB/nB,KAAKynB,OAAS,KACdznB,KAAKF,KAAKsoB,gCAA+B,EAAM,GAC9C,YACL,CAEA5D,wBACExkB,KAAK6kB,UAAY,IACnB,CAGAJ,aAAa5B,GACX,OAAK7iB,KAAKqoB,gBAAgBxF,EAAKxN,QAI1BrV,KAAKsoB,gBAAgBzF,EAAK0F,QAC7BvoB,KAAK6kB,UAAY,qBACV,IALP7kB,KAAK6kB,UAAY,qBACV,EAOX,CAEAwD,gBAAgBG,GACd,OAAOlG,EAAmB9a,SAASghB,EACrC,CAEAF,gBAAgBC,GACd,OAAOA,GA7XkB,GA8X3B,CAGAE,YAAY5F,GACV7iB,KAAKukB,YAAY1V,QAAQgU,EAC3B,CAGA6F,cAAc7F,GACZ7iB,KAAK8kB,YAAc9kB,KAAK8kB,YAAY5V,QAAO,SAAUuX,GACnD,OAAOA,EAAEC,uBAAyB7D,EAAK6D,qBACzC,IACA1mB,KAAK+kB,cAAgB/kB,KAAK+kB,cAAc7V,QAAO,SAAUuX,GACvD,OAAOA,EAAEC,uBAAyB7D,EAAK6D,qBACzC,GACF,CAEAiC,cACE3oB,KAAKF,KAAKsoB,gCAA+B;AACzC,MAAMrF,EAAQ/iB,KAAKgjB,UAAU1N,KAAK;AAClC,GAAIyN,EACF,KAAOA,EAAMxR,MAAMkC,QAAQ,CACzB,MAAMoP,EAAOE,EAAMxR,MAAM;AACzBsR,EAAKE,MAAMrZ,OAAOmZ,EACpB,CAEF9iB,MAAM4oB,eAAehe,UACvB,GACD1K,EAAAoI,EAAA5I,EAAAkB,UAAA,WAjZEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,aACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,YACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,mBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA5I,EAAAkB,UAAA,SAEPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA5I,EAAAkB,UAAA,gBAEP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAgB,EAAE,IAAAsW,EAAAjP,EAAA5I,EAAAkB,UAAA,eACzB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAe,EAAE,IAAAuW,EAAAlP,EAAA5I,EAAAkB,UAAA,cACxB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAc,EAAE,IAAAwW,EAAAnP,EAAA5I,EAAAkB,UAAA,YACvB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyW,EAAApP,EAAA5I,EAAAkB,UAAA,iBACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAiB,CAAK,IAAA0W,EAAArP,EAAA5I,EAAAkB,UAAA,WAC7B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAW,CAAK,IAAA2W,EAAAtP,EAAA5I,EAAAkB,UAAA,eACvB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAe,EAAE,IAAA4W,EAAAvP,EAAA5I,EAAAkB,UAAA,iBACxB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAiB,EAAE,IAAA6W,EAAAxP,EAAA5I,EAAAkB,UAAA,sBAC1B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAAsB,EAAE,IAAA8W,EAAAzP,EAAA5I,EAAAkB,UAAA,UAC/B2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA+W,EAAA1P,EAAA5I,EAAAkB,UAAA,aACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyhB,EAAApa,EAAA5I,EAAAkB,UAAA,gBACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgB,IAAI,IAAAqH,EAAA5I,EAAAkB,UAAA,eA0C3BgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,iCAOJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,iCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,eAAAsW,GAAAjV,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gBAiGJ4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,cAqDN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,cAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,WA6DN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,WAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,UAiDN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,UAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gBA2BN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,eAqBN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,eAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,iBAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,iBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EA7XYyd,EAAyB,I;UCrB/B,CACb,kCAAmC,0CACpC,I;ACDD,MAAMzd,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,6iFAAAC,WAAA,6FAAAC,cAAA;AAGb,MAAMyjB,UAAgDpjB,UACnE,UAAIqjB,GACF,OAAO7oB,KAAKF,KAAK2nB,OAAOqB,WAC1B,EACDvpB,EAAAC,QAAAopB,GAAA,EAAAxjB,EAAAC,sBAAAP,EAJoB8jB,EAAuC,I;ACH5D,MAAM9jB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,8zCAAAC,WAAA,gFAAAC,cAAA;AAGb,MAAM4jB,UAAqCvjB,UACxD,UAAIqjB,GACF,OAAO7oB,KAAKF,KAAK2nB,OAAOqB,WAC1B,EACDvpB,EAAAC,QAAAupB,GAAA,EAAA3jB,EAAAC,sBAAAP,EAJoBikB,EAA4B,I;ACHjD,MAAMjkB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,iwCAAAC,WAAA,uEAAAC,cAAA;AAA47E5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGz8E,EAAAQ,aAAc,I;UCJd,CACb8I,OAAU,iBACV,YAAa,oBACb,eAAgB,uBAChB,aAAc,qBACd,oCAAqC,4CACtC,I;ACLD,MAAMtJ,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,8jHAAAC,WAAA,iEAAAC,cAAA;AAAw2N5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGr3N,EAAAQ,aAAc,I;UCJd,CACb0jB,KAAQ,eACR,sBAAuB,8BACvB,gBAAiB,wBAClB,I;;;ACHD,MAAMlkB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,yoGAAAC,WAAA,+DAAAC,cAAA;AAAglM,IAMvlM8jB,EAAI1pB,EAAAC,SAAAkJ,GAEtB,EAAA9H,UAAQ,oBAAmBnB,EAFf,cAAmB+F,UAIhC3F,cACEE,SAAS4K,WAAWlF,EAAAzF,KAAA,+BAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,kBAAA0F,EAAA1F,MACpBA,KAAKmjB,gBAAgB+F,uBAAyBlpB,KAAKkpB,sBACrD,CAGAC,0BACEnpB,KAAKopB,8BAA+B,EACpCppB,KAAKmjB,gBAAgBC,YAAc,CAAC,CACtC,CAGA8F,yBACElpB,KAAKopB,8BAA+B,CACtC,GACDnpB,EAAAoI,EAAA5I,EAAAkB,UAAA,gCAlBE2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgC,CAAK,IAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,mBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,2BAQ5C4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,2BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAfYmkB,EAAI,I;UCPV,CACb,gBAAiB,wBACjB,sBAAuB,8BACvB,kBAAmB,0BACpB,I;;;;;;;;ACHD,MAAMnkB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,ykEAAAC,WAAA,gEAAAC,cAAA;AAA4wI,IAMnxIkkB,EAAe9pB,EAAAC,SAAAkJ,GAEjC,EAAA9H,UAAQ,oBAAmBnB,EAFf,cAA8B+F,UAU3C3F,cACEE,SAAS4K,WAAWlF,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,kBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,yBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,2BAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,+BAAA6F,EAAA7F,MAAAE,EAAAF,KAAA,UAHZ,MAIRA,KAAKmjB,gBAAgBmG,iBAAmBtpB,KAAKspB,gBAC/C,CAGAC,gBAAgBC,GACdxpB,KAAKwpB,QAAUA,CACjB,CAGAC,6BAA6BC,GAC3B1pB,KAAK2pB,8BAA+B,EACpCD,GAAgBA,GAClB,CAGAE,6BAA6BC,GAC3B7pB,KAAK2pB,8BAA+B,EACpCE,GAAgBA,GAClB,CAGAC,0BAA0Bxa,GACxBtP,KAAK+pB,uBAAyBza,CAChC,CAGAga,mBACEtpB,KAAKwpB,QAAQxd,QACf,CAEA,iCACMge,CAA4BC,GAChCA,GAAeA,UACTjqB,KAAKsG,OAAO8P,aAAa,YAAa,aAC9C,CAGA8T,sBACElqB,KAAK2pB,8BAA+B,CACtC,GACD1pB,EAAAoI,EAAA5I,EAAAkB,UAAA,UAnDEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,mBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,0BAGP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAA0B,CAAK,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,4BACtC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAA4B,CAAI,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,gCACvC2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgC,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,mBAS5C4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,mBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gCAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,gCAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,6BAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,6BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,oBAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,oBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,+BAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,+BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,uBAMN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,uBAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAhDYukB,EAAe,I;;;ACNpC,MAAMvkB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,mIAAAC,WAAA,2EAAAC,cAAA;AAK5B,IAkBqBglB,EAA6B5qB,EAAAC,SAAAC,EAAnC,cAA4C+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,KAAA,CAInE,4BACMoqB,GACJ,GAAIpqB,KAAKS,QAAQqJ,gBAAiB,CAChC,IAAK9J,KAAKS,QAAQ4pB,YAAa,CAC7B,MAAMA,YAAEA,GAAgBrqB,KAAKsG,OAAOI,aAAa8X;AACjDxe,KAAKS,QAAQ4pB,YAAcA,CAC7B,OACMrqB,KAAKS,QAAQ6pB,0CACrB,CACF,GACDrqB,EAAAoI,EAAA5I,EAAAkB,UAAA,WAbEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,0BAEP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAJYqlB,EAA6B,I;;;ACvBlD,MAAMrlB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,mIAAAC,WAAA,8EAAAC,cAAA;AAK5B,IAkBqBolB,EAAgChrB,EAAAC,SAAAC,EAAtC,cAA+C+F,UAAU3F,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,KAAA,CAItE,4BACMoqB,GACCpqB,KAAKS,QAAQ+pB,eAChBxqB,KAAKS,QAAQgqB,+BAEbzqB,KAAKS,QAAQ4pB,YAAcrf,OAAO0f,SAASC,eACrC3qB,KAAKsG,OAAO8P,aAAa,SAASwU,QAE5C,GACD3qB,EAAAoI,EAAA5I,EAAAkB,UAAA,WAZEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,0BAEP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAJYylB,EAAgC,I;ACvBrD,MAAMzlB,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,yoBAAAC,WAAA,sDAAAC,cAAA;AAA4jC5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGzkC,EAAAQ,aAAc,I;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,25BAAAC,WAAA,iEAAAC,cAAA;AAAg3D5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAG73D,EAAAQ,aAAc,I;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,2lDAAAC,WAAA,6DAAAC,cAAA;AAA49E5F,EAAAC,SAAA,EAAA4F,EAAAC,sBAAAP,GAGz+E,EAAAQ,aAAc,I;;;;;;;;ACH7B,MAAMR,GAAsB,EAAAC,EAAAC,uBAAA,CAAAlD,GAAA,WAAAmD,MAAA,80DAAAC,WAAA,0EAAAC,cAAA;AAsC3B,IAEoB0lB,EAA8BtrB,EAAAC,SAAAkJ,GAChD,EAAA9H,UAAQ,oBAAmBqW,GAW3B,EAAArW,UAAQ,aAAYkqB,GACpB,EAAAlqB,UAAQ,gBAAemqB,GACvB,EAAAnqB,UAAQ,gBAAenB,EAdX,cAA6C+F,UAgB1D,gBAAIwlB,GACF,MAAMC,oBAAEA,GAAwBjrB,KAAKF,KAAKorB,qBACpCC,WAAEA,GAAeF,EAAoBG,cAAc,cACnDJ,EAAehrB,KAAKS,QAAQuqB;AAClC,OAAOG,EAAW1X,OAAS,EACvBzR,OAAOqpB,YACLF,EAAWjL,KAAKoL,GACP,CAACA,EAAON,EAAaM,OAGhC,IACN,CAEA,oCAAIC,GACF,OAAOvrB,KAAKF,KAAKorB,oBAAoBppB,GAAGykB,QACtC,GAAGvmB,KAAKwrB,UAAUvF,OAAOC,WACzB,GAEJ,CAOA,YAAIE,GACF,MAAMqF,mCAAEA,GAAuCzrB;AAG/C,OADEyrB,EAAmCzrB,KAAKurB,iCAE5C,CAEA,yBAAInnB,GACF,OAAOpC,OAAOC,OACZ,CAAC,EACD9B,UAAOiE,sBACPpE,KAAK0rB,4BAET,CAEA,qBAAIne,GACF,OAAOvN,KAAKsN,mBAAmBC,kBAAkBoe,UACnD,CAEA,eAAIC,GAIF,OAHoB5rB,KAAK6rB,mBAAmBC,eAC1C9rB,KAAKurB,iCAGT,CAEA,YAAInF,CAAS9W,GACX,MAAQmc,mCAAoCM,GAAa/rB,KACnDgsB,EAAWhqB,OAAOC,OAAO,CAAC,EAAG8pB;AAGrB,OAAVzc,SACK0c,EAAShsB,KAAKurB,kCAErBS,EAAShsB,KAAKurB,kCAAoCjc,EAEpDtP,KAAKisB,oBAAoBD,EAC3B,CAYA,sCAAIP,GACF,MAAMD,UAAEA,GAAcxrB,MAChBwe,YAAEA,GAAgBgN,GAChB/M,MAAOyN,GAAqB1N;AAEpC,OAAO0N,EAAmBlqB,OAAOmqB,OAAO3pB,KAAK6a,MAAM6O,IAAqB,CAAC,CAC3E,CAGAE,0BAA0BrgB,GACxB,MAAQsgB,OAAQ/c,GAAUvD;AACtBuD,GAASA,EAAMmE,OA7HM,IA8HvBxC,UAAaC,SAAS,yCAEtBlR,KAAKomB,SAAW9W,CAEpB,CAGAgd,uBAAuBvgB,GACrB,MAAMsgB,OAAEA,GAAWtgB;AACnB/L,KAAKmjB,gBAAgBC,YAAciJ,EACnCrsB,KAAKmjB,gBAAgBmG,mBACrBtpB,KAAKmjB,gBAAgB+F,wBACvB,CAGAqD,0BAA0BxgB,GACxB,MAAQsgB,OAAQ/c,GAAUvD;AACtBuD,GAASA,EAAMmE,OA9IS,IA+I1BxC,UAAaC,SAAS,yCAEtBlR,KAAK6rB,mBAAmBW,wBACtBxsB,KAAKurB,iCACLjc,EAGN,CAGAmd,oCACEzsB,KAAKiY,aAAaiD,sBACpB,CAGAwR,sBAAsB3gB,GACpB,MAAQsgB,OAAQra,GAAiBjG,EAC3B8V,EAAK7hB,KAAKF,KAAKorB;AAErBja,UAAa0b,cAAc3a,EAAc,CACvCoU,SAAUpmB,KAAKomB,UAAY,OAC3BhiB,sBAAuBpE,KAAKoE,sBAC5BqC,SAAUob,EAAG/f,GACb8qB,KAAM/K,EAAG/a,IAAI,0BACb+lB,UAAWhL,EAAG/a,IAAI,gCAEtB,CAEA,iCACMgmB,CAA4B/gB,GAChC,MAAMwJ,KAAEA,EAAIwX,UAAEA,GAAchhB,EAAMsgB;AAElC,IAAK9W,EAEH,YADAtE,UAAaC,SAAS;AAIxB,GAAIqE,GAAwB,iBAATA,EAIjB,YAHAtE,UAAaC,SACX,wCAAwCqE;AAK5C,GAAIwX,GAAkC,iBAAdA,EAItB,YAHA9b,UAAaC,SACX,6DAA6D6b;AAKjE,MAAMC,EAAchrB,OAAOC,OACzB,CAAC,EACDjC,KAAKitB,gBAAgB5G,YAAY9Q;AAGnC,GAAIwX,EAAW,CACb,IAAK,MAAOG,EAAuB5d,KAAUtN,OAAOmrB,QAAQJ,GAAY,CACtE,GAAqB,iBAAVzd,GAAgC,OAAVA,EAI/B,YAHA2B,UAAaC,SACX,aAAagc,0CAA8D5d;AAI/E,GAAqB,iBAAVA,GAAsBA,EAAMmE,OAAS,IAK9C,YAHAxC,UAAaC,SACX,aAAagc,0EAA8F5d,EAAMmE,oBAIvH,CAIAzR,OAAOorB,KAAKL,GAAWvU,SAAS0U,IAEW,OAArCH,EAAUG,UACLF,EAAYE,GAEnBF,EAAYE,GAAyBH,EAAUG,EACjD,GAEJ,CAEAltB,KAAKisB,oBAAoBe,EAAazX,EACxC,CAEA,0BACM8X,CAAqBthB,GACzB,MAAMuhB,UAAEA,EAASP,UAAEA,GAAchhB,EAAMsgB;AAEvC,IAAKiB,EAEH,YADArc,UAAaC,SAAS;AAIxB,GAAIoc,GAAkC,iBAAdA,EAItB,YAHArc,UAAaC,SACX,6CAA6Coc;AAKjD,GAAIP,GAAkC,iBAAdA,EAItB,YAHA9b,UAAaC,SACX,6DAA6D6b;AAKjE,MAAMC,EAAchrB,OAAOC,OACzB,CAAC,EACDjC,KAAKitB,gBAAgB5G,YAAYrmB,KAAKwrB;AAGxC,GAAIuB,EAAW,CACb,IAAK,MAAOG,EAAuB5d,KAAUtN,OAAOmrB,QAAQJ,GAAY,CACtE,GAAqB,iBAAVzd,GAAgC,OAAVA,EAI/B,YAHA2B,UAAaC,SACX,aAAagc,0CAA8D5d;AAI/E,GAAqB,iBAAVA,GAAsBA,EAAMmE,OAAS,IAK9C,YAHAxC,UAAaC,SACX,aAAagc,0EAA8F5d,EAAMmE,oBAIvH,CAIAzR,OAAOorB,KAAKL,GAAWvU,SAAS0U,IAEW,OAArCH,EAAUG,UACLF,EAAYE,GAEnBF,EAAYE,GAAyBH,EAAUG,EACjD,GAEJ,CAEA,MAAMK,EACJvrB,OAAOorB,KAAKJ,GAAavZ,OAAS,EAC9BjR,KAAKC,UAAUuqB,QACfQ;AAENxtB,KAAKsG,OAAO8P,aAAa,CACvBoI,YAAa,CACXC,MAAO8O,EACPrL,IAAKoL,IAGX,CAQAG,wBAAwB1hB,GACtB,MAAMwJ,KAAEA,EAAIwX,UAAEA,GAAchhB,EAAMsgB;AAE7BrsB,KAAK0tB,yBAAyBnY,EAAMwX,IAIzC/sB,KAAK2tB,qBAAqBC,IAAI,CAAErY,OAAMwX,aACxC,CAEQc,wBAAwB9hB,GAC9B,MAAMwJ,KAAEA,EAAIwX,UAAEA,GAAchhB,EAAMsgB;AAE7BrsB,KAAK0tB,yBAAyBnY,EAAMwX,IAIzC/sB,KAAK2tB,qBAAqBnV,SAASsV,IACjC,MAAMC,EAAWD,EAAKvY,OAASA,EAKzByY,EACJxrB,KAAKC,UAAUqrB,EAAKf,aAAevqB,KAAKC,UAAUsqB;AAEhDgB,GAAYC,GACdhuB,KAAK2tB,qBAAqBM,OAAOH,EACnC,GAEJ,CAEAJ,yBAAyBnY,EAAMwX,GAE7B,IAAI,EAAAmB,aAAU3Y,IAAyB,iBAATA,EAI5B,OAHAtE,UAAaC,SACX,wCAAwCqE,YAEnC;AAIT,GACEwX,GACuB,iBAAdA,GAA+C,iBAAdA,EAK1C,OAHA9b,UAAaC,SACX,uEAAuE6b,YAElE;AAGT,GAAIA,GAAkC,iBAAdA,EACtB,IAAK,MAAOG,EAAuB5d,KAAUtN,OAAOmrB,QAAQJ,GAAY,CACtE,GAAqB,iBAAVzd,GAAgC,OAAVA,EAI/B,OAHA2B,UAAaC,SACX,aAAagc,0CAA8D5d,YAEtE;AAET,GAAqB,iBAAVA,GAAsBA,EAAMmE,OAhXlB,IAqXnB,OAHAxC,UAAaC,SACX,aAAagc,0EAAkH5d,EAAMmE,sBAEhI,CAEX,CAGF,OAAO,CACT,CAEA,gBAAI0a,GACF,MAAMC,EAAkB,CAAC;AACzB,IAAK,MAAMC,KAAuBruB,KAAK2tB,qBAAsB,CAC3D,MAAMW,EAAMtuB,KAAKuuB,kBAAkBF,GAC7BF,EAAe,GAAGnuB,KAAKwuB,UAAUxuB,KAAKyuB,gBAC1CJ;AAEFD,EAAgBE,GAAOH,CACzB,CACA,OAAOC,CACT,CAEAK,gBAAgBJ,GACd,IAAI9Y,KAAEA,EAAIwX,UAAEA,GAAcsB,EACtBK,EAAmB,CAAC;AAEnBnZ,IACHA,EAAOvV,KAAKsG,OAAOI,aAAauf,OAAOC,cAGvBsH,IAAdT,IACFA,EAAY,CAAC,GAIG,OAAdA,IACF2B,EAAmB1uB,KAAKitB,gBAAgB5G,YAAY9Q,IAAS,CAAC,GAIvC,iBAAdwX,IACTA,EAAY,CACV,CAAC/sB,KAAKurB,kCAAmCwB;AAK7C,MAAM4B,EAAkB3sB,OAAOC,OAAOysB,EAAkB3B,GAClDtO,EACJzc,OAAOorB,KAAKuB,GAAiBlb,OAAS,EAClCjR,KAAKC,UAAUksB,QACfnB;AAEN,OAAOxtB,KAAKsG,OAAOC,OAAO,YAAagP,EAAM,CAC3CiJ,YAAa,CACXC,UAGN,CAEA8P,kBAAkBF,GAEhB,OAAO7rB,KAAKC,UAAU4rB,EACxB,CAKA,aAAI7C,GACF,MAAMA,EAAYxrB,KAAKsG,OAAOI,aAAa4O,MACxCsZ,GAAiC,cAAnBA,EAAUzc;AAQ3B,OAAOqZ,CACT,CAEA,WAAIgD,GACF,OAAOxjB,OAAO0f,SAASmE,MACzB,CAEAhvB,cACEE,SAAS4K,WAAWlF,EAAAzF,KAAA,kBAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,oBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,UAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,UAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,yBAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,8BAAAyO,EAAAzO,MAAAE,EAAAF,KAAA,uBA1aC,IAAI8uB,cAAYrpB,EAAAzF,KAAA,SAAA0O,EAAA1O,MAAAyF,EAAAzF,KAAA,UAAAsX,EAAAtX,MAAAyF,EAAAzF,KAAA,eAAAuX,EAAAvX,MAAAyF,EAAAzF,KAAA,kBAAAwX,EAAAxX,MAAAyF,EAAAzF,KAAA,qBAAAyX,EAAAzX,MAAAyF,EAAAzF,KAAA,qBAAA0X,EAAA1X,MA4arCA,KAAK+uB,QAAQlgB,SACf,CAEA,YAAImgB,GACF,OAAOhvB,KAAKF,KAAKorB,oBAAoB8D,QACvC,CAMA,QACCD,GAEC/uB,KAAKivB,SAAU,QACT,EAAAC,OAAI,CACRlvB,KAAKmvB,2BAA2BtgB,UAChC7O,KAAKovB,gCAAgCvgB,UACrC7O,KAAKqvB,2BAA2BxgB,UAChC7O,KAAKsvB,0BAA0BzgB,YAIjC7O,KAAKuvB,iCAELvvB,KAAKivB,SAAU,CACjB,CAEA,0BACCK,GACC,MAAMrE,oBAAEA,GAAwBjrB,KAAKF,KAAKorB,qBACpC9mB,sBAAEA,GAA0B6mB,EAAoBG,cACpD;AAGF,IAAKhnB,EAAsBqP,OACzB,OAAO;AAGT,MAAM1R,EAAM,IAAIuH,KAAI,EAAA8G,WAhfW;AAif/BrO,EAAI8X,OAAS,IAAI2V,gBAAgB,CAC/BpC,KAAMhpB,EAAsB8b,KAAKuP,GAAOA,EAAGtd,OAAM8B,KAAK;AAGxD,IACE,MAAMjL,QAAiB,EAAA3G,WAAMN,EAAK,CAChCxB,QAAS,CACP,eAAgB,mBAChBC,cAAe,UAAUR,KAAKS,QAAQC;AAI1C,GAAIsI,EAAS8H,GAEX,OADA9Q,KAAK0rB,kCAAoC1iB,EAASrG,QAC3C;AAET,MAAMoO,QAAkB/H,EAASgI;AAEjC,OADAC,UAAaC,SAASH,IACf,CACT,CAAE,MAAOnO,GACP,MAAMmO,EAAY,0CAA4CnO;AAE9D,OADAqO,UAAaC,SAASH,IACf,CACT,CACF,CAEA,gCACCqe,GACC,MAAMnE,oBAAEA,GAAwBjrB,KAAKF,KAAKorB,qBACpCC,WAAEA,GAAeF,EAAoBG,cAAc;MACnD,EAAA8D,OACJ/D,EAAWjL,KAAIyE,gBACP3kB,KAAKS,QAAQivB,qBAAqBC,EAAU,IAGxD,CAKA,2BACCR,GACC,MAAMlE,oBAAEA,GAAwBjrB,KAAKF,KAAKorB,qBACpC0E,YAAEA,GAAgB3E,EAAoBG,cAAc;AAE1D,IACGwE,GACsB,iBAAhBA,GACgB,IAAvBA,EAAYnc,OACZ,CAGAxM,QAAQrE,MACN,2DACA5C,KAAKF,KAAKorB,oBACVD,GAGFha,UAAaC,SACX,4FACuB1O,KAAKC,UAAUzC,KAAKF,MAAMorB,sDAC1B1oB,KAAKC,UAAUwoB;AAGxC,IAGE,MAAM4E,IAAEA,EAAGrW,IAAEA,GAAQxZ,KAAKS,QAAQ8Y,UAC5BuW,EAAYtW,EAAMqW;AACxB5e,UAAaC,SACX,oHACwC2e,gCACtCrW,aAAesW,uBAErB,CAAE,MAAOltB,GAEPqE,QAAQrE,MAAM,sCAAuCA,GACrDqO,UAAaC,SAAS,sCAAuCtO,EAC/D,CAKA,OAFAmtB,MAAM,6DACN/kB,OAAO0f,SAASsF,QAElB,CAEA,IAAIC;AACJ,IACE,GAAIC,UAAMC,QAAS,CAIjB,MAAMC,EAASplB,OAAO0f,SAASC,SAAS0F,OACtC,EACArlB,OAAO0f,SAASC,SAAS/K,QAAQ;AAEnCqQ,QAAyBK,OACvB,KAAKtlB,OAAO0f,SAASpqB,OAAO8vB,IAASR,IAEzC,KAAO,CACL,MAAOW,EAAQjwB,GACbH,UAAOqwB,8BAA8Bxd,MAAM;AAE3Cid,EADa,UAAXM,QACuBD,OAAO,WAAWhwB,IAAOsvB,WAEzBU,OAAO,UAAUhwB,IAAOsvB,IAErD,CACF,CAAE,MAAOhtB,GAcP,MAJA5C,KAAKqkB,SAAU,EAITzhB,CACR,CAEA,MAAQpD,QAASixB,GAA2BR;AAC5CjwB,KAAKywB,uBAAyBA,CAChC,CAEAxE,oBAAoBxN,EAAOlJ,GACzB,MAAMgY,EACJvrB,OAAOorB,KAAK3O,GAAOhL,OAAS,EAAIjR,KAAKC,UAAUgc,QAAS+O;AAEtDjY,EACFvV,KAAKsG,OAAO8P,aAAa,YAAab,EAAM,CAC1CiJ,YAAa,CACXC,MAAO8O,KAIXvtB,KAAKsG,OAAO8P,aAAa,CACvBoI,YAAa,CACXC,MAAO8O,IAIf,CAKAgC,iCACE,MAAMmB,kBAAEA,EAAiBD,uBAAEA,GAA2BzwB,MAMhD2wB,eAAEA,GAAmB3lB;KAGmBwiB,IAA1CmD,EAAe7pB,IAAI4pB,IAUvBC,EAAeC,OAAOF,EAAmBD,EAC3C,CA4BA,2BACCpB,GACC,MAAMpE,oBAAEA,GAAwBjrB,KAAKF,KAAKorB,qBACpC0E,YAAEA,EAAW9tB,GAAEA,GAAOmpB,EAAoBG,cAC9C,cACA,MAMIyF,EAA6B/uB,EAAG0F,SAAS,KAC3C1F,EAAG6F,UAAU,EAAG7F,EAAG8d,QAAQ,MAC3B9d,EAIEgvB,QA/rBVnM,eAA0BoM,GACxB,MACMtvB,GADU,IAAIuvB,aACCC,OAAOF,GACtBG,QAAmBC,OAAOC,OAAOC,OAAO,QAAS5vB;AAKvD,OAJkBqc,MAAM8E,KAAK,IAAI0O,WAAWJ,IAEzChR,KAAKjE,GAAMA,EAAE0P,SAAS,IAAI4F,SAAS,EAAG,OACtCtd,KAAK,GAEV,CAsrBkCud,CAAW5B;AACzC5vB,KAAK0wB,kBAAoB,2BAA2BG,KAA8BC,GACpF,GACD7wB,EAAAoI,EAAA5I,EAAAkB,UAAA,mBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,qBArrBE2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,WACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAW,CAAK,IAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,WACvB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAW,CAAK,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,0BACvB2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA5I,EAAAkB,UAAA,+BACP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAA+B,CAAC,CAAC,IAAA0N,EAAArG,EAAA5I,EAAAkB,UAAA,UAGxCC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAsW,EAAAjP,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAuW,EAAAlP,EAAA5I,EAAAkB,UAAA,gBACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAwW,EAAAnP,EAAA5I,EAAAkB,UAAA,mBAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyW,EAAApP,EAAA5I,EAAAkB,UAAA,sBAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0W,EAAArP,EAAA5I,EAAAkB,UAAA,sBAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,6BAuFP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,6BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,0BAUN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,0BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,6BAQN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,6BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,qCAaN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,qCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,yBAKN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,yBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,+BAcN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,+BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,wBA4DN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,wBAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,2BA2EN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,2BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,2BAWN4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,2BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,WAwJNgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,WAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,6BAiBJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,6BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,mCAsCJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,mCAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,8BAcJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,8BAAAlB,EAAAkB,WAAA0H,EAAA5I,EAAAkB,UAAA,8BAgKJgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,8BAAAlB,EAAAkB,WAAAlB,IAAA,EAAA2F,EAAAC,sBAAAP,EAnqBc+lB,EAA8B;kICzCpC,WACb,MAAO,CACL4G,IAAK,CAAC,OAAQ,eACdC,IAAK,CAAC,OAAQ,aAAc,sBAEhC,CAAC,I;ACLD,SAAAjsB,EAAA2J,EAAAuiB,EAAAC,EAAAC,GAAAD,GAAA5vB,OAAAkmB,eAAA9Y,EAAAuiB,EAAA,CAAA7wB,WAAA8wB,EAAA9wB,WAAAD,aAAA+wB,EAAA/wB,aAAAE,SAAA6wB,EAAA7wB,SAAAuO,MAAAsiB,EAAA5wB,YAAA4wB,EAAA5wB,YAAA8wB,KAAAD,QAAA,aAAAxpB,EAAAspB,EAAAviB,EAAAwiB,EAAA1T,EAAA2T,GAAA,IAAA7V,EAAA;AAAA,OAAAha,OAAAorB,KAAAlP,GAAA1F,SAAA,SAAAmZ,GAAA3V,EAAA2V,GAAAzT,EAAAyT,EAAA,IAAA3V,EAAAlb,aAAAkb,EAAAlb,WAAAkb,EAAAnb,eAAAmb,EAAAnb,cAAA,UAAAmb,KAAAhb,eAAAgb,EAAAjb,UAAA,GAAAib,EAAA4V,EAAAlX,QAAAqX,UAAA/U,QAAA,SAAA4U,EAAA1T,GAAA,OAAAA,EAAAyT,EAAAviB,EAAAwiB,KAAA,GAAA5V,GAAA6V,QAAA,IAAA7V,EAAAhb,cAAAgb,EAAA1M,MAAA0M,EAAAhb,YAAAgb,EAAAhb,YAAA8wB,KAAAD,QAAA,EAAA7V,EAAAhb,iBAAA,YAAAgb,EAAAhb,aAAAgB,OAAAkmB,eAAAyJ,EAAAviB,EAAA4M,GAAA,MAAAA,CAAA,C;AAQ0Czc,EAAAC,SAAAkJ,GAKvC,EAAAspB,SAAM,UAAQ,EANhBC,iBAAYC,EAAb,cACmDC,UAAWtyB,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,cAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,wBAAA0F,EAAA1F,KAAA,CAM5DoyB,+BACMpyB,KAAKqyB,YAAYC,sBACnBtyB,KAAKuyB,uBAAyBvyB,KAAKuyB,sBAEvC,GACDtyB,EAAAoI,EAAA6pB,EAAAvxB,UAAA,eAVEC,WAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,yBAEP2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAyB,CAAI,IAAAqH,EAAA6pB,EAAAvxB,UAAA,gCAAA+H,GAAA1G,OAAAwG,yBAAA0pB,EAAAvxB,UAAA,gCAAAuxB,EAAAvxB,WAJ1BlB,EAI0ByyB,KAAAzyB,EAAA,I;ACXvC,SAAAgG,EAAA2J,EAAAuiB,EAAAC,EAAAC,GAAAD,GAAA5vB,OAAAkmB,eAAA9Y,EAAAuiB,EAAA,CAAA7wB,WAAA8wB,EAAA9wB,WAAAD,aAAA+wB,EAAA/wB,aAAAE,SAAA6wB,EAAA7wB,SAAAuO,MAAAsiB,EAAA5wB,YAAA4wB,EAAA5wB,YAAA8wB,KAAAD,QAAA,aAAAxpB,EAAAspB,EAAAviB,EAAAwiB,EAAA1T,EAAA2T,GAAA,IAAA7V,EAAA;AAAA,OAAAha,OAAAorB,KAAAlP,GAAA1F,SAAA,SAAAmZ,GAAA3V,EAAA2V,GAAAzT,EAAAyT,EAAA,IAAA3V,EAAAlb,aAAAkb,EAAAlb,WAAAkb,EAAAnb,eAAAmb,EAAAnb,cAAA,UAAAmb,KAAAhb,eAAAgb,EAAAjb,UAAA,GAAAib,EAAA4V,EAAAlX,QAAAqX,UAAA/U,QAAA,SAAA4U,EAAA1T,GAAA,OAAAA,EAAAyT,EAAAviB,EAAAwiB,KAAA,GAAA5V,GAAA6V,QAAA,IAAA7V,EAAAhb,cAAAgb,EAAA1M,MAAA0M,EAAAhb,YAAAgb,EAAAhb,YAAA8wB,KAAAD,QAAA,EAAA7V,EAAAhb,iBAAA,YAAAgb,EAAAhb,aAAAgB,OAAAkmB,eAAAyJ,EAAAviB,EAAA4M,GAAA,MAAAA,CAAA,C;AAKkCzc,EAAAC,SAAAC,EAAnB,cAA4B0yB,UAAWtyB,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,KAAA,CAIpD,mBAAIwyB,GACF,OAAOxyB,KAAKS,QAAQoB,MAAM0I,WAC5B,CAEA,kCACMkoB,GACJ,MAAM/d,EAAc1U,KAAKwyB,iBAAiB9d;AAEtCA,SACI1U,KAAK0yB,gBAEb1yB,KAAKsG,OAAO8P,aAAa,IAC3B,CAEA,mBAAMsc,GACJ1yB,KAAKwyB,gBAAgB9d,YAAc,WAC7B1U,KAAKwyB,gBAAgBhoB,MAC7B,GACDvK,EAAAoI,EAAA5I,EAAAkB,UAAA,UArBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,gCAMP4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,gCAAAlB,EAAAkB,WAAAlB,EAAA,I;;;;;;ACXM,MAAMkzB,UAAiBR,UAAWtyB,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,cACjC,CAAC,QAAS,OAAM,CAG9B,aAAI4yB,GACF,OAAO5yB,KAAKue,MAAM3X,aAAa9E,GAAG+wB,WAAW,UAC/C,EACDtzB,EAAAC,QAAAmzB,CAAA,I;UCTc,CACbG,KAAM,CACJC,OAAQ,CACNC,KAAM,UACNC,OAAQ,UACRC,OAAQ,YAGZC,KAAM,CACJC,aAAc,CACZC,MAAO,UACPC,IAAK,UACLC,KAAM,UACNP,KAAM,UACNC,OAAQ,UACRC,OAAQ,UACRM,UAAW,QAGfC,OAAQ,CACNC,QAAS,CAAEC,SAAU,WACrBC,IAAK,CACH/mB,MAAO,WACPgnB,SAAU,MACVC,sBAAuB,EACvBC,sBAAuB,GAEzBC,IAAK,CACHnnB,MAAO,WACPgnB,SAAU,MACVC,sBAAuB,EACvBC,sBAAuB,IAG5B,I,6IC/BM,SAASE,GAA2BppB,EAASqpB,IAsBlD,OALAlyB,OAAOorB,KAAK8G,GAAW1b,SAAS2b,IAC9BtpB,EAAQ2R,iBAAiB2X,EAAID,EAAUC,GAAI,IAItCtpB,CACT,C;AAACtL,EAAAC,SAEc,EAAA40B,UAAOH,EAA0B,I,kbCpBzC,SAASI,EAAW5N,EAAG6N,EAAO,CAAC,GACpC,MAAMntB,EAAUhH,UAAOiH,IAAID;AAI3B,IAAIotB,EAAcD,EAAKC,aAAeD,EAAKE,QACvCC,EAAUH,EAAKG,SAAWH,EAAKI,YAE/BrtB,EAAQ;AAgBZ,OAdIktB,IACED,EAAKK,eACPttB,EAAQF,EAAQE,MAAMutB,0BAGnBvtB,IACHA,EAAQF,EAAQE,MAAMwtB,mBAItBJ,IACFptB,EAAQF,EAAQE,MAAMytB,cAGjBztB,EAAQA,EAAM,GAAKF,CAC5B,C;AAAC5H,EAAAC,SAEc,EAAA40B,UAAOC,EAAW,I;;;;;;AChClB,MAAMU,UAA4BC,UAAOn1B,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,UAC5C,KAAI,CAEdi1B,SAASC,EAAU,OAAQvuB,GAEJ,OAAjB3G,KAAK6K,UACP7K,KAAK6K,QAAU1B,SAASC,cAAc8rB;AAGxC,MAAMrqB,QAAEA,GAAY7K;AAOpB,IAAK,MAAMm1B,KAAaxuB,EAAY,CAClC,MAAM2I,EAAQ3I,EAAWwuB;AASzB,GAAI7lB,UAAmD,IAAVA,EAEvCzE,EAAQoB,aAAakpB,IACvBtqB,EAAQuqB,gBAAgBD;IAErB,CAEL,MAAME,EACa,iBAAV/lB,EAAqB9M,KAAKC,UAAU6M,GAASA;AAElD+lB,IAAoBxqB,EAAQyqB,aAAaH,IAC3CtqB,EAAQ0qB,aAAaJ,EAAWE,EAEpC,CACF,CAEA,OAAOxqB,CACT,EACDtL,EAAAC,QAAAu1B,CAAA,I;qiHC7CM,SAASS,GAAelmB,IAC7B,OAAIA,QACK,KAGF9M,KAAKC,UAAU6M,EACxB,C;AAAC/P,EAAAC,SAEc,EAAA40B,UAAOoB,EAAc,I,8eCP7B,SAAStkB,GAAUtO,IACxBqO,UAAaC,SAAStO,EACxB,C;AAACrD,EAAAC,SAEc,EAAA40B,UAAOljB,EAAS,I;WCLhB,EAAAkjB,WAAO,UAAsBqB,IAC1C,GAAe,SAAXA,GAAgC,SAAXA,EACvB,KAAM,GAAGA;AAEX,MAAkB,SAAXA,EAAoB,uBAAyB,cACtD,GAAE,I;UCNaC,SAAS;;UCATC,SAAW,I,o2HCE1B,IAAIxjB,EAAMhL;kEACNhH,UAAOiH,MACT+K,EAAOhS,UAAOiH,IAAI+K,KAClBhL,EAAUhH,UAAOiH,IAAID;AACtB5H,EAAAC,QAEc,CACb2S,KAAM,cACNyjB,YAAY,EAAAC,WAAmB1jB,EAAMhL,GACtC,I;UCXsB,CACbgL,KAAM,mBACNyjB,aAAc,EACf,I;ACATr2B,EAAAC,QAGe,CACb2S,KAAM,aACNyjB,WAAYE,UACb,I;UCRc,CACbF,aAME,EAEH,I,mMCPM,SAASA,IACdG,UAAOC,KAAKC,UAAI,oBAAsB,CAAC,IACvC,EAAAC,oBACF,C;AAAC32B,EAAAC,QAEc,CACb2S,KAAM,wBACNyjB,aACD,I;ACZDr2B,EAAAC,QACe,CACb2S,KAAM,aACNyjB,aAAc,EACf;;;;cCDE,EAAAO,QAAK,UAASlf,GACd,EAAAkf,QAAK,UAASrL,GACd,EAAAqL,QAAK,UAASpL,GACd,EAAAoL,QAAK,CAAEC,aAAcA,IAAM,KAAKC,GAChC,EAAAF,QAAK,QAAOG,GACZ,EAAAH,QAAK,QAAOI,GACZ,EAAAJ,QAAK,QAAOjE,EAPA,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,cAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,WAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,SAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,YAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,YAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,cAAA0O,EAAA1O,KAAA,GAQlCC,EAAAoI,EAAA6pB,EAAAvxB,UAAA,SAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,eAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,YAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,UAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA6pB,EAAAvxB,UAAA,aAAA01B,GAAA,CAAAx1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA6pB,EAAAvxB,UAAA,aAAA21B,GAAA,CAAAz1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA6pB,EAAAvxB,UAAA,eAAA41B,GAAA,CAAA11B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCPE,EAAAiE,QAAK,CAAEC,aAAcA,IAAM,KAAKnf,GAChC,EAAAkf,QAAK,CAAEC,aAAcA,IAAM,KAAKtL,GAChC,EAAAqL,QAAK,UAASpL,GACd,EAAAoL,QAAK,UAASE,GACd,EAAAF,QAAK,QAAOG,GACZ,EAAAH,QAAK,QAAOI,GAEZ,EAAAE,WAAQ,uBAAwB,CAC/BC,QAAS,sBACT/R,OAAO,IACPuN,EAXW,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,aAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,wBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,cAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,UAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,YAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,YAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,uBAAA0O,EAAA1O,KAAA,CAcjC,kBAAI22B,GACF,MAAM70B,GAAEA,GAAO9B;AACf,OAAI8B,EAAG0F,SAAS,SACP,OACE1F,EAAG0F,SAAS,WACd,SACE1F,EAAGuF,MAAM,+BACX,QAEF,QACT,GACDpH,EAAAoI,EAAA6pB,EAAAvxB,UAAA,cAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,yBAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,eAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,WAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA6pB,EAAAvxB,UAAA,aAAA01B,GAAA,CAAAx1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA6pB,EAAAvxB,UAAA,aAAA21B,GAAA,CAAAz1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA6pB,EAAAvxB,UAAA,wBAAA41B,GAAA,CAAA11B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCxBE,EAAAiE,QAAK,UAASlf,GAEd,EAAA2f,aAAU,oBAAqB,CAC9BF,QAAS,uBACT/R,OAAO,IACPmG,GAGD,EAAA8L,aAAU,uBAAwB,CACjCF,QAAS,uBACT/R,OAAO,IACPoG,GAGD,EAAAoL,QAAK,UAASjE,EAfF,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,WAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,mBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,sBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,SAAA4F,EAAA5F,KAAA,GAgBlCC,EAAAoI,EAAA6pB,EAAAvxB,UAAA,YAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,oBAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,uBAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,UAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCfE,EAAA0E,aAAU,OAAQ,CACjBC,aAAa,EACblS,OAAO,EACP+R,QAAS,sBACTzf,GAGD,EAAAwf,WAAQ,uBAAwB,CAC/BC,QAAS,mBACT/R,OAAO,IACPmG,GAGD,EAAAqL,QAAK,UAASjE,EAdF,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,uBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,aAAA2F,EAAA3F,KAAA,GAgBlCC,EAAAoI,EAAA6pB,EAAAvxB,UAAA,QAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,wBAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,cAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;cCdE,EAAAiE,QAAK,UAASjE,EADF,cAAc4E,UAAUj3B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,M,EAAAA,M,EAAAC,I,qJAAA,G,EAEtCiyB,EAAAvxB,U,EAAA,M,EAAA,CAAA+H,G,EAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAAAf,O,wDAAAiyB;eAAA,I;;cCDE,EAAAuE,WAAQ,oBAAqB,CAC5BC,QAAS,OACTK,GAAI,OACJpS,OAAO,IACPuN,EALW,cAAc4E,UAAUj3B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,oB,EAAAA,M,EAAAC,I,qJAAA,G,EAOtCiyB,EAAAvxB,U,EAAA,oB,EAAA,CAAA+H,G,EAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAAAf,O,wDAAAiyB;eAAA,I;;;ACNoC3yB,EAAAC,SAAAkJ,GAGlC,EAAAytB,QAAK,UAASlf,GACd,EAAAkf,QAAK,UAASrL,GACd,EAAAqL,QAAK,UAASpL,GAEd,EAAA0L,WAAQ,SAAU,CAAEC,QAAS,eAAgB/R,OAAO,IAAOllB,EAP/C,cAA+B+2B,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,QAAA0F,EAAA1F,MAAAyF,EAAAzF,KAIlC,aAAY2F,EAAA3F,MAAAyF,EAAAzF,KACZ,aAAY4F,EAAA5F,MAAAyF,EAAAzF,KAAA,UAAA6F,EAAA7F,KAAA,CAI5B,QAAIgR,GACF,OAAOhR,KAAK,SAAQ,EAAAg3B,WAAqBh3B,KAAK+F,KAAKC,iBACrD,GACD/F,EAAAoI,EAAA5I,EAAAkB,UAAA,QAXEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,SAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAGQ,aAAY,CAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UACZ,aAAY,CAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,WAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;;ACJUF,EAAAC,SAAAkJ,GAGrC,EAAAytB,QAAK,UAASlf,GACd,EAAAkf,QAAK,UAASrL,GACd,EAAA2L,WAAQ,SAAU,CAAEC,QAAS,mBAAoB/R,OAAO,IAAQllB,EALpD,cAAkC+2B,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAGrC,cAAa0F,EAAA1F,MAAAyF,EAAAzF,KACb,cAAa2F,EAAA3F,MAAAyF,EAAAzF,KAAA,UAAA4F,EAAA5F,KAAA,CAG7B,SAAIqjB,GACF,OAAOrjB,KAAK,UAAS,EAAAg3B,WAAqBh3B,KAAK+F,KAAKC,iBACtD,GACD/F,EAAAoI,EAAA5I,EAAAkB,UAAA,QATEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAEQ,cAAa,CAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UACb,cAAa,CAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,WAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;;cCA5B,EAAA02B,QAAK,CAAEC,aAAcA,IAAM,KAAKnf,GAChC,EAAAkf,QAAK,CAAEC,aAAcA,IAAM,KAAKtL,GAChC,EAAAqL,QAAK,UAASpL,GACd,EAAAoL,QAAK,UAASE,GACd,EAAAF,QAAK,UAASG,GACd,EAAAH,QAAK,UAASI,GACd,EAAAJ,QAAK,CAAEC,aAAcA,IAAM,KAAKa,GAEhC,EAAAL,aAAU,SAAU,CAAEF,QAAS,oBAAqB/R,OAAO,IAAOuN,EAbtD,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAIjCyF,EAAAzF,KACkC,iBAAgB0F,EAAA1F,MAAAyF,EAAAzF,KAChB,iBAAgB2F,EAAA3F,MAAAyF,EAAAzF,KAAA,eAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,mBAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,kBAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,qBAAA0O,EAAA1O,MAAAyF,EAAAzF,KAAA,SAAAsX,EAAAtX,MAAAyF,EAAAzF,KAAA,SAAAuX,EAAAvX,KAAA,CASlD,YAAIk3B,GACF,OAAOl3B,KAAK,aAAY,EAAAg3B,WAAqBh3B,KAAK+F,KAAKC,iBACzD,CACA,mBAAImxB,GACF,MAAO,GAAGn3B,KAAKo3B,oBAAoBp3B,KAAKq3B,iBAC1C,GACDp3B,EAAAoI,EAAA6pB,EAAAvxB,UAAA,QApBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAI0B,iBAAgB,CAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAChB,iBAAgB,CAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,gBAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA6pB,EAAAvxB,UAAA,oBAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA6pB,EAAAvxB,UAAA,mBAAA01B,GAAA,CAAAx1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA6pB,EAAAvxB,UAAA,sBAAA21B,GAAA,CAAAz1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAsW,EAAAjP,EAAA6pB,EAAAvxB,UAAA,UAAA41B,GAAA,CAAA11B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAuW,EAAAlP,EAAA6pB,EAAAvxB,UAAA,UAAAs2B,GAAA,CAAAp2B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCHjD,EAAAiE,QAAK,UAASlf,GACd,EAAAkf,QAAK,UAASrL,GACd,EAAAqL,QAAK,UAASpL,GACd,EAAAoL,QAAK,UAASE,GACd,EAAAF,QAAK,UAASG,GACd,EAAAH,QAAK,WAAUI,GACf,EAAAJ,QAAK,QAAOc,GACZ,EAAAd,QAAK,QAAOmB,GACZ,EAAAnB,QAAK,CAAEC,aAAcA,KAAA,CAAS,KAAImB,GAElC,EAAAd,WAAQ,eAAgB,CAAEC,QAAS,UAAW/R,OAAO,IAAO6S,GAC5D,EAAAZ,aAAU,4BAA6B,CAAEF,QAAS,SAAU/R,OAAO,IAAO8S,GAE1E,EAAAhB,WAAQ,kBAAmB,CAAEC,QAAS,UAAW/R,OAAO,IAAO+S,GAE/D,EAAAjB,WAAQ,OAAQ,CACfC,QAAS,SACTG,aAAa,EACblS,OAAO,IACPuN,EAtBW,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAGjB,oBAAmB0F,EAAA1F,MAAAyF,EAAAzF,KACnB,oBAAmB2F,EAAA3F,MAAAyF,EAAAzF,KAAA,OAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,OAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,YAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,WAAA0O,EAAA1O,MAAAyF,EAAAzF,KAAA,YAAAsX,EAAAtX,MAAAyF,EAAAzF,KAAA,YAAAuX,EAAAvX,MAAAyF,EAAAzF,KAAA,gBAAAwX,EAAAxX,MAAAyF,EAAAzF,KAAA,eAAAyX,EAAAzX,MAAAyF,EAAAzF,KAAA,oBAAA0X,EAAA1X,MAAAyF,EAAAzF,KAAA,mBAAA2X,EAAA3X,MAAAyF,EAAAzF,KAAA,QAAA4X,EAAA5X,KAAA,CAqBnC,eAAIujB,GACF,OAAOvjB,KAAK,gBAAe,EAAAg3B,WAAqBh3B,KAAK+F,KAAKC,iBAC5D,CAEA,wBAAI2xB,GAEF,QAAS33B,KAAK42B,UAAU,qBAAqB90B,IAC/C,GACD7B,EAAAoI,EAAA6pB,EAAAvxB,UAAA,QAhCEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAEQ,oBAAmB,CAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UACnB,oBAAmB,CAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,QAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA6pB,EAAAvxB,UAAA,QAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA6pB,EAAAvxB,UAAA,aAAA01B,GAAA,CAAAx1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA6pB,EAAAvxB,UAAA,YAAA21B,GAAA,CAAAz1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAsW,EAAAjP,EAAA6pB,EAAAvxB,UAAA,aAAA41B,GAAA,CAAA11B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAuW,EAAAlP,EAAA6pB,EAAAvxB,UAAA,aAAAs2B,GAAA,CAAAp2B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAwW,EAAAnP,EAAA6pB,EAAAvxB,UAAA,iBAAA22B,GAAA,CAAAz2B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyW,EAAApP,EAAA6pB,EAAAvxB,UAAA,gBAAA42B,GAAA,CAAA12B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0W,EAAArP,EAAA6pB,EAAAvxB,UAAA,qBAAA62B,GAAA,CAAA32B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2W,EAAAtP,EAAA6pB,EAAAvxB,UAAA,oBAAA82B,GAAA,CAAA52B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4W,EAAAvP,EAAA6pB,EAAAvxB,UAAA,SAAA+2B,GAAA,CAAA72B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCLlC,EAAAiE,QAAK,UAASlf,GAGd,EAAAkf,QAAK,UAASrL,GAGd,EAAAqL,QAAK,UAASpL,GAGd,EAAAoL,QAAK,WAAUE,GAGf,EAAAF,QAAK,UAASG,GAGd,EAAAH,QAAK,UAASI,GAGd,EAAAJ,QAAK,UAASjE,EAnBF,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,cAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,YAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,mBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,SAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,6BAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,WAAAyO,EAAAzO,MAAAyF,EAAAzF,KAAA,QAAA0O,EAAA1O,KAAA,GAqBlCC,EAAAoI,EAAA6pB,EAAAvxB,UAAA,eAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,aAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,oBAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,UAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA6pB,EAAAvxB,UAAA,8BAAA01B,GAAA,CAAAx1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAyN,EAAApG,EAAA6pB,EAAAvxB,UAAA,YAAA21B,GAAA,CAAAz1B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0N,EAAArG,EAAA6pB,EAAAvxB,UAAA,SAAA41B,GAAA,CAAA11B,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCpBE,EAAAiE,QAAK,SAAU,CACdC,aAAcA,IACL,UAETnf,GAGD,EAAAkf,QAAK,UAASrL,GAGd,EAAAqL,QAAK,UAASpL,GAGd,EAAA6L,aAAU,OAAQ,CAAEjS,OAAO,EAAO+R,QAAS,gBAAgBxE,EAd/C,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,WAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,cAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,OAAA4F,EAAA5F,KAAA,CAiBjC,cAAI43B,GACF,MAAO,CACLztB,OAAQnK,KAAKmK,OACb0tB,SAAU73B,KAAK63B,SACfnjB,YAAa1U,KAAK0U,YAEtB,GACDzU,EAAAoI,EAAA6pB,EAAAvxB,UAAA,UAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,YAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,eAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA6pB,EAAAvxB,UAAA,QAAAoqB,GAAA,CAAAlqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;cCvBE,EAAAuE,WAAQ,oBAAqB,CAC5BC,QAAS,OACTK,GAAI,OACJpS,OAAO,IACPuN,EALW,cAAc4E,UAAUj3B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,oB,EAAAA,M,EAAAC,I,qJAAA,G,EAOtCiyB,EAAAvxB,U,EAAA,oB,EAAA,CAAA+H,G,EAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAAAf,O,wDAAAiyB;eAAA,I;;;cCNE,EAAAiE,QAAK,UAASlf,GAEd,EAAA2f,aAAU,aAAc,CAAEjS,OAAO,EAAO+R,QAAS,SAASxE,EAH9C,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,cAAA0F,EAAA1F,KAAA,GAKlCC,EAAAoI,EAAA6pB,EAAAvxB,UAAA,SAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,eAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;;cCJE,EAAAiE,QAAK,UAASlf,GACd,EAAA2f,aAAU,SAAU,CACnBF,QAAS,QACT/R,OAAO,EACPoS,GAAI,SACJjM,GAID,EAAA2L,WAAQ,oBAAqB,CAC5BC,QAAS,OACTK,GAAI,KACJpS,OAAO,IACPuN,EAdW,cAAcsE,UAAM32B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,MASjCyF,EAAAzF,KAAA,oBAAA2F,EAAA3F,KAAA,GAODC,EAAAoI,EAAA6pB,EAAAvxB,UAAA,SAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA6pB,EAAAvxB,UAAA,UAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA6pB,EAAAvxB,UAAA,qBAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAkxB,EAAA,I;;ACf+C3yB,EAAAC,SAAAC,EAAjC,cAA0Cq4B,UAASj4B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,c,EAAAA,M,EAAAC,I,qJAAA,CAGhE83B,SACE/3B,KAAKg4B,YAAYC,qBACnB,G,EACDx4B,EAAAkB,U,EAAA,c,EAAA,CALEC,U,EAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAKTf,O,wDALSR;eAAA,I;;;ACDkCF,EAAAC,SAAAC,EAA7B,cAAsCq4B,UAASj4B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,KAAA,CAI5D+3B,SACE,MAAMrxB,EAAe1G,KAAKsG,OAAOI;AACjC,GAAIA,EAAc,CAChB,MAAM2jB,YAAEA,GAAgB3jB,EAAa8X;AACjC6L,IACFrqB,KAAKS,QAAQ4pB,YAAcA,EAE/B,CACF,GACDpqB,EAAAoI,EAAA5I,EAAAkB,UAAA,WAZEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA;;;;;;;ACFK,MAAMy4B,UAAeC,UAAYt4B,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,WACnCG,UAAOi4B,cAAYl4B,EAAAF,KAAA,UACpBG,UAAOk4B,QAAO,EACzB94B,EAAAC,QAAA04B,EAEDA,EAAOhY,KAAI,WACTlgB,KAAKse,MAAM,QAAQ,WACjBte,KAAKse,MAAM,OAAQ,CAAExV,KAAM,eAC7B,IACA9I,KAAKse,MAAM,SACXte,KAAKse,MAAM,YAEXte,KAAKse,MAAM,QAAQ,WACjBte,KAAKse,MAAM,SACXte,KAAKse,MAAM,WACXte,KAAKse,MAAM,aACXte,KAAKse,MAAM,UACb,GACF,GAAG,I;;;AClB6B/e,EAAAC,SAAAkJ,GAK7B,EAAA9H,UAAQ,gBAAenB,EALX,cAA0B64B,UAAMz4B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,cAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,OAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,qBAAA4F,EAAA5F,KAAA,CAO7C,iBAAMu4B,GACJ,IACEv4B,KAAK+F,KAAKsE,UAAU,CAAC,UAErBpD,QAAQC,IAAI,2BAINlH,KAAKS,QAAQ+3B,qBAEfx4B,KAAKS,QAAQqJ,iBAAmB9J,KAAKS,QAAQ4pB,mBACzCrqB,KAAKS,QAAQ6pB,0CAEvB,CAAE,MAAO1nB,GAEPqE,QAAQC,IAAI,gCAAiCtE,EAC/C,CACF,CACA61B,aACEz4B,KAAK04B,mBAAmBC,wBAGxB34B,KAAKg4B,YAAYY,gBACnB,GACD34B,EAAAoI,EAAA5I,EAAAkB,UAAA,WA9BEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,eACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,QACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,sBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;;ACHoBF,EAAAC,SAAAC,EAAf,cAAwB64B,UAAMz4B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,SAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,WAAA4F,EAAA5F,KAAA,CAM3C,iBAAMu4B,CAAYM,GAChB,OAAK74B,KAAKS,QAAQ+pB,oBAIZxqB,KAAKS,QAAQq4B,cACf94B,KAAKoX,SAASC,UAAU,SAC1BrX,KAAKmK,OAAO4uB,gBAEP,IAPL/4B,KAAKS,QAAQ4pB,YAAcwO,EAAWG,OAAOj3B,IACtC/B,KAAKsG,OAAO8P,aAAa,SAOpC,GACDnW,EAAAoI,EAAA5I,EAAAkB,UAAA,UAhBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,YACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;;ACJyBF,EAAAC,SAAAC,EAApB,cAA6B64B,UAAMz4B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,kBAAA2F,EAAA3F,KAAA,CAKhD,iBAAMu4B,GAEJ,OADAv4B,KAAKi5B,gBAAgBC,eACd,CACT,CAEAT,aACE,MAAM/jB,EAAc1U,KAAKS,QAAQoB,MAAM0I,aAAamK;AAEhDA,GACF1U,KAAKsG,OAAO8P,aAAa1B,EAE7B,GACDzU,EAAAoI,EAAA5I,EAAAkB,UAAA,UAhBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,mBACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;ACJK,MAAM05B,UAAuBb,WAAQ/4B,EAAAC,QAAA25B,CAAA,I;;;;;;;;ACEtB55B,EAAAC,SAAAC,EAAf,cAAwB64B,UAAMz4B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,QAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,kBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,SAAA4F,EAAA5F,MAAAE,EAAAF,KAAA,cAM7B,CACZye,MAAO,CACL2a,cAAc,IAEjB,CAED,WAAM7a,CAAM8a,GACV,IACE,MAAMzyB,QAAqB5G,KAAK+G,MAAMua,WACpC,gBACA+X,EAAWnT,QACX,CACEhjB,QAAS,CACP,SACA,8DACA+Q,KAAK,OAGLpN,QAAeD,EAAaC;AAGlC,OAFA7G,KAAKkK,aAAarD,EAAOyyB,eACzBt5B,KAAKi5B,gBAAgBC,YAAYryB,EAAOyyB,eACjC,CAAE1yB,eACX,CAAE,MAAOwI,GAIP,MAHqC,MAAjCA,GAAGiC,QAAQkU,aAAagU,MAC1Bv5B,KAAKsG,OAAO8P,aAAa,QAErBhH,CACR,CACF,CAEAlF,aAAaovB,GACX,IAAInvB;CACoC,IAApCmvB,EAAc,oBAA6BnvB,EAvC5B,SAwCnBnK,KAAKmK,OAAO4uB,aAAa5uB,EAC3B,GACDlK,EAAAoI,EAAA5I,EAAAkB,UAAA,SAxCEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,mBACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;ACLqBF,EAAAC,SAAAC,EAAhB,cAAyB64B,UAAMz4B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,S,EAAAA,M,EAAAC,I,qJAAA,CAG5Cu5B,WACE,OAAOx5B,KAAKsG,OAAO8P,aAAa,aAClC,G,EACD3W,EAAAkB,U,EAAA,S,EAAA,CALEC,U,EAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAKTf,O,wDALSR;eAAA,I;ACFK,MAAMg6B,UAAyBnB,WAAQ/4B,EAAAC,QAAAi6B,CAAA,I;ACAvC,MAAMC,UAA2BpB,WAAQ/4B,EAAAC,QAAAk6B,CAAA,I;ACAzC,MAAMC,UAAyBrB,WAAQ/4B,EAAAC,QAAAm6B,CAAA,I;ACAvC,MAAMC,UAAuBtB,WAAQ/4B,EAAAC,QAAAo6B,CAAA,I;ACArC,MAAMC,UAAsBvB,WAAQ/4B,EAAAC,QAAAq6B,CAAA,I;;;;;;;;ACEpBt6B,EAAAC,SAAAC,EAAhB,cAAyB64B,UAAMz4B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,MAAAE,EAAAF,KAAA,WAIlC,EAAI,CAEd,iBAAMu4B,CAAYM,GAChB,GAAI74B,KAAKS,QAAQqJ,gBAGf9J,KAAK85B,+BAA+BjB,GAChCA,EAAWkB,QACX/5B,KAAKS,QAAQ6pB;KAKjB,IACE,aAAatqB,KAAKS,QAAQ+3B,oBAC5B,CAAE,MAAO51B,GAEa,mBAAhBA,EAAMA,OACRqO,UAAaC,SAAStO,EAE1B,CAEJ,CAEAk3B,+BAA+BjB,GAC7B,OAAOA,EAAWjW,MAAMzQ,KAAK0gB,WAAW,OAC1C,CAKAmH,uBAAsB1L,IAAEA,EAAG2L,SAAEA,IAEvB3L,IAAQtuB,KAAKS,QAAQy5B,cAAiBD,IAAYj6B,KAAKm6B,SAG3Dn6B,KAAKsG,OAAO8P,aAAa,OAC3B,CAEAgkB,gBACQp6B,KAAKyb,aAAezb,KAAK0b,eAC7B1b,KAAKm6B,SAAU,EAEnB,CAEAE,eACQr6B,KAAKyb,aAAezb,KAAK0b,eAC7B1b,KAAKm6B,SAAU,EAEnB,CAEAG,WACEtvB,OAAOwR,iBAAiB,QAASxc,KAAKo6B,cAAcvZ,KAAK7gB,OACzDgL,OAAOwR,iBAAiB,OAAQxc,KAAKq6B,aAAaxZ,KAAK7gB,OACvDgL,OAAOwR,iBAAiB,UAAWxc,KAAKg6B,sBAAsBnZ,KAAK7gB,MACrE,CAEAu6B,aACEvvB,OAAOwvB,oBAAoB,QAASx6B,KAAKo6B,cAAcvZ,KAAK7gB,OAC5DgL,OAAOwvB,oBAAoB,OAAQx6B,KAAKq6B,aAAaxZ,KAAK7gB,OAC1DgL,OAAOwvB,oBACL,UACAx6B,KAAKg6B,sBAAsBnZ,KAAK7gB,MAEpC,GACDC,EAAAoI,EAAA5I,EAAAkB,UAAA,WApEEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;ACJK,MAAMgF,UAAoB/E,UAAG+6B,kBAAkB76B,OAAO,CAAC,IACpE86B,gBAAgBpM,GACd,OAAOA,CACT,CAEAqM,mBAAmBrM,GACjB,OAAOA,CACT,EAGF/uB,EAAAC,QAAAiF,CAAA,I;ACVe,MAAMtD,UAA0BzB,UAAG+6B,kBAAkB76B,OAAO,CAAC,KAE5EL,EAAAC,QAAA2B,CAAA,I;ACFe,MAAMC,UAAmB1B,UAAG+6B,kBAAkB76B,OAAO,CAAC,KAErEL,EAAAC,QAAA4B,CAAA,I;;;ACAuC7B,EAAAC,SAAAC,EAAxB,cAAiCm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,SAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,QAAA2F,EAAA3F,KAAA,CAMtD,UAAIoO,GACF,MAAMysB,iBAAEA,GAAqB76B,KAAKsG;AAElC,GAAIu0B,EAAiBhI,WAAW,aAAc,CAC5C,MAAMiI,EAAgB96B,KAAKsG,OAAOI,aAAa4O,MAC5CgJ,GAAyB,cAAfA,EAAMnM,QAGX+T,QAAS6U,GAAWD,EAAc7U,OACpC1Q,EAAOvV,KAAK+G,MAAMC,WAAW,gBAAiB+zB;AACpD,GAAIxlB,EAAM,CACR,MACM9O,EADY8O,EAAKqhB,UAAU,UACN90B;AAE3B,IAAIsM,EAAS;AAEb,IAAI,EAAA8f,aAAUznB,GAAW,CAEvB2H,EADepO,KAAK+G,MAAMC,WAAW,SAAUP,GAC/B0L,IAClB,CAIA,OAAO/D,CACT,CACA,OAAO,IACT,CAEA,OAAOpO,KAAK+F,KAAKi1B,EAAE,sBAAsBH,IAC3C,CAEA,uBAAIvI,GACF,OAAOtyB,KAAKoO,OAAO7K,cAAciE,SAAS,MAC5C,CAEA,aAAIyzB,GACF,MAAMJ,iBAAEA,GAAqB76B,KAAKsG;AAElC,GAAIu0B,EAAiBhI,WAAW,aAAc,CAC5C,MAAMiI,EAAgB96B,KAAKsG,OAAOI,aAAa4O,MAC5CgJ,GAAyB,cAAfA,EAAMnM,QAGX+T,QAAS6U,GAAWD,EAAc7U,OACpC1Q,EAAOvV,KAAK+G,MAAMC,WAAW,gBAAiB+zB;AACpD,GAAIxlB,EAAM,CACR,MACM9O,EADY8O,EAAKqhB,UAAU,UACN90B;AAE3B,IAAI,EAAAosB,aAAUznB,GAAW,CAEvB,OADezG,KAAK+G,MAAMC,WAAW,SAAUP,GACjCw0B,SAChB,CAGF,CACA,OAAO,IACT,CAEA,OAAO,IACT,GACDh7B,EAAAoI,EAAA5I,EAAAkB,UAAA,QAlEEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,UACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,SACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;ACJ0BF,EAAAC,SAAAkJ,GACjC,EAAAwyB,aAAcz7B,EADF,cAA8Bm7B,UAAQ/6B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,c,EAAAA,M,EAAAC,I,qJAAA,CAGnD6rB,eAAeqP,GACb,OAAOn7B,KAAK4rB,aAAe5rB,KAAK4rB,YAAYuP,EAC9C,CAEA3O,wBAAwB2O,EAAM7rB,GAC5B,MAAM0c,EAAWhqB,OAAOC,OAAO,CAAC,EAAGjC,KAAK4rB;AAG1B,OAAVtc,SACK0c,EAASmP,GAEhBnP,EAASmP,GAAQ7rB,EAGnBtP,KAAK4rB,YAAcI,CACrB,G,EACDvsB,EAAAkB,U,EAAA,c,EAAA,CAAA+H,G,EAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,M,yUAAAf,O,wDAAAR;eAAA,I;;;;;;;;ACb0CF,EAAAC,SAAAC,EAA5B,cAAqCm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,WAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAE,EAAAF,KAAA,gBAI1C,CAAC,EAAC,CAElB,2BACCo7B,GACC,IACE,MAAMr5B,EAAM,IAAIuH,KAAI,EAAA8G,WAZV;AAaVrO,EAAI8X,OAAS,IAAI2V,gBAAgB,CAC/BpC,KAb4B;AAe9B,MAAMpkB,QAAiB,EAAA3G,WAAMN,EAAK,CAChCxB,QAAS,CACP,eAAgB,mBAChBC,cAAe,UAAUR,KAAKS,QAAQC;AAG1C,GAAIsI,EAAS8H,GAAI,CACf,MAAMQ,QAAqBtI,EAASrG;AACpC3C,KAAKq7B,cAAgB/pB,EAAsC,wBACvD9O,KAAK6a,MAAM/L,EAAsC,yBACjD,CAAC,CACP,CACA,MAAMP,QAAkB/H,EAASgI;AACjCC,UAAaC,SAASH,EACxB,CAAE,MAAOnO,GACP,MAAMmO,EAAY,4CAA8CnO;AAChEqO,UAAaC,SAASH,EACxB,CACF,CAEA,iBAAMmoB,CAAYoC,EAAiB,CAAC,GAC7Bt7B,KAAKq7B,qBACFr7B,KAAKo7B,2BAA2BvsB,UAGxC7M,OAAOorB,KAAKptB,KAAKq7B,eAAe7iB,SAASpV,UAELoqB,IAAhC8N,EAAel4B,GACXpD,KAAKq7B,cAAcj4B,GAAakM,MAChCgsB,EAAel4B,IAGjBpD,KAAKoX,SAASmkB,OAAOn4B,GACrBpD,KAAKoX,SAASokB,QAAQp4B,EAAY,GAE1C,GACDnD,EAAAoI,EAAA5I,EAAAkB,UAAA,YAhDEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAqH,EAAA5I,EAAAkB,UAAA,8BAIPgI,QAAI3G,OAAAwG,yBAAA/I,EAAAkB,UAAA,8BAAAlB,EAAAkB,WAAAlB,EAAA,I;;;;;;ACZQ,MAAAg8B,UAAcC,UAG3B77B,cACEE,SAAS4K,WAAWzK,EAAAF,KAAA,SAHbG,WAKHA,UAAOmD,cACTtD,KAAK27B,MAAMx7B,UAAOmD,aAEtB,EACD/D,EAAAC,QAAAi8B,CAAA,I;;;;ACVmCl8B,EAAAC,SAAAC,EAArB,cAA8Bm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,OAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,KAAA,CAInD+4B,aAAa5uB,GACX,IAAIyxB,EAAa57B,KAAKS,QAAQoB,MAAM0I,aAAaJ;AACjDyxB,EAAaA,GAAc57B,KAAK67B,kBAChC77B,KAAK+F,KAAKsE,UAAU,CAACF,GAAUyxB,GACjC,CAEA,qBAAIC,GACF,MAAMC,EAAc1U,UAAU2U,SAASx4B,cAAcyP,MAAM,KAAK,GAE1DgpB,EAAmBh8B,KAAK+F,KAAKk2B;AAInC,OAHeD,EAAiB1mB,MAAM4mB,GAC7BA,EAAgBrJ,WAAWiJ,MAEnBE,EAAiB,EACpC,GACD/7B,EAAAoI,EAAA5I,EAAAkB,UAAA,QAlBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;ACFK,MAAM08B,UAA4BvB,UAAQh7B,OAAOw8B,YAC9DlhB,uBACElb,KAAKwpB,QAAQ,uBACf,EACDjqB,EAAAC,QAAA28B,CAAA,I;;;;ACJmC58B,EAAAC,SAAA68B,EAAA,IAAAC,QAAA78B,EAArB,cAA8Bm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAAy8B,EAAAv8B,KAAAq8B,GAAA52B,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,UAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,WAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,UAAA6F,EAAA7F,KAAA,CAOnD,aAAIw8B,GACF,IAAIC,EAAiB,CAAC;AAOtB,OAJEA,EADEz8B,KAAKS,QAAQqJ,gBACE4yB,EAAAL,EAAAr8B,KAAK28B,GAAiB7K,KAAtB9xB,MAEA08B,EAAAL,EAAAr8B,KAAK48B,GAAsB9K,KAA3B9xB,MAEZ,CACLmS,KAAM,sBACN0qB,aAAc,CAAC,OACf18B,OAAQ,CACN2B,GAAI3B,UAAO28B,WACXtqB,QAAS,CACPuqB,cAAc,EACdC,WAAmC,eAAvB78B,UAAOgE,YACnB84B,gBAAgB,EAChBC,gBAAiBT,IAIzB,CAEA,qBAAIU,GACF,OAAOh9B,UAAOmD,aAAa,oBACvBnD,UAAOg9B,kBACP,IACN,CAEA7C,SAAS8C,EAAe,IACtBp9B,KAAKu6B;AACL,MAAM8C,EAAW;AAEjBD,EAAa5kB,SAAS8kB,IAChBt9B,KAAKm9B,mBAAqBG,EAAQx7B,KAAO9B,KAAKm9B,mBAChDE,EAASzf,KAAK5d,KAAKw8B,UACrB,IAGFx8B,KAAKu9B,QAAQC,iBAAiBH,EAChC,CAEA9C,aACEv6B,KAAKmG,SAASs3B,MAAM,MAAO,CAAEC,OAAQ,sBAAuB50B,KAAM,MAClE9I,KAAKmG,SAASs3B,MAAM,OAAQ,CAAEC,OAAQ,sBAAuB50B,KAAM,MACnE9I,KAAKmG,SAASs3B,MAAM,OAAQ,CAAEC,OAAQ,sBAAuB50B,KAAM,MAEnE9I,KAAKu9B,QAAQ5U,aACf,CAEAgV,gBACE,IAAK39B,KAAKoX,SAASC,UAAU,oBAC3B;AAEErX,KAAKS,QAAQqJ,gBACf4yB,EAAAL,EAAAr8B,KAAK49B,GAAmC9L,KAAxC9xB,MAEA08B,EAAAL,EAAAr8B,KAAK69B,GAAwC/L,KAA7C9xB;AAGF,MAAMqZ,EAAOrZ,KAAKsG,OAAOw3B,WACnBza,EAAQrjB,KAAKsG,OAAOu0B,kBAAoB;AAE9C76B,KAAKu9B,QAAQQ,UAAU,CAAE1kB,OAAMgK,SACjC,CAEA9T,6BAA6BC,EAAiBzG,GACvC/I,KAAKoX,SAASC,UAAU,qBAG7BrX,KAAKu9B,QAAQS,WAAW,CACtBjyB,MAAO,iBACP6D,SAAUJ,EAAgBI,SAC1ByT,MAAO7T,EAAgB6T,MACvBta,YAEJ,GAsCD9I,EAAAoI,EAAA5I,EAAAkB,UAAA,UAxHEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,YACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB;AAAA,SAAAm+B,IAiFN,MAAMnB,EAAiBC,EAAAL,EAAAr8B,KAAK28B,GAAiB7K,KAAtB9xB;AACvBA,KAAKu9B,QAAQU,QAAyB,gBAAIxB,CAC5C,CAAC,SAAAoB,IAGC,MAAMpB,EAAiBC,EAAAL,EAAAr8B,KAAK48B,GAAsB9K,KAA3B9xB;AACvBA,KAAKu9B,QAAQU,QAAyB,gBAAIxB,CAC5C,CAAC,SAAAyB,EAEeC,GAGd,OACEA,GAAKC,SAAS,iBAAmBD,GAAKC,SAAS,sBAEnD,CAAC,SAAAzB,IAGC,MAAM0B,IAAEA,EAAGtwB,MAAEA,GAAU/N,KAAKS,QAAQ8Y,WAC9B1X,KAAEA,GAAS7B,KAAKS,QAChB69B,EAAiB5B,EAAAL,EAAAr8B,KAAKk+B,GAAepM,KAApB9xB,KAAqB+N,GAAS;AACrD,MAAO,CACLswB,MACAE,SAAU18B,GAAMC,GAChB08B,WAAYF,EAEhB,CAAC,SAAA1B,IAGC,MAAO,CACLyB,IAAK,aACLE,SAAU,aACVC,WAAY,QAEhB,CAAC,I;;;;;;ACzHY,MAAMC,UAAwB7D,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,2BAAAE,EAAAF,KAAA,iCAAAE,EAAAF,KAAA,cAGrC,CAAC,EAAC,EACjBT,EAAAC,QAAAi/B,CAAA,I;;;ACJsCl/B,EAAAC,SAAAkJ,GAEpC,EAAA9H,UAAQ,oBAAmBqW,GAC3B,EAAArW,UAAQ,aAAYnB,EAHR,cAAiCm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,yBAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,kBAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,cAAA4F,EAAA5F,KAAA,CAMtD24B,wBACE34B,KAAKsG,OAAO4R,GAAG,kBAAmB2gB,IAChC74B,KAAK0+B,uBAAuB7F,GAC5B74B,KAAK29B,eAAe,GAExB,CAEAe,uBAAuB7F,GACrB74B,KAAKitB,gBAAgByR,uBAAuB7F,EAC9C,CAEA8E,gBACE39B,KAAKyP,uBAAuBkuB,eAC9B,GACD19B,EAAAoI,EAAA5I,EAAAkB,UAAA,UAnBEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,0BAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,mBAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,eAGPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;;;;;;;;ACQV,MAAMk/B,UAA6BxlB,MACjCtZ,YAAYkS,GACVhS,MAAMgS,GACN/R,KAAKmS,KAAO,sBACd,EAIF,MAKaysB,EAAoBr/B,EAAAq/B,qBAAG5zB,OAAO0f,SAASmU,SAAStY,QAC3D,QACA,IAEIuY,EAAqB;AAEQv/B,EAAAC,SAAAkJ,GAIhC,EAAAwyB,aAAcjkB,GACd,EAAAikB,aAAcpQ,GACd,EAAAoQ,aAAcz7B,EANF,cAA6Bm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,SAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,QAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,OAAA2F,EAAA3F,MAAAyF,EAAAzF,KAAA,eAAA4F,EAAA5F,MAAAyF,EAAAzF,KAAA,WAAA6F,EAAA7F,MAAAyF,EAAAzF,KAAA,yBAAAyO,EAAAzO,MAAAE,EAAAF,KAAA,MAO5C++B,UAAwBC,aAAah/B,KAAKi/B,eAAa/+B,EAAAF,KAAA,4BAAAyF,EAAAzF,KAAA,eAAA0O,EAAA1O,KAAA,CAQ7D,mBAAI8J,GACF,OAAO9J,KAAKwqB,cAAgBxqB,KAAKk/B,WACnC,CAEA,gBAAI1U,GACF,MAAMpO,EAAcpc,KAAKgrB,aAAahrB,KAAKk6B;AAC3C,IAAK9d,EAAa,OAAO;AACzB,MAAM5C,IAAEA,IAAQ,EAAA2lB,aAAU/iB;AAE1B,OADqB5C,EAAM3R,KAAKu3B,MAAQ,GAE1C,CAEA,eAAIF,GACF,MAC8B,SAA5Bl/B,KAAKG,OAAOgE,aACkC,YAA9CnE,KAAKG,OAAOiE,sBAAsBC,WAChCrE,KAAK6B,IAEX,CAEA,UAAI1B,GACF,OAAO,EAAA0S,YAAS7S,MAAM8S,oBAAoB,qBAC5C,CAEA,gBAAIonB,GACF,OAAOl6B,KAAKG,OAAOyS,WAAWysB,gBAChC,CAEA,eAAIl7B,GACF,OAAOnE,KAAKG,OAAOgE,WACrB,CAEA,gBAAI86B,GACF,MAAMrsB,EAAa5S,KAAKG,OAAOyS;AAM/B,MAAO,IALUA,EAAWG,SAAWH,EAAWG,SAASC,MAAM,KAAO,MAElDJ,EAAWK,cAC7BL,EAAWK,cAAcD,MAAM,KAC/B,GAEN,CAEA,eAAIsG,GACF,OAAO,IAAIzR,MAAOsU,SACpB,CAOAmjB,kBACEC,UAAQC,IAAIV,EAAoB9+B,KAAKsZ,YAAa,CAChDokB,OAAQkB,EACRa,QAAS,GAEb,CAEA,eAAIpV,GACF,OAAOrf,OAAO00B,eAAeC,QAAQ,cACvC,CAEA,eAAItV,CAAYA,GACVA,EACFrf,OAAO00B,eAAeE,QAAQ,cAAevV,GAE7CrqB,KAAK6/B,kBAET,CAEAA,mBACE70B,OAAO00B,eAAeI,WAAW,cACnC,CAEA,8CAAMxV,GACJ,MAAMyV,EAAY//B,KAAKqqB,aAAe,QAChC2V,EAAgBD,EAAUlN,WAAW;AAI3C,GAFA7yB,KAAK6/B,mBAEDG,EAAe,CACjB,MAAMnH,EAAa74B,KAAKsG,OAAO8P,aAAa2pB;MACtClH,EAAWoH,iBACnB,MACEj1B,OAAO0f,SAASrhB,KAAO02B,QACjB,IAAI79B,SAAQ,CAACC,EAASC,IAAW89B,WAAW99B,EAAQ,IAE9D,CAEA,kBAAI1B,GACF,MAAM0b,EAAcpc,KAAKgrB,aAAahrB,KAAKk6B;AAI3C,IAAK9d,EACH,MAAM,IAAIuiB,EACR;AAIJ,OAAOviB,CACT,CAEA,wBAAMoc,GAEJ,GAAsB,eAAlBx4B,KAAKmT,SAIP,OAFAlM,QAAQC,IAAI,mBACZlH,KAAKmgC;AAIFngC,KAAKwqB,cACRxqB,KAAKmgC;AAGP,MAAMC,QAAwBpgC,KAAKqgC,IAAI7H,mBAAmBx4B,KAAKmT;AAC3DitB,IACFpgC,KAAKsgC,oBACLtgC,KAAKugC,8BACHvgC,KAAKk6B,aACLkG,EAAgBhkB,YAChBgkB,EAAgBjtB,gBAEZnT,KAAK84B,cAEX94B,KAAKwgC,cAAe,EACpBxgC,KAAKygC,8BACLzgC,KAAK0gC,wBAET,CAaA,0BAAMhR,CAAqBiR,GAEzB,MAAMC,EAAsB5gC,KAAKgrB,aAAa2V;AAC9C,GAAIC,EAEF,IACE,MAAMpnB,IAAEA,IAAQ,EAAA2lB,aAAUyB;AAC1B,GAAIpnB,GAAM,IAAI3R,MAAOsU,UAAY,IA7Kf,IA+KhB,MAEJ,CAAE,MAAOvZ,GAGPqO,UAAaC,SAAStO,EACxB,CAEF,MAAMwZ,QAAoBpc,KAAKqgC,IAAI3Q,qBACjCiR,EACA3gC,KAAKmT;AAGPnT,KAAKsgC,oBACLtgC,KAAKugC,8BACHI,EACAvkB,GAAepc,KAAKgrB,aAAahrB,KAAKk6B,cACtCl6B,KAAKmT,SAET,CAEA,0CAAM0tB,GACJ,OAAO7gC,KAAK0vB,qBAAqB1vB,KAAKk6B,aACxC,CAEAwG,wBACM1gC,KAAK8gC,2BAKT9gC,KAAK8gC,yBAA2BC,aAAYpc,UAC1C,IAAK3kB,KAAK8J,gBACR;AAEF,MAAMk3B,EAAaC,SACjB1B,UAAQz4B,IAAIg4B,EAAoB,CAC9BpB,OAAQkB;AAGWoC,GAAcA,GAAchhC,KAAKkhC,mBAKtDlhC,KAAKyqB,+BACLzqB,KAAKgrB,aAAe,CAAC,GAErBhrB,KAAKkhC,kBAAoBlhC,KAAKsZ,WAChC,GAnOsC,MAsOxC,EAAAiD,sBAAmBvc,MAAM,IAAMmhC,aAAanhC,KAAK8gC,4BACnD,CAEArW,+BACE0W,aAAanhC,KAAK8gC,yBACpB,CAEAM,0BACED,aAAanhC,KAAKqhC,wBAClBrhC,KAAKqhC,uBAAyB,IAChC,CAEAd,8BAA8BjV,EAAOgW,EAAOnuB,GAC1CnT,KAAKgrB,aAAe,IACfhrB,KAAKgrB,aACRM,CAACA,GAAQgW,GAEXthC,KAAKmT,SAAWA,CAClB,CAEAstB,8BACE,GAAIzgC,KAAKqhC,uBAAwB;AACjC,MAAME,EAA6C,OAAhCvhC,KAAKwhC,uBAClBC,EAAmB55B,KAAKu3B,MAAQ,IAChCsC,EAAe1hC,KAAKwhC,uBAAyBC;AAEnDzhC,KAAKqhC,uBAAyBN,aAAYpc,UAExC,IAAI4c,IAAcG,EAAlB,CAQA1hC,KAAKwhC,uBAAyB35B,KAAKu3B;AAEnC,IACE,IAAK,MAAOzP,EAAWvT,KAAgBpa,OAAOmrB,QAC5CntB,KAAKgrB,cACJ,CACD,MAAMxR,IAAEA,IAAQ,EAAA2lB,aAAU/iB;AAC1B,GAAI5C,EAAM3R,KAAKu3B,MAAQ,IA9QP,IA8QiC,CAC/C,MAAMuC,QAA2B3hC,KAAKqgC,IAAIuB,OACxC5hC,KAAKmT,SACLwc;AAEEgS,IACF3hC,KAAKugC,8BACH5Q,EACAgS,EACA3hC,KAAKmT,UAGPnT,KAAKwhC,uBAAyB35B,KAAKu3B,MAEvC,CACF,CACF,CAAC,QAECp/B,KAAKwhC,uBAAyB,KAC1BxhC,KAAKwgC,cAAcxgC,KAAKohC,yBAC9B,CAhCA,CAgCA,GACC,MAEH,EAAA7kB,sBAAmBvc,MAAM,IAAMmhC,aAAanhC,KAAKqhC,yBACnD,CAEA,gBACMQ,GACJ,UACQ7hC,KAAK+G,MAAM+6B,YAEjB9hC,KAAK+hC,oBAEL/hC,KAAKmT,SAAW,mBACVnT,KAAKqgC,IAAI2B,QACjB,CAAC,QACChiC,KAAKmgC,oBACP,CACF,CAEAA,sBAIE,EAAAt2B,WACE7J,MACA,KACEA,KAAK+G,MAAM+6B,WAAW,GAExB,GAUF9hC,KAAKyqB,+BAELzqB,KAAKohC,0BAELphC,KAAKs/B,kBACLt/B,KAAKgrB,aAAe,CAAC,CACvB,CAEA,WAAM9X,CAAMC,GACVnT,KAAKmT,SAAWA;AAChB,MAAMiJ,QAAoBpc,KAAKqgC,IAAIntB,MAAMC;AAErCiJ,IACFpc,KAAKsgC,oBAELtgC,KAAKugC,8BACHvgC,KAAKk6B,aACL9d,EACApc,KAAKmT,gBAEDnT,KAAK84B,cAEf,CAEA,iBAAMA,GACJ,IAAI94B,KAAK6B,MACyC,YAA9C7B,KAAKG,OAAOiE,sBAAsBC,QAEtC,IACE,MAAMxC,QAAa7B,KAAK+G,MAAMk7B,YAAY,OAAQ,CAAEh/B,IAAI;AACxDjD,KAAK6B,KAAOA,CACd,CAAE,MAAOuN,GACP6B,UAAaC,SAAS9B,EACxB,CACF,CAEAkxB,oBACE78B,EAAOy+B,QAAQ,CAAEn0B,MAAO/N,KAAKgO,kBAC/B,CAEA+zB,oBACEt+B,EAAOy+B,QAAQ,KACjB,CAQA,aAAI3oB,GACF,OAAO,EAAA4lB,aAAUn/B,KAAKU,eACxB,CAEA,iBAAIyhC,GACF,OAAOniC,KAAKuZ,UAAU6oB,GACxB,CAEA,wBAAIz0B,GACF,QAAI3N,KAAK8J,kBAEL9J,KAAKuZ,UAAsB,YAC3BvZ,KAAKuZ,UAAsB,YAC3BvZ,KAAKuZ,UAAgB,KAI3B,CAEA,uBAAI1L,GACF,QAAI7N,KAAK8J,kBACA9J,KAAKuZ,UAAuB,aAAKvZ,KAAKuZ,UAAqB,WAAK,GAG3E,CAEA,oBAAIvL,GACF,QAAIhO,KAAK8J,iBACA9J,KAAKuZ,UAAiB,KAGjC,GACDtZ,EAAAoI,EAAA5I,EAAAkB,UAAA,UAlZEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,SACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,QACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA4E,EAAAyC,EAAA5I,EAAAkB,UAAA,gBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBACuB,CAAC,CAAC,IAAA6E,EAAAwC,EAAA5I,EAAAkB,UAAA,YAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBACN,IAAI,IAAAyN,EAAApG,EAAA5I,EAAAkB,UAAA,0BAAAmqB,GAAA,CAAAjqB,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBACU,IAAI,IAAA0N,EAAArG,EAAA5I,EAAAkB,UAAA,gBAI5C2H,WAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAgB,CAAK,IAAAqH,EAAA5I,EAAAkB,UAAA,cAsR5B4H,UAAMvG,OAAAwG,yBAAA/I,EAAAkB,UAAA,cAAAlB,EAAAkB,WAAAlB,EAAA,I;;AC9T8BF,EAAAC,SAAAC,EAAxB,cAAiCm7B,UAAQ/6B,eAAAC,G;AAAAC,SAAAD,G,EAAAE,K,EAAA,oB,EAAAA,M,EAAAC,I,qJAAA,CAGtDuN,qBAAqB8B,GACnBtP,KAAKuN,kBAAoB+B,CAC3B,G,EACD7P,EAAAkB,U,EAAA,oB,EAAA,CALE2H,W,EAAO,CAAAzH,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBAAqB,CAAK,G,yUAKnCf,O,wDALmCR;eAAA,I;;;ACDrB,MAAMg/B,UAAwB7D,UAAQ/6B,eAAAC,GAAAC,SAAAD,GACnDuiC,EAAAriC,KAAAsiC,EAAoB,IAAIC,aAAa,CAErClc,YAAY9Q,GACV,OAAOitB,EAAKF,EAALtiC,MAAuB8G,IAAIyO,EACpC,CAEAmpB,uBAAuB7F,GACrB,MAAM1mB,KAAEA,EAAI8T,OAAEA,EAAMzH,YAAEA,GAAgBqa,EAAW4J;AAEpC,cAATtwB,IAGAqM,EAAYC,MACd+jB,EAAKF,EAALtiC,MAAuBw/B,IAAIvZ,EAAOC,QAAS1jB,KAAK6a,MAAMmB,EAAYC,QAElE+jB,EAAKF,EAALtiC,MAAuBiuB,OAAOhI,EAAOC,SAEzC,EACD3mB,EAAAC,QAAAi/B,CAAA,I;;;ACpBsCl/B,EAAAC,SAAAkJ,GAGpC,EAAA9H,UAAQ,oBAAmBnB,EAHf,cAAiCm7B,UAAQ/6B,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,UAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,UAAA0F,EAAA1F,MAAAyF,EAAAzF,KAAA,yBAAA2F,EAAA3F,KAAA,CAKtD44B,iBACE5tB,OAAOwR,iBACL,oBACAxc,KAAK0iC,kBAAkB7hB,KAAK7gB,OAE9BgL,OAAOwR,iBAAiB,mBAAoBzQ,IAChB,SAAtBA,EAAMsgB,OAAOhX,MAAyC,eAAtBtJ,EAAMsgB,OAAOhX,KAC/CrV,KAAK0iC,oBAC0B,aAAtB32B,EAAMsgB,OAAOhX,MACtBrV,KAAK2iC,qBACP,GAEJ,CAEAD,oBACE,MAAME,EAAmB53B,QAAQ63B,OAAOC,uBAAuB5zB,QAC5DzN,IAAUA,EAAKshC,aAAethC,EAAK67B,QAAQjY;AAG9CrlB,KAAKyP,uBAAuB6qB,SAASsI,EACvC,CAEAD,sBACE3iC,KAAKyP,uBAAuB8qB,YAC9B,CAEAyI,yBACMh4B,OAAO63B,OAAS73B,OAAO63B,MAAMI,gBAC/Bj4B,OAAO63B,MAAMK,kBAEbl4B,OAAOwR,iBAAiB,qBAAqB,WAC3CxR,OAAO63B,MAAMK,iBACf,GAEJ,CAEAjL,sBACEjtB,QAAQ63B,OAAOM,mBACjB,GACDljC,EAAAoI,EAAA5I,EAAAkB,UAAA,WA3CEC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,WACPC,UAAO,CAAAC,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAA2E,EAAA0C,EAAA5I,EAAAkB,UAAA,0BAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,OAAAvB,EAAA,I;UCJK,CAAC,CAAC,I;;;;;;;;;;;;sLCCF,SAAmBsC,EAAKqhC,GACrC,MAAO,GAAGjjC,UAAOC,IAAIE,QAAQ8iC,GAAqBjjC,UAAOC,IAAIC,aAAa0B,GAC5E,CAAC,I,iJCHc,SAA8BoI,GAC3C,OAAOk5B,KAAKC,oBAAoBn5B,EAClC,CAAC,I;ACCc,MAAMo5B,UAAuCC,UAC1D,cAAIC,GACF,OAAOtjC,UAAOyS,WAAW6wB,UAC3B,CAEAvwB,QACElI,OAAO0f,SAASrhB,KAAOrJ,KAAKyjC,UAC9B,EACDlkC,EAAAC,QAAA+jC,CAAA,I;;;;;;ACPD,MAAM5E,UAA6BxlB,MACjCtZ,YAAYkS,GACVhS,MAAMgS,GACN/R,KAAKmS,KAAO,sBACd,EAGa,MAAMuxB,UAA8BC,UAAiB9jC,eAAAC,GAAAC,SAAAD,GAAAI,EAAAF,KAAA,gBAClD,IAAI4jC,UAAKC,wBAAwB7jC,KAAK8jC,aAAY,CAElE,gBAAI5J,GACF,OAAO/5B,UAAOyS,WAAWysB,gBAC3B,CAEA,cAAI0E,GACF,OAAO5jC,UAAOyS,WAAWmxB,UAC3B,CAEA,eAAID,GACF,OAAO3jC,UAAOyS,WAAWkxB,WAC3B,CAEA,eAAI3/B,GACF,OAAOhE,UAAOgE,WAChB,CAEA,eAAI6/B,GACF,MAAO,CAAC,GAAGhkC,KAAK8jC,YAAYG,KAAKC,oBACnC,CAEA,0BAAMxU,CAAqBC,GACzB,MACMwU,EADexU,IAAc3vB,KAAK+jC,WACV,CAAC/jC,KAAK+jC,YAAc/jC,KAAKgkC,YACjDI,EAAUpkC,KAAKqkC,cAAcC,iBAAiB;AACpD,aAAatkC,KAAKukC,wBAAwBJ,EAAQC,EACpD,CAEA,WAAMlxB,GAEJjM,QAAQC,IAAI;AACZ,IAGE,MAAM8B,QAAiBhJ,KAAKqkC,cAAcG;AAE1C,GAAIx7B,EACF,OAAOA,EAASoT;MAEZpc,KAAKqkC,cAAcI,cAAc,CACrCN,OAAQnkC,KAAKgkC,aAEjB,CAAE,MAAOphC,GACP,MAAM,IAAI+7B,EACR,qDAAqD/7B,EAAMmP,UAE/D,CACF,CAEA,6BAAMwyB,CAAwBJ,EAAQC,GAEpCn9B,QAAQC,IAAI;AACZ,IAME,OALAlH,KAAK0kC,WAAa1kC,KAAKqkC,cAAcM,mBAAmB,CACtDC,cAAc,EACdT,SACAC,YAEKpkC,KAAK0kC,KAAKtoB,WACnB,CAAE,MAAOxZ,GAKP,OAHAqE,QAAQC,IACN,qDAAqDtE,EAAMmP,WAEtD,IACT,CACF,CAEA,YAAM6vB,CAAOjS,GACX,IAAIvT;AACJ,MACM+nB,EADexU,IAAc3vB,KAAK+jC,WACV,CAAC/jC,KAAK+jC,YAAc/jC,KAAKgkC,YACjDa,EAAkB7kC,KAAKqkC,cAAcC;AAC3C,GAA+B,IAA3BO,EAAgBpxB,OAAc,CAEhC,GAA2B,SAAvBtT,UAAOgE,YACT,OAAO;AAGTiY,QAAoBpc,KAAK8kC,IAAIX,GAE7Bl9B,QAAQC,IAAI,yBACd,KAAO,CACL,MAAMk9B,EAAUS,EAAgB;AAChCzoB,QAAoBpc,KAAKukC,wBAAwBJ,EAAQC,GAEzDn9B,QAAQC,IAAI,kCACd,CAEA,OAAOkV,CACT,CAEA,YAAM4lB,GACJ,MAAMoC,EAAUpkC,KAAKqkC,cAAcC,iBAAiB;AACpDtkC,KAAK0kC,WAAa1kC,KAAKqkC,cAAcU,eAAe,CAClDC,sBAAuBhlC,KAAK8jC,YAAYG,KAAKe,sBAC7Cb,OAAQnkC,KAAKgkC,YACbI,WAEJ,CAEA,SAAMU,CAAIX,GAERl9B,QAAQC,IAAI;AACZ,IAIE,OAHAlH,KAAK0kC,WAAa1kC,KAAKqkC,cAAcY,UAAU,CAC7Cd,OAAQA,GAAUnkC,KAAKgkC,cAElBhkC,KAAK0kC,KAAKtoB,WACnB,CAAE,MAAOxZ,GAEPqE,QAAQC,IAAI,mBAAmBtE,EAAMmP,UACvC,CACF,CAEA,wBAAMymB,GAEJvxB,QAAQC,IAAI;AACZ,IACE,MAAM8B,QAAiBhJ,KAAKqkC,cAAcG;AAE1C,IAAIpoB;AASJ,OARIpT,GACFoT,EAAcpT,EAASoT,YAEvBnV,QAAQC,IAAI,kCAEZkV,QAAoBpc,KAAK4hC,SAGpBxlB,EACH,CACEA,cACAjJ,SAAU,SAEZ,IACN,CAAE,MAAOvQ,GACP,MAAM,IAAI+7B,EACR,wCAAwC/7B,EAAMmP,UAElD,CACF,EACDxS,EAAAC,QAAAkkC,CAAA,I;ACxJc,MAAMwB,UAA+BvB,UAClD9jC,YAAYo/B,GACVl/B,MAAMk/B,GAENj/B,KAAKi/B,aAAeA,EACpBj/B,KAAKmlC,KAAO,CAAC,EACbnlC,KAAKi/B,aAAazmB,SACf4sB,GACEplC,KAAKmlC,KAAKC,GAAWrG,UAAwBsG,UAAUD,IAE9D,CAEA,WAAMlyB,CAAMkyB,GACV,aAAaplC,KAAKmlC,KAAKC,GAASlyB,OAClC,CAEA8uB,SACEhiC,KAAKi/B,aAAalN,UAAUvZ,SAAS4sB,IACnCplC,KAAKmlC,KAAKC,GAASpD,QAAQ,GAE/B,CAEA,YAAMJ,CAAOzuB,EAAUwc,GACrB,aAAa3vB,KAAKmlC,KAAKhyB,GAAUyuB,OAAOjS,EAC1C,CAEA,0BAAMD,CAAqBC,EAAWxc,GACpC,aAAanT,KAAKmlC,KAAKhyB,GAAUuc,qBAAqBC,EACxD,CAEA,wBAAM6I,CAAmBrlB,GACvB,IAAIitB,EAAkB;AACtBA,EACEjtB,SAAmBnT,KAAKmlC,KAAKhyB,IAAWqlB;AAC1C,IAAK,MAAM4M,KAAWplC,KAAKi/B,aACpBmB,IACHA,QAAwBpgC,KAAKmlC,KAAKC,GAAS5M;AAG/C,OAAO4H,CACT,EACD7gC,EAAAC,QAAA0lC,CAAA,I;ACjBA3lC,EAAAC,QApBc,MACb,gBAAO6lC,CAAUD,GACf,OAAQA,GACN,IAAK,QACH,OAAO,IAAI1B;AACb,IAAK,WACH,OAAO,IAAI4B;AACb,IAAK,OACH,OAAO,IAAI9B;AACb,IAAK,iBACH,OAAO,IAAID;AAEb,QACE,OAAO,IAAIgC,UAEjB,CAEA,mBAAOvG,CAAaoG,GAClB,OAAO,IAAIF,UAAuBE,EACpC,EACD,I;ACDA7lC,EAAAC,QAzBc,MACb0T,QAEEjM,QAAQC,IAAI,iBACd,CAEA86B,SAEE/6B,QAAQC,IAAI,kBACd,CAEA06B,SAEE36B,QAAQC,IAAI,kBACd,CAEAsxB,qBAEEvxB,QAAQC,IAAI,8BACd,CAEAwoB,uBAEEzoB,QAAQC,IAAI,gCACd,EACD,I;;;;;;ACtBD,MAAMy3B,UAA6BxlB,MACjCtZ,YAAYkS,GACVhS,MAAMgS,GACN/R,KAAKmS,KAAO,sBACd,EAEa,MAAMmzB,UAAiC3B,UAIpD9jC,YAAYkS,GACVhS,MAAMgS,GAAS7R,EAAAF,KAAA,aAAAE,EAAAF,KAAA,mBAHC;AAIhB,MAAM+B,IAAEA,EAAGyjC,MAAEA,EAAKtB,SAAEA,GAAa/jC,UAAOyS,WAAW6yB;AACnDzlC,KAAK0lC,GAAK,IAAIC,UAAS,CAAE5jC,MAAKyjC,QAAOtB,YACvC,CAEA,gBAAIhK,GACF,OAAO/5B,UAAOyS,WAAWysB,gBAC3B,CAEA,aAAMuG,CAAQ16B,GAQZ,IAAIlL,KAAK0lC,GAAGG,cAGZ,IACE,aAAa7lC,KAAK0lC,GAAGhiC,KAAK,CAAEoiC,OAAQ56B,GACtC,CAAE,MAAOtI,GACP,MAAM,IAAI+7B,EACR,8BAA8B/7B,GAAOmP,UAEzC,CACF,CAEA,WAAMmB,GACJlT,KAAK0lC,GAAGG,oBACE7lC,KAAK0lC,GAAGxyB,cACRlT,KAAK4lC,QAAQ,iBACzB,CAEA,YAAM5D,GACJ,MAAM+D,EAAgB,CACpBC,yBACE7lC,UAAOyS,WAAW6yB,eAAeQ,sBACnCC,UAAW/lC,UAAOyS,WAAW6yB,eAAevB;AAG9C,OAAOlkC,KAAK0lC,GAAGG,qBAAwB7lC,KAAK0lC,GAAG1D,OAAO+D,EACxD,CAEA,wBAAMvN,GAKJ,OAJKx4B,KAAK0lC,GAAGG,gBACX7lC,KAAK8J,sBAAwB9J,KAAK4lC,QAAQ,cAGvC5lC,KAAK8J,gBAIH,CACLsS,YAAapc,KAAK0lC,GAAGpE,MACrBnuB,SAAU,YALH,IAOX,CAEA,YAAMyuB,GAKJ,OAJK5hC,KAAK0lC,GAAGG,gBACX7lC,KAAK8J,sBAAwB9J,KAAK4lC,QAAQ,cAGvC5lC,KAAK8J,uBAIJ9J,KAAK0lC,GAAGS,cACPnmC,KAAK0lC,GAAGpE,OAJN,IAKX,CAEA,0BAAM5R,GAEJzoB,QAAQC,IAAI,gCACd,EACD3H,EAAAC,QAAA8lC,CAAA,I;ACvFD,MAAM3G,UAA6BxlB,MACjCtZ,YAAYkS,GACVhS,MAAMgS,GACN/R,KAAKmS,KAAO,sBACd,EAGF,MAAMi0B,UAAyBjtB,MAC7BtZ,YAAYkS,GACVhS,MAAMgS,GACN/R,KAAKmS,KAAO,kBACd,EAGa,MAAMqxB,UAA6BG,UAChD,cAAI0C,GACF,MAAMnC,SAAEA,EAAQoC,sBAAEA,EAAqBC,WAAEA,GAAepmC,UAAOyS;AAM/D,MAAO,CACLsxB,WACAsC,OAAQ,GAAGD,YAAqBD,IAChCG,MAAM,EACNpc,YAAa,GAAGrf,OAAO0f,SAASmE,kBAEpC,CAEA3b,QACElI,OAAO0f,SAASrhB,KAAOlJ,UAAOyS,WAAW8zB,OAC3C,CAEA,YAAM1E,SACEhiC,KAAK2mC,WAAWC,0BAChB5mC,KAAK2mC,WAAWE,cACxB,CAEA,YAAMjF,CAAOjS,GACX,aAAa3vB,KAAK8mC,iBAAiB,CAACnX,GACtC,CAEA,0BAAMD,CAAqBC,GACzB,aAAa3vB,KAAK8mC,iBAAiB,CAACnX,GACtC,CAEA,wBAAM6I,GAGJ,IAAIpc;AADJnV,QAAQC,IAAI;AAEZ,IACEkV,QAAoBpc,KAAK8mC,iBAAiB,CAAC9mC,KAAKk6B,eAEhDjzB,QAAQC,IAAI,iCACd,CAAE,MAAOkI,GAGP,OADAnI,QAAQC,IAAI,+BAAgCkI,IACrC,CACT,CAEA,MAAO,CACLgN,cACAjJ,SAAU,OAEd,CASA,sBAAM2zB,CAAiB3C,EAAQ4C,GAC7B,MAAMv0B,EAAU,CACdw0B,aAAc,QACd7C;AAOF,IAAIn7B;AAJA+9B,IACFv0B,EAAQu0B,aAAeA;AAIzB,IACE/9B,QAAiBhJ,KAAK2mC,WAAWrF,MAAM2F,iBAAiBz0B,EAC1D,CAAE,MAAO5P,GASP,MAAM,IAAI+7B,EACR,yCAAyCwF,EAAOlwB,KAC9C,oBACerR,EAAMmP,UAE3B,CAEA,MAAMqK,EAAcpT,GAAUk+B,QAAQ9qB,aAAa9M;AAEnD,IAAK8M,EACH,MAAM,IAAIgqB,EACR,yCAAyCjC,EAAOlwB,KAC9C;AAMN,OAAOmI,CACT,CAEA,yBAAM+qB,EAAoBJ,aAAEA,IAC1B,aAAa/mC,KAAK8mC,iBAAiB,CAAC9mC,KAAKk6B,cAAe6M,EAC1D,CAEA,gBAAI7M,GACF,OAAO/5B,UAAOyS,WAAWysB,gBAC3B,CAEAx/B,YAAYkS,GACVhS,MAAMgS,GACN/R,KAAK2mC,WAAa,IAAIS,WAASpnC,KAAKqmC,WACtC,EACD9mC,EAAAC,QAAAgkC,CAAA,I;ACtID,SAAA/9B,EAAA2J,EAAAuiB,EAAAC,EAAAC,GAAAD,GAAA5vB,OAAAkmB,eAAA9Y,EAAAuiB,EAAA,CAAA7wB,WAAA8wB,EAAA9wB,WAAAD,aAAA+wB,EAAA/wB,aAAAE,SAAA6wB,EAAA7wB,SAAAuO,MAAAsiB,EAAA5wB,YAAA4wB,EAAA5wB,YAAA8wB,KAAAD,QAAA,aAAAxpB,EAAAspB,EAAAviB,EAAAwiB,EAAA1T,EAAA2T,GAAA,IAAA7V,EAAA;AAAA,OAAAha,OAAAorB,KAAAlP,GAAA1F,SAAA,SAAAmZ,GAAA3V,EAAA2V,GAAAzT,EAAAyT,EAAA,IAAA3V,EAAAlb,aAAAkb,EAAAlb,WAAAkb,EAAAnb,eAAAmb,EAAAnb,cAAA,UAAAmb,KAAAhb,eAAAgb,EAAAjb,UAAA,GAAAib,EAAA4V,EAAAlX,QAAAqX,UAAA/U,QAAA,SAAA4U,EAAA1T,GAAA,OAAAA,EAAAyT,EAAAviB,EAAAwiB,KAAA,GAAA5V,GAAA6V,QAAA,IAAA7V,EAAAhb,cAAAgb,EAAA1M,MAAA0M,EAAAhb,YAAAgb,EAAAhb,YAAA8wB,KAAAD,QAAA,EAAA7V,EAAAhb,iBAAA,YAAAgb,EAAAhb,aAAAgB,OAAAkmB,eAAAyJ,EAAAviB,EAAA4M,GAAA,MAAAA,CAAA,C;AAKyCzc,EAAAC,SAAAkJ,GACtC,EAAAwyB,aAAcjkB,GACd,EAAAikB,aAAcz7B,EAFF,cAAmCkkC,UAAiB9jC,eAAAC,GAAAC,SAAAD,GAAA2F,EAAAzF,KAAA,eAAAC,EAAAD,MAAAyF,EAAAzF,KAAA,WAAA0F,EAAA1F,KAAA,CAGjEqnC,oBAAoBC,GAClB,MAAMC,EAAW,CACf/tB,IAAKguB,KAAKC,MAAM5/B,KAAKu3B,MAAMsI,UAAY,KAAQ,KAC/C7X,IAAK2X,KAAKC,MAAM5/B,KAAKu3B,MAAMsI,UAAY,KAAQ,KAC/CtF,IAAK,WACLjE,IAAK,mBACLwJ,WAAY,MACZC,UAAW,WAEPC,EAAS7lC,OAAOC,OAAO,CAAC,EAAGslC,EAAUD;AAC3C,MAAO,KAAOt8B,OAAO88B,KAAKtlC,KAAKC,UAAUolC,IAAW,IACtD,CAEA,gBAAI3N,GACF,OAAO/5B,UAAOyS,WAAWysB,gBAC3B,CAEAnsB,QACElI,OAAO00B,eAAeI,WAAW,eACjC9/B,KAAKugC,8BACHvgC,KAAKk6B,aACLl6B,KAAKqnC,sBACL,UAEJ,CAEArF,SAEE/6B,QAAQC,IAAI,iBACd,CAEA06B,SACE,OAAO5hC,KAAKqnC,qBACd,CAEA7O,qBACE,MAAM4H,EAAkB,CACtBhkB,YAAapc,KAAKqnC,sBAClBl0B,SAAU;AAGZ,OADAnI,OAAO00B,eAAeI,WAAW,eAC1BM,CACT,CAEA1Q,qBAAqBiR,GACnB,OAAO3gC,KAAKqnC,oBAAoB,CAAElD,OAAQ,CAACxD,IAC7C,CAEAJ,8BAA8BjV,EAAOgW,EAAOnuB,GAC1CnT,KAAKgrB,aAAe,IACfhrB,KAAKgrB,aACRM,CAACA,GAAQgW,GAEXthC,KAAKmT,SAAWA,CAClB,GACDlT,EAAAoI,EAAA5I,EAAAkB,UAAA,gBAAA+H,GAAA,CAAA7H,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,iBAzDgC,CAAC,CAAC,IAAA0E,EAAA2C,EAAA5I,EAAAkB,UAAA,YAAAsW,GAAA,CAAApW,cAAA,EAAAC,YAAA,EAAAC,UAAA,EAAAC,YAAA,kBACN,IAAI,IAAAvB,EAAA,I;ACU/BF,EAAAC,QAEa,CACb0R,SAlBe,SAAUtO,GACzBa,EAAOskC,eAAenlC,GAGtBqE,QAAQrE,MAAMA,EAChB,EAcE+pB,cAZoB,SAAU/pB,EAAOq7B,GACrCx6B,EAAOukC,iBAAiBplC,GAAQ0oB,IAC9BA,EAAM2c,OAAO,cAAehK,EAAQiK,aACpC5c,EAAM6c,WAAW,QAAS,CAAE9yB,KAAM,MAAO/F,MAAO2uB,GAAU,IAI5Dh3B,QAAQrE,MAAM,CAAEA,QAAOq7B,WACzB,EAKC,I,oNCpBMtZ,iBACL3Z,OAAO0f,SAASrhB,KAAOlJ,UAAOyS,WAAWw1B,mBACnC,IAAIlmC,SAAQ,CAACC,EAASC,IAC1B89B,YACE,IAAM99B,EAAO,IAAI+W,MAAM,gDACvB,IAGN,CAAC,I;ACuBC5Z,EAAAC,QAEa,CACbmoB,+BApCqChD,eAAgBwC,GACrD,MAAMkhB,EAAQlhB,EAAOmhB,iBAAiB,GAChCC,EAAe,IAAIC,aAAaH,GAChCI,QAAeF,EAAaG;AAClCL,EAAMM;AACN,MAAMlhB,EAASte,SAASC,cAAc;AACtCqe,EAAO/a,MAAQ+7B,EAAO/7B,MACtB+a,EAAOmhB,OAASH,EAAOG;AAGvB,OAFgBnhB,EAAOohB,WAAW,MAC1BC,UAAUL,EAAQ,EAAG,EAAGA,EAAO/7B,MAAO+7B,EAAOG,QAC9CnhB,CACT,EA0BEG,4BAxBkC,SAAUT,GAC5C,OAAO,IAAIjlB,SAAQ,CAACC,EAASC,KAC3B,MAAMmlB,EAAQpe,SAASC,cAAc,SAC/Bqe,EAASte,SAASC,cAAc,UAChC60B,EAAUxW,EAAOohB,WAAW;AAElCthB,EAAMwhB,UAAY5hB,EAClBI,EAAM/K,iBAAiB,cAAcmI,UACnC,MAAMqkB,WAAEA,EAAUC,YAAEA,GAAgB1hB;AACpCE,EAAO/a,MAAQs8B,EACfvhB,EAAOmhB,OAASK,QACV1hB,EAAM2hB,OACZjL,EAAQ6K,UAAUvhB,EAAO,EAAG,EAAGyhB,EAAYC,GAC3C9hB,EAAOmhB,iBAAiB,GAAGK,OAC3BxmC,EAAQslB,EAAO,IAEjBF,EAAM/K,iBAAiB,WAAW,WAChCpa,EAAOmlB,EAAM3kB,MACf,GAAE,GAEN,EAKC,ICtCDguB,OAAA,4DAEA,IACA,IAAAuY,EAAAC,6CACAC,EAAAlgC,SAAAkL,cAAA,cAAA80B,EAAA,MAAA7T,aAAA,WAGAgU,EAAA,CAAA9pC,QAFAgD,KAAA6a,MAAAksB,mBAAAF;AAMA,OAFArnC,OAAAkmB,eAAAohB,EAAA,cAAAh6B,OAAA,IAEAg6B,CACA,CACA,MAAAE,GACA,UAAArwB,MAAA,kDAAAgwB,EAAA,KACA,CAEA,IChBAM,cACAC,QAAA,uCAAAC,OAAA,CAAAx3B,KAAA,0BAAAhL,QAAA","ignoreList":[]}