@senior-gestao-empresarial/angular-components 4.22.0 → 4.22.1-706afb94-1b58-4cb7-9006-8d9033881f51
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/bundles/senior-gestao-empresarial-angular-components.umd.js +49 -38
- package/bundles/senior-gestao-empresarial-angular-components.umd.js.map +1 -1
- package/bundles/senior-gestao-empresarial-angular-components.umd.min.js +1 -1
- package/bundles/senior-gestao-empresarial-angular-components.umd.min.js.map +1 -1
- package/components/websocket/websocket.service.d.ts +10 -7
- package/esm2015/components/websocket/websocket.service.js +38 -37
- package/esm5/components/websocket/websocket.service.js +51 -40
- package/fesm2015/senior-gestao-empresarial-angular-components.js +37 -36
- package/fesm2015/senior-gestao-empresarial-angular-components.js.map +1 -1
- package/fesm5/senior-gestao-empresarial-angular-components.js +50 -39
- package/fesm5/senior-gestao-empresarial-angular-components.js.map +1 -1
- package/package.json +1 -1
- package/senior-gestao-empresarial-angular-components.metadata.json +1 -1
|
@@ -4,7 +4,7 @@ import { Stomp } from "@stomp/stompjs";
|
|
|
4
4
|
import * as Cookies from "js-cookie";
|
|
5
5
|
import { CookieService } from "ngx-cookie-service";
|
|
6
6
|
import { Subject } from "rxjs";
|
|
7
|
-
import {
|
|
7
|
+
import { first } from "rxjs/operators";
|
|
8
8
|
import * as SockJS from "sockjs-client";
|
|
9
9
|
import * as i0 from "@angular/core";
|
|
10
10
|
import * as i1 from "ngx-cookie-service";
|
|
@@ -17,7 +17,6 @@ var WebsocketService = /** @class */ (function () {
|
|
|
17
17
|
this.connected = false;
|
|
18
18
|
this.isConnecting = false;
|
|
19
19
|
this.stompSubscriptions = new Map();
|
|
20
|
-
// private primitiveSubjects: Map<string, Subject<any>> = new Map<string, Subject<any>>();
|
|
21
20
|
this.primitiveManagers = new Map();
|
|
22
21
|
this.disconnectSubject = new Subject();
|
|
23
22
|
this.connect$ = new Subject();
|
|
@@ -27,8 +26,8 @@ var WebsocketService = /** @class */ (function () {
|
|
|
27
26
|
}
|
|
28
27
|
WebsocketService_1 = WebsocketService;
|
|
29
28
|
/**
|
|
30
|
-
* Observable
|
|
31
|
-
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida
|
|
29
|
+
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
|
|
30
|
+
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida.
|
|
32
31
|
*/
|
|
33
32
|
WebsocketService.prototype.onConnect = function () {
|
|
34
33
|
var _this = this;
|
|
@@ -40,7 +39,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
40
39
|
return this.connect$.asObservable();
|
|
41
40
|
};
|
|
42
41
|
/**
|
|
43
|
-
* Observable
|
|
42
|
+
* Observable responsável por emitir uma notificação quando a conexão é finalizada.
|
|
44
43
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão é finalizada.
|
|
45
44
|
*/
|
|
46
45
|
WebsocketService.prototype.onDisconnect = function () {
|
|
@@ -52,29 +51,22 @@ var WebsocketService = /** @class */ (function () {
|
|
|
52
51
|
* @param domain Dominio da primitva.
|
|
53
52
|
* @param service Service da primitiva.
|
|
54
53
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
55
|
-
* @param identifierPath Caminho até a propriedade considerada o
|
|
54
|
+
* @param identifierPath Caminho até a propriedade considerada o identificador do registro.
|
|
56
55
|
* @return Um `observable` que emite notificações toda vez que o respectivo evento é publicado no sistema.
|
|
57
56
|
*/
|
|
58
57
|
WebsocketService.prototype.onEvent = function (domain, service, primitive, identifierPath) {
|
|
59
58
|
var _this = this;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
return primitiveManager.subject.asObservable();
|
|
59
|
+
if (this.primitiveManagers.has(primitive)) {
|
|
60
|
+
return this.primitiveManagers.get(primitive).subject.asObservable();
|
|
63
61
|
}
|
|
64
|
-
primitiveManager = {
|
|
62
|
+
var primitiveManager = {
|
|
65
63
|
subject: new Subject(),
|
|
66
64
|
identifierPath: identifierPath,
|
|
67
65
|
publishedEvents: [],
|
|
68
66
|
};
|
|
67
|
+
this.primitiveManagers.set(primitive, primitiveManager);
|
|
69
68
|
if (this.isConnected()) {
|
|
70
|
-
|
|
71
|
-
this.primitiveManagers.set(primitive, primitiveManager);
|
|
72
|
-
var stompSubscription = this._stompClient.subscribe(url, function (message) {
|
|
73
|
-
var event = JSON.parse(message.body || "{}");
|
|
74
|
-
_this.addPublishedEvent(primitiveManager, event);
|
|
75
|
-
primitiveManager.subject.next(event);
|
|
76
|
-
});
|
|
77
|
-
this.stompSubscriptions.set(primitive, stompSubscription);
|
|
69
|
+
this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
78
70
|
return primitiveManager.subject.asObservable();
|
|
79
71
|
}
|
|
80
72
|
else {
|
|
@@ -82,25 +74,18 @@ var WebsocketService = /** @class */ (function () {
|
|
|
82
74
|
this.connect();
|
|
83
75
|
}
|
|
84
76
|
this.onConnect()
|
|
85
|
-
.pipe(
|
|
77
|
+
.pipe(first())
|
|
86
78
|
.subscribe(function () {
|
|
87
|
-
|
|
88
|
-
_this.primitiveManagers.set(primitive, primitiveManager);
|
|
89
|
-
var stompSubscription = _this._stompClient.subscribe(url, function (message) {
|
|
90
|
-
var event = JSON.parse(message.body || "{}");
|
|
91
|
-
_this.addPublishedEvent(primitiveManager, event);
|
|
92
|
-
primitiveManager.subject.next(event);
|
|
93
|
-
});
|
|
94
|
-
_this.stompSubscriptions.set(primitive, stompSubscription);
|
|
79
|
+
_this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
95
80
|
});
|
|
96
81
|
return primitiveManager.subject.asObservable();
|
|
97
82
|
}
|
|
98
83
|
};
|
|
99
84
|
/**
|
|
100
|
-
* Retorna todos os eventos ouvidos
|
|
85
|
+
* Retorna todos os eventos ouvidos pela primitiva com os respectivos identificadores.
|
|
101
86
|
* @typeParam `<T>` Tipo do evento retornado pela primitiva.
|
|
102
87
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
103
|
-
* @param identifiers Array com os
|
|
88
|
+
* @param identifiers Array com os identificadores interessados.
|
|
104
89
|
* @return Array contendo o último evento recebido de cada identificador fornecido.
|
|
105
90
|
*/
|
|
106
91
|
WebsocketService.prototype.getPublishedEvents = function (primitive, identifiers) {
|
|
@@ -132,9 +117,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
132
117
|
WebsocketService.prototype.addPublishedEvent = function (primitiveManager, event) {
|
|
133
118
|
var _this = this;
|
|
134
119
|
var identifier = this.getIdentifierFromEvent(primitiveManager.identifierPath, event);
|
|
135
|
-
var eventIndex = primitiveManager.publishedEvents.findIndex(function (x) {
|
|
136
|
-
return _this.getIdentifierFromEvent(primitiveManager.identifierPath, x) === identifier;
|
|
137
|
-
});
|
|
120
|
+
var eventIndex = primitiveManager.publishedEvents.findIndex(function (x) { return _this.getIdentifierFromEvent(primitiveManager.identifierPath, x) === identifier; });
|
|
138
121
|
if (eventIndex !== -1) {
|
|
139
122
|
primitiveManager.publishedEvents[eventIndex] = __assign(__assign({}, primitiveManager.publishedEvents[eventIndex]), event);
|
|
140
123
|
}
|
|
@@ -142,6 +125,13 @@ var WebsocketService = /** @class */ (function () {
|
|
|
142
125
|
primitiveManager.publishedEvents.push(event);
|
|
143
126
|
}
|
|
144
127
|
};
|
|
128
|
+
WebsocketService.prototype.createStompSubscriptions = function (domain, service, primitive, primitiveManager) {
|
|
129
|
+
var withTokenUrl = this.getSubscriptionUrlWithToken(domain, service, primitive);
|
|
130
|
+
var stompSubscriptionWithToken = this.createStompSubscription(withTokenUrl, primitiveManager);
|
|
131
|
+
var withoutTokenUrl = this.getSubscriptionUrlWithoutToken(domain, service, primitive);
|
|
132
|
+
var stompSubscriptionWithoutToken = this.createStompSubscription(withoutTokenUrl, primitiveManager);
|
|
133
|
+
this.stompSubscriptions.set(primitive, [stompSubscriptionWithToken, stompSubscriptionWithoutToken]);
|
|
134
|
+
};
|
|
145
135
|
WebsocketService.prototype.getIdentifierFromEvent = function (identifierPath, event) {
|
|
146
136
|
var e_2, _a;
|
|
147
137
|
var properties = identifierPath.split(".");
|
|
@@ -167,9 +157,7 @@ var WebsocketService = /** @class */ (function () {
|
|
|
167
157
|
this.isConnecting = true;
|
|
168
158
|
this._stompClient.connect({}, function () {
|
|
169
159
|
_this.setConnected(true);
|
|
170
|
-
// console.log('setou false isConnecting');
|
|
171
160
|
_this.isConnecting = false;
|
|
172
|
-
// console.log('connectou dentro do connect cb');
|
|
173
161
|
_this.publishOnConnect();
|
|
174
162
|
}, function () {
|
|
175
163
|
_this.setConnected(false);
|
|
@@ -203,8 +191,21 @@ var WebsocketService = /** @class */ (function () {
|
|
|
203
191
|
finally { if (e_3) throw e_3.error; }
|
|
204
192
|
}
|
|
205
193
|
if (observersCount === 0) {
|
|
206
|
-
this.stompSubscriptions.forEach(function (
|
|
207
|
-
|
|
194
|
+
this.stompSubscriptions.forEach(function (stompSubscriptions) {
|
|
195
|
+
var e_5, _a;
|
|
196
|
+
try {
|
|
197
|
+
for (var stompSubscriptions_1 = __values(stompSubscriptions), stompSubscriptions_1_1 = stompSubscriptions_1.next(); !stompSubscriptions_1_1.done; stompSubscriptions_1_1 = stompSubscriptions_1.next()) {
|
|
198
|
+
var stompSubscription = stompSubscriptions_1_1.value;
|
|
199
|
+
stompSubscription.unsubscribe();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
203
|
+
finally {
|
|
204
|
+
try {
|
|
205
|
+
if (stompSubscriptions_1_1 && !stompSubscriptions_1_1.done && (_a = stompSubscriptions_1.return)) _a.call(stompSubscriptions_1);
|
|
206
|
+
}
|
|
207
|
+
finally { if (e_5) throw e_5.error; }
|
|
208
|
+
}
|
|
208
209
|
});
|
|
209
210
|
try {
|
|
210
211
|
for (var _e = __values(this.primitiveManagers.values()), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
@@ -234,11 +235,23 @@ var WebsocketService = /** @class */ (function () {
|
|
|
234
235
|
WebsocketService.prototype.setConnected = function (connected) {
|
|
235
236
|
this.connected = connected;
|
|
236
237
|
};
|
|
237
|
-
WebsocketService.prototype.
|
|
238
|
+
WebsocketService.prototype.getSubscriptionUrlWithToken = function (domain, service, primitive) {
|
|
238
239
|
var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
239
240
|
var token = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.access_token : null;
|
|
240
241
|
return "/topic/" + tenant + "/" + token + "/" + domain + "/" + service + "/" + primitive;
|
|
241
242
|
};
|
|
243
|
+
WebsocketService.prototype.getSubscriptionUrlWithoutToken = function (domain, service, primitive) {
|
|
244
|
+
var tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
245
|
+
return "/topic/" + tenant + "/" + domain + "/" + service + "/" + primitive;
|
|
246
|
+
};
|
|
247
|
+
WebsocketService.prototype.createStompSubscription = function (destination, primitiveManager) {
|
|
248
|
+
var _this = this;
|
|
249
|
+
return this._stompClient.subscribe(destination, function (message) {
|
|
250
|
+
var event = JSON.parse(message.body || "{}");
|
|
251
|
+
_this.addPublishedEvent(primitiveManager, event);
|
|
252
|
+
primitiveManager.subject.next(event);
|
|
253
|
+
});
|
|
254
|
+
};
|
|
242
255
|
WebsocketService.prototype.createStompClient = function () {
|
|
243
256
|
var ws = new SockJS(WebsocketService_1.WEBSOCKET_URL + "subscription", null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
|
|
244
257
|
this._stompClient = Stomp.over(ws);
|
|
@@ -256,12 +269,10 @@ var WebsocketService = /** @class */ (function () {
|
|
|
256
269
|
this._stompClient.disconnect();
|
|
257
270
|
var baseUrl = this.getBaseUrl();
|
|
258
271
|
if (this.baseUrl !== null && baseUrl != this.baseUrl) {
|
|
259
|
-
// //console.log('ws disconnected: base url changed', this.baseUrl, ' -> ', baseUrl || 'null');
|
|
260
272
|
return;
|
|
261
273
|
}
|
|
262
274
|
var username = this.getUserName();
|
|
263
275
|
if (this.username !== null && username != this.username) {
|
|
264
|
-
// //console.log('ws disconnected: username changed', this.username, ' -> ', username || 'null');
|
|
265
276
|
return;
|
|
266
277
|
}
|
|
267
278
|
setTimeout(function () {
|
|
@@ -292,4 +303,4 @@ var WebsocketService = /** @class */ (function () {
|
|
|
292
303
|
return WebsocketService;
|
|
293
304
|
}());
|
|
294
305
|
export { WebsocketService };
|
|
295
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7OztBQVd4QztJQXlCSSwwQkFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFqQnhDLFlBQU8sR0FBVyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBbUMsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFFbEcsMEZBQTBGO1FBQ2xGLHNCQUFpQixHQUFrQyxJQUFJLEdBQUcsRUFBNEIsQ0FBQztRQUV2RixzQkFBaUIsR0FBa0IsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV2RCxhQUFRLEdBQWtCLElBQUksT0FBTyxFQUFRLENBQUM7UUFHbEQsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUU1QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQzt5QkE5QlEsZ0JBQWdCO0lBZ0N6Qjs7O09BR0c7SUFDSSxvQ0FBUyxHQUFoQjtRQUFBLGlCQVFDO1FBUEcsVUFBVSxDQUFDO1lBQ1AsSUFBSSxLQUFJLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ3BCLEtBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2FBQzNCO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRU4sT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSSx1Q0FBWSxHQUFuQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLGtDQUFPLEdBQWQsVUFBa0IsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFpQixFQUFFLGNBQXNCO1FBQTVGLGlCQXNEQztRQXJERyxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFN0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNsQixPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztTQUNsRDtRQUVELGdCQUFnQixHQUFHO1lBQ2YsT0FBTyxFQUFFLElBQUksT0FBTyxFQUFFO1lBQ3RCLGNBQWMsRUFBRSxjQUFjO1lBQzlCLGVBQWUsRUFBRSxFQUFFO1NBQ3RCLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtZQUNwQixJQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztZQUVwRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRXhELElBQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLFVBQUMsT0FBWTtnQkFDcEUsSUFBTSxLQUFLLEdBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDO2dCQUVsRCxLQUFJLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBRWhELGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBRTFELE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ2xEO2FBQU07WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO1lBRUQsSUFBSSxDQUFDLFNBQVMsRUFBRTtpQkFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLFNBQVMsQ0FBQztnQkFDUCxJQUFNLEdBQUcsR0FBRyxLQUFJLENBQUMsc0JBQXNCLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFFcEUsS0FBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFFeEQsSUFBTSxpQkFBaUIsR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsVUFBQyxPQUFZO29CQUNwRSxJQUFNLEtBQUssR0FBTSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7b0JBRWxELEtBQUksQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFFaEQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDekMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsS0FBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUM5RCxDQUFDLENBQUMsQ0FBQztZQUVQLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQ2xEO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLDZDQUFrQixHQUF6QixVQUE2QixTQUFpQixFQUFFLFdBQXFCOztRQUFyRSxpQkFnQkM7UUFmRyxJQUFNLGVBQWUsR0FBUSxFQUFFLENBQUM7UUFFaEMsSUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dDQUVwRCxVQUFVO1lBQ2pCLElBQU0sT0FBSyxHQUFHLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQy9DLFVBQUEsQ0FBQyxJQUFJLE9BQUEsS0FBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsS0FBSyxVQUFVLEVBQTlFLENBQThFLENBQ3RGLENBQUM7WUFFRixJQUFJLE9BQUssRUFBRTtnQkFDUCxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQUssQ0FBQyxDQUFDO2FBQy9COzs7WUFQTCxLQUF5QixJQUFBLGdCQUFBLFNBQUEsV0FBVyxDQUFBLHdDQUFBO2dCQUEvQixJQUFNLFVBQVUsd0JBQUE7d0JBQVYsVUFBVTthQVFwQjs7Ozs7Ozs7O1FBRUQsT0FBTyxlQUFlLENBQUM7SUFDM0IsQ0FBQztJQUVPLDRDQUFpQixHQUF6QixVQUEwQixnQkFBa0MsRUFBRSxLQUFVO1FBQXhFLGlCQWFDO1FBWkcsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RixJQUFNLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUN6RCxVQUFBLENBQUM7WUFDRyxPQUFBLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLEtBQUssVUFBVTtRQUE5RSxDQUE4RSxDQUNyRixDQUFDO1FBRUYsSUFBSSxVQUFVLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDbkIsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyx5QkFBUSxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLEdBQUssS0FBSyxDQUFFLENBQUM7U0FDaEg7YUFBTTtZQUNILGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDaEQ7SUFDTCxDQUFDO0lBRU8saURBQXNCLEdBQTlCLFVBQStCLGNBQXNCLEVBQUUsS0FBVTs7UUFDN0QsSUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUU3QyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7O1lBRXZCLEtBQXVCLElBQUEsZUFBQSxTQUFBLFVBQVUsQ0FBQSxzQ0FBQSw4REFBRTtnQkFBOUIsSUFBTSxRQUFRLHVCQUFBO2dCQUNmLFVBQVUsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDckM7Ozs7Ozs7OztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxrQ0FBTyxHQUFmO1FBQUEsaUJBcUJDO1FBcEJHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUNyQixFQUFFLEVBQ0Y7WUFDSSxLQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLDJDQUEyQztZQUUzQyxLQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUMxQixpREFBaUQ7WUFFakQsS0FBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDNUIsQ0FBQyxFQUNEO1lBQ0ksS0FBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6Qiw2QkFBNkI7UUFDakMsQ0FBQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBRU8sMkNBQWdCLEdBQXhCO1FBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDakMsQ0FBQztJQUVPLGtDQUFPLEdBQWY7UUFDSSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRU8saUNBQU0sR0FBZDtRQUNJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFTSxxQ0FBVSxHQUFqQjs7UUFDSSxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7O1lBRXZCLEtBQStCLElBQUEsS0FBQSxTQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxnQkFBQSw0QkFBRTtnQkFBM0QsSUFBTSxnQkFBZ0IsV0FBQTtnQkFDdkIsY0FBYyxJQUFJLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDO2FBQy9EOzs7Ozs7Ozs7UUFFRCxJQUFJLGNBQWMsS0FBSyxDQUFDLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxVQUFBLGlCQUFpQjtnQkFDN0MsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7O2dCQUVILEtBQStCLElBQUEsS0FBQSxTQUFBLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQSxnQkFBQSw0QkFBRTtvQkFBM0QsSUFBTSxnQkFBZ0IsV0FBQTtvQkFDdkIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2lCQUN2Qzs7Ozs7Ozs7O1lBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUvQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7WUFFL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUUxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDakM7SUFDTCxDQUFDO0lBRU8sc0NBQVcsR0FBbkI7UUFDSSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVPLHVDQUFZLEdBQXBCLFVBQXFCLFNBQWtCO1FBQ25DLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQy9CLENBQUM7SUFFTyxpREFBc0IsR0FBOUIsVUFBK0IsTUFBYyxFQUFFLE9BQWUsRUFBRSxTQUFpQjtRQUM3RSxJQUFNLE1BQU0sR0FBRyxrQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDN0YsSUFBTSxLQUFLLEdBQUcsa0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxrQkFBZ0IsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFbEYsT0FBTyxZQUFVLE1BQU0sU0FBSSxLQUFLLFNBQUksTUFBTSxTQUFJLE9BQU8sU0FBSSxTQUFXLENBQUM7SUFDekUsQ0FBQztJQUVPLDRDQUFpQixHQUF6QjtRQUNJLElBQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFJLGtCQUFnQixDQUFDLGFBQWEsaUJBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsa0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQy9ILElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssR0FBRyxjQUFPLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtJQUNoRSxDQUFDO0lBRU8scUNBQVUsR0FBbEI7UUFDSSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVPLHNDQUFXLEdBQW5CO1FBQ0ksSUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN6RCxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUMvQyxDQUFDO0lBRU8sNkNBQWtCLEdBQTFCO1FBQUEsaUJBdUJDO1FBdEJHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbEQsK0ZBQStGO1lBQy9GLE9BQU87U0FDVjtRQUVELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JELGlHQUFpRztZQUNqRyxPQUFPO1NBQ1Y7UUFFRCxVQUFVLENBQUM7WUFDUCxJQUFJLEtBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ2QsS0FBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2FBQ2xCO2lCQUFNO2dCQUNILEtBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO2FBQzdCO1FBQ0wsQ0FBQyxFQUFFLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7O0lBaFNjLGdDQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLG1DQUFrQixHQUFHLEtBQUssQ0FBQztJQUMzQixnQ0FBZSxHQUFHLHFCQUFxQixDQUFDO0lBQ3hDLDZCQUFZLEdBQUcsa0JBQWtCLENBQUM7SUFDbEMsc0JBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7SUFDdkUsOEJBQWEsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLGFBQWEsQ0FBQzs7Z0JBbUIxRCxhQUFhOzs7SUF6QnZDLGdCQUFnQjtRQUg1QixVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csZ0JBQWdCLENBa1M1QjsyQkFuVEQ7Q0FtVEMsQUFsU0QsSUFrU0M7U0FsU1ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENvbXBhdENsaWVudCwgU3RvbXAsIFN0b21wU3Vic2NyaXB0aW9uIH0gZnJvbSBcIkBzdG9tcC9zdG9tcGpzXCI7XHJcbmltcG9ydCAqIGFzIENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSBcIm5neC1jb29raWUtc2VydmljZVwiO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdG9tcFN1YnNjcmlwdGlvbj4gPSBuZXcgTWFwPHN0cmluZywgU3RvbXBTdWJzY3JpcHRpb24+KCk7XHJcblxyXG4gICAgLy8gcHJpdmF0ZSBwcmltaXRpdmVTdWJqZWN0czogTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PiA9IG5ldyBNYXA8c3RyaW5nLCBTdWJqZWN0PGFueT4+KCk7XHJcbiAgICBwcml2YXRlIHByaW1pdGl2ZU1hbmFnZXJzOiBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPiA9IG5ldyBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPigpO1xyXG5cclxuICAgIHByaXZhdGUgZGlzY29ubmVjdFN1YmplY3Q6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY29va2llU2VydmljZTogQ29va2llU2VydmljZSkge1xyXG4gICAgICAgIHdpbmRvdy5vbmZvY3VzID0gdGhpcy5vbkZvY3VzO1xyXG4gICAgICAgIHdpbmRvdy5vbmJsdXIgPSB0aGlzLm9uQmx1cjtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3Bvc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gd2Vic29ja2V0IMOpIGVzdGFiZWxlY2lkYS5cclxuICAgICAqIEByZXR1cm4gVW0gYE9ic2VydmFibGU8dm9pZD5gIHF1ZSBlbWl0ZSB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhIG91IGrDoSBlc3TDoSBlbSBhbmRhbWVudG8uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb3PDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKiBAcmV0dXJuIFVtIGBPYnNlcnZhYmxlPHZvaWQ+YCBxdWUgZW1pdGUgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIGEgY29uZXjDo28gw6kgZmluYWxpemFkYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0U3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gcXVhbmRvIHVtIGV2ZW50byDDqSBwdWJsaWNhZG8uXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIFRpcG8gZG8gb2JqZXRvIHF1ZSBvIHJldG9ybm8gZG8gYG9ic2VydmFibGVgIHZhaSBkZXZvbHZlci5cclxuICAgICAqIEBwYXJhbSBkb21haW4gRG9taW5pbyBkYSBwcmltaXR2YS5cclxuICAgICAqIEBwYXJhbSBzZXJ2aWNlIFNlcnZpY2UgZGEgcHJpbWl0aXZhLlxyXG4gICAgICogQHBhcmFtIHByaW1pdGl2ZSBQcmltaXRpdmEgcXVlIHNlcsOhIFwib2JzZXJ2YWRhXCIgcGVsbyBjbGllbnQuXHJcbiAgICAgKiBAcGFyYW0gaWRlbnRpZmllclBhdGggQ2FtaW5obyBhdMOpIGEgcHJvcHJpZWRhZGUgY29uc2lkZXJhZGEgbyBpbmRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBsZXQgcHJpbWl0aXZlTWFuYWdlciA9IHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZ2V0KHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyID0ge1xyXG4gICAgICAgICAgICBzdWJqZWN0OiBuZXcgU3ViamVjdCgpLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyUGF0aDogaWRlbnRpZmllclBhdGgsXHJcbiAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50czogW10sXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNDb25uZWN0ZWQoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLmdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b21wU3Vic2NyaXB0aW9uID0gdGhpcy5fc3RvbXBDbGllbnQuc3Vic2NyaWJlKHVybCwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQ6IFQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5uZXh0KGV2ZW50KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RpbmcpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLm9uQ29ubmVjdCgpXHJcbiAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxyXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25Vc2VyVXJsKGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQocHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb24gPSB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUodXJsLCAobWVzc2FnZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBUID0gSlNPTi5wYXJzZShtZXNzYWdlLmJvZHkgfHwgXCJ7fVwiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlciwgZXZlbnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm5leHQoZXZlbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5zZXQocHJpbWl0aXZlLCBzdG9tcFN1YnNjcmlwdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0b3JuYSB0b2RvcyBvcyBldmVudG9zIG91dmlkb3MgcGFyYSBhIHJlc3BlY3RpdmEgcHJpbWl0aXZhLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIGV2ZW50byByZXRvcm5hZG8gcGVsYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVycyBBcnJheSBjb20gb3MgaW5kZW50aWZpY2Fkb3JlcyBpbnRlcmVzc2Fkb3MuXHJcbiAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRlbmRvIG8gw7psdGltbyBldmVudG8gcmVjZWJpZG8gZGUgY2FkYSBpZGVudGlmaWNhZG9yIGZvcm5lY2lkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFB1Ymxpc2hlZEV2ZW50czxUPihwcmltaXRpdmU6IHN0cmluZywgaWRlbnRpZmllcnM6IHN0cmluZ1tdKTogVFtdIHtcclxuICAgICAgICBjb25zdCBwdWJsaXNoZWRFdmVudHM6IFRbXSA9IFtdO1xyXG5cclxuICAgICAgICBjb25zdCBwcmltaXRpdmVNYW5hZ2VyID0gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZChcclxuICAgICAgICAgICAgICAgIHggPT4gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIHB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlZEV2ZW50cztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFB1Ymxpc2hlZEV2ZW50KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXIsIGV2ZW50OiBhbnkpIHtcclxuICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIGV2ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzLmZpbmRJbmRleChcclxuICAgICAgICAgICAgeCA9PlxyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRJZGVudGlmaWVyRnJvbUV2ZW50KHByaW1pdGl2ZU1hbmFnZXIuaWRlbnRpZmllclBhdGgsIHgpID09PSBpZGVudGlmaWVyXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKGV2ZW50SW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHVibGlzaGVkRXZlbnRzW2V2ZW50SW5kZXhdID0geyAuLi5wcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSwgLi4uZXZlbnQgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5wdXNoKGV2ZW50KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRJZGVudGlmaWVyRnJvbUV2ZW50KGlkZW50aWZpZXJQYXRoOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBpZGVudGlmaWVyUGF0aC5zcGxpdChcIi5cIik7XHJcblxyXG4gICAgICAgIGxldCBpZGVudGlmaWVyID0gZXZlbnQ7XHJcblxyXG4gICAgICAgIGZvciAoY29uc3QgcHJvcGVydHkgb2YgcHJvcGVydGllcykge1xyXG4gICAgICAgICAgICBpZGVudGlmaWVyID0gaWRlbnRpZmllcltwcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVTdG9tcENsaWVudCgpO1xyXG5cclxuICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHt9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZCh0cnVlKTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdzZXRvdSBmYWxzZSBpc0Nvbm5lY3RpbmcnKTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Nvbm5lY3RvdSBkZW50cm8gZG8gY29ubmVjdCBjYicpO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAvLyB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHB1Ymxpc2hPbkNvbm5lY3QoKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0JC5vYnNlcnZlcnMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uRm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG9uQmx1cigpIHtcclxuICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICBvYnNlcnZlcnNDb3VudCArPSBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3Qub2JzZXJ2ZXJzLmxlbmd0aDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvYnNlcnZlcnNDb3VudCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN0b21wU3Vic2NyaXB0aW9uID0+IHtcclxuICAgICAgICAgICAgICAgIHN0b21wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wU3Vic2NyaXB0aW9ucy5jbGVhcigpO1xyXG4gICAgICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmNsZWFyKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0Q29ubmVjdGVkKGZhbHNlKTtcclxuICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZGlzY29ubmVjdFN1YmplY3QubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHNldENvbm5lY3RlZChjb25uZWN0ZWQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCA9IGNvbm5lY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVzZXJVcmwoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi51c2VybmFtZS5zcGxpdChcIkBcIilbMV0gOiBudWxsO1xyXG4gICAgICAgIGNvbnN0IHRva2VuID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4uYWNjZXNzX3Rva2VuIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7dG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IGJhc2UgdXJsIGNoYW5nZWQnLCB0aGlzLmJhc2VVcmwsICcgLT4gJywgYmFzZVVybCB8fCAnbnVsbCcpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICAvLyAvL2NvbnNvbGUubG9nKCd3cyBkaXNjb25uZWN0ZWQ6IHVzZXJuYW1lIGNoYW5nZWQnLCB0aGlzLnVzZXJuYW1lLCAnIC0+ICcsIHVzZXJuYW1lIHx8ICdudWxsJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVjb25uZWN0V2ViU29ja2V0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9LCBXZWJzb2NrZXRTZXJ2aWNlLlJFQ09OTkVDVF9USU1FUik7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
306
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RSxPQUFPLEtBQUssT0FBTyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7OztBQVd4QztJQXdCSSwwQkFBb0IsYUFBNEI7UUFBNUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFoQnhDLFlBQU8sR0FBVyxJQUFJLENBQUM7UUFDdkIsYUFBUSxHQUFXLElBQUksQ0FBQztRQUN4QixZQUFPLEdBQUcsSUFBSSxDQUFDO1FBR2YsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUVyQix1QkFBa0IsR0FBRyxJQUFJLEdBQUcsRUFBK0IsQ0FBQztRQUU1RCxzQkFBaUIsR0FBa0MsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFFdkYsc0JBQWlCLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUV4QyxhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUduQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxD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LEtBQUssSUFBSSxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2xELE9BQU87U0FDVjtRQUVELElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUVwQyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3JELE9BQU87U0FDVjtRQUVELFVBQVUsQ0FBQztZQUNQLElBQUksS0FBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZCxLQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbEI7aUJBQU07Z0JBQ0gsS0FBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7YUFDN0I7UUFDTCxDQUFDLEVBQUUsa0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDekMsQ0FBQzs7SUFoU2MsZ0NBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkIsbUNBQWtCLEdBQUcsS0FBSyxDQUFDO0lBQzNCLGdDQUFlLEdBQUcscUJBQXFCLENBQUM7SUFDeEMsNkJBQVksR0FBRyxrQkFBa0IsQ0FBQztJQUNsQyxzQkFBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBZ0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztJQUN2RSw4QkFBYSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsYUFBYSxDQUFDOztnQkFrQjFELGFBQWE7OztJQXhCdkMsZ0JBQWdCO1FBSDVCLFVBQVUsQ0FBQztZQUNSLFVBQVUsRUFBRSxNQUFNO1NBQ3JCLENBQUM7T0FDVyxnQkFBZ0IsQ0FrUzVCOzJCQW5URDtDQW1UQyxBQWxTRCxJQWtTQztTQWxTWSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgQ29tcGF0Q2xpZW50LCBTdG9tcCwgU3RvbXBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQHN0b21wL3N0b21wanNcIjtcclxuaW1wb3J0ICogYXMgQ29va2llcyBmcm9tIFwianMtY29va2llXCI7XHJcbmltcG9ydCB7IENvb2tpZVNlcnZpY2UgfSBmcm9tIFwibmd4LWNvb2tpZS1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSBcInNvY2tqcy1jbGllbnRcIjtcclxuXHJcbmludGVyZmFjZSBQcmltaXRpdmVNYW5hZ2VyIHtcclxuICAgIHN1YmplY3Q6IFN1YmplY3Q8YW55PjtcclxuICAgIGlkZW50aWZpZXJQYXRoOiBzdHJpbmc7XHJcbiAgICBwdWJsaXNoZWRFdmVudHM6IGFueVtdO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgUkVDT05ORUNUX1RJTUVSID0gMzAwMDtcclxuICAgIHByaXZhdGUgc3RhdGljIENPTk5FQ1RJT05fVElNRU9VVCA9IDMwMDAwO1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgQkFTRV9VUkxfQ09PS0lFID0gXCJjb20uc2VuaW9yLmJhc2UudXJsXCI7XHJcbiAgICBwcml2YXRlIHN0YXRpYyBUT0tFTl9DT09LSUUgPSBcImNvbS5zZW5pb3IudG9rZW5cIjtcclxuICAgIHByaXZhdGUgc3RhdGljIFRPS0VOID0gSlNPTi5wYXJzZShDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOX0NPT0tJRSkgfHwgXCJ7fVwiKTtcclxuICAgIHByaXZhdGUgc3RhdGljIFdFQlNPQ0tFVF9VUkwgPSBDb29raWVzLmdldChXZWJzb2NrZXRTZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRSkgKyBcIi93ZWJzb2NrZXQvXCI7XHJcblxyXG4gICAgcHJpdmF0ZSBiYXNlVXJsOiBzdHJpbmcgPSBudWxsO1xyXG4gICAgcHJpdmF0ZSB1c2VybmFtZTogc3RyaW5nID0gbnVsbDtcclxuICAgIHByaXZhdGUgZm9jdXNlZCA9IHRydWU7XHJcbiAgICBwcml2YXRlIF9zdG9tcENsaWVudDogQ29tcGF0Q2xpZW50O1xyXG5cclxuICAgIHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGlzQ29ubmVjdGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgc3RvbXBTdWJzY3JpcHRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFN0b21wU3Vic2NyaXB0aW9uW10+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBwcmltaXRpdmVNYW5hZ2VyczogTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4gPSBuZXcgTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcj4oKTtcclxuXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RTdWJqZWN0ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBwcml2YXRlIGNvbm5lY3QkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UpIHtcclxuICAgICAgICB3aW5kb3cub25mb2N1cyA9IHRoaXMub25Gb2N1cztcclxuICAgICAgICB3aW5kb3cub25ibHVyID0gdGhpcy5vbkJsdXI7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyB3ZWJzb2NrZXQgw6kgZXN0YWJlbGVjaWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIHdlYnNvY2tldCDDqSBlc3RhYmVsZWNpZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaE9uQ29ubmVjdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgMCk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3QkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT2JzZXJ2YWJsZSByZXNwb25zw6F2ZWwgcG9yIGVtaXRpciB1bWEgbm90aWZpY2HDp8OjbyBxdWFuZG8gYSBjb25leMOjbyDDqSBmaW5hbGl6YWRhLlxyXG4gICAgICogQHJldHVybiBVbSBgT2JzZXJ2YWJsZTx2b2lkPmAgcXVlIGVtaXRlIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyBhIGNvbmV4w6NvIMOpIGZpbmFsaXphZGEuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY29ubmVjdFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPYnNlcnZhYmxlIHJlc3BvbnPDoXZlbCBwb3IgZW1pdGlyIHVtYSBub3RpZmljYcOnw6NvIHF1YW5kbyB1bSBldmVudG8gw6kgcHVibGljYWRvLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIG9iamV0byBxdWUgbyByZXRvcm5vIGRvIGBvYnNlcnZhYmxlYCB2YWkgZGV2b2x2ZXIuXHJcbiAgICAgKiBAcGFyYW0gZG9tYWluIERvbWluaW8gZGEgcHJpbWl0dmEuXHJcbiAgICAgKiBAcGFyYW0gc2VydmljZSBTZXJ2aWNlIGRhIHByaW1pdGl2YS5cclxuICAgICAqIEBwYXJhbSBwcmltaXRpdmUgUHJpbWl0aXZhIHF1ZSBzZXLDoSBcIm9ic2VydmFkYVwiIHBlbG8gY2xpZW50LlxyXG4gICAgICogQHBhcmFtIGlkZW50aWZpZXJQYXRoIENhbWluaG8gYXTDqSBhIHByb3ByaWVkYWRlIGNvbnNpZGVyYWRhIG8gaWRlbnRpZmljYWRvciBkbyByZWdpc3Ryby5cclxuICAgICAqIEByZXR1cm4gVW0gYG9ic2VydmFibGVgIHF1ZSBlbWl0ZSBub3RpZmljYcOnw7VlcyB0b2RhIHZleiBxdWUgbyByZXNwZWN0aXZvIGV2ZW50byDDqSBwdWJsaWNhZG8gbm8gc2lzdGVtYS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcsIGlkZW50aWZpZXJQYXRoOiBzdHJpbmcpOiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgICAgICBpZiAodGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5oYXMocHJpbWl0aXZlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQocHJpbWl0aXZlKS5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlciA9IHtcclxuICAgICAgICAgICAgc3ViamVjdDogbmV3IFN1YmplY3Q8VD4oKSxcclxuICAgICAgICAgICAgaWRlbnRpZmllclBhdGg6IGlkZW50aWZpZXJQYXRoLFxyXG4gICAgICAgICAgICBwdWJsaXNoZWRFdmVudHM6IFtdIGFzIGFueVtdLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuc2V0KHByaW1pdGl2ZSwgcHJpbWl0aXZlTWFuYWdlcik7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUsIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNDb25uZWN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3QoKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlyc3QoKSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHByaW1pdGl2ZU1hbmFnZXIuc3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXRvcm5hIHRvZG9zIG9zIGV2ZW50b3Mgb3V2aWRvcyBwZWxhIHByaW1pdGl2YSBjb20gb3MgcmVzcGVjdGl2b3MgaWRlbnRpZmljYWRvcmVzLlxyXG4gICAgICogQHR5cGVQYXJhbSBgPFQ+YCBUaXBvIGRvIGV2ZW50byByZXRvcm5hZG8gcGVsYSBwcmltaXRpdmEuXHJcbiAgICAgKiBAcGFyYW0gcHJpbWl0aXZlIFByaW1pdGl2YSBxdWUgc2Vyw6EgXCJvYnNlcnZhZGFcIiBwZWxvIGNsaWVudC5cclxuICAgICAqIEBwYXJhbSBpZGVudGlmaWVycyBBcnJheSBjb20gb3MgaWRlbnRpZmljYWRvcmVzIGludGVyZXNzYWRvcy5cclxuICAgICAqIEByZXR1cm4gQXJyYXkgY29udGVuZG8gbyDDumx0aW1vIGV2ZW50byByZWNlYmlkbyBkZSBjYWRhIGlkZW50aWZpY2Fkb3IgZm9ybmVjaWRvLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0UHVibGlzaGVkRXZlbnRzPFQ+KHByaW1pdGl2ZTogc3RyaW5nLCBpZGVudGlmaWVyczogc3RyaW5nW10pOiBUW10ge1xyXG4gICAgICAgIGNvbnN0IHB1Ymxpc2hlZEV2ZW50czogVFtdID0gW107XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgPSB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGlkZW50aWZpZXIgb2YgaWRlbnRpZmllcnMpIHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50cy5maW5kKFxyXG4gICAgICAgICAgICAgICAgeCA9PiB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgeCkgPT09IGlkZW50aWZpZXJcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICAgICAgcHVibGlzaGVkRXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHVibGlzaGVkRXZlbnRzO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkUHVibGlzaGVkRXZlbnQocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlciwgZXZlbnQ6IGFueSkge1xyXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmdldElkZW50aWZpZXJGcm9tRXZlbnQocHJpbWl0aXZlTWFuYWdlci5pZGVudGlmaWVyUGF0aCwgZXZlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMuZmluZEluZGV4KFxyXG4gICAgICAgICAgICB4ID0+IHRoaXMuZ2V0SWRlbnRpZmllckZyb21FdmVudChwcmltaXRpdmVNYW5hZ2VyLmlkZW50aWZpZXJQYXRoLCB4KSA9PT0gaWRlbnRpZmllclxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIGlmIChldmVudEluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnB1Ymxpc2hlZEV2ZW50c1tldmVudEluZGV4XSA9IHsgLi4ucHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHNbZXZlbnRJbmRleF0sIC4uLmV2ZW50IH07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wdWJsaXNoZWRFdmVudHMucHVzaChldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKGRvbWFpbjogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIHByaW1pdGl2ZTogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3Qgd2l0aFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgY29uc3Qgd2l0aG91dFRva2VuVXJsID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24od2l0aG91dFRva2VuVXJsLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuc2V0KHByaW1pdGl2ZSwgW3N0b21wU3Vic2NyaXB0aW9uV2l0aFRva2VuLCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbl0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0SWRlbnRpZmllckZyb21FdmVudChpZGVudGlmaWVyUGF0aDogc3RyaW5nLCBldmVudDogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gaWRlbnRpZmllclBhdGguc3BsaXQoXCIuXCIpO1xyXG5cclxuICAgICAgICBsZXQgaWRlbnRpZmllciA9IGV2ZW50O1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHByb3BlcnRpZXMpIHtcclxuICAgICAgICAgICAgaWRlbnRpZmllciA9IGlkZW50aWZpZXJbcHJvcGVydHldO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGlkZW50aWZpZXI7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjb25uZWN0KCkge1xyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvbXBDbGllbnQoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSB0cnVlO1xyXG5cclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5jb25uZWN0KFxyXG4gICAgICAgICAgICB7fSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQodHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnB1Ymxpc2hPbkNvbm5lY3QoKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRDb25uZWN0ZWQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgLy8gdGhpcy5yZWNvbm5lY3RXZWJTb2NrZXQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBwdWJsaXNoT25Db25uZWN0KCkge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCQubmV4dCgpO1xyXG4gICAgICAgIHRoaXMuY29ubmVjdCQub2JzZXJ2ZXJzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkZvY3VzKCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBvbkJsdXIoKSB7XHJcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbGV0IG9ic2VydmVyc0NvdW50ID0gMDtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzQ291bnQgKz0gcHJpbWl0aXZlTWFuYWdlci5zdWJqZWN0Lm9ic2VydmVycy5sZW5ndGg7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob2JzZXJ2ZXJzQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdG9tcFN1YnNjcmlwdGlvbnMgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdG9tcFN1YnNjcmlwdGlvbiBvZiBzdG9tcFN1YnNjcmlwdGlvbnMpIHtcclxuICAgICAgICAgICAgICAgICAgICBzdG9tcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdG9tcFN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5jbGVhcigpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWFjdGl2YXRlKCk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNldENvbm5lY3RlZChmYWxzZSk7XHJcbiAgICAgICAgICAgIHRoaXMuaXNDb25uZWN0aW5nID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3RTdWJqZWN0Lm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBpc0Nvbm5lY3RlZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzZXRDb25uZWN0ZWQoY29ubmVjdGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBjb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4gPyBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOLnVzZXJuYW1lLnNwbGl0KFwiQFwiKVsxXSA6IG51bGw7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSBXZWJzb2NrZXRTZXJ2aWNlLlRPS0VOID8gV2Vic29ja2V0U2VydmljZS5UT0tFTi5hY2Nlc3NfdG9rZW4gOiBudWxsO1xyXG5cclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHt0b2tlbn0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgdGVuYW50ID0gV2Vic29ja2V0U2VydmljZS5UT0tFTiA/IFdlYnNvY2tldFNlcnZpY2UuVE9LRU4udXNlcm5hbWUuc3BsaXQoXCJAXCIpWzFdIDogbnVsbDtcclxuXHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbihkZXN0aW5hdGlvbjogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyKTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCBcInt9XCIpO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRQdWJsaXNoZWRFdmVudChwcmltaXRpdmVNYW5hZ2VyLCBldmVudCk7XHJcblxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YmplY3QubmV4dChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcENsaWVudCgpIHtcclxuICAgICAgICBjb25zdCB3cyA9IG5ldyBTb2NrSlMoYCR7V2Vic29ja2V0U2VydmljZS5XRUJTT0NLRVRfVVJMfXN1YnNjcmlwdGlvbmAsIG51bGwsIHsgdGltZW91dDogV2Vic29ja2V0U2VydmljZS5DT05ORUNUSU9OX1RJTUVPVVQgfSk7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQgPSBTdG9tcC5vdmVyKHdzKTtcclxuICAgICAgICB0aGlzLl9zdG9tcENsaWVudC5kZWJ1ZyA9ICgpID0+IHt9OyAvLyBQYXJhIHJlbW92ZXIgb3MgbG9ncy5cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldEJhc2VVcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY29va2llU2VydmljZS5nZXQoXCJjb20uc2VuaW9yLmJhc2UudXJsXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0VXNlck5hbWUoKSB7XHJcbiAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KFwiY29tLnNlbmlvci50b2tlblwiKTtcclxuICAgICAgICByZXR1cm4gdG9rZW4gJiYgSlNPTi5wYXJzZSh0b2tlbikudXNlcm5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZWNvbm5lY3RXZWJTb2NrZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3RvbXBDbGllbnQuZGlzY29ubmVjdCgpO1xyXG4gICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEJhc2VVcmwoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYmFzZVVybCAhPT0gbnVsbCAmJiBiYXNlVXJsICE9IHRoaXMuYmFzZVVybCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuZ2V0VXNlck5hbWUoKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudXNlcm5hbWUgIT09IG51bGwgJiYgdXNlcm5hbWUgIT0gdGhpcy51c2VybmFtZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZm9jdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFdlYlNvY2tldCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSwgV2Vic29ja2V0U2VydmljZS5SRUNPTk5FQ1RfVElNRVIpO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -4,7 +4,7 @@ import { CommonModule } from '@angular/common';
|
|
|
4
4
|
import { BreadcrumbModule as BreadcrumbModule$1 } from 'primeng/breadcrumb';
|
|
5
5
|
import { NavigationEnd, PRIMARY_OUTLET, ActivatedRoute, Router, RouterModule } from '@angular/router';
|
|
6
6
|
import { Subject, throwError, interval, of, ReplaySubject } from 'rxjs';
|
|
7
|
-
import { takeUntil, filter, catchError, map, takeWhile, switchMap, take } from 'rxjs/operators';
|
|
7
|
+
import { takeUntil, filter, catchError, map, takeWhile, switchMap, first, take } from 'rxjs/operators';
|
|
8
8
|
import * as moment_ from 'moment';
|
|
9
9
|
import { FormField, FieldType } from '@seniorsistemas/angular-components';
|
|
10
10
|
import { HttpParams, HttpClient } from '@angular/common/http';
|
|
@@ -6022,7 +6022,6 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6022
6022
|
this.connected = false;
|
|
6023
6023
|
this.isConnecting = false;
|
|
6024
6024
|
this.stompSubscriptions = new Map();
|
|
6025
|
-
// private primitiveSubjects: Map<string, Subject<any>> = new Map<string, Subject<any>>();
|
|
6026
6025
|
this.primitiveManagers = new Map();
|
|
6027
6026
|
this.disconnectSubject = new Subject();
|
|
6028
6027
|
this.connect$ = new Subject();
|
|
@@ -6031,8 +6030,8 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6031
6030
|
this.connect();
|
|
6032
6031
|
}
|
|
6033
6032
|
/**
|
|
6034
|
-
* Observable
|
|
6035
|
-
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida
|
|
6033
|
+
* Observable responsável por emitir uma notificação quando a conexão websocket é estabelecida.
|
|
6034
|
+
* @return Um `Observable<void>` que emite uma notificação quando a conexão websocket é estabelecida.
|
|
6036
6035
|
*/
|
|
6037
6036
|
onConnect() {
|
|
6038
6037
|
setTimeout(() => {
|
|
@@ -6043,7 +6042,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6043
6042
|
return this.connect$.asObservable();
|
|
6044
6043
|
}
|
|
6045
6044
|
/**
|
|
6046
|
-
* Observable
|
|
6045
|
+
* Observable responsável por emitir uma notificação quando a conexão é finalizada.
|
|
6047
6046
|
* @return Um `Observable<void>` que emite uma notificação quando a conexão é finalizada.
|
|
6048
6047
|
*/
|
|
6049
6048
|
onDisconnect() {
|
|
@@ -6055,28 +6054,21 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6055
6054
|
* @param domain Dominio da primitva.
|
|
6056
6055
|
* @param service Service da primitiva.
|
|
6057
6056
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
6058
|
-
* @param identifierPath Caminho até a propriedade considerada o
|
|
6057
|
+
* @param identifierPath Caminho até a propriedade considerada o identificador do registro.
|
|
6059
6058
|
* @return Um `observable` que emite notificações toda vez que o respectivo evento é publicado no sistema.
|
|
6060
6059
|
*/
|
|
6061
6060
|
onEvent(domain, service, primitive, identifierPath) {
|
|
6062
|
-
|
|
6063
|
-
|
|
6064
|
-
return primitiveManager.subject.asObservable();
|
|
6061
|
+
if (this.primitiveManagers.has(primitive)) {
|
|
6062
|
+
return this.primitiveManagers.get(primitive).subject.asObservable();
|
|
6065
6063
|
}
|
|
6066
|
-
primitiveManager = {
|
|
6064
|
+
const primitiveManager = {
|
|
6067
6065
|
subject: new Subject(),
|
|
6068
6066
|
identifierPath: identifierPath,
|
|
6069
6067
|
publishedEvents: [],
|
|
6070
6068
|
};
|
|
6069
|
+
this.primitiveManagers.set(primitive, primitiveManager);
|
|
6071
6070
|
if (this.isConnected()) {
|
|
6072
|
-
|
|
6073
|
-
this.primitiveManagers.set(primitive, primitiveManager);
|
|
6074
|
-
const stompSubscription = this._stompClient.subscribe(url, (message) => {
|
|
6075
|
-
const event = JSON.parse(message.body || "{}");
|
|
6076
|
-
this.addPublishedEvent(primitiveManager, event);
|
|
6077
|
-
primitiveManager.subject.next(event);
|
|
6078
|
-
});
|
|
6079
|
-
this.stompSubscriptions.set(primitive, stompSubscription);
|
|
6071
|
+
this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
6080
6072
|
return primitiveManager.subject.asObservable();
|
|
6081
6073
|
}
|
|
6082
6074
|
else {
|
|
@@ -6084,25 +6076,18 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6084
6076
|
this.connect();
|
|
6085
6077
|
}
|
|
6086
6078
|
this.onConnect()
|
|
6087
|
-
.pipe(
|
|
6079
|
+
.pipe(first())
|
|
6088
6080
|
.subscribe(() => {
|
|
6089
|
-
|
|
6090
|
-
this.primitiveManagers.set(primitive, primitiveManager);
|
|
6091
|
-
const stompSubscription = this._stompClient.subscribe(url, (message) => {
|
|
6092
|
-
const event = JSON.parse(message.body || "{}");
|
|
6093
|
-
this.addPublishedEvent(primitiveManager, event);
|
|
6094
|
-
primitiveManager.subject.next(event);
|
|
6095
|
-
});
|
|
6096
|
-
this.stompSubscriptions.set(primitive, stompSubscription);
|
|
6081
|
+
this.createStompSubscriptions(domain, service, primitive, primitiveManager);
|
|
6097
6082
|
});
|
|
6098
6083
|
return primitiveManager.subject.asObservable();
|
|
6099
6084
|
}
|
|
6100
6085
|
}
|
|
6101
6086
|
/**
|
|
6102
|
-
* Retorna todos os eventos ouvidos
|
|
6087
|
+
* Retorna todos os eventos ouvidos pela primitiva com os respectivos identificadores.
|
|
6103
6088
|
* @typeParam `<T>` Tipo do evento retornado pela primitiva.
|
|
6104
6089
|
* @param primitive Primitiva que será "observada" pelo client.
|
|
6105
|
-
* @param identifiers Array com os
|
|
6090
|
+
* @param identifiers Array com os identificadores interessados.
|
|
6106
6091
|
* @return Array contendo o último evento recebido de cada identificador fornecido.
|
|
6107
6092
|
*/
|
|
6108
6093
|
getPublishedEvents(primitive, identifiers) {
|
|
@@ -6126,6 +6111,13 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6126
6111
|
primitiveManager.publishedEvents.push(event);
|
|
6127
6112
|
}
|
|
6128
6113
|
}
|
|
6114
|
+
createStompSubscriptions(domain, service, primitive, primitiveManager) {
|
|
6115
|
+
const withTokenUrl = this.getSubscriptionUrlWithToken(domain, service, primitive);
|
|
6116
|
+
const stompSubscriptionWithToken = this.createStompSubscription(withTokenUrl, primitiveManager);
|
|
6117
|
+
const withoutTokenUrl = this.getSubscriptionUrlWithoutToken(domain, service, primitive);
|
|
6118
|
+
const stompSubscriptionWithoutToken = this.createStompSubscription(withoutTokenUrl, primitiveManager);
|
|
6119
|
+
this.stompSubscriptions.set(primitive, [stompSubscriptionWithToken, stompSubscriptionWithoutToken]);
|
|
6120
|
+
}
|
|
6129
6121
|
getIdentifierFromEvent(identifierPath, event) {
|
|
6130
6122
|
const properties = identifierPath.split(".");
|
|
6131
6123
|
let identifier = event;
|
|
@@ -6139,9 +6131,7 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6139
6131
|
this.isConnecting = true;
|
|
6140
6132
|
this._stompClient.connect({}, () => {
|
|
6141
6133
|
this.setConnected(true);
|
|
6142
|
-
// console.log('setou false isConnecting');
|
|
6143
6134
|
this.isConnecting = false;
|
|
6144
|
-
// console.log('connectou dentro do connect cb');
|
|
6145
6135
|
this.publishOnConnect();
|
|
6146
6136
|
}, () => {
|
|
6147
6137
|
this.setConnected(false);
|
|
@@ -6164,8 +6154,10 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6164
6154
|
observersCount += primitiveManager.subject.observers.length;
|
|
6165
6155
|
}
|
|
6166
6156
|
if (observersCount === 0) {
|
|
6167
|
-
this.stompSubscriptions.forEach(
|
|
6168
|
-
stompSubscription
|
|
6157
|
+
this.stompSubscriptions.forEach(stompSubscriptions => {
|
|
6158
|
+
for (const stompSubscription of stompSubscriptions) {
|
|
6159
|
+
stompSubscription.unsubscribe();
|
|
6160
|
+
}
|
|
6169
6161
|
});
|
|
6170
6162
|
for (const primitiveManager of this.primitiveManagers.values()) {
|
|
6171
6163
|
primitiveManager.subject.complete();
|
|
@@ -6185,11 +6177,22 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6185
6177
|
setConnected(connected) {
|
|
6186
6178
|
this.connected = connected;
|
|
6187
6179
|
}
|
|
6188
|
-
|
|
6180
|
+
getSubscriptionUrlWithToken(domain, service, primitive) {
|
|
6189
6181
|
const tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
6190
6182
|
const token = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.access_token : null;
|
|
6191
6183
|
return `/topic/${tenant}/${token}/${domain}/${service}/${primitive}`;
|
|
6192
6184
|
}
|
|
6185
|
+
getSubscriptionUrlWithoutToken(domain, service, primitive) {
|
|
6186
|
+
const tenant = WebsocketService_1.TOKEN ? WebsocketService_1.TOKEN.username.split("@")[1] : null;
|
|
6187
|
+
return `/topic/${tenant}/${domain}/${service}/${primitive}`;
|
|
6188
|
+
}
|
|
6189
|
+
createStompSubscription(destination, primitiveManager) {
|
|
6190
|
+
return this._stompClient.subscribe(destination, (message) => {
|
|
6191
|
+
const event = JSON.parse(message.body || "{}");
|
|
6192
|
+
this.addPublishedEvent(primitiveManager, event);
|
|
6193
|
+
primitiveManager.subject.next(event);
|
|
6194
|
+
});
|
|
6195
|
+
}
|
|
6193
6196
|
createStompClient() {
|
|
6194
6197
|
const ws = new SockJS(`${WebsocketService_1.WEBSOCKET_URL}subscription`, null, { timeout: WebsocketService_1.CONNECTION_TIMEOUT });
|
|
6195
6198
|
this._stompClient = Stomp.over(ws);
|
|
@@ -6206,12 +6209,10 @@ let WebsocketService = WebsocketService_1 = class WebsocketService {
|
|
|
6206
6209
|
this._stompClient.disconnect();
|
|
6207
6210
|
const baseUrl = this.getBaseUrl();
|
|
6208
6211
|
if (this.baseUrl !== null && baseUrl != this.baseUrl) {
|
|
6209
|
-
// //console.log('ws disconnected: base url changed', this.baseUrl, ' -> ', baseUrl || 'null');
|
|
6210
6212
|
return;
|
|
6211
6213
|
}
|
|
6212
6214
|
const username = this.getUserName();
|
|
6213
6215
|
if (this.username !== null && username != this.username) {
|
|
6214
|
-
// //console.log('ws disconnected: username changed', this.username, ' -> ', username || 'null');
|
|
6215
6216
|
return;
|
|
6216
6217
|
}
|
|
6217
6218
|
setTimeout(() => {
|