@eui/core 13.0.0-beta.14 → 13.0.0-beta.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/classes/ActivatedRouteAction.html +43 -43
- package/docs/classes/AddApiQueueItemAction.html +43 -43
- package/docs/classes/AddAppLoadedConfigModulesAction.html +43 -43
- package/docs/classes/ApiQueueServiceMock.html +26 -526
- package/docs/classes/AsyncStorageService.html +43 -469
- package/docs/classes/AsyncStorageServiceMock.html +40 -1225
- package/docs/classes/EmptyApiQueueAction.html +43 -43
- package/docs/classes/EuiCoreRootGuardClass.html +8 -6
- package/docs/classes/EuiError.html +8 -6
- package/docs/classes/I18nResourceImpl.html +25 -26
- package/docs/classes/InitStoreAction.html +43 -43
- package/docs/classes/LogServiceMock.html +10 -10
- package/docs/classes/OpenIdConnectServiceMock.html +10 -46
- package/docs/classes/RemoveApiQueueItemAction.html +43 -43
- package/docs/classes/RouterMock.html +77 -84
- package/docs/classes/StorageService.html +31 -36
- package/docs/classes/StorageServiceMock.html +16 -479
- package/docs/classes/StoreMock.html +41 -47
- package/docs/classes/TranslateServiceMock.html +251 -270
- package/docs/classes/UpdateAppConnectionAction.html +43 -43
- package/docs/classes/UpdateAppStatusAction.html +43 -43
- package/docs/classes/UpdateAppVersionAction.html +43 -43
- package/docs/classes/UpdateCurrentModuleAction.html +43 -43
- package/docs/classes/UpdateI18nStateAction.html +43 -43
- package/docs/classes/UpdateLocaleStateAction.html +43 -43
- package/docs/classes/UpdateNotificationsListAction.html +43 -43
- package/docs/classes/UpdateUserDashboardAction.html +43 -43
- package/docs/classes/UpdateUserDetailsAction.html +43 -43
- package/docs/classes/UpdateUserPreferencesAction.html +43 -43
- package/docs/classes/UpdateUserRightsAction.html +43 -43
- package/docs/classes/UpdateUserStateAction.html +43 -43
- package/docs/classes/UxErrorManager.html +39 -43
- package/docs/dependencies.html +44 -41
- package/docs/directives/TranslateMockDirective.html +9 -7
- package/docs/index.html +7 -6
- package/docs/injectables/ApiQueueService.html +33 -40
- package/docs/injectables/CoreAppEffects.html +98 -99
- package/docs/injectables/EuiPermissionService.html +26 -31
- package/docs/injectables/GlobalErrorHandler.html +12 -11
- package/docs/injectables/I18nLoader.html +28 -30
- package/docs/injectables/I18nService.html +42 -48
- package/docs/injectables/I18nServiceMock.html +32 -569
- package/docs/injectables/LocalForageService.html +75 -1549
- package/docs/injectables/LocalStorageService.html +38 -499
- package/docs/injectables/LocaleService.html +23 -28
- package/docs/injectables/LocaleServiceMock.html +21 -198
- package/docs/injectables/LogService.html +11 -10
- package/docs/injectables/OpenIdConnectService.html +10 -10
- package/docs/injectables/SessionStorageService.html +38 -499
- package/docs/injectables/StoreService.html +24 -28
- package/docs/injectables/StoreServiceMock.html +18 -360
- package/docs/injectables/UserService.html +24 -27
- package/docs/injectables/UserServiceMock.html +31 -196
- package/docs/injectables/UxAppShellService.html +299 -355
- package/docs/injectables/UxDynamicComponentService.html +16 -16
- package/docs/injectables/UxDynamicMenuService.html +38 -40
- package/docs/injectables/UxErrorFeedbackService.html +42 -48
- package/docs/injectables/UxTimezoneService.html +18 -22
- package/docs/interceptors/AddLangParamInterceptor.html +11 -10
- package/docs/interceptors/CachePreventionInterceptor.html +11 -10
- package/docs/interceptors/CorsSecurityInterceptor.html +11 -10
- package/docs/interceptors/CsrfPreventionInterceptor.html +11 -10
- package/docs/interceptors/EuLoginSessionTimeoutHandlingInterceptor.html +11 -10
- package/docs/interceptors/HttpErrorHandlerInterceptor.html +11 -10
- package/docs/interceptors/OpenIdConnectInterceptor.html +35 -35
- package/docs/interceptors/UxRequestErrorModelInterceptor.html +11 -10
- package/docs/interfaces/LoadedResources.html +37 -12
- package/docs/interfaces/LoadedResourcesError.html +28 -10
- package/docs/interfaces/ModuleLoadEvent.html +37 -12
- package/docs/interfaces/OpenIdConnectUserDetails.html +64 -18
- package/docs/interfaces/ResourceError.html +37 -12
- package/docs/interfaces/TimeZone.html +28 -10
- package/docs/interfaces/UIState.html +325 -76
- package/docs/js/libs/prism.js +46 -14
- package/docs/js/menu-wc.js +76 -79
- package/docs/js/menu-wc_es5.js +60 -0
- package/docs/js/menu.js +15 -11
- package/docs/js/search/lunr.min.js +3 -3
- package/docs/js/search/search_index.js +2 -2
- package/docs/license.html +6 -5
- package/docs/miscellaneous/enumerations.html +18 -17
- package/docs/miscellaneous/functions.html +261 -140
- package/docs/miscellaneous/typealiases.html +18 -17
- package/docs/miscellaneous/variables.html +1719 -1811
- package/docs/modules/CoreModule.html +13 -14
- package/docs/modules/I18nModule.html +11 -11
- package/docs/modules/LogModule.html +16 -16
- package/docs/modules/TranslateMockModule.html +8 -6
- package/docs/modules.html +6 -5
- package/docs/pipes/TranslateMockPipe.html +10 -9
- package/docs/styles/bootstrap.min.css +4 -3
- package/docs/styles/compodoc.css +41 -33
- package/docs/styles/dark.css +113 -0
- package/docs/styles/laravel.css +52 -6
- package/docs/styles/material.css +31 -7
- package/docs/styles/original.css +12 -6
- package/docs/styles/postmark.css +23 -7
- package/docs/styles/prism.css +169 -135
- package/docs/styles/readthedocs.css +22 -11
- package/docs/styles/stripe.css +48 -5
- package/docs/styles/vagrant.css +42 -6
- package/{esm2015/eui-core.js → esm2020/eui-core.mjs} +0 -0
- package/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/{esm2015/lib/eui-core.module.js → esm2020/lib/eui-core.module.mjs} +5 -5
- package/{esm2015/lib/helpers/date-helpers.js → esm2020/lib/helpers/date-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/dom-helpers.js → esm2020/lib/helpers/dom-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/event-helpers.js → esm2020/lib/helpers/event-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/form-helpers.js → esm2020/lib/helpers/form-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/format-helpers.js → esm2020/lib/helpers/format-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/http-helpers.js → esm2020/lib/helpers/http-helpers.mjs} +0 -0
- package/{esm2015/lib/helpers/index.js → esm2020/lib/helpers/index.mjs} +0 -0
- package/{esm2015/lib/helpers/utils.js → esm2020/lib/helpers/utils.mjs} +0 -0
- package/{esm2015/lib/interceptors/add-lang-param.interceptor.js → esm2020/lib/interceptors/add-lang-param.interceptor.mjs} +4 -4
- package/{esm2015/lib/interceptors/cache-prevention.interceptor.js → esm2020/lib/interceptors/cache-prevention.interceptor.mjs} +4 -4
- package/{esm2015/lib/interceptors/cors-security.interceptor.js → esm2020/lib/interceptors/cors-security.interceptor.mjs} +4 -4
- package/{esm2015/lib/interceptors/csrf-prevention.interceptor.js → esm2020/lib/interceptors/csrf-prevention.interceptor.mjs} +4 -4
- package/esm2020/lib/interceptors/eu-login-session-timeout-handling.interceptor.mjs +61 -0
- package/{esm2015/lib/interceptors/index.js → esm2020/lib/interceptors/index.mjs} +0 -0
- package/{esm2015/lib/interceptors/openid/index.js → esm2020/lib/interceptors/openid/index.mjs} +0 -0
- package/esm2020/lib/interceptors/openid/openid-connect.interceptor.mjs +146 -0
- package/{esm2015/lib/interceptors/openid/openid-connect.service.js → esm2020/lib/interceptors/openid/openid-connect.service.mjs} +4 -4
- package/{esm2015/lib/interceptors/openid/openid-connect.service.mock.js → esm2020/lib/interceptors/openid/openid-connect.service.mock.mjs} +0 -0
- package/{esm2015/lib/interceptors/ux-request-error-model.interceptor.js → esm2020/lib/interceptors/ux-request-error-model.interceptor.mjs} +4 -4
- package/{esm2015/lib/services/app/eui-init-app.js → esm2020/lib/services/app/eui-init-app.mjs} +0 -0
- package/esm2020/lib/services/app/eui-pre-init-app.mjs +42 -0
- package/{esm2015/lib/services/app/eui-startup.js → esm2020/lib/services/app/eui-startup.mjs} +0 -0
- package/{esm2015/lib/services/app/factories/log.js → esm2020/lib/services/app/factories/log.mjs} +0 -0
- package/{esm2015/lib/services/app/index.js → esm2020/lib/services/app/index.mjs} +0 -0
- package/esm2020/lib/services/config/defaults.mjs +63 -0
- package/{esm2015/lib/services/config/tokens.js → esm2020/lib/services/config/tokens.mjs} +5 -2
- package/{esm2015/lib/services/errors/eui.error.js → esm2020/lib/services/errors/eui.error.mjs} +0 -0
- package/{esm2015/lib/services/errors/global-error-handler.js → esm2020/lib/services/errors/global-error-handler.mjs} +4 -4
- package/{esm2015/lib/services/errors/http-error-handler-callback-functions.js → esm2020/lib/services/errors/http-error-handler-callback-functions.mjs} +0 -0
- package/{esm2015/lib/services/errors/http-error-handler.interceptor.js → esm2020/lib/services/errors/http-error-handler.interceptor.mjs} +4 -4
- package/{esm2015/lib/services/errors/index.js → esm2020/lib/services/errors/index.mjs} +0 -0
- package/{esm2015/lib/services/i18n/i18n.loader.js → esm2020/lib/services/i18n/i18n.loader.mjs} +4 -4
- package/{esm2015/lib/services/i18n/i18n.resource.js → esm2020/lib/services/i18n/i18n.resource.mjs} +0 -0
- package/esm2020/lib/services/i18n/i18n.service.mjs +222 -0
- package/{esm2015/lib/services/i18n/i18n.service.mock.js → esm2020/lib/services/i18n/i18n.service.mock.mjs} +4 -4
- package/{esm2015/lib/services/i18n/index.js → esm2020/lib/services/i18n/index.mjs} +0 -0
- package/{esm2015/lib/services/index.js → esm2020/lib/services/index.mjs} +0 -0
- package/{esm2015/lib/services/locale/index.js → esm2020/lib/services/locale/index.mjs} +0 -0
- package/esm2020/lib/services/locale/locale.service.mjs +250 -0
- package/{esm2015/lib/services/log/index.js → esm2020/lib/services/log/index.mjs} +0 -0
- package/{esm2015/lib/services/log/log.module.js → esm2020/lib/services/log/log.module.mjs} +5 -5
- package/{esm2015/lib/services/log/log.service.js → esm2020/lib/services/log/log.service.mjs} +4 -4
- package/{esm2015/lib/services/log/log.service.mock.js → esm2020/lib/services/log/log.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/permission/permission.service.js → esm2020/lib/services/permission/permission.service.mjs} +5 -5
- package/{esm2015/lib/services/queue/api-queue.service.js → esm2020/lib/services/queue/api-queue.service.mjs} +4 -4
- package/{esm2015/lib/services/queue/api-queue.service.mock.js → esm2020/lib/services/queue/api-queue.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/queue/index.js → esm2020/lib/services/queue/index.mjs} +0 -0
- package/{esm2015/lib/services/storage/async-storage.service.js → esm2020/lib/services/storage/async-storage.service.mjs} +0 -0
- package/{esm2015/lib/services/storage/async-storage.service.mock.js → esm2020/lib/services/storage/async-storage.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/storage/index.js → esm2020/lib/services/storage/index.mjs} +0 -0
- package/{esm2015/lib/services/storage/local-forage.service.js → esm2020/lib/services/storage/local-forage.service.mjs} +4 -4
- package/{esm2015/lib/services/storage/local-storage.service.js → esm2020/lib/services/storage/local-storage.service.mjs} +4 -4
- package/{esm2015/lib/services/storage/session-storage.service.js → esm2020/lib/services/storage/session-storage.service.mjs} +4 -4
- package/{esm2015/lib/services/storage/storage.service.js → esm2020/lib/services/storage/storage.service.mjs} +0 -0
- package/{esm2015/lib/services/storage/storage.service.mock.js → esm2020/lib/services/storage/storage.service.mock.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/app.actions.js → esm2020/lib/services/store/actions/app.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/i18n.actions.js → esm2020/lib/services/store/actions/i18n.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/index.js → esm2020/lib/services/store/actions/index.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/locale.actions.js → esm2020/lib/services/store/actions/locale.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/notifications.actions.js → esm2020/lib/services/store/actions/notifications.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/actions/user.actions.js → esm2020/lib/services/store/actions/user.actions.mjs} +0 -0
- package/{esm2015/lib/services/store/effects/app.effects.js → esm2020/lib/services/store/effects/app.effects.mjs} +5 -5
- package/{esm2015/lib/services/store/effects/index.js → esm2020/lib/services/store/effects/index.mjs} +0 -0
- package/{esm2015/lib/services/store/index.js → esm2020/lib/services/store/index.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/app.reducers.mjs +57 -0
- package/{esm2015/lib/services/store/reducers/core.reducers.js → esm2020/lib/services/store/reducers/core.reducers.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/i18n.reducers.mjs +18 -0
- package/{esm2015/lib/services/store/reducers/index.js → esm2020/lib/services/store/reducers/index.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/locale.reducers.mjs +18 -0
- package/esm2020/lib/services/store/reducers/meta.reducers.mjs +91 -0
- package/{esm2015/lib/services/store/reducers/notifications.reducers.js → esm2020/lib/services/store/reducers/notifications.reducers.mjs} +0 -0
- package/esm2020/lib/services/store/reducers/user.reducers.mjs +43 -0
- package/{esm2015/lib/services/store/store.service.js → esm2020/lib/services/store/store.service.mjs} +4 -4
- package/{esm2015/lib/services/store/store.service.mock.js → esm2020/lib/services/store/store.service.mock.mjs} +4 -4
- package/{esm2015/lib/services/user/index.js → esm2020/lib/services/user/index.mjs} +0 -0
- package/{esm2015/lib/services/user/user.service.js → esm2020/lib/services/user/user.service.mjs} +4 -4
- package/{esm2015/lib/services/user/user.service.mock.js → esm2020/lib/services/user/user.service.mock.mjs} +4 -4
- package/esm2020/lib/services/ux-app-shell.service.mjs +633 -0
- package/{esm2015/lib/services/ux-dynamic-component/ux-dynamic-component.service.js → esm2020/lib/services/ux-dynamic-component/ux-dynamic-component.service.mjs} +4 -4
- package/{esm2015/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.js → esm2020/lib/services/ux-dynamic-menu/ux-dynamic-menu.service.mjs} +4 -4
- package/{esm2015/lib/services/ux-error-feedback/ux-error-feedback.service.js → esm2020/lib/services/ux-error-feedback/ux-error-feedback.service.mjs} +4 -4
- package/{esm2015/lib/services/ux-error-feedback/ux-error-handler.operator.js → esm2020/lib/services/ux-error-feedback/ux-error-handler.operator.mjs} +0 -0
- package/{esm2015/lib/services/ux-timezone.service.js → esm2020/lib/services/ux-timezone.service.mjs} +4 -4
- package/fesm2015/{eui-core.js → eui-core.mjs} +270 -247
- package/fesm2015/eui-core.mjs.map +1 -0
- package/fesm2020/eui-core.mjs +4592 -0
- package/fesm2020/eui-core.mjs.map +1 -0
- package/lib/services/locale/locale.service.d.ts.map +1 -1
- package/lib/services/permission/permission.service.d.ts +1 -1
- package/lib/services/permission/permission.service.d.ts.map +1 -1
- package/package.json +19 -6
- package/bundles/eui-core.umd.js +0 -5323
- package/bundles/eui-core.umd.js.map +0 -1
- package/esm2015/lib/interceptors/eu-login-session-timeout-handling.interceptor.js +0 -61
- package/esm2015/lib/interceptors/openid/openid-connect.interceptor.js +0 -146
- package/esm2015/lib/services/app/eui-pre-init-app.js +0 -47
- package/esm2015/lib/services/config/defaults.js +0 -49
- package/esm2015/lib/services/i18n/i18n.service.js +0 -219
- package/esm2015/lib/services/locale/locale.service.js +0 -255
- package/esm2015/lib/services/store/reducers/app.reducers.js +0 -49
- package/esm2015/lib/services/store/reducers/i18n.reducers.js +0 -15
- package/esm2015/lib/services/store/reducers/locale.reducers.js +0 -15
- package/esm2015/lib/services/store/reducers/meta.reducers.js +0 -92
- package/esm2015/lib/services/store/reducers/user.reducers.js +0 -43
- package/esm2015/lib/services/ux-app-shell.service.js +0 -584
- package/fesm2015/eui-core.js.map +0 -1
|
@@ -1,584 +0,0 @@
|
|
|
1
|
-
import { Inject, Injectable, Optional, PLATFORM_ID } from '@angular/core';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { isPlatformBrowser } from '@angular/common';
|
|
4
|
-
import { BehaviorSubject, defer } from 'rxjs';
|
|
5
|
-
import { UxEuLanguages, getActiveLang } from '@eui/base';
|
|
6
|
-
import { GLOBAL_CONFIG_TOKEN } from './config/tokens';
|
|
7
|
-
import { I18nService } from './i18n';
|
|
8
|
-
import { Router, NavigationEnd } from '@angular/router';
|
|
9
|
-
import { StoreService } from './store/store.service';
|
|
10
|
-
import { distinctUntilChanged, map, filter } from 'rxjs/operators';
|
|
11
|
-
import isEqual from 'lodash/isEqual';
|
|
12
|
-
import get from 'lodash/get';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "@angular/common/http";
|
|
15
|
-
import * as i2 from "@angular/router";
|
|
16
|
-
import * as i3 from "./store/store.service";
|
|
17
|
-
import * as i4 from "./i18n";
|
|
18
|
-
const initialState = {
|
|
19
|
-
appName: '',
|
|
20
|
-
appShortName: '',
|
|
21
|
-
appSubTitle: '',
|
|
22
|
-
userInfos: null,
|
|
23
|
-
userSubInfos: null,
|
|
24
|
-
impersonatedUserInfos: null,
|
|
25
|
-
isSidebarOpen: false,
|
|
26
|
-
isSidebarHover: false,
|
|
27
|
-
isSidebarActive: false,
|
|
28
|
-
isSidebarInnerActive: false,
|
|
29
|
-
isSidebarStateCloseWithIcons: false,
|
|
30
|
-
hasSidebar: false,
|
|
31
|
-
hasHeader: false,
|
|
32
|
-
hasHeaderLogo: false,
|
|
33
|
-
hasHeaderEnvironment: false,
|
|
34
|
-
environmentValue: '',
|
|
35
|
-
isSidebarHidden: false,
|
|
36
|
-
hasToolbar: false,
|
|
37
|
-
windowWidth: 0,
|
|
38
|
-
windowHeight: 0,
|
|
39
|
-
mainContentHeight: 0,
|
|
40
|
-
pageHeaderHeight: 0,
|
|
41
|
-
wrapperClasses: '',
|
|
42
|
-
breakpoint: '',
|
|
43
|
-
breakpoints: {
|
|
44
|
-
isMobile: false,
|
|
45
|
-
isTablet: false,
|
|
46
|
-
isLtDesktop: false,
|
|
47
|
-
isDesktop: false,
|
|
48
|
-
isXL: false,
|
|
49
|
-
isXXL: false,
|
|
50
|
-
},
|
|
51
|
-
menuLinks: [],
|
|
52
|
-
sidebarLinks: [],
|
|
53
|
-
combinedLinks: [],
|
|
54
|
-
isBlockDocumentActive: false,
|
|
55
|
-
deviceInfo: null,
|
|
56
|
-
activeLanguage: 'en',
|
|
57
|
-
languages: UxEuLanguages.getLanguages(),
|
|
58
|
-
appMetadata: null,
|
|
59
|
-
hasModalActive: false,
|
|
60
|
-
isDimmerActive: false,
|
|
61
|
-
};
|
|
62
|
-
// TODO: this service needs to be transferred in the respective component
|
|
63
|
-
export class UxAppShellService {
|
|
64
|
-
constructor(config, http, platformId, router, storeService, i18nService) {
|
|
65
|
-
var _a, _b, _c, _d;
|
|
66
|
-
this.config = config;
|
|
67
|
-
this.http = http;
|
|
68
|
-
this.platformId = platformId;
|
|
69
|
-
this.router = router;
|
|
70
|
-
this.storeService = storeService;
|
|
71
|
-
this.i18nService = i18nService;
|
|
72
|
-
this.growlMessages = [];
|
|
73
|
-
this.isGrowlSticky = false;
|
|
74
|
-
this.growlLife = 3000;
|
|
75
|
-
this.growlPosition = 'bottom-right';
|
|
76
|
-
this.growlCallback = null;
|
|
77
|
-
this.activeModals = [];
|
|
78
|
-
this.openModalId = new BehaviorSubject('');
|
|
79
|
-
this.cssVars = [];
|
|
80
|
-
let stateWithConfig = initialState;
|
|
81
|
-
const languages = ((_b = (_a = config === null || config === void 0 ? void 0 : config.i18n) === null || _a === void 0 ? void 0 : _a.i18nService) === null || _b === void 0 ? void 0 : _b.languages) || initialState.languages;
|
|
82
|
-
const defaultLanguage = ((_d = (_c = config === null || config === void 0 ? void 0 : config.i18n) === null || _c === void 0 ? void 0 : _c.i18nService) === null || _d === void 0 ? void 0 : _d.defaultLanguage) || initialState.activeLanguage;
|
|
83
|
-
stateWithConfig = Object.assign(Object.assign({}, stateWithConfig), {
|
|
84
|
-
languages: languages,
|
|
85
|
-
activeLanguage: defaultLanguage,
|
|
86
|
-
});
|
|
87
|
-
this._state$ = new BehaviorSubject(stateWithConfig);
|
|
88
|
-
this._breakpoint$ = new BehaviorSubject('');
|
|
89
|
-
this._breakpoints$ = new BehaviorSubject({});
|
|
90
|
-
this.bindActiveLanguageToAppShellState();
|
|
91
|
-
if (isPlatformBrowser(this.platformId)) {
|
|
92
|
-
router.events
|
|
93
|
-
.subscribe((event) => {
|
|
94
|
-
if (event instanceof NavigationEnd) {
|
|
95
|
-
window.scrollTo(0, 0);
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
// -------------------
|
|
101
|
-
get state$() {
|
|
102
|
-
return this._state$.asObservable();
|
|
103
|
-
}
|
|
104
|
-
// -------------------
|
|
105
|
-
// exposed observables
|
|
106
|
-
get breakpoint$() {
|
|
107
|
-
return this._breakpoint$.asObservable();
|
|
108
|
-
}
|
|
109
|
-
get breakpoints$() {
|
|
110
|
-
return this._breakpoints$.asObservable();
|
|
111
|
-
}
|
|
112
|
-
// ----------------
|
|
113
|
-
// state operations
|
|
114
|
-
// ----------------
|
|
115
|
-
get state() {
|
|
116
|
-
return this._state$.getValue();
|
|
117
|
-
}
|
|
118
|
-
get isSidebarOpen() {
|
|
119
|
-
return this.state.isSidebarOpen;
|
|
120
|
-
}
|
|
121
|
-
// Edit mode
|
|
122
|
-
get isDimmerActive() {
|
|
123
|
-
return this.state.isDimmerActive;
|
|
124
|
-
}
|
|
125
|
-
// ----------------------------
|
|
126
|
-
// public setters and functions
|
|
127
|
-
// ----------------------------
|
|
128
|
-
set isSidebarOpen(isOpen) {
|
|
129
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isSidebarOpen: isOpen }));
|
|
130
|
-
}
|
|
131
|
-
set isSidebarHover(isHover) {
|
|
132
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isSidebarHover: isHover }));
|
|
133
|
-
}
|
|
134
|
-
get isSidebarHover() {
|
|
135
|
-
return this.state.isSidebarHover;
|
|
136
|
-
}
|
|
137
|
-
set isSidebarActive(isActive) {
|
|
138
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isSidebarActive: isActive }));
|
|
139
|
-
}
|
|
140
|
-
set isSidebarInnerActive(isOpen) {
|
|
141
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isSidebarInnerActive: isOpen }));
|
|
142
|
-
}
|
|
143
|
-
set sidebarLinks(links) {
|
|
144
|
-
this.setState(Object.assign(Object.assign({}, this.state), { sidebarLinks: links }));
|
|
145
|
-
}
|
|
146
|
-
set menuLinks(links) {
|
|
147
|
-
this.setState(Object.assign(Object.assign({}, this.state), { menuLinks: links }));
|
|
148
|
-
}
|
|
149
|
-
set isBlockDocumentActive(isActive) {
|
|
150
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isBlockDocumentActive: isActive }));
|
|
151
|
-
}
|
|
152
|
-
// Edit mode
|
|
153
|
-
set isDimmerActive(isActive) {
|
|
154
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isDimmerActive: isActive }));
|
|
155
|
-
}
|
|
156
|
-
setState(nextState, updateI18 = true) {
|
|
157
|
-
let breakpoint, breakpoints, wrapperClasses;
|
|
158
|
-
let combinedLinks;
|
|
159
|
-
const state = this.state;
|
|
160
|
-
// check if window width has been updated from previous state
|
|
161
|
-
if (this.state.windowWidth !== nextState.windowWidth) {
|
|
162
|
-
breakpoint = this.getBreakpoint(nextState.windowWidth);
|
|
163
|
-
breakpoints = this.getBreakpoints(breakpoint);
|
|
164
|
-
this._breakpoint$.next(breakpoint);
|
|
165
|
-
this._breakpoints$.next(breakpoints);
|
|
166
|
-
// if not propagate the old ones without doing any calculations
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
breakpoint = state.breakpoint;
|
|
170
|
-
breakpoints = state.breakpoints;
|
|
171
|
-
}
|
|
172
|
-
// finally get the wrapper classes when both the state and breakpoint are known
|
|
173
|
-
wrapperClasses = this.getWrapperClasses(nextState, breakpoint);
|
|
174
|
-
// check if the menuLinks or sidebarLinks have changed from previous state
|
|
175
|
-
if (this.state.menuLinks !== nextState.menuLinks || this.state.sidebarLinks !== nextState.sidebarLinks) {
|
|
176
|
-
combinedLinks = [...nextState.menuLinks, ...nextState.sidebarLinks];
|
|
177
|
-
}
|
|
178
|
-
else {
|
|
179
|
-
combinedLinks = this.state.combinedLinks;
|
|
180
|
-
}
|
|
181
|
-
const stateBeforeUpdate = Object.assign({}, this.state);
|
|
182
|
-
// we put it all together with the calculated properties
|
|
183
|
-
this._state$.next(Object.assign(Object.assign({}, nextState), { wrapperClasses,
|
|
184
|
-
breakpoint,
|
|
185
|
-
breakpoints,
|
|
186
|
-
combinedLinks }));
|
|
187
|
-
// update the Store Language
|
|
188
|
-
if (updateI18 && nextState.activeLanguage !== stateBeforeUpdate.activeLanguage) {
|
|
189
|
-
this.i18nService.updateState({ activeLang: nextState.activeLanguage });
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
/**
|
|
193
|
-
* Emits a slice from the state whether that changes
|
|
194
|
-
* @param key can be 'key' or 'key.sub.sub'
|
|
195
|
-
*/
|
|
196
|
-
getState(key) {
|
|
197
|
-
return defer(() => {
|
|
198
|
-
// check if key exists
|
|
199
|
-
return key ? this.state$.pipe(map((state) => get(state, key)), filter((state) => state), distinctUntilChanged((x, y) => isEqual(x, y))) : this.state$;
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
sidebarToggle() {
|
|
203
|
-
this.isSidebarOpen = !this.state.isSidebarOpen;
|
|
204
|
-
}
|
|
205
|
-
// Edit mode
|
|
206
|
-
dimmerActiveToggle() {
|
|
207
|
-
const isActive = this.isDimmerActive;
|
|
208
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isDimmerActive: !isActive }));
|
|
209
|
-
this.activateEditModeCssVars(!isActive);
|
|
210
|
-
}
|
|
211
|
-
setDimmerActiveState(activeState) {
|
|
212
|
-
this.setState(Object.assign(Object.assign({}, this.state), { isDimmerActive: activeState }));
|
|
213
|
-
this.activateEditModeCssVars(activeState);
|
|
214
|
-
}
|
|
215
|
-
activateEditModeCssVars(isActive) {
|
|
216
|
-
if (isActive) {
|
|
217
|
-
this._setCssVarValue('--eui-docpage-navigation-z-index', 'inherit'); // Reset doc-page-navigation-column z-index
|
|
218
|
-
this._setCssVarValue('--eui-z-index-sidebar', 'inherit'); // Reset eui-app-sidebar z-index
|
|
219
|
-
this._setCssVarValue('--eui-z-index-root', 'inherit'); // Reset eui-app-main-content z-index
|
|
220
|
-
}
|
|
221
|
-
else {
|
|
222
|
-
this._setCssVarValue('--eui-docpage-navigation-z-index', '2'); // Restore doc-page-navigation-column z-index
|
|
223
|
-
this._setCssVarValue('--eui-z-index-sidebar', '1044'); // Restore eui-app-sidebar z-index
|
|
224
|
-
this._setCssVarValue('--eui-z-index-root', '1'); // Restore eui-app-main-content z-index
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// --------------
|
|
228
|
-
// public methods
|
|
229
|
-
// --------------
|
|
230
|
-
fetchAppMetadata(metadataFilePath = 'assets/app-metadata.json') {
|
|
231
|
-
this.getJson(metadataFilePath)
|
|
232
|
-
.then((data) => {
|
|
233
|
-
this.setState(Object.assign(Object.assign({}, this.state), { appMetadata: data }));
|
|
234
|
-
});
|
|
235
|
-
}
|
|
236
|
-
activateSidebar() {
|
|
237
|
-
this.setState(Object.assign(Object.assign({}, this.state), { hasSidebar: true }));
|
|
238
|
-
if (!this.state.isSidebarHidden) {
|
|
239
|
-
this.activateSidebarCssVars();
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
activateSidebarHeader() {
|
|
243
|
-
this.activateSidebarHeaderCssVars();
|
|
244
|
-
}
|
|
245
|
-
activateSidebarFooter() {
|
|
246
|
-
this.activateSidebarFooterCssVars();
|
|
247
|
-
}
|
|
248
|
-
activateHeader() {
|
|
249
|
-
this.setState(Object.assign(Object.assign({}, this.state), { hasHeader: true }));
|
|
250
|
-
this.activateHeaderCssVars();
|
|
251
|
-
}
|
|
252
|
-
activateToolbar() {
|
|
253
|
-
this.setState(Object.assign(Object.assign({}, this.state), { hasToolbar: true }));
|
|
254
|
-
this.activateToolbarCssVars();
|
|
255
|
-
}
|
|
256
|
-
fetchCssVars() {
|
|
257
|
-
const cssVarNames = [
|
|
258
|
-
'--eui-app-header-height-default',
|
|
259
|
-
'--eui-app-header-height-active',
|
|
260
|
-
'--eui-app-header-height-shrink',
|
|
261
|
-
'--eui-app-toolbar-height-default',
|
|
262
|
-
'--eui-app-toolbar-height-active',
|
|
263
|
-
'--eui-app-sidebar-width-default',
|
|
264
|
-
'--eui-app-sidebar-width-active',
|
|
265
|
-
'--eui-app-sidebar-width-close-default',
|
|
266
|
-
'--eui-app-sidebar-width-close-active',
|
|
267
|
-
'--eui-app-sidebar-header-height-default',
|
|
268
|
-
'--eui-app-sidebar-header-height-active',
|
|
269
|
-
'--eui-app-sidebar-footer-height-default',
|
|
270
|
-
'--eui-app-sidebar-footer-height-active',
|
|
271
|
-
];
|
|
272
|
-
this.cssVars = cssVarNames.map((v) => {
|
|
273
|
-
return { key: v, value: this.getCssVarValue(v) };
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
initCssVars() {
|
|
277
|
-
this.setCssVar('--eui-app-header-height-default', '--eui-app-header-height');
|
|
278
|
-
this.setCssVar('--eui-app-toolbar-height-default', '--eui-app-toolbar-height');
|
|
279
|
-
this.setCssVar('--eui-app-sidebar-width-default', '--eui-app-sidebar-width');
|
|
280
|
-
this.setCssVar('--eui-app-sidebar-width-close-default', '--eui-app-sidebar-width-close');
|
|
281
|
-
this.setCssVar('--eui-app-sidebar-header-height-default', '--eui-app-sidebar-header-height');
|
|
282
|
-
this.setCssVar('--eui-app-sidebar-footer-height-default', '--eui-app-sidebar-footer-height');
|
|
283
|
-
}
|
|
284
|
-
activateHeaderCssVars() {
|
|
285
|
-
this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
|
|
286
|
-
}
|
|
287
|
-
activateToolbarCssVars() {
|
|
288
|
-
this.setCssVar('--eui-app-toolbar-height-active', '--eui-app-toolbar-height');
|
|
289
|
-
}
|
|
290
|
-
activateFooterCssVars() {
|
|
291
|
-
this.setCssVar('--eui-app-footer-height-active', '--eui-app-footer-height');
|
|
292
|
-
}
|
|
293
|
-
setHeaderShrinkCssVar(active) {
|
|
294
|
-
if (active) {
|
|
295
|
-
this.setCssVar('--eui-app-header-height-shrink', '--eui-app-header-height');
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
this.setCssVar('--eui-app-header-height-active', '--eui-app-header-height');
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
activateSidebarCssVars() {
|
|
302
|
-
this.setCssVar('--eui-app-sidebar-width-active', '--eui-app-sidebar-width');
|
|
303
|
-
this.setCssVar('--eui-app-sidebar-width-close-active', '--eui-app-sidebar-width-close');
|
|
304
|
-
}
|
|
305
|
-
activateSidebarHeaderCssVars() {
|
|
306
|
-
this.setCssVar('--eui-app-sidebar-header-height-active', '--eui-app-sidebar-header-height');
|
|
307
|
-
}
|
|
308
|
-
activateSidebarFooterCssVars() {
|
|
309
|
-
this.setCssVar('--eui-app-sidebar-footer-height-active', '--eui-app-sidebar-footer-height');
|
|
310
|
-
}
|
|
311
|
-
/**
|
|
312
|
-
* displays a growl UxMessage item, isSticky
|
|
313
|
-
*/
|
|
314
|
-
growl(msg, isSticky, isMultiple, life, position, callback) {
|
|
315
|
-
if (msg.severity !== 'info' && msg.severity !== 'warning' && msg.severity !== 'success' && msg.severity !== 'danger') {
|
|
316
|
-
throw new Error('UxAppShellService.growl() ERROR : message severity must be either : success, warning, info, danger');
|
|
317
|
-
}
|
|
318
|
-
else {
|
|
319
|
-
if (isMultiple === undefined || !isMultiple) {
|
|
320
|
-
this.growlMessages = [];
|
|
321
|
-
}
|
|
322
|
-
this.growlMessages = this.growlMessages.concat(msg);
|
|
323
|
-
msg.life = life;
|
|
324
|
-
msg.sticky = isSticky;
|
|
325
|
-
if (life === undefined || isNaN(life)) {
|
|
326
|
-
if (msg.severity === 'danger') {
|
|
327
|
-
isSticky = true;
|
|
328
|
-
}
|
|
329
|
-
else {
|
|
330
|
-
this.growlLife = 3000;
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
|
-
else {
|
|
334
|
-
this.growlLife = life;
|
|
335
|
-
}
|
|
336
|
-
if (isSticky) {
|
|
337
|
-
this.isGrowlSticky = isSticky;
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
this.isGrowlSticky = false;
|
|
341
|
-
}
|
|
342
|
-
if (position) {
|
|
343
|
-
this.growlPosition = position;
|
|
344
|
-
}
|
|
345
|
-
if (callback) {
|
|
346
|
-
this.growlCallback = callback;
|
|
347
|
-
}
|
|
348
|
-
else {
|
|
349
|
-
this.growlCallback = () => {
|
|
350
|
-
};
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
clearGrowl() {
|
|
355
|
-
this.growlMessages = [];
|
|
356
|
-
}
|
|
357
|
-
growlSuccess(msg, position) {
|
|
358
|
-
this.growl({ severity: 'success', summary: 'SUCCESS', detail: msg }, false, false, undefined, position);
|
|
359
|
-
}
|
|
360
|
-
growlError(msg, position) {
|
|
361
|
-
this.growl({ severity: 'danger', summary: 'ERROR', detail: msg }, false, false, undefined, position);
|
|
362
|
-
}
|
|
363
|
-
// date helpers
|
|
364
|
-
growlWarning(msg, position) {
|
|
365
|
-
this.growl({ severity: 'warning', summary: 'WARNING', detail: msg }, false, false, undefined, position);
|
|
366
|
-
}
|
|
367
|
-
growlInfo(msg, position) {
|
|
368
|
-
this.growl({ severity: 'info', summary: 'INFO', detail: msg }, false, false, undefined, position);
|
|
369
|
-
}
|
|
370
|
-
openModal(modalId) {
|
|
371
|
-
document.body.classList.add('modal-open');
|
|
372
|
-
if (!modalId) {
|
|
373
|
-
modalId = 'single_modal';
|
|
374
|
-
}
|
|
375
|
-
this.activeModals.push({
|
|
376
|
-
id: modalId,
|
|
377
|
-
isOpen: true,
|
|
378
|
-
});
|
|
379
|
-
setTimeout(() => {
|
|
380
|
-
const el = document.getElementById(modalId + '-close-button');
|
|
381
|
-
if (el) {
|
|
382
|
-
el.focus();
|
|
383
|
-
}
|
|
384
|
-
}, 100);
|
|
385
|
-
}
|
|
386
|
-
openMessageBox(messageBoxId) {
|
|
387
|
-
if (!messageBoxId) {
|
|
388
|
-
messageBoxId = 'messagebox_modal';
|
|
389
|
-
}
|
|
390
|
-
this.openModal(messageBoxId);
|
|
391
|
-
}
|
|
392
|
-
closeMessageBox(messageBoxId) {
|
|
393
|
-
if (!messageBoxId) {
|
|
394
|
-
messageBoxId = 'messagebox_modal';
|
|
395
|
-
}
|
|
396
|
-
this.closeModal(messageBoxId);
|
|
397
|
-
}
|
|
398
|
-
isModalOpen(modalId) {
|
|
399
|
-
if (!modalId) {
|
|
400
|
-
modalId = 'single_modal';
|
|
401
|
-
}
|
|
402
|
-
if (this.activeModals.length) {
|
|
403
|
-
let modalIndex = this.findModalIndex(modalId);
|
|
404
|
-
if (modalIndex !== -1) {
|
|
405
|
-
return this.activeModals[modalIndex].isOpen;
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
return false;
|
|
409
|
-
}
|
|
410
|
-
// Positions helpers
|
|
411
|
-
closeModal(modalId) {
|
|
412
|
-
if (!modalId) {
|
|
413
|
-
modalId = 'single_modal';
|
|
414
|
-
}
|
|
415
|
-
/**
|
|
416
|
-
* Make sure we find the modal before splicing the activeModals array
|
|
417
|
-
*/
|
|
418
|
-
const index = this.findModalIndex(modalId);
|
|
419
|
-
if (index >= 0) {
|
|
420
|
-
this.activeModals.splice(index, 1);
|
|
421
|
-
}
|
|
422
|
-
if (this.activeModals && this.activeModals.length <= 0) {
|
|
423
|
-
document.body.classList.remove('modal-open');
|
|
424
|
-
}
|
|
425
|
-
else {
|
|
426
|
-
// If there is still another (parent) modal dialog open, ensure it is focused upon to be able to close is with the ESC key:
|
|
427
|
-
const lastModalId = this.activeModals[this.activeModals.length - 1].id;
|
|
428
|
-
if (lastModalId) {
|
|
429
|
-
setTimeout(() => {
|
|
430
|
-
const el = document.getElementById(lastModalId + '-close-button');
|
|
431
|
-
if (el) {
|
|
432
|
-
el.focus();
|
|
433
|
-
}
|
|
434
|
-
}, 100);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
}
|
|
438
|
-
findModalIndex(modalId) {
|
|
439
|
-
let index = -1;
|
|
440
|
-
if (this.activeModals.length) {
|
|
441
|
-
for (let i = 0; i < this.activeModals.length; i++) {
|
|
442
|
-
if (this.activeModals[i].id === modalId) {
|
|
443
|
-
index = i;
|
|
444
|
-
break;
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
return index;
|
|
449
|
-
}
|
|
450
|
-
// ---------------
|
|
451
|
-
// private getters
|
|
452
|
-
// ---------------
|
|
453
|
-
getCssVarValue(inputProperty) {
|
|
454
|
-
return getComputedStyle(document.documentElement).getPropertyValue(inputProperty);
|
|
455
|
-
}
|
|
456
|
-
setCssVar(inputProperty, outputProperty) {
|
|
457
|
-
const cssVarValue = this.cssVars.filter(v => v.key === inputProperty)[0].value;
|
|
458
|
-
this._setCssVarValue(outputProperty, cssVarValue);
|
|
459
|
-
// console.log(inputProperty, outputProperty, cssVarValue);
|
|
460
|
-
}
|
|
461
|
-
_setCssVarValue(varName, varValue) {
|
|
462
|
-
document.documentElement.style.setProperty(varName, varValue);
|
|
463
|
-
}
|
|
464
|
-
getWrapperClasses(state, breakpoint) {
|
|
465
|
-
let classes = [];
|
|
466
|
-
classes.push(breakpoint);
|
|
467
|
-
if (state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
|
|
468
|
-
classes.push('sidebar-state-open');
|
|
469
|
-
}
|
|
470
|
-
if (!state.isSidebarOpen && (state.isSidebarActive || state.isSidebarInnerActive)) {
|
|
471
|
-
classes.push('sidebar-state-close');
|
|
472
|
-
}
|
|
473
|
-
if (state.isSidebarActive) {
|
|
474
|
-
classes.push('sidebar-active');
|
|
475
|
-
}
|
|
476
|
-
if (state.isSidebarInnerActive) {
|
|
477
|
-
classes.push('sidebar-inner-active');
|
|
478
|
-
}
|
|
479
|
-
if (state.isSidebarStateCloseWithIcons) {
|
|
480
|
-
classes.push('sidebar-state-close-with-icons');
|
|
481
|
-
}
|
|
482
|
-
// NEW APP-SHELL props
|
|
483
|
-
if (state.isSidebarHidden) {
|
|
484
|
-
classes.push('sidebar--hidden');
|
|
485
|
-
}
|
|
486
|
-
if (state.isSidebarOpen) {
|
|
487
|
-
classes.push('sidebar--open');
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
classes.push('sidebar--close');
|
|
491
|
-
}
|
|
492
|
-
if (state.isSidebarHover) {
|
|
493
|
-
classes.push('sidebar--hover');
|
|
494
|
-
}
|
|
495
|
-
if (state.deviceInfo && state.deviceInfo.isFF) {
|
|
496
|
-
classes.push('ff');
|
|
497
|
-
}
|
|
498
|
-
if (state.deviceInfo && state.deviceInfo.isIE) {
|
|
499
|
-
classes.push('ie');
|
|
500
|
-
}
|
|
501
|
-
if (state.deviceInfo && state.deviceInfo.isIE11) {
|
|
502
|
-
classes.push('ie11');
|
|
503
|
-
}
|
|
504
|
-
if (state.deviceInfo && state.deviceInfo.isChrome) {
|
|
505
|
-
classes.push('chrome');
|
|
506
|
-
}
|
|
507
|
-
return classes.join(' ');
|
|
508
|
-
}
|
|
509
|
-
getBreakpoint(windowWidth) {
|
|
510
|
-
let bkp = '';
|
|
511
|
-
switch (true) {
|
|
512
|
-
case (windowWidth >= 0 && windowWidth < 576):
|
|
513
|
-
bkp = 'xs';
|
|
514
|
-
break;
|
|
515
|
-
case (windowWidth >= 576 && windowWidth < 768):
|
|
516
|
-
bkp = 'sm';
|
|
517
|
-
break;
|
|
518
|
-
case (windowWidth >= 768 && windowWidth < 992):
|
|
519
|
-
bkp = 'md';
|
|
520
|
-
break;
|
|
521
|
-
case (windowWidth >= 992 && windowWidth < 1200):
|
|
522
|
-
bkp = 'lg';
|
|
523
|
-
break;
|
|
524
|
-
case (windowWidth >= 1200 && windowWidth < 1400):
|
|
525
|
-
bkp = 'xl';
|
|
526
|
-
break;
|
|
527
|
-
case (windowWidth >= 1400):
|
|
528
|
-
bkp = 'xxl';
|
|
529
|
-
break;
|
|
530
|
-
}
|
|
531
|
-
return bkp;
|
|
532
|
-
}
|
|
533
|
-
getBreakpoints(bkp) {
|
|
534
|
-
return {
|
|
535
|
-
isMobile: (bkp === 'xs' || bkp === 'sm'),
|
|
536
|
-
isTablet: bkp === 'md',
|
|
537
|
-
isLtDesktop: (bkp === 'xs' || bkp === 'sm' || bkp === 'md'),
|
|
538
|
-
isDesktop: bkp === 'lg',
|
|
539
|
-
isXL: bkp === 'xl',
|
|
540
|
-
isXXL: bkp === 'xxl',
|
|
541
|
-
};
|
|
542
|
-
}
|
|
543
|
-
getJson(url) {
|
|
544
|
-
return this.http
|
|
545
|
-
.get(url)
|
|
546
|
-
.toPromise()
|
|
547
|
-
.then(this.extractData)
|
|
548
|
-
.catch(this.handleError);
|
|
549
|
-
}
|
|
550
|
-
extractData(res) {
|
|
551
|
-
const body = res;
|
|
552
|
-
return body || {};
|
|
553
|
-
}
|
|
554
|
-
handleError(error) {
|
|
555
|
-
console.error('An error occurred', error);
|
|
556
|
-
return Promise.reject(error.message || error);
|
|
557
|
-
}
|
|
558
|
-
bindActiveLanguageToAppShellState() {
|
|
559
|
-
this.storeService.select(getActiveLang).subscribe((activeLang) => {
|
|
560
|
-
if (activeLang !== this.state.activeLanguage) {
|
|
561
|
-
this.setState(Object.assign(Object.assign({}, this.state), { activeLanguage: activeLang }), false);
|
|
562
|
-
}
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
/** @nocollapse */ UxAppShellService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: UxAppShellService, deps: [{ token: GLOBAL_CONFIG_TOKEN, optional: true }, { token: i1.HttpClient }, { token: PLATFORM_ID }, { token: i2.Router }, { token: i3.StoreService }, { token: i4.I18nService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
567
|
-
/** @nocollapse */ UxAppShellService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: UxAppShellService, providedIn: 'root' });
|
|
568
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0-next.8", ngImport: i0, type: UxAppShellService, decorators: [{
|
|
569
|
-
type: Injectable,
|
|
570
|
-
args: [{
|
|
571
|
-
providedIn: 'root',
|
|
572
|
-
}]
|
|
573
|
-
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
574
|
-
type: Optional
|
|
575
|
-
}, {
|
|
576
|
-
type: Inject,
|
|
577
|
-
args: [GLOBAL_CONFIG_TOKEN]
|
|
578
|
-
}] }, { type: i1.HttpClient }, { type: Object, decorators: [{
|
|
579
|
-
type: Inject,
|
|
580
|
-
args: [PLATFORM_ID]
|
|
581
|
-
}] }, { type: i2.Router }, { type: i3.StoreService }, { type: i4.I18nService, decorators: [{
|
|
582
|
-
type: Optional
|
|
583
|
-
}] }]; } });
|
|
584
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXgtYXBwLXNoZWxsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL3V4LWFwcC1zaGVsbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQWlDLGFBQWEsRUFBeUIsTUFBTSxXQUFXLENBQUM7QUFDL0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNyQyxPQUFPLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25FLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sR0FBRyxNQUFNLFlBQVksQ0FBQzs7Ozs7O0FBMkQ3QixNQUFNLFlBQVksR0FBWTtJQUMxQixPQUFPLEVBQUUsRUFBRTtJQUNYLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixZQUFZLEVBQUUsSUFBSTtJQUNsQixxQkFBcUIsRUFBRSxJQUFJO0lBQzNCLGFBQWEsRUFBRSxLQUFLO0lB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S0FBVTtRQUMxQixPQUFPLENBQUMsS0FBSyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFTyxpQ0FBaUM7UUFDckMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBVSxFQUFFLEVBQUU7WUFDN0QsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxRQUFRLGlDQUNOLElBQUksQ0FBQyxLQUFLLEtBQ2IsY0FBYyxFQUFFLFVBQVUsS0FDM0IsS0FBSyxDQUFDLENBQUM7YUFDYjtRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7d0lBL25CUSxpQkFBaUIsa0JBa0hGLG1CQUFtQix1REFFL0IsV0FBVzs0SUFwSGQsaUJBQWlCLGNBRmQsTUFBTTtrR0FFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkFtSFEsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7dURBRUUsTUFBTTswQkFBOUMsTUFBTTsyQkFBQyxXQUFXOzswQkFHbEIsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBkZWZlciwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVXhFdUxhbmd1YWdlcywgR2xvYmFsQ29uZmlnLCBVeExpbmssIFV4TW9kYWwsIGdldEFjdGl2ZUxhbmcsIFV4TWVzc2FnZSwgVXhMYW5ndWFnZSB9IGZyb20gJ0BldWkvYmFzZSc7XG5pbXBvcnQgeyBHTE9CQUxfQ09ORklHX1RPS0VOIH0gZnJvbSAnLi9jb25maWcvdG9rZW5zJztcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi9pMThuJztcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdG9yZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JlL3N0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IGlzRXF1YWwgZnJvbSAnbG9kYXNoL2lzRXF1YWwnO1xuaW1wb3J0IGdldCBmcm9tICdsb2Rhc2gvZ2V0JztcblxuZXhwb3J0IGludGVyZmFjZSBVSVN0YXRlIHtcbiAgICAvLyBhcHAgc3RhdGVcbiAgICBhcHBOYW1lPzogc3RyaW5nO1xuICAgIGFwcFNob3J0TmFtZT86IHN0cmluZztcbiAgICBhcHBTdWJUaXRsZT86IHN0cmluZztcblxuICAgIC8vIHVzZXIgc3RhdGVcbiAgICB1c2VySW5mb3M/OiBzdHJpbmc7XG4gICAgdXNlclN1YkluZm9zPzogc3RyaW5nO1xuICAgIGltcGVyc29uYXRlZFVzZXJJbmZvcz86IHN0cmluZztcblxuICAgIC8vIFNpZGViYXIgc3RhdGVcbiAgICBpc1NpZGViYXJPcGVuPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJIb3Zlcj86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFyQWN0aXZlPzogYm9vbGVhbjtcbiAgICBpc1NpZGViYXJJbm5lckFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNTaWRlYmFyU3RhdGVDbG9zZVdpdGhJY29ucz86IGJvb2xlYW47XG4gICAgaGFzU2lkZWJhcj86IGJvb2xlYW47XG4gICAgaGFzSGVhZGVyPzogYm9vbGVhbjtcbiAgICBoYXNIZWFkZXJMb2dvPzogYm9vbGVhbjtcbiAgICBoYXNIZWFkZXJFbnZpcm9ubWVudD86IGJvb2xlYW47XG4gICAgZW52aXJvbm1lbnRWYWx1ZT86IHN0cmluZztcbiAgICBpc1NpZGViYXJIaWRkZW4/OiBib29sZWFuO1xuICAgIGhhc1Rvb2xiYXI/OiBib29sZWFuO1xuXG4gICAgLy8gd2luZG93IHN0YXRlXG4gICAgd2luZG93V2lkdGg/OiBudW1iZXI7XG4gICAgd2luZG93SGVpZ2h0PzogbnVtYmVyO1xuICAgIG1haW5Db250ZW50SGVpZ2h0PzogbnVtYmVyO1xuICAgIHBhZ2VIZWFkZXJIZWlnaHQ/OiBudW1iZXI7XG4gICAgYnJlYWtwb2ludD86IHN0cmluZztcbiAgICB3cmFwcGVyQ2xhc3Nlcz86IHN0cmluZztcbiAgICBicmVha3BvaW50cz86IGFueTtcblxuICAgIC8vIG5hdmlnYXRpb24gc3RhdGVcbiAgICBtZW51TGlua3M/OiBVeExpbmtbXTtcbiAgICBzaWRlYmFyTGlua3M/OiBVeExpbmtbXTtcbiAgICBjb21iaW5lZExpbmtzPzogVXhMaW5rW107XG5cbiAgICAvLyBvdGhlciBzdGF0ZXNcbiAgICBpc0Jsb2NrRG9jdW1lbnRBY3RpdmU/OiBib29sZWFuO1xuXG4gICAgLy8gZGV2aWNlIGluZm9cbiAgICBkZXZpY2VJbmZvOiBhbnk7XG5cbiAgICAvLyBsYW5ndWFnZSBpbmZvc1xuICAgIGFjdGl2ZUxhbmd1YWdlOiBzdHJpbmc7XG4gICAgbGFuZ3VhZ2VzOiAoc3RyaW5nIHwgVXhMYW5ndWFnZSlbXTtcblxuICAgIC8vIGFwcCBtZXRhZGF0YVxuICAgIGFwcE1ldGFkYXRhOiBhbnk7XG5cbiAgICAvLyB2YXJpb3VzIGR5bmFtaWMgc3RhdGVcbiAgICBoYXNNb2RhbEFjdGl2ZT86IGJvb2xlYW47XG4gICAgaXNEaW1tZXJBY3RpdmUgPzogYm9vbGVhbjsgICAgIC8vIFVzYWdlOiBtYXAgdG8gZXVpIGJhc2UgZGlyZWN0aXZlIGlucHV0IGNvZXJjZSBldWlIaWdobGlnaHRlZFxufVxuXG5jb25zdCBpbml0aWFsU3RhdGU6IFVJU3RhdGUgPSB7XG4gICAgYXBwTmFtZTogJycsXG4gICAgYXBwU2hvcnROYW1lOiAnJyxcbiAgICBhcHBTdWJUaXRsZTogJycsXG4gICAgdXNlckluZm9zOiBudWxsLFxuICAgIHVzZXJTdWJJbmZvczogbnVsbCxcbiAgICBpbXBlcnNvbmF0ZWRVc2VySW5mb3M6IG51bGwsXG4gICAgaXNTaWRlYmFyT3BlbjogZmFsc2UsXG4gICAgaXNTaWRlYmFySG92ZXI6IGZhbHNlLFxuICAgIGlzU2lkZWJhckFjdGl2ZTogZmFsc2UsXG4gICAgaXNTaWRlYmFySW5uZXJBY3RpdmU6IGZhbHNlLFxuICAgIGlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnM6IGZhbHNlLFxuICAgIGhhc1NpZGViYXI6IGZhbHNlLFxuICAgIGhhc0hlYWRlcjogZmFsc2UsXG4gICAgaGFzSGVhZGVyTG9nbzogZmFsc2UsXG4gICAgaGFzSGVhZGVyRW52aXJvbm1lbnQ6IGZhbHNlLFxuICAgIGVudmlyb25tZW50VmFsdWU6ICcnLFxuICAgIGlzU2lkZWJhckhpZGRlbjogZmFsc2UsXG4gICAgaGFzVG9vbGJhcjogZmFsc2UsXG4gICAgd2luZG93V2lkdGg6IDAsXG4gICAgd2luZG93SGVpZ2h0OiAwLFxuICAgIG1haW5Db250ZW50SGVpZ2h0OiAwLFxuICAgIHBhZ2VIZWFkZXJIZWlnaHQ6IDAsXG4gICAgd3JhcHBlckNsYXNzZXM6ICcnLFxuICAgIGJyZWFrcG9pbnQ6ICcnLFxuICAgIGJyZWFrcG9pbnRzOiB7XG4gICAgICAgIGlzTW9iaWxlOiBmYWxzZSxcbiAgICAgICAgaXNUYWJsZXQ6IGZhbHNlLFxuICAgICAgICBpc0x0RGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzRGVza3RvcDogZmFsc2UsXG4gICAgICAgIGlzWEw6IGZhbHNlLFxuICAgICAgICBpc1hYTDogZmFsc2UsXG4gICAgfSxcbiAgICBtZW51TGlua3M6IFtdLFxuICAgIHNpZGViYXJMaW5rczogW10sXG4gICAgY29tYmluZWRMaW5rczogW10sXG4gICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBmYWxzZSxcbiAgICBkZXZpY2VJbmZvOiBudWxsLFxuICAgIGFjdGl2ZUxhbmd1YWdlOiAnZW4nLFxuICAgIGxhbmd1YWdlczogVXhFdUxhbmd1YWdlcy5nZXRMYW5ndWFnZXMoKSxcbiAgICBhcHBNZXRhZGF0YTogbnVsbCxcbiAgICBoYXNNb2RhbEFjdGl2ZTogZmFsc2UsXG4gICAgaXNEaW1tZXJBY3RpdmUgOiBmYWxzZSxcbn07XG5cbi8vIFRPRE86IHRoaXMgc2VydmljZSBuZWVkcyB0byBiZSB0cmFuc2ZlcnJlZCBpbiB0aGUgcmVzcGVjdGl2ZSBjb21wb25lbnRcbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIFV4QXBwU2hlbGxTZXJ2aWNlIHtcbiAgICBncm93bE1lc3NhZ2VzID0gW107XG4gICAgaXNHcm93bFN0aWNreTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIGdyb3dsTGlmZTogbnVtYmVyID0gMzAwMDtcbiAgICBncm93bFBvc2l0aW9uOiBzdHJpbmcgPSAnYm90dG9tLXJpZ2h0JztcbiAgICBncm93bENhbGxiYWNrOiBhbnkgPSBudWxsO1xuICAgIGFjdGl2ZU1vZGFsczogVXhNb2RhbFtdID0gW107XG4gICAgb3Blbk1vZGFsSWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuXG4gICAgbmF2aWdhdGlvblN0YXJ0Q3VzdG9tSGFuZGxlcjogKCkgPT4gdm9pZDtcbiAgICBuYXZpZ2F0aW9uRW5kQ3VzdG9tSGFuZGxlcjogKCkgPT4gdm9pZDtcblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBnZXQgc3RhdGUkKCk6IE9ic2VydmFibGU8VUlTdGF0ZT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGUkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBleHBvc2VkIG9ic2VydmFibGVzXG5cbiAgICBnZXQgYnJlYWtwb2ludCQoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyZWFrcG9pbnQkLmFzT2JzZXJ2YWJsZSgpO1xuICAgIH1cblxuICAgIGdldCBicmVha3BvaW50cyQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2JyZWFrcG9pbnRzJC5hc09ic2VydmFibGUoKTtcbiAgICB9XG5cbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gc3RhdGUgb3BlcmF0aW9uc1xuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS1cbiAgICBnZXQgc3RhdGUoKTogVUlTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSQuZ2V0VmFsdWUoKTtcbiAgICB9XG5cbiAgICBnZXQgaXNTaWRlYmFyT3BlbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNTaWRlYmFyT3BlbjtcbiAgICB9XG5cbiAgICAvLyBFZGl0IG1vZGVcbiAgICBnZXQgaXNEaW1tZXJBY3RpdmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pc0RpbW1lckFjdGl2ZSA7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIHB1YmxpYyBzZXR0ZXJzIGFuZCBmdW5jdGlvbnNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgc2V0IGlzU2lkZWJhck9wZW4oaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhck9wZW46IGlzT3BlbixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckhvdmVyKGlzSG92ZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNTaWRlYmFySG92ZXI6IGlzSG92ZXIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldCBpc1NpZGViYXJIb3ZlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaXNTaWRlYmFySG92ZXI7XG4gICAgfVxuXG4gICAgc2V0IGlzU2lkZWJhckFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc1NpZGViYXJBY3RpdmU6IGlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXQgaXNTaWRlYmFySW5uZXJBY3RpdmUoaXNPcGVuOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzU2lkZWJhcklubmVyQWN0aXZlOiBpc09wZW4sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBzaWRlYmFyTGlua3MobGlua3M6IFV4TGlua1tdKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNpZGViYXJMaW5rczogbGlua3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBtZW51TGlua3MobGlua3M6IFV4TGlua1tdKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIG1lbnVMaW5rczogbGlua3MsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldCBpc0Jsb2NrRG9jdW1lbnRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNCbG9ja0RvY3VtZW50QWN0aXZlOiBpc0FjdGl2ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRWRpdCBtb2RlXG4gICAgc2V0IGlzRGltbWVyQWN0aXZlIChpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICBpc0RpbW1lckFjdGl2ZSA6IGlzQWN0aXZlLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNzc1ZhcnMgPSBbXTtcbiAgICBwcml2YXRlIF9zdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxVSVN0YXRlPjtcbiAgICBwcml2YXRlIF9icmVha3BvaW50JDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz47XG4gICAgcHJpdmF0ZSBfYnJlYWtwb2ludHMkOiBCZWhhdmlvclN1YmplY3Q8YW55PjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEdMT0JBTF9DT05GSUdfVE9LRU4pIHByb3RlY3RlZCBjb25maWc6IEdsb2JhbENvbmZpZyxcbiAgICAgICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBASW5qZWN0KFBMQVRGT1JNX0lEKSBwcml2YXRlIHBsYXRmb3JtSWQ6IE9iamVjdCxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgcHJpdmF0ZSBzdG9yZVNlcnZpY2U6IFN0b3JlU2VydmljZSxcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBpMThuU2VydmljZTogSTE4blNlcnZpY2UsXG4gICAgKSB7XG4gICAgICAgIGxldCBzdGF0ZVdpdGhDb25maWcgPSBpbml0aWFsU3RhdGU7XG4gICAgICAgIGNvbnN0IGxhbmd1YWdlcyA9IGNvbmZpZz8uaTE4bj8uaTE4blNlcnZpY2U/Lmxhbmd1YWdlcyB8fCBpbml0aWFsU3RhdGUubGFuZ3VhZ2VzO1xuICAgICAgICBjb25zdCBkZWZhdWx0TGFuZ3VhZ2UgPSBjb25maWc/LmkxOG4/LmkxOG5TZXJ2aWNlPy5kZWZhdWx0TGFuZ3VhZ2UgfHwgaW5pdGlhbFN0YXRlLmFjdGl2ZUxhbmd1YWdlO1xuICAgICAgICBzdGF0ZVdpdGhDb25maWcgPSB7XG4gICAgICAgICAgICAuLi5zdGF0ZVdpdGhDb25maWcsIC4uLntcbiAgICAgICAgICAgICAgICBsYW5ndWFnZXM6IGxhbmd1YWdlcyxcbiAgICAgICAgICAgICAgICBhY3RpdmVMYW5ndWFnZTogZGVmYXVsdExhbmd1YWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5fc3RhdGUkID0gbmV3IEJlaGF2aW9yU3ViamVjdChzdGF0ZVdpdGhDb25maWcpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpO1xuICAgICAgICB0aGlzLl9icmVha3BvaW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTtcbiAgICAgICAgdGhpcy5iaW5kQWN0aXZlTGFuZ3VhZ2VUb0FwcFNoZWxsU3RhdGUoKTtcblxuICAgICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSkge1xuICAgICAgICAgICAgcm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbygwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0U3RhdGUobmV4dFN0YXRlOiBVSVN0YXRlLCB1cGRhdGVJMTggPSB0cnVlKSB7XG4gICAgICAgIGxldCBicmVha3BvaW50LCBicmVha3BvaW50cywgd3JhcHBlckNsYXNzZXM7XG4gICAgICAgIGxldCBjb21iaW5lZExpbmtzO1xuXG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICAvLyBjaGVjayBpZiB3aW5kb3cgd2lkdGggaGFzIGJlZW4gdXBkYXRlZCBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLndpbmRvd1dpZHRoICE9PSBuZXh0U3RhdGUud2luZG93V2lkdGgpIHtcbiAgICAgICAgICAgIGJyZWFrcG9pbnQgPSB0aGlzLmdldEJyZWFrcG9pbnQobmV4dFN0YXRlLndpbmRvd1dpZHRoKTtcbiAgICAgICAgICAgIGJyZWFrcG9pbnRzID0gdGhpcy5nZXRCcmVha3BvaW50cyhicmVha3BvaW50KTtcblxuICAgICAgICAgICAgdGhpcy5fYnJlYWtwb2ludCQubmV4dChicmVha3BvaW50KTtcbiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRzJC5uZXh0KGJyZWFrcG9pbnRzKTtcblxuICAgICAgICAgICAgLy8gaWYgbm90IHByb3BhZ2F0ZSB0aGUgb2xkIG9uZXMgd2l0aG91dCBkb2luZyBhbnkgY2FsY3VsYXRpb25zXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBicmVha3BvaW50ID0gc3RhdGUuYnJlYWtwb2ludDtcbiAgICAgICAgICAgIGJyZWFrcG9pbnRzID0gc3RhdGUuYnJlYWtwb2ludHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaW5hbGx5IGdldCB0aGUgd3JhcHBlciBjbGFzc2VzIHdoZW4gYm90aCB0aGUgc3RhdGUgYW5kIGJyZWFrcG9pbnQgYXJlIGtub3duXG4gICAgICAgIHdyYXBwZXJDbGFzc2VzID0gdGhpcy5nZXRXcmFwcGVyQ2xhc3NlcyhuZXh0U3RhdGUsIGJyZWFrcG9pbnQpO1xuXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBtZW51TGlua3Mgb3Igc2lkZWJhckxpbmtzIGhhdmUgY2hhbmdlZCBmcm9tIHByZXZpb3VzIHN0YXRlXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLm1lbnVMaW5rcyAhPT0gbmV4dFN0YXRlLm1lbnVMaW5rcyB8fCB0aGlzLnN0YXRlLnNpZGViYXJMaW5rcyAhPT0gbmV4dFN0YXRlLnNpZGViYXJMaW5rcykge1xuICAgICAgICAgICAgY29tYmluZWRMaW5rcyA9IFsuLi5uZXh0U3RhdGUubWVudUxpbmtzLCAuLi5uZXh0U3RhdGUuc2lkZWJhckxpbmtzXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MgPSB0aGlzLnN0YXRlLmNvbWJpbmVkTGlua3M7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdGF0ZUJlZm9yZVVwZGF0ZSA9IHsgLi4udGhpcy5zdGF0ZSB9IDtcblxuICAgICAgICAvLyB3ZSBwdXQgaXQgYWxsIHRvZ2V0aGVyIHdpdGggdGhlIGNhbGN1bGF0ZWQgcHJvcGVydGllc1xuICAgICAgICB0aGlzLl9zdGF0ZSQubmV4dCh7XG4gICAgICAgICAgICAuLi5uZXh0U3RhdGUsXG4gICAgICAgICAgICB3cmFwcGVyQ2xhc3NlcyxcbiAgICAgICAgICAgIGJyZWFrcG9pbnQsXG4gICAgICAgICAgICBicmVha3BvaW50cyxcbiAgICAgICAgICAgIGNvbWJpbmVkTGlua3MsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgU3RvcmUgTGFuZ3VhZ2VcbiAgICAgICAgaWYgKHVwZGF0ZUkxOCAmJiBuZXh0U3RhdGUuYWN0aXZlTGFuZ3VhZ2UgIT09IHN0YXRlQmVmb3JlVXBkYXRlLmFjdGl2ZUxhbmd1YWdlKSB7XG4gICAgICAgICAgICB0aGlzLmkxOG5TZXJ2aWNlLnVwZGF0ZVN0YXRlKHsgYWN0aXZlTGFuZzogbmV4dFN0YXRlLmFjdGl2ZUxhbmd1YWdlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBzbGljZSBmcm9tIHRoZSBzdGF0ZSB3aGV0aGVyIHRoYXQgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBrZXkgY2FuIGJlICdrZXknIG9yICdrZXkuc3ViLnN1YidcbiAgICAgKi9cbiAgICBnZXRTdGF0ZShrZXk/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICByZXR1cm4gZGVmZXIoKCkgPT4ge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYga2V5IGV4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIGtleSA/IHRoaXMuc3RhdGUkLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKChzdGF0ZSkgPT4gZ2V0KHN0YXRlLCBrZXkpKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoKHN0YXRlKSA9PiBzdGF0ZSksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHgsIHkpID0+IGlzRXF1YWwoeCwgeSkpXG4gICAgICAgICAgICApIDogdGhpcy5zdGF0ZSQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaWRlYmFyVG9nZ2xlKCkge1xuICAgICAgICB0aGlzLmlzU2lkZWJhck9wZW4gPSAhdGhpcy5zdGF0ZS5pc1NpZGViYXJPcGVuO1xuICAgIH1cblxuICAgIC8vIEVkaXQgbW9kZVxuICAgIHB1YmxpYyBkaW1tZXJBY3RpdmVUb2dnbGUoKSB7XG4gICAgICAgIGNvbnN0IGlzQWN0aXZlID0gdGhpcy5pc0RpbW1lckFjdGl2ZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaXNEaW1tZXJBY3RpdmUgOiAhaXNBY3RpdmUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKCFpc0FjdGl2ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldERpbW1lckFjdGl2ZVN0YXRlKGFjdGl2ZVN0YXRlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGlzRGltbWVyQWN0aXZlIDogYWN0aXZlU3RhdGUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmFjdGl2YXRlRWRpdE1vZGVDc3NWYXJzKGFjdGl2ZVN0YXRlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVFZGl0TW9kZUNzc1ZhcnMoaXNBY3RpdmU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktZG9jcGFnZS1uYXZpZ2F0aW9uLXotaW5kZXgnLCAnaW5oZXJpdCcpOyAgICAvLyBSZXNldCBkb2MtcGFnZS1uYXZpZ2F0aW9uLWNvbHVtbiB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1zaWRlYmFyJywgJ2luaGVyaXQnKTsgICAgICAgICAgICAgICAvLyBSZXNldCBldWktYXBwLXNpZGViYXIgei1pbmRleFxuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLXotaW5kZXgtcm9vdCcsICdpbmhlcml0Jyk7ICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgZXVpLWFwcC1tYWluLWNvbnRlbnQgei1pbmRleFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fc2V0Q3NzVmFyVmFsdWUoJy0tZXVpLWRvY3BhZ2UtbmF2aWdhdGlvbi16LWluZGV4JywgJzInKTsgICAgICAgICAgLy8gUmVzdG9yZSBkb2MtcGFnZS1uYXZpZ2F0aW9uLWNvbHVtbiB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1zaWRlYmFyJywgJzEwNDQnKTsgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGV1aS1hcHAtc2lkZWJhciB6LWluZGV4XG4gICAgICAgICAgICB0aGlzLl9zZXRDc3NWYXJWYWx1ZSgnLS1ldWktei1pbmRleC1yb290JywgJzEnKTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGV1aS1hcHAtbWFpbi1jb250ZW50IHotaW5kZXhcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHVibGljIG1ldGhvZHNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLVxuICAgIHB1YmxpYyBmZXRjaEFwcE1ldGFkYXRhKG1ldGFkYXRhRmlsZVBhdGggPSAnYXNzZXRzL2FwcC1tZXRhZGF0YS5qc29uJykge1xuICAgICAgICB0aGlzLmdldEpzb24obWV0YWRhdGFGaWxlUGF0aClcbiAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuc3RhdGUsXG4gICAgICAgICAgICAgICAgICAgIGFwcE1ldGFkYXRhOiBkYXRhLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlU2lkZWJhcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzU2lkZWJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmlzU2lkZWJhckhpZGRlbikge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFySGVhZGVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckhlYWRlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyRm9vdGVyKCkge1xuICAgICAgICB0aGlzLmFjdGl2YXRlU2lkZWJhckZvb3RlckNzc1ZhcnMoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVIZWFkZXIoKSB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIGhhc0hlYWRlcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVIZWFkZXJDc3NWYXJzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlVG9vbGJhcigpIHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAuLi50aGlzLnN0YXRlLFxuICAgICAgICAgICAgaGFzVG9vbGJhcjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmZXRjaENzc1ZhcnMoKSB7XG4gICAgICAgIGNvbnN0IGNzc1Zhck5hbWVzID0gW1xuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWRlZmF1bHQnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQtc2hyaW5rJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0LWFjdGl2ZScsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1kZWZhdWx0JyxcbiAgICAgICAgICAgICctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItaGVhZGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICAgICAgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtZGVmYXVsdCcsXG4gICAgICAgICAgICAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodC1hY3RpdmUnLFxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY3NzVmFycyA9IGNzc1Zhck5hbWVzLm1hcCgodikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsga2V5OiB2LCB2YWx1ZTogdGhpcy5nZXRDc3NWYXJWYWx1ZSh2KSB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdENzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1kZWZhdWx0JywgJy0tZXVpLWFwcC1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtdG9vbGJhci1oZWlnaHQnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoLWNsb3NlLWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtZGVmYXVsdCcsICctLWV1aS1hcHAtc2lkZWJhci1oZWFkZXItaGVpZ2h0Jyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci1mb290ZXItaGVpZ2h0LWRlZmF1bHQnLCAnLS1ldWktYXBwLXNpZGViYXItZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZUhlYWRlckNzc1ZhcnMoKSB7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVUb29sYmFyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC10b29sYmFyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLXRvb2xiYXItaGVpZ2h0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFjdGl2YXRlRm9vdGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1mb290ZXItaGVpZ2h0LWFjdGl2ZScsICctLWV1aS1hcHAtZm9vdGVyLWhlaWdodCcpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRIZWFkZXJTaHJpbmtDc3NWYXIoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChhY3RpdmUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1zaHJpbmsnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtaGVhZGVyLWhlaWdodC1hY3RpdmUnLCAnLS1ldWktYXBwLWhlYWRlci1oZWlnaHQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhY3RpdmF0ZVNpZGViYXJDc3NWYXJzKCkge1xuICAgICAgICB0aGlzLnNldENzc1ZhcignLS1ldWktYXBwLXNpZGViYXItd2lkdGgtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLXdpZHRoJyk7XG4gICAgICAgIHRoaXMuc2V0Q3NzVmFyKCctLWV1aS1hcHAtc2lkZWJhci13aWR0aC1jbG9zZS1hY3RpdmUnLCAnLS1ldWktYXBwLXNpZGViYXItd2lkdGgtY2xvc2UnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFySGVhZGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLWhlYWRlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWN0aXZhdGVTaWRlYmFyRm9vdGVyQ3NzVmFycygpIHtcbiAgICAgICAgdGhpcy5zZXRDc3NWYXIoJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQtYWN0aXZlJywgJy0tZXVpLWFwcC1zaWRlYmFyLWZvb3Rlci1oZWlnaHQnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkaXNwbGF5cyBhIGdyb3dsIFV4TWVzc2FnZSBpdGVtLCBpc1N0aWNreVxuICAgICAqL1xuICAgIGdyb3dsKG1zZzogVXhNZXNzYWdlLCBpc1N0aWNreT86IGJvb2xlYW4sIGlzTXVsdGlwbGU/OiBib29sZWFuLCBsaWZlPzogbnVtYmVyLCBwb3NpdGlvbj86IHN0cmluZywgY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGlmIChtc2cuc2V2ZXJpdHkgIT09ICdpbmZvJyAmJiBtc2cuc2V2ZXJpdHkgIT09ICd3YXJuaW5nJyAmJiBtc2cuc2V2ZXJpdHkgIT09ICdzdWNjZXNzJyAmJiBtc2cuc2V2ZXJpdHkgIT09ICdkYW5nZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1V4QXBwU2hlbGxTZXJ2aWNlLmdyb3dsKCkgRVJST1IgOiBtZXNzYWdlIHNldmVyaXR5IG11c3QgYmUgZWl0aGVyIDogc3VjY2Vzcywgd2FybmluZywgaW5mbywgZGFuZ2VyJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNNdWx0aXBsZSA9PT0gdW5kZWZpbmVkIHx8ICFpc011bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm93bE1lc3NhZ2VzID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdyb3dsTWVzc2FnZXMgPSB0aGlzLmdyb3dsTWVzc2FnZXMuY29uY2F0KG1zZyk7XG4gICAgICAgICAgICBtc2cubGlmZSA9IGxpZmU7XG4gICAgICAgICAgICBtc2cuc3RpY2t5ID0gaXNTdGlja3k7XG5cbiAgICAgICAgICAgIGlmIChsaWZlID09PSB1bmRlZmluZWQgfHwgaXNOYU4obGlmZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAobXNnLnNldmVyaXR5ID09PSAnZGFuZ2VyJykge1xuICAgICAgICAgICAgICAgICAgICBpc1N0aWNreSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ncm93bExpZmUgPSAzMDAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm93bExpZmUgPSBsaWZlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTdGlja3kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzR3Jvd2xTdGlja3kgPSBpc1N0aWNreTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0dyb3dsU3RpY2t5ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3Jvd2xQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB0aGlzLmdyb3dsQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ncm93bENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjbGVhckdyb3dsKCkge1xuICAgICAgICB0aGlzLmdyb3dsTWVzc2FnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBncm93bFN1Y2Nlc3MobXNnOiBzdHJpbmcsIHBvc2l0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZ3Jvd2woeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnU1VDQ0VTUycsIGRldGFpbDogbXNnIH0sIGZhbHNlLCBmYWxzZSwgdW5kZWZpbmVkLCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgZ3Jvd2xFcnJvcihtc2c6IHN0cmluZywgcG9zaXRpb24/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5ncm93bCh7IHNldmVyaXR5OiAnZGFuZ2VyJywgc3VtbWFyeTogJ0VSUk9SJywgZGV0YWlsOiBtc2cgfSwgZmFsc2UsIGZhbHNlLCB1bmRlZmluZWQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICAvLyBkYXRlIGhlbHBlcnNcblxuICAgIGdyb3dsV2FybmluZyhtc2c6IHN0cmluZywgcG9zaXRpb24/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5ncm93bCh7IHNldmVyaXR5OiAnd2FybmluZycsIHN1bW1hcnk6ICdXQVJOSU5HJywgZGV0YWlsOiBtc2cgfSwgZmFsc2UsIGZhbHNlLCB1bmRlZmluZWQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBncm93bEluZm8obXNnOiBzdHJpbmcsIHBvc2l0aW9uPzogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZ3Jvd2woeyBzZXZlcml0eTogJ2luZm8nLCBzdW1tYXJ5OiAnSU5GTycsIGRldGFpbDogbXNnIH0sIGZhbHNlLCBmYWxzZSwgdW5kZWZpbmVkLCBwb3NpdGlvbik7XG4gICAgfVxuXG4gICAgb3Blbk1vZGFsKG1vZGFsSWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdtb2RhbC1vcGVuJyk7XG4gICAgICAgIGlmICghbW9kYWxJZCkge1xuICAgICAgICAgICAgbW9kYWxJZCA9ICdzaW5nbGVfbW9kYWwnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hY3RpdmVNb2RhbHMucHVzaCh7XG4gICAgICAgICAgICBpZDogbW9kYWxJZCxcbiAgICAgICAgICAgIGlzT3BlbjogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1vZGFsSWQgKyAnLWNsb3NlLWJ1dHRvbicpO1xuICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgZWwuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgMTAwKTtcbiAgICB9XG5cbiAgICBvcGVuTWVzc2FnZUJveChtZXNzYWdlQm94SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlQm94SWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VCb3hJZCA9ICdtZXNzYWdlYm94X21vZGFsJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9wZW5Nb2RhbChtZXNzYWdlQm94SWQpO1xuICAgIH1cblxuICAgIGNsb3NlTWVzc2FnZUJveChtZXNzYWdlQm94SWQ/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCFtZXNzYWdlQm94SWQpIHtcbiAgICAgICAgICAgIG1lc3NhZ2VCb3hJZCA9ICdtZXNzYWdlYm94X21vZGFsJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsb3NlTW9kYWwobWVzc2FnZUJveElkKTtcbiAgICB9XG5cbiAgICBpc01vZGFsT3Blbihtb2RhbElkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmICghbW9kYWxJZCkge1xuICAgICAgICAgICAgbW9kYWxJZCA9ICdzaW5nbGVfbW9kYWwnO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBtb2RhbEluZGV4OiBudW1iZXIgPSB0aGlzLmZpbmRNb2RhbEluZGV4KG1vZGFsSWQpO1xuICAgICAgICAgICAgaWYgKG1vZGFsSW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlTW9kYWxzW21vZGFsSW5kZXhdLmlzT3BlbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUG9zaXRpb25zIGhlbHBlcnNcblxuICAgIGNsb3NlTW9kYWwobW9kYWxJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoIW1vZGFsSWQpIHtcbiAgICAgICAgICAgIG1vZGFsSWQgPSAnc2luZ2xlX21vZGFsJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYWtlIHN1cmUgd2UgZmluZCB0aGUgbW9kYWwgYmVmb3JlIHNwbGljaW5nIHRoZSBhY3RpdmVNb2RhbHMgYXJyYXlcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5maW5kTW9kYWxJbmRleChtb2RhbElkKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aXZlTW9kYWxzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHMgJiYgdGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnbW9kYWwtb3BlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgc3RpbGwgYW5vdGhlciAocGFyZW50KSBtb2RhbCBkaWFsb2cgb3BlbiwgZW5zdXJlIGl0IGlzIGZvY3VzZWQgdXBvbiB0byBiZSBhYmxlIHRvIGNsb3NlIGlzIHdpdGggdGhlIEVTQyBrZXk6XG4gICAgICAgICAgICBjb25zdCBsYXN0TW9kYWxJZCA9IHRoaXMuYWN0aXZlTW9kYWxzIFt0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGggLSAxXS5pZDtcbiAgICAgICAgICAgIGlmIChsYXN0TW9kYWxJZCkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhc3RNb2RhbElkICsgJy1jbG9zZS1idXR0b24nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZpbmRNb2RhbEluZGV4KG1vZGFsSWQ6IHN0cmluZykge1xuICAgICAgICBsZXQgaW5kZXg6IG51bWJlciA9IC0xO1xuXG4gICAgICAgIGlmICh0aGlzLmFjdGl2ZU1vZGFscy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hY3RpdmVNb2RhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVNb2RhbHNbaV0uaWQgPT09IG1vZGFsSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gcHJpdmF0ZSBnZXR0ZXJzXG4gICAgLy8gLS0tLS0tLS0tLS0tLS0tXG4gICAgcHJpdmF0ZSBnZXRDc3NWYXJWYWx1ZShpbnB1dFByb3BlcnR5KSB7XG4gICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShpbnB1dFByb3BlcnR5KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldENzc1ZhcihpbnB1dFByb3BlcnR5LCBvdXRwdXRQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBjc3NWYXJWYWx1ZSA9IHRoaXMuY3NzVmFycy5maWx0ZXIodiA9PiB2LmtleSA9PT0gaW5wdXRQcm9wZXJ0eSlbMF0udmFsdWU7XG4gICAgICAgIHRoaXMuX3NldENzc1ZhclZhbHVlKG91dHB1dFByb3BlcnR5LCBjc3NWYXJWYWx1ZSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGlucHV0UHJvcGVydHksIG91dHB1dFByb3BlcnR5LCBjc3NWYXJWYWx1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfc2V0Q3NzVmFyVmFsdWUodmFyTmFtZSwgdmFyVmFsdWUpIHtcbiAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHZhck5hbWUsIHZhclZhbHVlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFdyYXBwZXJDbGFzc2VzKHN0YXRlOiBVSVN0YXRlLCBicmVha3BvaW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgY2xhc3Nlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjbGFzc2VzLnB1c2goYnJlYWtwb2ludCk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4gJiYgKHN0YXRlLmlzU2lkZWJhckFjdGl2ZSB8fCBzdGF0ZS5pc1NpZGViYXJJbm5lckFjdGl2ZSkpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci1zdGF0ZS1vcGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0ZS5pc1NpZGViYXJPcGVuICYmIChzdGF0ZS5pc1NpZGViYXJBY3RpdmUgfHwgc3RhdGUuaXNTaWRlYmFySW5uZXJBY3RpdmUpKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItc3RhdGUtY2xvc2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuaXNTaWRlYmFyQWN0aXZlKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhcklubmVyQWN0aXZlKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NpZGViYXItaW5uZXItYWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhclN0YXRlQ2xvc2VXaXRoSWNvbnMpIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci1zdGF0ZS1jbG9zZS13aXRoLWljb25zJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBORVcgQVBQLVNIRUxMIHByb3BzXG4gICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIaWRkZW4pIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0taGlkZGVuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlLmlzU2lkZWJhck9wZW4pIHtcbiAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnc2lkZWJhci0tb3BlbicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1jbG9zZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5pc1NpZGViYXJIb3Zlcikge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzaWRlYmFyLS1ob3ZlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNGRikge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdmZicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNJRSkge1xuICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5kZXZpY2VJbmZvICYmIHN0YXRlLmRldmljZUluZm8uaXNJRTExKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2llMTEnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUuZGV2aWNlSW5mbyAmJiBzdGF0ZS5kZXZpY2VJbmZvLmlzQ2hyb21lKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2Nocm9tZScpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjbGFzc2VzLmpvaW4oJyAnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEJyZWFrcG9pbnQod2luZG93V2lkdGg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICAgIGxldCBia3A6IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIHN3aXRjaCAodHJ1ZSkge1xuICAgICAgICBjYXNlICh3aW5kb3dXaWR0aCA+PSAwICYmIHdpbmRvd1dpZHRoIDwgNTc2KTpcbiAgICAgICAgICAgIGJrcCA9ICd4cyc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gNTc2ICYmIHdpbmRvd1dpZHRoIDwgNzY4KTpcbiAgICAgICAgICAgIGJrcCA9ICdzbSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gNzY4ICYmIHdpbmRvd1dpZHRoIDwgOTkyKTpcbiAgICAgICAgICAgIGJrcCA9ICdtZCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gOTkyICYmIHdpbmRvd1dpZHRoIDwgMTIwMCk6XG4gICAgICAgICAgICBia3AgPSAnbGcnO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgKHdpbmRvd1dpZHRoID49IDEyMDAgJiYgd2luZG93V2lkdGggPCAxNDAwKTpcbiAgICAgICAgICAgIGJrcCA9ICd4bCc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAod2luZG93V2lkdGggPj0gMTQwMCk6XG4gICAgICAgICAgICBia3AgPSAneHhsJztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBia3A7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRCcmVha3BvaW50cyhia3A6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc01vYmlsZTogKGJrcCA9PT0gJ3hzJyB8fCBia3AgPT09ICdzbScpLFxuICAgICAgICAgICAgaXNUYWJsZXQ6IGJrcCA9PT0gJ21kJyxcbiAgICAgICAgICAgIGlzTHREZXNrdG9wOiAoYmtwID09PSAneHMnIHx8IGJrcCA9PT0gJ3NtJyB8fCBia3AgPT09ICdtZCcpLFxuICAgICAgICAgICAgaXNEZXNrdG9wOiBia3AgPT09ICdsZycsXG4gICAgICAgICAgICBpc1hMOiBia3AgPT09ICd4bCcsXG4gICAgICAgICAgICBpc1hYTDogYmtwID09PSAneHhsJyxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEpzb24odXJsOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAgICAgICAuZ2V0KHVybClcbiAgICAgICAgICAgIC50b1Byb21pc2UoKVxuICAgICAgICAgICAgLnRoZW4odGhpcy5leHRyYWN0RGF0YSlcbiAgICAgICAgICAgIC5jYXRjaCh0aGlzLmhhbmRsZUVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGV4dHJhY3REYXRhKHJlczogUmVzcG9uc2UpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IHJlcztcbiAgICAgICAgcmV0dXJuIGJvZHkgfHwge307XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVFcnJvcihlcnJvcjogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQW4gZXJyb3Igb2NjdXJyZWQnLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvci5tZXNzYWdlIHx8IGVycm9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRBY3RpdmVMYW5ndWFnZVRvQXBwU2hlbGxTdGF0ZSgpIHtcbiAgICAgICAgdGhpcy5zdG9yZVNlcnZpY2Uuc2VsZWN0KGdldEFjdGl2ZUxhbmcpLnN1YnNjcmliZSgoYWN0aXZlTGFuZykgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUxhbmcgIT09IHRoaXMuc3RhdGUuYWN0aXZlTGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgLi4udGhpcy5zdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlTGFuZ3VhZ2U6IGFjdGl2ZUxhbmcsXG4gICAgICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=
|