@esfaenza/extensions 15.2.45 → 16.2.0
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/{esm2020 → esm2022}/esfaenza-extensions.mjs +4 -4
- package/esm2022/lib/models/CallResult.mjs +24 -0
- package/esm2022/lib/models/CsvHeaders.mjs +26 -0
- package/{esm2020 → esm2022}/lib/models/ExportConsts.mjs +31 -31
- package/esm2022/lib/models/ExtensionsModuleConfig.mjs +10 -0
- package/esm2022/lib/models/GenericItem.mjs +10 -0
- package/{esm2020 → esm2022}/lib/models/InboundMessageTypes.mjs +6 -6
- package/esm2022/lib/models/InterComMessage.mjs +16 -0
- package/{esm2020 → esm2022}/lib/models/TypeCode.mjs +24 -24
- package/{esm2020 → esm2022}/lib/modules/extensions.module.mjs +32 -32
- package/esm2022/lib/pipes/loc_date.pipe.mjs +38 -0
- package/esm2022/lib/services/extensions.base.mjs +30 -0
- package/esm2022/lib/services/extensions.clipboard.service.mjs +221 -0
- package/esm2022/lib/services/extensions.dates.service.mjs +244 -0
- package/esm2022/lib/services/extensions.embedding.service.mjs +213 -0
- package/esm2022/lib/services/extensions.exports.service.mjs +617 -0
- package/esm2022/lib/services/extensions.hashing.service.mjs +308 -0
- package/esm2022/lib/services/extensions.intercom.service.mjs +52 -0
- package/esm2022/lib/services/extensions.messages.service.mjs +450 -0
- package/esm2022/lib/services/extensions.utilities.service.mjs +250 -0
- package/{esm2020 → esm2022}/lib/tokens.mjs +11 -11
- package/{esm2020 → esm2022}/public-api.mjs +21 -21
- package/{fesm2020 → fesm2022}/esfaenza-extensions.mjs +2509 -2441
- package/fesm2022/esfaenza-extensions.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/models/CallResult.d.ts +23 -23
- package/lib/models/CsvHeaders.d.ts +25 -25
- package/lib/models/ExportConsts.d.ts +31 -31
- package/lib/models/ExtensionsModuleConfig.d.ts +9 -9
- package/lib/models/GenericItem.d.ts +9 -9
- package/lib/models/InboundMessageTypes.d.ts +5 -5
- package/lib/models/InterComMessage.d.ts +12 -12
- package/lib/models/TypeCode.d.ts +23 -23
- package/lib/modules/extensions.module.d.ts +11 -11
- package/lib/pipes/loc_date.pipe.d.ts +24 -24
- package/lib/services/extensions.base.d.ts +22 -22
- package/lib/services/extensions.clipboard.service.d.ts +54 -54
- package/lib/services/extensions.dates.service.d.ts +99 -99
- package/lib/services/extensions.embedding.service.d.ts +28 -28
- package/lib/services/extensions.exports.service.d.ts +234 -234
- package/lib/services/extensions.hashing.service.d.ts +121 -121
- package/lib/services/extensions.intercom.service.d.ts +28 -28
- package/lib/services/extensions.messages.service.d.ts +195 -195
- package/lib/services/extensions.utilities.service.d.ts +107 -107
- package/lib/tokens.d.ts +11 -11
- package/package.json +13 -19
- package/public-api.d.ts +18 -18
- package/esm2020/lib/models/CallResult.mjs +0 -6
- package/esm2020/lib/models/CsvHeaders.mjs +0 -6
- package/esm2020/lib/models/ExtensionsModuleConfig.mjs +0 -4
- package/esm2020/lib/models/GenericItem.mjs +0 -6
- package/esm2020/lib/models/InterComMessage.mjs +0 -14
- package/esm2020/lib/pipes/loc_date.pipe.mjs +0 -37
- package/esm2020/lib/services/extensions.base.mjs +0 -29
- package/esm2020/lib/services/extensions.clipboard.service.mjs +0 -219
- package/esm2020/lib/services/extensions.dates.service.mjs +0 -242
- package/esm2020/lib/services/extensions.embedding.service.mjs +0 -208
- package/esm2020/lib/services/extensions.exports.service.mjs +0 -615
- package/esm2020/lib/services/extensions.hashing.service.mjs +0 -310
- package/esm2020/lib/services/extensions.intercom.service.mjs +0 -54
- package/esm2020/lib/services/extensions.messages.service.mjs +0 -433
- package/esm2020/lib/services/extensions.utilities.service.mjs +0 -252
- package/fesm2015/esfaenza-extensions.mjs +0 -2513
- package/fesm2015/esfaenza-extensions.mjs.map +0 -1
- package/fesm2020/esfaenza-extensions.mjs.map +0 -1
|
@@ -1,433 +0,0 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Injectable, Inject, Optional, Injector } from "@angular/core";
|
|
3
|
-
// Configurazioni
|
|
4
|
-
import { ToastrService } from "ngx-toastr";
|
|
5
|
-
import swal from "sweetalert2";
|
|
6
|
-
// RXJS
|
|
7
|
-
import { of } from "rxjs";
|
|
8
|
-
import { filter, first, map, take } from "rxjs/operators";
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@esfaenza/localizations";
|
|
11
|
-
import * as i2 from "./extensions.hashing.service";
|
|
12
|
-
/**
|
|
13
|
-
* Service che fornisce funzionalità di alert nei tipi fondamentali: success, info, warning e danger
|
|
14
|
-
*/
|
|
15
|
-
export class MessageService {
|
|
16
|
-
/** Costruttore @ignore */
|
|
17
|
-
constructor(injector, locProvider, hash) {
|
|
18
|
-
this.injector = injector;
|
|
19
|
-
this.locProvider = locProvider;
|
|
20
|
-
this.hash = hash;
|
|
21
|
-
/** Oggetto statico in supporto alla localizzazione */
|
|
22
|
-
this.loc = {
|
|
23
|
-
'Confirm': { 'en-US': "Confirm", 'it-IT': "Conferma", },
|
|
24
|
-
'Cancel': { 'en-US': "Cancel", 'it-IT': "Annulla", },
|
|
25
|
-
'Close': { 'en-US': "Close", 'it-IT': "Chiudi", },
|
|
26
|
-
'Error': { 'en-US': "Error", 'it-IT': "Errore", },
|
|
27
|
-
'Info': { 'en-US': "Info", 'it-IT': "Informazione", },
|
|
28
|
-
'Success': { 'en-US': "Success", 'it-IT': "Successo", },
|
|
29
|
-
'Warning': { 'en-US': "Warning", 'it-IT': "Attenzione", }
|
|
30
|
-
};
|
|
31
|
-
/** Supporto all'Embedding */
|
|
32
|
-
this.Embedded = false;
|
|
33
|
-
this.MainWindow = null;
|
|
34
|
-
this.MessageObserver = null;
|
|
35
|
-
this.GuidRepsonseFunctionsMap = {};
|
|
36
|
-
this.init();
|
|
37
|
-
}
|
|
38
|
-
/** Getter per il servizio dei toast. ngx-toastr è fatta talmente male che la service dev'essere recuperata in questo modo */
|
|
39
|
-
get toastr() {
|
|
40
|
-
return this.injector.get(ToastrService);
|
|
41
|
-
}
|
|
42
|
-
configureEmbeddability(mainWindow, messageObserver) {
|
|
43
|
-
this.Embedded = true;
|
|
44
|
-
this.MainWindow = mainWindow;
|
|
45
|
-
this.MessageObserver = messageObserver;
|
|
46
|
-
}
|
|
47
|
-
async init() {
|
|
48
|
-
let LOCALE = this.locProvider ? await this.locProvider.Locale.pipe(first()).toPromise() : 'it-IT';
|
|
49
|
-
this.expiredSessionSwal = swal.mixin({
|
|
50
|
-
showCancelButton: false,
|
|
51
|
-
confirmButtonText: 'Login',
|
|
52
|
-
customClass: {
|
|
53
|
-
confirmButton: "btn btn-primary",
|
|
54
|
-
container: "app-wrap",
|
|
55
|
-
},
|
|
56
|
-
buttonsStyling: false,
|
|
57
|
-
reverseButtons: false,
|
|
58
|
-
allowOutsideClick: false,
|
|
59
|
-
icon: "warning"
|
|
60
|
-
});
|
|
61
|
-
this.successSwalWithCancel = swal.mixin({
|
|
62
|
-
title: this.loc["Success"][LOCALE],
|
|
63
|
-
customClass: {
|
|
64
|
-
confirmButton: "btn btn-primary",
|
|
65
|
-
cancelButton: "btn btn-secondary app-margin-right-10",
|
|
66
|
-
container: "app-wrap",
|
|
67
|
-
},
|
|
68
|
-
buttonsStyling: false,
|
|
69
|
-
reverseButtons: true,
|
|
70
|
-
showCancelButton: true,
|
|
71
|
-
confirmButtonText: this.loc["Confirm"][LOCALE],
|
|
72
|
-
cancelButtonText: this.loc["Cancel"][LOCALE],
|
|
73
|
-
icon: "success"
|
|
74
|
-
});
|
|
75
|
-
this.warningSwalWithCancel = swal.mixin({
|
|
76
|
-
title: this.loc["Warning"][LOCALE],
|
|
77
|
-
customClass: {
|
|
78
|
-
confirmButton: "btn btn-primary",
|
|
79
|
-
cancelButton: "btn btn-secondary app-margin-right-10",
|
|
80
|
-
container: "app-wrap",
|
|
81
|
-
},
|
|
82
|
-
buttonsStyling: false,
|
|
83
|
-
reverseButtons: true,
|
|
84
|
-
showCancelButton: true,
|
|
85
|
-
confirmButtonText: this.loc["Confirm"][LOCALE],
|
|
86
|
-
cancelButtonText: this.loc["Cancel"][LOCALE],
|
|
87
|
-
icon: "warning"
|
|
88
|
-
});
|
|
89
|
-
this.warningSwal = swal.mixin({
|
|
90
|
-
title: this.loc["Warning"][LOCALE],
|
|
91
|
-
customClass: {
|
|
92
|
-
confirmButton: "btn btn-primary",
|
|
93
|
-
container: "app-wrap",
|
|
94
|
-
},
|
|
95
|
-
buttonsStyling: false,
|
|
96
|
-
reverseButtons: true,
|
|
97
|
-
showCancelButton: false,
|
|
98
|
-
confirmButtonText: this.loc["Close"][LOCALE],
|
|
99
|
-
icon: "warning"
|
|
100
|
-
});
|
|
101
|
-
this.successSwal = swal.mixin({
|
|
102
|
-
title: this.loc["Success"][LOCALE],
|
|
103
|
-
customClass: {
|
|
104
|
-
confirmButton: "btn btn-primary",
|
|
105
|
-
container: "app-wrap",
|
|
106
|
-
},
|
|
107
|
-
buttonsStyling: false,
|
|
108
|
-
reverseButtons: true,
|
|
109
|
-
showCancelButton: false,
|
|
110
|
-
confirmButtonText: this.loc["Close"][LOCALE],
|
|
111
|
-
icon: "success"
|
|
112
|
-
});
|
|
113
|
-
this.errorSwal = swal.mixin({
|
|
114
|
-
title: this.loc["Error"][LOCALE],
|
|
115
|
-
customClass: {
|
|
116
|
-
confirmButton: "btn btn-primary",
|
|
117
|
-
container: "app-wrap",
|
|
118
|
-
},
|
|
119
|
-
buttonsStyling: false,
|
|
120
|
-
reverseButtons: true,
|
|
121
|
-
showCancelButton: false,
|
|
122
|
-
confirmButtonText: this.loc["Close"][LOCALE],
|
|
123
|
-
icon: "error"
|
|
124
|
-
});
|
|
125
|
-
this.infoSwal = swal.mixin({
|
|
126
|
-
title: this.loc["Info"][LOCALE],
|
|
127
|
-
customClass: {
|
|
128
|
-
confirmButton: "btn btn-primary",
|
|
129
|
-
container: "app-wrap",
|
|
130
|
-
},
|
|
131
|
-
buttonsStyling: false,
|
|
132
|
-
reverseButtons: true,
|
|
133
|
-
showCancelButton: false,
|
|
134
|
-
confirmButtonText: this.loc["Close"][LOCALE],
|
|
135
|
-
icon: "info"
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Presentazione di un semplice messaggio di successo
|
|
140
|
-
*
|
|
141
|
-
* Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
|
|
142
|
-
* Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
|
|
143
|
-
*
|
|
144
|
-
* @param {string} text Testo da mostrare
|
|
145
|
-
* @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
|
|
146
|
-
*/
|
|
147
|
-
simpleSuccess(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
|
|
148
|
-
if (this.Embedded) {
|
|
149
|
-
this.MainWindow.postMessage({ type: "alert", level: 'success', msg: text }, "*");
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
let tos = this.toastrOrSwal(secondaryNotificationType);
|
|
153
|
-
if (tos == "swal")
|
|
154
|
-
this.successSwal.fire("", text);
|
|
155
|
-
else
|
|
156
|
-
this.toastr.success(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* Presentazione di un semplice messaggio di informazione
|
|
160
|
-
*
|
|
161
|
-
* Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
|
|
162
|
-
* Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
|
|
163
|
-
*
|
|
164
|
-
* @param {string} text Testo da mostrare
|
|
165
|
-
* @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
|
|
166
|
-
*/
|
|
167
|
-
simpleInfo(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
|
|
168
|
-
if (this.Embedded) {
|
|
169
|
-
this.MainWindow.postMessage({ type: "alert", level: 'info', msg: text }, "*");
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
let tos = this.toastrOrSwal(secondaryNotificationType);
|
|
173
|
-
if (tos == "swal")
|
|
174
|
-
this.infoSwal.fire("", text);
|
|
175
|
-
else
|
|
176
|
-
this.toastr.info(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
|
|
177
|
-
}
|
|
178
|
-
/**
|
|
179
|
-
* Presentazione di un semplice messaggio di errore
|
|
180
|
-
*
|
|
181
|
-
* Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
|
|
182
|
-
* Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
|
|
183
|
-
*
|
|
184
|
-
* @param {string} text Testo da mostrare
|
|
185
|
-
* @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
|
|
186
|
-
*/
|
|
187
|
-
simpleError(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
|
|
188
|
-
if (this.Embedded) {
|
|
189
|
-
this.MainWindow.postMessage({ type: "alert", level: 'error', msg: text }, "*");
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
let tos = this.toastrOrSwal(secondaryNotificationType);
|
|
193
|
-
if (tos == "swal")
|
|
194
|
-
this.errorSwal.fire("", text);
|
|
195
|
-
else
|
|
196
|
-
this.toastr.error(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Presentazione di un semplice messaggio di avviso
|
|
200
|
-
*
|
|
201
|
-
* Se viene chiamato con le impostazioni di default e toastr è abilitato, viene mostrato al centro
|
|
202
|
-
* Se viene chiamato con override su toastr vuol dire che è una notifica secondaria e appare in alto a destra
|
|
203
|
-
*
|
|
204
|
-
* @param {string} text Testo da mostrare
|
|
205
|
-
* @param {"toastr" | "swal" | null} secondaryNotificationType Qualora sia una notifica secondaria, ne indica il tipo
|
|
206
|
-
*/
|
|
207
|
-
simpleWarning(text, secondaryNotificationType = null, secondaryNotificationTimeout = null) {
|
|
208
|
-
if (this.Embedded) {
|
|
209
|
-
this.MainWindow.postMessage({ type: "alert", level: 'warning', msg: text }, "*");
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
let tos = this.toastrOrSwal(secondaryNotificationType);
|
|
213
|
-
if (tos == "swal")
|
|
214
|
-
this.warningSwal.fire("", text);
|
|
215
|
-
else
|
|
216
|
-
this.toastr.warning(text, null, { positionClass: tos == "toastr" ? "toast-top-right" : "toast-top-center", timeOut: secondaryNotificationTimeout || (tos == "toastr" ? 0 : 5000), extendedTimeOut: tos == "toastr" ? 0 : 1000 });
|
|
217
|
-
}
|
|
218
|
-
/**
|
|
219
|
-
* Ripulisce tutti i messaggi presenti in un dato momento sullo schermo
|
|
220
|
-
*/
|
|
221
|
-
clearMessages() {
|
|
222
|
-
this.toastr.clear();
|
|
223
|
-
swal.close();
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* Mostra un messaggio di avviso con richiesta di conferma
|
|
227
|
-
*
|
|
228
|
-
* @param {string} title Titolo del messaggio
|
|
229
|
-
* @param {string} text Contenuto del messaggio
|
|
230
|
-
*
|
|
231
|
-
* @returns {Promise} Restituisce una Promise col risultato scelto dall'utente (conferma o no)
|
|
232
|
-
*/
|
|
233
|
-
promiseWarningWithChoice(title, text) {
|
|
234
|
-
return this.warningSwalWithCancel.fire(title, text);
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* In base alla configurazione attuale e all'eventuale override per la chiamata del caso indica se bisogna utilizzare toastr o sweetalert
|
|
238
|
-
*
|
|
239
|
-
* @param {"toastr" | "swal" | null} providerOverride Override alla modalità configurata
|
|
240
|
-
*
|
|
241
|
-
* @returns {"toastr" | "swal"} Indicazione su che provider di messaggi di avviso debba essere utilizzato
|
|
242
|
-
*/
|
|
243
|
-
toastrOrSwal(providerOverride) {
|
|
244
|
-
if (providerOverride != null)
|
|
245
|
-
return providerOverride;
|
|
246
|
-
return "swal";
|
|
247
|
-
}
|
|
248
|
-
simpleWarningWithChoice(title, text, onsuccess, onerror, confirmtext = "", aborttext = '') {
|
|
249
|
-
this.withChoiceBase("warning", title, text, onsuccess, onerror, confirmtext, aborttext);
|
|
250
|
-
}
|
|
251
|
-
simpleSuccessWithChoice(title, text, onsuccess, onerror, confirmtext = "", aborttext = '') {
|
|
252
|
-
this.withChoiceBase("success", title, text, onsuccess, onerror, confirmtext, aborttext);
|
|
253
|
-
}
|
|
254
|
-
withChoiceBase(level, title, text, onsuccess, onerror, confirmtext = "", aborttext = '') {
|
|
255
|
-
if (this.Embedded) {
|
|
256
|
-
let guid = this.hash.getGUID();
|
|
257
|
-
this.GuidRepsonseFunctionsMap[guid] = { onsuccess, onerror };
|
|
258
|
-
this.MainWindow.postMessage({ type: "confirm", level, title, text, guid }, "*");
|
|
259
|
-
// Observe sulla risposta
|
|
260
|
-
console.log("Inviata confirm request alla pagina principale, in attesa di risposta...");
|
|
261
|
-
this.MessageObserver.pipe(filter(event => event?.data?.type == "confirm-response" && event?.data?.guid == guid), take(1)).subscribe(event => {
|
|
262
|
-
console.log("Event listener su window-message. Risposta pergiunta");
|
|
263
|
-
if (event?.data?.result === true)
|
|
264
|
-
this.GuidRepsonseFunctionsMap[guid].onsuccess();
|
|
265
|
-
else if (event?.data?.result === true)
|
|
266
|
-
this.GuidRepsonseFunctionsMap[guid].onerror();
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
else
|
|
270
|
-
(level == "warning" ? this._simpleWarningWithChoice.bind(this) : this._simpleSuccessWithChoice.bind(this))(title, text, onsuccess, onerror, confirmtext, aborttext);
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Mostra un messaggio di avviso con richiesta di conferma e gestisce il risultato chiamato i callback **onsuccess** o **onerror**
|
|
274
|
-
*
|
|
275
|
-
* @param {string} title Titolo del messaggio
|
|
276
|
-
* @param {string} text Contenuto del messaggio
|
|
277
|
-
* @param {Function} onsuccess Callback da chimare su conferma
|
|
278
|
-
* @param {Function} onerror Callback da chimare su errori
|
|
279
|
-
*/
|
|
280
|
-
_simpleWarningWithChoice(title, text, onconfirm = null, onabort = null, confirmtext = "", aborttext = '') {
|
|
281
|
-
this._simpleWithChoice(this.warningSwalWithCancel, title, text, onconfirm, onabort, confirmtext, aborttext);
|
|
282
|
-
}
|
|
283
|
-
/**
|
|
284
|
-
* Mostra un messaggio di success con richiesta di conferma e gestisce il risultato chiamato i callback **onconfirm** o **onabort**
|
|
285
|
-
*
|
|
286
|
-
* @param {string} title Titolo del messaggio
|
|
287
|
-
* @param {string} text Contenuto del messaggio
|
|
288
|
-
* @param {Function} onconfirm Callback da chimare su conferma
|
|
289
|
-
* @param {Function} onabort Callback da chimare su annullamento
|
|
290
|
-
* @param {string} confirmtext Testo del pulsante di azione
|
|
291
|
-
* @param {string} aborttext Testo del pulsante di annullamento
|
|
292
|
-
*/
|
|
293
|
-
_simpleSuccessWithChoice(title, text, onconfirm = null, onabort = null, confirmtext = "", aborttext = '') {
|
|
294
|
-
this._simpleWithChoice(this.successSwalWithCancel, title, text, onconfirm, onabort, confirmtext, aborttext);
|
|
295
|
-
}
|
|
296
|
-
/**
|
|
297
|
-
* Metodo base per richiedere una scelta all'utente
|
|
298
|
-
*
|
|
299
|
-
* @param {any} swal Swal mixin da utilizzare per visualizzare il messaggio di choice
|
|
300
|
-
* @param {string} title Titolo del messaggio
|
|
301
|
-
* @param {string} text Contenuto del messaggio
|
|
302
|
-
* @param {Function} onconfirm Callback da chimare su conferma
|
|
303
|
-
* @param {Function} onabort Callback da chimare su annullamento
|
|
304
|
-
* @param {string} confirmtext Testo del pulsante di azione
|
|
305
|
-
* @param {string} aborttext Testo del pulsante di annullamento
|
|
306
|
-
*/
|
|
307
|
-
_simpleWithChoice(swal, title, text, onconfirm = null, onabort = null, confirmtext = "", aborttext = '') {
|
|
308
|
-
var configuration = {
|
|
309
|
-
title: title,
|
|
310
|
-
html: text
|
|
311
|
-
};
|
|
312
|
-
if (confirmtext)
|
|
313
|
-
configuration["confirmButtonText"] = confirmtext;
|
|
314
|
-
if (aborttext)
|
|
315
|
-
configuration["cancelButtonText"] = aborttext;
|
|
316
|
-
swal.fire(configuration).then((result) => {
|
|
317
|
-
if (result.value && onconfirm)
|
|
318
|
-
onconfirm();
|
|
319
|
-
else if (onabort)
|
|
320
|
-
onabort();
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Mostra un messaggio di avviso con richiesta di conferma e gestisce il risultato chiamato i callback **onsuccess** o **onerror**
|
|
325
|
-
*
|
|
326
|
-
* @param {string} title Titolo del messaggio
|
|
327
|
-
* @param {string} text Contenuto del messaggio
|
|
328
|
-
*/
|
|
329
|
-
observableSimpleWarningWithChoice(title, text) {
|
|
330
|
-
return of(this.warningSwalWithCancel.fire(title, text)).pipe(map(t => !!t.value));
|
|
331
|
-
}
|
|
332
|
-
/**
|
|
333
|
-
* Mostra un messaggio di avviso che la sessione corrente è scaduta e propone all'utente di navigare al login. Qualora l'utente decidesse di farlo
|
|
334
|
-
* verrà chiamata la funzione di callback **onnavigate
|
|
335
|
-
*
|
|
336
|
-
* @param {string} title Titolo del messaggio
|
|
337
|
-
* @param {string} text Contenuto del messaggio
|
|
338
|
-
* @param {Function} onnavigate Callback da chimare su navigazione in corso
|
|
339
|
-
*/
|
|
340
|
-
expiredSessionMessage(title, text, onnavigate = null) {
|
|
341
|
-
this.expiredSessionSwal.fire(title, text).then((result) => {
|
|
342
|
-
if (result.value && onnavigate)
|
|
343
|
-
onnavigate();
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
/**
|
|
347
|
-
* Metodo helper per gestire in maniera standardizzata una risposta di tipo **CallResult**
|
|
348
|
-
*
|
|
349
|
-
* @param {CallResult} response Risposta ricevuta dal server
|
|
350
|
-
* @param {string} successMsg Messaggio da visualizzare in caso di successo
|
|
351
|
-
* @param {string} errorMsg Messaggio da visualizzare in caso di fallimento
|
|
352
|
-
* @param {Function} postSuccess Callback da chimare in caso di successo
|
|
353
|
-
* @param {Function} postFailure Callback da chimare in caso di fallimento
|
|
354
|
-
*/
|
|
355
|
-
manageCallResultResponse(response, successMsg, errorMsg, postSuccess = null, postFailure = null) {
|
|
356
|
-
let anyReponse = response;
|
|
357
|
-
if (response.success || anyReponse.Success) {
|
|
358
|
-
if (response.haswarning || anyReponse.HasWarning)
|
|
359
|
-
this.simpleWarning(response.warning || anyReponse.Warning);
|
|
360
|
-
else if (successMsg)
|
|
361
|
-
this.simpleSuccess(successMsg);
|
|
362
|
-
if (postSuccess)
|
|
363
|
-
postSuccess();
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
this.simpleError((errorMsg ? errorMsg + ": " : "") + ((response.haserror || anyReponse.HasError) ? (response.error || anyReponse.Error) : '[NO ERR.]'));
|
|
367
|
-
if (postFailure)
|
|
368
|
-
postFailure();
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Metodo helper per gestire in maniera standardizzata una risposta di tipo **string**, considerando che:
|
|
373
|
-
*
|
|
374
|
-
* Stringa vuota --> Tutto bene
|
|
375
|
-
*
|
|
376
|
-
* Stringa piena --> Questo è il messaggio d'errore per cui la chiamata è fallita
|
|
377
|
-
*
|
|
378
|
-
* @param {string} response Risposta ricevuta dal server
|
|
379
|
-
* @param {string} successMsg Messaggio da visualizzare in caso di successo
|
|
380
|
-
* @param {string} errorMsg Messaggio da visualizzare in caso di fallimento
|
|
381
|
-
* @param {Function} postSuccess Callback da chimare in caso di successo
|
|
382
|
-
* @param {Function} postFailure Callback da chimare in caso di fallimento
|
|
383
|
-
*/
|
|
384
|
-
manageStringResponse(response, successMsg, errorMsg, postSuccess = null, postFailure = null) {
|
|
385
|
-
if (!response) {
|
|
386
|
-
if (successMsg)
|
|
387
|
-
this.simpleSuccess(successMsg);
|
|
388
|
-
if (postSuccess)
|
|
389
|
-
postSuccess();
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
if (errorMsg)
|
|
393
|
-
this.simpleError(errorMsg + ": " + response);
|
|
394
|
-
if (postFailure)
|
|
395
|
-
postFailure();
|
|
396
|
-
}
|
|
397
|
-
}
|
|
398
|
-
/**
|
|
399
|
-
* Metodo helper per gestire in maniera standardizzata una risposta di tipo **boolean**
|
|
400
|
-
*
|
|
401
|
-
* @param {string} response Risposta ricevuta dal server
|
|
402
|
-
* @param {string} successMsg Messaggio da visualizzare in caso di successo
|
|
403
|
-
* @param {string} errorMsg Messaggio da visualizzare in caso di fallimento
|
|
404
|
-
* @param {Function} postSuccess Callback da chimare in caso di successo
|
|
405
|
-
* @param {Function} postFailure Callback da chimare in caso di fallimento
|
|
406
|
-
*/
|
|
407
|
-
manageStringResponseBool(response, successMsg, errorMsg, postSuccess = null, postFailure = null) {
|
|
408
|
-
if (response) {
|
|
409
|
-
if (successMsg)
|
|
410
|
-
this.simpleSuccess(successMsg);
|
|
411
|
-
if (postSuccess)
|
|
412
|
-
postSuccess();
|
|
413
|
-
}
|
|
414
|
-
else {
|
|
415
|
-
if (errorMsg)
|
|
416
|
-
this.simpleError(errorMsg);
|
|
417
|
-
if (postFailure)
|
|
418
|
-
postFailure();
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
MessageService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MessageService, deps: [{ token: Injector }, { token: i1.BaseLocalization, optional: true }, { token: i2.HashingService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
423
|
-
MessageService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MessageService, providedIn: "root" });
|
|
424
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: MessageService, decorators: [{
|
|
425
|
-
type: Injectable,
|
|
426
|
-
args: [{ providedIn: "root" }]
|
|
427
|
-
}], ctorParameters: function () { return [{ type: i0.Injector, decorators: [{
|
|
428
|
-
type: Inject,
|
|
429
|
-
args: [Injector]
|
|
430
|
-
}] }, { type: i1.BaseLocalization, decorators: [{
|
|
431
|
-
type: Optional
|
|
432
|
-
}] }, { type: i2.HashingService }]; } });
|
|
433
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXh0ZW5zaW9ucy5tZXNzYWdlcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXh0ZW5zaW9ucy9zcmMvbGliL3NlcnZpY2VzL2V4dGVuc2lvbnMubWVzc2FnZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUt2RSxpQkFBaUI7QUFDakIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLElBQUksTUFBTSxhQUFhLENBQUM7QUFFL0IsT0FBTztBQUNQLE9BQU8sRUFBdUIsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQVMxRDs7R0FFRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBNEN2QiwyQkFBMkI7SUFDM0IsWUFBNkMsUUFBa0IsRUFBc0IsV0FBNkIsRUFBVSxJQUFvQjtRQUFuRyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQXNCLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWdCO1FBM0NoSixzREFBc0Q7UUFDOUMsUUFBRyxHQUFHO1lBQ1YsU0FBUyxFQUFFLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxHQUFHO1lBQ3ZELFFBQVEsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsR0FBRztZQUNwRCxPQUFPLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUc7WUFDakQsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFB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Y1EsY0FBYyxrQkE2Q0ksUUFBUTsrR0E3QzFCLGNBQWMsY0FERCxNQUFNOzJGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRTs7MEJBOENWLE1BQU07MkJBQUMsUUFBUTs7MEJBQStCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyXHJcbmltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWwsIEluamVjdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIEVzXHJcbmltcG9ydCB7IEJhc2VMb2NhbGl6YXRpb24gfSBmcm9tIFwiQGVzZmFlbnphL2xvY2FsaXphdGlvbnNcIjtcclxuXHJcbi8vIENvbmZpZ3VyYXppb25pXHJcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tIFwibmd4LXRvYXN0clwiO1xyXG5pbXBvcnQgc3dhbCBmcm9tIFwic3dlZXRhbGVydDJcIjtcclxuXHJcbi8vIFJYSlNcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgb2YgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHRha2UgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQ2FsbFJlc3VsdCB9IGZyb20gXCIuLi9tb2RlbHMvQ2FsbFJlc3VsdFwiO1xyXG5cclxuLy8gU2Vydml6aVxyXG5pbXBvcnQgeyBBcHBFbWJlZGRpbmdFeHRlbnNpb25zIH0gZnJvbSBcIi4vZXh0ZW5zaW9ucy5lbWJlZGRpbmcuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBIYXNoaW5nU2VydmljZSB9IGZyb20gXCIuL2V4dGVuc2lvbnMuaGFzaGluZy5zZXJ2aWNlXCI7XHJcblxyXG4vKipcclxuICogU2VydmljZSBjaGUgZm9ybmlzY2UgZnVuemlvbmFsaXTDoCBkaSBhbGVydCBuZWkgdGlwaSBmb25kYW1lbnRhbGk6IHN1Y2Nlc3MsIGluZm8sIHdhcm5pbmcgZSBkYW5nZXJcclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogXCJyb290XCIgfSlcclxuZXhwb3J0IGNsYXNzIE1lc3NhZ2VTZXJ2aWNlIHtcclxuXHJcbiAgICAvKiogT2dnZXR0byBzdGF0aWNvIGluIHN1cHBvcnRvIGFsbGEgbG9jYWxpenphemlvbmUgKi9cclxuICAgIHByaXZhdGUgbG9jID0ge1xyXG4gICAgICAgICdDb25maXJtJzogeyAnZW4tVVMnOiBcIkNvbmZpcm1cIiwgJ2l0LUlUJzogXCJDb25mZXJtYVwiLCB9LFxyXG4gICAgICAgICdDYW5jZWwnOiB7ICdlbi1VUyc6IFwiQ2FuY2VsXCIsICdpdC1JVCc6IFwiQW5udWxsYVwiLCB9LFxyXG4gICAgICAgICdDbG9zZSc6IHsgJ2VuLVVTJzogXCJDbG9zZVwiLCAnaXQtSVQnOiBcIkNoaXVkaVwiLCB9LFxyXG4gICAgICAgICdFcnJvcic6IHsgJ2VuLVVTJzogXCJFcnJvclwiLCAnaXQtSVQnOiBcIkVycm9yZVwiLCB9LFxyXG4gICAgICAgICdJbmZvJzogeyAnZW4tVVMnOiBcIkluZm9cIiwgJ2l0LUlUJzogXCJJbmZvcm1hemlvbmVcIiwgfSxcclxuICAgICAgICAnU3VjY2Vzcyc6IHsgJ2VuLVVTJzogXCJTdWNjZXNzXCIsICdpdC1JVCc6IFwiU3VjY2Vzc29cIiwgfSxcclxuICAgICAgICAnV2FybmluZyc6IHsgJ2VuLVVTJzogXCJXYXJuaW5nXCIsICdpdC1JVCc6IFwiQXR0ZW56aW9uZVwiLCB9XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBkaSB1biB3YXJuaW5nIGNvbiByaWNoaWVzdGEgZGkgY29uZmVybWEgKi9cclxuICAgIHByaXZhdGUgd2FybmluZ1N3YWxXaXRoQ2FuY2VsOiBhbnk7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIGRpIHVuIHdhcm5pbmcgY29uIHJpY2hpZXN0YSBkaSBjb25mZXJtYSAqL1xyXG4gICAgcHJpdmF0ZSBzdWNjZXNzU3dhbFdpdGhDYW5jZWw6IGFueTtcclxuXHJcbiAgICAvKiogVGVtcGxhdGUgZGkgdW4gZXJyb3JlICovXHJcbiAgICBwcml2YXRlIGVycm9yU3dhbDogYW55O1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBkaSB1biBtZXNzYWdnaW8gZGkgc3VjY2Vzc28gKi9cclxuICAgIHByaXZhdGUgc3VjY2Vzc1N3YWw6IGFueTtcclxuXHJcbiAgICAvKiogVGVtcGxhdGUgZGkgdW4gYXZ2aXNvICovXHJcbiAgICBwcml2YXRlIHdhcm5pbmdTd2FsOiBhbnk7XHJcblxyXG4gICAgLyoqIFRlbXBsYXRlIGRpIHVuIG1lc3NhZ2dpbyBpbmZvcm1hdGl2byAqL1xyXG4gICAgcHJpdmF0ZSBpbmZvU3dhbDogYW55O1xyXG5cclxuICAgIC8qKiBUZW1wbGF0ZSBkaSB1biB3YXJuaW5nIHBlciBsYSBzZXNzaW9uZSBzY2FkdXRhICovXHJcbiAgICBwcml2YXRlIGV4cGlyZWRTZXNzaW9uU3dhbDogYW55O1xyXG5cclxuICAgIC8qKiBHZXR0ZXIgcGVyIGlsIHNlcnZpemlvIGRlaSB0b2FzdC4gbmd4LXRvYXN0ciDDqCBmYXR0YSB0YWxtZW50ZSBtYWxlIGNoZSBsYSBzZXJ2aWNlIGRldidlc3NlcmUgcmVjdXBlcmF0YSBpbiBxdWVzdG8gbW9kbyAqL1xyXG4gICAgcHJpdmF0ZSBnZXQgdG9hc3RyKCk6IFRvYXN0clNlcnZpY2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluamVjdG9yLmdldChUb2FzdHJTZXJ2aWNlKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogU3VwcG9ydG8gYWxsJ0VtYmVkZGluZyAqL1xyXG4gICAgRW1iZWRkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIE1haW5XaW5kb3c6IFdpbmRvdyA9IG51bGw7XHJcbiAgICBNZXNzYWdlT2JzZXJ2ZXI6IFN1YmplY3Q8eyBldmVudDogYW55LCBkYXRhOiBhbnkgfT4gPSBudWxsO1xyXG5cclxuICAgIC8qKiBDb3N0cnV0dG9yZSAgQGlnbm9yZSAqL1xyXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKEBJbmplY3QoSW5qZWN0b3IpIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLCBAT3B0aW9uYWwoKSBwcml2YXRlIGxvY1Byb3ZpZGVyOiBCYXNlTG9jYWxpemF0aW9uLCBwcml2YXRlIGhhc2g6IEhhc2hpbmdTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5pbml0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNvbmZpZ3VyZUVtYmVkZGFiaWxpdHkobWFpbldpbmRvdzogV2luZG93LCBtZXNzYWdlT2JzZXJ2ZXI6IFN1YmplY3Q8eyBldmVudDogYW55LCBkYXRhOiBhbnkgfT4pIHtcclxuICAgICAgICB0aGlzLkVtYmVkZGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLk1haW5XaW5kb3cgPSBtYWluV2luZG93O1xyXG4gICAgICAgIHRoaXMuTWVzc2FnZU9ic2VydmVyID0gbWVzc2FnZU9ic2VydmVyO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKSB7XHJcbiAgICAgICAgbGV0IExPQ0FMRSA9IHRoaXMubG9jUHJvdmlkZXIgPyBhd2FpdCB0aGlzLmxvY1Byb3ZpZGVyLkxvY2FsZS5waXBlKGZpcnN0KCkpLnRvUHJvbWlzZSgpIDogJ2l0LUlUJztcclxuXHJcbiAgICAgICAgdGhpcy5leHBpcmVkU2Vzc2lvblN3YWwgPSBzd2FsLm1peGluKHtcclxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAnTG9naW4nLFxyXG4gICAgICAgICAgICBjdXN0b21DbGFzczoge1xyXG4gICAgICAgICAgICAgICAgY29uZmlybUJ1dHRvbjogXCJidG4gYnRuLXByaW1hcnlcIixcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBidXR0b25zU3R5bGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiBmYWxzZSxcclxuICAgICAgICAgICAgYWxsb3dPdXRzaWRlQ2xpY2s6IGZhbHNlLFxyXG4gICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1Y2Nlc3NTd2FsV2l0aENhbmNlbCA9IHN3YWwubWl4aW4oe1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5sb2NbXCJTdWNjZXNzXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiBcImJ0biBidG4tc2Vjb25kYXJ5IGFwcC1tYXJnaW4tcmlnaHQtMTBcIixcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogXCJhcHAtd3JhcFwiLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBidXR0b25zU3R5bGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgIHJldmVyc2VCdXR0b25zOiB0cnVlLFxyXG4gICAgICAgICAgICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDb25maXJtXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6IHRoaXMubG9jW1wiQ2FuY2VsXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMud2FybmluZ1N3YWxXaXRoQ2FuY2VsID0gc3dhbC5taXhpbih7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIldhcm5pbmdcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M6IHtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b246IFwiYnRuIGJ0bi1wcmltYXJ5XCIsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b246IFwiYnRuIGJ0bi1zZWNvbmRhcnkgYXBwLW1hcmdpbi1yaWdodC0xMFwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IHRydWUsXHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNvbmZpcm1cIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDYW5jZWxcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgaWNvbjogXCJ3YXJuaW5nXCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy53YXJuaW5nU3dhbCA9IHN3YWwubWl4aW4oe1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5sb2NbXCJXYXJuaW5nXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDbG9zZVwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICBpY29uOiBcIndhcm5pbmdcIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLnN1Y2Nlc3NTd2FsID0gc3dhbC5taXhpbih7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIlN1Y2Nlc3NcIl1bTE9DQUxFXSxcclxuICAgICAgICAgICAgY3VzdG9tQ2xhc3M6IHtcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b246IFwiYnRuIGJ0bi1wcmltYXJ5XCIsXHJcbiAgICAgICAgICAgICAgICBjb250YWluZXI6IFwiYXBwLXdyYXBcIixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgYnV0dG9uc1N0eWxpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICByZXZlcnNlQnV0dG9uczogdHJ1ZSxcclxuICAgICAgICAgICAgc2hvd0NhbmNlbEJ1dHRvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0aGlzLmxvY1tcIkNsb3NlXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGljb246IFwic3VjY2Vzc1wiXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXJyb3JTd2FsID0gc3dhbC5taXhpbih7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvY1tcIkVycm9yXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDbG9zZVwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICBpY29uOiBcImVycm9yXCJcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5pbmZvU3dhbCA9IHN3YWwubWl4aW4oe1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5sb2NbXCJJbmZvXCJdW0xPQ0FMRV0sXHJcbiAgICAgICAgICAgIGN1c3RvbUNsYXNzOiB7XHJcbiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uOiBcImJ0biBidG4tcHJpbWFyeVwiLFxyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyOiBcImFwcC13cmFwXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGJ1dHRvbnNTdHlsaW5nOiBmYWxzZSxcclxuICAgICAgICAgICAgcmV2ZXJzZUJ1dHRvbnM6IHRydWUsXHJcbiAgICAgICAgICAgIHNob3dDYW5jZWxCdXR0b246IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogdGhpcy5sb2NbXCJDbG9zZVwiXVtMT0NBTEVdLFxyXG4gICAgICAgICAgICBpY29uOiBcImluZm9cIlxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXNlbnRhemlvbmUgZGkgdW4gc2VtcGxpY2UgbWVzc2FnZ2lvIGRpIHN1Y2Nlc3NvXHJcbiAgICAgKiBcclxuICAgICAqIFNlIHZpZW5lIGNoaWFtYXRvIGNvbiBsZSBpbXBvc3RhemlvbmkgZGkgZGVmYXVsdCBlIHRvYXN0ciDDqCBhYmlsaXRhdG8sIHZpZW5lIG1vc3RyYXRvIGFsIGNlbnRyb1xyXG4gICAgICogU2UgdmllbmUgY2hpYW1hdG8gY29uIG92ZXJyaWRlIHN1IHRvYXN0ciB2dW9sIGRpcmUgY2hlIMOoIHVuYSBub3RpZmljYSBzZWNvbmRhcmlhIGUgYXBwYXJlIGluIGFsdG8gYSBkZXN0cmFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGVzdG8gZGEgbW9zdHJhcmVcclxuICAgICAqIEBwYXJhbSB7XCJ0b2FzdHJcIiB8IFwic3dhbFwiIHwgbnVsbH0gc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVHlwZSBRdWFsb3JhIHNpYSB1bmEgbm90aWZpY2Egc2Vjb25kYXJpYSwgbmUgaW5kaWNhIGlsIHRpcG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNpbXBsZVN1Y2Nlc3ModGV4dDogc3RyaW5nLCBzZWNvbmRhcnlOb3RpZmljYXRpb25UeXBlOiBcInRvYXN0clwiIHwgXCJzd2FsXCIgfCBudWxsID0gbnVsbCwgc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVGltZW91dDogbnVtYmVyID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLkVtYmVkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuTWFpbldpbmRvdy5wb3N0TWVzc2FnZSh7IHR5cGU6IFwiYWxlcnRcIiwgbGV2ZWw6ICdzdWNjZXNzJywgbXNnOiB0ZXh0IH0sIFwiKlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvcyA9IHRoaXMudG9hc3RyT3JTd2FsKHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUpO1xyXG5cclxuICAgICAgICBpZiAodG9zID09IFwic3dhbFwiKSB0aGlzLnN1Y2Nlc3NTd2FsLmZpcmUoXCJcIiwgdGV4dCk7XHJcbiAgICAgICAgZWxzZSB0aGlzLnRvYXN0ci5zdWNjZXNzKHRleHQsIG51bGwsIHsgcG9zaXRpb25DbGFzczogdG9zID09IFwidG9hc3RyXCIgPyBcInRvYXN0LXRvcC1yaWdodFwiIDogXCJ0b2FzdC10b3AtY2VudGVyXCIsIHRpbWVPdXQ6IHNlY29uZGFyeU5vdGlmaWNhdGlvblRpbWVvdXQgfHwgKHRvcyA9PSBcInRvYXN0clwiID8gMCA6IDUwMDApLCBleHRlbmRlZFRpbWVPdXQ6IHRvcyA9PSBcInRvYXN0clwiID8gMCA6IDEwMDAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVzZW50YXppb25lIGRpIHVuIHNlbXBsaWNlIG1lc3NhZ2dpbyBkaSBpbmZvcm1hemlvbmVcclxuICAgICAqIFxyXG4gICAgICogU2UgdmllbmUgY2hpYW1hdG8gY29uIGxlIGltcG9zdGF6aW9uaSBkaSBkZWZhdWx0IGUgdG9hc3RyIMOoIGFiaWxpdGF0bywgdmllbmUgbW9zdHJhdG8gYWwgY2VudHJvXHJcbiAgICAgKiBTZSB2aWVuZSBjaGlhbWF0byBjb24gb3ZlcnJpZGUgc3UgdG9hc3RyIHZ1b2wgZGlyZSBjaGUgw6ggdW5hIG5vdGlmaWNhIHNlY29uZGFyaWEgZSBhcHBhcmUgaW4gYWx0byBhIGRlc3RyYVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUZXN0byBkYSBtb3N0cmFyZVxyXG4gICAgICogQHBhcmFtIHtcInRvYXN0clwiIHwgXCJzd2FsXCIgfCBudWxsfSBzZWNvbmRhcnlOb3RpZmljYXRpb25UeXBlIFF1YWxvcmEgc2lhIHVuYSBub3RpZmljYSBzZWNvbmRhcmlhLCBuZSBpbmRpY2EgaWwgdGlwb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2ltcGxlSW5mbyh0ZXh0OiBzdHJpbmcsIHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGU6IFwidG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGwgPSBudWxsLCBzZWNvbmRhcnlOb3RpZmljYXRpb25UaW1lb3V0OiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRW1iZWRkZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5NYWluV2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJhbGVydFwiLCBsZXZlbDogJ2luZm8nLCBtc2c6IHRleHQgfSwgXCIqXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdG9zID0gdGhpcy50b2FzdHJPclN3YWwoc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVHlwZSk7XHJcblxyXG4gICAgICAgIGlmICh0b3MgPT0gXCJzd2FsXCIpIHRoaXMuaW5mb1N3YWwuZmlyZShcIlwiLCB0ZXh0KTtcclxuICAgICAgICBlbHNlIHRoaXMudG9hc3RyLmluZm8odGV4dCwgbnVsbCwgeyBwb3NpdGlvbkNsYXNzOiB0b3MgPT0gXCJ0b2FzdHJcIiA/IFwidG9hc3QtdG9wLXJpZ2h0XCIgOiBcInRvYXN0LXRvcC1jZW50ZXJcIiwgdGltZU91dDogc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVGltZW91dCB8fCAodG9zID09IFwidG9hc3RyXCIgPyAwIDogNTAwMCksIGV4dGVuZGVkVGltZU91dDogdG9zID09IFwidG9hc3RyXCIgPyAwIDogMTAwMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXNlbnRhemlvbmUgZGkgdW4gc2VtcGxpY2UgbWVzc2FnZ2lvIGRpIGVycm9yZVxyXG4gICAgICogXHJcbiAgICAgKiBTZSB2aWVuZSBjaGlhbWF0byBjb24gbGUgaW1wb3N0YXppb25pIGRpIGRlZmF1bHQgZSB0b2FzdHIgw6ggYWJpbGl0YXRvLCB2aWVuZSBtb3N0cmF0byBhbCBjZW50cm9cclxuICAgICAqIFNlIHZpZW5lIGNoaWFtYXRvIGNvbiBvdmVycmlkZSBzdSB0b2FzdHIgdnVvbCBkaXJlIGNoZSDDqCB1bmEgbm90aWZpY2Egc2Vjb25kYXJpYSBlIGFwcGFyZSBpbiBhbHRvIGEgZGVzdHJhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIG1vc3RyYXJlXHJcbiAgICAgKiBAcGFyYW0ge1widG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGx9IHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUgUXVhbG9yYSBzaWEgdW5hIG5vdGlmaWNhIHNlY29uZGFyaWEsIG5lIGluZGljYSBpbCB0aXBvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaW1wbGVFcnJvcih0ZXh0OiBzdHJpbmcsIHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGU6IFwidG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGwgPSBudWxsLCBzZWNvbmRhcnlOb3RpZmljYXRpb25UaW1lb3V0OiBudW1iZXIgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuRW1iZWRkZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5NYWluV2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJhbGVydFwiLCBsZXZlbDogJ2Vycm9yJywgbXNnOiB0ZXh0IH0sIFwiKlwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRvcyA9IHRoaXMudG9hc3RyT3JTd2FsKHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUpO1xyXG5cclxuICAgICAgICBpZiAodG9zID09IFwic3dhbFwiKSB0aGlzLmVycm9yU3dhbC5maXJlKFwiXCIsIHRleHQpO1xyXG4gICAgICAgIGVsc2UgdGhpcy50b2FzdHIuZXJyb3IodGV4dCwgbnVsbCwgeyBwb3NpdGlvbkNsYXNzOiB0b3MgPT0gXCJ0b2FzdHJcIiA/IFwidG9hc3QtdG9wLXJpZ2h0XCIgOiBcInRvYXN0LXRvcC1jZW50ZXJcIiwgdGltZU91dDogc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVGltZW91dCB8fCAodG9zID09IFwidG9hc3RyXCIgPyAwIDogNTAwMCksIGV4dGVuZGVkVGltZU91dDogdG9zID09IFwidG9hc3RyXCIgPyAwIDogMTAwMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZXNlbnRhemlvbmUgZGkgdW4gc2VtcGxpY2UgbWVzc2FnZ2lvIGRpIGF2dmlzb1xyXG4gICAgICogXHJcbiAgICAgKiBTZSB2aWVuZSBjaGlhbWF0byBjb24gbGUgaW1wb3N0YXppb25pIGRpIGRlZmF1bHQgZSB0b2FzdHIgw6ggYWJpbGl0YXRvLCB2aWVuZSBtb3N0cmF0byBhbCBjZW50cm9cclxuICAgICAqIFNlIHZpZW5lIGNoaWFtYXRvIGNvbiBvdmVycmlkZSBzdSB0b2FzdHIgdnVvbCBkaXJlIGNoZSDDqCB1bmEgbm90aWZpY2Egc2Vjb25kYXJpYSBlIGFwcGFyZSBpbiBhbHRvIGEgZGVzdHJhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRlc3RvIGRhIG1vc3RyYXJlXHJcbiAgICAgKiBAcGFyYW0ge1widG9hc3RyXCIgfCBcInN3YWxcIiB8IG51bGx9IHNlY29uZGFyeU5vdGlmaWNhdGlvblR5cGUgUXVhbG9yYSBzaWEgdW5hIG5vdGlmaWNhIHNlY29uZGFyaWEsIG5lIGluZGljYSBpbCB0aXBvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaW1wbGVXYXJuaW5nKHRleHQ6IHN0cmluZywgc2Vjb25kYXJ5Tm90aWZpY2F0aW9uVHlwZTogXCJ0b2FzdHJcIiB8IFwic3dhbFwiIHwgbnVsbCA9IG51bGwsIHNlY29uZGFyeU5vdGlmaWNhdGlvblRpbWVvdXQ6IG51bWJlciA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5FbWJlZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLk1haW5XaW5kb3cucG9zdE1lc3NhZ2UoeyB0eXBlOiBcImFsZXJ0XCIsIGxldmVsOiAnd2FybmluZycsIG1zZzogdGV4dCB9LCBcIipcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB0b3MgPSB0aGlzLnRvYXN0ck9yU3dhbChzZWNvbmRhcnlOb3RpZmljYXRpb25UeXBlKTtcclxuXHJcbiAgICAgICAgaWYgKHRvcyA9PSBcInN3YWxcIikgdGhpcy53YXJuaW5nU3dhbC5maXJlKFwiXCIsIHRleHQpO1xyXG4gICAgICAgIGVsc2UgdGhpcy50b2FzdHIud2FybmluZyh0ZXh0LCBudWxsLCB7IHBvc2l0aW9uQ2xhc3M6IHRvcyA9PSBcInRvYXN0clwiID8gXCJ0b2FzdC10b3AtcmlnaHRcIiA6IFwidG9hc3QtdG9wLWNlbnRlclwiLCB0aW1lT3V0OiBzZWNvbmRhcnlOb3RpZmljYXRpb25UaW1lb3V0IHx8ICh0b3MgPT0gXCJ0b2FzdHJcIiA/IDAgOiA1MDAwKSwgZXh0ZW5kZWRUaW1lT3V0OiB0b3MgPT0gXCJ0b2FzdHJcIiA/IDAgOiAxMDAwIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmlwdWxpc2NlIHR1dHRpIGkgbWVzc2FnZ2kgcHJlc2VudGkgaW4gdW4gZGF0byBtb21lbnRvIHN1bGxvIHNjaGVybW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyTWVzc2FnZXMoKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuY2xlYXIoKTtcclxuICAgICAgICBzd2FsLmNsb3NlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3N0cmEgdW4gbWVzc2FnZ2lvIGRpIGF2dmlzbyBjb24gcmljaGllc3RhIGRpIGNvbmZlcm1hXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2V9IFJlc3RpdHVpc2NlIHVuYSBQcm9taXNlIGNvbCByaXN1bHRhdG8gc2NlbHRvIGRhbGwndXRlbnRlIChjb25mZXJtYSBvIG5vKVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcHJvbWlzZVdhcm5pbmdXaXRoQ2hvaWNlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2FybmluZ1N3YWxXaXRoQ2FuY2VsLmZpcmUodGl0bGUsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW4gYmFzZSBhbGxhIGNvbmZpZ3VyYXppb25lIGF0dHVhbGUgZSBhbGwnZXZlbnR1YWxlIG92ZXJyaWRlIHBlciBsYSBjaGlhbWF0YSBkZWwgY2FzbyBpbmRpY2Egc2UgYmlzb2duYSB1dGlsaXp6YXJlIHRvYXN0ciBvIHN3ZWV0YWxlcnRcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtcInRvYXN0clwiIHwgXCJzd2FsXCIgfCBudWxsfSBwcm92aWRlck92ZXJyaWRlIE92ZXJyaWRlIGFsbGEgbW9kYWxpdMOgIGNvbmZpZ3VyYXRhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtcInRvYXN0clwiIHwgXCJzd2FsXCJ9IEluZGljYXppb25lIHN1IGNoZSBwcm92aWRlciBkaSBtZXNzYWdnaSBkaSBhdnZpc28gZGViYmEgZXNzZXJlIHV0aWxpenphdG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0b2FzdHJPclN3YWwocHJvdmlkZXJPdmVycmlkZTogXCJ0b2FzdHJcIiB8IFwic3dhbFwiIHwgbnVsbCk6IFwidG9hc3RyXCIgfCBcInN3YWxcIiB7XHJcbiAgICAgICAgaWYgKHByb3ZpZGVyT3ZlcnJpZGUgIT0gbnVsbClcclxuICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyT3ZlcnJpZGU7XHJcbiAgICAgICAgcmV0dXJuIFwic3dhbFwiO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgR3VpZFJlcHNvbnNlRnVuY3Rpb25zTWFwOiB7IFtpZDogc3RyaW5nXTogeyBvbnN1Y2Nlc3M6IEZ1bmN0aW9uLCBvbmVycm9yOiBGdW5jdGlvbiB9IH0gPSB7fTtcclxuXHJcbiAgICBwdWJsaWMgc2ltcGxlV2FybmluZ1dpdGhDaG9pY2UodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBvbnN1Y2Nlc3M/OiBGdW5jdGlvbiwgb25lcnJvcj86IEZ1bmN0aW9uLCBjb25maXJtdGV4dDogc3RyaW5nID0gXCJcIiwgYWJvcnR0ZXh0OiBzdHJpbmcgPSAnJykge1xyXG4gICAgICAgIHRoaXMud2l0aENob2ljZUJhc2UoXCJ3YXJuaW5nXCIsIHRpdGxlLCB0ZXh0LCBvbnN1Y2Nlc3MsIG9uZXJyb3IsIGNvbmZpcm10ZXh0LCBhYm9ydHRleHQpXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIHNpbXBsZVN1Y2Nlc3NXaXRoQ2hvaWNlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb25zdWNjZXNzPzogRnVuY3Rpb24sIG9uZXJyb3I/OiBGdW5jdGlvbiwgY29uZmlybXRleHQ6IHN0cmluZyA9IFwiXCIsIGFib3J0dGV4dDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICB0aGlzLndpdGhDaG9pY2VCYXNlKFwic3VjY2Vzc1wiLCB0aXRsZSwgdGV4dCwgb25zdWNjZXNzLCBvbmVycm9yLCBjb25maXJtdGV4dCwgYWJvcnR0ZXh0KVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgd2l0aENob2ljZUJhc2UobGV2ZWw6IFwid2FybmluZ1wiIHwgXCJzdWNjZXNzXCIsIHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb25zdWNjZXNzPzogRnVuY3Rpb24sIG9uZXJyb3I/OiBGdW5jdGlvbiwgY29uZmlybXRleHQ6IHN0cmluZyA9IFwiXCIsIGFib3J0dGV4dDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICBpZiAodGhpcy5FbWJlZGRlZCkge1xyXG4gICAgICAgICAgICBsZXQgZ3VpZCA9IHRoaXMuaGFzaC5nZXRHVUlEKCk7XHJcbiAgICAgICAgICAgIHRoaXMuR3VpZFJlcHNvbnNlRnVuY3Rpb25zTWFwW2d1aWRdID0geyBvbnN1Y2Nlc3MsIG9uZXJyb3IgfTtcclxuICAgICAgICAgICAgdGhpcy5NYWluV2luZG93LnBvc3RNZXNzYWdlKHsgdHlwZTogXCJjb25maXJtXCIsIGxldmVsLCB0aXRsZSwgdGV4dCwgZ3VpZCB9LCBcIipcIik7XHJcblxyXG4gICAgICAgICAgICAvLyBPYnNlcnZlIHN1bGxhIHJpc3Bvc3RhXHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSW52aWF0YSBjb25maXJtIHJlcXVlc3QgYWxsYSBwYWdpbmEgcHJpbmNpcGFsZSwgaW4gYXR0ZXNhIGRpIHJpc3Bvc3RhLi4uXCIpXHJcbiAgICAgICAgICAgIHRoaXMuTWVzc2FnZU9ic2VydmVyLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50Py5kYXRhPy50eXBlID09IFwiY29uZmlybS1yZXNwb25zZVwiICYmIGV2ZW50Py5kYXRhPy5ndWlkID09IGd1aWQpLCB0YWtlKDEpKS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJFdmVudCBsaXN0ZW5lciBzdSB3aW5kb3ctbWVzc2FnZS4gUmlzcG9zdGEgcGVyZ2l1bnRhXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChldmVudD8uZGF0YT8ucmVzdWx0ID09PSB0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuR3VpZFJlcHNvbnNlRnVuY3Rpb25zTWFwW2d1aWRdLm9uc3VjY2VzcygpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQ/LmRhdGE/LnJlc3VsdCA9PT0gdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkd1aWRSZXBzb25zZUZ1bmN0aW9uc01hcFtndWlkXS5vbmVycm9yKCk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgKGxldmVsID09IFwid2FybmluZ1wiID8gdGhpcy5fc2ltcGxlV2FybmluZ1dpdGhDaG9pY2UuYmluZCh0aGlzKSA6IHRoaXMuX3NpbXBsZVN1Y2Nlc3NXaXRoQ2hvaWNlLmJpbmQodGhpcykpKHRpdGxlLCB0ZXh0LCBvbnN1Y2Nlc3MsIG9uZXJyb3IsIGNvbmZpcm10ZXh0LCBhYm9ydHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTW9zdHJhIHVuIG1lc3NhZ2dpbyBkaSBhdnZpc28gY29uIHJpY2hpZXN0YSBkaSBjb25mZXJtYSBlIGdlc3Rpc2NlIGlsIHJpc3VsdGF0byBjaGlhbWF0byBpIGNhbGxiYWNrICoqb25zdWNjZXNzKiogbyAqKm9uZXJyb3IqKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgVGl0b2xvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IENvbnRlbnV0byBkZWwgbWVzc2FnZ2lvXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbnN1Y2Nlc3MgQ2FsbGJhY2sgZGEgY2hpbWFyZSBzdSBjb25mZXJtYVxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25lcnJvciBDYWxsYmFjayBkYSBjaGltYXJlIHN1IGVycm9yaVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIF9zaW1wbGVXYXJuaW5nV2l0aENob2ljZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG9uY29uZmlybTogRnVuY3Rpb24gPSBudWxsLCBvbmFib3J0OiBGdW5jdGlvbiA9IG51bGwsIGNvbmZpcm10ZXh0OiBzdHJpbmcgPSBcIlwiLCBhYm9ydHRleHQ6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgdGhpcy5fc2ltcGxlV2l0aENob2ljZSh0aGlzLndhcm5pbmdTd2FsV2l0aENhbmNlbCwgdGl0bGUsIHRleHQsIG9uY29uZmlybSwgb25hYm9ydCwgY29uZmlybXRleHQsIGFib3J0dGV4dClcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vc3RyYSB1biBtZXNzYWdnaW8gZGkgc3VjY2VzcyBjb24gcmljaGllc3RhIGRpIGNvbmZlcm1hIGUgZ2VzdGlzY2UgaWwgcmlzdWx0YXRvIGNoaWFtYXRvIGkgY2FsbGJhY2sgKipvbmNvbmZpcm0qKiBvICoqb25hYm9ydCoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uY29uZmlybSBDYWxsYmFjayBkYSBjaGltYXJlIHN1IGNvbmZlcm1hXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbmFib3J0IENhbGxiYWNrIGRhIGNoaW1hcmUgc3UgYW5udWxsYW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlybXRleHQgVGVzdG8gZGVsIHB1bHNhbnRlIGRpIGF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFib3J0dGV4dCBUZXN0byBkZWwgcHVsc2FudGUgZGkgYW5udWxsYW1lbnRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NpbXBsZVN1Y2Nlc3NXaXRoQ2hvaWNlKHRpdGxlOiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb25jb25maXJtOiBGdW5jdGlvbiA9IG51bGwsIG9uYWJvcnQ6IEZ1bmN0aW9uID0gbnVsbCwgY29uZmlybXRleHQ6IHN0cmluZyA9IFwiXCIsIGFib3J0dGV4dDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICB0aGlzLl9zaW1wbGVXaXRoQ2hvaWNlKHRoaXMuc3VjY2Vzc1N3YWxXaXRoQ2FuY2VsLCB0aXRsZSwgdGV4dCwgb25jb25maXJtLCBvbmFib3J0LCBjb25maXJtdGV4dCwgYWJvcnR0ZXh0KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGJhc2UgcGVyIHJpY2hpZWRlcmUgdW5hIHNjZWx0YSBhbGwndXRlbnRlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBzd2FsIFN3YWwgbWl4aW4gZGEgdXRpbGl6emFyZSBwZXIgdmlzdWFsaXp6YXJlIGlsIG1lc3NhZ2dpbyBkaSBjaG9pY2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uY29uZmlybSBDYWxsYmFjayBkYSBjaGltYXJlIHN1IGNvbmZlcm1hXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbmFib3J0IENhbGxiYWNrIGRhIGNoaW1hcmUgc3UgYW5udWxsYW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29uZmlybXRleHQgVGVzdG8gZGVsIHB1bHNhbnRlIGRpIGF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFib3J0dGV4dCBUZXN0byBkZWwgcHVsc2FudGUgZGkgYW5udWxsYW1lbnRvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NpbXBsZVdpdGhDaG9pY2Uoc3dhbDogYW55LCB0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG9uY29uZmlybTogRnVuY3Rpb24gPSBudWxsLCBvbmFib3J0OiBGdW5jdGlvbiA9IG51bGwsIGNvbmZpcm10ZXh0OiBzdHJpbmcgPSBcIlwiLCBhYm9ydHRleHQ6IHN0cmluZyA9ICcnKXtcclxuICAgICAgICB2YXIgY29uZmlndXJhdGlvbiA9IHtcclxuICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICBodG1sOiB0ZXh0XHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAoY29uZmlybXRleHQpXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25bXCJjb25maXJtQnV0dG9uVGV4dFwiXSA9IGNvbmZpcm10ZXh0O1xyXG4gICAgICAgIGlmIChhYm9ydHRleHQpXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25bXCJjYW5jZWxCdXR0b25UZXh0XCJdID0gYWJvcnR0ZXh0O1xyXG5cclxuICAgICAgICBzd2FsLmZpcmUoY29uZmlndXJhdGlvbikudGhlbigocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWUgJiYgb25jb25maXJtKVxyXG4gICAgICAgICAgICAgICAgb25jb25maXJtKCk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG9uYWJvcnQpXHJcbiAgICAgICAgICAgICAgICBvbmFib3J0KCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNb3N0cmEgdW4gbWVzc2FnZ2lvIGRpIGF2dmlzbyBjb24gcmljaGllc3RhIGRpIGNvbmZlcm1hIGUgZ2VzdGlzY2UgaWwgcmlzdWx0YXRvIGNoaWFtYXRvIGkgY2FsbGJhY2sgKipvbnN1Y2Nlc3MqKiBvICoqb25lcnJvcioqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSBUaXRvbG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgQ29udGVudXRvIGRlbCBtZXNzYWdnaW9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9ic2VydmFibGVTaW1wbGVXYXJuaW5nV2l0aENob2ljZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy53YXJuaW5nU3dhbFdpdGhDYW5jZWwuZmlyZSh0aXRsZSwgdGV4dCkpLnBpcGUobWFwKHQgPT4gISF0LnZhbHVlKSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1vc3RyYSB1biBtZXNzYWdnaW8gZGkgYXZ2aXNvIGNoZSBsYSBzZXNzaW9uZSBjb3JyZW50ZSDDqCBzY2FkdXRhIGUgcHJvcG9uZSBhbGwndXRlbnRlIGRpIG5hdmlnYXJlIGFsIGxvZ2luLiBRdWFsb3JhIGwndXRlbnRlIGRlY2lkZXNzZSBkaSBmYXJsbyBcclxuICAgICAqIHZlcnLDoCBjaGlhbWF0YSBsYSBmdW56aW9uZSBkaSBjYWxsYmFjayAqKm9ubmF2aWdhdGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIFRpdG9sbyBkZWwgbWVzc2FnZ2lvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDb250ZW51dG8gZGVsIG1lc3NhZ2dpb1xyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb25uYXZpZ2F0ZSBDYWxsYmFjayBkYSBjaGltYXJlIHN1IG5hdmlnYXppb25lIGluIGNvcnNvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBleHBpcmVkU2Vzc2lvbk1lc3NhZ2UodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBvbm5hdmlnYXRlOiBGdW5jdGlvbiA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLmV4cGlyZWRTZXNzaW9uU3dhbC5maXJlKHRpdGxlLCB0ZXh0KS50aGVuKChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZSAmJiBvbm5hdmlnYXRlKVxyXG4gICAgICAgICAgICAgICAgb25uYXZpZ2F0ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGhlbHBlciBwZXIgZ2VzdGlyZSBpbiBtYW5pZXJhIHN0YW5kYXJkaXp6YXRhIHVuYSByaXNwb3N0YSBkaSB0aXBvICoqQ2FsbFJlc3VsdCoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7Q2FsbFJlc3VsdH0gcmVzcG9uc2UgUmlzcG9zdGEgcmljZXZ1dGEgZGFsIHNlcnZlclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIHN1Y2Nlc3NvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBvc3RTdWNjZXNzIENhbGxiYWNrIGRhIGNoaW1hcmUgaW4gY2FzbyBkaSBzdWNjZXNzb1xyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcG9zdEZhaWx1cmUgQ2FsbGJhY2sgZGEgY2hpbWFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hbmFnZUNhbGxSZXN1bHRSZXNwb25zZShyZXNwb25zZTogQ2FsbFJlc3VsdCwgc3VjY2Vzc01zZzogc3RyaW5nLCBlcnJvck1zZzogc3RyaW5nLCBwb3N0U3VjY2VzczogRnVuY3Rpb24gPSBudWxsLCBwb3N0RmFpbHVyZTogRnVuY3Rpb24gPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IGFueVJlcG9uc2UgPSA8YW55PnJlc3BvbnNlO1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzIHx8IGFueVJlcG9uc2UuU3VjY2Vzcykge1xyXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuaGFzd2FybmluZyB8fCBhbnlSZXBvbnNlLkhhc1dhcm5pbmcpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZVdhcm5pbmcocmVzcG9uc2Uud2FybmluZyB8fCBhbnlSZXBvbnNlLldhcm5pbmcpO1xyXG5cclxuICAgICAgICAgICAgZWxzZSBpZiAoc3VjY2Vzc01zZylcclxuICAgICAgICAgICAgICAgIHRoaXMuc2ltcGxlU3VjY2VzcyhzdWNjZXNzTXNnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0U3VjY2VzcykgcG9zdFN1Y2Nlc3MoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNpbXBsZUVycm9yKChlcnJvck1zZyA/IGVycm9yTXNnICsgXCI6IFwiIDogXCJcIikgKyAoKHJlc3BvbnNlLmhhc2Vycm9yIHx8IGFueVJlcG9uc2UuSGFzRXJyb3IpID8gKHJlc3BvbnNlLmVycm9yIHx8IGFueVJlcG9uc2UuRXJyb3IpIDogJ1tOTyBFUlIuXScpKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0RmFpbHVyZSkgcG9zdEZhaWx1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gaGVscGVyIHBlciBnZXN0aXJlIGluIG1hbmllcmEgc3RhbmRhcmRpenphdGEgdW5hIHJpc3Bvc3RhIGRpIHRpcG8gKipzdHJpbmcqKiwgY29uc2lkZXJhbmRvIGNoZTpcclxuICAgICAqIFxyXG4gICAgICogU3RyaW5nYSB2dW90YSAtLT4gVHV0dG8gYmVuZVxyXG4gICAgICogXHJcbiAgICAgKiBTdHJpbmdhIHBpZW5hIC0tPiBRdWVzdG8gw6ggaWwgbWVzc2FnZ2lvIGQnZXJyb3JlIHBlciBjdWkgbGEgY2hpYW1hdGEgw6ggZmFsbGl0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVzcG9uc2UgUmlzcG9zdGEgcmljZXZ1dGEgZGFsIHNlcnZlclxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN1Y2Nlc3NNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIHN1Y2Nlc3NvXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXJyb3JNc2cgTWVzc2FnZ2lvIGRhIHZpc3VhbGl6emFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBvc3RTdWNjZXNzIENhbGxiYWNrIGRhIGNoaW1hcmUgaW4gY2FzbyBkaSBzdWNjZXNzb1xyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcG9zdEZhaWx1cmUgQ2FsbGJhY2sgZGEgY2hpbWFyZSBpbiBjYXNvIGRpIGZhbGxpbWVudG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1hbmFnZVN0cmluZ1Jlc3BvbnNlKHJlc3BvbnNlOiBzdHJpbmcsIHN1Y2Nlc3NNc2c6IHN0cmluZywgZXJyb3JNc2c6IHN0cmluZywgcG9zdFN1Y2Nlc3M6IEZ1bmN0aW9uID0gbnVsbCwgcG9zdEZhaWx1cmU6IEZ1bmN0aW9uID0gbnVsbCkge1xyXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgaWYgKHN1Y2Nlc3NNc2cpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZVN1Y2Nlc3Moc3VjY2Vzc01zZyk7XHJcblxyXG4gICAgICAgICAgICBpZiAocG9zdFN1Y2Nlc3MpIHBvc3RTdWNjZXNzKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGVycm9yTXNnKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zaW1wbGVFcnJvcihlcnJvck1zZyArIFwiOiBcIiArIHJlc3BvbnNlKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0RmFpbHVyZSkgcG9zdEZhaWx1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gaGVscGVyIHBlciBnZXN0aXJlIGluIG1hbmllcmEgc3RhbmRhcmRpenphdGEgdW5hIHJpc3Bvc3RhIGRpIHRpcG8gKipib29sZWFuKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BvbnNlIFJpc3Bvc3RhIHJpY2V2dXRhIGRhbCBzZXJ2ZXJcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdWNjZXNzTXNnIE1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgaW4gY2FzbyBkaSBzdWNjZXNzb1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGVycm9yTXNnIE1lc3NhZ2dpbyBkYSB2aXN1YWxpenphcmUgaW4gY2FzbyBkaSBmYWxsaW1lbnRvXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwb3N0U3VjY2VzcyBDYWxsYmFjayBkYSBjaGltYXJlIGluIGNhc28gZGkgc3VjY2Vzc29cclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHBvc3RGYWlsdXJlIENhbGxiYWNrIGRhIGNoaW1hcmUgaW4gY2FzbyBkaSBmYWxsaW1lbnRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYW5hZ2VTdHJpbmdSZXNwb25zZUJvb2wocmVzcG9uc2U6IGJvb2xlYW4sIHN1Y2Nlc3NNc2c6IHN0cmluZywgZXJyb3JNc2c6IHN0cmluZywgcG9zdFN1Y2Nlc3M6IEZ1bmN0aW9uID0gbnVsbCwgcG9zdEZhaWx1cmU6IEZ1bmN0aW9uID0gbnVsbCkge1xyXG4gICAgICAgIGlmIChyZXNwb25zZSkge1xyXG4gICAgICAgICAgICBpZiAoc3VjY2Vzc01zZylcclxuICAgICAgICAgICAgICAgIHRoaXMuc2ltcGxlU3VjY2VzcyhzdWNjZXNzTXNnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0U3VjY2VzcykgcG9zdFN1Y2Nlc3MoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3JNc2cpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNpbXBsZUVycm9yKGVycm9yTXNnKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwb3N0RmFpbHVyZSkgcG9zdEZhaWx1cmUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|