@messaia/cdk 18.1.0 → 18.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -20,55 +20,56 @@ export class BaseInterceptor {
20
20
  this.snackBar = snackBar;
21
21
  }
22
22
  /**
23
- * Intercept an outgoing `HttpRequest` and optionally transform it or the
23
+ * Intercepts an outgoing `HttpRequest` and optionally transforms it or the
24
24
  * response.
25
25
  *
26
26
  * Typically an interceptor will transform the outgoing request before returning
27
- * `next.handle(transformedReq)`. An interceptor may choose to transform the
28
- * response event stream as well, by applying additional Rx operators on the stream
29
- * returned by `next.handle()`.
27
+ * `next.handle(transformedReq)`. An interceptor may also choose to transform the
28
+ * response event stream by applying additional Rx operators.
30
29
  *
31
- * More rarely, an interceptor may choose to completely handle the request itself,
32
- * and compose a new event stream instead of invoking `next.handle()`. This is
33
- * acceptable behavior, but keep in mind further interceptors will be skipped entirely.
30
+ * In rare cases, an interceptor may completely handle the request itself,
31
+ * creating a new event stream and bypassing `next.handle()`. This is allowed,
32
+ * but it means that other interceptors will not be triggered.
34
33
  *
35
- * It is also rare but valid for an interceptor to return multiple responses on the
36
- * event stream for a single request.
34
+ * It's also possible, though rare, for an interceptor to return multiple responses
35
+ * on the event stream for a single request.
37
36
  */
