@senior-gestao-pessoas/hcmxt-bridge-lib 1.0.2 → 1.0.3
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.
|
@@ -19,6 +19,7 @@ export class XtBridgeService {
|
|
|
19
19
|
this.MAX_CHUNKS = 1000;
|
|
20
20
|
this.DEFAULT_MAX_RETRIES = 3;
|
|
21
21
|
this.DEFAULT_RETRY_DELAY = 10000;
|
|
22
|
+
this.DEFAULT_NO_WAIT = false;
|
|
22
23
|
this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';
|
|
23
24
|
this.retryTimeouts = new Map();
|
|
24
25
|
this.initializeCefCommunication();
|
|
@@ -170,6 +171,7 @@ export class XtBridgeService {
|
|
|
170
171
|
chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,
|
|
171
172
|
maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,
|
|
172
173
|
retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,
|
|
174
|
+
noWait: bridgeConfig?.noWait ?? this.DEFAULT_NO_WAIT
|
|
173
175
|
};
|
|
174
176
|
const retryKey = this.generateRequestId();
|
|
175
177
|
return new Observable((subscriber) => {
|
|
@@ -192,7 +194,7 @@ export class XtBridgeService {
|
|
|
192
194
|
}
|
|
193
195
|
const requestId = this.generateRequestId();
|
|
194
196
|
state.currentRequestId = requestId;
|
|
195
|
-
state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize).subscribe({
|
|
197
|
+
state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize, context.config.noWait).subscribe({
|
|
196
198
|
next: (data) => this.handleAttemptSuccess(data, subscriber, retryKey),
|
|
197
199
|
error: (error) => this.handleAttemptError(error, attemptNumber, state, retryKey, subscriber, context),
|
|
198
200
|
});
|
|
@@ -239,11 +241,29 @@ export class XtBridgeService {
|
|
|
239
241
|
/**
|
|
240
242
|
* Execute a single attempt of the request
|
|
241
243
|
*/
|
|
242
|
-
|
|
244
|
+
/**
|
|
245
|
+
* Execute a single attempt of the request
|
|
246
|
+
* @param requestId Unique request ID
|
|
247
|
+
* @param action Action name
|
|
248
|
+
* @param payload Payload data
|
|
249
|
+
* @param functionName Backend function name
|
|
250
|
+
* @param timeout Timeout in ms
|
|
251
|
+
* @param chunkSize Chunk size in bytes
|
|
252
|
+
* @param noWait If true, do not wait for a response (fire and forget)
|
|
253
|
+
*/
|
|
254
|
+
executeAttempt(requestId, action, payload, functionName, timeout, chunkSize, noWait) {
|
|
243
255
|
// Create subject for this specific request
|
|
244
256
|
const responseSubject = new Subject();
|
|
245
257
|
this.responseSubjects.set(requestId, responseSubject);
|
|
246
258
|
this.requestOrder.push(requestId);
|
|
259
|
+
if (noWait) {
|
|
260
|
+
// Fire and forget: send request via invokeNative with XtBridgeRequest format, do not track response or timeout
|
|
261
|
+
this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
|
|
262
|
+
// Return an observable that completes immediately
|
|
263
|
+
return new Observable((subscriber) => {
|
|
264
|
+
subscriber.complete();
|
|
265
|
+
});
|
|
266
|
+
}
|
|
247
267
|
// Set up timeout to prevent hanging requests
|
|
248
268
|
const setupTimeout = setTimeout(() => {
|
|
249
269
|
const subject = this.responseSubjects.get(requestId);
|
|
@@ -254,6 +274,21 @@ export class XtBridgeService {
|
|
|
254
274
|
}, timeout);
|
|
255
275
|
this.requestTimeouts.set(requestId, setupTimeout);
|
|
256
276
|
// Send request via invokeNative with XtBridgeRequest format
|
|
277
|
+
this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
|
|
278
|
+
// Return observable that completes after first response
|
|
279
|
+
return responseSubject.asObservable().pipe(take(1));
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Send a request using invokeNative
|
|
283
|
+
* @param requestId Unique request ID
|
|
284
|
+
* @param action Action name
|
|
285
|
+
* @param payload Payload data
|
|
286
|
+
* @param functionName Backend function name
|
|
287
|
+
* @param timeout Timeout in ms
|
|
288
|
+
* @param chunkSize Chunk size in bytes
|
|
289
|
+
* @param responseSubject Subject to emit response or error to
|
|
290
|
+
*/
|
|
291
|
+
sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject) {
|
|
257
292
|
if (globalThis.invokeNative) {
|
|
258
293
|
try {
|
|
259
294
|
const request = JSON.stringify({
|
|
@@ -279,8 +314,6 @@ export class XtBridgeService {
|
|
|
279
314
|
responseSubject.error(error);
|
|
280
315
|
this.cleanupRequest(requestId);
|
|
281
316
|
}
|
|
282
|
-
// Return observable that completes after first response
|
|
283
|
-
return responseSubject.asObservable().pipe(take(1));
|
|
284
317
|
}
|
|
285
318
|
/**
|
|
286
319
|
* Handle response from CEF - Thread-safe, prevents response mixing
|
|
@@ -456,4 +489,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
456
489
|
providedIn: 'root'
|
|
457
490
|
}]
|
|
458
491
|
}], ctorParameters: function () { return []; } });
|
|
459
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHQtYnJpZGdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvc3JjL2xpYi9zZXJ2aWNlcy94dC1icmlkZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBdUUzRCxNQUFNLE9BQU8sZUFBZTtJQWtCMUI7UUFoQmlCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQ25ELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN6QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNoRSxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUNuQixpQkFBWSxHQUFHLElBQUksR0FBRyxFQUE2RCxDQUFDO1FBQ3BGLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELDRDQUF1QyxHQUFHLGlCQUFpQixDQUFDO1FBQzVELDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyx1QkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZTtRQUMvQyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsZ0RBQTJDLEdB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QUMsY0FBYyxDQUFDLEdBQUcsQ0FBQztZQUN0QixRQUFRLEVBQUUsT0FBTztZQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQztZQUN0RixNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO1NBQ3ZELENBQUMsQ0FBQztJQUNMLENBQUM7K0dBeGhCVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQgeyBUcmFuc2xhdGlvblNlcnZpY2UgfSBmcm9tICcuL3RyYW5zbGF0aW9uLnNlcnZpY2UnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFh0QnJpZGdlUmVxdWVzdCB7XG4gIGlkOiBzdHJpbmc7XG4gIGFjdGlvbjogc3RyaW5nO1xuICBwYXlsb2FkPzogYW55O1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBYdEJyaWRnZVJlc3BvbnNlIHtcbiAgaWQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgZGF0YT86IGFueTtcbiAgZXJyb3I/OiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJyaWRnZUNvbmZpZyB7XG4gIC8vIE5vbWUgZGEgZnVuw6fDo28gbm8gQmFjay1FbmQgKGRlZmF1bHQ6IFwiWHRCcmlkZ2VSZXF1ZXN0XCIpXG4gIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcblxuICAvLyBUaW1lb3V0IHBhcmEgcmVxdWlzacOnw7VlcyBlbSBtcyAoZGVmYXVsdDogMzAwMDApXG4gIHJlcXVlc3RUaW1lb3V0PzogbnVtYmVyO1xuXG4gIC8vIFRhbWFuaG8gZGUgY2h1bmsgcGFyYSBkYWRvcyBncmFuZGVzIGVtIGJ5dGVzIChkZWZhdWx0OiA2NEtCKVxuICBjaHVua1NpemU/OiBudW1iZXI7XG5cbiAgLy8gTsO6bWVybyBtw6F4aW1vIGRlIHRlbnRhdGl2YXMgZW0gY2FzbyBkZSBmYWxoYSAoZGVmYXVsdDogMylcbiAgbWF4UmV0cmllcz86IG51bWJlcjtcblxuICAvLyBEZWxheSBlbnRyZSB0ZW50YXRpdmFzIGVtIG1zIChkZWZhdWx0OiAxMDAwMClcbiAgcmV0cnlEZWxheT86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVkQnJpZGdlQ29uZmlnIHtcbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIHRpbWVvdXQ6IG51bWJlcjtcbiAgY2h1bmtTaXplOiBudW1iZXI7XG4gIG1heFJldHJpZXM6IG51bWJlcjtcbiAgcmV0cnlEZWxheTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgQXR0ZW1wdFN0YXRlIHtcbiAgYWJvcnRlZDogYm9vbGVhbjtcbiAgY3VycmVudElubmVyU3ViOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH0gfCBudWxsO1xuICBjdXJyZW50UmVxdWVzdElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5pbnRlcmZhY2UgQXR0ZW1wdENvbnRleHQge1xuICBhY3Rpb246IHN0cmluZztcbiAgcGF5bG9hZDogYW55O1xuICBjb25maWc6IFJlc29sdmVkQnJpZGdlQ29uZmlnO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIC8vIENFRiBpbmplY3RlZCBmdW5jdGlvbnNcbiAgICBjZWZTZW5kVG9TZXJ2ZXI/OiAocmVxdWVzdERhdGE6IHN0cmluZykgPT4gdm9pZDtcbiAgICAvLyBBbmd1bGFyIGNhbGxiYWNrIGZ1bmN0aW9uc1xuICAgIGhhbmRsZUNlZlJlc3BvbnNlPzogKHJlc3BvbnNlRGF0YTogc3RyaW5nKSA9PiB2b2lkO1xuICAgIC8vIE5hdGl2ZSBpbnZva2UgZnVuY3Rpb24gZm9yIFh0IGVtdWxhdG9yXG4gICAgaW52b2tlTmF0aXZlPzogKHR5cGU6IG51bWJlciwgcGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIC8vIEFwcCBjb21wb25lbnQgY2FsbGJhY2tzIC0gY2FsbGVkIGJ5IHNlcnZlciB3aXRoIHJlcXVlc3QgSURcbiAgICByZXNvbHZlRnVuY3Rpb24/OiAoaWQ6IHN0cmluZywgZGF0YTogYW55KSA9PiB2b2lkO1xuICAgIHJlamVjdEZ1bmN0aW9uPzogKGlkOiBzdHJpbmcsIGVycm9yOiBhbnkpID0+IHZvaWQ7XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgWHRCcmlkZ2VTZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IHJlc3BvbnNlU3ViamVjdHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDxhbnk+PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RUaW1lb3V0cyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGlvblN0YXR1cyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHJlcXVlc3RPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBjaHVua0J1ZmZlcnMgPSBuZXcgTWFwPHN0cmluZywgeyBjaHVua3M6IE1hcDxudW1iZXIsIHN0cmluZz47IGxhc3RTZXE/OiBudW1iZXIgfT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZSA9IGluamVjdChNZXNzYWdlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRpb25TZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9YVF9CUklER0VfUkVRVUVTVF9GVU5DVElPTl9OQU1FID0gXCJYdEJyaWRnZVJlcXVlc3RcIjtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1JFUVVFU1RfVElNRV9PVVQgPSAzMDAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX0NIVU5LX1NJWkUgPSA2NCAqIDEwMjQ7IC8vIERlZmF1bHQgNjRLQlxuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9DSFVOS1MgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTUFYX1JFVFJJRVMgPSAzO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfUkVUUllfREVMQVkgPSAxMDAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBUT0FTVF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTX0ZBSUxFRF9XSVRIX0lEID0gJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlc3BvbnNlX3Byb2Nlc3NfZmFpbGVkX3dpdGhfaWQnO1xuICBwcml2YXRlIHJlYWRvbmx5IHJldHJ5VGltZW91dHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5pdGlhbGl6ZUNlZkNvbW11bmljYXRpb24oKTtcbiAgICB0aGlzLmNoZWNrQ2VmQXZhaWxhYmlsaXR5KCk7XG4gICAgLy8gUmVnaXN0cmFyIGNhbGxiYWNrcyBnbG9iYWlzIHBhcmEgbyBzZXJ2aWRvciBjaGFtYXJcbiAgICB0aGlzLnJlZ2lzdGVyR2xvYmFsQ2FsbGJhY2tzKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGdsb2JhbCBjYWxsYmFja3MgdGhhdCB0aGUgc2VydmVyIHdpbGwgaW52b2tlXG4gICAqIFNlcnZpZG9yIGNoYW1hIGRvY3VtZW50LmFwcC5nNS5yZXNvbHZlRnVuY3Rpb24oaWQsIGRhdGEpIG91IGRvY3VtZW50LmFwcC5nNS5yZWplY3RGdW5jdGlvbihpZCwgZXJyb3IpXG4gICAqL1xuICBwcml2YXRlIHJlZ2lzdGVyR2xvYmFsQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIC8vIENyaWFyIGVzdHJ1dHVyYSBkb2N1bWVudC5hcHAuZzUgc2UgbsOjbyBleGlzdGlyXG4gICAgaWYgKCEoZG9jdW1lbnQgYXMgYW55KS5hcHApIHtcbiAgICAgIChkb2N1bWVudCBhcyBhbnkpLmFwcCA9IHt9O1xuICAgIH1cbiAgICBpZiAoIShkb2N1bWVudCBhcyBhbnkpLmFwcC5nNSkge1xuICAgICAgKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1ID0ge307XG4gICAgfVxuXG4gICAgLy8gU2FsdmFyIHJlZmVyw6puY2lhcyBvcmlnaW5haXMgc2UgZXhpc3RpcmVtIChkbyBBcHBDb21wb25lbnQpXG4gICAgY29uc3Qgb3JpZ2luYWxSZXNvbHZlID0gKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlc29sdmVGdW5jdGlvbjtcbiAgICBjb25zdCBvcmlnaW5hbFJlamVjdCA9IChkb2N1bWVudCBhcyBhbnkpLmFwcC5nNS5yZWplY3RGdW5jdGlvbjtcblxuICAgIC8vIERlZmluaXIgbm92YSByZXNvbHZlRnVuY3Rpb25cbiAgICAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVzb2x2ZUZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gQ2hhbWFyIG9yaWdpbmFsIGRvIEFwcENvbXBvbmVudCBzZSBleGlzdGlyXG4gICAgICBpZiAob3JpZ2luYWxSZXNvbHZlICYmIHR5cGVvZiBvcmlnaW5hbFJlc29sdmUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvcmlnaW5hbFJlc29sdmUuY2FsbChnbG9iYWxUaGlzLCBpZCwgZGF0YSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jYWxsYmFja19mYWlsZWQnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzYXIgdmlhIFh0QnJpZGdlU2VydmljZVxuICAgICAgdGhpcy5oYW5kbGVTZXJ2ZXJDYWxsYmFjayhpZCwgZGF0YSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvLyBEZWZpbmlyIG5vdmEgcmVqZWN0RnVuY3Rpb25cbiAgICAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVqZWN0RnVuY3Rpb24gPSAoaWQ6IHN0cmluZywgZXJyb3I6IGFueSkgPT4ge1xuICAgICAgLy8gQ2hhbWFyIG9yaWdpbmFsIGRvIEFwcENvbXBvbmVudCBzZSBleGlzdGlyXG4gICAgICBpZiAob3JpZ2luYWxSZWplY3QgJiYgdHlwZW9mIG9yaWdpbmFsUmVqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3JpZ2luYWxSZWplY3QuY2FsbChnbG9iYWxUaGlzLCBpZCwgZXJyb3IpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2FsbGJhY2tfZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2Vzc2FyIHZpYSBYdEJyaWRnZVNlcnZpY2VcbiAgICAgIHRoaXMuaGFuZGxlU2VydmVyQ2FsbGJhY2soaWQsIGVycm9yLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLy8gVGFtYsOpbSByZWdpc3RyYXIgZW0gd2luZG93IHBhcmEgY29tcGF0aWJpbGlkYWRlXG4gICAgKGdsb2JhbFRoaXMgYXMgYW55KS5yZXNvbHZlRnVuY3Rpb24gPSAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVzb2x2ZUZ1bmN0aW9uO1xuICAgIChnbG9iYWxUaGlzIGFzIGFueSkucmVqZWN0RnVuY3Rpb24gPSAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVqZWN0RnVuY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBDRUYgY29tbXVuaWNhdGlvbiBieSBzZXR0aW5nIHVwIHRoZSBnbG9iYWwgY2FsbGJhY2tcbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNlZkNvbW11bmljYXRpb24oKTogdm9pZCB7XG4gICAgLy8gU2V0IHVwIGdsb2JhbCBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IENFRiB3aWxsIGNhbGwgKGZvciBkaXJlY3QgcmVzcG9uc2VzKVxuICAgIChnbG9iYWxUaGlzIGFzIGFueSkuaGFuZGxlQ2VmUmVzcG9uc2UgPSAocmVzcG9uc2VEYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlOiBhbnkgPSBKU09OLnBhcnNlKHJlc3BvbnNlRGF0YSk7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5yZXNwb25zZV9wYXJzZV9mYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjYWxsYmFjayBmcm9tIHNlcnZlciB2aWEgcmVzb2x2ZUZ1bmN0aW9uL3JlamVjdEZ1bmN0aW9uXG4gICAqIFByb2Nlc3NhIHRhbnRvIHJlc3Bvc3RhcyBzaW1wbGVzIHF1YW50byBjaHVua2VkXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVNlcnZlckNhbGxiYWNrKGlkOiBzdHJpbmcsIGRhdGE6IGFueSwgaXNFcnJvcjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZ2V0KGlkKTtcblxuICAgIGlmICghc3ViamVjdCkge1xuICAgICAgdGhpcy5zaG93RXJyb3IodGhpcy5UT0FTVF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTX0ZBSUxFRF9XSVRIX0lELCB7IGlkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBsZXQgcGFyc2VkRGF0YSA9IGRhdGE7XG5cbiAgICAgIC8vIFBhcnNlIEpTT04gc2UgZm9yIHN0cmluZ1xuICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQgfSk7XG4gICAgICAgICAgcGFyc2VkRGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgaGFzUGFyc2VkRGF0YU9iamVjdCA9IHBhcnNlZERhdGEgJiYgdHlwZW9mIHBhcnNlZERhdGEgPT09ICdvYmplY3QnO1xuICAgICAgLy8gVmVyaWZpY2FyIHNlIMOpIHJlc3Bvc3RhIGNodW5rZWQgeyBjaHVuaywgc2VxLCBsYXN0IH1cbiAgICAgIGlmIChoYXNQYXJzZWREYXRhT2JqZWN0ICYmIHBhcnNlZERhdGEuY2h1bmsgJiYgcGFyc2VkRGF0YS5zZXEgIT09IHVuZGVmaW5lZCAmJiBwYXJzZWREYXRhLmxhc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmhhbmRsZUNodW5rUmVzcG9uc2UoaWQsIHBhcnNlZERhdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc3Bvc3RhIG5vcm1hbCAobsOjby1jaHVua2VkKVxuICAgICAgaWYgKGlzRXJyb3IpIHtcbiAgICAgICAgY29uc3QgZXJyb3JNc2cgPSB0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBkYXRhIDogSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZCB9KTtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IoZXJyb3JNc2cpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YmplY3QubmV4dChwYXJzZWREYXRhKTtcbiAgICAgIH1cblxuICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChpZCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZCB9KTtcbiAgICAgIHN1YmplY3QuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChpZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIENFRiBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0NlZkF2YWlsYWJpbGl0eSgpOiB2b2lkIHtcbiAgICBjb25zdCBpc0F2YWlsYWJsZSA9IHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLmNlZlNlbmRUb1NlcnZlciA9PT0gJ2Z1bmN0aW9uJztcbiAgICB0aGlzLmNvbm5lY3Rpb25TdGF0dXMubmV4dChpc0F2YWlsYWJsZSk7XG5cbiAgICBpZiAoIWlzQXZhaWxhYmxlKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2VmX3VuYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHVuaXF1ZSBJRCBmb3IgcmVxdWVzdHMgLSBndWFyYW50ZWVkIHVuaXF1ZSBldmVuIHdpdGggY29uY3VycmVudCBjYWxsc1xuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZVJlcXVlc3RJZCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgcmFuZG9tID0gY3J5cHRvLnJhbmRvbVVVSUQoKS5zcGxpdCgnLScpLmpvaW4oJycpO1xuICAgIGNvbnN0IGNvdW50ZXIgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuc2l6ZTsgLy8gQWRkaXRpb25hbCB1bmlxdWVuZXNzXG4gICAgcmV0dXJuIGByZXFfJHt0aW1lc3RhbXB9XyR7cmFuZG9tfV8ke2NvdW50ZXJ9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIHJlcXVlc3QgdG8gc2VydmVyIHZpYSBDRUYgLSBUaHJlYWQtc2FmZSB3aXRoIHRpbWVvdXQgcHJvdGVjdGlvbiBhbmQgcmV0cnkgcmVzaWxpZW5jZVxuICAgKlxuICAgKiBAcGFyYW0gYWN0aW9uIE5vbWUgZGEgYcOnw6NvL0FQSSBhIHNlciBpbnZvY2FkYSBubyBCYWNrLUVuZFxuICAgKiBAcGFyYW0gbG9jYWxlIExvY2FsZSBvYnJpZ2F0w7NyaW8gcGFyYSBpbnRlcm5hY2lvbmFsaXphciBhcyBtZW5zYWdlbnMgZGUgVG9hc3QgKGV4OiAncHQtQlInLCAnZW4tVVMnLCAnZXMtRVMnKS5cbiAgICogICAgICAgICAgICAgICBBdHVhbGl6YSBvIGxvY2FsZSBhdGl2byBkbyBUcmFuc2xhdGlvblNlcnZpY2UgYW50ZXMgZGUgZW52aWFyIGEgcmVxdWlzacOnw6NvLlxuICAgKiBAcGFyYW0gcGF5bG9hZCBEYWRvcyBhIHNlcmVtIGVudmlhZG9zIGFvIEJhY2stRW5kXG4gICAqIEBwYXJhbSBicmlkZ2VDb25maWcgQ29uZmlndXJhw6fDtWVzIG9wY2lvbmFpcyBkYSByZXF1aXNpw6fDo29cbiAgICovXG4gIHNlbmRSZXF1ZXN0PFQgPSBhbnk+KGFjdGlvbjogc3RyaW5nLCBsb2NhbGU6IHN0cmluZywgcGF5bG9hZD86IGFueSwgYnJpZGdlQ29uZmlnPzogQnJpZGdlQ29uZmlnKTogT2JzZXJ2YWJsZTxUPiB7XG4gICAgdGhpcy50cmFuc2xhdGlvblNlcnZpY2Uuc2V0TG9jYWxlKGxvY2FsZSk7XG5cbiAgICBjb25zdCByZXNvbHZlZENvbmZpZzogUmVzb2x2ZWRCcmlkZ2VDb25maWcgPSB7XG4gICAgICBmdW5jdGlvbk5hbWU6IGJyaWRnZUNvbmZpZz8uZnVuY3Rpb25OYW1lID8/IHRoaXMuREVGQVVMVF9YVF9CUklER0VfUkVRVUVTVF9GVU5DVElPTl9OQU1FLFxuICAgICAgdGltZW91dDogYnJpZGdlQ29uZmlnPy5yZXF1ZXN0VGltZW91dCA/PyB0aGlzLkRFRkFVTFRfUkVRVUVTVF9USU1FX09VVCxcbiAgICAgIGNodW5rU2l6ZTogYnJpZGdlQ29uZmlnPy5jaHVua1NpemUgPz8gdGhpcy5ERUZBVUxUX0NIVU5LX1NJWkUsXG4gICAgICBtYXhSZXRyaWVzOiBicmlkZ2VDb25maWc/Lm1heFJldHJpZXMgPz8gdGhpcy5ERUZBVUxUX01BWF9SRVRSSUVTLFxuICAgICAgcmV0cnlEZWxheTogYnJpZGdlQ29uZmlnPy5yZXRyeURlbGF5ID8/IHRoaXMuREVGQVVMVF9SRVRSWV9ERUxBWSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmV0cnlLZXkgPSB0aGlzLmdlbmVyYXRlUmVxdWVzdElkKCk7XG5cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXRlOiBBdHRlbXB0U3RhdGUgPSB7XG4gICAgICAgIGFib3J0ZWQ6IGZhbHNlLFxuICAgICAgICBjdXJyZW50SW5uZXJTdWI6IG51bGwsXG4gICAgICAgIGN1cnJlbnRSZXF1ZXN0SWQ6IG51bGwsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBjb250ZXh0OiBBdHRlbXB0Q29udGV4dCA9IHsgYWN0aW9uLCBwYXlsb2FkLCBjb25maWc6IHJlc29sdmVkQ29uZmlnIH07XG5cbiAgICAgIHRoaXMucnVuQXR0ZW1wdDxUPigwLCBzdGF0ZSwgcmV0cnlLZXksIHN1YnNjcmliZXIsIGNvbnRleHQpO1xuXG4gICAgICByZXR1cm4gKCkgPT4gdGhpcy5jYW5jZWxTZW5kUmVxdWVzdChzdGF0ZSwgcmV0cnlLZXkpO1xuICAgIH0pLnBpcGUodGFrZSgxKSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgc2luZ2xlIGF0dGVtcHQgYW5kIHNjaGVkdWxlIHJldHJpZXMgb24gZXJyb3JcbiAgICovXG4gIHByaXZhdGUgcnVuQXR0ZW1wdDxUPihcbiAgICBhdHRlbXB0TnVtYmVyOiBudW1iZXIsXG4gICAgc3RhdGU6IEF0dGVtcHRTdGF0ZSxcbiAgICByZXRyeUtleTogc3RyaW5nLFxuICAgIHN1YnNjcmliZXI6IHsgbmV4dDogKHY6IFQpID0+IHZvaWQ7IGVycm9yOiAoZTogYW55KSA9PiB2b2lkOyBjb21wbGV0ZTogKCkgPT4gdm9pZCB9LFxuICAgIGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0XG4gICk6IHZvaWQge1xuICAgIGlmIChzdGF0ZS5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5nZW5lcmF0ZVJlcXVlc3RJZCgpO1xuICAgIHN0YXRlLmN1cnJlbnRSZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7XG5cbiAgICBzdGF0ZS5jdXJyZW50SW5uZXJTdWIgPSB0aGlzLmV4ZWN1dGVBdHRlbXB0PFQ+KFxuICAgICAgcmVxdWVzdElkLFxuICAgICAgY29udGV4dC5hY3Rpb24sXG4gICAgICBjb250ZXh0LnBheWxvYWQsXG4gICAgICBjb250ZXh0LmNvbmZpZy5mdW5jdGlvbk5hbWUsXG4gICAgICBjb250ZXh0LmNvbmZpZy50aW1lb3V0LFxuICAgICAgY29udGV4dC5jb25maWcuY2h1bmtTaXplXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGEpID0+IHRoaXMuaGFuZGxlQXR0ZW1wdFN1Y2Nlc3M8VD4oZGF0YSwgc3Vic2NyaWJlciwgcmV0cnlLZXkpLFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4gdGhpcy5oYW5kbGVBdHRlbXB0RXJyb3I8VD4oXG4gICAgICAgIGVycm9yLCBhdHRlbXB0TnVtYmVyLCBzdGF0ZSwgcmV0cnlLZXksIHN1YnNjcmliZXIsIGNvbnRleHRcbiAgICAgICksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF0dGVtcHRTdWNjZXNzPFQ+KFxuICAgIGRhdGE6IFQsXG4gICAgc3Vic2NyaWJlcjogeyBuZXh0OiAodjogVCkgPT4gdm9pZDsgY29tcGxldGU6ICgpID0+IHZvaWQgfSxcbiAgICByZXRyeUtleTogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIHN1YnNjcmliZXIubmV4dChkYXRhKTtcbiAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5yZXRyeVRpbWVvdXRzLmRlbGV0ZShyZXRyeUtleSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUF0dGVtcHRFcnJvcjxUPihcbiAgICBlcnJvcjogYW55LFxuICAgIGF0dGVtcHROdW1iZXI6IG51bWJlcixcbiAgICBzdGF0ZTogQXR0ZW1wdFN0YXRlLFxuICAgIHJldHJ5S2V5OiBzdHJpbmcsXG4gICAgc3Vic2NyaWJlcjogeyBuZXh0OiAodjogVCkgPT4gdm9pZDsgZXJyb3I6IChlOiBhbnkpID0+IHZvaWQ7IGNvbXBsZXRlOiAoKSA9PiB2b2lkIH0sXG4gICAgY29udGV4dDogQXR0ZW1wdENvbnRleHRcbiAgKTogdm9pZCB7XG4gICAgaWYgKHN0YXRlLmFib3J0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdE51bWJlciA8IGNvbnRleHQuY29uZmlnLm1heFJldHJpZXMpIHtcbiAgICAgIGNvbnN0IHJldHJ5VGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJldHJ5VGltZW91dHMuZGVsZXRlKHJldHJ5S2V5KTtcbiAgICAgICAgdGhpcy5ydW5BdHRlbXB0PFQ+KGF0dGVtcHROdW1iZXIgKyAxLCBzdGF0ZSwgcmV0cnlLZXksIHN1YnNjcmliZXIsIGNvbnRleHQpO1xuICAgICAgfSwgY29udGV4dC5jb25maWcucmV0cnlEZWxheSk7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dHMuc2V0KHJldHJ5S2V5LCByZXRyeVRpbWVvdXQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jb21tdW5pY2F0aW9uX2ZhaWxlZF9hZnRlcl9yZXRyaWVzJywge1xuICAgICAgYXR0ZW1wdHM6IGNvbnRleHQuY29uZmlnLm1heFJldHJpZXMgKyAxXG4gICAgfSk7XG4gICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIGNhbmNlbFNlbmRSZXF1ZXN0KHN0YXRlOiBBdHRlbXB0U3RhdGUsIHJldHJ5S2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzdGF0ZS5hYm9ydGVkID0gdHJ1ZTtcblxuICAgIC8vIENhbmNlbGFyIHJldHJ5IGFnZW5kYWRvXG4gICAgY29uc3QgcGVuZGluZ1JldHJ5ID0gdGhpcy5yZXRyeVRpbWVvdXRzLmdldChyZXRyeUtleSk7XG4gICAgaWYgKHBlbmRpbmdSZXRyeSkge1xuICAgICAgY2xlYXJUaW1lb3V0KHBlbmRpbmdSZXRyeSk7XG4gICAgICB0aGlzLnJldHJ5VGltZW91dHMuZGVsZXRlKHJldHJ5S2V5KTtcbiAgICB9XG5cbiAgICAvLyBDYW5jZWxhciB0ZW50YXRpdmEgZW0gYW5kYW1lbnRvXG4gICAgaWYgKHN0YXRlLmN1cnJlbnRJbm5lclN1Yikge1xuICAgICAgc3RhdGUuY3VycmVudElubmVyU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLy8gTGltcGFyIHJlcXVpc2nDp8OjbyBwZW5kZW50ZSBubyBzZXJ2aWRvclxuICAgIGlmIChzdGF0ZS5jdXJyZW50UmVxdWVzdElkKSB7XG4gICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHN0YXRlLmN1cnJlbnRSZXF1ZXN0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgc2luZ2xlIGF0dGVtcHQgb2YgdGhlIHJlcXVlc3RcbiAgICovXG4gIHByaXZhdGUgZXhlY3V0ZUF0dGVtcHQ8VD4oXG4gICAgcmVxdWVzdElkOiBzdHJpbmcsXG4gICAgYWN0aW9uOiBzdHJpbmcsXG4gICAgcGF5bG9hZDogYW55LFxuICAgIGZ1bmN0aW9uTmFtZTogc3RyaW5nLFxuICAgIHRpbWVvdXQ6IG51bWJlcixcbiAgICBjaHVua1NpemU6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAvLyBDcmVhdGUgc3ViamVjdCBmb3IgdGhpcyBzcGVjaWZpYyByZXF1ZXN0XG4gICAgY29uc3QgcmVzcG9uc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5zZXQocmVxdWVzdElkLCByZXNwb25zZVN1YmplY3QpO1xuICAgIHRoaXMucmVxdWVzdE9yZGVyLnB1c2gocmVxdWVzdElkKTtcblxuICAgIC8vIFNldCB1cCB0aW1lb3V0IHRvIHByZXZlbnQgaGFuZ2luZyByZXF1ZXN0c1xuICAgIGNvbnN0IHNldHVwVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMucmVzcG9uc2VTdWJqZWN0cy5nZXQocmVxdWVzdElkKTtcbiAgICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGBSZXF1ZXN0ICR7cmVxdWVzdElkfSB0aW1lZCBvdXQgYWZ0ZXIgJHt0aW1lb3V0fW1zYCkpO1xuICAgICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfSwgdGltZW91dCk7XG5cbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5zZXQocmVxdWVzdElkLCBzZXR1cFRpbWVvdXQpO1xuXG4gICAgLy8gU2VuZCByZXF1ZXN0IHZpYSBpbnZva2VOYXRpdmUgd2l0aCBYdEJyaWRnZVJlcXVlc3QgZm9ybWF0XG4gICAgaWYgKChnbG9iYWxUaGlzIGFzIGFueSkuaW52b2tlTmF0aXZlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIFwiaWRcIjogcmVxdWVzdElkLFxuICAgICAgICAgIFwicGFyYW1ldGVyc1wiOiBbXG4gICAgICAgICAgICB7IFwicGFyYW1ldHJvXCI6IGFjdGlvbiB9LFxuICAgICAgICAgICAgeyBcInBhcmFtZXRyb1wiOiBwYXlsb2FkID8gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCB8fCB7fSkgOiBcIlwiIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgICBjaHVua1NpemVcbiAgICAgICAgfSk7XG5cbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KS5pbnZva2VOYXRpdmUoMCwgYCMjIyR7cmVxdWVzdH1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5yZXF1ZXN0X3NlbmRfZmFpbGVkJyk7XG4gICAgICAgIHJlc3BvbnNlU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlcXVlc3Rfc2VuZF9mYWlsZWQnKTtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCdDRUYgY29tbXVuaWNhdGlvbiBub3QgYXZhaWxhYmxlJyk7XG4gICAgICByZXNwb25zZVN1YmplY3QuZXJyb3IoZXJyb3IpO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIGFmdGVyIGZpcnN0IHJlc3BvbnNlXG4gICAgcmV0dXJuIHJlc3BvbnNlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgdGFrZSgxKVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgcmVzcG9uc2UgZnJvbSBDRUYgLSBUaHJlYWQtc2FmZSwgcHJldmVudHMgcmVzcG9uc2UgbWl4aW5nXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlOiBYdEJyaWRnZVJlc3BvbnNlKTogdm9pZCB7XG4gICAgaWYgKCFyZXNwb25zZSkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmludmFsaWRfcmVzcG9uc2UnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhbnlSZXNwb25zZTogYW55ID0gcmVzcG9uc2UgYXMgYW55O1xuXG4gICAgLy8gU3Vwb3J0ZSBhIGNodW5rZWQgcmVzcG9uc2UgKGV4OiB7IGlkPywgY2h1bmssIHNlcSwgbGFzdCB9KVxuICAgIGlmIChhbnlSZXNwb25zZS5jaHVuaykge1xuICAgICAgY29uc3QgcmVzb2x2ZWRJZCA9IGFueVJlc3BvbnNlLmlkIHx8IHRoaXMucmVxdWVzdE9yZGVyLmF0KC0xKTtcbiAgICAgIGlmICghcmVzb2x2ZWRJZCkge1xuICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuaW52YWxpZF9yZXNwb25zZScpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlQ2h1bmtSZXNwb25zZShyZXNvbHZlZElkLCBhbnlSZXNwb25zZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFyZXNwb25zZS5pZCkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlc3BvbnNlX21pc3NpbmdfaWQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLmdldChyZXNwb25zZS5pZCk7XG5cbiAgICB0aGlzLmhhbmRsZVN1YmplY3Qoc3ViamVjdCwgcmVzcG9uc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVTdWJqZWN0KHN1YmplY3Q6IFN1YmplY3Q8YW55PiB8IHVuZGVmaW5lZCwgcmVzcG9uc2U6IFh0QnJpZGdlUmVzcG9uc2UpIHtcbiAgICBpZiAoc3ViamVjdCkge1xuICAgICAgLy8gQ2xlYXIgdGltZW91dCBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5yZXF1ZXN0VGltZW91dHMuZ2V0KHJlc3BvbnNlLmlkKTtcbiAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dHMuZGVsZXRlKHJlc3BvbnNlLmlkKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVzcG9uc2UgbWF0Y2hlZCB0byBjb3JyZWN0IHJlcXVlc3QgSUQgLSBzYWZlIHRvIHByb2Nlc3NcbiAgICAgIGlmIChyZXNwb25zZS5zdWNjZXNzKSB7XG4gICAgICAgIHN1YmplY3QubmV4dChyZXNwb25zZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKHJlc3BvbnNlLmVycm9yID8/ICdTZXJ2ZXIgZXJyb3InKSk7XG4gICAgICB9XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZGVsZXRlKHJlc3BvbnNlLmlkKTtcbiAgICAgIHRoaXMucmVxdWVzdE9yZGVyID0gdGhpcy5yZXF1ZXN0T3JkZXIuZmlsdGVyKGlkID0+IGlkICE9PSByZXNwb25zZS5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG1hdGNoaW5nIHJlcXVlc3QgSUQgLSBjb3VsZCBiZSBsYXRlL2R1cGxpY2F0ZSByZXNwb25zZVxuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlc3BvbnNlX3Vua25vd25faWQnLCB7IGlkOiByZXNwb25zZS5pZCB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNodW5rZWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgY2FsbGJhY2tcbiAgICogQmFja2VuZCBjaGFtYSByZXNvbHZlRnVuY3Rpb24gbcO6bHRpcGxhcyB2ZXplcyBjb20gY2h1bmtzXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZUNodW5rUmVzcG9uc2UocmVxdWVzdElkOiBzdHJpbmcsIGNodW5rUmVzcG9uc2U6IHsgY2h1bms6IHN0cmluZzsgc2VxOiBudW1iZXI7IGxhc3Q6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKCFzdWJqZWN0KSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2h1bmtfdW5rbm93bl9pZCcsIHsgaWQ6IHJlcXVlc3RJZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJbmljaWFsaXphciBidWZmZXIgc2UgbsOjbyBleGlzdGlyXG4gICAgbGV0IGJ1ZmZlciA9IHRoaXMuY2h1bmtCdWZmZXJzLmdldChyZXF1ZXN0SWQpO1xuICAgIGlmICghYnVmZmVyKSB7XG4gICAgICBidWZmZXIgPSB7IGNodW5rczogbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKSB9O1xuICAgICAgdGhpcy5jaHVua0J1ZmZlcnMuc2V0KHJlcXVlc3RJZCwgYnVmZmVyKTtcbiAgICB9XG5cbiAgICAvLyBBcm1hemVuYXIgY2h1bmtcbiAgICBidWZmZXIuY2h1bmtzLnNldChjaHVua1Jlc3BvbnNlLnNlcSwgY2h1bmtSZXNwb25zZS5jaHVuayk7XG5cbiAgICBpZiAoYnVmZmVyLmNodW5rcy5zaXplID4gdGhpcy5NQVhfQ0hVTktTKSB7XG4gICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcignTGltaXRlIGRlIGNodW5rcyBleGNlZGlkbycpKTtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jaHVua19saW1pdF9leGNlZWRlZCcsIHsgaWQ6IHJlcXVlc3RJZCB9KTtcbiAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBNYXJjYXIgc2VxdcOqbmNpYSBmaW5hbCBzZSBmb3IgbyDDumx0aW1vIGNodW5rXG4gICAgaWYgKGNodW5rUmVzcG9uc2UubGFzdCkge1xuICAgICAgYnVmZmVyLmxhc3RTZXEgPSBjaHVua1Jlc3BvbnNlLnNlcTtcbiAgICB9XG5cbiAgICAvLyBWZXJpZmljYXIgc2UgdG9kb3Mgb3MgY2h1bmtzIGZvcmFtIHJlY2ViaWRvc1xuICAgIGlmIChidWZmZXIubGFzdFNlcSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBEZXRlY3RhciBzZSDDqSAwLWJhc2VkIG91IDEtYmFzZWRcbiAgICAgIGNvbnN0IGlzWmVyb0Jhc2VkID0gYnVmZmVyLmNodW5rcy5oYXMoMCk7XG4gICAgICBjb25zdCBleHBlY3RlZFNpemUgPSBpc1plcm9CYXNlZCA/IGJ1ZmZlci5sYXN0U2VxICsgMSA6IGJ1ZmZlci5sYXN0U2VxO1xuXG4gICAgICAvLyBBZ3VhcmRhciB0b2RvcyBvcyBjaHVua3NcbiAgICAgIGlmIChidWZmZXIuY2h1bmtzLnNpemUgIT09IGV4cGVjdGVkU2l6ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFRvZG9zIG9zIGNodW5rcyByZWNlYmlkb3MgLSBtb250YXIgcmVzcG9zdGEgZmluYWxcbiAgICAgIGNvbnN0IGNodW5rc09yZGVyZWQgPSBBcnJheS5mcm9tKGJ1ZmZlci5jaHVua3MuZW50cmllcygpKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYVswXSAtIGJbMF0pXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeVsxXSlcbiAgICAgICAgLmpvaW4oJycpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGNodW5rc09yZGVyZWQpO1xuICAgICAgICBzdWJqZWN0Lm5leHQocGFyc2VkKTtcbiAgICAgICAgc3ViamVjdC5jb21wbGV0ZSgpO1xuICAgICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQ6IHJlcXVlc3RJZCB9KTtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBjaHVua2VkIHJlc3BvbnNlOiAke2Vycm9yfWApKTtcbiAgICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbiB1cCByZXF1ZXN0IHRyYWNraW5nXG4gICAqL1xuICBwcml2YXRlIGNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3RzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgIHRoaXMucmVxdWVzdE9yZGVyID0gdGhpcy5yZXF1ZXN0T3JkZXIuZmlsdGVyKGlkID0+IGlkICE9PSByZXF1ZXN0SWQpO1xuICAgIHRoaXMuY2h1bmtCdWZmZXJzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuXG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMucmVxdWVzdFRpbWVvdXRzLmdldChyZXF1ZXN0SWQpO1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5kZWxldGUocmVxdWVzdElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbm5lY3Rpb24gc3RhdHVzIGFzIG9ic2VydmFibGVcbiAgICovXG4gIGdldENvbm5lY3Rpb25TdGF0dXMoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXR1cy5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBDRUYgaXMgY3VycmVudGx5IGF2YWlsYWJsZVxuICAgKi9cbiAgaXNDZWZBdmFpbGFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvblN0YXR1cy52YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhbnVwIHBlbmRpbmcgcmVxdWVzdHMgKGNhbGwgb24gY29tcG9uZW50IGRlc3Ryb3kpXG4gICAqL1xuICBjbGVhbnVwKCk6IHZvaWQge1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5mb3JFYWNoKChzdWJqZWN0KSA9PiB7XG4gICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcignU2VydmljZSBjbGVhbnVwIC0gcmVxdWVzdCBjYW5jZWxsZWQnKSk7XG4gICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3RzLmNsZWFyKCk7XG5cbiAgICAvLyBDbGVhciBhbGwgdGltZW91dHNcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5mb3JFYWNoKHRpbWVvdXQgPT4gY2xlYXJUaW1lb3V0KHRpbWVvdXQpKTtcbiAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5jbGVhcigpO1xuXG4gICAgLy8gQ2xlYXIgcGVuZGluZyByZXRyaWVzXG4gICAgdGhpcy5yZXRyeVRpbWVvdXRzLmZvckVhY2godGltZW91dCA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuICAgIHRoaXMucmV0cnlUaW1lb3V0cy5jbGVhcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkZWJ1ZyBpbmZvIGFib3V0IHBlbmRpbmcgcmVxdWVzdHNcbiAgICovXG4gIGdldERlYnVnSW5mbygpOiB7IHBlbmRpbmdSZXF1ZXN0czogbnVtYmVyOyBhY3RpdmVUaW1lb3V0czogbnVtYmVyIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nUmVxdWVzdHM6IHRoaXMucmVzcG9uc2VTdWJqZWN0cy5zaXplLFxuICAgICAgYWN0aXZlVGltZW91dHM6IHRoaXMucmVxdWVzdFRpbWVvdXRzLnNpemVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXkgYSBsb2NhbGl6ZWQgZXJyb3IgdG9hc3QgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBzaG93RXJyb3Ioa2V5OiBzdHJpbmcsIHBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4pOiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XG4gICAgICBzZXZlcml0eTogJ2Vycm9yJyxcbiAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZSgnaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3Iuc3VtbWFyeScpLFxuICAgICAgZGV0YWlsOiB0aGlzLnRyYW5zbGF0aW9uU2VydmljZS50cmFuc2xhdGUoa2V5LCBwYXJhbXMpXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
492
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHQtYnJpZGdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWIvc3JjL2xpYi9zZXJ2aWNlcy94dC1icmlkZ2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7O0FBMkUzRCxNQUFNLE9BQU8sZUFBZTtJQW1CMUI7UUFqQmlCLHFCQUFnQixHQUFHLElBQUksR0FBRyxFQUF3QixDQUFDO1FBQ25ELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN6QyxxQkFBZ0IsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNoRSxpQkFBWSxHQUFhLEVBQUUsQ0FBQztRQUNuQixpQkFBWSxHQUFHLElBQUksR0FBRyxFQUE2RCxDQUFDO1FBQ3BGLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLHVCQUFrQixHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hELDRDQUF1QyxHQUFHLGlCQUFpQixDQUFDO1FBQzVELDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyx1QkFBa0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsZUFBZTtRQUMvQyxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLHdCQUFtQixHQUFHLENBQUMsQ0FBQztRQUN4Qix3QkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDNUIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFDeEIsZ0RBQTJDLEdBQUcsa0VBQWtFLENBQUM7UUFDakgsa0JBQWEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO1FBR3RELElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLHFEQUFxRDtRQUNyRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBQ0Q7OztPQUdHO0lBQ0ssdUJBQXVCO1FBQzdCLGlEQUFpRDtRQUNqRCxJQUFJLENBQUUsUUFBZ0IsQ0FBQyxHQUFHLEVBQUU7WUFDekIsUUFBZ0IsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDO1NBQzVCO1FBQ0QsSUFBSSxDQUFFLFFBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtZQUM1QixRQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1NBQy9CO1FBRUQsOERBQThEO1FBQzlELE1BQU0sZUFBZSxHQUFJLFFBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUM7UUFDakUsTUFBTSxjQUFjLEdBQUksUUFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGNBQWMsQ0FBQztRQUUvRCwrQkFBK0I7UUFDOUIsUUFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGVBQWUsR0FBRyxDQUFDLEVBQVUsRUFBRSxJQUFTLEVBQUUsRUFBRTtZQUNuRSw2Q0FBNkM7WUFDN0MsSUFBSSxlQUFlLElBQUksT0FBTyxlQUFlLEtBQUssVUFBVSxFQUFFO2dCQUM1RCxJQUFJO29CQUNGLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDNUM7Z0JBQUMsTUFBTTtvQkFDTixJQUFJLENBQUMsU0FBUyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7aUJBQ3BFO2FBQ0Y7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0MsQ0FBQyxDQUFDO1FBRUYsOEJBQThCO1FBQzdCLFFBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLEdBQUcsQ0FBQyxFQUFVLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDbkUsNkNBQTZDO1lBQzdDLElBQUksY0FBYyxJQUFJLE9BQU8sY0FBYyxLQUFLLFVBQVUsRUFBRTtnQkFDMUQsSUFBSTtvQkFDRixjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7aUJBQzVDO2dCQUFDLE1BQU07b0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO2lCQUNwRTthQUNGO1lBRUQsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUVGLGtEQUFrRDtRQUNqRCxVQUFrQixDQUFDLGVBQWUsR0FBSSxRQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDO1FBQzlFLFVBQWtCLENBQUMsY0FBYyxHQUFJLFFBQWdCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUM7SUFDL0UsQ0FBQztJQUVEOztPQUVHO0lBQ0ssMEJBQTBCO1FBQ2hDLDRFQUE0RTtRQUMzRSxVQUFrQixDQUFDLGlCQUFpQixHQUFHLENBQUMsWUFBb0IsRUFBRSxFQUFFO1lBQy9ELElBQUk7Z0JBQ0YsTUFBTSxRQUFRLEdBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMvQjtZQUFDLE1BQU07Z0JBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO2FBQzFFO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQixDQUFDLEVBQVUsRUFBRSxJQUFTLEVBQUUsT0FBZ0I7UUFDbEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU5QyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLE9BQU87U0FDUjtRQUVELElBQUk7WUFDRixJQUFJLFVBQVUsR0FBRyxJQUFJLENBQUM7WUFFdEIsMkJBQTJCO1lBQzNCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUM1QixJQUFJO29CQUNGLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUMvQjtnQkFBQyxNQUFNO29CQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDekUsVUFBVSxHQUFHLElBQUksQ0FBQztpQkFDbkI7YUFDRjtZQUVELE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsQ0FBQztZQUN6RSx1REFBdUQ7WUFDdkQsSUFBSSxtQkFBbUIsSUFBSSxVQUFVLENBQUMsS0FBSyxJQUFJLFVBQVUsQ0FBQyxHQUFHLEtBQUssU0FBUyxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUM1RyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUN6QyxPQUFPO2FBQ1I7WUFFRCxnQ0FBZ0M7WUFDaEMsSUFBSSxPQUFPLEVBQUU7Z0JBQ1gsTUFBTSxRQUFRLEdBQUcsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDekUsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2FBQ3BDO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDMUI7WUFFRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3pFLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLG9CQUFvQjtRQUMxQixNQUFNLFdBQVcsR0FBRyxPQUFRLFVBQWtCLENBQUMsZUFBZSxLQUFLLFVBQVUsQ0FBQztRQUM5RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXhDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1NBQ3BFO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsd0JBQXdCO1FBQ3BFLE9BQU8sT0FBTyxTQUFTLElBQUksTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILFdBQVcsQ0FBVSxNQUFjLEVBQUUsTUFBYyxFQUFFLE9BQWEsRUFBRSxZQUEyQjtRQUM3RixJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTFDLE1BQU0sY0FBYyxHQUF5QjtZQUMzQyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsdUNBQXVDO1lBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyx3QkFBd0I7WUFDdEUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLElBQUksSUFBSSxDQUFDLGtCQUFrQjtZQUM3RCxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsSUFBSSxJQUFJLENBQUMsbUJBQW1CO1lBQ2hFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxtQkFBbUI7WUFDaEUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWU7U0FDckQsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRTFDLE9BQU8sSUFBSSxVQUFVLENBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUN0QyxNQUFNLEtBQUssR0FBaUI7Z0JBQzFCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZCLENBQUM7WUFFRixNQUFNLE9BQU8sR0FBbUIsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsQ0FBQztZQUU1RSxJQUFJLENBQUMsVUFBVSxDQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUU1RCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRDs7T0FFRztJQUNLLFVBQVUsQ0FDaEIsYUFBcUIsRUFDckIsS0FBbUIsRUFDbkIsUUFBZ0IsRUFDaEIsVUFBbUYsRUFDbkYsT0FBdUI7UUFFdkIsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ2pCLE9BQU87U0FDUjtRQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzNDLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFFbkMsS0FBSyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUN6QyxTQUFTLEVBQ1QsT0FBTyxDQUFDLE1BQU0sRUFDZCxPQUFPLENBQUMsT0FBTyxFQUNmLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUMzQixPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQ3hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUN0QixDQUFDLFNBQVMsQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFJLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDO1lBQ3hFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUN2QyxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FDM0Q7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sb0JBQW9CLENBQzFCLElBQU8sRUFDUCxVQUEwRCxFQUMxRCxRQUFnQjtRQUVoQixVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU8sa0JBQWtCLENBQ3hCLEtBQVUsRUFDVixhQUFxQixFQUNyQixLQUFtQixFQUNuQixRQUFnQixFQUNoQixVQUFtRixFQUNuRixPQUF1QjtRQUV2QixJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7WUFDakIsT0FBTztTQUNSO1FBRUQsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUU7WUFDN0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUksYUFBYSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM5RSxDQUFDLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDL0MsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxRUFBcUUsRUFBRTtZQUNwRixRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQztTQUN4QyxDQUFDLENBQUM7UUFDSCxVQUFVLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxLQUFtQixFQUFFLFFBQWdCO1FBQzdELEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBRXJCLDBCQUEwQjtRQUMxQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0RCxJQUFJLFlBQVksRUFBRTtZQUNoQixZQUFZLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDckM7UUFFRCxrQ0FBa0M7UUFDbEMsSUFBSSxLQUFLLENBQUMsZUFBZSxFQUFFO1lBQ3pCLEtBQUssQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDckM7UUFFRCx5Q0FBeUM7UUFDekMsSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNIOzs7Ozs7Ozs7T0FTRztJQUNLLGNBQWMsQ0FDcEIsU0FBaUIsRUFDakIsTUFBYyxFQUNkLE9BQVksRUFDWixZQUFvQixFQUNwQixPQUFlLEVBQ2YsU0FBaUIsRUFDakIsTUFBZTtRQUVmLDJDQUEyQztRQUMzQyxNQUFNLGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWxDLElBQUksTUFBTSxFQUFFO1lBQ1YsK0dBQStHO1lBQy9HLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBRW5HLGtEQUFrRDtZQUNsRCxPQUFPLElBQUksVUFBVSxDQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7Z0JBQ3RDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsNkNBQTZDO1FBQzdDLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDbkMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNyRCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLFdBQVcsU0FBUyxvQkFBb0IsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUM5RSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBRWxELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVuRyx3REFBd0Q7UUFDeEQsT0FBTyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUN4QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQ1MsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssdUJBQXVCLENBQzdCLFNBQWlCLEVBQ2pCLE1BQWMsRUFDZCxPQUFZLEVBQ1osWUFBb0IsRUFDcEIsU0FBaUIsRUFDakIsZUFBNkI7UUFDN0IsSUFBSyxVQUFrQixDQUFDLFlBQVksRUFBRTtZQUNwQyxJQUFJO2dCQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQzdCLElBQUksRUFBRSxTQUFTO29CQUNmLFlBQVksRUFBRTt3QkFDWixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUU7d0JBQ3ZCLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtxQkFDOUQ7b0JBQ0QsWUFBWTtvQkFDWixTQUFTO2lCQUNWLENBQUMsQ0FBQztnQkFFRixVQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsTUFBTSxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ3REO1lBQUMsT0FBTyxLQUFLLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO2dCQUN2RSxlQUFlLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ2hDO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsc0RBQXNELENBQUMsQ0FBQztZQUN2RSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBQzNELGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNLLGNBQWMsQ0FBQyxRQUEwQjtRQUMvQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO1lBQ3BFLE9BQU87U0FDUjtRQUVELE1BQU0sV0FBVyxHQUFRLFFBQWUsQ0FBQztRQUV6Qyw2REFBNkQ7UUFDN0QsSUFBSSxXQUFXLENBQUMsS0FBSyxFQUFFO1lBQ3JCLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsbURBQW1ELENBQUMsQ0FBQztnQkFDcEUsT0FBTzthQUNSO1lBRUQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUNsRCxPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7WUFDdkUsT0FBTztTQUNSO1FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxPQUFpQyxFQUFFLFFBQTBCO1FBQ2pGLElBQUksT0FBTyxFQUFFO1lBQ1gsaUNBQWlDO1lBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN0RCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUMxQztZQUVELDJEQUEyRDtZQUMzRCxJQUFJLFFBQVEsQ0FBQyxPQUFPLEVBQUU7Z0JBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDO2FBQzVEO1lBQ0QsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3hFO2FBQU07WUFDTCw0REFBNEQ7WUFDNUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzREFBc0QsRUFBRSxFQUFFLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM3RjtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxtQkFBbUIsQ0FBQyxTQUFpQixFQUFFLGFBQTREO1FBQ3pHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsbURBQW1ELEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN2RixPQUFPO1NBQ1I7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLE1BQU0sR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBa0IsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUMxQztRQUVELGtCQUFrQjtRQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7WUFDdEQsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1REFBdUQsRUFBRSxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO1lBQzNGLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBRUQsK0NBQStDO1FBQy9DLElBQUksYUFBYSxDQUFDLElBQUksRUFBRTtZQUN0QixNQUFNLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUM7U0FDcEM7UUFFRCwrQ0FBK0M7UUFDL0MsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxtQ0FBbUM7WUFDbkMsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekMsTUFBTSxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztZQUV2RSwyQkFBMkI7WUFDM0IsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxZQUFZLEVBQUU7Z0JBQ3ZDLE9BQU87YUFDUjtZQUVELG9EQUFvRDtZQUNwRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ3RELElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzNCLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFWixJQUFJO2dCQUNGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNoQztZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7Z0JBQ3BGLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMscUNBQXFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNoQztTQUNGO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLFNBQWlCO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUVwQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNwRCxJQUFJLE9BQU8sRUFBRTtZQUNYLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDeEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLENBQUM7WUFDaEUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTlCLHFCQUFxQjtRQUNyQixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFFN0Isd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZO1FBQ1YsT0FBTztZQUNMLGVBQWUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSTtZQUMzQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSyxTQUFTLENBQUMsR0FBVyxFQUFFLE1BQXdDO1FBQ3JFLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDO1lBQ3RCLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLE9BQU8sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLDBDQUEwQyxDQUFDO1lBQ3RGLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7U0FDdkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0Fwa0JVLGVBQWU7bUhBQWYsZUFBZSxjQUZkLE1BQU07OzRGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0LCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJy4vdHJhbnNsYXRpb24uc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgWHRCcmlkZ2VSZXF1ZXN0IHtcbiAgaWQ6IHN0cmluZztcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHBheWxvYWQ/OiBhbnk7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFh0QnJpZGdlUmVzcG9uc2Uge1xuICBpZDogc3RyaW5nO1xuICBzdWNjZXNzOiBib29sZWFuO1xuICBkYXRhPzogYW55O1xuICBlcnJvcj86IHN0cmluZztcbiAgdGltZXN0YW1wOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlQ29uZmlnIHtcbiAgLy8gTm9tZSBkYSBmdW7Dp8OjbyBubyBCYWNrLUVuZCAoZGVmYXVsdDogXCJYdEJyaWRnZVJlcXVlc3RcIilcbiAgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuXG4gIC8vIFRpbWVvdXQgcGFyYSByZXF1aXNpw6fDtWVzIGVtIG1zIChkZWZhdWx0OiAzMDAwMClcbiAgcmVxdWVzdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLy8gVGFtYW5obyBkZSBjaHVuayBwYXJhIGRhZG9zIGdyYW5kZXMgZW0gYnl0ZXMgKGRlZmF1bHQ6IDY0S0IpXG4gIGNodW5rU2l6ZT86IG51bWJlcjtcblxuICAvLyBOw7ptZXJvIG3DoXhpbW8gZGUgdGVudGF0aXZhcyBlbSBjYXNvIGRlIGZhbGhhIChkZWZhdWx0OiAzKVxuICBtYXhSZXRyaWVzPzogbnVtYmVyO1xuXG4gIC8vIERlbGF5IGVudHJlIHRlbnRhdGl2YXMgZW0gbXMgKGRlZmF1bHQ6IDEwMDAwKVxuICByZXRyeURlbGF5PzogbnVtYmVyO1xuXG4gIC8vIFNlIHRydWUsIG7Do28gYWd1YXJkYSByZXNwb3N0YSBkbyBCYWNrLUVuZCAoZmlyZSBhbmQgZm9yZ2V0KVxuICBub1dhaXQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRCcmlkZ2VDb25maWcge1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgdGltZW91dDogbnVtYmVyO1xuICBjaHVua1NpemU6IG51bWJlcjtcbiAgbWF4UmV0cmllczogbnVtYmVyO1xuICByZXRyeURlbGF5OiBudW1iZXI7XG4gIG5vV2FpdDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEF0dGVtcHRTdGF0ZSB7XG4gIGFib3J0ZWQ6IGJvb2xlYW47XG4gIGN1cnJlbnRJbm5lclN1YjogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9IHwgbnVsbDtcbiAgY3VycmVudFJlcXVlc3RJZDogc3RyaW5nIHwgbnVsbDtcbn1cblxuaW50ZXJmYWNlIEF0dGVtcHRDb250ZXh0IHtcbiAgYWN0aW9uOiBzdHJpbmc7XG4gIHBheWxvYWQ6IGFueTtcbiAgY29uZmlnOiBSZXNvbHZlZEJyaWRnZUNvbmZpZztcbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAvLyBDRUYgaW5qZWN0ZWQgZnVuY3Rpb25zXG4gICAgY2VmU2VuZFRvU2VydmVyPzogKHJlcXVlc3REYXRhOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgLy8gQW5ndWxhciBjYWxsYmFjayBmdW5jdGlvbnNcbiAgICBoYW5kbGVDZWZSZXNwb25zZT86IChyZXNwb25zZURhdGE6IHN0cmluZykgPT4gdm9pZDtcbiAgICAvLyBOYXRpdmUgaW52b2tlIGZ1bmN0aW9uIGZvciBYdCBlbXVsYXRvclxuICAgIGludm9rZU5hdGl2ZT86ICh0eXBlOiBudW1iZXIsIHBheWxvYWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICAvLyBBcHAgY29tcG9uZW50IGNhbGxiYWNrcyAtIGNhbGxlZCBieSBzZXJ2ZXIgd2l0aCByZXF1ZXN0IElEXG4gICAgcmVzb2x2ZUZ1bmN0aW9uPzogKGlkOiBzdHJpbmcsIGRhdGE6IGFueSkgPT4gdm9pZDtcbiAgICByZWplY3RGdW5jdGlvbj86IChpZDogc3RyaW5nLCBlcnJvcjogYW55KSA9PiB2b2lkO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFh0QnJpZGdlU2VydmljZSB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSByZXNwb25zZVN1YmplY3RzID0gbmV3IE1hcDxzdHJpbmcsIFN1YmplY3Q8YW55Pj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0VGltZW91dHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbm5lY3Rpb25TdGF0dXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZXF1ZXN0T3JkZXI6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgcmVhZG9ubHkgY2h1bmtCdWZmZXJzID0gbmV3IE1hcDxzdHJpbmcsIHsgY2h1bmtzOiBNYXA8bnVtYmVyLCBzdHJpbmc+OyBsYXN0U2VxPzogbnVtYmVyIH0+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2UgPSBpbmplY3QoTWVzc2FnZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0aW9uU2VydmljZSA9IGluamVjdChUcmFuc2xhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfWFRfQlJJREdFX1JFUVVFU1RfRlVOQ1RJT05fTkFNRSA9IFwiWHRCcmlkZ2VSZXF1ZXN0XCI7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9SRVFVRVNUX1RJTUVfT1VUID0gMzAwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9DSFVOS19TSVpFID0gNjQgKiAxMDI0OyAvLyBEZWZhdWx0IDY0S0JcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfQ0hVTktTID0gMTAwMDtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX01BWF9SRVRSSUVTID0gMztcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1JFVFJZX0RFTEFZID0gMTAwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9OT19XQUlUID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCA9ICdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5yZXNwb25zZV9wcm9jZXNzX2ZhaWxlZF93aXRoX2lkJztcbiAgcHJpdmF0ZSByZWFkb25seSByZXRyeVRpbWVvdXRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmluaXRpYWxpemVDZWZDb21tdW5pY2F0aW9uKCk7XG4gICAgdGhpcy5jaGVja0NlZkF2YWlsYWJpbGl0eSgpO1xuICAgIC8vIFJlZ2lzdHJhciBjYWxsYmFja3MgZ2xvYmFpcyBwYXJhIG8gc2Vydmlkb3IgY2hhbWFyXG4gICAgdGhpcy5yZWdpc3Rlckdsb2JhbENhbGxiYWNrcygpO1xuICB9XG4gIC8qKlxuICAgKiBSZWdpc3RlciBnbG9iYWwgY2FsbGJhY2tzIHRoYXQgdGhlIHNlcnZlciB3aWxsIGludm9rZVxuICAgKiBTZXJ2aWRvciBjaGFtYSBkb2N1bWVudC5hcHAuZzUucmVzb2x2ZUZ1bmN0aW9uKGlkLCBkYXRhKSBvdSBkb2N1bWVudC5hcHAuZzUucmVqZWN0RnVuY3Rpb24oaWQsIGVycm9yKVxuICAgKi9cbiAgcHJpdmF0ZSByZWdpc3Rlckdsb2JhbENhbGxiYWNrcygpOiB2b2lkIHtcbiAgICAvLyBDcmlhciBlc3RydXR1cmEgZG9jdW1lbnQuYXBwLmc1IHNlIG7Do28gZXhpc3RpclxuICAgIGlmICghKGRvY3VtZW50IGFzIGFueSkuYXBwKSB7XG4gICAgICAoZG9jdW1lbnQgYXMgYW55KS5hcHAgPSB7fTtcbiAgICB9XG4gICAgaWYgKCEoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUpIHtcbiAgICAgIChkb2N1bWVudCBhcyBhbnkpLmFwcC5nNSA9IHt9O1xuICAgIH1cblxuICAgIC8vIFNhbHZhciByZWZlcsOqbmNpYXMgb3JpZ2luYWlzIHNlIGV4aXN0aXJlbSAoZG8gQXBwQ29tcG9uZW50KVxuICAgIGNvbnN0IG9yaWdpbmFsUmVzb2x2ZSA9IChkb2N1bWVudCBhcyBhbnkpLmFwcC5nNS5yZXNvbHZlRnVuY3Rpb247XG4gICAgY29uc3Qgb3JpZ2luYWxSZWplY3QgPSAoZG9jdW1lbnQgYXMgYW55KS5hcHAuZzUucmVqZWN0RnVuY3Rpb247XG5cbiAgICAvLyBEZWZpbmlyIG5vdmEgcmVzb2x2ZUZ1bmN0aW9uXG4gICAgKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlc29sdmVGdW5jdGlvbiA9IChpZDogc3RyaW5nLCBkYXRhOiBhbnkpID0+IHtcbiAgICAgIC8vIENoYW1hciBvcmlnaW5hbCBkbyBBcHBDb21wb25lbnQgc2UgZXhpc3RpclxuICAgICAgaWYgKG9yaWdpbmFsUmVzb2x2ZSAmJiB0eXBlb2Ygb3JpZ2luYWxSZXNvbHZlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3JpZ2luYWxSZXNvbHZlLmNhbGwoZ2xvYmFsVGhpcywgaWQsIGRhdGEpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY2FsbGJhY2tfZmFpbGVkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUHJvY2Vzc2FyIHZpYSBYdEJyaWRnZVNlcnZpY2VcbiAgICAgIHRoaXMuaGFuZGxlU2VydmVyQ2FsbGJhY2soaWQsIGRhdGEsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLy8gRGVmaW5pciBub3ZhIHJlamVjdEZ1bmN0aW9uXG4gICAgKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlamVjdEZ1bmN0aW9uID0gKGlkOiBzdHJpbmcsIGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIENoYW1hciBvcmlnaW5hbCBkbyBBcHBDb21wb25lbnQgc2UgZXhpc3RpclxuICAgICAgaWYgKG9yaWdpbmFsUmVqZWN0ICYmIHR5cGVvZiBvcmlnaW5hbFJlamVjdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG9yaWdpbmFsUmVqZWN0LmNhbGwoZ2xvYmFsVGhpcywgaWQsIGVycm9yKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmNhbGxiYWNrX2ZhaWxlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFByb2Nlc3NhciB2aWEgWHRCcmlkZ2VTZXJ2aWNlXG4gICAgICB0aGlzLmhhbmRsZVNlcnZlckNhbGxiYWNrKGlkLCBlcnJvciwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIFRhbWLDqW0gcmVnaXN0cmFyIGVtIHdpbmRvdyBwYXJhIGNvbXBhdGliaWxpZGFkZVxuICAgIChnbG9iYWxUaGlzIGFzIGFueSkucmVzb2x2ZUZ1bmN0aW9uID0gKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlc29sdmVGdW5jdGlvbjtcbiAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLnJlamVjdEZ1bmN0aW9uID0gKGRvY3VtZW50IGFzIGFueSkuYXBwLmc1LnJlamVjdEZ1bmN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgQ0VGIGNvbW11bmljYXRpb24gYnkgc2V0dGluZyB1cCB0aGUgZ2xvYmFsIGNhbGxiYWNrXG4gICAqL1xuICBwcml2YXRlIGluaXRpYWxpemVDZWZDb21tdW5pY2F0aW9uKCk6IHZvaWQge1xuICAgIC8vIFNldCB1cCBnbG9iYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBDRUYgd2lsbCBjYWxsIChmb3IgZGlyZWN0IHJlc3BvbnNlcylcbiAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLmhhbmRsZUNlZlJlc3BvbnNlID0gKHJlc3BvbnNlRGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZTogYW55ID0gSlNPTi5wYXJzZShyZXNwb25zZURhdGEpO1xuICAgICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVzcG9uc2VfcGFyc2VfZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2FsbGJhY2sgZnJvbSBzZXJ2ZXIgdmlhIHJlc29sdmVGdW5jdGlvbi9yZWplY3RGdW5jdGlvblxuICAgKiBQcm9jZXNzYSB0YW50byByZXNwb3N0YXMgc2ltcGxlcyBxdWFudG8gY2h1bmtlZFxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVTZXJ2ZXJDYWxsYmFjayhpZDogc3RyaW5nLCBkYXRhOiBhbnksIGlzRXJyb3I6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLmdldChpZCk7XG5cbiAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgbGV0IHBhcnNlZERhdGEgPSBkYXRhO1xuXG4gICAgICAvLyBQYXJzZSBKU09OIHNlIGZvciBzdHJpbmdcbiAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBwYXJzZWREYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhpcy5zaG93RXJyb3IodGhpcy5UT0FTVF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTX0ZBSUxFRF9XSVRIX0lELCB7IGlkIH0pO1xuICAgICAgICAgIHBhcnNlZERhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc1BhcnNlZERhdGFPYmplY3QgPSBwYXJzZWREYXRhICYmIHR5cGVvZiBwYXJzZWREYXRhID09PSAnb2JqZWN0JztcbiAgICAgIC8vIFZlcmlmaWNhciBzZSDDqSByZXNwb3N0YSBjaHVua2VkIHsgY2h1bmssIHNlcSwgbGFzdCB9XG4gICAgICBpZiAoaGFzUGFyc2VkRGF0YU9iamVjdCAmJiBwYXJzZWREYXRhLmNodW5rICYmIHBhcnNlZERhdGEuc2VxICE9PSB1bmRlZmluZWQgJiYgcGFyc2VkRGF0YS5sYXN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVDaHVua1Jlc3BvbnNlKGlkLCBwYXJzZWREYXRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNwb3N0YSBub3JtYWwgKG7Do28tY2h1bmtlZClcbiAgICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICAgIGNvbnN0IGVycm9yTXNnID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gZGF0YSA6IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQgfSk7XG4gICAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKGVycm9yTXNnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJqZWN0Lm5leHQocGFyc2VkRGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QoaWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcih0aGlzLlRPQVNUX0VSUk9SX1JFU1BPTlNFX1BST0NFU1NfRkFJTEVEX1dJVEhfSUQsIHsgaWQgfSk7XG4gICAgICBzdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QoaWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBDRUYgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tDZWZBdmFpbGFiaWxpdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaXNBdmFpbGFibGUgPSB0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5jZWZTZW5kVG9TZXJ2ZXIgPT09ICdmdW5jdGlvbic7XG4gICAgdGhpcy5jb25uZWN0aW9uU3RhdHVzLm5leHQoaXNBdmFpbGFibGUpO1xuXG4gICAgaWYgKCFpc0F2YWlsYWJsZSkge1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmNlZl91bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIHJlcXVlc3RzIC0gZ3VhcmFudGVlZCB1bmlxdWUgZXZlbiB3aXRoIGNvbmN1cnJlbnQgY2FsbHNcbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVSZXF1ZXN0SWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJhbmRvbSA9IGNyeXB0by5yYW5kb21VVUlEKCkuc3BsaXQoJy0nKS5qb2luKCcnKTtcbiAgICBjb25zdCBjb3VudGVyID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLnNpemU7IC8vIEFkZGl0aW9uYWwgdW5pcXVlbmVzc1xuICAgIHJldHVybiBgcmVxXyR7dGltZXN0YW1wfV8ke3JhbmRvbX1fJHtjb3VudGVyfWA7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCByZXF1ZXN0IHRvIHNlcnZlciB2aWEgQ0VGIC0gVGhyZWFkLXNhZmUgd2l0aCB0aW1lb3V0IHByb3RlY3Rpb24gYW5kIHJldHJ5IHJlc2lsaWVuY2VcbiAgICpcbiAgICogQHBhcmFtIGFjdGlvbiBOb21lIGRhIGHDp8Ojby9BUEkgYSBzZXIgaW52b2NhZGEgbm8gQmFjay1FbmRcbiAgICogQHBhcmFtIGxvY2FsZSBMb2NhbGUgb2JyaWdhdMOzcmlvIHBhcmEgaW50ZXJuYWNpb25hbGl6YXIgYXMgbWVuc2FnZW5zIGRlIFRvYXN0IChleDogJ3B0LUJSJywgJ2VuLVVTJywgJ2VzLUVTJykuXG4gICAqICAgICAgICAgICAgICAgQXR1YWxpemEgbyBsb2NhbGUgYXRpdm8gZG8gVHJhbnNsYXRpb25TZXJ2aWNlIGFudGVzIGRlIGVudmlhciBhIHJlcXVpc2nDp8Ojby5cbiAgICogQHBhcmFtIHBheWxvYWQgRGFkb3MgYSBzZXJlbSBlbnZpYWRvcyBhbyBCYWNrLUVuZFxuICAgKiBAcGFyYW0gYnJpZGdlQ29uZmlnIENvbmZpZ3VyYcOnw7VlcyBvcGNpb25haXMgZGEgcmVxdWlzacOnw6NvXG4gICAqL1xuICBzZW5kUmVxdWVzdDxUID0gYW55PihhY3Rpb246IHN0cmluZywgbG9jYWxlOiBzdHJpbmcsIHBheWxvYWQ/OiBhbnksIGJyaWRnZUNvbmZpZz86IEJyaWRnZUNvbmZpZyk6IE9ic2VydmFibGU8VD4ge1xuICAgIHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnNldExvY2FsZShsb2NhbGUpO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRDb25maWc6IFJlc29sdmVkQnJpZGdlQ29uZmlnID0ge1xuICAgICAgZnVuY3Rpb25OYW1lOiBicmlkZ2VDb25maWc/LmZ1bmN0aW9uTmFtZSA/PyB0aGlzLkRFRkFVTFRfWFRfQlJJREdFX1JFUVVFU1RfRlVOQ1RJT05fTkFNRSxcbiAgICAgIHRpbWVvdXQ6IGJyaWRnZUNvbmZpZz8ucmVxdWVzdFRpbWVvdXQgPz8gdGhpcy5ERUZBVUxUX1JFUVVFU1RfVElNRV9PVVQsXG4gICAgICBjaHVua1NpemU6IGJyaWRnZUNvbmZpZz8uY2h1bmtTaXplID8/IHRoaXMuREVGQVVMVF9DSFVOS19TSVpFLFxuICAgICAgbWF4UmV0cmllczogYnJpZGdlQ29uZmlnPy5tYXhSZXRyaWVzID8/IHRoaXMuREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIHJldHJ5RGVsYXk6IGJyaWRnZUNvbmZpZz8ucmV0cnlEZWxheSA/PyB0aGlzLkRFRkFVTFRfUkVUUllfREVMQVksXG4gICAgICBub1dhaXQ6IGJyaWRnZUNvbmZpZz8ubm9XYWl0ID8/IHRoaXMuREVGQVVMVF9OT19XQUlUXG4gICAgfTtcblxuICAgIGNvbnN0IHJldHJ5S2V5ID0gdGhpcy5nZW5lcmF0ZVJlcXVlc3RJZCgpO1xuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPFQ+KChzdWJzY3JpYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdGF0ZTogQXR0ZW1wdFN0YXRlID0ge1xuICAgICAgICBhYm9ydGVkOiBmYWxzZSxcbiAgICAgICAgY3VycmVudElubmVyU3ViOiBudWxsLFxuICAgICAgICBjdXJyZW50UmVxdWVzdElkOiBudWxsLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgY29udGV4dDogQXR0ZW1wdENvbnRleHQgPSB7IGFjdGlvbiwgcGF5bG9hZCwgY29uZmlnOiByZXNvbHZlZENvbmZpZyB9O1xuXG4gICAgICB0aGlzLnJ1bkF0dGVtcHQ8VD4oMCwgc3RhdGUsIHJldHJ5S2V5LCBzdWJzY3JpYmVyLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuICgpID0+IHRoaXMuY2FuY2VsU2VuZFJlcXVlc3Qoc3RhdGUsIHJldHJ5S2V5KTtcbiAgICB9KS5waXBlKHRha2UoMSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHNpbmdsZSBhdHRlbXB0IGFuZCBzY2hlZHVsZSByZXRyaWVzIG9uIGVycm9yXG4gICAqL1xuICBwcml2YXRlIHJ1bkF0dGVtcHQ8VD4oXG4gICAgYXR0ZW1wdE51bWJlcjogbnVtYmVyLFxuICAgIHN0YXRlOiBBdHRlbXB0U3RhdGUsXG4gICAgcmV0cnlLZXk6IHN0cmluZyxcbiAgICBzdWJzY3JpYmVyOiB7IG5leHQ6ICh2OiBUKSA9PiB2b2lkOyBlcnJvcjogKGU6IGFueSkgPT4gdm9pZDsgY29tcGxldGU6ICgpID0+IHZvaWQgfSxcbiAgICBjb250ZXh0OiBBdHRlbXB0Q29udGV4dFxuICApOiB2b2lkIHtcbiAgICBpZiAoc3RhdGUuYWJvcnRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlcXVlc3RJZCA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0SWQoKTtcbiAgICBzdGF0ZS5jdXJyZW50UmVxdWVzdElkID0gcmVxdWVzdElkO1xuXG4gICAgc3RhdGUuY3VycmVudElubmVyU3ViID0gdGhpcy5leGVjdXRlQXR0ZW1wdDxUPihcbiAgICAgIHJlcXVlc3RJZCxcbiAgICAgIGNvbnRleHQuYWN0aW9uLFxuICAgICAgY29udGV4dC5wYXlsb2FkLFxuICAgICAgY29udGV4dC5jb25maWcuZnVuY3Rpb25OYW1lLFxuICAgICAgY29udGV4dC5jb25maWcudGltZW91dCxcbiAgICAgIGNvbnRleHQuY29uZmlnLmNodW5rU2l6ZSxcbiAgICAgIGNvbnRleHQuY29uZmlnLm5vV2FpdFxuICAgICkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB0aGlzLmhhbmRsZUF0dGVtcHRTdWNjZXNzPFQ+KGRhdGEsIHN1YnNjcmliZXIsIHJldHJ5S2V5KSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHRoaXMuaGFuZGxlQXR0ZW1wdEVycm9yPFQ+KFxuICAgICAgICBlcnJvciwgYXR0ZW1wdE51bWJlciwgc3RhdGUsIHJldHJ5S2V5LCBzdWJzY3JpYmVyLCBjb250ZXh0XG4gICAgICApLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdHRlbXB0U3VjY2VzczxUPihcbiAgICBkYXRhOiBULFxuICAgIHN1YnNjcmliZXI6IHsgbmV4dDogKHY6IFQpID0+IHZvaWQ7IGNvbXBsZXRlOiAoKSA9PiB2b2lkIH0sXG4gICAgcmV0cnlLZXk6IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBzdWJzY3JpYmVyLm5leHQoZGF0YSk7XG4gICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgIHRoaXMucmV0cnlUaW1lb3V0cy5kZWxldGUocmV0cnlLZXkpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBdHRlbXB0RXJyb3I8VD4oXG4gICAgZXJyb3I6IGFueSxcbiAgICBhdHRlbXB0TnVtYmVyOiBudW1iZXIsXG4gICAgc3RhdGU6IEF0dGVtcHRTdGF0ZSxcbiAgICByZXRyeUtleTogc3RyaW5nLFxuICAgIHN1YnNjcmliZXI6IHsgbmV4dDogKHY6IFQpID0+IHZvaWQ7IGVycm9yOiAoZTogYW55KSA9PiB2b2lkOyBjb21wbGV0ZTogKCkgPT4gdm9pZCB9LFxuICAgIGNvbnRleHQ6IEF0dGVtcHRDb250ZXh0XG4gICk6IHZvaWQge1xuICAgIGlmIChzdGF0ZS5hYm9ydGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHROdW1iZXIgPCBjb250ZXh0LmNvbmZpZy5tYXhSZXRyaWVzKSB7XG4gICAgICBjb25zdCByZXRyeVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXRyeVRpbWVvdXRzLmRlbGV0ZShyZXRyeUtleSk7XG4gICAgICAgIHRoaXMucnVuQXR0ZW1wdDxUPihhdHRlbXB0TnVtYmVyICsgMSwgc3RhdGUsIHJldHJ5S2V5LCBzdWJzY3JpYmVyLCBjb250ZXh0KTtcbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLnJldHJ5RGVsYXkpO1xuICAgICAgdGhpcy5yZXRyeVRpbWVvdXRzLnNldChyZXRyeUtleSwgcmV0cnlUaW1lb3V0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuY29tbXVuaWNhdGlvbl9mYWlsZWRfYWZ0ZXJfcmV0cmllcycsIHtcbiAgICAgIGF0dGVtcHRzOiBjb250ZXh0LmNvbmZpZy5tYXhSZXRyaWVzICsgMVxuICAgIH0pO1xuICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxTZW5kUmVxdWVzdChzdGF0ZTogQXR0ZW1wdFN0YXRlLCByZXRyeUtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgc3RhdGUuYWJvcnRlZCA9IHRydWU7XG5cbiAgICAvLyBDYW5jZWxhciByZXRyeSBhZ2VuZGFkb1xuICAgIGNvbnN0IHBlbmRpbmdSZXRyeSA9IHRoaXMucmV0cnlUaW1lb3V0cy5nZXQocmV0cnlLZXkpO1xuICAgIGlmIChwZW5kaW5nUmV0cnkpIHtcbiAgICAgIGNsZWFyVGltZW91dChwZW5kaW5nUmV0cnkpO1xuICAgICAgdGhpcy5yZXRyeVRpbWVvdXRzLmRlbGV0ZShyZXRyeUtleSk7XG4gICAgfVxuXG4gICAgLy8gQ2FuY2VsYXIgdGVudGF0aXZhIGVtIGFuZGFtZW50b1xuICAgIGlmIChzdGF0ZS5jdXJyZW50SW5uZXJTdWIpIHtcbiAgICAgIHN0YXRlLmN1cnJlbnRJbm5lclN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8vIExpbXBhciByZXF1aXNpw6fDo28gcGVuZGVudGUgbm8gc2Vydmlkb3JcbiAgICBpZiAoc3RhdGUuY3VycmVudFJlcXVlc3RJZCkge1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChzdGF0ZS5jdXJyZW50UmVxdWVzdElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBhdHRlbXB0IG9mIHRoZSByZXF1ZXN0XG4gICAqL1xuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBhdHRlbXB0IG9mIHRoZSByZXF1ZXN0XG4gICAqIEBwYXJhbSByZXF1ZXN0SWQgVW5pcXVlIHJlcXVlc3QgSURcbiAgICogQHBhcmFtIGFjdGlvbiBBY3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gcGF5bG9hZCBQYXlsb2FkIGRhdGFcbiAgICogQHBhcmFtIGZ1bmN0aW9uTmFtZSBCYWNrZW5kIGZ1bmN0aW9uIG5hbWVcbiAgICogQHBhcmFtIHRpbWVvdXQgVGltZW91dCBpbiBtc1xuICAgKiBAcGFyYW0gY2h1bmtTaXplIENodW5rIHNpemUgaW4gYnl0ZXNcbiAgICogQHBhcmFtIG5vV2FpdCBJZiB0cnVlLCBkbyBub3Qgd2FpdCBmb3IgYSByZXNwb25zZSAoZmlyZSBhbmQgZm9yZ2V0KVxuICAgKi9cbiAgcHJpdmF0ZSBleGVjdXRlQXR0ZW1wdDxUPihcbiAgICByZXF1ZXN0SWQ6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICBwYXlsb2FkOiBhbnksXG4gICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgdGltZW91dDogbnVtYmVyLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyLFxuICAgIG5vV2FpdDogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICAvLyBDcmVhdGUgc3ViamVjdCBmb3IgdGhpcyBzcGVjaWZpYyByZXF1ZXN0XG4gICAgY29uc3QgcmVzcG9uc2VTdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5zZXQocmVxdWVzdElkLCByZXNwb25zZVN1YmplY3QpO1xuICAgIHRoaXMucmVxdWVzdE9yZGVyLnB1c2gocmVxdWVzdElkKTtcblxuICAgIGlmIChub1dhaXQpIHtcbiAgICAgIC8vIEZpcmUgYW5kIGZvcmdldDogc2VuZCByZXF1ZXN0IHZpYSBpbnZva2VOYXRpdmUgd2l0aCBYdEJyaWRnZVJlcXVlc3QgZm9ybWF0LCBkbyBub3QgdHJhY2sgcmVzcG9uc2Ugb3IgdGltZW91dFxuICAgICAgdGhpcy5zZW5kUmVxdWVzdEludm9rZU5hdGl2ZShyZXF1ZXN0SWQsIGFjdGlvbiwgcGF5bG9hZCwgZnVuY3Rpb25OYW1lLCBjaHVua1NpemUsIHJlc3BvbnNlU3ViamVjdCk7XG5cbiAgICAgIC8vIFJldHVybiBhbiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIGltbWVkaWF0ZWx5XG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8VD4oKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHVwIHRpbWVvdXQgdG8gcHJldmVudCBoYW5naW5nIHJlcXVlc3RzXG4gICAgY29uc3Qgc2V0dXBUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBzdWJqZWN0ID0gdGhpcy5yZXNwb25zZVN1YmplY3RzLmdldChyZXF1ZXN0SWQpO1xuICAgICAgaWYgKHN1YmplY3QpIHtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IoYFJlcXVlc3QgJHtyZXF1ZXN0SWR9IHRpbWVkIG91dCBhZnRlciAke3RpbWVvdXR9bXNgKSk7XG4gICAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIH1cbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLnNldChyZXF1ZXN0SWQsIHNldHVwVGltZW91dCk7XG5cbiAgICAvLyBTZW5kIHJlcXVlc3QgdmlhIGludm9rZU5hdGl2ZSB3aXRoIFh0QnJpZGdlUmVxdWVzdCBmb3JtYXRcbiAgICB0aGlzLnNlbmRSZXF1ZXN0SW52b2tlTmF0aXZlKHJlcXVlc3RJZCwgYWN0aW9uLCBwYXlsb2FkLCBmdW5jdGlvbk5hbWUsIGNodW5rU2l6ZSwgcmVzcG9uc2VTdWJqZWN0KTtcblxuICAgIC8vIFJldHVybiBvYnNlcnZhYmxlIHRoYXQgY29tcGxldGVzIGFmdGVyIGZpcnN0IHJlc3BvbnNlXG4gICAgcmV0dXJuIHJlc3BvbnNlU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgdGFrZSgxKVxuICAgICkgYXMgT2JzZXJ2YWJsZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgcmVxdWVzdCB1c2luZyBpbnZva2VOYXRpdmVcbiAgICogQHBhcmFtIHJlcXVlc3RJZCBVbmlxdWUgcmVxdWVzdCBJRFxuICAgKiBAcGFyYW0gYWN0aW9uIEFjdGlvbiBuYW1lXG4gICAqIEBwYXJhbSBwYXlsb2FkIFBheWxvYWQgZGF0YVxuICAgKiBAcGFyYW0gZnVuY3Rpb25OYW1lIEJhY2tlbmQgZnVuY3Rpb24gbmFtZVxuICAgKiBAcGFyYW0gdGltZW91dCBUaW1lb3V0IGluIG1zXG4gICAqIEBwYXJhbSBjaHVua1NpemUgQ2h1bmsgc2l6ZSBpbiBieXRlc1xuICAgKiBAcGFyYW0gcmVzcG9uc2VTdWJqZWN0IFN1YmplY3QgdG8gZW1pdCByZXNwb25zZSBvciBlcnJvciB0b1xuICAgKi9cbiAgcHJpdmF0ZSBzZW5kUmVxdWVzdEludm9rZU5hdGl2ZShcbiAgICByZXF1ZXN0SWQ6IHN0cmluZyxcbiAgICBhY3Rpb246IHN0cmluZyxcbiAgICBwYXlsb2FkOiBhbnksXG4gICAgZnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICAgY2h1bmtTaXplOiBudW1iZXIsXG4gICAgcmVzcG9uc2VTdWJqZWN0OiBTdWJqZWN0PGFueT4pIHtcbiAgICBpZiAoKGdsb2JhbFRoaXMgYXMgYW55KS5pbnZva2VOYXRpdmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgXCJpZFwiOiByZXF1ZXN0SWQsXG4gICAgICAgICAgXCJwYXJhbWV0ZXJzXCI6IFtcbiAgICAgICAgICAgIHsgXCJwYXJhbWV0cm9cIjogYWN0aW9uIH0sXG4gICAgICAgICAgICB7IFwicGFyYW1ldHJvXCI6IHBheWxvYWQgPyBKU09OLnN0cmluZ2lmeShwYXlsb2FkIHx8IHt9KSA6IFwiXCIgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgZnVuY3Rpb25OYW1lLFxuICAgICAgICAgIGNodW5rU2l6ZVxuICAgICAgICB9KTtcblxuICAgICAgICAoZ2xvYmFsVGhpcyBhcyBhbnkpLmludm9rZU5hdGl2ZSgwLCBgIyMjJHtyZXF1ZXN0fWApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLnJlcXVlc3Rfc2VuZF9mYWlsZWQnKTtcbiAgICAgICAgcmVzcG9uc2VTdWJqZWN0LmVycm9yKGVycm9yKTtcbiAgICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVxdWVzdF9zZW5kX2ZhaWxlZCcpO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoJ0NFRiBjb21tdW5pY2F0aW9uIG5vdCBhdmFpbGFibGUnKTtcbiAgICAgIHJlc3BvbnNlU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSByZXNwb25zZSBmcm9tIENFRiAtIFRocmVhZC1zYWZlLCBwcmV2ZW50cyByZXNwb25zZSBtaXhpbmdcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2U6IFh0QnJpZGdlUmVzcG9uc2UpOiB2b2lkIHtcbiAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IuaW52YWxpZF9yZXNwb25zZScpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGFueVJlc3BvbnNlOiBhbnkgPSByZXNwb25zZSBhcyBhbnk7XG5cbiAgICAvLyBTdXBvcnRlIGEgY2h1bmtlZCByZXNwb25zZSAoZXg6IHsgaWQ/LCBjaHVuaywgc2VxLCBsYXN0IH0pXG4gICAgaWYgKGFueVJlc3BvbnNlLmNodW5rKSB7XG4gICAgICBjb25zdCByZXNvbHZlZElkID0gYW55UmVzcG9uc2UuaWQgfHwgdGhpcy5yZXF1ZXN0T3JkZXIuYXQoLTEpO1xuICAgICAgaWYgKCFyZXNvbHZlZElkKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5pbnZhbGlkX3Jlc3BvbnNlJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5oYW5kbGVDaHVua1Jlc3BvbnNlKHJlc29sdmVkSWQsIGFueVJlc3BvbnNlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXJlc3BvbnNlLmlkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVzcG9uc2VfbWlzc2luZ19pZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZ2V0KHJlc3BvbnNlLmlkKTtcblxuICAgIHRoaXMuaGFuZGxlU3ViamVjdChzdWJqZWN0LCByZXNwb25zZSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1YmplY3Qoc3ViamVjdDogU3ViamVjdDxhbnk+IHwgdW5kZWZpbmVkLCByZXNwb25zZTogWHRCcmlkZ2VSZXNwb25zZSkge1xuICAgIGlmIChzdWJqZWN0KSB7XG4gICAgICAvLyBDbGVhciB0aW1lb3V0IGZvciB0aGlzIHJlcXVlc3RcbiAgICAgIGNvbnN0IHRpbWVvdXQgPSB0aGlzLnJlcXVlc3RUaW1lb3V0cy5nZXQocmVzcG9uc2UuaWQpO1xuICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0cy5kZWxldGUocmVzcG9uc2UuaWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNwb25zZSBtYXRjaGVkIHRvIGNvcnJlY3QgcmVxdWVzdCBJRCAtIHNhZmUgdG8gcHJvY2Vzc1xuICAgICAgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3ViamVjdC5uZXh0KHJlc3BvbnNlLmRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3ViamVjdC5lcnJvcihuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3IgPz8gJ1NlcnZlciBlcnJvcicpKTtcbiAgICAgIH1cbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICAgIHRoaXMucmVzcG9uc2VTdWJqZWN0cy5kZWxldGUocmVzcG9uc2UuaWQpO1xuICAgICAgdGhpcy5yZXF1ZXN0T3JkZXIgPSB0aGlzLnJlcXVlc3RPcmRlci5maWx0ZXIoaWQgPT4gaWQgIT09IHJlc3BvbnNlLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTm8gbWF0Y2hpbmcgcmVxdWVzdCBJRCAtIGNvdWxkIGJlIGxhdGUvZHVwbGljYXRlIHJlc3BvbnNlXG4gICAgICB0aGlzLnNob3dFcnJvcignaGNtLmhjbXh0X2JyaWRnZV9saWIudG9hc3QuZXJyb3IucmVzcG9uc2VfdW5rbm93bl9pZCcsIHsgaWQ6IHJlc3BvbnNlLmlkIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2h1bmtlZCByZXNwb25zZSBmcm9tIHNlcnZlciBjYWxsYmFja1xuICAgKiBCYWNrZW5kIGNoYW1hIHJlc29sdmVGdW5jdGlvbiBtw7psdGlwbGFzIHZlemVzIGNvbSBjaHVua3NcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlQ2h1bmtSZXNwb25zZShyZXF1ZXN0SWQ6IHN0cmluZywgY2h1bmtSZXNwb25zZTogeyBjaHVuazogc3RyaW5nOyBzZXE6IG51bWJlcjsgbGFzdDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgY29uc3Qgc3ViamVjdCA9IHRoaXMucmVzcG9uc2VTdWJqZWN0cy5nZXQocmVxdWVzdElkKTtcbiAgICBpZiAoIXN1YmplY3QpIHtcbiAgICAgIHRoaXMuc2hvd0Vycm9yKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5jaHVua191bmtub3duX2lkJywgeyBpZDogcmVxdWVzdElkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEluaWNpYWxpemFyIGJ1ZmZlciBzZSBuw6NvIGV4aXN0aXJcbiAgICBsZXQgYnVmZmVyID0gdGhpcy5jaHVua0J1ZmZlcnMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKCFidWZmZXIpIHtcbiAgICAgIGJ1ZmZlciA9IHsgY2h1bmtzOiBuZXcgTWFwPG51bWJlciwgc3RyaW5nPigpIH07XG4gICAgICB0aGlzLmNodW5rQnVmZmVycy5zZXQocmVxdWVzdElkLCBidWZmZXIpO1xuICAgIH1cblxuICAgIC8vIEFybWF6ZW5hciBjaHVua1xuICAgIGJ1ZmZlci5jaHVua3Muc2V0KGNodW5rUmVzcG9uc2Uuc2VxLCBjaHVua1Jlc3BvbnNlLmNodW5rKTtcblxuICAgIGlmIChidWZmZXIuY2h1bmtzLnNpemUgPiB0aGlzLk1BWF9DSFVOS1MpIHtcbiAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKCdMaW1pdGUgZGUgY2h1bmtzIGV4Y2VkaWRvJykpO1xuICAgICAgdGhpcy5zaG93RXJyb3IoJ2hjbS5oY214dF9icmlkZ2VfbGliLnRvYXN0LmVycm9yLmNodW5rX2xpbWl0X2V4Y2VlZGVkJywgeyBpZDogcmVxdWVzdElkIH0pO1xuICAgICAgdGhpcy5jbGVhbnVwUmVxdWVzdChyZXF1ZXN0SWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIE1hcmNhciBzZXF1w6puY2lhIGZpbmFsIHNlIGZvciBvIMO6bHRpbW8gY2h1bmtcbiAgICBpZiAoY2h1bmtSZXNwb25zZS5sYXN0KSB7XG4gICAgICBidWZmZXIubGFzdFNlcSA9IGNodW5rUmVzcG9uc2Uuc2VxO1xuICAgIH1cblxuICAgIC8vIFZlcmlmaWNhciBzZSB0b2RvcyBvcyBjaHVua3MgZm9yYW0gcmVjZWJpZG9zXG4gICAgaWYgKGJ1ZmZlci5sYXN0U2VxICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIERldGVjdGFyIHNlIMOpIDAtYmFzZWQgb3UgMS1iYXNlZFxuICAgICAgY29uc3QgaXNaZXJvQmFzZWQgPSBidWZmZXIuY2h1bmtzLmhhcygwKTtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU2l6ZSA9IGlzWmVyb0Jhc2VkID8gYnVmZmVyLmxhc3RTZXEgKyAxIDogYnVmZmVyLmxhc3RTZXE7XG5cbiAgICAgIC8vIEFndWFyZGFyIHRvZG9zIG9zIGNodW5rc1xuICAgICAgaWYgKGJ1ZmZlci5jaHVua3Muc2l6ZSAhPT0gZXhwZWN0ZWRTaXplKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVG9kb3Mgb3MgY2h1bmtzIHJlY2ViaWRvcyAtIG1vbnRhciByZXNwb3N0YSBmaW5hbFxuICAgICAgY29uc3QgY2h1bmtzT3JkZXJlZCA9IEFycmF5LmZyb20oYnVmZmVyLmNodW5rcy5lbnRyaWVzKCkpXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhWzBdIC0gYlswXSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5WzFdKVxuICAgICAgICAuam9pbignJyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2h1bmtzT3JkZXJlZCk7XG4gICAgICAgIHN1YmplY3QubmV4dChwYXJzZWQpO1xuICAgICAgICBzdWJqZWN0LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuY2xlYW51cFJlcXVlc3QocmVxdWVzdElkKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuc2hvd0Vycm9yKHRoaXMuVE9BU1RfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU19GQUlMRURfV0lUSF9JRCwgeyBpZDogcmVxdWVzdElkIH0pO1xuICAgICAgICBzdWJqZWN0LmVycm9yKG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlIGNodW5rZWQgcmVzcG9uc2U6ICR7ZXJyb3J9YCkpO1xuICAgICAgICB0aGlzLmNsZWFudXBSZXF1ZXN0KHJlcXVlc3RJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFuIHVwIHJlcXVlc3QgdHJhY2tpbmdcbiAgICovXG4gIHByaXZhdGUgY2xlYW51cFJlcXVlc3QocmVxdWVzdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlc3BvbnNlU3ViamVjdHMuZGVsZXRlKHJlcXVlc3RJZCk7XG4gICAgdGhpcy5yZXF1ZXN0T3JkZXIgPSB0aGlzLnJlcXVlc3RPcmRlci5maWx0ZXIoaWQgPT4gaWQgIT09IHJlcXVlc3RJZCk7XG4gICAgdGhpcy5jaHVua0J1ZmZlcnMuZGVsZXRlKHJlcXVlc3RJZCk7XG5cbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5yZXF1ZXN0VGltZW91dHMuZ2V0KHJlcXVlc3RJZCk7XG4gICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLmRlbGV0ZShyZXF1ZXN0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29ubmVjdGlvbiBzdGF0dXMgYXMgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZ2V0Q29ubmVjdGlvblN0YXR1cygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdHVzLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIENFRiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlXG4gICAqL1xuICBpc0NlZkF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jb25uZWN0aW9uU3RhdHVzLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFudXAgcGVuZGluZyByZXF1ZXN0cyAoY2FsbCBvbiBjb21wb25lbnQgZGVzdHJveSlcbiAgICovXG4gIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5yZXNwb25zZVN1YmplY3RzLmZvckVhY2goKHN1YmplY3QpID0+IHtcbiAgICAgIHN1YmplY3QuZXJyb3IobmV3IEVycm9yKCdTZXJ2aWNlIGNsZWFudXAgLSByZXF1ZXN0IGNhbmNlbGxlZCcpKTtcbiAgICAgIHN1YmplY3QuY29tcGxldGUoKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc3BvbnNlU3ViamVjdHMuY2xlYXIoKTtcblxuICAgIC8vIENsZWFyIGFsbCB0aW1lb3V0c1xuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLmZvckVhY2godGltZW91dCA9PiBjbGVhclRpbWVvdXQodGltZW91dCkpO1xuICAgIHRoaXMucmVxdWVzdFRpbWVvdXRzLmNsZWFyKCk7XG5cbiAgICAvLyBDbGVhciBwZW5kaW5nIHJldHJpZXNcbiAgICB0aGlzLnJldHJ5VGltZW91dHMuZm9yRWFjaCh0aW1lb3V0ID0+IGNsZWFyVGltZW91dCh0aW1lb3V0KSk7XG4gICAgdGhpcy5yZXRyeVRpbWVvdXRzLmNsZWFyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGRlYnVnIGluZm8gYWJvdXQgcGVuZGluZyByZXF1ZXN0c1xuICAgKi9cbiAgZ2V0RGVidWdJbmZvKCk6IHsgcGVuZGluZ1JlcXVlc3RzOiBudW1iZXI7IGFjdGl2ZVRpbWVvdXRzOiBudW1iZXIgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0czogdGhpcy5yZXNwb25zZVN1YmplY3RzLnNpemUsXG4gICAgICBhY3RpdmVUaW1lb3V0czogdGhpcy5yZXF1ZXN0VGltZW91dHMuc2l6ZVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheSBhIGxvY2FsaXplZCBlcnJvciB0b2FzdCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHNob3dFcnJvcihrZXk6IHN0cmluZywgcGFyYW1zPzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPik6IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHtcbiAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgc3VtbWFyeTogdGhpcy50cmFuc2xhdGlvblNlcnZpY2UudHJhbnNsYXRlKCdoY20uaGNteHRfYnJpZGdlX2xpYi50b2FzdC5lcnJvci5zdW1tYXJ5JyksXG4gICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRpb25TZXJ2aWNlLnRyYW5zbGF0ZShrZXksIHBhcmFtcylcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -152,6 +152,7 @@ class XtBridgeService {
|
|
|
152
152
|
this.MAX_CHUNKS = 1000;
|
|
153
153
|
this.DEFAULT_MAX_RETRIES = 3;
|
|
154
154
|
this.DEFAULT_RETRY_DELAY = 10000;
|
|
155
|
+
this.DEFAULT_NO_WAIT = false;
|
|
155
156
|
this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';
|
|
156
157
|
this.retryTimeouts = new Map();
|
|
157
158
|
this.initializeCefCommunication();
|
|
@@ -303,6 +304,7 @@ class XtBridgeService {
|
|
|
303
304
|
chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,
|
|
304
305
|
maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,
|
|
305
306
|
retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,
|
|
307
|
+
noWait: bridgeConfig?.noWait ?? this.DEFAULT_NO_WAIT
|
|
306
308
|
};
|
|
307
309
|
const retryKey = this.generateRequestId();
|
|
308
310
|
return new Observable((subscriber) => {
|
|
@@ -325,7 +327,7 @@ class XtBridgeService {
|
|
|
325
327
|
}
|
|
326
328
|
const requestId = this.generateRequestId();
|
|
327
329
|
state.currentRequestId = requestId;
|
|
328
|
-
state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize).subscribe({
|
|
330
|
+
state.currentInnerSub = this.executeAttempt(requestId, context.action, context.payload, context.config.functionName, context.config.timeout, context.config.chunkSize, context.config.noWait).subscribe({
|
|
329
331
|
next: (data) => this.handleAttemptSuccess(data, subscriber, retryKey),
|
|
330
332
|
error: (error) => this.handleAttemptError(error, attemptNumber, state, retryKey, subscriber, context),
|
|
331
333
|
});
|
|
@@ -372,11 +374,29 @@ class XtBridgeService {
|
|
|
372
374
|
/**
|
|
373
375
|
* Execute a single attempt of the request
|
|
374
376
|
*/
|
|
375
|
-
|
|
377
|
+
/**
|
|
378
|
+
* Execute a single attempt of the request
|
|
379
|
+
* @param requestId Unique request ID
|
|
380
|
+
* @param action Action name
|
|
381
|
+
* @param payload Payload data
|
|
382
|
+
* @param functionName Backend function name
|
|
383
|
+
* @param timeout Timeout in ms
|
|
384
|
+
* @param chunkSize Chunk size in bytes
|
|
385
|
+
* @param noWait If true, do not wait for a response (fire and forget)
|
|
386
|
+
*/
|
|
387
|
+
executeAttempt(requestId, action, payload, functionName, timeout, chunkSize, noWait) {
|
|
376
388
|
// Create subject for this specific request
|
|
377
389
|
const responseSubject = new Subject();
|
|
378
390
|
this.responseSubjects.set(requestId, responseSubject);
|
|
379
391
|
this.requestOrder.push(requestId);
|
|
392
|
+
if (noWait) {
|
|
393
|
+
// Fire and forget: send request via invokeNative with XtBridgeRequest format, do not track response or timeout
|
|
394
|
+
this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
|
|
395
|
+
// Return an observable that completes immediately
|
|
396
|
+
return new Observable((subscriber) => {
|
|
397
|
+
subscriber.complete();
|
|
398
|
+
});
|
|
399
|
+
}
|
|
380
400
|
// Set up timeout to prevent hanging requests
|
|
381
401
|
const setupTimeout = setTimeout(() => {
|
|
382
402
|
const subject = this.responseSubjects.get(requestId);
|
|
@@ -387,6 +407,21 @@ class XtBridgeService {
|
|
|
387
407
|
}, timeout);
|
|
388
408
|
this.requestTimeouts.set(requestId, setupTimeout);
|
|
389
409
|
// Send request via invokeNative with XtBridgeRequest format
|
|
410
|
+
this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);
|
|
411
|
+
// Return observable that completes after first response
|
|
412
|
+
return responseSubject.asObservable().pipe(take(1));
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Send a request using invokeNative
|
|
416
|
+
* @param requestId Unique request ID
|
|
417
|
+
* @param action Action name
|
|
418
|
+
* @param payload Payload data
|
|
419
|
+
* @param functionName Backend function name
|
|
420
|
+
* @param timeout Timeout in ms
|
|
421
|
+
* @param chunkSize Chunk size in bytes
|
|
422
|
+
* @param responseSubject Subject to emit response or error to
|
|
423
|
+
*/
|
|
424
|
+
sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject) {
|
|
390
425
|
if (globalThis.invokeNative) {
|
|
391
426
|
try {
|
|
392
427
|
const request = JSON.stringify({
|
|
@@ -412,8 +447,6 @@ class XtBridgeService {
|
|
|
412
447
|
responseSubject.error(error);
|
|
413
448
|
this.cleanupRequest(requestId);
|
|
414
449
|
}
|
|
415
|
-
// Return observable that completes after first response
|
|
416
|
-
return responseSubject.asObservable().pipe(take(1));
|
|
417
450
|
}
|
|
418
451
|
/**
|
|
419
452
|
* Handle response from CEF - Thread-safe, prevents response mixing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"senior-gestao-pessoas-hcmxt-bridge-lib.mjs","sources":["../../lib/src/lib/services/translation.service.ts","../../lib/src/lib/services/xt-bridge.service.ts","../../lib/src/public-api.ts","../../lib/src/senior-gestao-pessoas-hcmxt-bridge-lib.ts"],"sourcesContent":["import { Injectable, LOCALE_ID, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport ptBR from '../locale/pt-BR.json';\nimport enUS from '../locale/en-US.json';\nimport esES from '../locale/es-ES.json';\n\nexport type SupportedLocale = 'pt-BR' | 'en-US' | 'es-ES';\n\nexport type TranslationDictionary = Readonly<Record<string, string>>;\n\nexport const DEFAULT_LOCALE: SupportedLocale = 'pt-BR';\n\nconst BUILT_IN_TRANSLATIONS: Readonly<Record<SupportedLocale, TranslationDictionary>> = {\n 'pt-BR': ptBR as TranslationDictionary,\n 'en-US': enUS as TranslationDictionary,\n 'es-ES': esES as TranslationDictionary,\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TranslationService {\n\n private readonly translations = new Map<SupportedLocale, TranslationDictionary>(\n Object.entries(BUILT_IN_TRANSLATIONS) as [SupportedLocale, TranslationDictionary][]\n );\n\n private readonly localeSubject: BehaviorSubject<SupportedLocale>;\n\n constructor() {\n const angularLocale = inject(LOCALE_ID, { optional: true }) as string | null;\n this.localeSubject = new BehaviorSubject<SupportedLocale>(this.resolveLocale(angularLocale));\n }\n\n /**\n * Get the currently active locale.\n */\n getLocale(): SupportedLocale {\n return this.localeSubject.value;\n }\n\n /**\n * Change the active locale. Falls back to the default if unsupported.\n */\n setLocale(locale: string | null | undefined): void {\n this.localeSubject.next(this.resolveLocale(locale));\n }\n\n /**\n * Register or override translations for a given locale.\n * Useful for consumers that want to customize the built-in messages.\n */\n registerTranslations(locale: SupportedLocale, dictionary: TranslationDictionary): void {\n const existing = this.translations.get(locale) ?? {};\n this.translations.set(locale, { ...existing, ...dictionary });\n }\n\n /**\n * Translate a key using the active locale, with optional placeholder interpolation.\n * Placeholders use {name} syntax. If the key is not found, the key itself is returned.\n */\n translate(key: string, params?: Record<string, string | number>): string {\n const dict = this.translations.get(this.localeSubject.value)\n ?? this.translations.get(DEFAULT_LOCALE)\n ?? {};\n\n const template = Object.hasOwn(dict, key)\n ? dict[key]\n : (this.translations.get(DEFAULT_LOCALE)?.[key] ?? key);\n\n return this.interpolate(template, params);\n }\n\n private interpolate(template: string, params?: Record<string, string | number>): string {\n if (!params) {\n return template;\n }\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n return Object.hasOwn(params, name)\n ? String(params[name])\n : match;\n });\n }\n\n private resolveLocale(locale: string | null | undefined): SupportedLocale {\n if (!locale) {\n return DEFAULT_LOCALE;\n }\n\n const normalized = locale.replace('_', '-');\n\n if (this.isSupported(normalized)) {\n return normalized;\n }\n\n const lang = normalized.split('-')[0].toLowerCase();\n switch (lang) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n case 'es':\n return 'es-ES';\n default:\n return DEFAULT_LOCALE;\n }\n }\n\n private isSupported(locale: string): locale is SupportedLocale {\n return this.translations.has(locale as SupportedLocale);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { MessageService } from 'primeng/api';\nimport { TranslationService } from './translation.service';\n\nexport interface XtBridgeRequest {\n id: string;\n action: string;\n payload?: any;\n timestamp: number;\n}\n\nexport interface XtBridgeResponse {\n id: string;\n success: boolean;\n data?: any;\n error?: string;\n timestamp: number;\n}\n\nexport interface BridgeConfig {\n // Nome da função no Back-End (default: \"XtBridgeRequest\")\n functionName?: string;\n\n // Timeout para requisições em ms (default: 30000)\n requestTimeout?: number;\n\n // Tamanho de chunk para dados grandes em bytes (default: 64KB)\n chunkSize?: number;\n\n // Número máximo de tentativas em caso de falha (default: 3)\n maxRetries?: number;\n\n // Delay entre tentativas em ms (default: 10000)\n retryDelay?: number;\n}\n\ninterface ResolvedBridgeConfig {\n functionName: string;\n timeout: number;\n chunkSize: number;\n maxRetries: number;\n retryDelay: number;\n}\n\ninterface AttemptState {\n aborted: boolean;\n currentInnerSub: { unsubscribe: () => void } | null;\n currentRequestId: string | null;\n}\n\ninterface AttemptContext {\n action: string;\n payload: any;\n config: ResolvedBridgeConfig;\n}\n\ndeclare global {\n interface Window {\n // CEF injected functions\n cefSendToServer?: (requestData: string) => void;\n // Angular callback functions\n handleCefResponse?: (responseData: string) => void;\n // Native invoke function for Xt emulator\n invokeNative?: (type: number, payload: string) => void;\n // App component callbacks - called by server with request ID\n resolveFunction?: (id: string, data: any) => void;\n rejectFunction?: (id: string, error: any) => void;\n }\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class XtBridgeService {\n\n private readonly responseSubjects = new Map<string, Subject<any>>();\n private readonly requestTimeouts = new Map<string, any>();\n private readonly connectionStatus = new BehaviorSubject<boolean>(false);\n private requestOrder: string[] = [];\n private readonly chunkBuffers = new Map<string, { chunks: Map<number, string>; lastSeq?: number }>();\n private readonly messageService = inject(MessageService);\n private readonly translationService = inject(TranslationService);\n private readonly DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME = \"XtBridgeRequest\";\n private readonly DEFAULT_REQUEST_TIME_OUT = 30000;\n private readonly DEFAULT_CHUNK_SIZE = 64 * 1024; // Default 64KB\n private readonly MAX_CHUNKS = 1000;\n private readonly DEFAULT_MAX_RETRIES = 3;\n private readonly DEFAULT_RETRY_DELAY = 10000;\n private readonly TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';\n private readonly retryTimeouts = new Map<string, any>();\n\n constructor() {\n this.initializeCefCommunication();\n this.checkCefAvailability();\n // Registrar callbacks globais para o servidor chamar\n this.registerGlobalCallbacks();\n }\n /**\n * Register global callbacks that the server will invoke\n * Servidor chama document.app.g5.resolveFunction(id, data) ou document.app.g5.rejectFunction(id, error)\n */\n private registerGlobalCallbacks(): void {\n // Criar estrutura document.app.g5 se não existir\n if (!(document as any).app) {\n (document as any).app = {};\n }\n if (!(document as any).app.g5) {\n (document as any).app.g5 = {};\n }\n\n // Salvar referências originais se existirem (do AppComponent)\n const originalResolve = (document as any).app.g5.resolveFunction;\n const originalReject = (document as any).app.g5.rejectFunction;\n\n // Definir nova resolveFunction\n (document as any).app.g5.resolveFunction = (id: string, data: any) => {\n // Chamar original do AppComponent se existir\n if (originalResolve && typeof originalResolve === 'function') {\n try {\n originalResolve.call(globalThis, id, data);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, data, false);\n };\n\n // Definir nova rejectFunction\n (document as any).app.g5.rejectFunction = (id: string, error: any) => {\n // Chamar original do AppComponent se existir\n if (originalReject && typeof originalReject === 'function') {\n try {\n originalReject.call(globalThis, id, error);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, error, true);\n };\n\n // Também registrar em window para compatibilidade\n (globalThis as any).resolveFunction = (document as any).app.g5.resolveFunction;\n (globalThis as any).rejectFunction = (document as any).app.g5.rejectFunction;\n }\n\n /**\n * Initialize CEF communication by setting up the global callback\n */\n private initializeCefCommunication(): void {\n // Set up global callback function that CEF will call (for direct responses)\n (globalThis as any).handleCefResponse = (responseData: string) => {\n try {\n const response: any = JSON.parse(responseData);\n this.handleResponse(response);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_parse_failed');\n }\n };\n }\n\n /**\n * Handle callback from server via resolveFunction/rejectFunction\n * Processa tanto respostas simples quanto chunked\n */\n private handleServerCallback(id: string, data: any, isError: boolean): void {\n const subject = this.responseSubjects.get(id);\n\n if (!subject) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n return;\n }\n\n try {\n let parsedData = data;\n\n // Parse JSON se for string\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n parsedData = data;\n }\n }\n\n const hasParsedDataObject = parsedData && typeof parsedData === 'object';\n // Verificar se é resposta chunked { chunk, seq, last }\n if (hasParsedDataObject && parsedData.chunk && parsedData.seq !== undefined && parsedData.last !== undefined) {\n this.handleChunkResponse(id, parsedData);\n return;\n }\n\n // Resposta normal (não-chunked)\n if (isError) {\n const errorMsg = typeof data === 'string' ? data : JSON.stringify(data);\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(new Error(errorMsg));\n } else {\n subject.next(parsedData);\n }\n\n subject.complete();\n this.cleanupRequest(id);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(error);\n this.cleanupRequest(id);\n }\n }\n\n /**\n * Check if CEF functions are available\n */\n private checkCefAvailability(): void {\n const isAvailable = typeof (globalThis as any).cefSendToServer === 'function';\n this.connectionStatus.next(isAvailable);\n\n if (!isAvailable) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.cef_unavailable');\n }\n }\n\n /**\n * Generate unique ID for requests - guaranteed unique even with concurrent calls\n */\n private generateRequestId(): string {\n const timestamp = Date.now();\n const random = crypto.randomUUID().split('-').join('');\n const counter = this.responseSubjects.size; // Additional uniqueness\n return `req_${timestamp}_${random}_${counter}`;\n }\n\n /**\n * Send request to server via CEF - Thread-safe with timeout protection and retry resilience\n *\n * @param action Nome da ação/API a ser invocada no Back-End\n * @param locale Locale obrigatório para internacionalizar as mensagens de Toast (ex: 'pt-BR', 'en-US', 'es-ES').\n * Atualiza o locale ativo do TranslationService antes de enviar a requisição.\n * @param payload Dados a serem enviados ao Back-End\n * @param bridgeConfig Configurações opcionais da requisição\n */\n sendRequest<T = any>(action: string, locale: string, payload?: any, bridgeConfig?: BridgeConfig): Observable<T> {\n this.translationService.setLocale(locale);\n\n const resolvedConfig: ResolvedBridgeConfig = {\n functionName: bridgeConfig?.functionName ?? this.DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME,\n timeout: bridgeConfig?.requestTimeout ?? this.DEFAULT_REQUEST_TIME_OUT,\n chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,\n maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,\n retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,\n };\n\n const retryKey = this.generateRequestId();\n\n return new Observable<T>((subscriber) => {\n const state: AttemptState = {\n aborted: false,\n currentInnerSub: null,\n currentRequestId: null,\n };\n\n const context: AttemptContext = { action, payload, config: resolvedConfig };\n\n this.runAttempt<T>(0, state, retryKey, subscriber, context);\n\n return () => this.cancelSendRequest(state, retryKey);\n }).pipe(take(1));\n }\n\n /**\n * Run a single attempt and schedule retries on error\n */\n private runAttempt<T>(\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n const requestId = this.generateRequestId();\n state.currentRequestId = requestId;\n\n state.currentInnerSub = this.executeAttempt<T>(\n requestId,\n context.action,\n context.payload,\n context.config.functionName,\n context.config.timeout,\n context.config.chunkSize\n ).subscribe({\n next: (data) => this.handleAttemptSuccess<T>(data, subscriber, retryKey),\n error: (error) => this.handleAttemptError<T>(\n error, attemptNumber, state, retryKey, subscriber, context\n ),\n });\n }\n\n private handleAttemptSuccess<T>(\n data: T,\n subscriber: { next: (v: T) => void; complete: () => void },\n retryKey: string\n ): void {\n subscriber.next(data);\n subscriber.complete();\n this.retryTimeouts.delete(retryKey);\n }\n\n private handleAttemptError<T>(\n error: any,\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n if (attemptNumber < context.config.maxRetries) {\n const retryTimeout = setTimeout(() => {\n this.retryTimeouts.delete(retryKey);\n this.runAttempt<T>(attemptNumber + 1, state, retryKey, subscriber, context);\n }, context.config.retryDelay);\n this.retryTimeouts.set(retryKey, retryTimeout);\n return;\n }\n\n this.showError('hcm.hcmxt_bridge_lib.toast.error.communication_failed_after_retries', {\n attempts: context.config.maxRetries + 1\n });\n subscriber.error(error);\n }\n\n private cancelSendRequest(state: AttemptState, retryKey: string): void {\n state.aborted = true;\n\n // Cancelar retry agendado\n const pendingRetry = this.retryTimeouts.get(retryKey);\n if (pendingRetry) {\n clearTimeout(pendingRetry);\n this.retryTimeouts.delete(retryKey);\n }\n\n // Cancelar tentativa em andamento\n if (state.currentInnerSub) {\n state.currentInnerSub.unsubscribe();\n }\n\n // Limpar requisição pendente no servidor\n if (state.currentRequestId) {\n this.cleanupRequest(state.currentRequestId);\n }\n }\n\n /**\n * Execute a single attempt of the request\n */\n private executeAttempt<T>(\n requestId: string,\n action: string,\n payload: any,\n functionName: string,\n timeout: number,\n chunkSize: number\n ): Observable<T> {\n // Create subject for this specific request\n const responseSubject = new Subject<any>();\n this.responseSubjects.set(requestId, responseSubject);\n this.requestOrder.push(requestId);\n\n // Set up timeout to prevent hanging requests\n const setupTimeout = setTimeout(() => {\n const subject = this.responseSubjects.get(requestId);\n if (subject) {\n subject.error(new Error(`Request ${requestId} timed out after ${timeout}ms`));\n this.cleanupRequest(requestId);\n }\n }, timeout);\n\n this.requestTimeouts.set(requestId, setupTimeout);\n\n // Send request via invokeNative with XtBridgeRequest format\n if ((globalThis as any).invokeNative) {\n try {\n const request = JSON.stringify({\n \"id\": requestId,\n \"parameters\": [\n { \"parametro\": action },\n { \"parametro\": payload ? JSON.stringify(payload || {}) : \"\" }\n ],\n functionName,\n chunkSize\n });\n\n (globalThis as any).invokeNative(0, `###${request}`);\n } catch (error) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n } else {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n const error = new Error('CEF communication not available');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n\n // Return observable that completes after first response\n return responseSubject.asObservable().pipe(\n take(1)\n ) as Observable<T>;\n }\n\n /**\n * Handle response from CEF - Thread-safe, prevents response mixing\n */\n private handleResponse(response: XtBridgeResponse): void {\n if (!response) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n const anyResponse: any = response as any;\n\n // Suporte a chunked response (ex: { id?, chunk, seq, last })\n if (anyResponse.chunk) {\n const resolvedId = anyResponse.id || this.requestOrder.at(-1);\n if (!resolvedId) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n this.handleChunkResponse(resolvedId, anyResponse);\n return;\n }\n\n if (!response.id) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_missing_id');\n return;\n }\n\n const subject = this.responseSubjects.get(response.id);\n\n this.handleSubject(subject, response);\n }\n\n private handleSubject(subject: Subject<any> | undefined, response: XtBridgeResponse) {\n if (subject) {\n // Clear timeout for this request\n const timeout = this.requestTimeouts.get(response.id);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(response.id);\n }\n\n // Response matched to correct request ID - safe to process\n if (response.success) {\n subject.next(response.data);\n } else {\n subject.error(new Error(response.error ?? 'Server error'));\n }\n subject.complete();\n this.responseSubjects.delete(response.id);\n this.requestOrder = this.requestOrder.filter(id => id !== response.id);\n } else {\n // No matching request ID - could be late/duplicate response\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_unknown_id', { id: response.id });\n }\n }\n\n /**\n * Handle chunked response from server callback\n * Backend chama resolveFunction múltiplas vezes com chunks\n */\n private handleChunkResponse(requestId: string, chunkResponse: { chunk: string; seq: number; last: boolean }): void {\n const subject = this.responseSubjects.get(requestId);\n if (!subject) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_unknown_id', { id: requestId });\n return;\n }\n\n // Inicializar buffer se não existir\n let buffer = this.chunkBuffers.get(requestId);\n if (!buffer) {\n buffer = { chunks: new Map<number, string>() };\n this.chunkBuffers.set(requestId, buffer);\n }\n\n // Armazenar chunk\n buffer.chunks.set(chunkResponse.seq, chunkResponse.chunk);\n\n if (buffer.chunks.size > this.MAX_CHUNKS) {\n subject.error(new Error('Limite de chunks excedido'));\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_limit_exceeded', { id: requestId });\n this.cleanupRequest(requestId);\n return;\n }\n\n // Marcar sequência final se for o último chunk\n if (chunkResponse.last) {\n buffer.lastSeq = chunkResponse.seq;\n }\n\n // Verificar se todos os chunks foram recebidos\n if (buffer.lastSeq !== undefined) {\n // Detectar se é 0-based ou 1-based\n const isZeroBased = buffer.chunks.has(0);\n const expectedSize = isZeroBased ? buffer.lastSeq + 1 : buffer.lastSeq;\n\n // Aguardar todos os chunks\n if (buffer.chunks.size !== expectedSize) {\n return;\n }\n\n // Todos os chunks recebidos - montar resposta final\n const chunksOrdered = Array.from(buffer.chunks.entries())\n .sort((a, b) => a[0] - b[0])\n .map((entry) => entry[1])\n .join('');\n\n try {\n const parsed = JSON.parse(chunksOrdered);\n subject.next(parsed);\n subject.complete();\n this.cleanupRequest(requestId);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id: requestId });\n subject.error(new Error(`Failed to parse chunked response: ${error}`));\n this.cleanupRequest(requestId);\n }\n }\n }\n\n /**\n * Clean up request tracking\n */\n private cleanupRequest(requestId: string): void {\n this.responseSubjects.delete(requestId);\n this.requestOrder = this.requestOrder.filter(id => id !== requestId);\n this.chunkBuffers.delete(requestId);\n\n const timeout = this.requestTimeouts.get(requestId);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(requestId);\n }\n }\n\n /**\n * Get connection status as observable\n */\n getConnectionStatus(): Observable<boolean> {\n return this.connectionStatus.asObservable();\n }\n\n /**\n * Check if CEF is currently available\n */\n isCefAvailable(): boolean {\n return this.connectionStatus.value;\n }\n\n /**\n * Cleanup pending requests (call on component destroy)\n */\n cleanup(): void {\n this.responseSubjects.forEach((subject) => {\n subject.error(new Error('Service cleanup - request cancelled'));\n subject.complete();\n });\n this.responseSubjects.clear();\n\n // Clear all timeouts\n this.requestTimeouts.forEach(timeout => clearTimeout(timeout));\n this.requestTimeouts.clear();\n\n // Clear pending retries\n this.retryTimeouts.forEach(timeout => clearTimeout(timeout));\n this.retryTimeouts.clear();\n }\n\n /**\n * Get debug info about pending requests\n */\n getDebugInfo(): { pendingRequests: number; activeTimeouts: number } {\n return {\n pendingRequests: this.responseSubjects.size,\n activeTimeouts: this.requestTimeouts.size\n };\n }\n\n /**\n * Display a localized error toast message\n */\n private showError(key: string, params?: Record<string, string | number>): void {\n this.messageService.add({\n severity: 'error',\n summary: this.translationService.translate('hcm.hcmxt_bridge_lib.toast.error.summary'),\n detail: this.translationService.translate(key, params)\n });\n }\n}\n","/*\n * Public API Surface of hcmxt-bridge-lib\n */\n\n// Services\nexport { XtBridgeService, XtBridgeRequest, XtBridgeResponse, BridgeConfig } from './lib/services/xt-bridge.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"senior-gestao-pessoas-hcmxt-bridge-lib.mjs","sources":["../../lib/src/lib/services/translation.service.ts","../../lib/src/lib/services/xt-bridge.service.ts","../../lib/src/public-api.ts","../../lib/src/senior-gestao-pessoas-hcmxt-bridge-lib.ts"],"sourcesContent":["import { Injectable, LOCALE_ID, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport ptBR from '../locale/pt-BR.json';\nimport enUS from '../locale/en-US.json';\nimport esES from '../locale/es-ES.json';\n\nexport type SupportedLocale = 'pt-BR' | 'en-US' | 'es-ES';\n\nexport type TranslationDictionary = Readonly<Record<string, string>>;\n\nexport const DEFAULT_LOCALE: SupportedLocale = 'pt-BR';\n\nconst BUILT_IN_TRANSLATIONS: Readonly<Record<SupportedLocale, TranslationDictionary>> = {\n 'pt-BR': ptBR as TranslationDictionary,\n 'en-US': enUS as TranslationDictionary,\n 'es-ES': esES as TranslationDictionary,\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class TranslationService {\n\n private readonly translations = new Map<SupportedLocale, TranslationDictionary>(\n Object.entries(BUILT_IN_TRANSLATIONS) as [SupportedLocale, TranslationDictionary][]\n );\n\n private readonly localeSubject: BehaviorSubject<SupportedLocale>;\n\n constructor() {\n const angularLocale = inject(LOCALE_ID, { optional: true }) as string | null;\n this.localeSubject = new BehaviorSubject<SupportedLocale>(this.resolveLocale(angularLocale));\n }\n\n /**\n * Get the currently active locale.\n */\n getLocale(): SupportedLocale {\n return this.localeSubject.value;\n }\n\n /**\n * Change the active locale. Falls back to the default if unsupported.\n */\n setLocale(locale: string | null | undefined): void {\n this.localeSubject.next(this.resolveLocale(locale));\n }\n\n /**\n * Register or override translations for a given locale.\n * Useful for consumers that want to customize the built-in messages.\n */\n registerTranslations(locale: SupportedLocale, dictionary: TranslationDictionary): void {\n const existing = this.translations.get(locale) ?? {};\n this.translations.set(locale, { ...existing, ...dictionary });\n }\n\n /**\n * Translate a key using the active locale, with optional placeholder interpolation.\n * Placeholders use {name} syntax. If the key is not found, the key itself is returned.\n */\n translate(key: string, params?: Record<string, string | number>): string {\n const dict = this.translations.get(this.localeSubject.value)\n ?? this.translations.get(DEFAULT_LOCALE)\n ?? {};\n\n const template = Object.hasOwn(dict, key)\n ? dict[key]\n : (this.translations.get(DEFAULT_LOCALE)?.[key] ?? key);\n\n return this.interpolate(template, params);\n }\n\n private interpolate(template: string, params?: Record<string, string | number>): string {\n if (!params) {\n return template;\n }\n return template.replace(/\\{(\\w+)\\}/g, (match, name: string) => {\n return Object.hasOwn(params, name)\n ? String(params[name])\n : match;\n });\n }\n\n private resolveLocale(locale: string | null | undefined): SupportedLocale {\n if (!locale) {\n return DEFAULT_LOCALE;\n }\n\n const normalized = locale.replace('_', '-');\n\n if (this.isSupported(normalized)) {\n return normalized;\n }\n\n const lang = normalized.split('-')[0].toLowerCase();\n switch (lang) {\n case 'pt':\n return 'pt-BR';\n case 'en':\n return 'en-US';\n case 'es':\n return 'es-ES';\n default:\n return DEFAULT_LOCALE;\n }\n }\n\n private isSupported(locale: string): locale is SupportedLocale {\n return this.translations.has(locale as SupportedLocale);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Observable, Subject, BehaviorSubject } from 'rxjs';\nimport { take } from 'rxjs/operators';\nimport { MessageService } from 'primeng/api';\nimport { TranslationService } from './translation.service';\n\nexport interface XtBridgeRequest {\n id: string;\n action: string;\n payload?: any;\n timestamp: number;\n}\n\nexport interface XtBridgeResponse {\n id: string;\n success: boolean;\n data?: any;\n error?: string;\n timestamp: number;\n}\n\nexport interface BridgeConfig {\n // Nome da função no Back-End (default: \"XtBridgeRequest\")\n functionName?: string;\n\n // Timeout para requisições em ms (default: 30000)\n requestTimeout?: number;\n\n // Tamanho de chunk para dados grandes em bytes (default: 64KB)\n chunkSize?: number;\n\n // Número máximo de tentativas em caso de falha (default: 3)\n maxRetries?: number;\n\n // Delay entre tentativas em ms (default: 10000)\n retryDelay?: number;\n\n // Se true, não aguarda resposta do Back-End (fire and forget)\n noWait?: boolean;\n}\n\ninterface ResolvedBridgeConfig {\n functionName: string;\n timeout: number;\n chunkSize: number;\n maxRetries: number;\n retryDelay: number;\n noWait: boolean;\n}\n\ninterface AttemptState {\n aborted: boolean;\n currentInnerSub: { unsubscribe: () => void } | null;\n currentRequestId: string | null;\n}\n\ninterface AttemptContext {\n action: string;\n payload: any;\n config: ResolvedBridgeConfig;\n}\n\ndeclare global {\n interface Window {\n // CEF injected functions\n cefSendToServer?: (requestData: string) => void;\n // Angular callback functions\n handleCefResponse?: (responseData: string) => void;\n // Native invoke function for Xt emulator\n invokeNative?: (type: number, payload: string) => void;\n // App component callbacks - called by server with request ID\n resolveFunction?: (id: string, data: any) => void;\n rejectFunction?: (id: string, error: any) => void;\n }\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class XtBridgeService {\n\n private readonly responseSubjects = new Map<string, Subject<any>>();\n private readonly requestTimeouts = new Map<string, any>();\n private readonly connectionStatus = new BehaviorSubject<boolean>(false);\n private requestOrder: string[] = [];\n private readonly chunkBuffers = new Map<string, { chunks: Map<number, string>; lastSeq?: number }>();\n private readonly messageService = inject(MessageService);\n private readonly translationService = inject(TranslationService);\n private readonly DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME = \"XtBridgeRequest\";\n private readonly DEFAULT_REQUEST_TIME_OUT = 30000;\n private readonly DEFAULT_CHUNK_SIZE = 64 * 1024; // Default 64KB\n private readonly MAX_CHUNKS = 1000;\n private readonly DEFAULT_MAX_RETRIES = 3;\n private readonly DEFAULT_RETRY_DELAY = 10000;\n private readonly DEFAULT_NO_WAIT = false;\n private readonly TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID = 'hcm.hcmxt_bridge_lib.toast.error.response_process_failed_with_id';\n private readonly retryTimeouts = new Map<string, any>();\n\n constructor() {\n this.initializeCefCommunication();\n this.checkCefAvailability();\n // Registrar callbacks globais para o servidor chamar\n this.registerGlobalCallbacks();\n }\n /**\n * Register global callbacks that the server will invoke\n * Servidor chama document.app.g5.resolveFunction(id, data) ou document.app.g5.rejectFunction(id, error)\n */\n private registerGlobalCallbacks(): void {\n // Criar estrutura document.app.g5 se não existir\n if (!(document as any).app) {\n (document as any).app = {};\n }\n if (!(document as any).app.g5) {\n (document as any).app.g5 = {};\n }\n\n // Salvar referências originais se existirem (do AppComponent)\n const originalResolve = (document as any).app.g5.resolveFunction;\n const originalReject = (document as any).app.g5.rejectFunction;\n\n // Definir nova resolveFunction\n (document as any).app.g5.resolveFunction = (id: string, data: any) => {\n // Chamar original do AppComponent se existir\n if (originalResolve && typeof originalResolve === 'function') {\n try {\n originalResolve.call(globalThis, id, data);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, data, false);\n };\n\n // Definir nova rejectFunction\n (document as any).app.g5.rejectFunction = (id: string, error: any) => {\n // Chamar original do AppComponent se existir\n if (originalReject && typeof originalReject === 'function') {\n try {\n originalReject.call(globalThis, id, error);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.callback_failed');\n }\n }\n\n // Processar via XtBridgeService\n this.handleServerCallback(id, error, true);\n };\n\n // Também registrar em window para compatibilidade\n (globalThis as any).resolveFunction = (document as any).app.g5.resolveFunction;\n (globalThis as any).rejectFunction = (document as any).app.g5.rejectFunction;\n }\n\n /**\n * Initialize CEF communication by setting up the global callback\n */\n private initializeCefCommunication(): void {\n // Set up global callback function that CEF will call (for direct responses)\n (globalThis as any).handleCefResponse = (responseData: string) => {\n try {\n const response: any = JSON.parse(responseData);\n this.handleResponse(response);\n } catch {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_parse_failed');\n }\n };\n }\n\n /**\n * Handle callback from server via resolveFunction/rejectFunction\n * Processa tanto respostas simples quanto chunked\n */\n private handleServerCallback(id: string, data: any, isError: boolean): void {\n const subject = this.responseSubjects.get(id);\n\n if (!subject) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n return;\n }\n\n try {\n let parsedData = data;\n\n // Parse JSON se for string\n if (typeof data === 'string') {\n try {\n parsedData = JSON.parse(data);\n } catch {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n parsedData = data;\n }\n }\n\n const hasParsedDataObject = parsedData && typeof parsedData === 'object';\n // Verificar se é resposta chunked { chunk, seq, last }\n if (hasParsedDataObject && parsedData.chunk && parsedData.seq !== undefined && parsedData.last !== undefined) {\n this.handleChunkResponse(id, parsedData);\n return;\n }\n\n // Resposta normal (não-chunked)\n if (isError) {\n const errorMsg = typeof data === 'string' ? data : JSON.stringify(data);\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(new Error(errorMsg));\n } else {\n subject.next(parsedData);\n }\n\n subject.complete();\n this.cleanupRequest(id);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id });\n subject.error(error);\n this.cleanupRequest(id);\n }\n }\n\n /**\n * Check if CEF functions are available\n */\n private checkCefAvailability(): void {\n const isAvailable = typeof (globalThis as any).cefSendToServer === 'function';\n this.connectionStatus.next(isAvailable);\n\n if (!isAvailable) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.cef_unavailable');\n }\n }\n\n /**\n * Generate unique ID for requests - guaranteed unique even with concurrent calls\n */\n private generateRequestId(): string {\n const timestamp = Date.now();\n const random = crypto.randomUUID().split('-').join('');\n const counter = this.responseSubjects.size; // Additional uniqueness\n return `req_${timestamp}_${random}_${counter}`;\n }\n\n /**\n * Send request to server via CEF - Thread-safe with timeout protection and retry resilience\n *\n * @param action Nome da ação/API a ser invocada no Back-End\n * @param locale Locale obrigatório para internacionalizar as mensagens de Toast (ex: 'pt-BR', 'en-US', 'es-ES').\n * Atualiza o locale ativo do TranslationService antes de enviar a requisição.\n * @param payload Dados a serem enviados ao Back-End\n * @param bridgeConfig Configurações opcionais da requisição\n */\n sendRequest<T = any>(action: string, locale: string, payload?: any, bridgeConfig?: BridgeConfig): Observable<T> {\n this.translationService.setLocale(locale);\n\n const resolvedConfig: ResolvedBridgeConfig = {\n functionName: bridgeConfig?.functionName ?? this.DEFAULT_XT_BRIDGE_REQUEST_FUNCTION_NAME,\n timeout: bridgeConfig?.requestTimeout ?? this.DEFAULT_REQUEST_TIME_OUT,\n chunkSize: bridgeConfig?.chunkSize ?? this.DEFAULT_CHUNK_SIZE,\n maxRetries: bridgeConfig?.maxRetries ?? this.DEFAULT_MAX_RETRIES,\n retryDelay: bridgeConfig?.retryDelay ?? this.DEFAULT_RETRY_DELAY,\n noWait: bridgeConfig?.noWait ?? this.DEFAULT_NO_WAIT\n };\n\n const retryKey = this.generateRequestId();\n\n return new Observable<T>((subscriber) => {\n const state: AttemptState = {\n aborted: false,\n currentInnerSub: null,\n currentRequestId: null,\n };\n\n const context: AttemptContext = { action, payload, config: resolvedConfig };\n\n this.runAttempt<T>(0, state, retryKey, subscriber, context);\n\n return () => this.cancelSendRequest(state, retryKey);\n }).pipe(take(1));\n }\n\n /**\n * Run a single attempt and schedule retries on error\n */\n private runAttempt<T>(\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n const requestId = this.generateRequestId();\n state.currentRequestId = requestId;\n\n state.currentInnerSub = this.executeAttempt<T>(\n requestId,\n context.action,\n context.payload,\n context.config.functionName,\n context.config.timeout,\n context.config.chunkSize,\n context.config.noWait\n ).subscribe({\n next: (data) => this.handleAttemptSuccess<T>(data, subscriber, retryKey),\n error: (error) => this.handleAttemptError<T>(\n error, attemptNumber, state, retryKey, subscriber, context\n ),\n });\n }\n\n private handleAttemptSuccess<T>(\n data: T,\n subscriber: { next: (v: T) => void; complete: () => void },\n retryKey: string\n ): void {\n subscriber.next(data);\n subscriber.complete();\n this.retryTimeouts.delete(retryKey);\n }\n\n private handleAttemptError<T>(\n error: any,\n attemptNumber: number,\n state: AttemptState,\n retryKey: string,\n subscriber: { next: (v: T) => void; error: (e: any) => void; complete: () => void },\n context: AttemptContext\n ): void {\n if (state.aborted) {\n return;\n }\n\n if (attemptNumber < context.config.maxRetries) {\n const retryTimeout = setTimeout(() => {\n this.retryTimeouts.delete(retryKey);\n this.runAttempt<T>(attemptNumber + 1, state, retryKey, subscriber, context);\n }, context.config.retryDelay);\n this.retryTimeouts.set(retryKey, retryTimeout);\n return;\n }\n\n this.showError('hcm.hcmxt_bridge_lib.toast.error.communication_failed_after_retries', {\n attempts: context.config.maxRetries + 1\n });\n subscriber.error(error);\n }\n\n private cancelSendRequest(state: AttemptState, retryKey: string): void {\n state.aborted = true;\n\n // Cancelar retry agendado\n const pendingRetry = this.retryTimeouts.get(retryKey);\n if (pendingRetry) {\n clearTimeout(pendingRetry);\n this.retryTimeouts.delete(retryKey);\n }\n\n // Cancelar tentativa em andamento\n if (state.currentInnerSub) {\n state.currentInnerSub.unsubscribe();\n }\n\n // Limpar requisição pendente no servidor\n if (state.currentRequestId) {\n this.cleanupRequest(state.currentRequestId);\n }\n }\n\n /**\n * Execute a single attempt of the request\n */\n /**\n * Execute a single attempt of the request\n * @param requestId Unique request ID\n * @param action Action name\n * @param payload Payload data\n * @param functionName Backend function name\n * @param timeout Timeout in ms\n * @param chunkSize Chunk size in bytes\n * @param noWait If true, do not wait for a response (fire and forget)\n */\n private executeAttempt<T>(\n requestId: string,\n action: string,\n payload: any,\n functionName: string,\n timeout: number,\n chunkSize: number,\n noWait: boolean\n ): Observable<T> {\n // Create subject for this specific request\n const responseSubject = new Subject<any>();\n this.responseSubjects.set(requestId, responseSubject);\n this.requestOrder.push(requestId);\n\n if (noWait) {\n // Fire and forget: send request via invokeNative with XtBridgeRequest format, do not track response or timeout\n this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);\n\n // Return an observable that completes immediately\n return new Observable<T>((subscriber) => {\n subscriber.complete();\n });\n }\n\n // Set up timeout to prevent hanging requests\n const setupTimeout = setTimeout(() => {\n const subject = this.responseSubjects.get(requestId);\n if (subject) {\n subject.error(new Error(`Request ${requestId} timed out after ${timeout}ms`));\n this.cleanupRequest(requestId);\n }\n }, timeout);\n\n this.requestTimeouts.set(requestId, setupTimeout);\n\n // Send request via invokeNative with XtBridgeRequest format\n this.sendRequestInvokeNative(requestId, action, payload, functionName, chunkSize, responseSubject);\n\n // Return observable that completes after first response\n return responseSubject.asObservable().pipe(\n take(1)\n ) as Observable<T>;\n }\n\n /**\n * Send a request using invokeNative\n * @param requestId Unique request ID\n * @param action Action name\n * @param payload Payload data\n * @param functionName Backend function name\n * @param timeout Timeout in ms\n * @param chunkSize Chunk size in bytes\n * @param responseSubject Subject to emit response or error to\n */\n private sendRequestInvokeNative(\n requestId: string,\n action: string,\n payload: any,\n functionName: string,\n chunkSize: number,\n responseSubject: Subject<any>) {\n if ((globalThis as any).invokeNative) {\n try {\n const request = JSON.stringify({\n \"id\": requestId,\n \"parameters\": [\n { \"parametro\": action },\n { \"parametro\": payload ? JSON.stringify(payload || {}) : \"\" }\n ],\n functionName,\n chunkSize\n });\n\n (globalThis as any).invokeNative(0, `###${request}`);\n } catch (error) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n } else {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.request_send_failed');\n const error = new Error('CEF communication not available');\n responseSubject.error(error);\n this.cleanupRequest(requestId);\n }\n }\n\n /**\n * Handle response from CEF - Thread-safe, prevents response mixing\n */\n private handleResponse(response: XtBridgeResponse): void {\n if (!response) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n const anyResponse: any = response as any;\n\n // Suporte a chunked response (ex: { id?, chunk, seq, last })\n if (anyResponse.chunk) {\n const resolvedId = anyResponse.id || this.requestOrder.at(-1);\n if (!resolvedId) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.invalid_response');\n return;\n }\n\n this.handleChunkResponse(resolvedId, anyResponse);\n return;\n }\n\n if (!response.id) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_missing_id');\n return;\n }\n\n const subject = this.responseSubjects.get(response.id);\n\n this.handleSubject(subject, response);\n }\n\n private handleSubject(subject: Subject<any> | undefined, response: XtBridgeResponse) {\n if (subject) {\n // Clear timeout for this request\n const timeout = this.requestTimeouts.get(response.id);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(response.id);\n }\n\n // Response matched to correct request ID - safe to process\n if (response.success) {\n subject.next(response.data);\n } else {\n subject.error(new Error(response.error ?? 'Server error'));\n }\n subject.complete();\n this.responseSubjects.delete(response.id);\n this.requestOrder = this.requestOrder.filter(id => id !== response.id);\n } else {\n // No matching request ID - could be late/duplicate response\n this.showError('hcm.hcmxt_bridge_lib.toast.error.response_unknown_id', { id: response.id });\n }\n }\n\n /**\n * Handle chunked response from server callback\n * Backend chama resolveFunction múltiplas vezes com chunks\n */\n private handleChunkResponse(requestId: string, chunkResponse: { chunk: string; seq: number; last: boolean }): void {\n const subject = this.responseSubjects.get(requestId);\n if (!subject) {\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_unknown_id', { id: requestId });\n return;\n }\n\n // Inicializar buffer se não existir\n let buffer = this.chunkBuffers.get(requestId);\n if (!buffer) {\n buffer = { chunks: new Map<number, string>() };\n this.chunkBuffers.set(requestId, buffer);\n }\n\n // Armazenar chunk\n buffer.chunks.set(chunkResponse.seq, chunkResponse.chunk);\n\n if (buffer.chunks.size > this.MAX_CHUNKS) {\n subject.error(new Error('Limite de chunks excedido'));\n this.showError('hcm.hcmxt_bridge_lib.toast.error.chunk_limit_exceeded', { id: requestId });\n this.cleanupRequest(requestId);\n return;\n }\n\n // Marcar sequência final se for o último chunk\n if (chunkResponse.last) {\n buffer.lastSeq = chunkResponse.seq;\n }\n\n // Verificar se todos os chunks foram recebidos\n if (buffer.lastSeq !== undefined) {\n // Detectar se é 0-based ou 1-based\n const isZeroBased = buffer.chunks.has(0);\n const expectedSize = isZeroBased ? buffer.lastSeq + 1 : buffer.lastSeq;\n\n // Aguardar todos os chunks\n if (buffer.chunks.size !== expectedSize) {\n return;\n }\n\n // Todos os chunks recebidos - montar resposta final\n const chunksOrdered = Array.from(buffer.chunks.entries())\n .sort((a, b) => a[0] - b[0])\n .map((entry) => entry[1])\n .join('');\n\n try {\n const parsed = JSON.parse(chunksOrdered);\n subject.next(parsed);\n subject.complete();\n this.cleanupRequest(requestId);\n } catch (error) {\n this.showError(this.TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID, { id: requestId });\n subject.error(new Error(`Failed to parse chunked response: ${error}`));\n this.cleanupRequest(requestId);\n }\n }\n }\n\n /**\n * Clean up request tracking\n */\n private cleanupRequest(requestId: string): void {\n this.responseSubjects.delete(requestId);\n this.requestOrder = this.requestOrder.filter(id => id !== requestId);\n this.chunkBuffers.delete(requestId);\n\n const timeout = this.requestTimeouts.get(requestId);\n if (timeout) {\n clearTimeout(timeout);\n this.requestTimeouts.delete(requestId);\n }\n }\n\n /**\n * Get connection status as observable\n */\n getConnectionStatus(): Observable<boolean> {\n return this.connectionStatus.asObservable();\n }\n\n /**\n * Check if CEF is currently available\n */\n isCefAvailable(): boolean {\n return this.connectionStatus.value;\n }\n\n /**\n * Cleanup pending requests (call on component destroy)\n */\n cleanup(): void {\n this.responseSubjects.forEach((subject) => {\n subject.error(new Error('Service cleanup - request cancelled'));\n subject.complete();\n });\n this.responseSubjects.clear();\n\n // Clear all timeouts\n this.requestTimeouts.forEach(timeout => clearTimeout(timeout));\n this.requestTimeouts.clear();\n\n // Clear pending retries\n this.retryTimeouts.forEach(timeout => clearTimeout(timeout));\n this.retryTimeouts.clear();\n }\n\n /**\n * Get debug info about pending requests\n */\n getDebugInfo(): { pendingRequests: number; activeTimeouts: number } {\n return {\n pendingRequests: this.responseSubjects.size,\n activeTimeouts: this.requestTimeouts.size\n };\n }\n\n /**\n * Display a localized error toast message\n */\n private showError(key: string, params?: Record<string, string | number>): void {\n this.messageService.add({\n severity: 'error',\n summary: this.translationService.translate('hcm.hcmxt_bridge_lib.toast.error.summary'),\n detail: this.translationService.translate(key, params)\n });\n }\n}\n","/*\n * Public API Surface of hcmxt-bridge-lib\n */\n\n// Services\nexport { XtBridgeService, XtBridgeRequest, XtBridgeResponse, BridgeConfig } from './lib/services/xt-bridge.service';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,7 @@ export interface BridgeConfig {
|
|
|
19
19
|
chunkSize?: number;
|
|
20
20
|
maxRetries?: number;
|
|
21
21
|
retryDelay?: number;
|
|
22
|
+
noWait?: boolean;
|
|
22
23
|
}
|
|
23
24
|
declare global {
|
|
24
25
|
interface Window {
|
|
@@ -43,6 +44,7 @@ export declare class XtBridgeService {
|
|
|
43
44
|
private readonly MAX_CHUNKS;
|
|
44
45
|
private readonly DEFAULT_MAX_RETRIES;
|
|
45
46
|
private readonly DEFAULT_RETRY_DELAY;
|
|
47
|
+
private readonly DEFAULT_NO_WAIT;
|
|
46
48
|
private readonly TOAST_ERROR_RESPONSE_PROCESS_FAILED_WITH_ID;
|
|
47
49
|
private readonly retryTimeouts;
|
|
48
50
|
constructor();
|
|
@@ -88,7 +90,28 @@ export declare class XtBridgeService {
|
|
|
88
90
|
/**
|
|
89
91
|
* Execute a single attempt of the request
|
|
90
92
|
*/
|
|
93
|
+
/**
|
|
94
|
+
* Execute a single attempt of the request
|
|
95
|
+
* @param requestId Unique request ID
|
|
96
|
+
* @param action Action name
|
|
97
|
+
* @param payload Payload data
|
|
98
|
+
* @param functionName Backend function name
|
|
99
|
+
* @param timeout Timeout in ms
|
|
100
|
+
* @param chunkSize Chunk size in bytes
|
|
101
|
+
* @param noWait If true, do not wait for a response (fire and forget)
|
|
102
|
+
*/
|
|
91
103
|
private executeAttempt;
|
|
104
|
+
/**
|
|
105
|
+
* Send a request using invokeNative
|
|
106
|
+
* @param requestId Unique request ID
|
|
107
|
+
* @param action Action name
|
|
108
|
+
* @param payload Payload data
|
|
109
|
+
* @param functionName Backend function name
|
|
110
|
+
* @param timeout Timeout in ms
|
|
111
|
+
* @param chunkSize Chunk size in bytes
|
|
112
|
+
* @param responseSubject Subject to emit response or error to
|
|
113
|
+
*/
|
|
114
|
+
private sendRequestInvokeNative;
|
|
92
115
|
/**
|
|
93
116
|
* Handle response from CEF - Thread-safe, prevents response mixing
|
|
94
117
|
*/
|
package/package.json
CHANGED