@softheon/armature 15.20.0 → 15.21.1

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/README.md CHANGED
@@ -1847,3 +1847,26 @@ The `savePrintComponent` function takes the type of component that will be saved
1847
1847
  ### Limitations
1848
1848
 
1849
1849
  There is currently no way to pass in custom inputs to the component being save/printed. This can be prevented by having a component host the component in question with the correct default inputs and providing the host component to the function rather the desired component.
1850
+
1851
+ ## Subdomain Routing
1852
+
1853
+ Armature support subdomain routing including loading configurations specific to the subdomain, with some additional logic to help with ensuring users can't use the site when they shouldn't be able to.
1854
+
1855
+ In order to use subdomain routing in your appsettings.json at the root level add a `subdomain` section. This section has two properties, `subdomains` and `requireConfiguredSubdomain`. The `subdomains` section is a white list of subdomains, this should be configured to only include the subdomain, for example if the url is `https://subdomain.domain.host.com/route`, there would be an entry for `subdomain` in the `subdomains` array.
1856
+
1857
+ The `requireConfiguredSubdomain` ,when true, means when the application start ups with a detected subdomain, it must also find configurations in its `assets/configurations` directory for that subdomain in the format of `subdomain.appsettings.json`. If no configurations are found, the application will not start up. When this is set to false, the application can load with out subdomain specific configurations but still requires an entry in the `subdomains` sections.
1858
+
1859
+ Leave the entire subdomain configuration section blank to ignore this feature.
1860
+
1861
+ There is a case that can happen with the following example `https://subdomain.domain.host.com/route`. For this case there must be entry in the `subdomains` sections for the url to load, but also and entry for `domain` in the subdomains section for `https://domain.host.com/route` to be an available url.
1862
+
1863
+ Below is a sample subdomain configuration partial
1864
+
1865
+ ```json
1866
+ {
1867
+ "subdomain": {
1868
+ "subdomains": ["subdomain", "domain"],
1869
+ "requireConfiguredSubdomain": true
1870
+ }
1871
+ }
1872
+ ```
@@ -0,0 +1,13 @@
1
+ import { preSignInRouteStorageKey } from '../models/constants';
2
+ /**
3
+ * Routes to the pre login in route
4
+ * @param router The router
5
+ */
6
+ export const routeToPreLoginRoute = (router) => {
7
+ const preservedRoute = window.sessionStorage.getItem(preSignInRouteStorageKey);
8
+ if (preservedRoute) {
9
+ router.navigateByUrl(preservedRoute);
10
+ window.sessionStorage.removeItem(preSignInRouteStorageKey);
11
+ }
12
+ };
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdG8tcHJlLWxvZ2luLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJtYXR1cmUvc3JjL2xpYi9jb3JlL2Z1bmN0aW9ucy9yb3V0ZS10by1wcmUtbG9naW4tcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFL0Q7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUNuRCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQy9FLElBQUksY0FBYyxFQUFFO1FBQ2hCLE1BQU0sQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsQ0FBQztLQUM5RDtBQUNMLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IHByZVNpZ25JblJvdXRlU3RvcmFnZUtleSB9IGZyb20gJy4uL21vZGVscy9jb25zdGFudHMnO1xyXG5cclxuLyoqXHJcbiAqIFJvdXRlcyB0byB0aGUgcHJlIGxvZ2luIGluIHJvdXRlXHJcbiAqIEBwYXJhbSByb3V0ZXIgVGhlIHJvdXRlclxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IHJvdXRlVG9QcmVMb2dpblJvdXRlID0gKHJvdXRlcjogUm91dGVyKSA9PiB7XHJcbiAgICBjb25zdCBwcmVzZXJ2ZWRSb3V0ZSA9IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHByZVNpZ25JblJvdXRlU3RvcmFnZUtleSk7XHJcbiAgICBpZiAocHJlc2VydmVkUm91dGUpIHtcclxuICAgICAgICByb3V0ZXIubmF2aWdhdGVCeVVybChwcmVzZXJ2ZWRSb3V0ZSk7XHJcbiAgICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0ocHJlU2lnbkluUm91dGVTdG9yYWdlS2V5KTtcclxuICAgIH1cclxufSJdfQ==
@@ -1,9 +1,9 @@
1
- import { Injectable, Optional } from '@angular/core';
1
+ import { Injectable, Optional, Inject } from '@angular/core';
2
2
  import { AuthConfig } from 'angular-oauth2-oidc';
3
3
  import { JwksValidationHandler } from 'angular-oauth2-oidc-jwks';
4
4
  import * as _ from 'lodash';
5
- import { BehaviorSubject, throwError } from 'rxjs';
6
- import { languageStorageKey } from '../models/constants';
5
+ import { BehaviorSubject, lastValueFrom, throwError } from 'rxjs';
6
+ import { languageStorageKey, preSignInRouteStorageKey, WINDOW } from '../models/constants';
7
7
  import * as i0 from "@angular/core";
8
8
  import * as i1 from "@angular/common/http";
9
9
  import * as i2 from "@ngx-translate/core";