38
37
  intercept(req, next) {
39
- /* Clone the request and set the base url */
38
+ /* Clone the request and set the base URL if it's not already an absolute URL */
40
39
  const authReq = req.clone({
41
- url: req.url.startsWith('http') || req.url.startsWith('./assets') ? req.url : `${this.appSetting.apiUrl}${req.url}`,
40
+ /* Check if the URL is already absolute or starts with './assets' */
41
+ url: req.url.startsWith('http') || req.url.startsWith('./assets')
42
+ ? req.url : `${this.appSetting.apiUrl}${req.url}`,
43
+ /* Add a custom header for GET requests */
42
44
  headers: req.method == 'GET' ? req.headers.set('CheckIn', 'Yes') : req.headers
43
45
  });
44
- /* Send cloned request with header to the next handler */
46
+ /* Send the cloned request with added headers to the next handler in the chain */
45
47
  return next.handle(authReq).pipe(tap(
46
- /* Succeeds when there is a response; ignore other events */
48
+ /* Handle the response */
47
49
  event => {
48
50
  if (event instanceof HttpResponse) {
51
+ /* Check for specific headers in the response */
49
52
  if (req.headers.get('Show-Message')) {
50
- /* Show a success message for POST requests */
53
+ /* Show success messages for different types of requests */
51
54
  if (req.method == 'POST') {
52
55
  this.snackBar.open($localize `:@@snackbar.send.success:Data sent successfully.`, undefined, {
53
56
  duration: 3000,
54
57
  panelClass: ['primary']
55
58
  });
56
59
  }
57
- /* Show a success message for PUT or PATCH requests */
58
60
  if (['PUT', 'PATCH'].indexOf(req.method) >= 0) {
59
61
  this.snackBar.open($localize `:@@snackbar.update.success:Changes saved successfully.`, undefined, {
60
62
  duration: 3000,
61
63
  panelClass: ['primary']
62
64
  });
63
65
  }
64
- /* Show a success message for PUT or PATCH requests */
65
66
  if (['DELETE'].indexOf(req.method) >= 0) {
66
67
  this.snackBar.open($localize `:@@snackbar.delete.success:Record(s) deleted successfully.`, undefined, {
67
68
  duration: 3000,
68
69
  panelClass: ['primary']
69
70
  });
70
71
  }
71
- /* Show warnings from headers, if any */
72
+ /* Show warnings from response headers if available */
72
73
  var warning = event.headers.get("Warning");
73
74
  if (warning) {
74
75
  this.snackBar.open(warning, "OK", { duration: 6000, panelClass: ['warn'] });
@@ -76,58 +77,85 @@ export class BaseInterceptor {
76
77
  }
77
78
  }
78
79
  },
79
- /* Operation failed; error is an HttpErrorResponse */
80
+ /* Handle errors */
80
81
  error => {
81
- /* Status: 400 - Bad Request (i.e. validation errors) */
82
+ /* Handle validation errors for status code 400 (Bad Request) */
82
83
  if (error.status == 400) {
83
84
  let message = this.parseErrors(error.error);
84
85
  if (message) {
85
86
  this.snackBar.open(message, "OK", { duration: 8000, panelClass: ['error'] });
86
87
  }
87
88
  }
88
- /* Status: 403 - Not permitted */
89
+ /* Handle permission errors for status code 403 (Forbidden) */
89
90
  if (error.status == 403) {
90
91
  this.snackBar.open($localize `:@@snackbar.error.not-allowed:You are not allowed to perform this request.`, undefined, {
91
92
  duration: 6000,
92
93
  panelClass: ['error']
93
94
  });
94
95
  }
95
- /* Status: 404 - Bad request, show some error messages */
96
+ /* Handle not found errors for status code 404 (Not Found) */
96
97
  if (error.status == 404) {
97
98
  this.snackBar.open($localize `:@@snackbar.error.not-found:The resource could not be found.`, undefined, {
98
99
  duration: 6000,
99
100
  panelClass: ['error']
100
101
  });
101
102
  }
102
- /* Custom error message */
103
+ /* Handle custom error message for status code 452 */
103
104
  if (error.status == 452) {
104
105
  this.snackBar.open(error.text(), undefined, { duration: 6000, panelClass: ['error'] });
105
106
  }
106
- /* Internal server error */
107
+ /* Handle internal server errors for status code 500 */
107
108
  if (error.status == 500) {
108
109
  this.snackBar.open(error.text(), undefined, { duration: 6000, panelClass: ['error'] });
109
110
  }
110
111
  }));
111
112
  }
112
113
  /**
113
- * Parses http response errors
114
- * @param error
114
+ * Parses HTTP response errors and extracts the error messages.
115
+ * Handles both ArrayBuffer and structured error objects.
116
+ *
117
+ * @param error The error object to parse, which could be an ArrayBuffer or a structured error object.
118
+ * @returns A string containing all error messages, joined by new lines.
115
119
  */
116
120
  parseErrors(error) {
117
121
  let errors = [];
122
+ /* Check if error exists before processing */
118
123
  if (error) {
119
- Object.keys(error).forEach(el => {
120
- let err = error[el];
121
- if (Array.isArray(err)) {
122
- err.forEach(err => {
123
- errors.push(err);
124
- });
124
+ /* If the error is an ArrayBuffer, attempt to decode and parse it */
125
+ if (error instanceof ArrayBuffer) {
126
+ try {
127
+ /* Decode the ArrayBuffer to a string and then parse the JSON */
128
+ error = JSON.parse(new TextDecoder().decode(new Uint8Array(error)));
125
129
  }
126
- else if (typeof err === "string") {
127
- errors.push(err);
130
+ catch (err) {
131
+ /* Log the error if JSON parsing fails */
132
+ console.error("Error parsing ArrayBuffer:", err);
133
+ /* Return a generic message if parsing fails */
134
+ return "Failed to parse error details.";
128
135
  }
129
- });
136
+ }
137
+ /* Ensure the error is an object (for structured error responses) */
138
+ if (typeof error === 'object') {
139
+ /* Iterate over the keys of the error object */
140
+ Object.keys(error).forEach(el => {
141
+ let err = error[el];
142
+ /* If the value is an array, iterate over each element */
143
+ if (Array.isArray(err)) {
144
+ err.forEach(e => {
145
+ /* Ensure each element is a string before adding to errors */
146
+ if (typeof e === 'string') {
147
+ errors.push(e);
148
+ }
149
+ });
150
+ }
151
+ else if (typeof err === 'string') {
152
+ /* If the value is a string, add it directly to the errors list */
153
+ errors.push(err);
154
+ }
155
+ });
156
+ }
130
157
  }
158
+ /* Join the error messages with newlines and return the result */
131
159
  return errors.join('\n');
132
160
  }
133
161
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: BaseInterceptor, deps: [{ token: i1.AppSetting }, { token: i2.MatSnackBar }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -137,4 +165,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
137
165
  type: Injectable,
138
166
  args: [{ providedIn: 'root' }]
139
167
  }], ctorParameters: () => [{ type: i1.AppSetting }, { type: i2.MatSnackBar }] });
140
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay9zcmMvbGliL2Jhc2UvaW50ZXJjZXB0b3JzL2Jhc2UuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3RCxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBRTdEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFLUDtJQUFnQztJQUhwRDs7T0FFRztJQUNILFlBQW9CLFVBQXNCLEVBQVUsUUFBcUI7UUFBckQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7SUFBSSxDQUFDO0lBRTlFOzs7Ozs7Ozs7Ozs7Ozs7T0FlRztJQUNILFNBQVMsQ0FBQyxHQUFxQixFQUFFLElBQWlCO1FBRWpELDRDQUE0QztRQUM1QyxNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO1lBQ3pCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ25ILE9BQU8sRUFBRSxHQUFHLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMs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QUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3hCLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ2xCLENBQUMsQ0FBQyxDQUFDO2dCQUNKLENBQUM7cUJBQU0sSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbEIsQ0FBQztZQUNGLENBQUMsQ0FBQyxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixDQUFDOzBIQWxJVyxlQUFlOzhIQUFmLGVBQWUsY0FERixNQUFNOzsyRkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgQXBwU2V0dGluZyB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvYXBwLXNldHRpbmcnO1xyXG5cclxuLyoqXHJcbiAqIFBhc3MgdW50b3VjaGVkIHJlcXVlc3QgdGhyb3VnaCB0byB0aGUgbmV4dCByZXF1ZXN0IGhhbmRsZXIuXHJcbiAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgQmFzZUludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3JcclxuXHQgKi9cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcFNldHRpbmc6IEFwcFNldHRpbmcsIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyKSB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogSW50ZXJjZXB0IGFuIG91dGdvaW5nIGBIdHRwUmVxdWVzdGAgYW5kIG9wdGlvbmFsbHkgdHJhbnNmb3JtIGl0IG9yIHRoZVxyXG5cdCAqIHJlc3BvbnNlLlxyXG5cdCAqXHJcblx0ICogVHlwaWNhbGx5IGFuIGludGVyY2VwdG9yIHdpbGwgdHJhbnNmb3JtIHRoZSBvdXRnb2luZyByZXF1ZXN0IGJlZm9yZSByZXR1cm5pbmdcclxuXHQgKiBgbmV4dC5oYW5kbGUodHJhbnNmb3JtZWRSZXEpYC4gQW4gaW50ZXJjZXB0b3IgbWF5IGNob29zZSB0byB0cmFuc2Zvcm0gdGhlXHJcblx0ICogcmVzcG9uc2UgZXZlbnQgc3RyZWFtIGFzIHdlbGwsIGJ5IGFwcGx5aW5nIGFkZGl0aW9uYWwgUnggb3BlcmF0b3JzIG9uIHRoZSBzdHJlYW1cclxuXHQgKiByZXR1cm5lZCBieSBgbmV4dC5oYW5kbGUoKWAuXHJcblx0ICpcclxuXHQgKiBNb3JlIHJhcmVseSwgYW4gaW50ZXJjZXB0b3IgbWF5IGNob29zZSB0byBjb21wbGV0ZWx5IGhhbmRsZSB0aGUgcmVxdWVzdCBpdHNlbGYsXHJcblx0ICogYW5kIGNvbXBvc2UgYSBuZXcgZXZlbnQgc3RyZWFtIGluc3RlYWQgb2YgaW52b2tpbmcgYG5leHQuaGFuZGxlKClgLiBUaGlzIGlzXHJcblx0ICogYWNjZXB0YWJsZSBiZWhhdmlvciwgYnV0IGtlZXAgaW4gbWluZCBmdXJ0aGVyIGludGVyY2VwdG9ycyB3aWxsIGJlIHNraXBwZWQgZW50aXJlbHkuXHJcblx0ICpcclxuXHQgKiBJdCBpcyBhbHNvIHJhcmUgYnV0IHZhbGlkIGZvciBhbiBpbnRlcmNlcHRvciB0byByZXR1cm4gbXVsdGlwbGUgcmVzcG9uc2VzIG9uIHRoZVxyXG5cdCAqIGV2ZW50IHN0cmVhbSBmb3IgYSBzaW5nbGUgcmVxdWVzdC5cclxuXHQgKi9cclxuXHRpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuXHJcblx0XHQvKiBDbG9uZSB0aGUgcmVxdWVzdCBhbmQgc2V0IHRoZSBiYXNlIHVybCAqL1xyXG5cdFx0Y29uc3QgYXV0aFJlcSA9IHJlcS5jbG9uZSh7XHJcblx0XHRcdHVybDogcmVxLnVybC5zdGFydHNXaXRoKCdodHRwJykgfHwgcmVxLnVybC5zdGFydHNXaXRoKCcuL2Fzc2V0cycpID8gcmVxLnVybCA6IGAke3RoaXMuYXBwU2V0dGluZy5hcGlVcmx9JHtyZXEudXJsfWAsXHJcblx0XHRcdGhlYWRlcnM6IHJlcS5tZXRob2QgPT0gJ0dFVCcgPyByZXEuaGVhZGVycy5zZXQoJ0NoZWNrSW4nLCAnWWVzJykgOiByZXEuaGVhZGVyc1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogU2VuZCBjbG9uZWQgcmVxdWVzdCB3aXRoIGhlYWRlciB0byB0aGUgbmV4dCBoYW5kbGVyICovXHJcblx0XHRyZXR1cm4gbmV4dC5oYW5kbGUoYXV0aFJlcSkucGlwZShcclxuXHRcdFx0dGFwKFxyXG5cdFx0XHRcdC8qIFN1Y2NlZWRzIHdoZW4gdGhlcmUgaXMgYSByZXNwb25zZTsgaWdub3JlIG90aGVyIGV2ZW50cyAqL1xyXG5cdFx0XHRcdGV2ZW50ID0+IHtcclxuXHRcdFx0XHRcdGlmIChldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0XHRpZiAocmVxLmhlYWRlcnMuZ2V0KCdTaG93LU1lc3NhZ2UnKSkge1xyXG5cdFx0XHRcdFx0XHRcdC8qIFNob3cgYSBzdWNjZXNzIG1lc3NhZ2UgZm9yIFBPU1QgcmVxdWVzdHMgKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAocmVxLm1ldGhvZCA9PSAnUE9TVCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbigkbG9jYWxpemVgOkBAc25hY2tiYXIuc2VuZC5zdWNjZXNzOkRhdGEgc2VudCBzdWNjZXNzZnVsbHkuYCwgdW5kZWZpbmVkLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiAzMDAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwYW5lbENsYXNzOiBbJ3ByaW1hcnknXVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHQvKiBTaG93IGEgc3VjY2VzcyBtZXNzYWdlIGZvciBQVVQgb3IgUEFUQ0ggcmVxdWVzdHMgKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAoWydQVVQnLCAnUEFUQ0gnXS5pbmRleE9mKHJlcS5tZXRob2QpID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbigkbG9jYWxpemVgOkBAc25hY2tiYXIudXBkYXRlLnN1Y2Nlc3M6Q2hhbmdlcyBzYXZlZCBzdWNjZXNzZnVsbHkuYCwgdW5kZWZpbmVkLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiAzMDAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwYW5lbENsYXNzOiBbJ3ByaW1hcnknXVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogU2hvdyBhIHN1Y2Nlc3MgbWVzc2FnZSBmb3IgUFVUIG9yIFBBVENIIHJlcXVlc3RzICovXHJcblx0XHRcdFx0XHRcdFx0aWYgKFsnREVMRVRFJ10uaW5kZXhPZihyZXEubWV0aG9kKSA+PSAwKSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oJGxvY2FsaXplYDpAQHNuYWNrYmFyLmRlbGV0ZS5zdWNjZXNzOlJlY29yZChzKSBkZWxldGVkIHN1Y2Nlc3NmdWxseS5gLCB1bmRlZmluZWQsIHtcclxuXHRcdFx0XHRcdFx0XHRcdFx0ZHVyYXRpb246IDMwMDAsXHJcblx0XHRcdFx0XHRcdFx0XHRcdHBhbmVsQ2xhc3M6IFsncHJpbWFyeSddXHJcblx0XHRcdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0XHRcdC8qIFNob3cgd2FybmluZ3MgZnJvbSBoZWFkZXJzLCBpZiBhbnkgKi9cclxuXHRcdFx0XHRcdFx0XHR2YXIgd2FybmluZyA9IGV2ZW50LmhlYWRlcnMuZ2V0KFwiV2FybmluZ1wiKTtcclxuXHRcdFx0XHRcdFx0XHRpZiAod2FybmluZykge1xyXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKHdhcm5pbmcsIFwiT0tcIiwgeyBkdXJhdGlvbjogNjAwMCwgcGFuZWxDbGFzczogWyd3YXJuJ10gfSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBPcGVyYXRpb24gZmFpbGVkOyBlcnJvciBpcyBhbiBIdHRwRXJyb3JSZXNwb25zZSAqL1xyXG5cdFx0XHRcdGVycm9yID0+IHtcclxuXHRcdFx0XHRcdC8qIFN0YXR1czogNDAwIC0gQmFkIFJlcXVlc3QgKGkuZS4gdmFsaWRhdGlvbiBlcnJvcnMpICovXHJcblx0XHRcdFx0XHRpZiAoZXJyb3Iuc3RhdHVzID09IDQwMCkge1xyXG5cdFx0XHRcdFx0XHRsZXQgbWVzc2FnZSA9IHRoaXMucGFyc2VFcnJvcnMoZXJyb3IuZXJyb3IpO1xyXG5cdFx0XHRcdFx0XHRpZiAobWVzc2FnZSkge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbihtZXNzYWdlLCBcIk9LXCIsIHsgZHVyYXRpb246IDgwMDAsIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9KVxyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogU3RhdHVzOiA0MDMgLSAgTm90IHBlcm1pdHRlZCAqL1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yLnN0YXR1cyA9PSA0MDMpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKCRsb2NhbGl6ZWA6QEBzbmFja2Jhci5lcnJvci5ub3QtYWxsb3dlZDpZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIHBlcmZvcm0gdGhpcyByZXF1ZXN0LmAsIHVuZGVmaW5lZCwge1xyXG5cdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiA2MDAwLFxyXG5cdFx0XHRcdFx0XHRcdHBhbmVsQ2xhc3M6IFsnZXJyb3InXVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBTdGF0dXM6IDQwNCAtICBCYWQgcmVxdWVzdCwgc2hvdyBzb21lIGVycm9yIG1lc3NhZ2VzICovXHJcblx0XHRcdFx0XHRpZiAoZXJyb3Iuc3RhdHVzID09IDQwNCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oJGxvY2FsaXplYDpAQHNuYWNrYmFyLmVycm9yLm5vdC1mb3VuZDpUaGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kLmAsIHVuZGVmaW5lZCwge1xyXG5cdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiA2MDAwLFxyXG5cdFx0XHRcdFx0XHRcdHBhbmVsQ2xhc3M6IFsnZXJyb3InXVxyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHQvKiBDdXN0b20gZXJyb3IgbWVzc2FnZSAqL1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yLnN0YXR1cyA9PSA0NTIpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKGVycm9yLnRleHQoKSwgdW5kZWZpbmVkLCB7IGR1cmF0aW9uOiA2MDAwLCBwYW5lbENsYXNzOiBbJ2Vycm9yJ10gfSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSW50ZXJuYWwgc2VydmVyIGVycm9yICovXHJcblx0XHRcdFx0XHRpZiAoZXJyb3Iuc3RhdHVzID09IDUwMCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3IudGV4dCgpLCB1bmRlZmluZWQsIHsgZHVyYXRpb246IDYwMDAsIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyBodHRwIHJlc3BvbnNlIGVycm9yc1xyXG5cdCAqIEBwYXJhbSBlcnJvciBcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgcGFyc2VFcnJvcnMoZXJyb3I6IE9iamVjdCk6IHN0cmluZyB7XHJcblx0XHRsZXQgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xyXG5cdFx0aWYgKGVycm9yKSB7XHJcblx0XHRcdE9iamVjdC5rZXlzKGVycm9yKS5mb3JFYWNoKGVsID0+IHtcclxuXHRcdFx0XHRsZXQgZXJyID0gKGVycm9yIGFzIGFueSlbZWxdO1xyXG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGVycikpIHtcclxuXHRcdFx0XHRcdGVyci5mb3JFYWNoKGVyciA9PiB7XHJcblx0XHRcdFx0XHRcdGVycm9ycy5wdXNoKGVycik7XHJcblx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBlcnIgPT09IFwic3RyaW5nXCIpIHtcclxuXHRcdFx0XHRcdGVycm9ycy5wdXNoKGVycik7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gZXJyb3JzLmpvaW4oJ1xcbicpO1xyXG5cdH1cclxufSJdfQ==
168
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5pbnRlcmNlcHRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Nkay9zcmMvbGliL2Jhc2UvaW50ZXJjZXB0b3JzL2Jhc2UuaW50ZXJjZXB0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUF3RCxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7O0FBRTdEOztHQUVHO0FBRUgsTUFBTSxPQUFPLGVBQWU7SUFLUDtJQUFnQztJQUhwRDs7T0FFRztJQUNILFlBQW9CLFVBQXNCLEVBQVUsUUFBcUI7UUFBckQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7SUFBSSxDQUFDO0lBRTlFOzs7Ozs7Ozs7Ozs7OztPQWNHO0lBQ0ksU0FBUyxDQUFDLEdBQXFCLEVBQUUsSUFBaUI7UUFFeEQsZ0ZBQWdGO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDekIsb0VBQW9FO1lBQ3BFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUM7Z0JBQ2hFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDbEQsMENBQTBDO1lBQzFDLE9BQU8sRUFBRSxHQUFHLENBQUMsTUFB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OEhBQWYsZUFBZSxjQURGLE1BQU07OzJGQUNuQixlQUFlO2tCQUQzQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBBcHBTZXR0aW5nIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9hcHAtc2V0dGluZyc7XHJcblxyXG4vKipcclxuICogUGFzcyB1bnRvdWNoZWQgcmVxdWVzdCB0aHJvdWdoIHRvIHRoZSBuZXh0IHJlcXVlc3QgaGFuZGxlci5cclxuICovXHJcbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3Ige1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvclxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwU2V0dGluZzogQXBwU2V0dGluZywgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIpIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBJbnRlcmNlcHRzIGFuIG91dGdvaW5nIGBIdHRwUmVxdWVzdGAgYW5kIG9wdGlvbmFsbHkgdHJhbnNmb3JtcyBpdCBvciB0aGVcclxuXHQgKiByZXNwb25zZS5cclxuXHQgKlxyXG5cdCAqIFR5cGljYWxseSBhbiBpbnRlcmNlcHRvciB3aWxsIHRyYW5zZm9ybSB0aGUgb3V0Z29pbmcgcmVxdWVzdCBiZWZvcmUgcmV0dXJuaW5nXHJcblx0ICogYG5leHQuaGFuZGxlKHRyYW5zZm9ybWVkUmVxKWAuIEFuIGludGVyY2VwdG9yIG1heSBhbHNvIGNob29zZSB0byB0cmFuc2Zvcm0gdGhlXHJcblx0ICogcmVzcG9uc2UgZXZlbnQgc3RyZWFtIGJ5IGFwcGx5aW5nIGFkZGl0aW9uYWwgUnggb3BlcmF0b3JzLlxyXG5cdCAqXHJcblx0ICogSW4gcmFyZSBjYXNlcywgYW4gaW50ZXJjZXB0b3IgbWF5IGNvbXBsZXRlbHkgaGFuZGxlIHRoZSByZXF1ZXN0IGl0c2VsZixcclxuXHQgKiBjcmVhdGluZyBhIG5ldyBldmVudCBzdHJlYW0gYW5kIGJ5cGFzc2luZyBgbmV4dC5oYW5kbGUoKWAuIFRoaXMgaXMgYWxsb3dlZCxcclxuXHQgKiBidXQgaXQgbWVhbnMgdGhhdCBvdGhlciBpbnRlcmNlcHRvcnMgd2lsbCBub3QgYmUgdHJpZ2dlcmVkLlxyXG5cdCAqXHJcblx0ICogSXQncyBhbHNvIHBvc3NpYmxlLCB0aG91Z2ggcmFyZSwgZm9yIGFuIGludGVyY2VwdG9yIHRvIHJldHVybiBtdWx0aXBsZSByZXNwb25zZXNcclxuXHQgKiBvbiB0aGUgZXZlbnQgc3RyZWFtIGZvciBhIHNpbmdsZSByZXF1ZXN0LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcclxuXHJcblx0XHQvKiBDbG9uZSB0aGUgcmVxdWVzdCBhbmQgc2V0IHRoZSBiYXNlIFVSTCBpZiBpdCdzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTCAqL1xyXG5cdFx0Y29uc3QgYXV0aFJlcSA9IHJlcS5jbG9uZSh7XHJcblx0XHRcdC8qIENoZWNrIGlmIHRoZSBVUkwgaXMgYWxyZWFkeSBhYnNvbHV0ZSBvciBzdGFydHMgd2l0aCAnLi9hc3NldHMnICovXHJcblx0XHRcdHVybDogcmVxLnVybC5zdGFydHNXaXRoKCdodHRwJykgfHwgcmVxLnVybC5zdGFydHNXaXRoKCcuL2Fzc2V0cycpXHJcblx0XHRcdFx0PyByZXEudXJsIDogYCR7dGhpcy5hcHBTZXR0aW5nLmFwaVVybH0ke3JlcS51cmx9YCxcclxuXHRcdFx0LyogQWRkIGEgY3VzdG9tIGhlYWRlciBmb3IgR0VUIHJlcXVlc3RzICovXHJcblx0XHRcdGhlYWRlcnM6IHJlcS5tZXRob2QgPT0gJ0dFVCcgPyByZXEuaGVhZGVycy5zZXQoJ0NoZWNrSW4nLCAnWWVzJykgOiByZXEuaGVhZGVyc1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogU2VuZCB0aGUgY2xvbmVkIHJlcXVlc3Qgd2l0aCBhZGRlZCBoZWFkZXJzIHRvIHRoZSBuZXh0IGhhbmRsZXIgaW4gdGhlIGNoYWluICovXHJcblx0XHRyZXR1cm4gbmV4dC5oYW5kbGUoYXV0aFJlcSkucGlwZShcclxuXHRcdFx0dGFwKFxyXG5cdFx0XHRcdC8qIEhhbmRsZSB0aGUgcmVzcG9uc2UgKi9cclxuXHRcdFx0XHRldmVudCA9PiB7XHJcblx0XHRcdFx0XHRpZiAoZXZlbnQgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHtcclxuXHRcdFx0XHRcdFx0LyogQ2hlY2sgZm9yIHNwZWNpZmljIGhlYWRlcnMgaW4gdGhlIHJlc3BvbnNlICovXHJcblx0XHRcdFx0XHRcdGlmIChyZXEuaGVhZGVycy5nZXQoJ1Nob3ctTWVzc2FnZScpKSB7XHJcblx0XHRcdFx0XHRcdFx0LyogU2hvdyBzdWNjZXNzIG1lc3NhZ2VzIGZvciBkaWZmZXJlbnQgdHlwZXMgb2YgcmVxdWVzdHMgKi9cclxuXHRcdFx0XHRcdFx0XHRpZiAocmVxLm1ldGhvZCA9PSAnUE9TVCcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbigkbG9jYWxpemVgOkBAc25hY2tiYXIuc2VuZC5zdWNjZXNzOkRhdGEgc2VudCBzdWNjZXNzZnVsbHkuYCwgdW5kZWZpbmVkLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiAzMDAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwYW5lbENsYXNzOiBbJ3ByaW1hcnknXVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoWydQVVQnLCAnUEFUQ0gnXS5pbmRleE9mKHJlcS5tZXRob2QpID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbigkbG9jYWxpemVgOkBAc25hY2tiYXIudXBkYXRlLnN1Y2Nlc3M6Q2hhbmdlcyBzYXZlZCBzdWNjZXNzZnVsbHkuYCwgdW5kZWZpbmVkLCB7XHJcblx0XHRcdFx0XHRcdFx0XHRcdGR1cmF0aW9uOiAzMDAwLFxyXG5cdFx0XHRcdFx0XHRcdFx0XHRwYW5lbENsYXNzOiBbJ3ByaW1hcnknXVxyXG5cdFx0XHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdFx0XHRpZiAoWydERUxFVEUnXS5pbmRleE9mKHJlcS5tZXRob2QpID49IDApIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbigkbG9jYWxpemVgOkBAc25hY2tiYXIuZGVsZXRlLnN1Y2Nlc3M6UmVjb3JkKHMpIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LmAsIHVuZGVmaW5lZCwge1xyXG5cdFx0XHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogMzAwMCxcclxuXHRcdFx0XHRcdFx0XHRcdFx0cGFuZWxDbGFzczogWydwcmltYXJ5J11cclxuXHRcdFx0XHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0XHRcdFx0LyogU2hvdyB3YXJuaW5ncyBmcm9tIHJlc3BvbnNlIGhlYWRlcnMgaWYgYXZhaWxhYmxlICovXHJcblx0XHRcdFx0XHRcdFx0dmFyIHdhcm5pbmcgPSBldmVudC5oZWFkZXJzLmdldChcIldhcm5pbmdcIik7XHJcblx0XHRcdFx0XHRcdFx0aWYgKHdhcm5pbmcpIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3Blbih3YXJuaW5nLCBcIk9LXCIsIHsgZHVyYXRpb246IDYwMDAsIHBhbmVsQ2xhc3M6IFsnd2FybiddIH0pO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblx0XHRcdFx0LyogSGFuZGxlIGVycm9ycyAqL1xyXG5cdFx0XHRcdGVycm9yID0+IHtcclxuXHRcdFx0XHRcdC8qIEhhbmRsZSB2YWxpZGF0aW9uIGVycm9ycyBmb3Igc3RhdHVzIGNvZGUgNDAwIChCYWQgUmVxdWVzdCkgKi9cclxuXHRcdFx0XHRcdGlmIChlcnJvci5zdGF0dXMgPT0gNDAwKSB7XHJcblx0XHRcdFx0XHRcdGxldCBtZXNzYWdlID0gdGhpcy5wYXJzZUVycm9ycyhlcnJvci5lcnJvcik7XHJcblx0XHRcdFx0XHRcdGlmIChtZXNzYWdlKSB7XHJcblx0XHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKG1lc3NhZ2UsIFwiT0tcIiwgeyBkdXJhdGlvbjogODAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH0pO1xyXG5cdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSGFuZGxlIHBlcm1pc3Npb24gZXJyb3JzIGZvciBzdGF0dXMgY29kZSA0MDMgKEZvcmJpZGRlbikgKi9cclxuXHRcdFx0XHRcdGlmIChlcnJvci5zdGF0dXMgPT0gNDAzKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbigkbG9jYWxpemVgOkBAc25hY2tiYXIuZXJyb3Iubm90LWFsbG93ZWQ6WW91IGFyZSBub3QgYWxsb3dlZCB0byBwZXJmb3JtIHRoaXMgcmVxdWVzdC5gLCB1bmRlZmluZWQsIHtcclxuXHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogNjAwMCxcclxuXHRcdFx0XHRcdFx0XHRwYW5lbENsYXNzOiBbJ2Vycm9yJ11cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSGFuZGxlIG5vdCBmb3VuZCBlcnJvcnMgZm9yIHN0YXR1cyBjb2RlIDQwNCAoTm90IEZvdW5kKSAqL1xyXG5cdFx0XHRcdFx0aWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zbmFja0Jhci5vcGVuKCRsb2NhbGl6ZWA6QEBzbmFja2Jhci5lcnJvci5ub3QtZm91bmQ6VGhlIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZC5gLCB1bmRlZmluZWQsIHtcclxuXHRcdFx0XHRcdFx0XHRkdXJhdGlvbjogNjAwMCxcclxuXHRcdFx0XHRcdFx0XHRwYW5lbENsYXNzOiBbJ2Vycm9yJ11cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdFx0LyogSGFuZGxlIGN1c3RvbSBlcnJvciBtZXNzYWdlIGZvciBzdGF0dXMgY29kZSA0NTIgKi9cclxuXHRcdFx0XHRcdGlmIChlcnJvci5zdGF0dXMgPT0gNDUyKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbihlcnJvci50ZXh0KCksIHVuZGVmaW5lZCwgeyBkdXJhdGlvbjogNjAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIEhhbmRsZSBpbnRlcm5hbCBzZXJ2ZXIgZXJyb3JzIGZvciBzdGF0dXMgY29kZSA1MDAgKi9cclxuXHRcdFx0XHRcdGlmIChlcnJvci5zdGF0dXMgPT0gNTAwKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc25hY2tCYXIub3BlbihlcnJvci50ZXh0KCksIHVuZGVmaW5lZCwgeyBkdXJhdGlvbjogNjAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH0pO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0KVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhcnNlcyBIVFRQIHJlc3BvbnNlIGVycm9ycyBhbmQgZXh0cmFjdHMgdGhlIGVycm9yIG1lc3NhZ2VzLlxyXG5cdCAqIEhhbmRsZXMgYm90aCBBcnJheUJ1ZmZlciBhbmQgc3RydWN0dXJlZCBlcnJvciBvYmplY3RzLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3Igb2JqZWN0IHRvIHBhcnNlLCB3aGljaCBjb3VsZCBiZSBhbiBBcnJheUJ1ZmZlciBvciBhIHN0cnVjdHVyZWQgZXJyb3Igb2JqZWN0LlxyXG5cdCAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGVycm9yIG1lc3NhZ2VzLCBqb2luZWQgYnkgbmV3IGxpbmVzLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBwYXJzZUVycm9ycyhlcnJvcjogT2JqZWN0KTogc3RyaW5nIHtcclxuXHRcdGxldCBlcnJvcnM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdFx0LyogQ2hlY2sgaWYgZXJyb3IgZXhpc3RzIGJlZm9yZSBwcm9jZXNzaW5nICovXHJcblx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0LyogSWYgdGhlIGVycm9yIGlzIGFuIEFycmF5QnVmZmVyLCBhdHRlbXB0IHRvIGRlY29kZSBhbmQgcGFyc2UgaXQgKi9cclxuXHRcdFx0aWYgKGVycm9yIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcclxuXHRcdFx0XHR0cnkge1xyXG5cdFx0XHRcdFx0LyogRGVjb2RlIHRoZSBBcnJheUJ1ZmZlciB0byBhIHN0cmluZyBhbmQgdGhlbiBwYXJzZSB0aGUgSlNPTiAqL1xyXG5cdFx0XHRcdFx0ZXJyb3IgPSBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShuZXcgVWludDhBcnJheShlcnJvcikpKTtcclxuXHRcdFx0XHR9IGNhdGNoIChlcnIpIHtcclxuXHRcdFx0XHRcdC8qIExvZyB0aGUgZXJyb3IgaWYgSlNPTiBwYXJzaW5nIGZhaWxzICovXHJcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKFwiRXJyb3IgcGFyc2luZyBBcnJheUJ1ZmZlcjpcIiwgZXJyKTtcclxuXHJcblx0XHRcdFx0XHQvKiBSZXR1cm4gYSBnZW5lcmljIG1lc3NhZ2UgaWYgcGFyc2luZyBmYWlscyAqL1xyXG5cdFx0XHRcdFx0cmV0dXJuIFwiRmFpbGVkIHRvIHBhcnNlIGVycm9yIGRldGFpbHMuXCI7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHQvKiBFbnN1cmUgdGhlIGVycm9yIGlzIGFuIG9iamVjdCAoZm9yIHN0cnVjdHVyZWQgZXJyb3IgcmVzcG9uc2VzKSAqL1xyXG5cdFx0XHRpZiAodHlwZW9mIGVycm9yID09PSAnb2JqZWN0Jykge1xyXG5cdFx0XHRcdC8qIEl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgZXJyb3Igb2JqZWN0ICovXHJcblx0XHRcdFx0T2JqZWN0LmtleXMoZXJyb3IpLmZvckVhY2goZWwgPT4ge1xyXG5cdFx0XHRcdFx0bGV0IGVyciA9IChlcnJvciBhcyBhbnkpW2VsXTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgdmFsdWUgaXMgYW4gYXJyYXksIGl0ZXJhdGUgb3ZlciBlYWNoIGVsZW1lbnQgKi9cclxuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGVycikpIHtcclxuXHRcdFx0XHRcdFx0ZXJyLmZvckVhY2goZSA9PiB7XHJcblx0XHRcdFx0XHRcdFx0LyogRW5zdXJlIGVhY2ggZWxlbWVudCBpcyBhIHN0cmluZyBiZWZvcmUgYWRkaW5nIHRvIGVycm9ycyAqL1xyXG5cdFx0XHRcdFx0XHRcdGlmICh0eXBlb2YgZSA9PT0gJ3N0cmluZycpIHtcclxuXHRcdFx0XHRcdFx0XHRcdGVycm9ycy5wdXNoKGUpO1xyXG5cdFx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR9IGVsc2UgaWYgKHR5cGVvZiBlcnIgPT09ICdzdHJpbmcnKSB7XHJcblx0XHRcdFx0XHRcdC8qIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgYWRkIGl0IGRpcmVjdGx5IHRvIHRoZSBlcnJvcnMgbGlzdCAqL1xyXG5cdFx0XHRcdFx0XHRlcnJvcnMucHVzaChlcnIpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyogSm9pbiB0aGUgZXJyb3IgbWVzc2FnZXMgd2l0aCBuZXdsaW5lcyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgKi9cclxuXHRcdHJldHVybiBlcnJvcnMuam9pbignXFxuJyk7XHJcblx0fVxyXG59Il19
@@ -1,5 +1,5 @@
1
1
  import { HttpClient, HttpEventType, HttpHeaders, HttpParams, HttpRequest } from '@angular/common/http';
2
- import { BehaviorSubject } from 'rxjs';
2
+ import { BehaviorSubject, throwError } from 'rxjs';
3
3
  import { catchError, map } from 'rxjs/operators';
4
4
  import { Utils } from '../../common/functions/utils';
5
5
  import { ServiceLocator } from '../../common/services/service-locator';
@@ -280,16 +280,22 @@ export class GenericService {
280
280
  return "";
281
281
  }
282
282
  /**
283
- * Returns a function that handles Http operation failures.
284
- * This error handler lets the app continue to run as if no error occurred.
285
- * @param operation - name of the operation that failed
283
+ * Handles an HTTP operation that failed.
284
+ * Allows the application to continue by throwing a parsed error.
285
+ *
286
+ * @template T The type of the observable result.
287
+ * @param operation The name of the operation that failed. Defaults to 'operation'.
288
+ * @param result An optional value to return as the observable result.
289
+ * @returns A function that processes the error and returns an observable.
286
290
  */
287
291
  handleError(operation = 'operation') {
288
- return (error) => {
289
- console.log(error);
292
+ return (error) => throwError(() => {
293
+ if (error.error instanceof ArrayBuffer) {
294
+ return JSON.parse(new TextDecoder().decode(new Uint8Array(error.error)));
295
+ }
290
296
  const message = (error.error instanceof ErrorEvent) ? error.error.message : `server returned code ${error.status} with body "${error.error}"`;
291
- throw new Error(`${operation} failed: ${message}`);
292
- };
297
+ return `${operation} failed: ${message}`;
298
+ });
293
299
  }
294
300
  /**
295
301
  * Return distinct message for sent, upload progress, & response events
@@ -322,4 +328,4 @@ export class GenericService {
322
328
  console.debug(message);
323
329
  }
324
330
  }
325
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvaHR0cC9zZXJ2aWNlcy9nZW5lcmljLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBZ0MsYUFBYSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckksT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkUsTUFBTSxPQUFPLGNBQWM7SUFpQlA7SUFmbkI7O09BRUc7SUFDSSxJQUFJLENBQWE7SUFFeEI7O09BRUc7SUFDSSxJQUFJLEdBQTJCLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRW5FOzs7O09BSUc7SUFDSCxZQUFtQixRQUFpQjtRQUFqQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksR0FBRyxDQUFJLEVBQW1CLEVBQUUsTUFBc0IsRUFBRSxPQUFnQixFQUFFLGNBQXVCLElBQUk7UUFDdkcsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDckIsR0FBRyxDQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJ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LENBQUMsS0FBcUIsRUFBRSxJQUFVO1FBQzFELFFBQVEsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3BCLG9CQUFvQjtZQUNwQixLQUFLLGFBQWEsQ0FBQyxJQUFJO2dCQUN0QixPQUFPLG1CQUFtQixJQUFJLENBQUMsSUFBSSxhQUFhLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQztZQUU5RCxrQ0FBa0M7WUFDbEMsS0FBSyxhQUFhLENBQUMsY0FBYztnQkFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDekUsT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLFFBQVEsV0FBVyxhQUFhLENBQUM7WUFFM0Qsc0JBQXNCO1lBQ3RCLEtBQUssYUFBYSxDQUFDLFFBQVE7Z0JBQzFCLE9BQU8sU0FBUyxJQUFJLENBQUMsSUFBSSw0QkFBNEIsQ0FBQztZQUV2RDtnQkFDQyxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksOEJBQThCLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQztRQUN2RSxDQUFDO0lBQ0YsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxZQUFZLENBQUMsT0FBZTtRQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7Q0FHRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBFdmVudFR5cGUsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLCBIdHRwUmVxdWVzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgU2VydmljZUxvY2F0b3IgfSBmcm9tICcuLi8uLi9jb21tb24vc2VydmljZXMvc2VydmljZS1sb2NhdG9yJztcclxuXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljU2VydmljZTxUIGV4dGVuZHMgYW55PiB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEh0dHAgY2xpZW50XHJcblx0ICovXHJcblx0cHVibGljIGh0dHA6IEh0dHBDbGllbnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIExpc3Qgb2YgZW50aXRpZXNcclxuXHQgKi9cclxuXHRwdWJsaWMgbGlzdDogQmVoYXZpb3JTdWJqZWN0PGFueVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoPGFueT5bXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnN0cnVjdG9yXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGh0dHAgXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3IocHVibGljIGVuZHBvaW50Pzogc3RyaW5nKSB7XHJcblx0XHR0aGlzLmh0dHAgPSBTZXJ2aWNlTG9jYXRvci5nZXRTZXJ2aWNlKEh0dHBDbGllbnQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBhIHNpbmdsZSBlbnRpdHlcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBlbnRpdHkgb3IgcmVsYXRpdmUgcGF0aFxyXG5cdCAqIEBwYXJhbSBwYXJhbXMgQWRkcyBxdWVyeSBwYXJhbXMgdG8gdGhlIHJlcXVlc3RcclxuXHQgKiBAcGFyYW0gaGVhZGVycyBBZGRzIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0PFQ+KGlkOiBzdHJpbmcgfCBudW1iZXIsIHBhcmFtcz86IE9iamVjdCB8IG51bGwsIGhlYWRlcnM/OiBPYmplY3QsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgcmVxdWVzdCA9IHRoaXMuaHR0cFxyXG5cdFx0XHQuZ2V0PFQ+KGAke3RoaXMuZW5kcG9pbnR9LyR7aWR9YCwgeyBwYXJhbXM6IFV0aWxzLnRvSHR0cFBhcmFtcyhwYXJhbXMpLCBoZWFkZXJzOiB0aGlzLnRvSHR0cEhlYWRlcnMoaGVhZGVycykgfSk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ2dldCcpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3VudHMgZW50aXRpZXNcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gcGFyYW1zIEFkZHMgcXVlcnkgcGFyYW1zIHRvIHRoZSByZXF1ZXN0XHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gaGVhZGVycyBBZGRzIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcdCBcclxuXHQgKiBAcGFyYW0gaGFuZGxlRXJyb3IgSGFuZGxlIGVycm9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb3VudChwYXJhbXM/OiBPYmplY3QsIHBhdGg/OiBzdHJpbmcgfCBudWxsLCBoZWFkZXJzPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LmdldDxhbnk+KGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcvY291bnQnfWAsIHsgcGFyYW1zOiBVdGlscy50b0h0dHBQYXJhbXMocGFyYW1zKSwgaGVhZGVyczogdGhpcy50b0h0dHBIZWFkZXJzKGhlYWRlcnMpIH0pO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCdjb3VudCcpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3QucGlwZShtYXAoeCA9PiB7IHJldHVybiA8bnVtYmVyPngudmFsdWUgfSkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBhIGxpc3Qgb2YgZW50aXRpZXMuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIHBhcmFtcyBPcHRpb25hbC4gQWRkcyBxdWVyeSBwYXJhbXMgdG8gdGhlIHJlcXVlc3QuXHJcblx0ICogQHBhcmFtIHBhdGggT3B0aW9uYWwuIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBoZWFkZXJzIE9wdGlvbmFsLiBBZGRzIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3QuXHJcblx0ICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSB3aXRoIHRoZSByZXNwb25zZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRMaXN0KHBhcmFtcz86IEh0dHBQYXJhbXMgfCBPYmplY3QgfCBudWxsLCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaGVhZGVycz86IE9iamVjdCB8IG51bGwpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cFxyXG5cdFx0XHQuZ2V0KGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcnfWAsIHsgcGFyYW1zOiBwYXJhbXMgaW5zdGFuY2VvZiBIdHRwUGFyYW1zID8gcGFyYW1zIDogVXRpbHMudG9IdHRwUGFyYW1zKHBhcmFtcyksIGhlYWRlcnM6IHRoaXMudG9IdHRwSGVhZGVycyhoZWFkZXJzKSB9KVxyXG5cdFx0XHQucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ2dldExpc3QnKSkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9hZHMgZGF0YVxyXG5cdCAqIEBwYXJhbSBwYXJhbXMgQWRkcyBxdWVyeSBwYXJhbXMgdG8gdGhlIHJlcXVlc3RcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqIEBwYXJhbSBoZWFkZXJzIEFkZHMgaGVhZGVycyB0byB0aGUgcmVxdWVzdFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBsb2FkTGlzdChwYXJhbXM/OiBPYmplY3QgfCBudWxsLCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaGVhZGVycz86IE9iamVjdCk6IHZvaWQge1xyXG5cdFx0dGhpcy5nZXRMaXN0KHBhcmFtcywgcGF0aCwgaGVhZGVycylcclxuXHRcdFx0LnN1YnNjcmliZSh4ID0+IHRoaXMubGlzdC5uZXh0KHgpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgcmVzdWx0IGxpc3QgYXMgT2JzZXJ2YWJsZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBnZXRMaXN0QXNPYnNlcnZhYmxlKCk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRyZXR1cm4gdGhpcy5saXN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhbiBlbnRpdHlcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdG8gY3JlYXRlXHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgQWRkaXRpb25hbCBodHRwIG9wdGlvbnMsIGxpa2UgaGVhZGVycyBhbmQgc28gb24gXHJcblx0ICogQHBhcmFtIGhhbmRsZUVycm9yIEhhbmRsZSBlcnJvcnNcclxuXHQgKi9cclxuXHRwdWJsaWMgY3JlYXRlPFQ+KGVudGl0eTogYW55LCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaHR0cE9wdGlvbnM/OiBPYmplY3QsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8VD4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LnBvc3Q8VD4oYCR7dGhpcy5lbmRwb2ludH0ke3BhdGggPyBwYXRoIDogJyd9YCwgZW50aXR5LCBodHRwT3B0aW9ucyk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ2NyZWF0ZScpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIGFuIGVudGl0eVxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0byB1cGRhdGVcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqIEBwYXJhbSBodHRwT3B0aW9ucyBBZGRpdGlvbmFsIGh0dHAgb3B0aW9ucywgbGlrZSBoZWFkZXJzIGFuZCBzbyBvbiBcclxuXHQgKiBAcGFyYW0gaGFuZGxlRXJyb3IgSGFuZGxlIGVycm9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyB1cGRhdGUoaWQ6IHN0cmluZyB8IG51bWJlciwgZW50aXR5OiBhbnksIHBhdGg/OiBzdHJpbmcgfCBudWxsLCBodHRwT3B0aW9ucz86IE9iamVjdCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCByZXF1ZXN0ID0gdGhpcy5odHRwXHJcblx0XHRcdC5wdXQ8VD4oYCR7dGhpcy5lbmRwb2ludH0ke3BhdGggPyBwYXRoIDogJyd9LyR7aWR9YCwgZW50aXR5LCBodHRwT3B0aW9ucyk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ3VwZGF0ZScpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQYXRjaGVzIGFuIGVudGl0eVxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBpZCBpZCBUaGUgaWQgb2YgdGhlIGl0ZW0gdG8gcGF0Y2hcclxuXHQgKiBAcGFyYW0gYm9keSBUaGUgYm9keVxyXG5cdCAqIEBwYXJhbSBwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIEFkZGl0aW9uYWwgaHR0cCBvcHRpb25zLCBsaWtlIGhlYWRlcnMgYW5kIHNvIG9uIFxyXG5cdCAqIEBwYXJhbSBoYW5kbGVFcnJvciBIYW5kbGUgZXJyb3JzXHJcblx0ICovXHJcblx0cHVibGljIHBhdGNoKGlkOiBzdHJpbmcgfCBudW1iZXIsIGJvZHk6IGFueSwgcGF0aD86IHN0cmluZyB8IG51bGwsIGh0dHBPcHRpb25zPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LnBhdGNoPFQ+KGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcnfS8ke2lkfWAsIGJvZHksIGh0dHBPcHRpb25zKTtcclxuXHJcblx0XHQvKiBIYW5kbGUgZXJyb3IgKi9cclxuXHRcdGlmIChoYW5kbGVFcnJvcikge1xyXG5cdFx0XHRyZXF1ZXN0ID0gcmVxdWVzdC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcigncGF0Y2gnKSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXF1ZXN0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF0Y2hlcyBtdWx0aXBsZSBlbnRpdGllc1xyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBpZHMgVGhlIGlkcyBvZiB0aGUgaXRlbXMgdG8gcGF0Y2hcclxuXHQgKiBAcGFyYW0gYm9keSBUaGUgYm9keVxyXG5cdCAqIEBwYXJhbSBwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIEFkZGl0aW9uYWwgaHR0cCBvcHRpb25zLCBsaWtlIGhlYWRlcnMgYW5kIHNvIG9uIFxyXG5cdCAqIEBwYXJhbSBoYW5kbGVFcnJvciBIYW5kbGUgZXJyb3JzXHJcblx0ICovXHJcblx0cHVibGljIHBhdGNoTGlzdChpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIGJvZHk6IGFueSwgcGF0aD86IHN0cmluZyB8IG51bGwsIGh0dHBPcHRpb25zPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LnBhdGNoPFQ+KGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcnfWAsIGJvZHksIE9iamVjdC5hc3NpZ24oaHR0cE9wdGlvbnMgfHwge30sIHsgcGFyYW1zOiBVdGlscy50b0h0dHBQYXJhbXMoeyBpZHM6IGlkcyB9KSB9KSk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ3BhdGNoJykpKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVxdWVzdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgYW4gZW50aXR5LlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGl0ZW0gdG8gZGVsZXRlXHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgQWRkaXRpb25hbCBodHRwIG9wdGlvbnMsIGxpa2UgaGVhZGVycyBhbmQgc28gb24gIFxyXG5cdCAqIEBwYXJhbSBoYW5kbGVFcnJvciBIYW5kbGUgZXJyb3JzXHJcblx0ICovXHJcblx0cHVibGljIGRlbGV0ZShpZDogc3RyaW5nIHwgbnVtYmVyLCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaHR0cE9wdGlvbnM/OiBPYmplY3QsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgcmVxdWVzdCA9IHRoaXMuaHR0cFxyXG5cdFx0XHQuZGVsZXRlKGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcnfS8ke2lkfWAsIGh0dHBPcHRpb25zKTtcclxuXHJcblx0XHQvKiBIYW5kbGUgZXJyb3IgKi9cclxuXHRcdGlmIChoYW5kbGVFcnJvcikge1xyXG5cdFx0XHRyZXF1ZXN0ID0gcmVxdWVzdC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcignZGVsZXRlJykpKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVxdWVzdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlbGV0ZXMgbXVsdGlwbGUgZW50aXRpZXMuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGlkcyBUaGUgaWRzIG9mIHRoZSBpdGVtcyB0byBkZWxldGVcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqIEBwYXJhbSBodHRwT3B0aW9ucyBBZGRpdGlvbmFsIGh0dHAgb3B0aW9ucywgbGlrZSBoZWFkZXJzIGFuZCBzbyBvbiAgXHJcblx0ICogQHBhcmFtIGhhbmRsZUVycm9yIEhhbmRsZSBlcnJvcnNcclxuXHQgKi9cclxuXHRwdWJsaWMgZGVsZXRlTGlzdChpZHM6IHN0cmluZ1tdIHwgbnVtYmVyW10sIHBhdGg/OiBzdHJpbmcgfCBudWxsLCBodHRwT3B0aW9ucz86IE9iamVjdCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCByZXF1ZXN0ID0gdGhpcy5odHRwLmRlbGV0ZShgJHt0aGlzLmVuZHBvaW50fSR7cGF0aCA/IHBhdGggOiAnJ31gLCBPYmplY3QuYXNzaWduKGh0dHBPcHRpb25zIHx8IHt9LCB7IHBhcmFtczogVXRpbHMudG9IdHRwUGFyYW1zKHsgaWRzOiBpZHMgfSkgfSkpO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCdkZWxldGVMaXN0JykpKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVxdWVzdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIERvd25sb2FkcyBhIGZpbGVcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqIEBwYXJhbSBwYXJhbXMgU29tZSBxdWVyeSBwYXJhbXNcclxuXHQgKi9cclxuXHRwdWJsaWMgZG93bmxvYWQocGF0aDogc3RyaW5nLCBwYXJhbXM/OiBPYmplY3QsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgcmVxdWVzdCA9IHRoaXMuaHR0cFxyXG5cdFx0XHQuZ2V0KGAke3RoaXMuZW5kcG9pbnR9LyR7cGF0aCA/IHBhdGggOiAnZG93bmxvYWQnfWAsIHsgcGFyYW1zOiBVdGlscy50b0h0dHBQYXJhbXMocGFyYW1zKSwgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLCBvYnNlcnZlOiAncmVzcG9uc2UnIH0pXHJcblx0XHRcdC5waXBlKG1hcCh4ID0+IHsgcmV0dXJuIHsgZGF0YTogeC5ib2R5LCBmaWxlbmFtZTogdGhpcy5nZXRGaWxlTmFtZUZyb21IZWFkZXJzKHguaGVhZGVycykgfSB9KSk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZTxhbnk+KGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcignZG93bmxvYWQnKSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXF1ZXN0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRHVwbGljYXRlcyBhIHJlY29yZFxyXG5cdCAqIEBwYXJhbSBpZCBcclxuXHQgKi9cclxuXHRwdWJsaWMgZHVwbGljYXRlKGlkOiBudW1iZXIpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuY3JlYXRlKG51bGwsIGAvZHVwbGljYXRlLyR7aWR9YCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGxvYWRzIGEgZmlsZVxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRvIHVwbG9hZFxyXG5cdCAqIEBwYXJhbSBwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uXHJcblx0ICovXHJcblx0cHVibGljIHVwbG9hZChmaWxlOiBGaWxlLCBwYXRoOiBzdHJpbmcgPSAndXBsb2FkJywgZXh0cmFEYXRhPzogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdC8qIENyZWF0ZXMgZm9ybSBkYXRhIG9iamVjdCAqL1xyXG5cdFx0Y29uc3QgZm9ybURhdGE6IEZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XHJcblxyXG5cdFx0LyogQWRkIHRoZSBmaWxlIHRvIHRoZSBmb3JtIGRhdGEgKi9cclxuXHRcdGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSk7XHJcblxyXG5cdFx0LyogSXRlcmF0ZSBhbmQgc2V0IG90aGVyIGZvcm0gZGF0YSAqL1xyXG5cdFx0aWYgKGV4dHJhRGF0YSkge1xyXG5cdFx0XHRmb3IgKGxldCBrZXkgaW4gZXh0cmFEYXRhKSB7XHJcblx0XHRcdFx0Zm9ybURhdGEuYXBwZW5kKGtleSwgZXh0cmFEYXRhW2tleV0pXHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvKiBTZXQgdHJ1ZSB0byByZXBvcnRQcm9ncmVzcyB0byBlbmFibGUgdHJhY2tpbmcgb2YgcHJvZ3Jlc3MgZXZlbnRzICovXHJcblx0XHRjb25zdCByZXEgPSBuZXcgSHR0cFJlcXVlc3QoJ1BPU1QnLCBgJHt0aGlzLmVuZHBvaW50fS8ke3BhdGggPyBwYXRoIDogJ3VwbG9hZCd9YCwgZm9ybURhdGEsIHtcclxuXHRcdFx0cmVwb3J0UHJvZ3Jlc3M6IHRydWVcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8qXHJcblx0XHRUaGUgYEh0dHBDbGllbnQucmVxdWVzdGAgQVBJIHByb2R1Y2VzIGEgcmF3IGV2ZW50IHN0cmVhbVxyXG5cdFx0d2hpY2ggaW5jbHVkZXMgc3RhcnQgKHNlbnQpLCBwcm9ncmVzcywgYW5kIHJlc3BvbnNlIGV2ZW50cy5cclxuXHRcdCovXHJcblx0XHRyZXR1cm4gdGhpcy5odHRwLnJlcXVlc3QocmVxKTtcclxuXHR9O1xyXG5cclxuXHQvLy8jcmVnaW9uIEhlbHBlcnNcclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydCBPYmplY3QgdG8gRnJvbURhdGFcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gYm9keVxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCB0b0Zvcm1EYXRhKGJvZHk6IGFueSk6IEZvcm1EYXRhIHtcclxuXHRcdGlmICghYm9keSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IEZvcm1EYXRhKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvZHkpXHJcblx0XHRcdC5maWx0ZXIoa2V5ID0+IGJvZHlba2V5XSAhPSBudWxsICYmIGJvZHlba2V5XSAhPSAnJylcclxuXHRcdFx0LnJlZHVjZSgocCwga2V5KSA9PiB7IHAuYXBwZW5kKGtleSwgYm9keVtrZXldKTsgcmV0dXJuIHAgfSwgbmV3IEZvcm1EYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ29udmVydCBPYmplY3QgdG8gSHR0cEhlYWRlcnNcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gYm9keVxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCB0b0h0dHBIZWFkZXJzKGJvZHk/OiBPYmplY3QgfCBudWxsKTogSHR0cEhlYWRlcnMge1xyXG5cdFx0aWYgKCFib2R5KSB7XHJcblx0XHRcdHJldHVybiBuZXcgSHR0cEhlYWRlcnMoKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYm9keSlcclxuXHRcdFx0LmZpbHRlcihrZXkgPT4gKGJvZHkgYXMgYW55KVtrZXldICE9IG51bGwgJiYgKGJvZHkgYXMgYW55KVtrZXldICE9ICcnKVxyXG5cdFx0XHQucmVkdWNlKChwLCBrZXkpID0+IHAuc2V0KGtleSwgKGJvZHkgYXMgYW55KVtrZXldKSwgbmV3IEh0dHBIZWFkZXJzKCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyBmaWxlIG5hbWUgZnJvbSBIdHRwaGVhZGVyczogQ29udGVudC1EaXNwb3NpdGlvblxyXG5cdCAqIEBwYXJhbSBkaXNwb3NpdGlvbiBcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZ2V0RmlsZU5hbWVGcm9tSGVhZGVycyhoZWFkZXJzOiBIdHRwSGVhZGVycyk6IHN0cmluZyB7XHJcblx0XHR2YXIgZGlzcG9zaXRpb24gPSBoZWFkZXJzLmdldCgnY29udGVudC1kaXNwb3NpdGlvbicpO1xyXG5cdFx0aWYgKGRpc3Bvc2l0aW9uICYmIGRpc3Bvc2l0aW9uLmluZGV4T2YoJ2F0dGFjaG1lbnQnKSAhPT0gLTEpIHtcclxuXHRcdFx0dmFyIG1hdGNoZXMgPSAvZmlsZW5hbWVbXjs9XFxuXSo9KChbJ1wiXSkuKj9cXDJ8W147XFxuXSopLy5leGVjKGRpc3Bvc2l0aW9uKTtcclxuXHRcdFx0aWYgKG1hdGNoZXMgIT0gbnVsbCAmJiBtYXRjaGVzWzFdKSB7XHJcblx0XHRcdFx0cmV0dXJuIG1hdGNoZXNbMV0ucmVwbGFjZSgvWydcIl0vZywgJycpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIFwiXCI7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBoYW5kbGVzIEh0dHAgb3BlcmF0aW9uIGZhaWx1cmVzLlxyXG5cdCAqIFRoaXMgZXJyb3IgaGFuZGxlciBsZXRzIHRoZSBhcHAgY29udGludWUgdG8gcnVuIGFzIGlmIG5vIGVycm9yIG9jY3VycmVkLlxyXG5cdCAqIEBwYXJhbSBvcGVyYXRpb24gLSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCBmYWlsZWRcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgaGFuZGxlRXJyb3Iob3BlcmF0aW9uID0gJ29wZXJhdGlvbicpIHtcclxuXHRcdHJldHVybiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuXHRcdFx0Y29uc29sZS5sb2coZXJyb3IpO1xyXG5cdFx0XHRjb25zdCBtZXNzYWdlID0gKGVycm9yLmVycm9yIGluc3RhbmNlb2YgRXJyb3JFdmVudCkgPyBlcnJvci5lcnJvci5tZXNzYWdlIDogYHNlcnZlciByZXR1cm5lZCBjb2RlICR7ZXJyb3Iuc3RhdHVzfSB3aXRoIGJvZHkgXCIke2Vycm9yLmVycm9yfVwiYDtcclxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGAke29wZXJhdGlvbn0gZmFpbGVkOiAke21lc3NhZ2V9YCk7XHJcblx0XHR9O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0dXJuIGRpc3RpbmN0IG1lc3NhZ2UgZm9yIHNlbnQsIHVwbG9hZCBwcm9ncmVzcywgJiByZXNwb25zZSBldmVudHNcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZXZlbnQgVGhlIHJlc3BvbnNlIGV2ZW50XHJcblx0ICogQHBhcmFtIGZpbGUgVGhlIGZpbGUgYmVlaW5nIHVwbG9hZGVkXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldEV2ZW50TWVzc2FnZShldmVudDogSHR0cEV2ZW50PGFueT4sIGZpbGU6IEZpbGUpIHtcclxuXHRcdHN3aXRjaCAoZXZlbnQudHlwZSkge1xyXG5cdFx0XHQvKiBVcGxvYWQgc3RhcnRlZCAqL1xyXG5cdFx0XHRjYXNlIEh0dHBFdmVudFR5cGUuU2VudDpcclxuXHRcdFx0XHRyZXR1cm4gYFVwbG9hZGluZyBmaWxlIFwiJHtmaWxlLm5hbWV9XCIgb2Ygc2l6ZSAke2ZpbGUuc2l6ZX0uYDtcclxuXHJcblx0XHRcdC8qIENvbXB1dGUgYW5kIHNob3cgdGhlICUgZG9uZTogKi9cclxuXHRcdFx0Y2FzZSBIdHRwRXZlbnRUeXBlLlVwbG9hZFByb2dyZXNzOlxyXG5cdFx0XHRcdGNvbnN0IHBlcmNlbnREb25lID0gTWF0aC5yb3VuZCgxMDAgKiBldmVudC5sb2FkZWQgLyAoZXZlbnQ/LnRvdGFsID8/IDEpKTtcclxuXHRcdFx0XHRyZXR1cm4gYEZpbGUgXCIke2ZpbGUubmFtZX1cIiBpcyAke3BlcmNlbnREb25lfSUgdXBsb2FkZWQuYDtcclxuXHJcblx0XHRcdC8qIFVwbG9hZCBjb21wbGV0ZWQgKi9cclxuXHRcdFx0Y2FzZSBIdHRwRXZlbnRUeXBlLlJlc3BvbnNlOlxyXG5cdFx0XHRcdHJldHVybiBgRmlsZSBcIiR7ZmlsZS5uYW1lfVwiIHdhcyBjb21wbGV0ZWx5IHVwbG9hZGVkIWA7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybiBgRmlsZSBcIiR7ZmlsZS5uYW1lfVwiIHN1cnByaXNpbmcgdXBsb2FkIGV2ZW50OiAke2V2ZW50LnR5cGV9LmA7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93cyB1cGxvYWQgcHJvZ3Jlc3MuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIG1lc3NhZ2UgXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNob3dQcm9ncmVzcyhtZXNzYWdlOiBzdHJpbmcpIHtcclxuXHRcdGNvbnNvbGUuZGVidWcobWVzc2FnZSk7XHJcblx0fVxyXG5cclxuXHQvLyNlbmRyZWdpb25cclxufSJdfQ==
331
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvaHR0cC9zZXJ2aWNlcy9nZW5lcmljLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxhQUFhLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsSCxPQUFPLEVBQUUsZUFBZSxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFdkUsTUFBTSxPQUFPLGNBQWM7SUFpQlA7SUFmbkI7O09BRUc7SUFDSSxJQUFJLENBQWE7SUFFeEI7O09BRUc7SUFDSSxJQUFJLEdBQTJCLElBQUksZUFBZSxDQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRW5FOzs7O09BSUc7SUFDSCxZQUFtQixRQUFpQjtRQUFqQixhQUFRLEdBQVIsUUFBUSxDQUFTO1FBQ25DLElBQUksQ0FBQyxJQUFJLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksR0FBRyxDQUFJLEVBQW1CLEVBQUUsTUFBc0IsRUFBRSxPQUFnQixFQUFFLGNBQXVCLElBQUk7UUFDdkcsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUk7YUFDckIsR0FBRyxDQUFJLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8s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Qyx3QkFBd0IsS0FBSyxDQUFDLE1BQU0sZUFBZSxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDOUksT0FBTyxHQUFHLFNBQVMsWUFBWSxPQUFPLEVBQUUsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGVBQWUsQ0FBQyxLQUFxQixFQUFFLElBQVU7UUFDMUQsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDcEIsb0JBQW9CO1lBQ3BCLEtBQUssYUFBYSxDQUFDLElBQUk7Z0JBQ3RCLE9BQU8sbUJBQW1CLElBQUksQ0FBQyxJQUFJLGFBQWEsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDO1lBRTlELGtDQUFrQztZQUNsQyxLQUFLLGFBQWEsQ0FBQyxjQUFjO2dCQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxPQUFPLFNBQVMsSUFBSSxDQUFDLElBQUksUUFBUSxXQUFXLGFBQWEsQ0FBQztZQUUzRCxzQkFBc0I7WUFDdEIsS0FBSyxhQUFhLENBQUMsUUFBUTtnQkFDMUIsT0FBTyxTQUFTLElBQUksQ0FBQyxJQUFJLDRCQUE0QixDQUFDO1lBRXZEO2dCQUNDLE9BQU8sU0FBUyxJQUFJLENBQUMsSUFBSSw4QkFBOEIsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3ZFLENBQUM7SUFDRixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLFlBQVksQ0FBQyxPQUFlO1FBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEIsQ0FBQztDQUdEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEV2ZW50LCBIdHRwRXZlbnRUeXBlLCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcywgSHR0cFJlcXVlc3QgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vY29tbW9uL2Z1bmN0aW9ucy91dGlscyc7XHJcbmltcG9ydCB7IFNlcnZpY2VMb2NhdG9yIH0gZnJvbSAnLi4vLi4vY29tbW9uL3NlcnZpY2VzL3NlcnZpY2UtbG9jYXRvcic7XHJcblxyXG5leHBvcnQgY2xhc3MgR2VuZXJpY1NlcnZpY2U8VCBleHRlbmRzIGFueT4ge1xyXG5cclxuXHQvKipcclxuXHQgKiBIdHRwIGNsaWVudFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBodHRwOiBIdHRwQ2xpZW50O1xyXG5cclxuXHQvKipcclxuXHQgKiBMaXN0IG9mIGVudGl0aWVzXHJcblx0ICovXHJcblx0cHVibGljIGxpc3Q6IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDxhbnk+W10pO1xyXG5cclxuXHQvKipcclxuXHQgKiBDb25zdHJ1Y3RvclxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBodHRwIFxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBlbmRwb2ludD86IHN0cmluZykge1xyXG5cdFx0dGhpcy5odHRwID0gU2VydmljZUxvY2F0b3IuZ2V0U2VydmljZShIdHRwQ2xpZW50KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgYSBzaW5nbGUgZW50aXR5XHJcblx0ICogXHJcblx0ICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZW50aXR5IG9yIHJlbGF0aXZlIHBhdGhcclxuXHQgKiBAcGFyYW0gcGFyYW1zIEFkZHMgcXVlcnkgcGFyYW1zIHRvIHRoZSByZXF1ZXN0XHJcblx0ICogQHBhcmFtIGhlYWRlcnMgQWRkcyBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XHJcblx0ICovXHJcblx0cHVibGljIGdldDxUPihpZDogc3RyaW5nIHwgbnVtYmVyLCBwYXJhbXM/OiBPYmplY3QgfCBudWxsLCBoZWFkZXJzPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LmdldDxUPihgJHt0aGlzLmVuZHBvaW50fS8ke2lkfWAsIHsgcGFyYW1zOiBVdGlscy50b0h0dHBQYXJhbXMocGFyYW1zKSwgaGVhZGVyczogdGhpcy50b0h0dHBIZWFkZXJzKGhlYWRlcnMpIH0pO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCdnZXQnKSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXF1ZXN0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ291bnRzIGVudGl0aWVzXHJcblx0ICogXHJcblx0ICogQHBhcmFtIHBhcmFtcyBBZGRzIHF1ZXJ5IHBhcmFtcyB0byB0aGUgcmVxdWVzdFxyXG5cdCAqIEBwYXJhbSBwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uXHJcblx0ICogQHBhcmFtIGhlYWRlcnMgQWRkcyBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XHQgXHJcblx0ICogQHBhcmFtIGhhbmRsZUVycm9yIEhhbmRsZSBlcnJvcnNcclxuXHQgKi9cclxuXHRwdWJsaWMgY291bnQocGFyYW1zPzogT2JqZWN0LCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaGVhZGVycz86IE9iamVjdCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcclxuXHRcdGxldCByZXF1ZXN0ID0gdGhpcy5odHRwXHJcblx0XHRcdC5nZXQ8YW55PihgJHt0aGlzLmVuZHBvaW50fSR7cGF0aCA/IHBhdGggOiAnL2NvdW50J31gLCB7IHBhcmFtczogVXRpbHMudG9IdHRwUGFyYW1zKHBhcmFtcyksIGhlYWRlcnM6IHRoaXMudG9IdHRwSGVhZGVycyhoZWFkZXJzKSB9KTtcclxuXHJcblx0XHQvKiBIYW5kbGUgZXJyb3IgKi9cclxuXHRcdGlmIChoYW5kbGVFcnJvcikge1xyXG5cdFx0XHRyZXF1ZXN0ID0gcmVxdWVzdC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcignY291bnQnKSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXF1ZXN0LnBpcGUobWFwKHggPT4geyByZXR1cm4gPG51bWJlcj54LnZhbHVlIH0pKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgYSBsaXN0IG9mIGVudGl0aWVzLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBwYXJhbXMgT3B0aW9uYWwuIEFkZHMgcXVlcnkgcGFyYW1zIHRvIHRoZSByZXF1ZXN0LlxyXG5cdCAqIEBwYXJhbSBwYXRoIE9wdGlvbmFsLiBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvbi5cclxuXHQgKiBAcGFyYW0gaGVhZGVycyBPcHRpb25hbC4gQWRkcyBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0LlxyXG5cdCAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgd2l0aCB0aGUgcmVzcG9uc2UgZGF0YS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0TGlzdChwYXJhbXM/OiBIdHRwUGFyYW1zIHwgT2JqZWN0IHwgbnVsbCwgcGF0aD86IHN0cmluZyB8IG51bGwsIGhlYWRlcnM/OiBPYmplY3QgfCBudWxsKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmh0dHBcclxuXHRcdFx0LmdldChgJHt0aGlzLmVuZHBvaW50fSR7cGF0aCA/IHBhdGggOiAnJ31gLCB7IHBhcmFtczogcGFyYW1zIGluc3RhbmNlb2YgSHR0cFBhcmFtcyA/IHBhcmFtcyA6IFV0aWxzLnRvSHR0cFBhcmFtcyhwYXJhbXMpLCBoZWFkZXJzOiB0aGlzLnRvSHR0cEhlYWRlcnMoaGVhZGVycykgfSlcclxuXHRcdFx0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCdnZXRMaXN0JykpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGRhdGFcclxuXHQgKiBAcGFyYW0gcGFyYW1zIEFkZHMgcXVlcnkgcGFyYW1zIHRvIHRoZSByZXF1ZXN0XHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gaGVhZGVycyBBZGRzIGhlYWRlcnMgdG8gdGhlIHJlcXVlc3RcclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZExpc3QocGFyYW1zPzogT2JqZWN0IHwgbnVsbCwgcGF0aD86IHN0cmluZyB8IG51bGwsIGhlYWRlcnM/OiBPYmplY3QpOiB2b2lkIHtcclxuXHRcdHRoaXMuZ2V0TGlzdChwYXJhbXMsIHBhdGgsIGhlYWRlcnMpXHJcblx0XHRcdC5zdWJzY3JpYmUoeCA9PiB0aGlzLmxpc3QubmV4dCh4KSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBHZXRzIHJlc3VsdCBsaXN0IGFzIE9ic2VydmFibGVcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0TGlzdEFzT2JzZXJ2YWJsZSgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubGlzdC5hc09ic2VydmFibGUoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENyZWF0ZXMgYW4gZW50aXR5XHJcblx0ICogXHJcblx0ICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIGNyZWF0ZVxyXG5cdCAqIEBwYXJhbSBwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIEFkZGl0aW9uYWwgaHR0cCBvcHRpb25zLCBsaWtlIGhlYWRlcnMgYW5kIHNvIG9uIFxyXG5cdCAqIEBwYXJhbSBoYW5kbGVFcnJvciBIYW5kbGUgZXJyb3JzXHJcblx0ICovXHJcblx0cHVibGljIGNyZWF0ZTxUPihlbnRpdHk6IGFueSwgcGF0aD86IHN0cmluZyB8IG51bGwsIGh0dHBPcHRpb25zPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPFQ+IHtcclxuXHRcdGxldCByZXF1ZXN0ID0gdGhpcy5odHRwXHJcblx0XHRcdC5wb3N0PFQ+KGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcnfWAsIGVudGl0eSwgaHR0cE9wdGlvbnMpO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCdjcmVhdGUnKSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXF1ZXN0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlcyBhbiBlbnRpdHlcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZW50aXR5IFRoZSBlbnRpdHkgdG8gdXBkYXRlXHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgQWRkaXRpb25hbCBodHRwIG9wdGlvbnMsIGxpa2UgaGVhZGVycyBhbmQgc28gb24gXHJcblx0ICogQHBhcmFtIGhhbmRsZUVycm9yIEhhbmRsZSBlcnJvcnNcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBkYXRlKGlkOiBzdHJpbmcgfCBudW1iZXIsIGVudGl0eTogYW55LCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaHR0cE9wdGlvbnM/OiBPYmplY3QsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgcmVxdWVzdCA9IHRoaXMuaHR0cFxyXG5cdFx0XHQucHV0PFQ+KGAke3RoaXMuZW5kcG9pbnR9JHtwYXRoID8gcGF0aCA6ICcnfS8ke2lkfWAsIGVudGl0eSwgaHR0cE9wdGlvbnMpO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCd1cGRhdGUnKSkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiByZXF1ZXN0O1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF0Y2hlcyBhbiBlbnRpdHlcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gaWQgaWQgVGhlIGlkIG9mIHRoZSBpdGVtIHRvIHBhdGNoXHJcblx0ICogQHBhcmFtIGJvZHkgVGhlIGJvZHlcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqIEBwYXJhbSBodHRwT3B0aW9ucyBBZGRpdGlvbmFsIGh0dHAgb3B0aW9ucywgbGlrZSBoZWFkZXJzIGFuZCBzbyBvbiBcclxuXHQgKiBAcGFyYW0gaGFuZGxlRXJyb3IgSGFuZGxlIGVycm9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXRjaChpZDogc3RyaW5nIHwgbnVtYmVyLCBib2R5OiBhbnksIHBhdGg/OiBzdHJpbmcgfCBudWxsLCBodHRwT3B0aW9ucz86IE9iamVjdCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCByZXF1ZXN0ID0gdGhpcy5odHRwXHJcblx0XHRcdC5wYXRjaDxUPihgJHt0aGlzLmVuZHBvaW50fSR7cGF0aCA/IHBhdGggOiAnJ30vJHtpZH1gLCBib2R5LCBodHRwT3B0aW9ucyk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ3BhdGNoJykpKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVxdWVzdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFBhdGNoZXMgbXVsdGlwbGUgZW50aXRpZXNcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gaWRzIFRoZSBpZHMgb2YgdGhlIGl0ZW1zIHRvIHBhdGNoXHJcblx0ICogQHBhcmFtIGJvZHkgVGhlIGJvZHlcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqIEBwYXJhbSBodHRwT3B0aW9ucyBBZGRpdGlvbmFsIGh0dHAgb3B0aW9ucywgbGlrZSBoZWFkZXJzIGFuZCBzbyBvbiBcclxuXHQgKiBAcGFyYW0gaGFuZGxlRXJyb3IgSGFuZGxlIGVycm9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXRjaExpc3QoaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLCBib2R5OiBhbnksIHBhdGg/OiBzdHJpbmcgfCBudWxsLCBodHRwT3B0aW9ucz86IE9iamVjdCwgaGFuZGxlRXJyb3I6IGJvb2xlYW4gPSB0cnVlKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdGxldCByZXF1ZXN0ID0gdGhpcy5odHRwXHJcblx0XHRcdC5wYXRjaDxUPihgJHt0aGlzLmVuZHBvaW50fSR7cGF0aCA/IHBhdGggOiAnJ31gLCBib2R5LCBPYmplY3QuYXNzaWduKGh0dHBPcHRpb25zIHx8IHt9LCB7IHBhcmFtczogVXRpbHMudG9IdHRwUGFyYW1zKHsgaWRzOiBpZHMgfSkgfSkpO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGUoY2F0Y2hFcnJvcih0aGlzLmhhbmRsZUVycm9yKCdwYXRjaCcpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIGFuIGVudGl0eS5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBpdGVtIHRvIGRlbGV0ZVxyXG5cdCAqIEBwYXJhbSBwYXRoIEEgcmVsYXRpdmUgcGF0aCB0byB0aGUgYWN0aW9uXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIEFkZGl0aW9uYWwgaHR0cCBvcHRpb25zLCBsaWtlIGhlYWRlcnMgYW5kIHNvIG9uICBcclxuXHQgKiBAcGFyYW0gaGFuZGxlRXJyb3IgSGFuZGxlIGVycm9yc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBkZWxldGUoaWQ6IHN0cmluZyB8IG51bWJlciwgcGF0aD86IHN0cmluZyB8IG51bGwsIGh0dHBPcHRpb25zPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LmRlbGV0ZShgJHt0aGlzLmVuZHBvaW50fSR7cGF0aCA/IHBhdGggOiAnJ30vJHtpZH1gLCBodHRwT3B0aW9ucyk7XHJcblxyXG5cdFx0LyogSGFuZGxlIGVycm9yICovXHJcblx0XHRpZiAoaGFuZGxlRXJyb3IpIHtcclxuXHRcdFx0cmVxdWVzdCA9IHJlcXVlc3QucGlwZShjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ2RlbGV0ZScpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEZWxldGVzIG11bHRpcGxlIGVudGl0aWVzLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBpZHMgVGhlIGlkcyBvZiB0aGUgaXRlbXMgdG8gZGVsZXRlXHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgQWRkaXRpb25hbCBodHRwIG9wdGlvbnMsIGxpa2UgaGVhZGVycyBhbmQgc28gb24gIFxyXG5cdCAqIEBwYXJhbSBoYW5kbGVFcnJvciBIYW5kbGUgZXJyb3JzXHJcblx0ICovXHJcblx0cHVibGljIGRlbGV0ZUxpc3QoaWRzOiBzdHJpbmdbXSB8IG51bWJlcltdLCBwYXRoPzogc3RyaW5nIHwgbnVsbCwgaHR0cE9wdGlvbnM/OiBPYmplY3QsIGhhbmRsZUVycm9yOiBib29sZWFuID0gdHJ1ZSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHRsZXQgcmVxdWVzdCA9IHRoaXMuaHR0cC5kZWxldGUoYCR7dGhpcy5lbmRwb2ludH0ke3BhdGggPyBwYXRoIDogJyd9YCwgT2JqZWN0LmFzc2lnbihodHRwT3B0aW9ucyB8fCB7fSwgeyBwYXJhbXM6IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGlkczogaWRzIH0pIH0pKTtcclxuXHJcblx0XHQvKiBIYW5kbGUgZXJyb3IgKi9cclxuXHRcdGlmIChoYW5kbGVFcnJvcikge1xyXG5cdFx0XHRyZXF1ZXN0ID0gcmVxdWVzdC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcignZGVsZXRlTGlzdCcpKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIHJlcXVlc3Q7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBEb3dubG9hZHMgYSBmaWxlXHJcblx0ICogXHJcblx0ICogQHBhcmFtIHBhdGggQSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBhY3Rpb25cclxuXHQgKiBAcGFyYW0gcGFyYW1zIFNvbWUgcXVlcnkgcGFyYW1zXHJcblx0ICovXHJcblx0cHVibGljIGRvd25sb2FkKHBhdGg6IHN0cmluZywgcGFyYW1zPzogT2JqZWN0LCBoYW5kbGVFcnJvcjogYm9vbGVhbiA9IHRydWUpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG5cdFx0bGV0IHJlcXVlc3QgPSB0aGlzLmh0dHBcclxuXHRcdFx0LmdldChgJHt0aGlzLmVuZHBvaW50fS8ke3BhdGggPyBwYXRoIDogJ2Rvd25sb2FkJ31gLCB7IHBhcmFtczogVXRpbHMudG9IdHRwUGFyYW1zKHBhcmFtcyksIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJywgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyB9KVxyXG5cdFx0XHQucGlwZShtYXAoeCA9PiB7IHJldHVybiB7IGRhdGE6IHguYm9keSwgZmlsZW5hbWU6IHRoaXMuZ2V0RmlsZU5hbWVGcm9tSGVhZGVycyh4LmhlYWRlcnMpIH0gfSkpO1xyXG5cclxuXHRcdC8qIEhhbmRsZSBlcnJvciAqL1xyXG5cdFx0aWYgKGhhbmRsZUVycm9yKSB7XHJcblx0XHRcdHJlcXVlc3QgPSByZXF1ZXN0LnBpcGU8YW55PihjYXRjaEVycm9yKHRoaXMuaGFuZGxlRXJyb3IoJ2Rvd25sb2FkJykpKTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gcmVxdWVzdDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIER1cGxpY2F0ZXMgYSByZWNvcmRcclxuXHQgKiBAcGFyYW0gaWQgXHJcblx0ICovXHJcblx0cHVibGljIGR1cGxpY2F0ZShpZDogbnVtYmVyKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZShudWxsLCBgL2R1cGxpY2F0ZS8ke2lkfWApO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBsb2FkcyBhIGZpbGVcclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byB1cGxvYWRcclxuXHQgKiBAcGFyYW0gcGF0aCBBIHJlbGF0aXZlIHBhdGggdG8gdGhlIGFjdGlvblxyXG5cdCAqL1xyXG5cdHB1YmxpYyB1cGxvYWQoZmlsZTogRmlsZSwgcGF0aDogc3RyaW5nID0gJ3VwbG9hZCcsIGV4dHJhRGF0YT86IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcblx0XHQvKiBDcmVhdGVzIGZvcm0gZGF0YSBvYmplY3QgKi9cclxuXHRcdGNvbnN0IGZvcm1EYXRhOiBGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG5cclxuXHRcdC8qIEFkZCB0aGUgZmlsZSB0byB0aGUgZm9ybSBkYXRhICovXHJcblx0XHRmb3JtRGF0YS5hcHBlbmQoJ2ZpbGUnLCBmaWxlLCBmaWxlLm5hbWUpO1xyXG5cclxuXHRcdC8qIEl0ZXJhdGUgYW5kIHNldCBvdGhlciBmb3JtIGRhdGEgKi9cclxuXHRcdGlmIChleHRyYURhdGEpIHtcclxuXHRcdFx0Zm9yIChsZXQga2V5IGluIGV4dHJhRGF0YSkge1xyXG5cdFx0XHRcdGZvcm1EYXRhLmFwcGVuZChrZXksIGV4dHJhRGF0YVtrZXldKVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0LyogU2V0IHRydWUgdG8gcmVwb3J0UHJvZ3Jlc3MgdG8gZW5hYmxlIHRyYWNraW5nIG9mIHByb2dyZXNzIGV2ZW50cyAqL1xyXG5cdFx0Y29uc3QgcmVxID0gbmV3IEh0dHBSZXF1ZXN0KCdQT1NUJywgYCR7dGhpcy5lbmRwb2ludH0vJHtwYXRoID8gcGF0aCA6ICd1cGxvYWQnfWAsIGZvcm1EYXRhLCB7XHJcblx0XHRcdHJlcG9ydFByb2dyZXNzOiB0cnVlXHJcblx0XHR9KTtcclxuXHJcblx0XHQvKlxyXG5cdFx0VGhlIGBIdHRwQ2xpZW50LnJlcXVlc3RgIEFQSSBwcm9kdWNlcyBhIHJhdyBldmVudCBzdHJlYW1cclxuXHRcdHdoaWNoIGluY2x1ZGVzIHN0YXJ0IChzZW50KSwgcHJvZ3Jlc3MsIGFuZCByZXNwb25zZSBldmVudHMuXHJcblx0XHQqL1xyXG5cdFx0cmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KHJlcSk7XHJcblx0fTtcclxuXHJcblx0Ly8vI3JlZ2lvbiBIZWxwZXJzXHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnQgT2JqZWN0IHRvIEZyb21EYXRhXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGJvZHlcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgdG9Gb3JtRGF0YShib2R5OiBhbnkpOiBGb3JtRGF0YSB7XHJcblx0XHRpZiAoIWJvZHkpIHtcclxuXHRcdFx0cmV0dXJuIG5ldyBGb3JtRGF0YSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhib2R5KVxyXG5cdFx0XHQuZmlsdGVyKGtleSA9PiBib2R5W2tleV0gIT0gbnVsbCAmJiBib2R5W2tleV0gIT0gJycpXHJcblx0XHRcdC5yZWR1Y2UoKHAsIGtleSkgPT4geyBwLmFwcGVuZChrZXksIGJvZHlba2V5XSk7IHJldHVybiBwIH0sIG5ldyBGb3JtRGF0YSgpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENvbnZlcnQgT2JqZWN0IHRvIEh0dHBIZWFkZXJzXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGJvZHlcclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgdG9IdHRwSGVhZGVycyhib2R5PzogT2JqZWN0IHwgbnVsbCk6IEh0dHBIZWFkZXJzIHtcclxuXHRcdGlmICghYm9keSkge1xyXG5cdFx0XHRyZXR1cm4gbmV3IEh0dHBIZWFkZXJzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGJvZHkpXHJcblx0XHRcdC5maWx0ZXIoa2V5ID0+IChib2R5IGFzIGFueSlba2V5XSAhPSBudWxsICYmIChib2R5IGFzIGFueSlba2V5XSAhPSAnJylcclxuXHRcdFx0LnJlZHVjZSgocCwga2V5KSA9PiBwLnNldChrZXksIChib2R5IGFzIGFueSlba2V5XSksIG5ldyBIdHRwSGVhZGVycygpKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgZmlsZSBuYW1lIGZyb20gSHR0cGhlYWRlcnM6IENvbnRlbnQtRGlzcG9zaXRpb25cclxuXHQgKiBAcGFyYW0gZGlzcG9zaXRpb24gXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGdldEZpbGVOYW1lRnJvbUhlYWRlcnMoaGVhZGVyczogSHR0cEhlYWRlcnMpOiBzdHJpbmcge1xyXG5cdFx0dmFyIGRpc3Bvc2l0aW9uID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtZGlzcG9zaXRpb24nKTtcclxuXHRcdGlmIChkaXNwb3NpdGlvbiAmJiBkaXNwb3NpdGlvbi5pbmRleE9mKCdhdHRhY2htZW50JykgIT09IC0xKSB7XHJcblx0XHRcdHZhciBtYXRjaGVzID0gL2ZpbGVuYW1lW147PVxcbl0qPSgoWydcIl0pLio/XFwyfFteO1xcbl0qKS8uZXhlYyhkaXNwb3NpdGlvbik7XHJcblx0XHRcdGlmIChtYXRjaGVzICE9IG51bGwgJiYgbWF0Y2hlc1sxXSkge1xyXG5cdFx0XHRcdHJldHVybiBtYXRjaGVzWzFdLnJlcGxhY2UoL1snXCJdL2csICcnKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiBcIlwiO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBhbiBIVFRQIG9wZXJhdGlvbiB0aGF0IGZhaWxlZC5cclxuXHQgKiBBbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGNvbnRpbnVlIGJ5IHRocm93aW5nIGEgcGFyc2VkIGVycm9yLlxyXG5cdCAqIFxyXG5cdCAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBvYnNlcnZhYmxlIHJlc3VsdC5cclxuXHQgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCBmYWlsZWQuIERlZmF1bHRzIHRvICdvcGVyYXRpb24nLlxyXG5cdCAqIEBwYXJhbSByZXN1bHQgQW4gb3B0aW9uYWwgdmFsdWUgdG8gcmV0dXJuIGFzIHRoZSBvYnNlcnZhYmxlIHJlc3VsdC5cclxuXHQgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgcHJvY2Vzc2VzIHRoZSBlcnJvciBhbmQgcmV0dXJucyBhbiBvYnNlcnZhYmxlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBoYW5kbGVFcnJvcihvcGVyYXRpb24gPSAnb3BlcmF0aW9uJykge1xyXG5cdFx0cmV0dXJuIChlcnJvcjogYW55KTogT2JzZXJ2YWJsZTxhbnk+ID0+IHRocm93RXJyb3IoKCkgPT4ge1xyXG5cdFx0XHRpZiAoZXJyb3IuZXJyb3IgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xyXG5cdFx0XHRcdHJldHVybiBKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZShuZXcgVWludDhBcnJheShlcnJvci5lcnJvcikpKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IChlcnJvci5lcnJvciBpbnN0YW5jZW9mIEVycm9yRXZlbnQpID8gZXJyb3IuZXJyb3IubWVzc2FnZSA6IGBzZXJ2ZXIgcmV0dXJuZWQgY29kZSAke2Vycm9yLnN0YXR1c30gd2l0aCBib2R5IFwiJHtlcnJvci5lcnJvcn1cImA7XHJcblx0XHRcdHJldHVybiBgJHtvcGVyYXRpb259IGZhaWxlZDogJHttZXNzYWdlfWA7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJldHVybiBkaXN0aW5jdCBtZXNzYWdlIGZvciBzZW50LCB1cGxvYWQgcHJvZ3Jlc3MsICYgcmVzcG9uc2UgZXZlbnRzXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGV2ZW50IFRoZSByZXNwb25zZSBldmVudFxyXG5cdCAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIGJlZWluZyB1cGxvYWRlZFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBnZXRFdmVudE1lc3NhZ2UoZXZlbnQ6IEh0dHBFdmVudDxhbnk+LCBmaWxlOiBGaWxlKSB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcclxuXHRcdFx0LyogVXBsb2FkIHN0YXJ0ZWQgKi9cclxuXHRcdFx0Y2FzZSBIdHRwRXZlbnRUeXBlLlNlbnQ6XHJcblx0XHRcdFx0cmV0dXJuIGBVcGxvYWRpbmcgZmlsZSBcIiR7ZmlsZS5uYW1lfVwiIG9mIHNpemUgJHtmaWxlLnNpemV9LmA7XHJcblxyXG5cdFx0XHQvKiBDb21wdXRlIGFuZCBzaG93IHRoZSAlIGRvbmU6ICovXHJcblx0XHRcdGNhc2UgSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzczpcclxuXHRcdFx0XHRjb25zdCBwZXJjZW50RG9uZSA9IE1hdGgucm91bmQoMTAwICogZXZlbnQubG9hZGVkIC8gKGV2ZW50Py50b3RhbCA/PyAxKSk7XHJcblx0XHRcdFx0cmV0dXJuIGBGaWxlIFwiJHtmaWxlLm5hbWV9XCIgaXMgJHtwZXJjZW50RG9uZX0lIHVwbG9hZGVkLmA7XHJcblxyXG5cdFx0XHQvKiBVcGxvYWQgY29tcGxldGVkICovXHJcblx0XHRcdGNhc2UgSHR0cEV2ZW50VHlwZS5SZXNwb25zZTpcclxuXHRcdFx0XHRyZXR1cm4gYEZpbGUgXCIke2ZpbGUubmFtZX1cIiB3YXMgY29tcGxldGVseSB1cGxvYWRlZCFgO1xyXG5cclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHRyZXR1cm4gYEZpbGUgXCIke2ZpbGUubmFtZX1cIiBzdXJwcmlzaW5nIHVwbG9hZCBldmVudDogJHtldmVudC50eXBlfS5gO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvd3MgdXBsb2FkIHByb2dyZXNzLlxyXG5cdCAqIFxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBzaG93UHJvZ3Jlc3MobWVzc2FnZTogc3RyaW5nKSB7XHJcblx0XHRjb25zb2xlLmRlYnVnKG1lc3NhZ2UpO1xyXG5cdH1cclxuXHJcblx0Ly8jZW5kcmVnaW9uXHJcbn0iXX0=