@arsedizioni/ars-utils 18.5.62 → 19.0.2
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/fesm2022/arsedizioni-ars-utils-clipper.common.mjs +10 -10
- package/fesm2022/arsedizioni-ars-utils-clipper.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs +41 -41
- package/fesm2022/arsedizioni-ars-utils-clipper.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-core.mjs +99 -99
- package/fesm2022/arsedizioni-ars-utils-core.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs +10 -10
- package/fesm2022/arsedizioni-ars-utils-evolution.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-help.mjs +13 -13
- package/fesm2022/arsedizioni-ars-utils-help.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs +10 -10
- package/fesm2022/arsedizioni-ars-utils-support.common.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-support.ui.mjs +6 -6
- package/fesm2022/arsedizioni-ars-utils-support.ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-tinymce.mjs +7 -7
- package/fesm2022/arsedizioni-ars-utils-tinymce.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs +58 -58
- package/fesm2022/arsedizioni-ars-utils-ui.application.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.mjs +34 -34
- package/fesm2022/arsedizioni-ars-utils-ui.mjs.map +1 -1
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs +7 -7
- package/fesm2022/arsedizioni-ars-utils-ui.oauth.mjs.map +1 -1
- package/package.json +5 -29
- package/esm2022/arsedizioni-ars-utils.mjs +0 -5
- package/esm2022/clipper.common/arsedizioni-ars-utils-clipper.common.mjs +0 -5
- package/esm2022/clipper.common/common/common.module.mjs +0 -16
- package/esm2022/clipper.common/common/definitions.mjs +0 -2041
- package/esm2022/clipper.common/common/interceptors/auth.interceptor.mjs +0 -100
- package/esm2022/clipper.common/common/messages.mjs +0 -36
- package/esm2022/clipper.common/common/services/clipper.service.mjs +0 -1011
- package/esm2022/clipper.common/public_api.mjs +0 -5
- package/esm2022/clipper.ui/arsedizioni-ars-utils-clipper.ui.mjs +0 -5
- package/esm2022/clipper.ui/documents.mjs +0 -50
- package/esm2022/clipper.ui/public_api.mjs +0 -18
- package/esm2022/clipper.ui/ui/browser-dialog/browser-dialog.component.mjs +0 -766
- package/esm2022/clipper.ui/ui/document/document.component.mjs +0 -688
- package/esm2022/clipper.ui/ui/document-index/document-index.component.mjs +0 -118
- package/esm2022/clipper.ui/ui/document-manager/document-manager.mjs +0 -441
- package/esm2022/clipper.ui/ui/document-menu/document-menu.component.mjs +0 -217
- package/esm2022/clipper.ui/ui/references/references.component.mjs +0 -380
- package/esm2022/clipper.ui/ui/search-calendar/search-calendar.component.mjs +0 -116
- package/esm2022/clipper.ui/ui/search-dialog/search-dialog.component.mjs +0 -339
- package/esm2022/clipper.ui/ui/search-facets/search-facets.component.mjs +0 -251
- package/esm2022/clipper.ui/ui/search-free-text-help/search-free-text-help.component.mjs +0 -17
- package/esm2022/clipper.ui/ui/search-free-text-query-builder/search-free-text-query-builder.component.mjs +0 -106
- package/esm2022/clipper.ui/ui/search-result-item/search-result-item.component.mjs +0 -120
- package/esm2022/clipper.ui/ui/search-result-manager/search-result-manager.mjs +0 -531
- package/esm2022/core/arsedizioni-ars-utils-core.mjs +0 -5
- package/esm2022/core/core.module.mjs +0 -151
- package/esm2022/core/dateFnsAdapter.mjs +0 -203
- package/esm2022/core/definitions.mjs +0 -47
- package/esm2022/core/directives/autoFocusDirective.mjs +0 -22
- package/esm2022/core/directives/changeDateIntervalDirective.mjs +0 -48
- package/esm2022/core/directives/copyClipboardDirective.mjs +0 -46
- package/esm2022/core/directives/validators.mjs +0 -502
- package/esm2022/core/pipes/format.pipe.mjs +0 -53
- package/esm2022/core/pipes/replace.pipe.mjs +0 -29
- package/esm2022/core/pipes/safe-html.pipe.mjs +0 -24
- package/esm2022/core/pipes/safe-url.pipe.mjs +0 -24
- package/esm2022/core/pipes/search-callback.pipe.mjs +0 -21
- package/esm2022/core/pipes/search-filter.pipe.mjs +0 -50
- package/esm2022/core/public_api.mjs +0 -22
- package/esm2022/core/selectable.mjs +0 -131
- package/esm2022/core/services/broadcast.service.mjs +0 -35
- package/esm2022/core/services/broadcastChannelManager.mjs +0 -80
- package/esm2022/core/services/environment.service.mjs +0 -29
- package/esm2022/core/services/screen.service.mjs +0 -23
- package/esm2022/core/services/theme.service.mjs +0 -140
- package/esm2022/core/system.mjs +0 -664
- package/esm2022/evolution.common/arsedizioni-ars-utils-evolution.common.mjs +0 -5
- package/esm2022/evolution.common/common/common.module.mjs +0 -16
- package/esm2022/evolution.common/common/definitions.mjs +0 -454
- package/esm2022/evolution.common/common/interceptors/auth.interceptor.mjs +0 -100
- package/esm2022/evolution.common/common/messages.mjs +0 -8
- package/esm2022/evolution.common/common/services/evolution.service.mjs +0 -490
- package/esm2022/evolution.common/public_api.mjs +0 -5
- package/esm2022/help/arsedizioni-ars-utils-help.mjs +0 -5
- package/esm2022/help/components/help-viewer/help-viewer.component.mjs +0 -442
- package/esm2022/help/definitions.mjs +0 -2
- package/esm2022/help/help.module.mjs +0 -12
- package/esm2022/help/public_api.mjs +0 -7
- package/esm2022/help/services/help.service.mjs +0 -77
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/support.common/arsedizioni-ars-utils-support.common.mjs +0 -5
- package/esm2022/support.common/common/common.module.mjs +0 -16
- package/esm2022/support.common/common/definitions.mjs +0 -29
- package/esm2022/support.common/common/interceptors/auth.interceptor.mjs +0 -100
- package/esm2022/support.common/common/messages.mjs +0 -13
- package/esm2022/support.common/common/services/support.service.mjs +0 -289
- package/esm2022/support.common/public_api.mjs +0 -8
- package/esm2022/support.ui/arsedizioni-ars-utils-support.ui.mjs +0 -5
- package/esm2022/support.ui/public_api.mjs +0 -5
- package/esm2022/support.ui/ui/notifications-browser/notification/notification.component.mjs +0 -80
- package/esm2022/support.ui/ui/notifications-browser/notifications-browser.component.mjs +0 -233
- package/esm2022/tinymce/arsedizioni-ars-utils-tinymce.mjs +0 -5
- package/esm2022/tinymce/full-screen-editor/full-screen-editor.component.mjs +0 -48
- package/esm2022/tinymce/public_api.mjs +0 -7
- package/esm2022/tinymce/tinymce.module.mjs +0 -19
- package/esm2022/tinymce/utils.mjs +0 -150
- package/esm2022/ui/arsedizioni-ars-utils-ui.mjs +0 -5
- package/esm2022/ui/public_api.mjs +0 -12
- package/esm2022/ui/ui/components/button-selector/button-selector.component.mjs +0 -150
- package/esm2022/ui/ui/components/button-toggle/button-toggle.component.mjs +0 -51
- package/esm2022/ui/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
- package/esm2022/ui/ui/components/chips-selector/chips-selector.component.mjs +0 -272
- package/esm2022/ui/ui/components/file-input/file-input.component.mjs +0 -264
- package/esm2022/ui/ui/components/file-preview/file-preview.component.mjs +0 -73
- package/esm2022/ui/ui/components/filter-bar/filter-bar.component.mjs +0 -356
- package/esm2022/ui/ui/definitions.mjs +0 -2
- package/esm2022/ui/ui/dialogs/busy/busy-dialog.component.mjs +0 -47
- package/esm2022/ui/ui/dialogs/confirm/confirm-dialog.component.mjs +0 -101
- package/esm2022/ui/ui/dialogs/credentials/credentials-dialog.component.mjs +0 -86
- package/esm2022/ui/ui/dialogs/info/info-dialog.component.mjs +0 -51
- package/esm2022/ui/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
- package/esm2022/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
- package/esm2022/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
- package/esm2022/ui/ui/dialogs/recover-password/recover-password-dialog.component.mjs +0 -49
- package/esm2022/ui/ui/dialogs/reset-password/reset-password-dialog.component.mjs +0 -89
- package/esm2022/ui/ui/dialogs/select/select-dialog.component.mjs +0 -374
- package/esm2022/ui/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
- package/esm2022/ui/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
- package/esm2022/ui/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
- package/esm2022/ui/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
- package/esm2022/ui/ui/dialogs/toast/toast.component.mjs +0 -32
- package/esm2022/ui/ui/directives/resize-table-column.directive.mjs +0 -63
- package/esm2022/ui/ui/filters.mjs +0 -43
- package/esm2022/ui/ui/paginatorIntl.mjs +0 -34
- package/esm2022/ui/ui/services/dialog.service.mjs +0 -417
- package/esm2022/ui/ui/services/ui.service.mjs +0 -21
- package/esm2022/ui/ui/ui.module.mjs +0 -21
- package/esm2022/ui.application/arsedizioni-ars-utils-ui.application.mjs +0 -5
- package/esm2022/ui.application/public_api.mjs +0 -21
- package/esm2022/ui.application/ui/components/button-selector/button-selector.component.mjs +0 -150
- package/esm2022/ui.application/ui/components/button-toggle/button-toggle.component.mjs +0 -51
- package/esm2022/ui.application/ui/components/calendar-empty-header/calendar-empy-header.component.mjs +0 -30
- package/esm2022/ui.application/ui/components/chips-selector/chips-selector.component.mjs +0 -272
- package/esm2022/ui.application/ui/components/file-input/file-input.component.mjs +0 -264
- package/esm2022/ui.application/ui/components/file-preview/file-preview.component.mjs +0 -73
- package/esm2022/ui.application/ui/components/filter-bar/filter-bar.component.mjs +0 -356
- package/esm2022/ui.application/ui/definitions.mjs +0 -31
- package/esm2022/ui.application/ui/dialogs/prompt/prompt-dialog.component.mjs +0 -77
- package/esm2022/ui.application/ui/dialogs/prompt-date/prompt-date-dialog.component.mjs +0 -79
- package/esm2022/ui.application/ui/dialogs/prompt-time/prompt-time-dialog.component.mjs +0 -72
- package/esm2022/ui.application/ui/dialogs/select/select-dialog.component.mjs +0 -374
- package/esm2022/ui.application/ui/dialogs/select-file/select-file-dialog.component.mjs +0 -106
- package/esm2022/ui.application/ui/dialogs/select-picture/select-picture-dialog.component.mjs +0 -62
- package/esm2022/ui.application/ui/dialogs/select-tree/select-tree-dialog.component.mjs +0 -277
- package/esm2022/ui.application/ui/dialogs/send-to/send-to-dialog.component.mjs +0 -90
- package/esm2022/ui.application/ui/directives/resize-table-column.directive.mjs +0 -63
- package/esm2022/ui.application/ui/filters.mjs +0 -43
- package/esm2022/ui.application/ui/services/applicationDialog.service.mjs +0 -304
- package/esm2022/ui.application/ui/ui.module.mjs +0 -30
- package/esm2022/ui.oauth/arsedizioni-ars-utils-ui.oauth.mjs +0 -5
- package/esm2022/ui.oauth/public_api.mjs +0 -6
- package/esm2022/ui.oauth/ui/components/login/login-oauth.component.mjs +0 -199
- package/esm2022/ui.oauth/ui/definitions.mjs +0 -7
- package/esm2022/ui.oauth/ui/ui.module.mjs +0 -13
- package/ui/ui/components/button-selector/button-selector.component.d.ts +0 -52
- package/ui/ui/components/button-toggle/button-toggle.component.d.ts +0 -28
- package/ui/ui/components/calendar-empty-header/calendar-empy-header.component.d.ts +0 -11
- package/ui/ui/components/chips-selector/chips-selector.component.d.ts +0 -82
- package/ui/ui/components/file-input/file-input.component.d.ts +0 -88
- package/ui/ui/components/file-preview/file-preview.component.d.ts +0 -26
- package/ui/ui/components/filter-bar/filter-bar.component.d.ts +0 -83
- package/ui/ui/dialogs/prompt/prompt-dialog.component.d.ts +0 -18
- package/ui/ui/dialogs/prompt-date/prompt-date-dialog.component.d.ts +0 -18
- package/ui/ui/dialogs/prompt-time/prompt-time-dialog.component.d.ts +0 -18
- package/ui/ui/dialogs/select/select-dialog.component.d.ts +0 -122
- package/ui/ui/dialogs/select-file/select-file-dialog.component.d.ts +0 -36
- package/ui/ui/dialogs/select-picture/select-picture-dialog.component.d.ts +0 -26
- package/ui/ui/dialogs/select-tree/select-tree-dialog.component.d.ts +0 -98
- package/ui/ui/dialogs/send-to/send-to-dialog.component.d.ts +0 -28
- package/ui/ui/directives/resize-table-column.directive.d.ts +0 -19
- package/ui/ui/filters.d.ts +0 -57
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
import { HttpClient, HttpHeaders } from '@angular/common/http';
|
|
2
|
-
import { inject, Injectable, signal } from '@angular/core';
|
|
3
|
-
import { BroadcastService, SystemUtils } from '@arsedizioni/ars-utils/core';
|
|
4
|
-
import { DialogService } from '@arsedizioni/ars-utils/ui';
|
|
5
|
-
import { EMPTY, of, throwError } from 'rxjs';
|
|
6
|
-
import { catchError, finalize, map } from 'rxjs/operators';
|
|
7
|
-
import { EvolutionServiceFlags } from './../definitions';
|
|
8
|
-
import { EvolutionMessages } from '../messages';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class EvolutionService {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.httpClient = inject(HttpClient);
|
|
13
|
-
this.broadcastService = inject(BroadcastService);
|
|
14
|
-
this.broadcastServiceSubscription = null;
|
|
15
|
-
this.dialogService = inject(DialogService);
|
|
16
|
-
this._serviceUri = null;
|
|
17
|
-
this._flags = EvolutionServiceFlags.None;
|
|
18
|
-
this._loginInfo = null;
|
|
19
|
-
this.loggedIn = signal(false);
|
|
20
|
-
this.loggingIn = signal(false);
|
|
21
|
-
this.keepAlive = 0;
|
|
22
|
-
}
|
|
23
|
-
get serviceUri() {
|
|
24
|
-
return this._serviceUri;
|
|
25
|
-
}
|
|
26
|
-
get flags() {
|
|
27
|
-
return this._flags;
|
|
28
|
-
}
|
|
29
|
-
get loginInfo() {
|
|
30
|
-
if (!this._loginInfo) {
|
|
31
|
-
const loginInfo = localStorage.getItem('clipper_login_evolution');
|
|
32
|
-
if (loginInfo) {
|
|
33
|
-
try {
|
|
34
|
-
this._loginInfo = JSON.parse(loginInfo);
|
|
35
|
-
}
|
|
36
|
-
catch { }
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return this._loginInfo;
|
|
40
|
-
}
|
|
41
|
-
ngOnDestroy() {
|
|
42
|
-
if (this.broadcastServiceSubscription) {
|
|
43
|
-
this.broadcastServiceSubscription.unsubscribe();
|
|
44
|
-
}
|
|
45
|
-
this.removeKeepAlive();
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Initialize service
|
|
49
|
-
* @param serviceUri : the service uri
|
|
50
|
-
* @param flags: the service flags. Default is none.
|
|
51
|
-
*/
|
|
52
|
-
initialize(serviceUri, flags = EvolutionServiceFlags.None) {
|
|
53
|
-
// Create unique client id
|
|
54
|
-
if (!localStorage.getItem('evolution_client_id')) {
|
|
55
|
-
localStorage.setItem('evolution_client_id', SystemUtils.generateUUID());
|
|
56
|
-
}
|
|
57
|
-
// Initialize
|
|
58
|
-
this._serviceUri = serviceUri;
|
|
59
|
-
this._flags = flags;
|
|
60
|
-
// React to message broadcasting
|
|
61
|
-
if (!this.broadcastServiceSubscription) {
|
|
62
|
-
this.broadcastServiceSubscription = this.broadcastService.getMessage().subscribe((message) => {
|
|
63
|
-
if (message.id === EvolutionMessages.LOGIN_CHANGED) {
|
|
64
|
-
setTimeout(() => {
|
|
65
|
-
this.login(message.data.email, message.data.password, true, message.data.oauth, message.data.oauthAccessToken).subscribe({
|
|
66
|
-
next: r => {
|
|
67
|
-
if (!r.success) {
|
|
68
|
-
if (r.message) {
|
|
69
|
-
this.dialogService.error(r.message, null, "Errore di Evolution");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
if ((this.flags & EvolutionServiceFlags.DisplayConnectionStateMessages) > 0) {
|
|
74
|
-
this.dialogService.toast('Connesso a Evolution', 1500, 'power');
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
},
|
|
78
|
-
error: () => { console.error("Evolution non disponibile."); } // Avoid unwanted errors on client
|
|
79
|
-
});
|
|
80
|
-
}, 500);
|
|
81
|
-
}
|
|
82
|
-
else if (message.id === EvolutionMessages.LOGOUT) {
|
|
83
|
-
if (this.loggedIn()) {
|
|
84
|
-
this.logout().subscribe(r => {
|
|
85
|
-
if (!r.success) {
|
|
86
|
-
if (r.message) {
|
|
87
|
-
this.dialogService.error("<p>" + r.message + "</p><br><br><hr><p class='small'><i>Per eliminare la configurazione di Evolution accedere a:<br><b>menu > personalizza > collegamenti</b></i></p>", null, "Errore di Evolution");
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
else {
|
|
91
|
-
if ((this.flags & EvolutionServiceFlags.DisplayConnectionStateMessages) > 0) {
|
|
92
|
-
this.dialogService.toast('Disconnesso da Evolution', 1500, 'power_off');
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
this.clear();
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
// Eveluate current session storage in case of page refresh (F5)
|
|
104
|
-
if (!this.loggedIn() && this.getToken()) {
|
|
105
|
-
// Auto login
|
|
106
|
-
this.loggedIn.set(true);
|
|
107
|
-
// Notify
|
|
108
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
|
|
109
|
-
// Set keep alive
|
|
110
|
-
this.setKeepAlive();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Set keep alive
|
|
115
|
-
*/
|
|
116
|
-
setKeepAlive() {
|
|
117
|
-
// Keep alive every 1 min
|
|
118
|
-
if (this.keepAlive === 0) {
|
|
119
|
-
this.keepAlive = window.setInterval(() => {
|
|
120
|
-
this.ping();
|
|
121
|
-
}, 1000 * 60);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Remove keep alive
|
|
126
|
-
*/
|
|
127
|
-
removeKeepAlive() {
|
|
128
|
-
if (this.keepAlive > 0) {
|
|
129
|
-
window.clearInterval(this.keepAlive);
|
|
130
|
-
this.keepAlive = 0;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Ping
|
|
135
|
-
*/
|
|
136
|
-
ping() {
|
|
137
|
-
this.httpClient.get(this._serviceUri + '/ping')
|
|
138
|
-
.pipe(catchError(() => { return EMPTY; }))
|
|
139
|
-
.subscribe();
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Set JWT token
|
|
143
|
-
* @param value : the login result
|
|
144
|
-
*/
|
|
145
|
-
setToken(value) {
|
|
146
|
-
sessionStorage.setItem('evolution_jwt', value.token);
|
|
147
|
-
sessionStorage.setItem('evolution_jwt_refresh', value.refreshToken ?? '');
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Return current JWT token
|
|
151
|
-
* @param refresh: true to get the refresh token. Default is false.
|
|
152
|
-
*/
|
|
153
|
-
getToken(refresh = false) {
|
|
154
|
-
let token = sessionStorage.getItem(refresh ? 'evolution_jwt_refresh' : 'evolution_jwt');
|
|
155
|
-
if (token && token[0] === '"') {
|
|
156
|
-
return token.substring(1, token.length - 1);
|
|
157
|
-
}
|
|
158
|
-
return token ?? '';
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Store login info
|
|
162
|
-
*/
|
|
163
|
-
storeLogin() {
|
|
164
|
-
localStorage.setItem('evolution_login', JSON.stringify(this._loginInfo));
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* Perform auto login using current link data
|
|
168
|
-
* @param email: the optional email if using OAuth2
|
|
169
|
-
* @parma password: the optional password if using OAuth2
|
|
170
|
-
* @param remember: remember credentials
|
|
171
|
-
* @param oauth: the optional open authentication supported
|
|
172
|
-
* @param oauthAccessToken: the optional OAuth2 access token
|
|
173
|
-
* @param onSucces: function to execute on seccess
|
|
174
|
-
*/
|
|
175
|
-
autoLogin(email = null, password = null, remember = false, oauth = null, oauthAccessToken = null, onSucces = null) {
|
|
176
|
-
if (!oauth && !oauthAccessToken && (!email || !password)) {
|
|
177
|
-
// Try to use link if exists
|
|
178
|
-
const linkInfo = localStorage.getItem('clipper_link_evolution');
|
|
179
|
-
if (linkInfo) {
|
|
180
|
-
const link = JSON.parse(SystemUtils.cipher(linkInfo, 'evolution', true));
|
|
181
|
-
if (link) {
|
|
182
|
-
email = link.user;
|
|
183
|
-
password = link.password;
|
|
184
|
-
remember = true;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
this.login(email, password, remember, oauth, oauthAccessToken)
|
|
189
|
-
.subscribe({
|
|
190
|
-
next: r => {
|
|
191
|
-
if (!r.success) {
|
|
192
|
-
this.dialogService.error(r.message, null, "Errore in Evolution");
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
this.dialogService.toast('Connesso ad Evolution', 1500, 'power');
|
|
196
|
-
if (onSucces) {
|
|
197
|
-
onSucces();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
},
|
|
201
|
-
error: () => { this.dialogService.error("Evolution non disponibile."); }
|
|
202
|
-
});
|
|
203
|
-
return true;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Perform auto logout
|
|
207
|
-
* @param onSucces: function to execute on seccess
|
|
208
|
-
*/
|
|
209
|
-
autoLogout(onSucces = null) {
|
|
210
|
-
if (!this.loggedIn())
|
|
211
|
-
return;
|
|
212
|
-
this.logout()
|
|
213
|
-
.pipe(map(r => { this.clear(); return r; }))
|
|
214
|
-
.subscribe({
|
|
215
|
-
next: r => {
|
|
216
|
-
if (!r.success) {
|
|
217
|
-
this.dialogService.error(r.message, null, "Errore in Evolution");
|
|
218
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_CHANGED);
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
this.dialogService.toast('Disconnesso da Evolution', 1500, 'power_off');
|
|
222
|
-
}
|
|
223
|
-
},
|
|
224
|
-
complete: () => {
|
|
225
|
-
if (onSucces) {
|
|
226
|
-
onSucces();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Perform login
|
|
233
|
-
* @param email: the optional email if using OAuth2
|
|
234
|
-
* @parma password: the optional password if using OAuth2
|
|
235
|
-
* @param remember: remember credentials
|
|
236
|
-
* @param oauth: the optional open authentication supported
|
|
237
|
-
* @param oauthAccessToken: the optional OAuth2 access token
|
|
238
|
-
* @returns: the login result
|
|
239
|
-
*/
|
|
240
|
-
login(email = null, password = null, remember = false, oauth = null, oauthAccessToken = null) {
|
|
241
|
-
this.loggingIn.set(true);
|
|
242
|
-
return this.httpClient
|
|
243
|
-
.post(this._serviceUri + '/login2', {
|
|
244
|
-
user: oauth ? null : email,
|
|
245
|
-
password: oauth ? null : password,
|
|
246
|
-
clientId: localStorage.getItem("evolution_client_id"),
|
|
247
|
-
OAUTH: oauth
|
|
248
|
-
}, {
|
|
249
|
-
headers: !oauth
|
|
250
|
-
? new HttpHeaders()
|
|
251
|
-
: new HttpHeaders()
|
|
252
|
-
.set("Authorization", oauthAccessToken ?? '')
|
|
253
|
-
})
|
|
254
|
-
.pipe(finalize(() => this.dialogService.clearBusy()), catchError(err => { this.handleLoginError(); return throwError(() => err); }), map((r) => {
|
|
255
|
-
this.loggingIn.set(false);
|
|
256
|
-
if (r.success) {
|
|
257
|
-
// Store access token
|
|
258
|
-
this.setToken(r.value);
|
|
259
|
-
const loginInfo = {
|
|
260
|
-
context: r.value.context,
|
|
261
|
-
OAUTH: oauth
|
|
262
|
-
};
|
|
263
|
-
if (!oauth) {
|
|
264
|
-
loginInfo.userCredentials =
|
|
265
|
-
SystemUtils.cipher(JSON.stringify({
|
|
266
|
-
email: email,
|
|
267
|
-
password: password,
|
|
268
|
-
remember: remember,
|
|
269
|
-
}), loginInfo.context.userId.toString());
|
|
270
|
-
}
|
|
271
|
-
this._loginInfo = loginInfo.context;
|
|
272
|
-
this.storeLogin();
|
|
273
|
-
this.loggedIn.set(true);
|
|
274
|
-
// Notify
|
|
275
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
|
|
276
|
-
// Keep alive
|
|
277
|
-
this.setKeepAlive();
|
|
278
|
-
}
|
|
279
|
-
return r;
|
|
280
|
-
}));
|
|
281
|
-
}
|
|
282
|
-
/**
|
|
283
|
-
* Perform logout
|
|
284
|
-
*/
|
|
285
|
-
logout() {
|
|
286
|
-
return this.httpClient.post(this._serviceUri + '/logout', {}).pipe(finalize(() => { this.removeKeepAlive(); this.dialogService.clearBusy(); }), map(r => {
|
|
287
|
-
this.clear();
|
|
288
|
-
return r;
|
|
289
|
-
}), catchError((_e) => {
|
|
290
|
-
this.clear();
|
|
291
|
-
return of([]);
|
|
292
|
-
}));
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Switch the current login to a new one with the same credentials except role possibly (context change)
|
|
296
|
-
* @param id : new user id
|
|
297
|
-
*/
|
|
298
|
-
loginSwitch(id) {
|
|
299
|
-
return this.httpClient
|
|
300
|
-
.post(this._serviceUri + '/login-switch/', {
|
|
301
|
-
userId: id,
|
|
302
|
-
clientId: localStorage.getItem("evolution_client_id")
|
|
303
|
-
})
|
|
304
|
-
.pipe(catchError((err) => {
|
|
305
|
-
this.handleLoginError();
|
|
306
|
-
return throwError(() => err);
|
|
307
|
-
}), map((r) => {
|
|
308
|
-
this.loggingIn.set(false);
|
|
309
|
-
if (r.success) {
|
|
310
|
-
// Store access token
|
|
311
|
-
this.setToken(r.value);
|
|
312
|
-
this._loginInfo = r.value.context;
|
|
313
|
-
this.loggedIn.set(true);
|
|
314
|
-
// Notify
|
|
315
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGIN_COMPLETED);
|
|
316
|
-
}
|
|
317
|
-
return r;
|
|
318
|
-
}));
|
|
319
|
-
}
|
|
320
|
-
/**
|
|
321
|
-
* Handle login error
|
|
322
|
-
*/
|
|
323
|
-
handleLoginError() {
|
|
324
|
-
this.loggingIn.set(false);
|
|
325
|
-
localStorage.removeItem('evolution_login');
|
|
326
|
-
}
|
|
327
|
-
/**
|
|
328
|
-
* Reset login refresh timer and login state
|
|
329
|
-
*/
|
|
330
|
-
reset() {
|
|
331
|
-
// Clear login info
|
|
332
|
-
this._loginInfo = null;
|
|
333
|
-
// Logged out
|
|
334
|
-
this.loggedIn.set(false);
|
|
335
|
-
// Notify
|
|
336
|
-
this.broadcastService.sendMessage(EvolutionMessages.LOGOUT_COMPLETED);
|
|
337
|
-
}
|
|
338
|
-
/**
|
|
339
|
-
* Clear login data
|
|
340
|
-
*/
|
|
341
|
-
clear() {
|
|
342
|
-
// Clear local storage
|
|
343
|
-
sessionStorage.removeItem('evolution_jwt');
|
|
344
|
-
sessionStorage.removeItem('evolution_jwt_refresh');
|
|
345
|
-
sessionStorage.removeItem('evolution_oauth');
|
|
346
|
-
localStorage.removeItem('evolution_login');
|
|
347
|
-
// Reset login
|
|
348
|
-
this.reset();
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* Perform token refresh
|
|
352
|
-
*/
|
|
353
|
-
refresh() {
|
|
354
|
-
return this.httpClient.get(this._serviceUri + '/refresh2/?token=' + this.getToken(true)).pipe(map((r) => {
|
|
355
|
-
// Update token
|
|
356
|
-
this.setToken(r.value);
|
|
357
|
-
}));
|
|
358
|
-
}
|
|
359
|
-
/**
|
|
360
|
-
* Convert folders in a tree of Node object.
|
|
361
|
-
* @param folders : the subfolders group or null to root
|
|
362
|
-
*/
|
|
363
|
-
toNodes(folders) {
|
|
364
|
-
return this._toNodes(folders, null);
|
|
365
|
-
}
|
|
366
|
-
/**
|
|
367
|
-
* Convert folders in a tree of Node object.
|
|
368
|
-
* @param folders : the children group or null to root
|
|
369
|
-
*/
|
|
370
|
-
_toNodes(folders, parent) {
|
|
371
|
-
let nodes = [];
|
|
372
|
-
folders.forEach((n) => {
|
|
373
|
-
let node = {
|
|
374
|
-
id: n.id,
|
|
375
|
-
name: n.name,
|
|
376
|
-
count: n.count,
|
|
377
|
-
parent: parent,
|
|
378
|
-
children: null,
|
|
379
|
-
bag: n,
|
|
380
|
-
};
|
|
381
|
-
node.children =
|
|
382
|
-
n.children && n.children.length > 0
|
|
383
|
-
? this._toNodes(n.children, node)
|
|
384
|
-
: [];
|
|
385
|
-
nodes.push(node);
|
|
386
|
-
});
|
|
387
|
-
return nodes;
|
|
388
|
-
}
|
|
389
|
-
/**
|
|
390
|
-
* Retrieve the taxonomy
|
|
391
|
-
*/
|
|
392
|
-
getTaxonomy() {
|
|
393
|
-
return this.httpClient.get(this._serviceUri + '/taxonomy');
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* Retrieve groups
|
|
397
|
-
* @param group: the group number
|
|
398
|
-
* @param register: the optional register id. Default is null.
|
|
399
|
-
*/
|
|
400
|
-
getGroups(group = 1, register = null) {
|
|
401
|
-
return this.httpClient.get(this._serviceUri +
|
|
402
|
-
(register
|
|
403
|
-
? '/compliance/groups/?group=' +
|
|
404
|
-
group +
|
|
405
|
-
'®ister=' +
|
|
406
|
-
register
|
|
407
|
-
: '/compliance/groups/?group=' + group));
|
|
408
|
-
}
|
|
409
|
-
////
|
|
410
|
-
// CONTEXT
|
|
411
|
-
////
|
|
412
|
-
/**
|
|
413
|
-
* Change context
|
|
414
|
-
*/
|
|
415
|
-
changeContext(params) {
|
|
416
|
-
return this.httpClient.post(this._serviceUri + '/compliance/context', params);
|
|
417
|
-
}
|
|
418
|
-
////
|
|
419
|
-
// REGISTERS
|
|
420
|
-
////
|
|
421
|
-
/**
|
|
422
|
-
* Retrieve a register
|
|
423
|
-
* @param id the register id
|
|
424
|
-
*/
|
|
425
|
-
getRegister(id) {
|
|
426
|
-
return this.httpClient.get(this._serviceUri +
|
|
427
|
-
'/compliance/registers/' + id);
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Collect register profiles
|
|
431
|
-
* @param params parameters
|
|
432
|
-
*/
|
|
433
|
-
collectRegisterProfiles(params) {
|
|
434
|
-
return this.httpClient.post(this._serviceUri +
|
|
435
|
-
'/compliance/registers/profiles/collect', params);
|
|
436
|
-
}
|
|
437
|
-
////
|
|
438
|
-
// LAWS
|
|
439
|
-
////
|
|
440
|
-
/**
|
|
441
|
-
* Add one or more laws
|
|
442
|
-
* @param params parameters
|
|
443
|
-
*/
|
|
444
|
-
addLaws(params) {
|
|
445
|
-
return this.httpClient.post(this._serviceUri + '/compliance/laws/add', params);
|
|
446
|
-
}
|
|
447
|
-
////
|
|
448
|
-
// ACTIVITIES
|
|
449
|
-
////
|
|
450
|
-
/**
|
|
451
|
-
* Add one or more activities
|
|
452
|
-
* @param params parameters
|
|
453
|
-
*/
|
|
454
|
-
addActivities(params) {
|
|
455
|
-
return this.httpClient.post(this._serviceUri + '/compliance/activities/add', params);
|
|
456
|
-
}
|
|
457
|
-
/**
|
|
458
|
-
* Export laws
|
|
459
|
-
* @param params parameters
|
|
460
|
-
*/
|
|
461
|
-
exportLaws(params) {
|
|
462
|
-
return this.httpClient.post(this._serviceUri + '/compliance/laws/export', params, { responseType: 'blob' });
|
|
463
|
-
}
|
|
464
|
-
///
|
|
465
|
-
// LINKS
|
|
466
|
-
///
|
|
467
|
-
/**
|
|
468
|
-
* Save a user link
|
|
469
|
-
* @param item: the user link
|
|
470
|
-
*/
|
|
471
|
-
saveLink(item) {
|
|
472
|
-
return this.httpClient.post(this._serviceUri + '/account/links/save', item);
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Delete a user link
|
|
476
|
-
* @param item: the user link
|
|
477
|
-
*/
|
|
478
|
-
deleteLink(item) {
|
|
479
|
-
return this.httpClient.post(this._serviceUri + '/account/links/delete', item);
|
|
480
|
-
}
|
|
481
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: EvolutionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
482
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: EvolutionService, providedIn: 'root' }); }
|
|
483
|
-
}
|
|
484
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.10", ngImport: i0, type: EvolutionService, decorators: [{
|
|
485
|
-
type: Injectable,
|
|
486
|
-
args: [{
|
|
487
|
-
providedIn: 'root',
|
|
488
|
-
}]
|
|
489
|
-
}] });
|
|
490
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZvbHV0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvZXZvbHV0aW9uLmNvbW1vbi9jb21tb24vc2VydmljZXMvZXZvbHV0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBYSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFtQyxnQkFBZ0IsRUFBcUIsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDaEksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFnQixVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0QsT0FBTyxFQUEySyxxQkFBcUIsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUN4USxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7O0FBTWhELE1BQU0sT0FBTyxnQkFBZ0I7SUFIN0I7UUFNVSxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2hDLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLGlDQUE0QixHQUF5QixJQUFJLENBQUM7UUFDMUQsa0JBQWEsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFdEMsZ0JBQVcsR0FBVyxJQUFJLENBQUM7UUFJM0IsV0FBTSxHQUEwQixxQkFBcUIsQ0FBQyxJQUFJLENBQUM7UUFJM0QsZUFBVSxHQUE2QixJQUFJLENBQUM7UUFZcEMs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QUdFO0lBQ0YsUUFBUSxDQUFDLElBQXVCO1FBQzlCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcscUJBQXFCLEVBQ3hDLElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVUsQ0FBQyxJQUF1QjtRQUNoQyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLHVCQUF1QixFQUMxQyxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7K0dBdGtCVSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQUZmLE1BQU07OzRGQUVQLGdCQUFnQjtrQkFINUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBcGlSZXN1bHQsIEJyb2FkY2FzdE1lc3NhZ2VJbmZvLCBCcm9hZGNhc3RTZXJ2aWNlLCBGb2xkZXJUcmVlLCBJTm9kZSwgU3lzdGVtVXRpbHMgfSBmcm9tICdAYXJzZWRpemlvbmkvYXJzLXV0aWxzL2NvcmUnO1xyXG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy91aSc7XHJcbmltcG9ydCB7IEVNUFRZLCBvZiwgU3Vic2NyaXB0aW9uLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZpbmFsaXplLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IExvZ2luT0F1dGhUeXBlIH0gZnJvbSAnQGFyc2VkaXppb25pL2Fycy11dGlscy91aS5vYXV0aCc7XHJcbmltcG9ydCB7IEV2b2x1dGlvbkNvbXBsaWFuY2VBY3Rpdml0aWVzQWRkUGFyYW1zLCBFdm9sdXRpb25Db21wbGlhbmNlQWN0aXZpdHksIEV2b2x1dGlvbkNvbXBsaWFuY2VMYXcsIEV2b2x1dGlvbkNvbXBsaWFuY2VMYXdzQWRkUGFyYW1zLCBFdm9sdXRpb25Mb2dpbkluZm8sIEV2b2x1dGlvbkxvZ2luUmVzdWx0LCBFdm9sdXRpb25TZXJ2aWNlRmxhZ3MsIEV2b2x1dGlvblVzZXJJbmZvLCBFdm9sdXRpb25Vc2VyTGluayB9IGZyb20gJy4vLi4vZGVmaW5pdGlvbnMnO1xyXG5pbXBvcnQgeyBFdm9sdXRpb25NZXNzYWdlcyB9IGZyb20gJy4uL21lc3NhZ2VzJztcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRXZvbHV0aW9uU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XHJcblxyXG5cclxuICBwcml2YXRlIGh0dHBDbGllbnQgPSBpbmplY3QoSHR0cENsaWVudCk7XHJcbiAgcHJpdmF0ZSBicm9hZGNhc3RTZXJ2aWNlID0gaW5qZWN0KEJyb2FkY2FzdFNlcnZpY2UpO1xyXG4gIHByaXZhdGUgYnJvYWRjYXN0U2VydmljZVN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZGlhbG9nU2VydmljZSA9IGluamVjdChEaWFsb2dTZXJ2aWNlKTtcclxuXHJcbiAgcHJpdmF0ZSBfc2VydmljZVVyaTogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgc2VydmljZVVyaSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlcnZpY2VVcmk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2ZsYWdzOiBFdm9sdXRpb25TZXJ2aWNlRmxhZ3MgPSBFdm9sdXRpb25TZXJ2aWNlRmxhZ3MuTm9uZTtcclxuICBnZXQgZmxhZ3MoKTogRXZvbHV0aW9uU2VydmljZUZsYWdzIHtcclxuICAgIHJldHVybiB0aGlzLl9mbGFncztcclxuICB9XHJcbiAgcHJpdmF0ZSBfbG9naW5JbmZvOiBFdm9sdXRpb25Vc2VySW5mbyB8IG51bGwgPSBudWxsO1xyXG4gIGdldCBsb2dpbkluZm8oKTogRXZvbHV0aW9uVXNlckluZm8gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5fbG9naW5JbmZvKSB7XHJcbiAgICAgIGNvbnN0IGxvZ2luSW5mbyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjbGlwcGVyX2xvZ2luX2V2b2x1dGlvbicpO1xyXG4gICAgICBpZiAobG9naW5JbmZvKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuX2xvZ2luSW5mbyA9IEpTT04ucGFyc2UobG9naW5JbmZvKSBhcyBFdm9sdXRpb25Vc2VySW5mbztcclxuICAgICAgICB9IGNhdGNoIHsgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fbG9naW5JbmZvO1xyXG4gIH1cclxuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VkSW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHB1YmxpYyByZWFkb25seSBsb2dnaW5nSW4gPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHByaXZhdGUga2VlcEFsaXZlID0gMDtcclxuXHJcblxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIGlmICh0aGlzLmJyb2FkY2FzdFNlcnZpY2VTdWJzY3JpcHRpb24pIHtcclxuICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlbW92ZUtlZXBBbGl2ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZSBzZXJ2aWNlXHJcbiAgICogQHBhcmFtIHNlcnZpY2VVcmkgOiB0aGUgc2VydmljZSB1cmlcclxuICAgKiBAcGFyYW0gZmxhZ3M6IHRoZSBzZXJ2aWNlIGZsYWdzLiBEZWZhdWx0IGlzIG5vbmUuXHJcbiAgICovXHJcbiAgaW5pdGlhbGl6ZShcclxuICAgIHNlcnZpY2VVcmk6IHN0cmluZyxcclxuICAgIGZsYWdzOiBFdm9sdXRpb25TZXJ2aWNlRmxhZ3MgPSBFdm9sdXRpb25TZXJ2aWNlRmxhZ3MuTm9uZSkge1xyXG4gICAgLy8gQ3JlYXRlIHVuaXF1ZSBjbGllbnQgaWRcclxuICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V2b2x1dGlvbl9jbGllbnRfaWQnKSkge1xyXG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnZXZvbHV0aW9uX2NsaWVudF9pZCcsIFN5c3RlbVV0aWxzLmdlbmVyYXRlVVVJRCgpKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBJbml0aWFsaXplXHJcbiAgICB0aGlzLl9zZXJ2aWNlVXJpID0gc2VydmljZVVyaTtcclxuICAgIHRoaXMuX2ZsYWdzID0gZmxhZ3M7XHJcblxyXG4gICAgLy8gUmVhY3QgdG8gbWVzc2FnZSBicm9hZGNhc3RpbmdcclxuICAgIGlmICghdGhpcy5icm9hZGNhc3RTZXJ2aWNlU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZVN1YnNjcmlwdGlvbiA9IHRoaXMuYnJvYWRjYXN0U2VydmljZS5nZXRNZXNzYWdlKCkuc3Vic2NyaWJlKChtZXNzYWdlOiBCcm9hZGNhc3RNZXNzYWdlSW5mbykgPT4ge1xyXG4gICAgICAgIGlmIChtZXNzYWdlLmlkID09PSBFdm9sdXRpb25NZXNzYWdlcy5MT0dJTl9DSEFOR0VEKSB7XHJcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5sb2dpbihcclxuICAgICAgICAgICAgICBtZXNzYWdlLmRhdGEuZW1haWwsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLnBhc3N3b3JkLFxyXG4gICAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICAgICAgbWVzc2FnZS5kYXRhLm9hdXRoLFxyXG4gICAgICAgICAgICAgIG1lc3NhZ2UuZGF0YS5vYXV0aEFjY2Vzc1Rva2VuKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgbmV4dDogciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICghci5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLmVycm9yKHIubWVzc2FnZSwgbnVsbCwgXCJFcnJvcmUgZGkgRXZvbHV0aW9uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZmxhZ3MgJiBFdm9sdXRpb25TZXJ2aWNlRmxhZ3MuRGlzcGxheUNvbm5lY3Rpb25TdGF0ZU1lc3NhZ2VzKSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS50b2FzdCgnQ29ubmVzc28gYSBFdm9sdXRpb24nLCAxNTAwLCAncG93ZXInKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjogKCkgPT4geyBjb25zb2xlLmVycm9yKFwiRXZvbHV0aW9uIG5vbiBkaXNwb25pYmlsZS5cIikgfSAvLyBBdm9pZCB1bndhbnRlZCBlcnJvcnMgb24gY2xpZW50XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZS5pZCA9PT0gRXZvbHV0aW9uTWVzc2FnZXMuTE9HT1VUKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5sb2dnZWRJbigpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9nb3V0KCkuc3Vic2NyaWJlKHIgPT4ge1xyXG4gICAgICAgICAgICAgIGlmICghci5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5tZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5lcnJvcihcIjxwPlwiICsgci5tZXNzYWdlICsgXCI8L3A+PGJyPjxicj48aHI+PHAgY2xhc3M9J3NtYWxsJz48aT5QZXIgZWxpbWluYXJlIGxhIGNvbmZpZ3VyYXppb25lIGRpIEV2b2x1dGlvbiBhY2NlZGVyZSBhOjxicj48Yj5tZW51ID4gcGVyc29uYWxpenphID4gY29sbGVnYW1lbnRpPC9iPjwvaT48L3A+XCIsIG51bGwsIFwiRXJyb3JlIGRpIEV2b2x1dGlvblwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLmZsYWdzICYgRXZvbHV0aW9uU2VydmljZUZsYWdzLkRpc3BsYXlDb25uZWN0aW9uU3RhdGVNZXNzYWdlcykgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS50b2FzdCgnRGlzY29ubmVzc28gZGEgRXZvbHV0aW9uJywgMTUwMCwgJ3Bvd2VyX29mZicpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBFdmVsdWF0ZSBjdXJyZW50IHNlc3Npb24gc3RvcmFnZSBpbiBjYXNlIG9mIHBhZ2UgcmVmcmVzaCAoRjUpXHJcbiAgICBpZiAoIXRoaXMubG9nZ2VkSW4oKSAmJiB0aGlzLmdldFRva2VuKCkpIHtcclxuICAgICAgLy8gQXV0byBsb2dpblxyXG4gICAgICB0aGlzLmxvZ2dlZEluLnNldCh0cnVlKTtcclxuICAgICAgLy8gTm90aWZ5XHJcbiAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZS5zZW5kTWVzc2FnZShFdm9sdXRpb25NZXNzYWdlcy5MT0dJTl9DT01QTEVURUQpO1xyXG4gICAgICAvLyBTZXQga2VlcCBhbGl2ZVxyXG4gICAgICB0aGlzLnNldEtlZXBBbGl2ZSgpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBrZWVwIGFsaXZlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRLZWVwQWxpdmUoKSB7XHJcbiAgICAvLyBLZWVwIGFsaXZlIGV2ZXJ5IDEgbWluXHJcbiAgICBpZiAodGhpcy5rZWVwQWxpdmUgPT09IDApIHtcclxuICAgICAgdGhpcy5rZWVwQWxpdmUgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoXHJcbiAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5waW5nKCk7XHJcbiAgICAgICAgfSwgMTAwMCAqIDYwKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBrZWVwIGFsaXZlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZW1vdmVLZWVwQWxpdmUoKSB7XHJcbiAgICBpZiAodGhpcy5rZWVwQWxpdmUgPiAwKSB7XHJcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHRoaXMua2VlcEFsaXZlKTtcclxuICAgICAgdGhpcy5rZWVwQWxpdmUgPSAwO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFBpbmdcclxuICovXHJcbiAgcGluZygpIHtcclxuICAgIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzdWx0PG51bWJlcj4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9waW5nJ1xyXG4gICAgKSAgICBcclxuICAgIC5waXBlKGNhdGNoRXJyb3IoKCkgPT4ge3JldHVybiBFTVBUWX0pKVxyXG4gICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4qIFNldCBKV1QgdG9rZW5cclxuKiBAcGFyYW0gdmFsdWUgOiB0aGUgbG9naW4gcmVzdWx0XHJcbiovXHJcbiAgcHJpdmF0ZSBzZXRUb2tlbih2YWx1ZTogRXZvbHV0aW9uTG9naW5SZXN1bHQpIHtcclxuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2V2b2x1dGlvbl9qd3QnLCB2YWx1ZS50b2tlbik7XHJcbiAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdldm9sdXRpb25fand0X3JlZnJlc2gnLCB2YWx1ZS5yZWZyZXNoVG9rZW4gPz8gJycpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiBjdXJyZW50IEpXVCB0b2tlblxyXG4gICAqIEBwYXJhbSByZWZyZXNoOiB0cnVlIHRvIGdldCB0aGUgcmVmcmVzaCB0b2tlbi4gRGVmYXVsdCBpcyBmYWxzZS5cclxuICAgKi9cclxuICBnZXRUb2tlbihyZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xyXG4gICAgbGV0IHRva2VuID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShyZWZyZXNoID8gJ2V2b2x1dGlvbl9qd3RfcmVmcmVzaCcgOiAnZXZvbHV0aW9uX2p3dCcpO1xyXG4gICAgaWYgKHRva2VuICYmIHRva2VuWzBdID09PSAnXCInKSB7XHJcbiAgICAgIHJldHVybiB0b2tlbi5zdWJzdHJpbmcoMSwgdG9rZW4ubGVuZ3RoIC0gMSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdG9rZW4gPz8gJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogU3RvcmUgbG9naW4gaW5mb1xyXG4gKi9cclxuICBzdG9yZUxvZ2luKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2V2b2x1dGlvbl9sb2dpbicsIEpTT04uc3RyaW5naWZ5KHRoaXMuX2xvZ2luSW5mbykpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAqIFBlcmZvcm0gYXV0byBsb2dpbiB1c2luZyBjdXJyZW50IGxpbmsgZGF0YVxyXG4gICAqIEBwYXJhbSBlbWFpbDogdGhlIG9wdGlvbmFsIGVtYWlsIGlmIHVzaW5nIE9BdXRoMlxyXG4gICAqIEBwYXJtYSBwYXNzd29yZDogdGhlIG9wdGlvbmFsIHBhc3N3b3JkIGlmIHVzaW5nIE9BdXRoMlxyXG4gICAqIEBwYXJhbSByZW1lbWJlcjogcmVtZW1iZXIgY3JlZGVudGlhbHMgXHJcbiAgICogQHBhcmFtIG9hdXRoOiB0aGUgb3B0aW9uYWwgb3BlbiBhdXRoZW50aWNhdGlvbiBzdXBwb3J0ZWRcclxuICAgKiBAcGFyYW0gb2F1dGhBY2Nlc3NUb2tlbjogdGhlIG9wdGlvbmFsIE9BdXRoMiBhY2Nlc3MgdG9rZW5cclxuICogQHBhcmFtIG9uU3VjY2VzOiBmdW5jdGlvbiB0byBleGVjdXRlIG9uIHNlY2Nlc3NcclxuICovXHJcbiAgYXV0b0xvZ2luKFxyXG4gICAgZW1haWw6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxyXG4gICAgcGFzc3dvcmQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxyXG4gICAgcmVtZW1iZXI6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkID0gZmFsc2UsXHJcbiAgICBvYXV0aDogTG9naW5PQXV0aFR5cGUgfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCxcclxuICAgIG9hdXRoQWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxyXG4gICAgb25TdWNjZXM6IEZ1bmN0aW9uIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwpOiBib29sZWFuIHtcclxuICAgIGlmICghb2F1dGggJiYgIW9hdXRoQWNjZXNzVG9rZW4gJiYgKCFlbWFpbCB8fCAhcGFzc3dvcmQpKSB7XHJcbiAgICAgIC8vIFRyeSB0byB1c2UgbGluayBpZiBleGlzdHNcclxuICAgICAgY29uc3QgbGlua0luZm8gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2xpcHBlcl9saW5rX2V2b2x1dGlvbicpO1xyXG4gICAgICBpZiAobGlua0luZm8pIHtcclxuICAgICAgICBjb25zdCBsaW5rID0gSlNPTi5wYXJzZShTeXN0ZW1VdGlscy5jaXBoZXIobGlua0luZm8sICdldm9sdXRpb24nLCB0cnVlKSk7XHJcbiAgICAgICAgaWYgKGxpbmspIHtcclxuICAgICAgICAgIGVtYWlsID0gbGluay51c2VyO1xyXG4gICAgICAgICAgcGFzc3dvcmQgPSBsaW5rLnBhc3N3b3JkO1xyXG4gICAgICAgICAgcmVtZW1iZXIgPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmxvZ2luKGVtYWlsLCBwYXNzd29yZCwgcmVtZW1iZXIsIG9hdXRoLCBvYXV0aEFjY2Vzc1Rva2VuKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiByID0+IHtcclxuICAgICAgICAgIGlmICghci5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5lcnJvcihyLm1lc3NhZ2UsIG51bGwsIFwiRXJyb3JlIGluIEV2b2x1dGlvblwiKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS50b2FzdCgnQ29ubmVzc28gYWQgRXZvbHV0aW9uJywgMTUwMCwgJ3Bvd2VyJyk7XHJcbiAgICAgICAgICAgIGlmIChvblN1Y2Nlcykge1xyXG4gICAgICAgICAgICAgIG9uU3VjY2VzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuZGlhbG9nU2VydmljZS5lcnJvcihcIkV2b2x1dGlvbiBub24gZGlzcG9uaWJpbGUuXCIpIH1cclxuICAgICAgfSk7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmZvcm0gYXV0byBsb2dvdXRcclxuICAgKiBAcGFyYW0gb25TdWNjZXM6IGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gc2VjY2Vzc1xyXG4gICAqL1xyXG4gIGF1dG9Mb2dvdXQoXHJcbiAgICBvblN1Y2NlczogRnVuY3Rpb24gfCBudWxsIHwgdW5kZWZpbmVkID0gbnVsbCkge1xyXG4gICAgaWYgKCF0aGlzLmxvZ2dlZEluKCkpIHJldHVybjtcclxuICAgIHRoaXMubG9nb3V0KClcclxuICAgICAgLnBpcGUobWFwKHIgPT4geyB0aGlzLmNsZWFyKCk7IHJldHVybiByIH0pKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiByID0+IHtcclxuICAgICAgICAgIGlmICghci5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nU2VydmljZS5lcnJvcihyLm1lc3NhZ2UsIG51bGwsIFwiRXJyb3JlIGluIEV2b2x1dGlvblwiKTtcclxuICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RTZXJ2aWNlLnNlbmRNZXNzYWdlKEV2b2x1dGlvbk1lc3NhZ2VzLkxPR0lOX0NIQU5HRUQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kaWFsb2dTZXJ2aWNlLnRvYXN0KCdEaXNjb25uZXNzbyBkYSBFdm9sdXRpb24nLCAxNTAwLCAncG93ZXJfb2ZmJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKG9uU3VjY2VzKSB7XHJcbiAgICAgICAgICAgIG9uU3VjY2VzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBlcmZvcm0gbG9naW4gICBcclxuICAgKiBAcGFyYW0gZW1haWw6IHRoZSBvcHRpb25hbCBlbWFpbCBpZiB1c2luZyBPQXV0aDJcclxuICAgKiBAcGFybWEgcGFzc3dvcmQ6IHRoZSBvcHRpb25hbCBwYXNzd29yZCBpZiB1c2luZyBPQXV0aDJcclxuICAgKiBAcGFyYW0gcmVtZW1iZXI6IHJlbWVtYmVyIGNyZWRlbnRpYWxzIFxyXG4gICAqIEBwYXJhbSBvYXV0aDogdGhlIG9wdGlvbmFsIG9wZW4gYXV0aGVudGljYXRpb24gc3VwcG9ydGVkXHJcbiAgICogQHBhcmFtIG9hdXRoQWNjZXNzVG9rZW46IHRoZSBvcHRpb25hbCBPQXV0aDIgYWNjZXNzIHRva2VuXHJcbiAgICogQHJldHVybnM6IHRoZSBsb2dpbiByZXN1bHRcclxuICAgKi9cclxuICBsb2dpbihlbWFpbDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICBwYXNzd29yZDogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwsXHJcbiAgICByZW1lbWJlcjogYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQgPSBmYWxzZSxcclxuICAgIG9hdXRoOiBMb2dpbk9BdXRoVHlwZSB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsLFxyXG4gICAgb2F1dGhBY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCA9IG51bGwpIHtcclxuICAgIHRoaXMubG9nZ2luZ0luLnNldCh0cnVlKTtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcclxuICAgICAgLnBvc3Q8QXBpUmVzdWx0PEV2b2x1dGlvbkxvZ2luUmVzdWx0Pj4oXHJcbiAgICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvbG9naW4yJyxcclxuICAgICAgICB7XHJcbiAgICAgICAgICB1c2VyOiBvYXV0aCA/IG51bGwgOiBlbWFpbCxcclxuICAgICAgICAgIHBhc3N3b3JkOiBvYXV0aCA/IG51bGwgOiBwYXNzd29yZCxcclxuICAgICAgICAgIGNsaWVudElkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImV2b2x1dGlvbl9jbGllbnRfaWRcIiksXHJcbiAgICAgICAgICBPQVVUSDogb2F1dGhcclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGhlYWRlcnM6XHJcbiAgICAgICAgICAgICFvYXV0aFxyXG4gICAgICAgICAgICAgID8gbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgICAgICAgICA6IG5ldyBIdHRwSGVhZGVycygpXHJcbiAgICAgICAgICAgICAgICAuc2V0KFwiQXV0aG9yaXphdGlvblwiLCBvYXV0aEFjY2Vzc1Rva2VuID8/ICcnKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuZGlhbG9nU2VydmljZS5jbGVhckJ1c3koKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcihlcnIgPT4geyB0aGlzLmhhbmRsZUxvZ2luRXJyb3IoKTsgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gZXJyKSB9KSxcclxuICAgICAgICBtYXAoKHI6IEFwaVJlc3VsdDxFdm9sdXRpb25Mb2dpblJlc3VsdD4pID0+IHtcclxuICAgICAgICAgIHRoaXMubG9nZ2luZ0luLnNldChmYWxzZSk7XHJcbiAgICAgICAgICBpZiAoci5zdWNjZXNzKSB7XHJcbiAgICAgICAgICAgIC8vIFN0b3JlIGFjY2VzcyB0b2tlblxyXG4gICAgICAgICAgICB0aGlzLnNldFRva2VuKHIudmFsdWUpO1xyXG4gICAgICAgICAgICBjb25zdCBsb2dpbkluZm86IEV2b2x1dGlvbkxvZ2luSW5mbyA9IHtcclxuICAgICAgICAgICAgICBjb250ZXh0OiByLnZhbHVlLmNvbnRleHQsXHJcbiAgICAgICAgICAgICAgT0FVVEg6IG9hdXRoXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFvYXV0aCkge1xyXG4gICAgICAgICAgICAgIGxvZ2luSW5mby51c2VyQ3JlZGVudGlhbHMgPVxyXG4gICAgICAgICAgICAgICAgU3lzdGVtVXRpbHMuY2lwaGVyKFxyXG4gICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XHJcbiAgICAgICAgICAgICAgICAgICAgZW1haWw6IGVtYWlsLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcclxuICAgICAgICAgICAgICAgICAgICByZW1lbWJlcjogcmVtZW1iZXIsXHJcbiAgICAgICAgICAgICAgICAgIH0pLCBsb2dpbkluZm8uY29udGV4dC51c2VySWQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fbG9naW5JbmZvID0gbG9naW5JbmZvLmNvbnRleHQ7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvcmVMb2dpbigpO1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlZEluLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgLy8gTm90aWZ5XHJcbiAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZS5zZW5kTWVzc2FnZShFdm9sdXRpb25NZXNzYWdlcy5MT0dJTl9DT01QTEVURUQpO1xyXG4gICAgICAgICAgICAvLyBLZWVwIGFsaXZlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0S2VlcEFsaXZlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gcjtcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGVyZm9ybSBsb2dvdXRcclxuICAgKi9cclxuICBsb2dvdXQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8YW55Pih0aGlzLl9zZXJ2aWNlVXJpICsgJy9sb2dvdXQnLCB7fSkucGlwZShcclxuICAgICAgZmluYWxpemUoKCkgPT4geyB0aGlzLnJlbW92ZUtlZXBBbGl2ZSgpOyB0aGlzLmRpYWxvZ1NlcnZpY2UuY2xlYXJCdXN5KCk7IH0pLFxyXG4gICAgICBtYXAociA9PiB7XHJcbiAgICAgICAgdGhpcy5jbGVhcigpO1xyXG4gICAgICAgIHJldHVybiByXHJcbiAgICAgIH0pLFxyXG4gICAgICBjYXRjaEVycm9yKChfZSkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICByZXR1cm4gb2YoW10pO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgKiBTd2l0Y2ggdGhlIGN1cnJlbnQgbG9naW4gdG8gYSBuZXcgb25lIHdpdGggdGhlIHNhbWUgY3JlZGVudGlhbHMgZXhjZXB0IHJvbGUgcG9zc2libHkgKGNvbnRleHQgY2hhbmdlKVxyXG4gICogQHBhcmFtIGlkIDogbmV3IHVzZXIgaWRcclxuICAqL1xyXG4gIGxvZ2luU3dpdGNoKGlkOiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnRcclxuICAgICAgLnBvc3Q8QXBpUmVzdWx0PEV2b2x1dGlvbkxvZ2luUmVzdWx0Pj4oXHJcbiAgICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvbG9naW4tc3dpdGNoLycsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdXNlcklkOiBpZCxcclxuICAgICAgICAgIGNsaWVudElkOiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcImV2b2x1dGlvbl9jbGllbnRfaWRcIilcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZUxvZ2luRXJyb3IoKTtcclxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgbWFwKChyOiBBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmxvZ2dpbmdJbi5zZXQoZmFsc2UpO1xyXG4gICAgICAgICAgaWYgKHIuc3VjY2Vzcykge1xyXG4gICAgICAgICAgICAvLyBTdG9yZSBhY2Nlc3MgdG9rZW5cclxuICAgICAgICAgICAgdGhpcy5zZXRUb2tlbihyLnZhbHVlKTtcclxuICAgICAgICAgICAgdGhpcy5fbG9naW5JbmZvID0gci52YWx1ZS5jb250ZXh0O1xyXG4gICAgICAgICAgICB0aGlzLmxvZ2dlZEluLnNldCh0cnVlKTtcclxuICAgICAgICAgICAgLy8gTm90aWZ5XHJcbiAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZS5zZW5kTWVzc2FnZShFdm9sdXRpb25NZXNzYWdlcy5MT0dJTl9DT01QTEVURUQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHI7XHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gKiBIYW5kbGUgbG9naW4gZXJyb3JcclxuICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVMb2dpbkVycm9yKCkge1xyXG4gICAgdGhpcy5sb2dnaW5nSW4uc2V0KGZhbHNlKTtcclxuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdldm9sdXRpb25fbG9naW4nKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXQgbG9naW4gcmVmcmVzaCB0aW1lciBhbmQgbG9naW4gc3RhdGVcclxuICAgKi9cclxuICByZXNldCgpIHtcclxuICAgIC8vIENsZWFyIGxvZ2luIGluZm9cclxuICAgIHRoaXMuX2xvZ2luSW5mbyA9IG51bGw7XHJcbiAgICAvLyBMb2dnZWQgb3V0XHJcbiAgICB0aGlzLmxvZ2dlZEluLnNldChmYWxzZSk7XHJcbiAgICAvLyBOb3RpZnlcclxuICAgIHRoaXMuYnJvYWRjYXN0U2VydmljZS5zZW5kTWVzc2FnZShFdm9sdXRpb25NZXNzYWdlcy5MT0dPVVRfQ09NUExFVEVEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIGxvZ2luIGRhdGFcclxuICAgKi9cclxuICBjbGVhcigpIHtcclxuICAgIC8vIENsZWFyIGxvY2FsIHN0b3JhZ2VcclxuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2V2b2x1dGlvbl9qd3QnKTtcclxuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2V2b2x1dGlvbl9qd3RfcmVmcmVzaCcpO1xyXG4gICAgc2Vzc2lvblN0b3JhZ2UucmVtb3ZlSXRlbSgnZXZvbHV0aW9uX29hdXRoJyk7XHJcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnZXZvbHV0aW9uX2xvZ2luJyk7XHJcbiAgICAvLyBSZXNldCBsb2dpblxyXG4gICAgdGhpcy5yZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBQZXJmb3JtIHRva2VuIHJlZnJlc2hcclxuICAqL1xyXG4gIHJlZnJlc2goKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvcmVmcmVzaDIvP3Rva2VuPScgKyB0aGlzLmdldFRva2VuKHRydWUpXHJcbiAgICApLnBpcGUobWFwKChyOiBBcGlSZXN1bHQ8RXZvbHV0aW9uTG9naW5SZXN1bHQ+KSA9PiB7XHJcbiAgICAgIC8vIFVwZGF0ZSB0b2tlblxyXG4gICAgICB0aGlzLnNldFRva2VuKHIudmFsdWUpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnZlcnQgZm9sZGVycyBpbiBhIHRyZWUgb2YgTm9kZSBvYmplY3QuXHJcbiAgICogQHBhcmFtIGZvbGRlcnMgOiB0aGUgc3ViZm9sZGVycyBncm91cCBvciBudWxsIHRvIHJvb3RcclxuICAgKi9cclxuICB0b05vZGVzKGZvbGRlcnM6IElOb2RlW10pOiBJTm9kZVtdIHtcclxuICAgIHJldHVybiB0aGlzLl90b05vZGVzKGZvbGRlcnMsIG51bGwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29udmVydCBmb2xkZXJzIGluIGEgdHJlZSBvZiBOb2RlIG9iamVjdC5cclxuICAgKiBAcGFyYW0gZm9sZGVycyA6IHRoZSBjaGlsZHJlbiBncm91cCBvciBudWxsIHRvIHJvb3RcclxuICAgKi9cclxuICBwcml2YXRlIF90b05vZGVzKGZvbGRlcnM6IElOb2RlW10sIHBhcmVudDogSU5vZGUgfCBudWxsKTogSU5vZGVbXSB7XHJcbiAgICBsZXQgbm9kZXM6IElOb2RlW10gPSBbXTtcclxuICAgIGZvbGRlcnMuZm9yRWFjaCgobikgPT4ge1xyXG4gICAgICBsZXQgbm9kZTogSU5vZGUgPSB7XHJcbiAgICAgICAgaWQ6IG4uaWQsXHJcbiAgICAgICAgbmFtZTogbi5uYW1lLFxyXG4gICAgICAgIGNvdW50OiBuLmNvdW50LFxyXG4gICAgICAgIHBhcmVudDogcGFyZW50LFxyXG4gICAgICAgIGNoaWxkcmVuOiBudWxsLFxyXG4gICAgICAgIGJhZzogbixcclxuICAgICAgfTtcclxuICAgICAgbm9kZS5jaGlsZHJlbiA9XHJcbiAgICAgICAgbi5jaGlsZHJlbiAmJiBuLmNoaWxkcmVuLmxlbmd0aCA+IDBcclxuICAgICAgICAgID8gdGhpcy5fdG9Ob2RlcyhuLmNoaWxkcmVuLCBub2RlKVxyXG4gICAgICAgICAgOiBbXTtcclxuICAgICAgbm9kZXMucHVzaChub2RlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG5vZGVzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgdGhlIHRheG9ub215XHJcbiAgICovXHJcbiAgZ2V0VGF4b25vbXkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXN1bHQ8Rm9sZGVyVHJlZT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy90YXhvbm9teSdcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICogUmV0cmlldmUgZ3JvdXBzXHJcbiAqIEBwYXJhbSBncm91cDogdGhlIGdyb3VwIG51bWJlclxyXG4gKiBAcGFyYW0gcmVnaXN0ZXI6IHRoZSBvcHRpb25hbCByZWdpc3RlciBpZC4gRGVmYXVsdCBpcyBudWxsLlxyXG4gKi9cclxuICBnZXRHcm91cHMoZ3JvdXA6IG51bWJlciA9IDEsIHJlZ2lzdGVyOiBudW1iZXIgfCBudWxsID0gbnVsbCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBpUmVzdWx0PHN0cmluZ1tdPj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgK1xyXG4gICAgICAocmVnaXN0ZXJcclxuICAgICAgICA/ICcvY29tcGxpYW5jZS9ncm91cHMvP2dyb3VwPScgK1xyXG4gICAgICAgIGdyb3VwICtcclxuICAgICAgICAnJnJlZ2lzdGVyPScgK1xyXG4gICAgICAgIHJlZ2lzdGVyXHJcbiAgICAgICAgOiAnL2NvbXBsaWFuY2UvZ3JvdXBzLz9ncm91cD0nICsgZ3JvdXApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8vL1xyXG4gIC8vIENPTlRFWFRcclxuICAvLy8vXHJcbiAgLyoqXHJcbiAgICogQ2hhbmdlIGNvbnRleHRcclxuICAgKi9cclxuICBjaGFuZ2VDb250ZXh0KHBhcmFtczogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzdWx0PGFueT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9jb21wbGlhbmNlL2NvbnRleHQnLFxyXG4gICAgICBwYXJhbXNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLy8vXHJcbiAgLy8gUkVHSVNURVJTXHJcbiAgLy8vL1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgYSByZWdpc3RlclxyXG4gICAqIEBwYXJhbSBpZCB0aGUgcmVnaXN0ZXIgaWRcclxuICAgKi9cclxuICBnZXRSZWdpc3RlcihpZDogbnVtYmVyKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcGlSZXN1bHQ8YW55Pj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgK1xyXG4gICAgICAnL2NvbXBsaWFuY2UvcmVnaXN0ZXJzLycgKyBpZFxyXG4gICAgKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBDb2xsZWN0IHJlZ2lzdGVyIHByb2ZpbGVzXHJcbiAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgY29sbGVjdFJlZ2lzdGVyUHJvZmlsZXMocGFyYW1zOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8YW55Pj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgK1xyXG4gICAgICAnL2NvbXBsaWFuY2UvcmVnaXN0ZXJzL3Byb2ZpbGVzL2NvbGxlY3QnLFxyXG4gICAgICBwYXJhbXNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8vL1xyXG4gIC8vIExBV1NcclxuICAvLy8vXHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZCBvbmUgb3IgbW9yZSBsYXdzXHJcbiAgICogQHBhcmFtIHBhcmFtcyBwYXJhbWV0ZXJzXHJcbiAgICovXHJcbiAgYWRkTGF3cyhwYXJhbXM6IEV2b2x1dGlvbkNvbXBsaWFuY2VMYXdzQWRkUGFyYW1zKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzdWx0PEV2b2x1dGlvbkNvbXBsaWFuY2VMYXdbXT4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9jb21wbGlhbmNlL2xhd3MvYWRkJyxcclxuICAgICAgcGFyYW1zXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8vL1xyXG4gIC8vIEFDVElWSVRJRVNcclxuICAvLy8vXHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIG9uZSBvciBtb3JlIGFjdGl2aXRpZXNcclxuICAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnNcclxuICAgKi9cclxuICBhZGRBY3Rpdml0aWVzKHBhcmFtczogRXZvbHV0aW9uQ29tcGxpYW5jZUFjdGl2aXRpZXNBZGRQYXJhbXMpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8RXZvbHV0aW9uQ29tcGxpYW5jZUFjdGl2aXR5Pj4oXHJcbiAgICAgIHRoaXMuX3NlcnZpY2VVcmkgKyAnL2NvbXBsaWFuY2UvYWN0aXZpdGllcy9hZGQnLFxyXG4gICAgICBwYXJhbXNcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEV4cG9ydCBsYXdzXHJcbiAgKiBAcGFyYW0gcGFyYW1zIHBhcmFtZXRlcnNcclxuICAqL1xyXG4gIGV4cG9ydExhd3MocGFyYW1zOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdChcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvY29tcGxpYW5jZS9sYXdzL2V4cG9ydCcsXHJcbiAgICAgIHBhcmFtcyxcclxuICAgICAgeyByZXNwb25zZVR5cGU6ICdibG9iJyB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLy8vXHJcbiAgLy8gTElOS1NcclxuICAvLy9cclxuXHJcbiAgLyoqXHJcbiAgKiBTYXZlIGEgdXNlciBsaW5rXHJcbiAgKiBAcGFyYW0gaXRlbTogdGhlIHVzZXIgbGlua1xyXG4gICovXHJcbiAgc2F2ZUxpbmsoaXRlbTogRXZvbHV0aW9uVXNlckxpbmspIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucG9zdDxBcGlSZXN1bHQ8Ym9vbGVhbj4+KFxyXG4gICAgICB0aGlzLl9zZXJ2aWNlVXJpICsgJy9hY2NvdW50L2xpbmtzL3NhdmUnLFxyXG4gICAgICBpdGVtXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlIGEgdXNlciBsaW5rXHJcbiAgICogQHBhcmFtIGl0ZW06IHRoZSB1c2VyIGxpbmtcclxuICAgKi9cclxuICBkZWxldGVMaW5rKGl0ZW06IEV2b2x1dGlvblVzZXJMaW5rKSB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBpUmVzdWx0PGJvb2xlYW4+PihcclxuICAgICAgdGhpcy5fc2VydmljZVVyaSArICcvYWNjb3VudC9saW5rcy9kZWxldGUnLFxyXG4gICAgICBpdGVtXHJcbiAgICApO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Public API Surface of ars-utils
|
|
3
|
-
*/
|
|
4
|
-
export * from './common/common.module';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2Fycy11dGlscy9ldm9sdXRpb24uY29tbW9uL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLHdCQUF3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogUHVibGljIEFQSSBTdXJmYWNlIG9mIGFycy11dGlsc1xyXG4gKi9cclxuXHJcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2NvbW1vbi5tb2R1bGUnO1xyXG5cclxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './public_api';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJzZWRpemlvbmktYXJzLXV0aWxzLWhlbHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hcnMtdXRpbHMvaGVscC9hcnNlZGl6aW9uaS1hcnMtdXRpbHMtaGVscC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpY19hcGknO1xuIl19
|