@@ -32,7 +32,7 @@ export class Initializer {
32
32
  * @param location The location
33
33
  * @param customAuthConfigService The service that will configure the auth config
34
34
  */
35
- constructor(http, translateService, themeService, configService, oAuthService, router, location, customAuthConfigService) {
35
+ constructor(http, translateService, themeService, configService, oAuthService, router, location, customAuthConfigService, _window) {
36
36
  this.http = http;
37
37
  this.translateService = translateService;
38
38
  this.themeService = themeService;
@@ -41,9 +41,17 @@ export class Initializer {
41
41
  this.router = router;
42
42
  this.location = location;
43
43
  this.customAuthConfigService = customAuthConfigService;
44
+ this._window = _window;
44
45
  /** The configuration behavior subject */
45
46
  this.isInitializedBs = new BehaviorSubject(false);
47
+ /** The example the subdomain substring */
48
+ this.exampleSubdomain = 'example';
49
+ /** The www substring for subdomain route finding */
50
+ this.wwwSubstring = 'www';
51
+ /** The lvh substring for subdomain route finding */
52
+ this.lvhSubstring = 'lvh';
46
53
  this.isInitialized$ = this.isInitializedBs.asObservable();
54
+ this.window = _window || window;
47
55
  }
48
56
  /**
49
57
  * Loads all data that is needed upon initial loading of the website
@@ -52,7 +60,7 @@ export class Initializer {
52
60
  // reads the language from local storage set in the parent app
53
61
  // language loading
54
62
  // Set languages for translation service
55
- const lang = window.localStorage.getItem(languageStorageKey) || window.sessionStorage.getItem(languageStorageKey) || 'en';
63
+ const lang = this.window.localStorage.getItem(languageStorageKey) || this.window.sessionStorage.getItem(languageStorageKey) || 'en';
56
64
  this.translateService.setDefaultLang(lang);
57
65
  this.translateService.use(lang);
58
66
  // Adapted from https://stackoverflow.com/a/41636880
@@ -75,11 +83,44 @@ export class Initializer {
75
83
  this.http.get('./assets/configurations/theme.json').toPromise()
76
84
  ]);
77
85
  this.configService.config = _.mergeWith(baseConfig, overrideConfig, this.mergeCustomizer);
78
- const configSnapShot = this.configService.config;
79
- configSnapShot.theme = theme;
80
- this.configService.config = configSnapShot;
81
- this.translateService.setTranslation(this.translateService.currentLang, _.mergeWith(baseLang, overrideLang, this.mergeCustomizer));
82
- this.themeService.initPalette(theme);
86
+ const mergedLanguage = _.mergeWith(baseLang, overrideLang, this.mergeCustomizer);
87
+ this.translateService.setTranslation(this.translateService.currentLang, mergedLanguage);
88
+ const configurePartial = () => {
89
+ const configSnapShot = this.configService.config;
90
+ configSnapShot.theme = theme;
91
+ this.configService.config = configSnapShot;
92
+ this.themeService.initPalette(theme);
93
+ };
94
+ const subdomain = this.getSubdomain();
95
+ if (subdomain) {
96
+ try {
97
+ let [subdomainConfigs, subdomainLanguage] = await Promise.all([
98
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.${this.translateService.currentLang}.json`)),
99
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.appsettings.json`))
100
+ ]);
101
+ this.configService.config = _.mergeWith(this.configService.config, subdomainConfigs, this.mergeCustomizer);
102
+ this.translateService.setTranslation(this.translateService.currentLang, _.mergeWith(mergedLanguage, subdomainLanguage, this.mergeCustomizer));
103
+ configurePartial();
104
+ }
105
+ catch (e) {
106
+ if (this.configService.config.subdomain && this.configService.config.subdomain.subdomains.length && !this.configService.config.subdomain.subdomains.includes(subdomain)) {
107
+ this.router.dispose();
108
+ const error = `Invalid subdomain: ${subdomain}`;
109
+ console.error(error);
110
+ throw new Error(error);
111
+ }
112
+ else if (this.configService.config.subdomain?.requireConfiguredSubdomain && this.configService.config.subdomain?.subdomains.includes(subdomain)) {
113
+ this.router.dispose();
114
+ const error = `Configured subdomain: ${subdomain} does not have any subdomain specific configurations`;
115
+ reject(error);
116
+ console.error(error);
117
+ throw new Error(error);
118
+ }
119
+ }
120
+ }
121
+ else {
122
+ configurePartial();
123
+ }
83
124
  }
84
125
  catch (error) {
85
126
  // Catch any errors during the get configurations API call
@@ -158,8 +199,12 @@ export class Initializer {
158
199
  * @param config The Oidc Auth Settings
159
200
  */
160
201
  async login(config) {
161
- this.validateExistingTokenAgainstConfigs();
162
- if (config.requireLoginOnStartup) {
202
+ const isValid = this.validateExistingTokenAgainstConfigs();
203
+ const preservedRoute = this.window.sessionStorage.getItem(preSignInRouteStorageKey);
204
+ if (!preservedRoute) {
205
+ this.window.sessionStorage.setItem(preSignInRouteStorageKey, this.location.path());
206
+ }
207
+ if (config.requireLoginOnStartup || !isValid) {
163
208
  return this.oAuthService.loadDiscoveryDocumentAndLogin({ state: this.location.path() })
164
209
  // handles the case for expired access token or invalid nonce or people bookmarking the ids login page
165
210
  .catch(async (res) => {
@@ -187,25 +232,40 @@ export class Initializer {
187
232
  return srcValue;
188
233
  }
189
234
  }
190
- /** Validates the existing token against the configurations */
235
+ /**
236
+ * Validates the existing token against the configurations
237
+ * @returns true when token is valid
238
+ */
191
239
  validateExistingTokenAgainstConfigs() {
192
240
  if (this.configService.config.oAuthSettings.disableStartupTokenValidation) {
193
- return;
241
+ return true;
194
242
  }
195
- if (!window.sessionStorage.getItem('access_token')) {
196
- return;
243
+ if (!this.window.sessionStorage.getItem('access_token')) {
244
+ return true;
197
245
  }
198
- const grantedScopes = this.oAuthService.getGrantedScopes()[0]
199
- .split(' ');
246
+ const grantedScopes = this.oAuthService.getGrantedScopes();
200
247
  const configuredScopes = this.configService.config.oAuthSettings.scope.split(' ');
201
248
  const diffs = grantedScopes.filter(x => !configuredScopes.includes(x))
202
249
  .concat(configuredScopes.filter(x => !grantedScopes.includes(x)));
203
250
  if (diffs.length || this.oAuthService.getIdentityClaims()['aud'] !== this.configService.config.oAuthSettings.clientId) {
204
- window.sessionStorage.removeItem('access_token');
251
+ this.window.sessionStorage.removeItem('access_token');
252
+ return false;
253
+ }
254
+ return true;
255
+ }
256
+ /** Getting the subdomain from url */
257
+ getSubdomain() {
258
+ const domain = this.window.location.hostname;
259
+ if (domain.indexOf('.') < 0 ||
260
+ domain.split('.')[0] === this.exampleSubdomain || domain.split('.')[0] === this.lvhSubstring || domain.split('.')[0] === this.wwwSubstring) {
261
+ return '';
262
+ }
263
+ else {
264
+ return domain.split('.')[0];
205
265
  }
206
266
  }
207
267
  }
208
- Initializer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, deps: [{ token: i1.HttpClient }, { token: i2.TranslateService }, { token: i3.ThemeService }, { token: i4.BaseConfigService }, { token: i5.OAuthService }, { token: i6.Router }, { token: i7.Location }, { token: i8.CustomAuthConfigService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
268
+ Initializer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, deps: [{ token: i1.HttpClient }, { token: i2.TranslateService }, { token: i3.ThemeService }, { token: i4.BaseConfigService }, { token: i5.OAuthService }, { token: i6.Router }, { token: i7.Location }, { token: i8.CustomAuthConfigService, optional: true }, { token: WINDOW, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
209
269
  Initializer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, providedIn: 'root' });
210
270
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, decorators: [{
211
271
  type: Injectable,
@@ -214,5 +274,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
214
274
  }]
215
275
  }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.TranslateService }, { type: i3.ThemeService }, { type: i4.BaseConfigService }, { type: i5.OAuthService }, { type: i6.Router }, { type: i7.Location }, { type: i8.CustomAuthConfigService, decorators: [{
216
276
  type: Optional
277
+ }] }, { type: undefined, decorators: [{
278
+ type: Optional
279
+ }, {
280
+ type: Inject,
281
+ args: [WINDOW]
217
282
  }] }]; } });
218
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9saWIvY29yZS9pbml0aWFsaXplci9pbml0aWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3JELE9BQU8sRUFBRSxVQUFVLEVBQWdCLE1BQU0scUJBQXFCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDakUsT0FBTyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGVBQWUsRUFBYyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHL0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUFPekQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8sV0FBVztJQUt0Qiw4QkFBOEI7SUFDOUIsSUFBVyxhQUFhO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7SUFDcEMsQ0FBQztJQUtEOzs7Ozs7Ozs7O09BVUc7SUFDSCxZQUNtQixJQUFnQixFQUNoQixnQkFBa0MsRUFDbEMsWUFBMEIsRUFDMUIsYUFBZ0MsRUFDaEMsWUFBMEIsRUFDMUIsTUFBYyxFQUNkLFFBQWtCLEVBQ04sdUJBQWdEO1FBUDVELFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVU7UUFDTiw0QkFBdUIs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UUFDcEUsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFO1lBQ3JILE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQzs7d0dBcE5VLFdBQVc7NEdBQVgsV0FBVyxjQUhSLE1BQU07MkZBR1QsV0FBVztrQkFMdkIsVUFBVTttQkFDVDtvQkFDRSxVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQWtDRSxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgQXV0aENvbmZpZywgT0F1dGhTZXJ2aWNlIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYyc7XHJcbmltcG9ydCB7IEp3a3NWYWxpZGF0aW9uSGFuZGxlciB9IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMtandrcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi90aGVtaW5nL3NlcnZpY2VzL3RoZW1lLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBsYW5ndWFnZVN0b3JhZ2VLZXkgfSBmcm9tICcuLi9tb2RlbHMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT2lkY0F1dGhTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9vaWRjLWF1dGgtc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Jhc2UtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21BdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2N1c3RvbS1hdXRoLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBzdGFydHVwIHNlcnZpY2UgaXMgdXNlZCB0byBjYWxsIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcnVuIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcgdGhlIGFwcGxpY2F0aW9uXHJcbiAqL1xyXG5ASW5qZWN0YWJsZShcclxuICB7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemVyIHtcclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmF0aW9uIGJlaGF2aW9yIHN1YmplY3QgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzSW5pdGlhbGl6ZWRCczogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBHZXRzIHRoZSBjb25maWd1cmF0aW9ucyAqL1xyXG4gIHB1YmxpYyBnZXQgaXNJbml0aWFsaXplZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmlzSW5pdGlhbGl6ZWRCcy52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgY29uZmlndXJhdGlvbiBvYnNlcnZhYmxlICovXHJcbiAgcHVibGljIHJlYWRvbmx5IGlzSW5pdGlhbGl6ZWQkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG5cclxuICAvKipcclxuICAgKiBDb25zdHJ1Y3RzIHRoZSBzdGFydHVwIHNlcnZpY2UuIEluY2x1ZGUgYW55IHNlcnZpY2VzIHRoYXQgc2hvdWxkIGJlIHVzZWQgZHVyaW5nIHN0YXJ0dXBcclxuICAgKiBAcGFyYW0gaHR0cCBUaGUgSFRUUCBDbGllbnRcclxuICAgKiBAcGFyYW0gdHJhbnNsYXRlU2VydmljZSBUaGUgdHJhbnNsYXRlIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gdGhlbWVTZXJ2aWNlIFRoZSB0aGVtZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIGNvbmZpZ1NlcnZpY2UgVGhlIGNvbmZpZ3VyYXRpb24gc2VydmljZVxyXG4gICAqIEBwYXJhbSBvQXV0aFNlcnZpY2UgVGhlIG9pZGMgYXV0aG9yaXphdGlvbiBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHJvdXRlciBUaGUgcm91dGVyXHJcbiAgICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvblxyXG4gICAqIEBwYXJhbSBjdXN0b21BdXRoQ29uZmlnU2VydmljZSBUaGUgc2VydmljZSB0aGF0IHdpbGwgY29uZmlndXJlIHRoZSBhdXRoIGNvbmZpZ1xyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnU2VydmljZTogQmFzZUNvbmZpZ1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9BdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBjdXN0b21BdXRoQ29uZmlnU2VydmljZTogQ3VzdG9tQXV0aENvbmZpZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuaXNJbml0aWFsaXplZCQgPSB0aGlzLmlzSW5pdGlhbGl6ZWRCcy5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFsbCBkYXRhIHRoYXQgaXMgbmVlZGVkIHVwb24gaW5pdGlhbCBsb2FkaW5nIG9mIHRoZSB3ZWJzaXRlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIHJlYWRzIHRoZSBsYW5ndWFnZSBmcm9tIGxvY2FsIHN0b3JhZ2Ugc2V0IGluIHRoZSBwYXJlbnQgYXBwXHJcbiAgICAvLyBsYW5ndWFnZSBsb2FkaW5nXHJcblxyXG4gICAgLy8gU2V0IGxhbmd1YWdlcyBmb3IgdHJhbnNsYXRpb24gc2VydmljZVxyXG4gICAgY29uc3QgbGFuZyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShsYW5ndWFnZVN0b3JhZ2VLZXkpIHx8IHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGxhbmd1YWdlU3RvcmFnZUtleSkgfHwgJ2VuJztcclxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXREZWZhdWx0TGFuZyhsYW5nKTtcclxuICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS51c2UobGFuZyk7XHJcblxyXG4gICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTYzNjg4MFxyXG4gICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS80MTczNjI5M1xyXG5cclxuICAgIC8vIEEgY2FsbGJhY2sgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwcm9taXNlLiBUaGlzIGNhbGxiYWNrIGlzIHBhc3NlZCB0d28gYXJndW1lbnRzOlxyXG4gICAgLy8gYSByZXNvbHZlIGNhbGxiYWNrIHVzZWQgcmVzb2x2ZSB0aGUgcHJvbWlzZSB3aXRoIGEgdmFsdWUgb3IgdGhlIHJlc3VsdCBvZiBhbm90aGVyIHByb21pc2UsXHJcbiAgICAvLyBhbmQgYSByZWplY3QgY2FsbGJhY2sgdXNlZCB0byByZWplY3QgdGhlIHByb21pc2Ugd2l0aCBhIHByb3ZpZGVkIHJlYXNvbiBvciBlcnJvci5cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIC8vIEdvIHRocm91Z2ggYWxsIHNlcnZpY2VzIGFuZCBjb21wbGV0ZSBhbnkgQVBJIGNhbGxzIG5lY2Vzc2FyeS5cclxuICAgICAgLy8gQXQgdGhlIGVuZCwgaWYgYWxsIHdvcmtzIGFuZCBsb2FkcyBhcyBleHBlY3RlZCwgcmVzb2x2ZSB0aGUgcHJvbWlzZSBhbmQgc2V0IHN0YXJ0dXAgc3VjY2VzcyB0byB0cnVlLlxyXG4gICAgICAvLyBJZiBhbiBpc3N1ZSBpcyBlbmNvdW50ZXJlZCwgeW91IGNhbiBjYWxsIHJlamVjdCgpIHRvIGhpdCB0aGUgY2F0Y2goKSBjb2RlIGJlbG93LlxyXG5cclxuICAgICAgLy8gRmlyc3QsIGxvYWQgdGhlIGNvbmZpZ3VyYXRpb25zXHJcbiAgICAgIGxldCBbYmFzZUNvbmZpZywgb3ZlcnJpZGVDb25maWcsIGJhc2VMYW5nLCBvdmVycmlkZUxhbmcsIHRoZW1lXSA9IFtKU09OLCBKU09OLCBKU09OLCBKU09OLCBKU09OXTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBbYmFzZUNvbmZpZywgb3ZlcnJpZGVDb25maWcsIGJhc2VMYW5nLCBvdmVycmlkZUxhbmcsIHRoZW1lXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcclxuICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8SlNPTj4oJy4vYXNzZXRzL2Jhc2VsaW5lL2FwcHNldHRpbmdzLmpzb24nKS50b1Byb21pc2UoKSxcclxuICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8SlNPTj4oJy4vYXNzZXRzL2NvbmZpZ3VyYXRpb25zL2FwcHNldHRpbmdzLmpzb24nKS50b1Byb21pc2UoKSxcclxuICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8SlNPTj4oYC4vYXNzZXRzL2kxOG4vJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmd9Lmpzb25gKS50b1Byb21pc2UoKSxcclxuICAgICAgICAgIHRoaXMuaHR0cC5nZXQ8SlNPTj4oYC4vYXNzZXRzL2NvbmZpZ3VyYXRpb25zLyR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy90aGVtZS5qc29uJykudG9Qcm9taXNlKClcclxuICAgICAgICBdKTtcclxuICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gXy5tZXJnZVdpdGgoYmFzZUNvbmZpZywgb3ZlcnJpZGVDb25maWcsIHRoaXMubWVyZ2VDdXN0b21pemVyKTtcclxuICAgICAgICBjb25zdCBjb25maWdTbmFwU2hvdCA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWc7XHJcbiAgICAgICAgY29uZmlnU25hcFNob3QudGhlbWUgPSB0aGVtZSBhcyBhbnk7XHJcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IGNvbmZpZ1NuYXBTaG90O1xyXG4gICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXRUcmFuc2xhdGlvbih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcsIF8ubWVyZ2VXaXRoKGJhc2VMYW5nLCBvdmVycmlkZUxhbmcsIHRoaXMubWVyZ2VDdXN0b21pemVyKSk7XHJcbiAgICAgICAgdGhpcy50aGVtZVNlcnZpY2UuaW5pdFBhbGV0dGUodGhlbWUgYXMgYW55KTtcclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAvLyBDYXRjaCBhbnkgZXJyb3JzIGR1cmluZyB0aGUgZ2V0IGNvbmZpZ3VyYXRpb25zIEFQSSBjYWxsXHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgTG9hZGluZyBDb25maWd1cmF0aW9ucyBvciBMYW5ndWFnZXMnKTtcclxuICAgICAgICAvLyBSZWplY3QgdGhlIHByb21pc2VcclxuICAgICAgICByZWplY3QoJ2Vycm9yJyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yLmVycm9yIHx8ICdTZXJ2ZXIgZXJyb3InKTtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUF1dGhDb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmN1c3RvbUF1dGhDb25maWdTZXJ2aWNlLmNvbmZpZ3VyZUF1dGhTZXR0aW5ncygpLnRoZW4oYXV0aENvbmZpZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhdXRoQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzO1xyXG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvZ2luKGNvbmZpZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG9BdXRoID0gYXdhaXQgdGhpcy5zZXRVcE9BdXRoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIHJlamVjdChlcnJvcik7XHJcblxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTmF2aWdhdGUgdG8gdGhlIHJlcXVlc3RlZCByb3V0ZVxyXG4gICAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzPy5wcmVzZXJ2ZVJvdXRlKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCh0aGlzLm9BdXRoU2VydmljZS5zdGF0ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZEJzLm5leHQodHJ1ZSk7XHJcbiAgICAgIHJlc29sdmUodHJ1ZSk7XHJcbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgLy8gQ2F0Y2ggdGhlIGVycm9yXHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1RoZXJlIHdhcyBhbiBlcnJvciBsb2FkaW5nIHRoZSBzdGFydHVwIGNvbmZpZ3VyYXRpb25zLicpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25maWd1cmUgaW1wbGljaXQgZmxvd1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgc2V0VXBPQXV0aCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnPy5vQXV0aFNldHRpbmdzPy5pc3N1ZXIpIHtcclxuICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzO1xyXG4gICAgICBjb25zdCBhdXRoQ29uZmlnID0gbmV3IEF1dGhDb25maWcoe1xyXG4gICAgICAgIGNsaWVudElkOiBjb25maWcuY2xpZW50SWQsXHJcbiAgICAgICAgcmVkaXJlY3RVcmk6IGNvbmZpZy5yZWRpcmVjdFVyaSxcclxuICAgICAgICBpc3N1ZXI6IGNvbmZpZy5pc3N1ZXIsXHJcbiAgICAgICAgc2NvcGU6IGNvbmZpZy5zY29wZSxcclxuICAgICAgICBza2lwSXNzdWVyQ2hlY2s6IGNvbmZpZy5za2lwSXNzdWVyQ2hlY2sgIT0gdW5kZWZpbmVkID8gY29uZmlnLnNraXBJc3N1ZXJDaGVjayA6IHRydWUsXHJcbiAgICAgICAgdGltZW91dEZhY3RvcjogY29uZmlnLnRpbWVvdXRGYWN0b3IgfHwgMC43NSxcclxuICAgICAgICBwb3N0TG9nb3V0UmVkaXJlY3RVcmk6IGNvbmZpZy5wb3N0TG9nb3V0UmVkaXJlY3RVcmksXHJcbiAgICAgICAgbG9naW5Vcmw6IGNvbmZpZy5sb2dpblVybCxcclxuICAgICAgICBzdHJpY3REaXNjb3ZlcnlEb2N1bWVudFZhbGlkYXRpb246IGZhbHNlLFxyXG4gICAgICAgIHJlc3BvbnNlVHlwZTogY29uZmlnLnJlc3BvbnNlVHlwZSB8fCAnY29kZSdcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmNvbmZpZ3VyZShhdXRoQ29uZmlnKTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2Uuc2tpcElzc3VlckNoZWNrID0gdHJ1ZTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2UucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZSB8fCAnY29kZSc7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnN0cmljdERpc2NvdmVyeURvY3VtZW50VmFsaWRhdGlvbiA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS50b2tlblZhbGlkYXRpb25IYW5kbGVyID0gbmV3IEp3a3NWYWxpZGF0aW9uSGFuZGxlcigpO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS50aW1lb3V0RmFjdG9yID0gMC43NTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2Uuc2V0dXBBdXRvbWF0aWNTaWxlbnRSZWZyZXNoKHt9LCAnYWNjZXNzX3Rva2VuJyk7XHJcblxyXG4gICAgICAvLyBzZXQgaW5pdGlhbGl6ZWQgb24gc3RhcnQgdXAgdG8gdHJ1ZVxyXG4gICAgICBjb25maWcuYXV0aFNldE9uU3RhcnR1cCA9IHRydWU7XHJcbiAgICAgIGNvbnN0IHBhcmVudENvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWc7XHJcbiAgICAgIHBhcmVudENvbmZpZy5vQXV0aFNldHRpbmdzID0gY29uZmlnO1xyXG4gICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gcGFyZW50Q29uZmlnO1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMubG9naW4oY29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIExvZ2luXHJcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgT2lkYyBBdXRoIFNldHRpbmdzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBsb2dpbihjb25maWc6IE9pZGNBdXRoU2V0dGluZ3MpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMudmFsaWRhdGVFeGlzdGluZ1Rva2VuQWdhaW5zdENvbmZpZ3MoKTtcclxuICAgIGlmIChjb25maWcucmVxdWlyZUxvZ2luT25TdGFydHVwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm9BdXRoU2VydmljZS5sb2FkRGlzY292ZXJ5RG9jdW1lbnRBbmRMb2dpbih7c3RhdGU6IHRoaXMubG9jYXRpb24ucGF0aCgpfSlcclxuICAgICAgICAvLyBoYW5kbGVzIHRoZSBjYXNlIGZvciBleHBpcmVkIGFjY2VzcyB0b2tlbiBvciBpbnZhbGlkIG5vbmNlIG9yIHBlb3BsZSBib29rbWFya2luZyB0aGUgaWRzIGxvZ2luIHBhZ2VcclxuICAgICAgICAuY2F0Y2goYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vQXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdyh0aGlzLmxvY2F0aW9uLnBhdGgoKSk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5vQXV0aFNlcnZpY2UubG9hZERpc2NvdmVyeURvY3VtZW50QW5kVHJ5TG9naW4oKVxyXG4gICAgICAgIC8vIGhhbmRsZXMgdGhlIGNhc2UgZm9yIGV4cGlyZWQgYWNjZXNzIHRva2VuIG9yIGludmFsaWQgbm9uY2Ugb3IgcGVvcGxlIGJvb2ttYXJraW5nIHRoZSBpZHMgbG9naW4gcGFnZVxyXG4gICAgICAgIC5jYXRjaChhc3luYyAocmVzKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0TG9naW5GbG93KCk7XHJcblxyXG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1lcmdlcyB0aGUgdHdvIGNvbmZpZyBvYmplY3RzIGlnbm9yaW5nIHRoZSBhcnJheSB0eXBlXHJcbiAgICogQHBhcmFtIG9ialZhbHVlIFRoZSBkZWZhdWx0IGNvbmZpZyB2YWx1ZVxyXG4gICAqIEBwYXJhbSBzcmNWYWx1ZSBUaGUgdGFyZ2V0IHN3aXRjaGJvYXJkIGNvbmZpZyB2YWx1ZVxyXG4gICAqIEByZXR1cm5zIFRoZSBtZXJnZSBvZiB0aGUgdHdvIGNvbmZpZ3MgcHJvdmlkZWRcclxuICAgKi9cclxuICBwcml2YXRlIG1lcmdlQ3VzdG9taXplcihvYmpWYWx1ZTogYW55LCBzcmNWYWx1ZTogYW55KTogYW55IHtcclxuICAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpICYmIHNyY1ZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBzcmNWYWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBWYWxpZGF0ZXMgdGhlIGV4aXN0aW5nIHRva2VuIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb25zICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUV4aXN0aW5nVG9rZW5BZ2FpbnN0Q29uZmlncygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3MuZGlzYWJsZVN0YXJ0dXBUb2tlblZhbGlkYXRpb24pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKCF3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnYWNjZXNzX3Rva2VuJykpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ3JhbnRlZFNjb3BlczogQXJyYXk8c3RyaW5nPiA9IHRoaXMub0F1dGhTZXJ2aWNlLmdldEdyYW50ZWRTY29wZXMoKVswXVxyXG4gICAgICAuc3BsaXQoJyAnKTtcclxuICAgIGNvbnN0IGNvbmZpZ3VyZWRTY29wZXMgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3Muc2NvcGUuc3BsaXQoJyAnKTtcclxuICAgIGNvbnN0IGRpZmZzID0gZ3JhbnRlZFNjb3Blcy5maWx0ZXIoeCA9PiAhY29uZmlndXJlZFNjb3Blcy5pbmNsdWRlcyh4KSlcclxuICAgICAgLmNvbmNhdChjb25maWd1cmVkU2NvcGVzLmZpbHRlcih4ID0+ICFncmFudGVkU2NvcGVzLmluY2x1ZGVzKHgpKSk7XHJcbiAgICBpZiAoZGlmZnMubGVuZ3RoIHx8IHRoaXMub0F1dGhTZXJ2aWNlLmdldElkZW50aXR5Q2xhaW1zKClbJ2F1ZCddICE9PSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3MuY2xpZW50SWQpIHtcclxuICAgICAgd2luZG93LnNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2FjY2Vzc190b2tlbicpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
283
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9saWIvY29yZS9pbml0aWFsaXplci9pbml0aWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUc3RCxPQUFPLEVBQUUsVUFBVSxFQUFnQixNQUFNLHFCQUFxQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2pFLE9BQU8sS0FBSyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUc5RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7Ozs7QUFPM0Y7O0dBRUc7QUFNSCxNQUFNLE9BQU8sV0FBVztJQWlCdEIsOEJBQThCO0lBQzlCLElBQVcsYUFBYTtRQUN0QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO0lBQ3BDLENBQUM7SUFLRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFDbUIsSUFBZ0IsRUFDaEIsZ0JBQWtDLEVBQ2xDLFlBQTBCLEVBQzFCLGFBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLE1BQWMsRUFDZCxRQUFrQixFQUNOLHVCQUFnRCxFQUN4QyxPQUFZO1FBUmhDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBbUI7UUFDaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsV0FB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U0FDN0I7SUFDSCxDQUFDOzt3R0F4UlUsV0FBVywwUUE2Q0EsTUFBTTs0R0E3Q2pCLFdBQVcsY0FIUixNQUFNOzJGQUdULFdBQVc7a0JBTHZCLFVBQVU7bUJBQ1Q7b0JBQ0UsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkE4Q0UsUUFBUTs7MEJBQ1IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgT3B0aW9uYWwsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBBdXRoQ29uZmlnLCBPQXV0aFNlcnZpY2UgfSBmcm9tICdhbmd1bGFyLW9hdXRoMi1vaWRjJztcclxuaW1wb3J0IHsgSndrc1ZhbGlkYXRpb25IYW5kbGVyIH0gZnJvbSAnYW5ndWxhci1vYXV0aDItb2lkYy1qd2tzJztcclxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGxhc3RWYWx1ZUZyb20sIE9ic2VydmFibGUsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IFRoZW1lU2VydmljZSB9IGZyb20gJy4uLy4uL3RoZW1pbmcvc2VydmljZXMvdGhlbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IGxhbmd1YWdlU3RvcmFnZUtleSwgcHJlU2lnbkluUm91dGVTdG9yYWdlS2V5LCBXSU5ET1cgfSBmcm9tICcuLi9tb2RlbHMvY29uc3RhbnRzJztcclxuaW1wb3J0IHsgT2lkY0F1dGhTZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9vaWRjLWF1dGgtc2V0dGluZ3MnO1xyXG5pbXBvcnQgeyBCYXNlQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Jhc2UtY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDdXN0b21BdXRoQ29uZmlnU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2N1c3RvbS1hdXRoLWNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBzdGFydHVwIHNlcnZpY2UgaXMgdXNlZCB0byBjYWxsIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgcnVuIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcgdGhlIGFwcGxpY2F0aW9uXHJcbiAqL1xyXG5ASW5qZWN0YWJsZShcclxuICB7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxuICB9XHJcbilcclxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemVyIHtcclxuXHJcbiAgLyoqIFRoZSBjb25maWd1cmF0aW9uIGJlaGF2aW9yIHN1YmplY3QgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGlzSW5pdGlhbGl6ZWRCczogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gIC8qKiBUaGUgYnJvd3NlciB3aW5kb3cgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IHdpbmRvdzogV2luZG93O1xyXG5cclxuICAvKiogVGhlIGV4YW1wbGUgdGhlIHN1YmRvbWFpbiBzdWJzdHJpbmcgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IGV4YW1wbGVTdWJkb21haW46IHN0cmluZyA9ICdleGFtcGxlJztcclxuXHJcbiAgLyoqIFRoZSB3d3cgc3Vic3RyaW5nIGZvciBzdWJkb21haW4gcm91dGUgZmluZGluZyAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgd3d3U3Vic3RyaW5nOiBzdHJpbmcgPSAnd3d3JztcclxuXHJcbiAgLyoqIFRoZSBsdmggc3Vic3RyaW5nIGZvciBzdWJkb21haW4gcm91dGUgZmluZGluZyAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgbHZoU3Vic3RyaW5nOiBzdHJpbmcgPSAnbHZoJ1xyXG5cclxuICAvKiogR2V0cyB0aGUgY29uZmlndXJhdGlvbnMgKi9cclxuICBwdWJsaWMgZ2V0IGlzSW5pdGlhbGl6ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0luaXRpYWxpemVkQnMudmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIGNvbmZpZ3VyYXRpb24gb2JzZXJ2YWJsZSAqL1xyXG4gIHB1YmxpYyByZWFkb25seSBpc0luaXRpYWxpemVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3RydWN0cyB0aGUgc3RhcnR1cCBzZXJ2aWNlLiBJbmNsdWRlIGFueSBzZXJ2aWNlcyB0aGF0IHNob3VsZCBiZSB1c2VkIGR1cmluZyBzdGFydHVwXHJcbiAgICogQHBhcmFtIGh0dHAgVGhlIEhUVFAgQ2xpZW50XHJcbiAgICogQHBhcmFtIHRyYW5zbGF0ZVNlcnZpY2UgVGhlIHRyYW5zbGF0ZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHRoZW1lU2VydmljZSBUaGUgdGhlbWUgc2VydmljZVxyXG4gICAqIEBwYXJhbSBjb25maWdTZXJ2aWNlIFRoZSBjb25maWd1cmF0aW9uIHNlcnZpY2VcclxuICAgKiBAcGFyYW0gb0F1dGhTZXJ2aWNlIFRoZSBvaWRjIGF1dGhvcml6YXRpb24gc2VydmljZVxyXG4gICAqIEBwYXJhbSByb3V0ZXIgVGhlIHJvdXRlclxyXG4gICAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb25cclxuICAgKiBAcGFyYW0gY3VzdG9tQXV0aENvbmZpZ1NlcnZpY2UgVGhlIHNlcnZpY2UgdGhhdCB3aWxsIGNvbmZpZ3VyZSB0aGUgYXV0aCBjb25maWdcclxuICAgKi9cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ1NlcnZpY2U6IEJhc2VDb25maWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBvQXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvY2F0aW9uOiBMb2NhdGlvbixcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQXV0aENvbmZpZ1NlcnZpY2U6IEN1c3RvbUF1dGhDb25maWdTZXJ2aWNlLFxyXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChXSU5ET1cpIHJlYWRvbmx5IF93aW5kb3c6IGFueVxyXG4gICkge1xyXG4gICAgdGhpcy5pc0luaXRpYWxpemVkJCA9IHRoaXMuaXNJbml0aWFsaXplZEJzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgdGhpcy53aW5kb3cgPSBfd2luZG93IHx8IHdpbmRvdztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGFsbCBkYXRhIHRoYXQgaXMgbmVlZGVkIHVwb24gaW5pdGlhbCBsb2FkaW5nIG9mIHRoZSB3ZWJzaXRlXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIC8vIHJlYWRzIHRoZSBsYW5ndWFnZSBmcm9tIGxvY2FsIHN0b3JhZ2Ugc2V0IGluIHRoZSBwYXJlbnQgYXBwXHJcbiAgICAvLyBsYW5ndWFnZSBsb2FkaW5nXHJcblxyXG4gICAgLy8gU2V0IGxhbmd1YWdlcyBmb3IgdHJhbnNsYXRpb24gc2VydmljZVxyXG4gICAgY29uc3QgbGFuZyA9IHRoaXMud2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGxhbmd1YWdlU3RvcmFnZUtleSkgfHwgdGhpcy53aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShsYW5ndWFnZVN0b3JhZ2VLZXkpIHx8ICdlbic7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2Uuc2V0RGVmYXVsdExhbmcobGFuZyk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UudXNlKGxhbmcpO1xyXG5cclxuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE2MzY4ODBcclxuICAgIC8vIEFkYXB0ZWQgZnJvbSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvNDE3MzYyOTNcclxuXHJcbiAgICAvLyBBIGNhbGxiYWNrIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcHJvbWlzZS4gVGhpcyBjYWxsYmFjayBpcyBwYXNzZWQgdHdvIGFyZ3VtZW50czpcclxuICAgIC8vIGEgcmVzb2x2ZSBjYWxsYmFjayB1c2VkIHJlc29sdmUgdGhlIHByb21pc2Ugd2l0aCBhIHZhbHVlIG9yIHRoZSByZXN1bHQgb2YgYW5vdGhlciBwcm9taXNlLFxyXG4gICAgLy8gYW5kIGEgcmVqZWN0IGNhbGxiYWNrIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlIHdpdGggYSBwcm92aWRlZCByZWFzb24gb3IgZXJyb3IuXHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvLyBHbyB0aHJvdWdoIGFsbCBzZXJ2aWNlcyBhbmQgY29tcGxldGUgYW55IEFQSSBjYWxscyBuZWNlc3NhcnkuXHJcbiAgICAgIC8vIEF0IHRoZSBlbmQsIGlmIGFsbCB3b3JrcyBhbmQgbG9hZHMgYXMgZXhwZWN0ZWQsIHJlc29sdmUgdGhlIHByb21pc2UgYW5kIHNldCBzdGFydHVwIHN1Y2Nlc3MgdG8gdHJ1ZS5cclxuICAgICAgLy8gSWYgYW4gaXNzdWUgaXMgZW5jb3VudGVyZWQsIHlvdSBjYW4gY2FsbCByZWplY3QoKSB0byBoaXQgdGhlIGNhdGNoKCkgY29kZSBiZWxvdy5cclxuXHJcbiAgICAgIC8vIEZpcnN0LCBsb2FkIHRoZSBjb25maWd1cmF0aW9uc1xyXG4gICAgICBsZXQgW2Jhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCBiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGVtZV0gPSBbSlNPTiwgSlNPTiwgSlNPTiwgSlNPTiwgSlNPTl07XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgW2Jhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCBiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGVtZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9iYXNlbGluZS9hcHBzZXR0aW5ncy5qc29uJykudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KCcuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy9hcHBzZXR0aW5ncy5qc29uJykudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9pMThuLyR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkudG9Qcm9taXNlKCksXHJcbiAgICAgICAgICB0aGlzLmh0dHAuZ2V0PEpTT04+KGAuL2Fzc2V0cy9jb25maWd1cmF0aW9ucy8ke3RoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZ30uanNvbmApLnRvUHJvbWlzZSgpLFxyXG4gICAgICAgICAgdGhpcy5odHRwLmdldDxKU09OPignLi9hc3NldHMvY29uZmlndXJhdGlvbnMvdGhlbWUuanNvbicpLnRvUHJvbWlzZSgpXHJcbiAgICAgICAgXSk7XHJcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IF8ubWVyZ2VXaXRoKGJhc2VDb25maWcsIG92ZXJyaWRlQ29uZmlnLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgY29uc3QgbWVyZ2VkTGFuZ3VhZ2UgPSBfLm1lcmdlV2l0aChiYXNlTGFuZywgb3ZlcnJpZGVMYW5nLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgdGhpcy50cmFuc2xhdGVTZXJ2aWNlLnNldFRyYW5zbGF0aW9uKHRoaXMudHJhbnNsYXRlU2VydmljZS5jdXJyZW50TGFuZywgbWVyZ2VkTGFuZ3VhZ2UpO1xyXG5cclxuICAgICAgICBjb25zdCBjb25maWd1cmVQYXJ0aWFsID0gKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgY29uZmlnU25hcFNob3QgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnO1xyXG4gICAgICAgICAgY29uZmlnU25hcFNob3QudGhlbWUgPSB0aGVtZSBhcyBhbnk7XHJcbiAgICAgICAgICB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnID0gY29uZmlnU25hcFNob3Q7XHJcbiAgICAgICAgICB0aGlzLnRoZW1lU2VydmljZS5pbml0UGFsZXR0ZSh0aGVtZSBhcyBhbnkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBzdWJkb21haW4gPSB0aGlzLmdldFN1YmRvbWFpbigpO1xyXG4gICAgICAgIGlmIChzdWJkb21haW4pIHtcclxuICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxldCBbc3ViZG9tYWluQ29uZmlncywgc3ViZG9tYWluTGFuZ3VhZ2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xyXG4gICAgICAgICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxKU09OPihgLi9hc3NldHMvY29uZmlndXJhdGlvbnMvJHtzdWJkb21haW59LiR7dGhpcy50cmFuc2xhdGVTZXJ2aWNlLmN1cnJlbnRMYW5nfS5qc29uYCkpLFxyXG4gICAgICAgICAgICAgIGxhc3RWYWx1ZUZyb20odGhpcy5odHRwLmdldDxKU09OPihgLi9hc3NldHMvY29uZmlndXJhdGlvbnMvJHtzdWJkb21haW59LmFwcHNldHRpbmdzLmpzb25gKSlcclxuICAgICAgICAgICAgXSk7XHJcbiAgICAgICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcgPSBfLm1lcmdlV2l0aCh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLCBzdWJkb21haW5Db25maWdzLCB0aGlzLm1lcmdlQ3VzdG9taXplcik7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5zZXRUcmFuc2xhdGlvbih0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuY3VycmVudExhbmcsIF8ubWVyZ2VXaXRoKG1lcmdlZExhbmd1YWdlLCBzdWJkb21haW5MYW5ndWFnZSwgdGhpcy5tZXJnZUN1c3RvbWl6ZXIpKTtcclxuICAgICAgICAgICAgY29uZmlndXJlUGFydGlhbCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3ViZG9tYWluICYmIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3ViZG9tYWluLnN1YmRvbWFpbnMubGVuZ3RoICYmICF0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbi5zdWJkb21haW5zLmluY2x1ZGVzKHN1YmRvbWFpbikpIHtcclxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5kaXNwb3NlKCk7XHJcbiAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBgSW52YWxpZCBzdWJkb21haW46ICR7c3ViZG9tYWlufWA7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLnN1YmRvbWFpbj8ucmVxdWlyZUNvbmZpZ3VyZWRTdWJkb21haW4gJiYgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJkb21haW4/LnN1YmRvbWFpbnMuaW5jbHVkZXMoc3ViZG9tYWluKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLmRpc3Bvc2UoKTtcclxuICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGBDb25maWd1cmVkIHN1YmRvbWFpbjogJHtzdWJkb21haW59IGRvZXMgbm90IGhhdmUgYW55IHN1YmRvbWFpbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uc2A7XHJcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgY29uZmlndXJlUGFydGlhbCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAvLyBDYXRjaCBhbnkgZXJyb3JzIGR1cmluZyB0aGUgZ2V0IGNvbmZpZ3VyYXRpb25zIEFQSSBjYWxsXHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgTG9hZGluZyBDb25maWd1cmF0aW9ucyBvciBMYW5ndWFnZXMnKTtcclxuICAgICAgICAvLyBSZWplY3QgdGhlIHByb21pc2VcclxuICAgICAgICByZWplY3QoJ2Vycm9yJyk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yLmVycm9yIHx8ICdTZXJ2ZXIgZXJyb3InKTtcclxuICAgICAgfVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmICh0aGlzLmN1c3RvbUF1dGhDb25maWdTZXJ2aWNlKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLmN1c3RvbUF1dGhDb25maWdTZXJ2aWNlLmNvbmZpZ3VyZUF1dGhTZXR0aW5ncygpLnRoZW4oYXV0aENvbmZpZyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChhdXRoQ29uZmlnKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5vQXV0aFNldHRpbmdzO1xyXG5cclxuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2dpbihjb25maWcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBvQXV0aCA9IGF3YWl0IHRoaXMuc2V0VXBPQXV0aCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSByZXF1ZXN0ZWQgcm91dGVcclxuICAgICAgaWYgKHRoaXMuY29uZmlnU2VydmljZS5jb25maWcub0F1dGhTZXR0aW5ncz8ucHJlc2VydmVSb3V0ZSkge1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwodGhpcy5vQXV0aFNlcnZpY2Uuc3RhdGUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLmlzSW5pdGlhbGl6ZWRCcy5uZXh0KHRydWUpO1xyXG4gICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XHJcbiAgICAgIC8vIENhdGNoIHRoZSBlcnJvclxyXG4gICAgICBjb25zb2xlLmVycm9yKCdUaGVyZSB3YXMgYW4gZXJyb3IgbG9hZGluZyB0aGUgc3RhcnR1cCBjb25maWd1cmF0aW9ucy4nKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJlIGltcGxpY2l0IGZsb3dcclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHNldFVwT0F1dGgoKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZz8ub0F1dGhTZXR0aW5ncz8uaXNzdWVyKSB7XHJcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2VydmljZS5jb25maWcub0F1dGhTZXR0aW5ncztcclxuICAgICAgY29uc3QgYXV0aENvbmZpZyA9IG5ldyBBdXRoQ29uZmlnKHtcclxuICAgICAgICBjbGllbnRJZDogY29uZmlnLmNsaWVudElkLFxyXG4gICAgICAgIHJlZGlyZWN0VXJpOiBjb25maWcucmVkaXJlY3RVcmksXHJcbiAgICAgICAgaXNzdWVyOiBjb25maWcuaXNzdWVyLFxyXG4gICAgICAgIHNjb3BlOiBjb25maWcuc2NvcGUsXHJcbiAgICAgICAgc2tpcElzc3VlckNoZWNrOiBjb25maWcuc2tpcElzc3VlckNoZWNrICE9IHVuZGVmaW5lZCA/IGNvbmZpZy5za2lwSXNzdWVyQ2hlY2sgOiB0cnVlLFxyXG4gICAgICAgIHRpbWVvdXRGYWN0b3I6IGNvbmZpZy50aW1lb3V0RmFjdG9yIHx8IDAuNzUsXHJcbiAgICAgICAgcG9zdExvZ291dFJlZGlyZWN0VXJpOiBjb25maWcucG9zdExvZ291dFJlZGlyZWN0VXJpLFxyXG4gICAgICAgIGxvZ2luVXJsOiBjb25maWcubG9naW5VcmwsXHJcbiAgICAgICAgc3RyaWN0RGlzY292ZXJ5RG9jdW1lbnRWYWxpZGF0aW9uOiBmYWxzZSxcclxuICAgICAgICByZXNwb25zZVR5cGU6IGNvbmZpZy5yZXNwb25zZVR5cGUgfHwgJ2NvZGUnXHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5jb25maWd1cmUoYXV0aENvbmZpZyk7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnNraXBJc3N1ZXJDaGVjayA9IHRydWU7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnJlc3BvbnNlVHlwZSA9IGNvbmZpZy5yZXNwb25zZVR5cGUgfHwgJ2NvZGUnO1xyXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5zdHJpY3REaXNjb3ZlcnlEb2N1bWVudFZhbGlkYXRpb24gPSBmYWxzZTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2UudG9rZW5WYWxpZGF0aW9uSGFuZGxlciA9IG5ldyBKd2tzVmFsaWRhdGlvbkhhbmRsZXIoKTtcclxuICAgICAgdGhpcy5vQXV0aFNlcnZpY2UudGltZW91dEZhY3RvciA9IDAuNzU7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLnNldHVwQXV0b21hdGljU2lsZW50UmVmcmVzaCh7fSwgJ2FjY2Vzc190b2tlbicpO1xyXG5cclxuICAgICAgLy8gc2V0IGluaXRpYWxpemVkIG9uIHN0YXJ0IHVwIHRvIHRydWVcclxuICAgICAgY29uZmlnLmF1dGhTZXRPblN0YXJ0dXAgPSB0cnVlO1xyXG4gICAgICBjb25zdCBwYXJlbnRDb25maWcgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnO1xyXG4gICAgICBwYXJlbnRDb25maWcub0F1dGhTZXR0aW5ncyA9IGNvbmZpZztcclxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZyA9IHBhcmVudENvbmZpZztcclxuXHJcbiAgICAgIHJldHVybiB0aGlzLmxvZ2luKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBMb2dpblxyXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIE9pZGMgQXV0aCBTZXR0aW5nc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgbG9naW4oY29uZmlnOiBPaWRjQXV0aFNldHRpbmdzKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBjb25zdCBpc1ZhbGlkID0gdGhpcy52YWxpZGF0ZUV4aXN0aW5nVG9rZW5BZ2FpbnN0Q29uZmlncygpO1xyXG4gICAgY29uc3QgcHJlc2VydmVkUm91dGUgPSB0aGlzLndpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKHByZVNpZ25JblJvdXRlU3RvcmFnZUtleSk7XHJcbiAgICBpZiAoIXByZXNlcnZlZFJvdXRlKSB7XHJcbiAgICAgIHRoaXMud2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0ocHJlU2lnbkluUm91dGVTdG9yYWdlS2V5LCB0aGlzLmxvY2F0aW9uLnBhdGgoKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoY29uZmlnLnJlcXVpcmVMb2dpbk9uU3RhcnR1cCB8fCAhaXNWYWxpZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5vQXV0aFNlcnZpY2UubG9hZERpc2NvdmVyeURvY3VtZW50QW5kTG9naW4oe3N0YXRlOiB0aGlzLmxvY2F0aW9uLnBhdGgoKX0pXHJcbiAgICAgICAgLy8gaGFuZGxlcyB0aGUgY2FzZSBmb3IgZXhwaXJlZCBhY2Nlc3MgdG9rZW4gb3IgaW52YWxpZCBub25jZSBvciBwZW9wbGUgYm9va21hcmtpbmcgdGhlIGlkcyBsb2dpbiBwYWdlXHJcbiAgICAgICAgLmNhdGNoKGFzeW5jIChyZXMpID0+IHtcclxuICAgICAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmluaXRMb2dpbkZsb3codGhpcy5sb2NhdGlvbi5wYXRoKCkpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlLmxvYWREaXNjb3ZlcnlEb2N1bWVudEFuZFRyeUxvZ2luKClcclxuICAgICAgICAvLyBoYW5kbGVzIHRoZSBjYXNlIGZvciBleHBpcmVkIGFjY2VzcyB0b2tlbiBvciBpbnZhbGlkIG5vbmNlIG9yIHBlb3BsZSBib29rbWFya2luZyB0aGUgaWRzIGxvZ2luIHBhZ2VcclxuICAgICAgICAuY2F0Y2goYXN5bmMgKHJlcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5vQXV0aFNlcnZpY2UuaW5pdExvZ2luRmxvdygpO1xyXG5cclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodHJ1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXJnZXMgdGhlIHR3byBjb25maWcgb2JqZWN0cyBpZ25vcmluZyB0aGUgYXJyYXkgdHlwZVxyXG4gICAqIEBwYXJhbSBvYmpWYWx1ZSBUaGUgZGVmYXVsdCBjb25maWcgdmFsdWVcclxuICAgKiBAcGFyYW0gc3JjVmFsdWUgVGhlIHRhcmdldCBzd2l0Y2hib2FyZCBjb25maWcgdmFsdWVcclxuICAgKiBAcmV0dXJucyBUaGUgbWVyZ2Ugb2YgdGhlIHR3byBjb25maWdzIHByb3ZpZGVkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtZXJnZUN1c3RvbWl6ZXIob2JqVmFsdWU6IGFueSwgc3JjVmFsdWU6IGFueSk6IGFueSB7XHJcbiAgICBpZiAoXy5pc0FycmF5KG9ialZhbHVlKSAmJiBzcmNWYWx1ZSkge1xyXG4gICAgICByZXR1cm4gc3JjVmFsdWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgdGhlIGV4aXN0aW5nIHRva2VuIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb25zXHJcbiAgICogQHJldHVybnMgdHJ1ZSB3aGVuIHRva2VuIGlzIHZhbGlkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2YWxpZGF0ZUV4aXN0aW5nVG9rZW5BZ2FpbnN0Q29uZmlncygpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3MuZGlzYWJsZVN0YXJ0dXBUb2tlblZhbGlkYXRpb24pIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMud2luZG93LnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2FjY2Vzc190b2tlbicpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZ3JhbnRlZFNjb3BlczogQXJyYXk8c3RyaW5nPiA9ICB0aGlzLm9BdXRoU2VydmljZS5nZXRHcmFudGVkU2NvcGVzKCkgYXMgQXJyYXk8c3RyaW5nPjtcclxuICAgIGNvbnN0IGNvbmZpZ3VyZWRTY29wZXMgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3Muc2NvcGUuc3BsaXQoJyAnKTtcclxuICAgIGNvbnN0IGRpZmZzID0gZ3JhbnRlZFNjb3Blcy5maWx0ZXIoeCA9PiAhY29uZmlndXJlZFNjb3Blcy5pbmNsdWRlcyh4KSlcclxuICAgICAgLmNvbmNhdChjb25maWd1cmVkU2NvcGVzLmZpbHRlcih4ID0+ICFncmFudGVkU2NvcGVzLmluY2x1ZGVzKHgpKSk7XHJcbiAgICBpZiAoZGlmZnMubGVuZ3RoIHx8IHRoaXMub0F1dGhTZXJ2aWNlLmdldElkZW50aXR5Q2xhaW1zKClbJ2F1ZCddICE9PSB0aGlzLmNvbmZpZ1NlcnZpY2UuY29uZmlnLm9BdXRoU2V0dGluZ3MuY2xpZW50SWQpIHtcclxuICAgICAgdGhpcy53aW5kb3cuc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnYWNjZXNzX3Rva2VuJyk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLyoqIEdldHRpbmcgdGhlIHN1YmRvbWFpbiBmcm9tIHVybCAqL1xyXG4gIHByaXZhdGUgZ2V0U3ViZG9tYWluKCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkb21haW4gPSB0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZTtcclxuICAgIGlmIChkb21haW4uaW5kZXhPZignLicpIDwgMCB8fFxyXG4gICAgICBkb21haW4uc3BsaXQoJy4nKVswXSA9PT0gdGhpcy5leGFtcGxlU3ViZG9tYWluIHx8IGRvbWFpbi5zcGxpdCgnLicpWzBdID09PSB0aGlzLmx2aFN1YnN0cmluZyB8fCBkb21haW4uc3BsaXQoJy4nKVswXSA9PT0gdGhpcy53d3dTdWJzdHJpbmcpIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGRvbWFpbi5zcGxpdCgnLicpWzBdO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9zcmMvbGliL2NvcmUvbW9kZWxzL2Jhc2UtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaGVtZVBhbGV0dGVNb2RlbCB9IGZyb20gJy4uL2NsaWVudC1nZW5lcmF0ZWQvbW9kZWwvdGhlbWVQYWxldHRlTW9kZWwnO1xyXG5pbXBvcnQgeyBIZWFkZXJDb25maWcgfSBmcm9tICcuL2hlYWRlci1jb25maWcnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ29uZmlnIH0gZnJvbSAnLi9uYXZpZ2F0aW9uLWNvbmZpZyc7XHJcbmltcG9ydCB7IE9pZGNBdXRoU2V0dGluZ3MgfSBmcm9tICcuL29pZGMtYXV0aC1zZXR0aW5ncyc7XHJcblxyXG4vKiogVGhlIGJhc2UgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgKi9cclxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29uZmlnIHtcclxuICAgIC8qKiBUaGUgb2lkYyBzZXR0aW5ncyAqL1xyXG4gICAgb0F1dGhTZXR0aW5nczogT2lkY0F1dGhTZXR0aW5ncztcclxuXHJcbiAgICAvKiogVGhlIGhlYWRlciBjb25maWd1cmF0aW9ucyAqL1xyXG4gICAgaGVhZGVyOiBIZWFkZXJDb25maWc7XHJcblxyXG4gICAgLyoqIFRoZSB0aGVtZSBwYWxldHRlICovXHJcbiAgICB0aGVtZTogVGhlbWVQYWxldHRlTW9kZWw7XHJcblxyXG4gICAgLyoqIFRoZSBuYXZpZ2F0aW9uIGNvbmZpZyAqL1xyXG4gICAgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkNvbmZpZztcclxufVxyXG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcm1hdHVyZS9zcmMvbGliL2NvcmUvbW9kZWxzL2Jhc2UtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaGVtZVBhbGV0dGVNb2RlbCB9IGZyb20gJy4uL2NsaWVudC1nZW5lcmF0ZWQvbW9kZWwvdGhlbWVQYWxldHRlTW9kZWwnO1xyXG5pbXBvcnQgeyBIZWFkZXJDb25maWcgfSBmcm9tICcuL2hlYWRlci1jb25maWcnO1xyXG5pbXBvcnQgeyBOYXZpZ2F0aW9uQ29uZmlnIH0gZnJvbSAnLi9uYXZpZ2F0aW9uLWNvbmZpZyc7XHJcbmltcG9ydCB7IE9pZGNBdXRoU2V0dGluZ3MgfSBmcm9tICcuL29pZGMtYXV0aC1zZXR0aW5ncyc7XHJcbmltcG9ydCB7IFN1YmRvbWFpbkNvbmZpZyB9IGZyb20gJy4vc3ViZG9tYWluLWNvbmZpZyc7XHJcblxyXG4vKiogVGhlIGJhc2UgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UgKi9cclxuZXhwb3J0IGludGVyZmFjZSBCYXNlQ29uZmlnIHtcclxuICAgIC8qKiBUaGUgb2lkYyBzZXR0aW5ncyAqL1xyXG4gICAgb0F1dGhTZXR0aW5nczogT2lkY0F1dGhTZXR0aW5ncztcclxuXHJcbiAgICAvKiogVGhlIGhlYWRlciBjb25maWd1cmF0aW9ucyAqL1xyXG4gICAgaGVhZGVyOiBIZWFkZXJDb25maWc7XHJcblxyXG4gICAgLyoqIFRoZSB0aGVtZSBwYWxldHRlICovXHJcbiAgICB0aGVtZTogVGhlbWVQYWxldHRlTW9kZWw7XHJcblxyXG4gICAgLyoqIFRoZSBuYXZpZ2F0aW9uIGNvbmZpZyAqL1xyXG4gICAgbmF2aWdhdGlvbjogTmF2aWdhdGlvbkNvbmZpZztcclxuXHJcbiAgICAvKiogVGhlIHN1YiBkb21haW4gY29uZmlndXJhdGlvbnMgKi9cclxuICAgIHN1YmRvbWFpbj86IFN1YmRvbWFpbkNvbmZpZztcclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZG9tYWluLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9saWIvY29yZS9tb2RlbHMvc3ViZG9tYWluLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFRoZSBzdWJkb21haW4gY29uZmlndXJhdGlvbnMgKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdWJkb21haW5Db25maWcge1xyXG4gICAgLyoqIFRydWUgd2hlbiB0aGUgc3ViZG9tYWluIGNvbmZpZ3VyYXRpb24gbXVzdCBleGlzdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGxvYWQgKi9cclxuICAgIHJlcXVpcmVDb25maWd1cmVkU3ViZG9tYWluPzogYm9vbGVhbjtcclxuICAgIC8qKiB0aGUgY29uZmlndXJlZCBzdWJkb21haW5zIGZvciB0aGUgYXBwbGljYXRpb24gKi9cclxuICAgIHN1YmRvbWFpbnM/OiBBcnJheTxzdHJpbmc+O1xyXG59Il19
@@ -14,6 +14,7 @@ export * from './lib/core/models/user-entity-service-config';
14
14
  export * from './lib/core/client-generated/model/models';
15
15
  export * from './lib/core/functions/guid';
16
16
  export * from './lib/core/functions/naming-convention';
17
+ export * from './lib/core/functions/route-to-pre-login-route';
17
18
  export * from './lib/core/initializer/abstract-startup-service';
18
19
  export * from './lib/core/services/base-config.service';
19
20
  export * from './lib/core/services/default-config.service';
@@ -21,6 +22,7 @@ export * from './lib/core/models/base-config';
21
22
  export * from './lib/core/models/oidc-auth-settings';
22
23
  export * from './lib/core/models/header-config';
23
24
  export * from './lib/core/models/navigation-config';
25
+ export * from './lib/core/models/subdomain-config';
24
26
  export * from './lib/core/services/custom-auth-config.service';
25
27
  export * from './lib/core/components/app-template/app-template.component';
26
28
  export * from './lib/core/services/banner.service';
@@ -46,4 +48,4 @@ export * from './lib/component-save-print/sof-ar-component-save-print.module';
46
48
  export * from './lib/component-save-print/components/component-save-print/component-save-print.component';
47
49
  export * from './lib/component-save-print/services/component-save-print.service';
48
50
  export * from './lib/rbac/services/tokens';
49
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDO0FBRXRDLE9BQU87QUFDUCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywyQ0FBMkMsQ0FBQztBQUUxRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsaURBQWlELENBQUM7QUFDaEUsY0FBYyx5Q0FBeUMsQ0FBQztBQUN4RCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxnREFBZ0QsQ0FBQTtBQUM5RCxjQUFjLDJEQUEyRCxDQUFDO0FBQzFFLGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsT0FBTyxFQUNILGNBQWMsRUFDZCxNQUFNLEVBQ04sMEJBQTBCLEVBQzFCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDckIsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxVQUFVO0FBQ1YsY0FBYywrQ0FBK0MsQ0FBQztBQUM5RCxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxpQ0FBaUMsQ0FBQztBQUNoRCxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLDBDQUEwQyxDQUFDO0FBQ3pELGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx1Q0FBdUMsQ0FBQztBQUV0RCxjQUFjLCtEQUErRCxDQUFDO0FBQzlFLGNBQWMsMkZBQTJGLENBQUM7QUFDMUcsY0FBYyxrRUFBa0UsQ0FBQztBQUNqRixjQUFjLDRCQUE0QixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBhcm1hdHVyZSAqL1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9hcm1hdHVyZS5tb2R1bGUnO1xyXG5cclxuLy8gY29yZVxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL3Nlc3Npb24uc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvc2VydmljZXMvdXNlci1lbnRpdHkuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvc2VydmljZXMvYXV0aG9yaXphdGlvbi5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL2RhdGEtc3RvcmUtY29uZmlnJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvdHlwZWQtc2Vzc2lvbic7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL2h0dHAtdmVyYnMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9zZXNzaW9uLWNvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL3JvdXRlLXBhdGgnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9zdHlsZXMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy91c2VyLWVudGl0eS1zZXJ2aWNlLWNvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvY2xpZW50LWdlbmVyYXRlZC9tb2RlbC9tb2RlbHMnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL2Z1bmN0aW9ucy9ndWlkJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9mdW5jdGlvbnMvbmFtaW5nLWNvbnZlbnRpb24nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL2luaXRpYWxpemVyL2Fic3RyYWN0LXN0YXJ0dXAtc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvc2VydmljZXMvYmFzZS1jb25maWcuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvc2VydmljZXMvZGVmYXVsdC1jb25maWcuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL2Jhc2UtY29uZmlnJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvb2lkYy1hdXRoLXNldHRpbmdzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvaGVhZGVyLWNvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL25hdmlnYXRpb24tY29uZmlnJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9zZXJ2aWNlcy9jdXN0b20tYXV0aC1jb25maWcuc2VydmljZSdcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9jb21wb25lbnRzL2FwcC10ZW1wbGF0ZS9hcHAtdGVtcGxhdGUuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9zZXJ2aWNlcy9iYW5uZXIuc2VydmljZSc7XHJcbmV4cG9ydCB7XHJcbiAgICBTRVNTSU9OX0NPTkZJRyxcclxuICAgIFdJTkRPVyxcclxuICAgIFVTRVJfRU5USVRZX1NFUlZJQ0VfQ09ORklHLFxyXG4gICAgcHJlU2lnbkluUm91dGVTdG9yYWdlS2V5LFxyXG4gICAgbGFuZ3VhZ2VTdG9yYWdlS2V5XHJcbn0gZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvY29uc3RhbnRzJztcclxuXHJcbi8vIG1vZHVsZXNcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZGlzdHJpYnV0ZWQtY2FjaGUvZGlzdHJpYnV0ZWQtY2FjaGUtYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZXJyb3IvZXJyb3ItYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZmFxL2ZhcS1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mb290ZXIvZm9vdGVyLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvcm1zL2Zvcm1zLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2hlYWRlci9oZWFkZXItYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvbmF2aWdhdGlvbi9uYXZpZ2F0aW9uLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL29hdXRoL29hdXRoLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JiYWMvcmJhYy1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9ydW0vcnVtLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NhbWwvc2FtbC1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi90aGVtaW5nL3RoZW1lLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2FsZXJ0LWJhbm5lci9hbGVydC1iYW5uZXItYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYmFzZS1jb21wb25lbnRzL2Jhc2UtY29tcG9uZW50LWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NvZi1waXBlL3NvZi1waXBlLmFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3Jlc2l6ZS1wYW5lbHMvcmVzaXplLXBhbmVscy1hcGknO1xyXG5cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50LXNhdmUtcHJpbnQvc29mLWFyLWNvbXBvbmVudC1zYXZlLXByaW50Lm1vZHVsZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvbXBvbmVudC1zYXZlLXByaW50L2NvbXBvbmVudHMvY29tcG9uZW50LXNhdmUtcHJpbnQvY29tcG9uZW50LXNhdmUtcHJpbnQuY29tcG9uZW50JztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50LXNhdmUtcHJpbnQvc2VydmljZXMvY29tcG9uZW50LXNhdmUtcHJpbnQuc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JiYWMvc2VydmljZXMvdG9rZW5zJ1xyXG4iXX0=
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FybWF0dXJlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyxjQUFjLHVCQUF1QixDQUFDO0FBRXRDLE9BQU87QUFDUCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMseUNBQXlDLENBQUM7QUFDeEQsY0FBYywyQ0FBMkMsQ0FBQztBQUUxRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLGtDQUFrQyxDQUFDO0FBQ2pELGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsMENBQTBDLENBQUM7QUFDekQsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyxpREFBaUQsQ0FBQztBQUNoRSxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMsZ0RBQWdELENBQUE7QUFDOUQsY0FBYywyREFBMkQsQ0FBQztBQUMxRSxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELE9BQU8sRUFDSCxjQUFjLEVBQ2QsTUFBTSxFQUNOLDBCQUEwQixFQUMxQix3QkFBd0IsRUFDeEIsa0JBQWtCLEVBQ3JCLE1BQU0sNkJBQTZCLENBQUM7QUFFckMsVUFBVTtBQUNWLGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG1CQUFtQixDQUFDO0FBQ2xDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYywwQ0FBMEMsQ0FBQztBQUN6RCxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsdUNBQXVDLENBQUM7QUFFdEQsY0FBYywrREFBK0QsQ0FBQztBQUM5RSxjQUFjLDJGQUEyRixDQUFDO0FBQzFHLGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyw0QkFBNEIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgYXJtYXR1cmUgKi9cclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYXJtYXR1cmUubW9kdWxlJztcclxuXHJcbi8vIGNvcmVcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9zZXJ2aWNlcy9zZXNzaW9uLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL3VzZXItZW50aXR5LnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL2F1dGhvcml6YXRpb24uc2VydmljZSc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9kYXRhLXN0b3JlLWNvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL3R5cGVkLXNlc3Npb24nO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9odHRwLXZlcmJzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvc2Vzc2lvbi1jb25maWcnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9yb3V0ZS1wYXRoJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvc3R5bGVzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9tb2RlbHMvdXNlci1lbnRpdHktc2VydmljZS1jb25maWcnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL2NsaWVudC1nZW5lcmF0ZWQvbW9kZWwvbW9kZWxzJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9mdW5jdGlvbnMvZ3VpZCc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvZnVuY3Rpb25zL25hbWluZy1jb252ZW50aW9uJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9mdW5jdGlvbnMvcm91dGUtdG8tcHJlLWxvZ2luLXJvdXRlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29yZS9pbml0aWFsaXplci9hYnN0cmFjdC1zdGFydHVwLXNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL2Jhc2UtY29uZmlnLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL2RlZmF1bHQtY29uZmlnLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9iYXNlLWNvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL29pZGMtYXV0aC1zZXR0aW5ncyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL2hlYWRlci1jb25maWcnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9uYXZpZ2F0aW9uLWNvbmZpZyc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2NvcmUvbW9kZWxzL3N1YmRvbWFpbi1jb25maWcnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL2N1c3RvbS1hdXRoLWNvbmZpZy5zZXJ2aWNlJ1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL2NvbXBvbmVudHMvYXBwLXRlbXBsYXRlL2FwcC10ZW1wbGF0ZS5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb3JlL3NlcnZpY2VzL2Jhbm5lci5zZXJ2aWNlJztcclxuZXhwb3J0IHtcclxuICAgIFNFU1NJT05fQ09ORklHLFxyXG4gICAgV0lORE9XLFxyXG4gICAgVVNFUl9FTlRJVFlfU0VSVklDRV9DT05GSUcsXHJcbiAgICBwcmVTaWduSW5Sb3V0ZVN0b3JhZ2VLZXksXHJcbiAgICBsYW5ndWFnZVN0b3JhZ2VLZXlcclxufSBmcm9tICcuL2xpYi9jb3JlL21vZGVscy9jb25zdGFudHMnO1xyXG5cclxuLy8gbW9kdWxlc1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9kaXN0cmlidXRlZC1jYWNoZS9kaXN0cmlidXRlZC1jYWNoZS1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9lcnJvci9lcnJvci1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9mYXEvZmFxLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL2Zvb3Rlci9mb290ZXItYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvZm9ybXMvZm9ybXMtYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvaGVhZGVyL2hlYWRlci1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9uYXZpZ2F0aW9uL25hdmlnYXRpb24tYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvb2F1dGgvb2F1dGgtYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvcmJhYy9yYmFjLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3J1bS9ydW0tYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc2FtbC9zYW1sLWFwaSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbGliL3RoZW1pbmcvdGhlbWUtYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvYWxlcnQtYmFubmVyL2FsZXJ0LWJhbm5lci1hcGknO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9iYXNlLWNvbXBvbmVudHMvYmFzZS1jb21wb25lbnQtYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvc29mLXBpcGUvc29mLXBpcGUuYXBpJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvcmVzaXplLXBhbmVscy9yZXNpemUtcGFuZWxzLWFwaSc7XHJcblxyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnQtc2F2ZS1wcmludC9zb2YtYXItY29tcG9uZW50LXNhdmUtcHJpbnQubW9kdWxlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvY29tcG9uZW50LXNhdmUtcHJpbnQvY29tcG9uZW50cy9jb21wb25lbnQtc2F2ZS1wcmludC9jb21wb25lbnQtc2F2ZS1wcmludC5jb21wb25lbnQnO1xyXG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb21wb25lbnQtc2F2ZS1wcmludC9zZXJ2aWNlcy9jb21wb25lbnQtc2F2ZS1wcmludC5zZXJ2aWNlJztcclxuZXhwb3J0ICogZnJvbSAnLi9saWIvcmJhYy9zZXJ2aWNlcy90b2tlbnMnXHJcbiJdfQ==
@@ -14,7 +14,7 @@ import * as i2 from '@ngx-translate/core';
14
14
  import { TranslateModule, TranslateService } from '@ngx-translate/core';
15
15
  import * as i3 from '@angular/flex-layout/flex';
16
16
  import * as i4 from '@angular/flex-layout/extended';
17
- import { BehaviorSubject, of, Subscription, throwError, ReplaySubject } from 'rxjs';
17
+ import { BehaviorSubject, of, Subscription, lastValueFrom, throwError, ReplaySubject } from 'rxjs';
18
18
  import { STEPPER_GLOBAL_OPTIONS } from '@angular/cdk/stepper';
19
19
  import { map, catchError, filter, switchMap, take, share, first } from 'rxjs/operators';
20
20
  import * as i1$2 from '@angular/cdk/layout';
@@ -2310,7 +2310,7 @@ class Initializer {
2310
2310
  * @param location The location
2311
2311
  * @param customAuthConfigService The service that will configure the auth config
2312
2312
  */
2313
- constructor(http, translateService, themeService, configService, oAuthService, router, location, customAuthConfigService) {
2313
+ constructor(http, translateService, themeService, configService, oAuthService, router, location, customAuthConfigService, _window) {
2314
2314
  this.http = http;
2315
2315
  this.translateService = translateService;
2316
2316
  this.themeService = themeService;
@@ -2319,9 +2319,17 @@ class Initializer {
2319
2319
  this.router = router;
2320
2320
  this.location = location;
2321
2321
  this.customAuthConfigService = customAuthConfigService;
2322
+ this._window = _window;
2322
2323
  /** The configuration behavior subject */
2323
2324
  this.isInitializedBs = new BehaviorSubject(false);
2325
+ /** The example the subdomain substring */
2326
+ this.exampleSubdomain = 'example';
2327
+ /** The www substring for subdomain route finding */
2328
+ this.wwwSubstring = 'www';
2329
+ /** The lvh substring for subdomain route finding */
2330
+ this.lvhSubstring = 'lvh';
2324
2331
  this.isInitialized$ = this.isInitializedBs.asObservable();
2332
+ this.window = _window || window;
2325
2333
  }
2326
2334
  /**
2327
2335
  * Loads all data that is needed upon initial loading of the website
@@ -2331,7 +2339,7 @@ class Initializer {
2331
2339
  // reads the language from local storage set in the parent app
2332
2340
  // language loading
2333
2341
  // Set languages for translation service
2334
- const lang = window.localStorage.getItem(languageStorageKey) || window.sessionStorage.getItem(languageStorageKey) || 'en';
2342
+ const lang = this.window.localStorage.getItem(languageStorageKey) || this.window.sessionStorage.getItem(languageStorageKey) || 'en';
2335
2343
  this.translateService.setDefaultLang(lang);
2336
2344
  this.translateService.use(lang);
2337
2345
  // Adapted from https://stackoverflow.com/a/41636880
@@ -2340,7 +2348,7 @@ class Initializer {
2340
2348
  // a resolve callback used resolve the promise with a value or the result of another promise,
2341
2349
  // and a reject callback used to reject the promise with a provided reason or error.
2342
2350
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
2343
- var _a;
2351
+ var _a, _b, _c;
2344
2352
  // Go through all services and complete any API calls necessary.
2345
2353
  // At the end, if all works and loads as expected, resolve the promise and set startup success to true.
2346
2354
  // If an issue is encountered, you can call reject() to hit the catch() code below.
@@ -2355,11 +2363,44 @@ class Initializer {
2355
2363
  this.http.get('./assets/configurations/theme.json').toPromise()
2356
2364
  ]);
2357
2365
  this.configService.config = _.mergeWith(baseConfig, overrideConfig, this.mergeCustomizer);
2358
- const configSnapShot = this.configService.config;
2359
- configSnapShot.theme = theme;
2360
- this.configService.config = configSnapShot;
2361
- this.translateService.setTranslation(this.translateService.currentLang, _.mergeWith(baseLang, overrideLang, this.mergeCustomizer));
2362
- this.themeService.initPalette(theme);
2366
+ const mergedLanguage = _.mergeWith(baseLang, overrideLang, this.mergeCustomizer);
2367
+ this.translateService.setTranslation(this.translateService.currentLang, mergedLanguage);
2368
+ const configurePartial = () => {
2369
+ const configSnapShot = this.configService.config;
2370
+ configSnapShot.theme = theme;
2371
+ this.configService.config = configSnapShot;
2372
+ this.themeService.initPalette(theme);
2373
+ };
2374
+ const subdomain = this.getSubdomain();
2375
+ if (subdomain) {
2376
+ try {
2377
+ let [subdomainConfigs, subdomainLanguage] = yield Promise.all([
2378
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.${this.translateService.currentLang}.json`)),
2379
+ lastValueFrom(this.http.get(`./assets/configurations/${subdomain}.appsettings.json`))
2380
+ ]);
2381
+ this.configService.config = _.mergeWith(this.configService.config, subdomainConfigs, this.mergeCustomizer);
2382
+ this.translateService.setTranslation(this.translateService.currentLang, _.mergeWith(mergedLanguage, subdomainLanguage, this.mergeCustomizer));
2383
+ configurePartial();
2384
+ }
2385
+ catch (e) {
2386
+ if (this.configService.config.subdomain && this.configService.config.subdomain.subdomains.length && !this.configService.config.subdomain.subdomains.includes(subdomain)) {
2387
+ this.router.dispose();
2388
+ const error = `Invalid subdomain: ${subdomain}`;
2389
+ console.error(error);
2390
+ throw new Error(error);
2391
+ }
2392
+ else if (((_a = this.configService.config.subdomain) === null || _a === void 0 ? void 0 : _a.requireConfiguredSubdomain) && ((_b = this.configService.config.subdomain) === null || _b === void 0 ? void 0 : _b.subdomains.includes(subdomain))) {
2393
+ this.router.dispose();
2394
+ const error = `Configured subdomain: ${subdomain} does not have any subdomain specific configurations`;
2395
+ reject(error);
2396
+ console.error(error);
2397
+ throw new Error(error);
2398
+ }
2399
+ }
2400
+ }
2401
+ else {
2402
+ configurePartial();
2403
+ }
2363
2404
  }
2364
2405
  catch (error) {
2365
2406
  // Catch any errors during the get configurations API call
@@ -2389,7 +2430,7 @@ class Initializer {
2389
2430
  return throwError(error);
2390
2431
  }
2391
2432
  // Navigate to the requested route
2392
- if ((_a = this.configService.config.oAuthSettings) === null || _a === void 0 ? void 0 : _a.preserveRoute) {
2433
+ if ((_c = this.configService.config.oAuthSettings) === null || _c === void 0 ? void 0 : _c.preserveRoute) {
2393
2434
  this.router.navigateByUrl(this.oAuthService.state);
2394
2435
  }
2395
2436
  this.isInitializedBs.next(true);
@@ -2443,8 +2484,12 @@ class Initializer {
2443
2484
  */
2444
2485
  login(config) {
2445
2486
  return __awaiter(this, void 0, void 0, function* () {
2446
- this.validateExistingTokenAgainstConfigs();
2447
- if (config.requireLoginOnStartup) {
2487
+ const isValid = this.validateExistingTokenAgainstConfigs();
2488
+ const preservedRoute = this.window.sessionStorage.getItem(preSignInRouteStorageKey);
2489
+ if (!preservedRoute) {
2490
+ this.window.sessionStorage.setItem(preSignInRouteStorageKey, this.location.path());
2491
+ }
2492
+ if (config.requireLoginOnStartup || !isValid) {
2448
2493
  return this.oAuthService.loadDiscoveryDocumentAndLogin({ state: this.location.path() })
2449
2494
  // handles the case for expired access token or invalid nonce or people bookmarking the ids login page
2450
2495
  .catch((res) => __awaiter(this, void 0, void 0, function* () {
@@ -2473,25 +2518,40 @@ class Initializer {
2473
2518
  return srcValue;
2474
2519
  }
2475
2520
  }
2476
- /** Validates the existing token against the configurations */
2521
+ /**
2522
+ * Validates the existing token against the configurations
2523
+ * @returns true when token is valid
2524
+ */
2477
2525
  validateExistingTokenAgainstConfigs() {
2478
2526
  if (this.configService.config.oAuthSettings.disableStartupTokenValidation) {
2479
- return;
2527
+ return true;
2480
2528
  }
2481
- if (!window.sessionStorage.getItem('access_token')) {
2482
- return;
2529
+ if (!this.window.sessionStorage.getItem('access_token')) {
2530
+ return true;
2483
2531
  }
2484
- const grantedScopes = this.oAuthService.getGrantedScopes()[0]
2485
- .split(' ');
2532
+ const grantedScopes = this.oAuthService.getGrantedScopes();
2486
2533
  const configuredScopes = this.configService.config.oAuthSettings.scope.split(' ');
2487
2534
  const diffs = grantedScopes.filter(x => !configuredScopes.includes(x))
2488
2535
  .concat(configuredScopes.filter(x => !grantedScopes.includes(x)));
2489
2536
  if (diffs.length || this.oAuthService.getIdentityClaims()['aud'] !== this.configService.config.oAuthSettings.clientId) {
2490
- window.sessionStorage.removeItem('access_token');
2537
+ this.window.sessionStorage.removeItem('access_token');
2538
+ return false;
2539
+ }
2540
+ return true;
2541
+ }
2542
+ /** Getting the subdomain from url */
2543
+ getSubdomain() {
2544
+ const domain = this.window.location.hostname;
2545
+ if (domain.indexOf('.') < 0 ||
2546
+ domain.split('.')[0] === this.exampleSubdomain || domain.split('.')[0] === this.lvhSubstring || domain.split('.')[0] === this.wwwSubstring) {
2547
+ return '';
2548
+ }
2549
+ else {
2550
+ return domain.split('.')[0];
2491
2551
  }
2492
2552
  }
2493
2553
  }
2494
- Initializer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, deps: [{ token: i2$1.HttpClient }, { token: i2.TranslateService }, { token: ThemeService }, { token: BaseConfigService }, { token: i1$1.OAuthService }, { token: i1$3.Router }, { token: i1.Location }, { token: CustomAuthConfigService, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
2554
+ Initializer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, deps: [{ token: i2$1.HttpClient }, { token: i2.TranslateService }, { token: ThemeService }, { token: BaseConfigService }, { token: i1$1.OAuthService }, { token: i1$3.Router }, { token: i1.Location }, { token: CustomAuthConfigService, optional: true }, { token: WINDOW, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
2495
2555
  Initializer.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, providedIn: 'root' });
2496
2556
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImport: i0, type: Initializer, decorators: [{
2497
2557
  type: Injectable,
@@ -2501,6 +2561,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
2501
2561
  }], ctorParameters: function () {
2502
2562
  return [{ type: i2$1.HttpClient }, { type: i2.TranslateService }, { type: ThemeService }, { type: BaseConfigService }, { type: i1$1.OAuthService }, { type: i1$3.Router }, { type: i1.Location }, { type: CustomAuthConfigService, decorators: [{
2503
2563
  type: Optional
2564
+ }] }, { type: undefined, decorators: [{
2565
+ type: Optional
2566
+ }, {
2567
+ type: Inject,
2568
+ args: [WINDOW]
2504
2569
  }] }];
2505
2570
  } });
2506
2571
 
@@ -5293,6 +5358,18 @@ var ApplicationUserModel;
5293
5358
  };
5294
5359
  })(ApplicationUserModel || (ApplicationUserModel = {}));
5295
5360
 
5361
+ /**
5362
+ * Routes to the pre login in route
5363
+ * @param router The router
5364
+ */
5365
+ const routeToPreLoginRoute = (router) => {
5366
+ const preservedRoute = window.sessionStorage.getItem(preSignInRouteStorageKey);
5367
+ if (preservedRoute) {
5368
+ router.navigateByUrl(preservedRoute);
5369
+ window.sessionStorage.removeItem(preSignInRouteStorageKey);
5370
+ }
5371
+ };
5372
+
5296
5373
  const BASE_PATH = new InjectionToken('basePath');
5297
5374
  const COLLECTION_FORMATS = {
5298
5375
  'csv': ',',
@@ -7191,5 +7268,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.7", ngImpor
7191
7268
  * Generated bundle index. Do not edit.
7192
7269
  */
7193
7270
 
7194
- export { ALERT_BANNER_CONFIG, AbstractSamlEntryService, AbstractSamlService, AbstractStartupService, AccessTokenClaims, AlertBannerComponent, AlertBannerModule, AlertBannerService, AlertService, AlphaNumericDirective, AppTemplateComponent, ApplicationUserModel, ArRoleNavService, ArmError, ArmatureFooterComponent, ArmatureFooterModule, ArmatureHeaderComponent, ArmatureHeaderModule, ArmatureModule, ArmatureNavigationComponent, ArmatureResizePanelsModule, Attribute, AuthorizationService, BannerService, BannerType, BaseComponentModule, BaseConfigService, CacheExpirationType, ComponentSavePrintComponent, ComponentSavePrintService, Configuration, ConfirmAddressData, CoverageDetail, CssOverride, CssOverrideDirective, CustomAuthConfigService, DISABLE_ACCESS_FOR_NO_PAGES_ROLE, DISTRIBUTED_CACHE_BASE_PATH, DataStoreConfig, DecodedAccessToken, DefaultConfigService, DialogResult, DistributedCacheModule, ErrorCommonComponent, ErrorCommonConfig, ErrorModule, FAQ, FAQConfig, FaqComponent, FaqModule, FooterConfig, FormsModule, HYBRID_SAML_OAUTH_CONFIG, HeaderAuthSettings, HybridSamlOAuthConfig, HybridSamlOauthService, InputTrimDirective, LettersCharactersDirective, LettersOnlyDirective, MobileHeaderMenuComponent, ModalData, NavigationModule, NumbersOnlyDirective, Oauth2RoleService, OauthModule, PhoneFormatPipe, PolicyPerson, RBAC_CONFIG, RbacActionDirective, RbacConfig, RbacModule, RedirectSamlComponent, RedirectSamlRequest, RedirectSessionConfigs, ResizePanelsComponent, RoleAccess, RoleNavService, RoutePath, RumConfig, RumModule, RumService, SESSION_CONFIG, SOF_BLANK_LANGUAGE_OVERRIDE, SOF_DATE_PIPE_FORMATS, SamlModule, SamlService, ServerCacheService, SessionConfig, SessionService, SharedErrorService, SiteMapComponent, SiteMapDirection, SofAddressComponent, SofAlertComponent, SofArComponentSavePrintModule, SofBadgeComponent, SofBannerComponent, SofBlankPipe, SofButtonToggleGroupComponent, SofConfirmAddressComponent, SofDatePipe, SofImageCheckboxComponent, SofModalComponent, SofPipeModule, SofProgressBarComponent, SofRadioCardComponent, SofSimpleAlertComponent, SofSsnPipe, SofStarRatingComponent, SoftheonErrorHandlerService, SsoGatewayEntryService, SsoGatewayModel, States, ThemeModule, ThemeService, TypedSession, USER_ENTITY_SERVICE_CONFIG, UserEntityService, UserEntityServiceConfig, ValidationKeys, WINDOW, httpVerb, initializerFactory, keyPathPrefix, languageStorageKey, newGuid, pascalToCamel, preSignInRouteStorageKey, sessionBasePathFactory };
7271
+ export { ALERT_BANNER_CONFIG, AbstractSamlEntryService, AbstractSamlService, AbstractStartupService, AccessTokenClaims, AlertBannerComponent, AlertBannerModule, AlertBannerService, AlertService, AlphaNumericDirective, AppTemplateComponent, ApplicationUserModel, ArRoleNavService, ArmError, ArmatureFooterComponent, ArmatureFooterModule, ArmatureHeaderComponent, ArmatureHeaderModule, ArmatureModule, ArmatureNavigationComponent, ArmatureResizePanelsModule, Attribute, AuthorizationService, BannerService, BannerType, BaseComponentModule, BaseConfigService, CacheExpirationType, ComponentSavePrintComponent, ComponentSavePrintService, Configuration, ConfirmAddressData, CoverageDetail, CssOverride, CssOverrideDirective, CustomAuthConfigService, DISABLE_ACCESS_FOR_NO_PAGES_ROLE, DISTRIBUTED_CACHE_BASE_PATH, DataStoreConfig, DecodedAccessToken, DefaultConfigService, DialogResult, DistributedCacheModule, ErrorCommonComponent, ErrorCommonConfig, ErrorModule, FAQ, FAQConfig, FaqComponent, FaqModule, FooterConfig, FormsModule, HYBRID_SAML_OAUTH_CONFIG, HeaderAuthSettings, HybridSamlOAuthConfig, HybridSamlOauthService, InputTrimDirective, LettersCharactersDirective, LettersOnlyDirective, MobileHeaderMenuComponent, ModalData, NavigationModule, NumbersOnlyDirective, Oauth2RoleService, OauthModule, PhoneFormatPipe, PolicyPerson, RBAC_CONFIG, RbacActionDirective, RbacConfig, RbacModule, RedirectSamlComponent, RedirectSamlRequest, RedirectSessionConfigs, ResizePanelsComponent, RoleAccess, RoleNavService, RoutePath, RumConfig, RumModule, RumService, SESSION_CONFIG, SOF_BLANK_LANGUAGE_OVERRIDE, SOF_DATE_PIPE_FORMATS, SamlModule, SamlService, ServerCacheService, SessionConfig, SessionService, SharedErrorService, SiteMapComponent, SiteMapDirection, SofAddressComponent, SofAlertComponent, SofArComponentSavePrintModule, SofBadgeComponent, SofBannerComponent, SofBlankPipe, SofButtonToggleGroupComponent, SofConfirmAddressComponent, SofDatePipe, SofImageCheckboxComponent, SofModalComponent, SofPipeModule, SofProgressBarComponent, SofRadioCardComponent, SofSimpleAlertComponent, SofSsnPipe, SofStarRatingComponent, SoftheonErrorHandlerService, SsoGatewayEntryService, SsoGatewayModel, States, ThemeModule, ThemeService, TypedSession, USER_ENTITY_SERVICE_CONFIG, UserEntityService, UserEntityServiceConfig, ValidationKeys, WINDOW, httpVerb, initializerFactory, keyPathPrefix, languageStorageKey, newGuid, pascalToCamel, preSignInRouteStorageKey, routeToPreLoginRoute, sessionBasePathFactory };
7195
7272
  //# sourceMappingURL=softheon-armature.mjs.map