@magicx-eng/ai-autocomplete-angular 0.42.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -5
- package/esm2020/lib/ai-autocomplete/ai-autocomplete.component.mjs +10 -5
- package/esm2020/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.mjs +9 -3
- package/esm2020/lib/controller/ai-autocomplete.controller.mjs +45 -6
- package/esm2020/lib/internal/product-strip/product-strip.component.mjs +97 -6
- package/esm2020/lib/shared/types.mjs +1 -1
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs +158 -16
- package/fesm2015/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs +157 -16
- package/fesm2020/magicx-eng-ai-autocomplete-angular.mjs.map +1 -1
- package/lib/ai-autocomplete/ai-autocomplete.component.d.ts +14 -1
- package/lib/ai-autocomplete/ai-autocomplete.component.d.ts.map +1 -1
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts +7 -0
- package/lib/ai-autocomplete-dropdown/ai-autocomplete-dropdown.component.d.ts.map +1 -1
- package/lib/controller/ai-autocomplete.controller.d.ts +17 -1
- package/lib/controller/ai-autocomplete.controller.d.ts.map +1 -1
- package/lib/internal/product-strip/product-strip.component.d.ts +29 -2
- package/lib/internal/product-strip/product-strip.component.d.ts.map +1 -1
- package/lib/shared/types.d.ts +21 -0
- package/lib/shared/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -24,6 +24,7 @@ export class AIAutocompleteController {
|
|
|
24
24
|
// here and fold it into `dropdown$` so the dropdown can read placement from
|
|
25
25
|
// the controller — configured once, kept in sync through update().
|
|
26
26
|
this.optionsPosition$ = new BehaviorSubject("below");
|
|
27
|
+
this.hasProductAddToCart$ = new BehaviorSubject(false);
|
|
27
28
|
this.isDestroyed = false;
|
|
28
29
|
if (typeof document === "undefined") {
|
|
29
30
|
throw new Error("AIAutocompleteController requires a browser environment. " +
|
|
@@ -32,8 +33,12 @@ export class AIAutocompleteController {
|
|
|
32
33
|
// Headless mode never renders to the host, so a throwaway div is fine —
|
|
33
34
|
// it's required by the core's signature for symmetry with full mode.
|
|
34
35
|
const host = document.createElement("div");
|
|
36
|
+
const { onProductAddToCart, ...coreOpts } = opts;
|
|
37
|
+
this.productAddToCart = onProductAddToCart;
|
|
38
|
+
this.hasProductAddToCart$.next(typeof onProductAddToCart === "function");
|
|
35
39
|
this.core = new CoreAIAutocomplete(host, {
|
|
36
|
-
...
|
|
40
|
+
...coreOpts,
|
|
41
|
+
onProductAddToCart: (product) => this.productAddToCart?.(product),
|
|
37
42
|
renderMode: "headless",
|
|
38
43
|
source: opts.source ?? "headless-sdk",
|
|
39
44
|
// Headless mode never renders the dropdown DOM, but the keyboard
|
|
@@ -104,7 +109,11 @@ export class AIAutocompleteController {
|
|
|
104
109
|
// at the pre-click position.
|
|
105
110
|
this.state$ = this.rawState$.pipe(map(computeState), shareReplay({ bufferSize: 1, refCount: true }));
|
|
106
111
|
this.optionsPosition$.next(opts.optionsPosition ?? "below");
|
|
107
|
-
this.dropdown$ = combineLatest([
|
|
112
|
+
this.dropdown$ = combineLatest([
|
|
113
|
+
this.rawState$,
|
|
114
|
+
this.optionsPosition$,
|
|
115
|
+
this.hasProductAddToCart$,
|
|
116
|
+
]).pipe(map(([s, optionsPosition, hasCart]) => computeDropdown(s, optionsPosition, hasCart)), shareReplay({ bufferSize: 1, refCount: true }));
|
|
108
117
|
}
|
|
109
118
|
// === Read-only accessors ===
|
|
110
119
|
/** Stable ARIA listbox ID for the dropdown. Pass to `<textarea aria-controls="...">`. */
|
|
@@ -148,6 +157,12 @@ export class AIAutocompleteController {
|
|
|
148
157
|
return;
|
|
149
158
|
this.core.reset();
|
|
150
159
|
}
|
|
160
|
+
/** Prepare the typed word before you build a submit result from your own button. */
|
|
161
|
+
prepareSubmit() {
|
|
162
|
+
if (this.isDestroyed)
|
|
163
|
+
return;
|
|
164
|
+
this.core.prepareSubmit();
|
|
165
|
+
}
|
|
151
166
|
/**
|
|
152
167
|
* Records a submit in telemetry. Enter is recorded by the SDK; call this
|
|
153
168
|
* from a submit button you render, so each submit is counted once.
|
|
@@ -177,6 +192,22 @@ export class AIAutocompleteController {
|
|
|
177
192
|
return;
|
|
178
193
|
this.core.selectProduct(product);
|
|
179
194
|
}
|
|
195
|
+
/**
|
|
196
|
+
* Add a product to the cart through `onProductAddToCart`.
|
|
197
|
+
* `<ai-autocomplete-dropdown>`'s cart buttons call this for you; consumers
|
|
198
|
+
* rendering their own strip call it themselves. Resolves once the handler's
|
|
199
|
+
* promise settles and rejects with its error. Without a handler it does
|
|
200
|
+
* nothing.
|
|
201
|
+
*/
|
|
202
|
+
addProductToCart(product) {
|
|
203
|
+
if (this.isDestroyed || !this.productAddToCart)
|
|
204
|
+
return Promise.resolve();
|
|
205
|
+
return this.core.addProductToCart(product);
|
|
206
|
+
}
|
|
207
|
+
/** Whether cards draw a cart button: an `onProductAddToCart` handler is set. */
|
|
208
|
+
hasProductAddToCart() {
|
|
209
|
+
return typeof this.productAddToCart === "function";
|
|
210
|
+
}
|
|
180
211
|
/** Promote the pill at `index` to active (front of the list). */
|
|
181
212
|
setActivePill(index) {
|
|
182
213
|
if (this.isDestroyed)
|
|
@@ -309,12 +340,19 @@ export class AIAutocompleteController {
|
|
|
309
340
|
* (`onSubmit`, `onResult`, `onError`, etc.) cannot be swapped this way — they are
|
|
310
341
|
* registered once at construction (matches the React hook's design). For
|
|
311
342
|
* dynamic event reactivity, subscribe to the corresponding observable
|
|
312
|
-
* (e.g. `text$` instead of `onChange`).
|
|
343
|
+
* (e.g. `text$` instead of `onChange`). The exception is
|
|
344
|
+
* `onProductAddToCart`, a handler rather than an event: passing the key sets,
|
|
345
|
+
* swaps or (with `undefined`) removes it, and the cart buttons follow.
|
|
313
346
|
*/
|
|
314
347
|
update(opts) {
|
|
315
348
|
if (this.isDestroyed)
|
|
316
349
|
return;
|
|
317
|
-
|
|
350
|
+
const { onProductAddToCart, ...coreOpts } = opts;
|
|
351
|
+
if ("onProductAddToCart" in opts) {
|
|
352
|
+
this.productAddToCart = onProductAddToCart;
|
|
353
|
+
this.hasProductAddToCart$.next(typeof onProductAddToCart === "function");
|
|
354
|
+
}
|
|
355
|
+
this.core.update(coreOpts);
|
|
318
356
|
if (opts.optionsPosition !== undefined) {
|
|
319
357
|
this.optionsPosition$.next(opts.optionsPosition);
|
|
320
358
|
}
|
|
@@ -381,7 +419,7 @@ function computeState(s) {
|
|
|
381
419
|
caretOffset: s.caretOffset,
|
|
382
420
|
};
|
|
383
421
|
}
|
|
384
|
-
function computeDropdown(s, optionsPosition) {
|
|
422
|
+
function computeDropdown(s, optionsPosition, hasProductAddToCart) {
|
|
385
423
|
const editingParam = s.editingParam;
|
|
386
424
|
const editingIdentified = s.editingIdentified;
|
|
387
425
|
const dateSelection = dateSelectionFor(s);
|
|
@@ -427,6 +465,7 @@ function computeDropdown(s, optionsPosition) {
|
|
|
427
465
|
selectedDateRange: dateSelection.selectedRange,
|
|
428
466
|
dateRangeStart: dateSelection.rangeStart,
|
|
429
467
|
optionsPosition,
|
|
468
|
+
hasProductAddToCart,
|
|
430
469
|
};
|
|
431
470
|
}
|
|
432
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGNBQWMsSUFBSSxrQkFBa0IsRUFHcEMsZ0JBQWdCLEVBRWhCLG9CQUFvQixFQU1wQiw4QkFBOEIsR0FDL0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQW1CLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU96RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyx3QkFBd0I7SUFtR25DOzs7T0FHRztJQUNILFlBQVksT0FBd0MsRUFBRTtRQXBHdEQsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSxtRUFBbUU7UUFDbEQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQW9CLE9BQU8sQ0FBQyxDQUFDO1FBRTVFLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBZ0cxQixJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRTtZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLDJEQUEyRDtnQkFDekQsd0VBQXdFLENBQzNFLENBQUM7U0FDSDtRQUVELHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFO1lBQ3ZDLEdBQUcsSUFBSTtZQUNQLFVBQVUsRUFBRSxVQUFVO1lBQ3RCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxJQUFJLGNBQWM7WUFDckMsaUVBQWlFO1lBQ2pFLG9F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Q0FBQyxDQUFDLG9CQUFvQjtRQUM1QyxvRUFBb0U7UUFDcEUsc0VBQXNFO1FBQ3RFLDJFQUEyRTtRQUMzRSxrQ0FBa0M7UUFDbEMsVUFBVSxFQUFFLENBQUMsQ0FBQyxnQkFBZ0I7UUFDOUIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO1FBQ3BCLGVBQWUsRUFBRSxhQUFhLENBQUMsV0FBVztRQUMxQyxpQkFBaUIsRUFBRSxhQUFhLENBQUMsYUFBYTtRQUM5QyxjQUFjLEVBQUUsYUFBYSxDQUFDLFVBQVU7UUFDeEMsZUFBZTtLQUNoQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIHR5cGUgQXV0b2NvbXBsZXRlUmVzdWx0LFxuICB0eXBlIENvbXBsZXRlZFBhcmFtU3RhdGUsXG4gIEFJQXV0b2NvbXBsZXRlIGFzIENvcmVBSUF1dG9jb21wbGV0ZSxcbiAgdHlwZSBDb3JlU3RhdGUsXG4gIHR5cGUgQ3VzdG9tRmllbGRzUmVwb3J0LFxuICBkYXRlU2VsZWN0aW9uRm9yLFxuICB0eXBlIElkZW50aWZpZWRQYXJhbVN0YXRlLFxuICBpZGVudGlmaWVkUGFyYW1MYWJlbCxcbiAgdHlwZSBQcm9kdWN0LFxuICB0eXBlIFNlZ21lbnQsXG4gIHR5cGUgU2tpcHBlZFBhcmFtU3RhdGUsXG4gIHR5cGUgU3VnZ2VzdGlvbixcbiAgdHlwZSBTdWdnZXN0aW9uT3B0aW9uLFxuICB3aXRob3V0VHJhZGl0aW9uYWxBdXRvY29tcGxldGUsXG59IGZyb20gXCJAbWFnaWN4LWVuZy9haS1hdXRvY29tcGxldGUtdmFuaWxsYVwiO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIHR5cGUgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXkgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHR5cGUge1xuICBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJPcHRpb25zLFxuICBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJTdGF0ZSxcbiAgQUlBdXRvY29tcGxldGVDb250cm9sbGVyVXBkYXRlLFxuICBBSUF1dG9jb21wbGV0ZURyb3Bkb3duU3RhdGUsXG59IGZyb20gXCIuLi9zaGFyZWQvdHlwZXNcIjtcbmltcG9ydCB7IGRlcml2ZUZpZWxkIH0gZnJvbSBcIi4vb2JzZXJ2YWJsZXNcIjtcblxuLyoqXG4gKiBUaWVyIDIgbG9naWMgc3VyZmFjZSBmb3IgYEBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS1hbmd1bGFyYCDigJQgdGhlIEFuZ3VsYXJcbiAqIGVxdWl2YWxlbnQgb2YgUmVhY3QncyBgdXNlQUlBdXRvY29tcGxldGUoKWAgaG9vay4gV3JhcHMgYSBoZWFkbGVzc1xuICogYEBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhYCBjb3JlIGFuZCBleHBvc2VzIGl0cyBzdGF0ZSBhcyBSeEpTXG4gKiBvYnNlcnZhYmxlcyBwbHVzIHRoaW4gYWN0aW9uIG1ldGhvZHMuXG4gKlxuICogVGhlIGNvbnRyb2xsZXIgaXMgY29uc3VtZXItbWFuYWdlZCDigJQgdGhlIGNvbnN1bWVyIGNyZWF0ZXMgaXRcbiAqIHdpdGggYG5ld2AsIGhvbGRzIHRoZSByZWZlcmVuY2UsIGFuZCAqKm11c3QgY2FsbCBgZGVzdHJveSgpYCoqIGluIHRoZWlyXG4gKiBvd24gYG5nT25EZXN0cm95YC4gVGhlIFRpZXIgMSBgPGFpLWF1dG9jb21wbGV0ZT5gIGNvbXBvbmVudCBkb2VzIHRoaXNcbiAqIGF1dG9tYXRpY2FsbHk7IFRpZXIgMiBjb25zdW1lcnMgZG8gbm90IGdldCBhdXRvLWNsZWFudXAuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgQUlBdXRvY29tcGxldGVDb250cm9sbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb3JlOiBDb3JlQUlBdXRvY29tcGxldGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF3U3RhdGUkOiBCZWhhdmlvclN1YmplY3Q8Q29yZVN0YXRlPjtcbiAgLy8gb3B0aW9uc1Bvc2l0aW9uIGlzbid0IHBhcnQgb2YgQ29yZVN0YXRlIChpdCdzIGEgY29yZSBvcHRpb24pLCBzbyB0cmFjayBpdFxuICAvLyBoZXJlIGFuZCBmb2xkIGl0IGludG8gYGRyb3Bkb3duJGAgc28gdGhlIGRyb3Bkb3duIGNhbiByZWFkIHBsYWNlbWVudCBmcm9tXG4gIC8vIHRoZSBjb250cm9sbGVyIOKAlCBjb25maWd1cmVkIG9uY2UsIGtlcHQgaW4gc3luYyB0aHJvdWdoIHVwZGF0ZSgpLlxuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnNQb3NpdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFwiYWJvdmVcIiB8IFwiYmVsb3dcIj4oXCJiZWxvd1wiKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZUNvcmU6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyA9PT0gUGVyLWZpZWxkIG9ic2VydmFibGVzID09PVxuICAvLyBFYWNoIG9uZSBydW5zIHRocm91Z2ggZGVyaXZlRmllbGQsIHdoaWNoIGJha2VzIGluIGRpc3RpbmN0VW50aWxDaGFuZ2VkXG4gIC8vIGFuZCBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pIHBlciDCpzE5LjQuXG5cbiAgLyoqIFBsYWluLXRleHQgY29udGVudCBvZiB0aGUgZWRpdG9yLiAqL1xuICByZWFkb25seSB0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAvKiogQ29tcGxldGVkIChib2xkKSBwYXJhbXMgY3VycmVudGx5IGluIHRoZSBlZGl0b3IuICovXG4gIHJlYWRvbmx5IGNvbXBsZXRlZFBhcmFtcyQ6IE9ic2VydmFibGU8Q29tcGxldGVkUGFyYW1TdGF0ZVtdPjtcbiAgLyoqXG4gICAqIFN1Z2dlc3Rpb25zIHRoZSB1c2VyIGRpc21pc3NlZCB3aXRoIHRoZSBza2lwIGtleSAo4oaSKS4gTm90aGluZyByZW5kZXJzXG4gICAqIHRoZW07IHRoZXkgZXhpc3Qgc28gYSBoYW5kLXJvbGxlZCBzdWJtaXQgY2FuIHBhc3MgdGhlbSB0b1xuICAgKiBgYnVpbGRTdWJtaXRSZXN1bHRgIGFuZCBjYXJyeSB0aGUgc2FtZSBgdGV4dDogXCJza2lwcGVkXCJgIGVudHJpZXMgdGhlXG4gICAqIFNESydzIG93biByZXF1ZXN0cyBkby5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWRQYXJhbXMkOiBPYnNlcnZhYmxlPFNraXBwZWRQYXJhbVN0YXRlW10+O1xuICAvKipcbiAgICogUGFyYW1zIHRoZSBzZXJ2ZXIgaWRlbnRpZmllZCBpbiB0aGUgdXNlcidzIG93biB3b3Jkcy4gQWxyZWFkeSByZW5kZXJlZFxuICAgKiB0aHJvdWdoIGBzZWdtZW50cyRgOyBleHBvc2VkIHNvIGEgaGFuZC1yb2xsZWQgc3VibWl0IGNhbiBwYXNzIHRoZW0gdG9cbiAgICogYGJ1aWxkU3VibWl0UmVzdWx0YCBhbmQgcmVwb3J0IHRoZSBzYW1lIGBpZGVudGlmaWVkX3BhcmFtc2AgdGhlIFNESydzXG4gICAqIG93biByZXN1bHRzIGNhcnJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgaWRlbnRpZmllZFBhcmFtcyQ6IE9ic2VydmFibGU8SWRlbnRpZmllZFBhcmFtU3RhdGVbXT47XG4gIC8qKiBBY3Rpb25hYmxlIHN1Z2dlc3Rpb24gcGlsbHMgKGZpcnN0IG9uZSBpcyB0aGUgYWN0aXZlIHBpbGwpLiAqL1xuICByZWFkb25seSBzdWdnZXN0aW9uUGlsbHMkOiBPYnNlcnZhYmxlPFN1Z2dlc3Rpb25bXT47XG4gIC8qKiBUZXh0ICsgY29tcGxldGVkLXBhcmFtIHNlZ21lbnRzIGZvciByZW5kZXJpbmcgdGhlIGVkaXRvciBib2R5LiAqL1xuICByZWFkb25seSBzZWdtZW50cyQ6IE9ic2VydmFibGU8U2VnbWVudFtdPjtcbiAgLyoqIElEIG9mIHRoZSBtb3N0LXJlY2VudGx5LXByb21vdGVkIHBhcmFtIChkcml2ZXMgc2hpbW1lciBhbmltYXRpb24pLiAqL1xuICByZWFkb25seSBuZXdQYXJhbUlkJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIEFsbCBzdWdnZXN0aW9ucyBmcm9tIHRoZSBzZXJ2ZXIgKGluY2x1ZGluZyBub24tYWN0aW9uYWJsZSBvbmVzKS4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGlvbnMkOiBPYnNlcnZhYmxlPFN1Z2dlc3Rpb25bXT47XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBwcm9kdWN0IHN0cmlwIHNob3dzOiB0aGUgaXRlbXMgdGhlIGxhdGVzdCBgL3N1Z2dlc3RgIHJlc3BvbnNlXG4gICAqIHJlcG9ydGVkIGFzIG1hdGNoaW5nIHRoZSBxdWVyeSwgb3Ig4oCUIHdpdGggYHByb2R1Y3RzYCBjb25maWd1cmVkIG9uIHRoZVxuICAgKiBjb250cm9sbGVyIOKAlCB0aGUgcmVzdWx0cyBvZiB0aGF0IGN1c3RvbSBzZWFyY2guXG4gICAqL1xuICByZWFkb25seSBwcm9kdWN0cyQ6IE9ic2VydmFibGU8UHJvZHVjdFtdPjtcbiAgLyoqXG4gICAqIFRoZSBjYXRhbG9nIGdyb3VuZGluZyByZXBvcnQgdGhlIGxhdGVzdCByZXNwb25zZSBjYXJyaWVkLCBvciBudWxsIHdoZW4gaXRcbiAgICogY2FycmllZCBub25lOiB3aGljaCBvZiB0aGUgcXVlcnkncyBjb25zdHJhaW50cyB0aGUgY2F0YWxvZyBhcHBsaWVkLCB3aGljaFxuICAgKiBpdCBkcm9wcGVkLCBhbmQgaG93IG1hbnkgaXRlbXMgKGFuZCB3aGljaCkgdGhlIGFwcGxpZWQgb25lcyBsZWZ0XG4gICAqIHN0YW5kaW5nLiBOdWxsIGlzIFwibm8gbmV3c1wiLCBub3QgYW4gZW1wdHkgY2F0YWxvZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbUZpZWxkcyQ6IE9ic2VydmFibGU8Q3VzdG9tRmllbGRzUmVwb3J0IHwgbnVsbD47XG4gIC8qKiBDdXJyZW50bHkgaGlnaGxpZ2h0ZWQgZHJvcGRvd24gb3B0aW9uIGluZGV4LiAtMSA9IG5vbmUuICovXG4gIHJlYWRvbmx5IGFjdGl2ZUluZGV4JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAvKipcbiAgICogVUktdmlzaWJsZSBsb2FkaW5nIGZsYWcg4oCUIHN1cHByZXNzZWQgZHVyaW5nIHRoZSBwb3N0LXNlbGVjdCBwcmVzc1xuICAgKiBhbmltYXRpb24gYW5kIGR1cmluZyByZS1lZGl0IChjYWNoZWQgb3B0aW9ucyBzdGF5IHZpc2libGUgdGhlcmUpLiBVc2VcbiAgICogdGhpcyBpbnN0ZWFkIG9mIHRoZSByYXcgY29yZSBzdGF0ZSBmb3IgYW55IGxvYWRpbmctc2tlbGV0b24gYmluZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBTZXJ2ZXItcmVwb3J0ZWQgXCJxdWVyeSBpcyBjb21wbGV0ZVwiIGZsYWcuICovXG4gIHJlYWRvbmx5IGlzUmVhZHkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogV2hldGhlciB0aGUgZWRpdG9yIGN1cnJlbnRseSBoYXMgZm9jdXMuICovXG4gIHJlYWRvbmx5IGlzRm9jdXNlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoZSBkcm9wZG93biBzaG91bGQgY3VycmVudGx5IGJlIHZpc2libGUuICovXG4gIHJlYWRvbmx5IGlzRHJvcGRvd25PcGVuJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFjdGl2ZSAobGVhZGluZykgcGlsbCBzaG91bGQgcmVuZGVyIHNlbGVjdGVkIChmdWxsIG9wYWNpdHkpXG4gICAqIHJhdGhlciB0aGFuIHRoZSBkZS1lbXBoYXNpemVkIGBmaXJzdGAgdGllci4gQXV0byB0cmlnZ2VyIOKHkiB0cnVlIG9ubHkgd2hpbGVcbiAgICogYSBkcm9wZG93biBvcHRpb24gaXMgaGlnaGxpZ2h0ZWQ7IG1hbnVhbCDih5IgdHJ1ZSBvbmNlIHRoZSBwaWxsIGlzIHRhcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWN0aXZlUGlsbFNlbGVjdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqIFNlcnZlci1zdWdnZXN0ZWQgcGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGVkaXRvci4gKi9cbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXJUZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAvKiogTGFzdCBmZXRjaCBlcnJvciwgb3IgbnVsbC4gKi9cbiAgcmVhZG9ubHkgZXJyb3IkOiBPYnNlcnZhYmxlPEVycm9yIHwgbnVsbD47XG4gIC8qKiBQYXJhbSBjdXJyZW50bHkgYmVpbmcgcmUtZWRpdGVkLCBvciBudWxsLiAqL1xuICByZWFkb25seSBlZGl0aW5nUGFyYW0kOiBPYnNlcnZhYmxlPENvbXBsZXRlZFBhcmFtU3RhdGUgfCBudWxsPjtcbiAgLyoqIFBsYWluLXRleHQgb2Zmc2V0IHdoZXJlIHRoZSBlZGl0IHJlZ2lvbiBzdGFydHMsIG9yIG51bGwuICovXG4gIHJlYWRvbmx5IGVkaXRpbmdBbmNob3IkOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+O1xuICAvKiogTGl2ZSBjYXJldCBvZmZzZXQgd2l0aGluIHRoZSBlZGl0b3IuICovXG4gIHJlYWRvbmx5IGNhcmV0T2Zmc2V0JDogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPjtcblxuICAvLyA9PT0gQ29tcG9zaXRlIG9ic2VydmFibGVzID09PVxuXG4gIC8qKlxuICAgKiBTbmFwc2hvdCBvZiBldmVyeSBwdWJsaWMgZmllbGQgaW4gb25lIG9iamVjdC4gQ29udmVuaWVudCBmb3JcbiAgICogYCpuZ0lmPVwiY3RybC5zdGF0ZSQgfCBhc3luYyBhcyBzdGF0ZVwiYCB0ZW1wbGF0aW5nIOKAlCBhbGlhc2VzIGFsbCBmaWVsZHNcbiAgICogdW5kZXIgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIGluc3RlYWQgb2YgbXVsdGlwbGUgYHwgYXN5bmNgIHBpcGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGUkOiBPYnNlcnZhYmxlPEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlPjtcblxuICAvKipcbiAgICogQ29tcG9zaXRlIHN0YXRlIGZvciB0aGUgZHJvcGRvd24gdmlldy4gVGllciAyIGNvbnN1bWVycyBzcHJlYWQgdGhpcyBpbnRvXG4gICAqIGA8YWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duPmA7IFRpZXIgMSB1c2VzIHRoZSBzYW1lIHNoYXBlIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSBkcm9wZG93biQ6IE9ic2VydmFibGU8QUlBdXRvY29tcGxldGVEcm9wZG93blN0YXRlPjtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIGludm9rZWQgb3V0c2lkZSBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZvciBTU1IgLyBBbmd1bGFyXG4gICAqIFVuaXZlcnNhbCwgZ2F0ZSBjb25zdHJ1Y3Rpb24gd2l0aCBgaXNQbGF0Zm9ybUJyb3dzZXJgLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0czogQUlBdXRvY29tcGxldGVDb250cm9sbGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFJQXV0b2NvbXBsZXRlQ29udHJvbGxlciByZXF1aXJlcyBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIFwiICtcbiAgICAgICAgICBcIkZvciBTU1IgLyBBbmd1bGFyIFVuaXZlcnNhbCwgZ2F0ZSBjb25zdHJ1Y3Rpb24gd2l0aCBpc1BsYXRmb3JtQnJvd3Nlci5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGVhZGxlc3MgbW9kZSBuZXZlciByZW5kZXJzIHRvIHRoZSBob3N0LCBzbyBhIHRocm93YXdheSBkaXYgaXMgZmluZSDigJRcbiAgICAvLyBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBjb3JlJ3Mgc2lnbmF0dXJlIGZvciBzeW1tZXRyeSB3aXRoIGZ1bGwgbW9kZS5cbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgIHRoaXMuY29yZSA9IG5ldyBDb3JlQUlBdXRvY29tcGxldGUoaG9zdCwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIHJlbmRlck1vZGU6IFwiaGVhZGxlc3NcIixcbiAgICAgIHNvdXJjZTogb3B0cy5zb3VyY2UgPz8gXCJoZWFkbGVzcy1zZGtcIixcbiAgICAgIC8vIEhlYWRsZXNzIG1vZGUgbmV2ZXIgcmVuZGVycyB0aGUgZHJvcGRvd24gRE9NLCBidXQgdGhlIGtleWJvYXJkXG4gICAgICAvLyBjb250cm9sbGVyIHN0aWxsIHJlYWRzIGBvcHRpb25zUG9zaXRpb25gIHRvIGRlY2lkZSB3aGljaCB2ZXJ0aWNhbFxuICAgICAgLy8gYXJyb3cgb3BlbnMgdGhlIGRyb3Bkb3duIGZyb20gdGhlIGlucHV0LlxuICAgICAgb3B0aW9uc1Bvc2l0aW9uOiBvcHRzLm9wdGlvbnNQb3NpdGlvbiA/PyBcImJlbG93XCIsXG4gICAgfSk7XG5cbiAgICB0aGlzLnJhd1N0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q29yZVN0YXRlPih0aGlzLmNvcmUuZ2V0U3RhdGUoKSk7XG4gICAgLy8gUHVzaCB0aGUgc3RvcmUncyAqY3VycmVudCogc3RhdGUsIG5vdCB0aGUgc25hcHNob3QgdGhlIGxpc3RlbmVyIHdhc1xuICAgIC8vIGhhbmRlZC4gVGhlIGNvcmUgbm90aWZpZXMgbGlzdGVuZXJzIHN5bmNocm9ub3VzbHksIGFuZCBzb21lIGFjdGlvbnNcbiAgICAvLyB0cmlnZ2VyIHJlZW50cmFudCBgc3RvcmUuc2V0YCBjYWxscyAoZS5nLiB0eXBpbmcgYSBub24tbWF0Y2hpbmcgY2hhclxuICAgIC8vIGR1cmluZyByZS1lZGl0IG1ha2VzIHRoZSBjb3JlIHN5bmNocm9ub3VzbHkgZXhpdCByZS1lZGl0IGFuZCBraWNrIG9mZiBhXG4gICAgLy8gZmV0Y2gpLlxuICAgIC8vXG4gICAgLy8gVGhlIGNvcmUncyBzdG9yZSB1c2VkIHRvIGRlbGl2ZXIgc3VjaCBhIG5lc3RlZCBzZXQgaW5saW5lIGFuZCB0aGVuXG4gICAgLy8gcmVzdW1lIHRoZSBvdXRlciBsaXN0ZW5lciBsb29wLCBzbyBhIGxpc3RlbmVyIGNvdWxkIGJlIGhhbmRlZCBhbiBvbGRlclxuICAgIC8vIHN0YXRlIChzdGlsbCBpbiByZS1lZGl0KSAqYWZ0ZXIqIGEgbmV3ZXIgb25lIChyZS1lZGl0IGV4aXRlZCkg4oCUIHdoaWNoXG4gICAgLy8gcmVzdXJyZWN0ZWQgYSBzdGFsZSBgZWRpdGluZ1BhcmFtYCBhbmQgcmV0cmlnZ2VyZWQgdGhlIGVkaXRvcidzIHJlLWVkaXRcbiAgICAvLyBjYXJldC1wYXJrLCB5YW5raW5nIHRoZSBjYXJldCBiYWNrIHRvIHdoZXJlIHJlLWVkaXRpbmcgc3RhcnRlZC4gVGhlXG4gICAgLy8gc3RvcmUgbm93IHF1ZXVlcyBub3RpZmljYXRpb25zIGFuZCBkcmFpbnMgdGhlbSBpbiBvcmRlciwgc28gdGhhdFxuICAgIC8vIG91dC1vZi1vcmRlciBkZWxpdmVyeSBjYW4gbm8gbG9uZ2VyIGhhcHBlbiBhdCB0aGUgc291cmNlLlxuICAgIC8vXG4gICAgLy8gUmVhZGluZyBgZ2V0U3RhdGUoKWAgYXQgZW1pc3Npb24gdGltZSBpcyBrZXB0IGFzIGJlbHQtYW5kLWJyYWNlczogaXRcbiAgICAvLyBjb3N0cyBub3RoaW5nIChkaXN0aW5jdFVudGlsQ2hhbmdlZCBkb3duc3RyZWFtIGRyb3BzIHRoZSBkdXBsaWNhdGVcbiAgICAvLyBlbWlzc2lvbnMpIGFuZCBrZWVwcyB0aGlzIGJyaWRnZSBjb3JyZWN0IGZvciBhbnkgZnV0dXJlIGNvbnN1bWVyIHRoYXRcbiAgICAvLyBlbWl0cyBtaWQtY2FzY2FkZS4gUmVhY3QgbmVlZHMgbmVpdGhlciwgc2luY2UgaXQgYmF0Y2hlcyByZW5kZXJzIGFuZFxuICAgIC8vIGdhdGVzIGl0cyBjYXJldCBlZmZlY3RzIG9uIGRlcGVuZGVuY2llcy5cbiAgICB0aGlzLnVuc3Vic2NyaWJlQ29yZSA9IHRoaXMuY29yZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmlzRGVzdHJveWVkKSB0aGlzLnJhd1N0YXRlJC5uZXh0KHRoaXMuY29yZS5nZXRTdGF0ZSgpKTtcbiAgICB9KTtcblxuICAgIC8vID09PSBQZXItZmllbGQgb2JzZXJ2YWJsZXMgPT09XG4gICAgLy8gQXJyYXktdmFsdWVkIGZpZWxkcyB1c2Ugc2hhbGxvdyBlcXVhbGl0eS4gVGhlIHZhbmlsbGEgc3RvcmUgc3ByZWFkcyBvblxuICAgIC8vIGV2ZXJ5IHdyaXRlIChgc3RvcmUuc2V0KHsgY29tcGxldGVkUGFyYW1zOiBbLi4uXSB9KWApLCBzbyByZWZlcmVuY2VcbiAgICAvLyBlcXVhbGl0eSB3b3VsZCByZS1maXJlIGRvd25zdHJlYW0gc3Vic2NyaWJlcnMgb24gZXZlcnkgc3RhdGUgdGljayBldmVuXG4gICAgLy8gd2hlbiB0aGUgYXJyYXkncyBjb250ZW50cyBhcmUgdW5jaGFuZ2VkLiBUaGUgb3RoZXIgZmllbGRzIGFyZVxuICAgIC8vIHByaW1pdGl2ZXMgb3Igc3RhYmxlIG9iamVjdCByZWZlcmVuY2VzLCBzbyBkZWZhdWx0IGlkZW50aXR5IGVxdWFsaXR5XG4gICAgLy8gd29ya3MgZmluZS5cbiAgICB0aGlzLnRleHQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLnRleHQpO1xuICAgIHRoaXMuY29tcGxldGVkUGFyYW1zJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5jb21wbGV0ZWRQYXJhbXMsIGFyckVxKTtcbiAgICB0aGlzLnNraXBwZWRQYXJhbXMkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLnNraXBwZWRQYXJhbXMsIGFyckVxKTtcbiAgICB0aGlzLmlkZW50aWZpZWRQYXJhbXMkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlkZW50aWZpZWRQYXJhbXMsIGFyckVxKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25QaWxscyQgPSBkZXJpdmVGaWVsZChcbiAgICAgIHRoaXMucmF3U3RhdGUkLFxuICAgICAgKHMpID0+IHdpdGhvdXRUcmFkaXRpb25hbEF1dG9jb21wbGV0ZShzLmFjdGlvbmFibGVTdWdnZXN0aW9ucyksXG4gICAgICBhcnJFcSxcbiAgICApO1xuICAgIHRoaXMuc2VnbWVudHMkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLnNlZ21lbnRzLCBhcnJFcSk7XG4gICAgdGhpcy5uZXdQYXJhbUlkJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5uZXdQYXJhbUlkKTtcbiAgICB0aGlzLnN1Z2dlc3Rpb25zJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5zdWdnZXN0aW9ucywgYXJyRXEpO1xuICAgIHRoaXMucHJvZHVjdHMkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLnByb2R1Y3RzLCBhcnJFcSk7XG4gICAgdGhpcy5jdXN0b21GaWVsZHMkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmN1c3RvbUZpZWxkcyk7XG4gICAgdGhpcy5hY3RpdmVJbmRleCQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuYWN0aXZlRHJvcGRvd25JbmRleCk7XG4gICAgdGhpcy5pc0xvYWRpbmckID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIGNvbXB1dGVVaUxvYWRpbmcpO1xuICAgIHRoaXMuaXNSZWFkeSQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuaXNSZWFkeSk7XG4gICAgdGhpcy5pc0ZvY3VzZWQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlzRm9jdXNlZCk7XG4gICAgdGhpcy5pc0Ryb3Bkb3duT3BlbiQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuaXNEcm9wZG93bk9wZW4pO1xuICAgIHRoaXMuaXNBY3RpdmVQaWxsU2VsZWN0ZWQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlzQWN0aXZlUGlsbFNlbGVjdGVkKTtcbiAgICB0aGlzLnBsYWNlaG9sZGVyVGV4dCQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMucGxhY2Vob2xkZXJUZXh0KTtcbiAgICB0aGlzLmVycm9yJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5lcnJvcik7XG4gICAgdGhpcy5lZGl0aW5nUGFyYW0kID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmVkaXRpbmdQYXJhbSk7XG4gICAgdGhpcy5lZGl0aW5nQW5jaG9yJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5lZGl0aW5nQW5jaG9yKTtcbiAgICB0aGlzLmNhcmV0T2Zmc2V0JCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5jYXJldE9mZnNldCk7XG5cbiAgICAvLyA9PT0gQ29tcG9zaXRlIG9ic2VydmFibGVzID09PVxuICAgIC8vIFByb2plY3QgZGlyZWN0bHkgb2ZmIGByYXdTdGF0ZSRgIHdpdGggYSBzaW5nbGUgbWFwKCkgc28gZWFjaCBzdG9yZVxuICAgIC8vIHRpY2sgcHJvZHVjZXMgZXhhY3RseSBPTkUgY29oZXJlbnQgc3RhdGUkIGVtaXNzaW9uLiBVc2luZ1xuICAgIC8vIGBjb21iaW5lTGF0ZXN0YCBvdmVyIHRoZSBwZXItZmllbGQgb2JzZXJ2YWJsZXMgaGVyZSB3b3VsZCBmaXJlIG9uZVxuICAgIC8vIGVtaXNzaW9uIHBlciBpbm5lci1zb3VyY2UgdGljayAodXAgdG8gTiBwZXIgc3RvcmUgdXBkYXRlKSwgYW5kIHRoZVxuICAgIC8vIGVkaXRvci1ob3N0IGRpcmVjdGl2ZSdzIHBvc3QtcHJvbW90ZSByZWZvY3VzIHdvdWxkIHJ1biBhZ2FpbnN0IGFuXG4gICAgLy8gaW50ZXJtZWRpYXRlIHN0YXRlIHdoZXJlIGBuZXdQYXJhbUlkYCB3YXMgc2V0IGJ1dCBgc2VnbWVudHNgIC9cbiAgICAvLyBgY2FyZXRPZmZzZXRgIHN0aWxsIGhlbGQgdGhlaXIgb2xkIHZhbHVlcyDigJQgbGVhdmluZyB0aGUgY2FyZXQgc3R1Y2tcbiAgICAvLyBhdCB0aGUgcHJlLWNsaWNrIHBvc2l0aW9uLlxuICAgIHRoaXMuc3RhdGUkID0gdGhpcy5yYXdTdGF0ZSQucGlwZShcbiAgICAgIG1hcChjb21wdXRlU3RhdGUpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICApO1xuXG4gICAgdGhpcy5vcHRpb25zUG9zaXRpb24kLm5leHQob3B0cy5vcHRpb25zUG9zaXRpb24gPz8gXCJiZWxvd1wiKTtcbiAgICB0aGlzLmRyb3Bkb3duJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMucmF3U3RhdGUkLCB0aGlzLm9wdGlvbnNQb3NpdGlvbiRdKS5waXBlKFxuICAgICAgbWFwKChbcywgb3B0aW9uc1Bvc2l0aW9uXSkgPT4gY29tcHV0ZURyb3Bkb3duKHMsIG9wdGlvbnNQb3NpdGlvbikpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICApO1xuICB9XG5cbiAgLy8gPT09IFJlYWQtb25seSBhY2Nlc3NvcnMgPT09XG5cbiAgLyoqIFN0YWJsZSBBUklBIGxpc3Rib3ggSUQgZm9yIHRoZSBkcm9wZG93bi4gUGFzcyB0byBgPHRleHRhcmVhIGFyaWEtY29udHJvbHM9XCIuLi5cIj5gLiAqL1xuICBnZXQgbGlzdGJveElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5saXN0Ym94SWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgZGVzdHJveSgpYCBoYXMgYmVlbiBjYWxsZWQuIEFmdGVyIGRlc3RydWN0aW9uIGFsbCBhY3Rpb24gbWV0aG9kcyBuby1vcC4gKi9cbiAgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBzbmFwc2hvdCBvZiB0aGUgY29udHJvbGxlcidzIGN1cnJlbnQgcHVibGljIHN0YXRlLiBNaXJyb3JzXG4gICAqIHRoZSBsYXRlc3QgZW1pc3Npb24gb2YgYHN0YXRlJGAuIFVzZWZ1bCBpbiBjYWxsYmFja3Mgd2hlcmUgeW91IGNhbid0XG4gICAqIGBzdWJzY3JpYmVgIChlLmcuIGluc2lkZSBhbiBldmVudCBoYW5kbGVyKS5cbiAgICovXG4gIGdldFN0YXRlKCk6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlIHtcbiAgICByZXR1cm4gY29tcHV0ZVN0YXRlKHRoaXMucmF3U3RhdGUkLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RydWN0dXJlZCBxdWVyeSBhcyB0aGUgU0RLIHVuZGVyc3RhbmRzIGl0IHJpZ2h0IG5vdyDigJQgdGhlIHNhbWVcbiAgICogb2JqZWN0IGBvblJlc3VsdGAgZGVsaXZlcnMgYWZ0ZXIgZWFjaCByZXNwb25zZSBhbmQgYG9uU3VibWl0YCBkZWxpdmVyc1xuICAgKiBvbiBzdWJtaXQuIFJlYWQgaXQgb24gZGVtYW5kIGZyb20gYSBwbGFjZSB0aGF0IGhhcyBubyBldmVudCBoYW5keSAoYVxuICAgKiBjdXN0b20gc3VibWl0IGJ1dHRvbiwgYSBcInNhdmUgZHJhZnRcIiBhY3Rpb24pLlxuICAgKi9cbiAgZ2V0UmVzdWx0KCk6IEF1dG9jb21wbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRSZXN1bHQoKTtcbiAgfVxuXG4gIC8vID09PSBBY3Rpb24gbWV0aG9kcyAocGFzcy10aHJvdWdoIHRvIHRoZSBjb3JlKSA9PT1cbiAgLy9cbiAgLy8gRXZlcnkgYWN0aW9uIG1ldGhvZCBiZWdpbnMgd2l0aCBhbiBgaXNEZXN0cm95ZWRgIGd1YXJkIHNvIHRoYXQgY2FsbGVyc1xuICAvLyB3aG8gaG9sZCBhIHN0YWxlIHJlZmVyZW5jZSBhZnRlciBgZGVzdHJveSgpYCBkb24ndCBhY2NpZGVudGFsbHkgdHJpZ2dlclxuICAvLyB3b3JrIG9uIGEgdG9ybi1kb3duIGNvcmUuIFRoZSB2YW5pbGxhIGNvcmUgZG9lcyBub3QgZ2F0ZSBpdHMgb3duIG1ldGhvZHNcbiAgLy8gcG9zdC1kaXNwb3NlIOKAlCBgcmVzZXQoKWAsIGBoYW5kbGVUZXh0Q2hhbmdlKClgLCBhbmQgZnJpZW5kcyB3b3VsZCBzdGlsbFxuICAvLyBzY2hlZHVsZSBmZXRjaGVzIG9yIGZpcmUgSFRUUCByZXF1ZXN0cyBhZ2FpbnN0IGFuIGFib3J0ZWQgY29udHJvbGxlcixcbiAgLy8gYW5kIHRoZSByZXNwb25zZXMgd291bGQgaGF2ZSBub3doZXJlIHRvIHN1cmZhY2UgKHJhd1N0YXRlJCBpcyBhbHJlYWR5XG4gIC8vIGNvbXBsZXRlKS4gVGhlIGd1YXJkIG1ha2VzIHRoZSBKU0RvYy1wcm9taXNlZCBcIm5vLW9wIHNpbGVudGx5XCJcbiAgLy8gc2VtYW50aWNzIGFjdHVhbGx5IHRydWUuXG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSwgcm90YXRlIGBzZXNzaW9uX2lkYCwgYW5kIHJlLWZldGNoLiBDYWxsIGFmdGVyIHN1Ym1pdC4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUucmVzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgc3VibWl0IGluIHRlbGVtZXRyeS4gRW50ZXIgaXMgcmVjb3JkZWQgYnkgdGhlIFNESzsgY2FsbCB0aGlzXG4gICAqIGZyb20gYSBzdWJtaXQgYnV0dG9uIHlvdSByZW5kZXIsIHNvIGVhY2ggc3VibWl0IGlzIGNvdW50ZWQgb25jZS5cbiAgICovXG4gIHJlY29yZFN1Ym1pdChyZXN1bHQ6IEF1dG9jb21wbGV0ZVJlc3VsdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnJlY29yZFN1Ym1pdChyZXN1bHQpO1xuICB9XG5cbiAgLyoqIFBpY2sgYSBkcm9wZG93biBvcHRpb24gKG9yIHJlcGxhY2UgdGhlIHJlLWVkaXRlZCBwYXJhbSBpZiBpbiByZS1lZGl0IG1vZGUpLiAqL1xuICBzZWxlY3RPcHRpb24ob3B0aW9uOiBTdWdnZXN0aW9uT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuc2VsZWN0T3B0aW9uKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQW5ub3VuY2UgYSBwcm9kdWN0IHNlbGVjdGlvbiDigJQgZmlyZXMgdGhlIGBvblByb2R1Y3RTZWxlY3RgIGNhbGxiYWNrIHRoZVxuICAgKiBjb250cm9sbGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLiBgPGFpLWF1dG9jb21wbGV0ZS1kcm9wZG93bj5gIGNhbGxzIHRoaXNcbiAgICogZm9yIHlvdTsgY29uc3VtZXJzIHJlbmRlcmluZyB0aGVpciBvd24gc3RyaXAgY2FsbCBpdCB0aGVtc2VsdmVzLlxuICAgKlxuICAgKiBFbWl0dGluZyBpcyB0aGUgd2hvbGUgYmVoYXZpb3VyOiB0aGUgU0RLIGRlbGliZXJhdGVseSBkb2VzIG5vdCBuYXZpZ2F0ZSB0b1xuICAgKiBgcHJvZHVjdC51cmxgLCBiZWNhdXNlIG9ubHkgdGhlIGludGVncmF0aW9uIGtub3dzIHdoZXRoZXIgYSBzZWxlY3Rpb25cbiAgICogbWVhbnMgXCJvcGVuIHRoZSBQRFBcIiwgXCJhZGQgdG8gY2FydFwiLCBvciBcImZpbGwgdGhlIGlucHV0XCIuXG4gICAqL1xuICBzZWxlY3RQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZWxlY3RQcm9kdWN0KHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqIFByb21vdGUgdGhlIHBpbGwgYXQgYGluZGV4YCB0byBhY3RpdmUgKGZyb250IG9mIHRoZSBsaXN0KS4gKi9cbiAgc2V0QWN0aXZlUGlsbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuc2V0QWN0aXZlUGlsbChpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0aGUgYWN0aXZlIHBpbGwg4oCUIHNhbWUgYWN0aW9uIGFzIHByZXNzaW5nIOKGkiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICogVGhlIGRyb3Bkb3duJ3Mgc2tpcCBidXR0b24gY2FsbHMgdGhpczsgY29uc3VtZXJzIHJlbmRlcmluZyB0aGVpciBvd24gc2tpcFxuICAgKiBhZmZvcmRhbmNlIGNhbGwgaXQgZGlyZWN0bHkuIFRoZSBza2lwcGVkIHN1Z2dlc3Rpb24gam9pbnMgYHNraXBwZWRQYXJhbXMkYC5cbiAgICovXG4gIHNraXBBY3RpdmVQaWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnNraXBBY3RpdmVQaWxsKCk7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgbGFzdCBjb21wbGV0ZWQgcGFyYW0ncyBcImNvbXBsZXRlZFwiIHN0YXR1cy4gVGV4dCBzdGF5cyBhcyBwbGFpbiB0ZXh0LiAqL1xuICByZW1vdmVMYXN0UGFyYW0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUucmVtb3ZlTGFzdFBhcmFtKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNoaW1tZXIgYW5pbWF0aW9uIHN0YXRlIGZvciB0aGUgbW9zdC1yZWNlbnRseS1hZGRlZCBwYXJhbS4gKi9cbiAgY2xlYXJOZXdQYXJhbUlkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLmNsZWFyTmV3UGFyYW1JZCgpO1xuICB9XG5cbiAgLyoqIENvbnRyb2xsZWQtbW9kZSBzZXR0ZXIgZm9yIGVkaXRvciB0ZXh0LiAqL1xuICBzZXRWYWx1ZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRWYWx1ZSh0ZXh0KTtcbiAgfVxuXG4gIC8qKiBDb250cm9sbGVkLW1vZGUgc2V0dGVyIGZvciBjb21wbGV0ZWQgcGFyYW1zLiAqL1xuICBzZXRDb21wbGV0ZWRQYXJhbXMocGFyYW1zOiBDb21wbGV0ZWRQYXJhbVN0YXRlW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRDb21wbGV0ZWRQYXJhbXMocGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHBsYWluLXRleHQgaW5wdXQgZnJvbSB0aGUgY29uc3VtZXIncyBgPHRleHRhcmVhPmAgdG8gdGhlIGNvcmUuICovXG4gIGhhbmRsZVRleHRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLmhhbmRsZVRleHRDaGFuZ2UodmFsdWUpO1xuICB9XG5cbiAgLyoqIEZvcndhcmQga2V5Ym9hcmQgZXZlbnRzIGZyb20gdGhlIGNvbnN1bWVyJ3MgYDx0ZXh0YXJlYT5gIHRvIHRoZSBjb3JlLiAqL1xuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuaGFuZGxlS2V5RG93bihldmVudCk7XG4gIH1cblxuICAvKiogTm90aWZ5IHRoZSBjb3JlIG9mIGZvY3VzIHN0YXRlLiAqL1xuICBzZXRGb2N1c2VkKGZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRGb2N1c2VkKGZvY3VzZWQpO1xuICB9XG5cbiAgLyoqIEVudGVyIHJlLWVkaXQgbW9kZSBmb3IgdGhlIGJvbGQgcGFyYW0gd2l0aCB0aGUgZ2l2ZW4gaWQuICovXG4gIHN0YXJ0RWRpdGluZ1BhcmFtKHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnN0YXJ0RWRpdGluZ1BhcmFtKHBhcmFtSWQpO1xuICB9XG5cbiAgLyoqIEV4aXQgcmUtZWRpdCBtb2RlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGJvbGQgcGFyYW0uICovXG4gIGV4aXRFZGl0TW9kZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5leGl0RWRpdE1vZGUoKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHBvc3QtaW5wdXQgY2FyZXQgcG9zaXRpb24gKGV4dGVuZHMgdGhlIGVkaXQgdGFpbCkuICovXG4gIGhhbmRsZUNhcmV0QWZ0ZXJJbnB1dChvZmZzZXQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5oYW5kbGVDYXJldEFmdGVySW5wdXQob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHNlbGVjdGlvbi1vbmx5IGNhcmV0IG1vdmVzIChtYXkgZXhpdCByZS1lZGl0KS4gKi9cbiAgaGFuZGxlQ2FyZXRNb3ZlKG9mZnNldDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLmhhbmRsZUNhcmV0TW92ZShvZmZzZXQpO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIGJvbGQgcGFyYW0gYmVpbmcgcmUtZWRpdGVkLiBSZXR1cm5zIHRydWUgd2hlbiBhcHBsaWVkLiAqL1xuICByZXBsYWNlRWRpdGluZ1JhbmdlKHJlcGxhY2VtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNvcmUucmVwbGFjZUVkaXRpbmdSYW5nZShyZXBsYWNlbWVudCk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBoaWdobGlnaHRlZCBvcHRpb24gaW5kZXggKHR5cGljYWxseSBkcml2ZW4gYnkgaG92ZXIpLiAqL1xuICBzZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnRlciBsZWZ0IG9wdGlvbiBgaW5kZXhgOiBjbGVhciB0aGUgaGlnaGxpZ2h0IGlmIGl0IGlzIHN0aWxsIG9uIGl0LFxuICAgKiBzbyBFbnRlciBhZnRlcndhcmRzIHN1Ym1pdHMgaW5zdGVhZCBvZiBwaWNraW5nIGFuIG9wdGlvbiB0aGUgcG9pbnRlciBpcyBub1xuICAgKiBsb25nZXIgb24uIEEgaGlnaGxpZ2h0IHRoZSBrZXlib2FyZCBoYXMgc2luY2UgbW92ZWQgaXMgbGVmdCBhbG9uZS5cbiAgICovXG4gIGNsZWFySGlnaGxpZ2h0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5jbGVhckhpZ2hsaWdodChpbmRleCk7XG4gIH1cblxuICAvKiogUGFnZSB0aGUgZGF0ZXBpY2tlciBiYWNrIG9uZSBtb250aC4gTm8tb3AgdW5sZXNzIGEgZGF0ZSBwaWxsIGlzIGFjdGl2ZS4gKi9cbiAgc2hvd1ByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuc2hvd1ByZXZpb3VzTW9udGgoKTtcbiAgfVxuXG4gIC8qKiBQYWdlIHRoZSBkYXRlcGlja2VyIGZvcndhcmQgb25lIG1vbnRoLiBOby1vcCB1bmxlc3MgYSBkYXRlIHBpbGwgaXMgYWN0aXZlLiAqL1xuICBzaG93TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnNob3dOZXh0TW9udGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1hcFByb2R1Y3RzIHN5bmNocm9ub3VzbHkgb24gdGhlIHNob3duIGl0ZW1zIGFnYWluIHdpdGhvdXQgYSByZXF1ZXN0LlxuICAgKiBLZWVwcyB0aGUgc2FtZSBjYXJkcyB3aGlsZSB1cGRhdGluZyB0aGVpciBjb250ZW50LlxuICAgKiBEb2VzIG5vdGhpbmcgd2l0aG91dCBtYXBQcm9kdWN0cyBvciB3aXRoIGEgY3VzdG9tIHByb2R1Y3RzIGludGVncmF0aW9uLlxuICAgKi9cbiAgcmVmcmVzaFByb2R1Y3RzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnJlZnJlc2hQcm9kdWN0cygpO1xuICB9XG5cbiAgLy8gPT09IExpZmVjeWNsZSA9PT1cblxuICAvKipcbiAgICogQXBwbHkgcnVudGltZSBjaGFuZ2VzIHRvIGEgc3Vic2V0IG9mIG9wdGlvbnMuIEV2ZW50IGNhbGxiYWNrc1xuICAgKiAoYG9uU3VibWl0YCwgYG9uUmVzdWx0YCwgYG9uRXJyb3JgLCBldGMuKSBjYW5ub3QgYmUgc3dhcHBlZCB0aGlzIHdheSDigJQgdGhleSBhcmVcbiAgICogcmVnaXN0ZXJlZCBvbmNlIGF0IGNvbnN0cnVjdGlvbiAobWF0Y2hlcyB0aGUgUmVhY3QgaG9vaydzIGRlc2lnbikuIEZvclxuICAgKiBkeW5hbWljIGV2ZW50IHJlYWN0aXZpdHksIHN1YnNjcmliZSB0byB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZhYmxlXG4gICAqIChlLmcuIGB0ZXh0JGAgaW5zdGVhZCBvZiBgb25DaGFuZ2VgKS5cbiAgICovXG4gIHVwZGF0ZShvcHRzOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJVcGRhdGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS51cGRhdGUob3B0cyk7XG4gICAgaWYgKG9wdHMub3B0aW9uc1Bvc2l0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9uc1Bvc2l0aW9uJC5uZXh0KG9wdHMub3B0aW9uc1Bvc2l0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIOKAlCB1bnN1YnNjcmliZXMgZnJvbSB0aGUgY29yZSwgZGVzdHJveXMgdGhlIGNvcmUsXG4gICAqIGFuZCBjb21wbGV0ZXMgdGhlIGludGVybmFsIHN0YXRlIHN1YmplY3QuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy5cbiAgICogQWZ0ZXIgZGVzdHJ1Y3Rpb24sIGFjdGlvbiBtZXRob2RzIG5vLW9wIHNpbGVudGx5LlxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb3JlKCk7XG4gICAgdGhpcy5jb3JlLmRlc3Ryb3koKTtcbiAgICB0aGlzLnJhd1N0YXRlJC5jb21wbGV0ZSgpO1xuICB9XG59XG5cbi8vID09PT09IFB1cmUgaGVscGVycyDigJQgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBzdXJmYWNlID09PT09XG5cbi8qKlxuICogU2hhbGxvdyBhcnJheSBlcXVhbGl0eS4gVGhlIHZhbmlsbGEgc3RvcmUgcmVhc3NpZ25zIGFycmF5IGZpZWxkcyBvbiBldmVyeVxuICogd3JpdGUgKGBzdG9yZS5zZXQoeyBjb21wbGV0ZWRQYXJhbXM6IFsuLi5wcmV2LCB4XSB9KWApLCBzbyByZWZlcmVuY2VcbiAqIGVxdWFsaXR5IGFsb25lIHdvdWxkIHJlLWVtaXQgZG93bnN0cmVhbSBldmVuIHdoZW4gdGhlIGNvbnRlbnRzIGFyZVxuICogaWRlbnRpY2FsLiBVc2VkIGZvciBgY29tcGxldGVkUGFyYW1zJGAsIGBzdWdnZXN0aW9ucyRgLCBgc3VnZ2VzdGlvblBpbGxzJGAsXG4gKiBhbmQgYHNlZ21lbnRzJGAuXG4gKi9cbmZ1bmN0aW9uIGFyckVxPFQ+KGE6IHJlYWRvbmx5IFRbXSwgYjogcmVhZG9ubHkgVFtdKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVUktdmlzaWJsZSBsb2FkaW5nIOKAlCB0aGUgY29yZSdzIGBkcm9wZG93bkxvYWRpbmdgIChzZWUgaXRzIGRvY3MpLiAqL1xuZnVuY3Rpb24gY29tcHV0ZVVpTG9hZGluZyhzOiBDb3JlU3RhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHMuZHJvcGRvd25Mb2FkaW5nO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3RhdGUoczogQ29yZVN0YXRlKTogQUlBdXRvY29tcGxldGVDb250cm9sbGVyU3RhdGUge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHMudGV4dCxcbiAgICBjb21wbGV0ZWRQYXJhbXM6IHMuY29tcGxldGVkUGFyYW1zLFxuICAgIHNraXBwZWRQYXJhbXM6IHMuc2tpcHBlZFBhcmFtcyxcbiAgICBpZGVudGlmaWVkUGFyYW1zOiBzLmlkZW50aWZpZWRQYXJhbXMsXG4gICAgc3VnZ2VzdGlvblBpbGxzOiB3aXRob3V0VHJhZGl0aW9uYWxBdXRvY29tcGxldGUocy5hY3Rpb25hYmxlU3VnZ2VzdGlvbnMpLFxuICAgIHNlZ21lbnRzOiBzLnNlZ21lbnRzLFxuICAgIG5ld1BhcmFtSWQ6IHMubmV3UGFyYW1JZCxcbiAgICBzdWdnZXN0aW9uczogcy5zdWdnZXN0aW9ucyxcbiAgICBwcm9kdWN0czogcy5wcm9kdWN0cyxcbiAgICBjdXN0b21GaWVsZHM6IHMuY3VzdG9tRmllbGRzLFxuICAgIGFjdGl2ZUluZGV4OiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgsXG4gICAgaXNMb2FkaW5nOiBjb21wdXRlVWlMb2FkaW5nKHMpLFxuICAgIGlzUmVhZHk6IHMuaXNSZWFkeSxcbiAgICBpc0ZvY3VzZWQ6IHMuaXNGb2N1c2VkLFxuICAgIGlzRHJvcGRvd25PcGVuOiBzLmlzRHJvcGRvd25PcGVuLFxuICAgIHBsYWNlaG9sZGVyVGV4dDogcy5wbGFjZWhvbGRlclRleHQsXG4gICAgZXJyb3I6IHMuZXJyb3IsXG4gICAgZWRpdGluZ1BhcmFtOiBzLmVkaXRpbmdQYXJhbSxcbiAgICBlZGl0aW5nSWRlbnRpZmllZDogcy5lZGl0aW5nSWRlbnRpZmllZCxcbiAgICBlZGl0aW5nQW5jaG9yOiBzLmVkaXRpbmdBbmNob3IsXG4gICAgY2FyZXRPZmZzZXQ6IHMuY2FyZXRPZmZzZXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEcm9wZG93bihcbiAgczogQ29yZVN0YXRlLFxuICBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIixcbik6IEFJQXV0b2NvbXBsZXRlRHJvcGRvd25TdGF0ZSB7XG4gIGNvbnN0IGVkaXRpbmdQYXJhbSA9IHMuZWRpdGluZ1BhcmFtO1xuICBjb25zdCBlZGl0aW5nSWRlbnRpZmllZCA9IHMuZWRpdGluZ0lkZW50aWZpZWQ7XG4gIGNvbnN0IGRhdGVTZWxlY3Rpb24gPSBkYXRlU2VsZWN0aW9uRm9yKHMpO1xuICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gcy5hY3Rpb25hYmxlU3VnZ2VzdGlvbnNbMF07XG4gIGNvbnN0IGRyb3Bkb3duUGlsbDogU3VnZ2VzdGlvbiB8IG51bGwgPSBlZGl0aW5nUGFyYW1cbiAgICA/IHtcbiAgICAgICAgcGFyYW1ldGVyOiBlZGl0aW5nUGFyYW0uc3VnZ2VzdGlvblBhcmFtZXRlcixcbiAgICAgICAgdGV4dDogZWRpdGluZ1BhcmFtLnN1Z2dlc3Rpb25QbGFjZWhvbGRlcixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIG9wdGlvbnM6IGVkaXRpbmdQYXJhbS5vcHRpb25zLFxuICAgICAgfVxuICAgIDogZWRpdGluZ0lkZW50aWZpZWRcbiAgICAgID8gLy8gQW5zd2VyaW5nIGEgc3BhbiB0aGUgdXNlciB3cm90ZSB0aGVtc2VsdmVzOiB0aGUgcGlsbCBuYW1lcyB0aGVcbiAgICAgICAgLy8gcGFyYW1ldGVyIHRoZSBzZXJ2ZXIgbWF0Y2hlZCBpdCB0bywgc28gdGhlIGNhbGVuZGFyIGlzbid0IHVubGFiZWxsZWQuXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IGVkaXRpbmdJZGVudGlmaWVkLnBhcmFtZXRlcixcbiAgICAgICAgICB0ZXh0OiBpZGVudGlmaWVkUGFyYW1MYWJlbChlZGl0aW5nSWRlbnRpZmllZC5wYXJhbWV0ZXIpLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG4gIGNvbnN0IGRyb3Bkb3duQWN0aXZlUGlsbCA9IHMuZHJvcGRvd25TdWdnZXN0aW9uID8/IGRyb3Bkb3duUGlsbCA/PyBhY3RpdmVTdWdnZXN0aW9uO1xuICBjb25zdCBkcm9wZG93blBpbGxzID0gZHJvcGRvd25QaWxsID8gW2Ryb3Bkb3duUGlsbF0gOiBzLmFjdGlvbmFibGVTdWdnZXN0aW9ucztcbiAgcmV0dXJuIHtcbiAgICBzdWdnZXN0aW9uczogZHJvcGRvd25BY3RpdmVQaWxsID8gW3sgLi4uZHJvcGRvd25BY3RpdmVQaWxsLCBvcHRpb25zOiBzLmRyb3Bkb3duT3B0aW9ucyB9XSA6IFtdLFxuICAgIGFjdGl2ZUluZGV4OiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgsXG4gICAgaXNPcGVuOiBzLmlzRHJvcGRvd25PcGVuLFxuICAgIHBpbGxzOiBkcm9wZG93blBpbGxzLFxuICAgIGlzQWN0aXZlUGlsbFNlbGVjdGVkOiBzLmlzQWN0aXZlUGlsbFNlbGVjdGVkLFxuICAgIGlzTG9hZGluZzogY29tcHV0ZVVpTG9hZGluZyhzKSxcbiAgICBza2VsZXRvbkV4aXRpbmc6IHMuc2tlbGV0b25FeGl0aW5nLFxuICAgIGlzSW5wdXRFbXB0eTogcy50ZXh0LnRyaW0oKS5sZW5ndGggPT09IDAsXG4gICAgcHJvZHVjdHM6IHMucHJvZHVjdHMsXG4gICAgaXNFZGl0aW5nOiBCb29sZWFuKGVkaXRpbmdQYXJhbSkgfHwgQm9vbGVhbihlZGl0aW5nSWRlbnRpZmllZCksXG4gICAgaW5TZWxlY3Rpb25BbmltYXRpb246IHMuaW5TZWxlY3Rpb25BbmltYXRpb24sXG4gICAgLy8gRGF0ZXBpY2tlci4gYHMuZmlsdGVyZWRPcHRpb25zYCBhYm92ZSBhbHJlYWR5IGNhcnJpZXMgdGhlIHZpc2libGVcbiAgICAvLyBtb250aCdzIGNlbGxzIHJhdGhlciB0aGFuIHRoZSBzdWdnZXN0aW9uJ3Mgb3duIG9wdGlvbnMgd2hlbiB0aGlzIGlzXG4gICAgLy8gXCJkYXRlXCIg4oCUIHRoZSBjb3JlIHN3YXBwZWQgdGhlbSBpbiBpdHMgZGVyaXZlIGxheWVyLCBzbyB0aGUgZHJvcGRvd24gb25seVxuICAgIC8vIGhhcyB0byBrbm93IHdoaWNoIGJvZHkgdG8gZHJhdy5cbiAgICBmb3JtYXRUeXBlOiBzLmFjdGl2ZUZvcm1hdFR5cGUsXG4gICAgZGF0ZVZpZXc6IHMuZGF0ZVZpZXcsXG4gICAgc2VsZWN0ZWREYXRlSXNvOiBkYXRlU2VsZWN0aW9uLnNlbGVjdGVkSXNvLFxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlOiBkYXRlU2VsZWN0aW9uLnNlbGVjdGVkUmFuZ2UsXG4gICAgZGF0ZVJhbmdlU3RhcnQ6IGRhdGVTZWxlY3Rpb24ucmFuZ2VTdGFydCxcbiAgICBvcHRpb25zUG9zaXRpb24sXG4gIH07XG59XG4iXX0=
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2NvbnRyb2xsZXIvYWktYXV0b2NvbXBsZXRlLmNvbnRyb2xsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUdMLGNBQWMsSUFBSSxrQkFBa0IsRUFHcEMsZ0JBQWdCLEVBRWhCLG9CQUFvQixFQU1wQiw4QkFBOEIsR0FDL0IsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQW1CLFdBQVcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQU96RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sT0FBTyx3QkFBd0I7SUF3R25DOzs7T0FHRztJQUNILFlBQVksT0FBd0MsRUFBRTtRQXpHdEQsNEVBQTRFO1FBQzVFLDRFQUE0RTtRQUM1RSxtRUFBbUU7UUFDbEQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQW9CLE9BQU8sQ0FBQyxDQUFDO1FBS25FLHlCQUFvQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRXBFLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBZ0cxQixJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsRUFBRTtZQUNuQyxNQUFNLElBQUksS0FBSyxDQUNiLDJEQUEyRDtnQkFDekQsd0VBQXdFLENBQzNFLENBQUM7U0FDSDtRQUVELHdFQUF3RTtRQUN4RSxxRUFBcUU7UUFDckUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUzQyxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFDakQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO1FBQzND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Q0FBQyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztRQUM5RCxvQkFBb0IsRUFBRSxDQUFDLENBQUMsb0JBQW9CO1FBQzVDLG9FQUFvRTtRQUNwRSxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLGtDQUFrQztRQUNsQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQjtRQUM5QixRQUFRLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDcEIsZUFBZSxFQUFFLGFBQWEsQ0FBQyxXQUFXO1FBQzFDLGlCQUFpQixFQUFFLGFBQWEsQ0FBQyxhQUFhO1FBQzlDLGNBQWMsRUFBRSxhQUFhLENBQUMsVUFBVTtRQUN4QyxlQUFlO1FBQ2YsbUJBQW1CO0tBQ3BCLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBBdXRvY29tcGxldGVSZXN1bHQsXG4gIHR5cGUgQ29tcGxldGVkUGFyYW1TdGF0ZSxcbiAgQUlBdXRvY29tcGxldGUgYXMgQ29yZUFJQXV0b2NvbXBsZXRlLFxuICB0eXBlIENvcmVTdGF0ZSxcbiAgdHlwZSBDdXN0b21GaWVsZHNSZXBvcnQsXG4gIGRhdGVTZWxlY3Rpb25Gb3IsXG4gIHR5cGUgSWRlbnRpZmllZFBhcmFtU3RhdGUsXG4gIGlkZW50aWZpZWRQYXJhbUxhYmVsLFxuICB0eXBlIFByb2R1Y3QsXG4gIHR5cGUgU2VnbWVudCxcbiAgdHlwZSBTa2lwcGVkUGFyYW1TdGF0ZSxcbiAgdHlwZSBTdWdnZXN0aW9uLFxuICB0eXBlIFN1Z2dlc3Rpb25PcHRpb24sXG4gIHdpdGhvdXRUcmFkaXRpb25hbEF1dG9jb21wbGV0ZSxcbn0gZnJvbSBcIkBtYWdpY3gtZW5nL2FpLWF1dG9jb21wbGV0ZS12YW5pbGxhXCI7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1hcCwgdHlwZSBPYnNlcnZhYmxlLCBzaGFyZVJlcGxheSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlck9wdGlvbnMsXG4gIEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlLFxuICBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJVcGRhdGUsXG4gIEFJQXV0b2NvbXBsZXRlRHJvcGRvd25TdGF0ZSxcbn0gZnJvbSBcIi4uL3NoYXJlZC90eXBlc1wiO1xuaW1wb3J0IHsgZGVyaXZlRmllbGQgfSBmcm9tIFwiLi9vYnNlcnZhYmxlc1wiO1xuXG4vKipcbiAqIFRpZXIgMiBsb2dpYyBzdXJmYWNlIGZvciBgQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLWFuZ3VsYXJgIOKAlCB0aGUgQW5ndWxhclxuICogZXF1aXZhbGVudCBvZiBSZWFjdCdzIGB1c2VBSUF1dG9jb21wbGV0ZSgpYCBob29rLiBXcmFwcyBhIGhlYWRsZXNzXG4gKiBgQG1hZ2ljeC1lbmcvYWktYXV0b2NvbXBsZXRlLXZhbmlsbGFgIGNvcmUgYW5kIGV4cG9zZXMgaXRzIHN0YXRlIGFzIFJ4SlNcbiAqIG9ic2VydmFibGVzIHBsdXMgdGhpbiBhY3Rpb24gbWV0aG9kcy5cbiAqXG4gKiBUaGUgY29udHJvbGxlciBpcyBjb25zdW1lci1tYW5hZ2VkIOKAlCB0aGUgY29uc3VtZXIgY3JlYXRlcyBpdFxuICogd2l0aCBgbmV3YCwgaG9sZHMgdGhlIHJlZmVyZW5jZSwgYW5kICoqbXVzdCBjYWxsIGBkZXN0cm95KClgKiogaW4gdGhlaXJcbiAqIG93biBgbmdPbkRlc3Ryb3lgLiBUaGUgVGllciAxIGA8YWktYXV0b2NvbXBsZXRlPmAgY29tcG9uZW50IGRvZXMgdGhpc1xuICogYXV0b21hdGljYWxseTsgVGllciAyIGNvbnN1bWVycyBkbyBub3QgZ2V0IGF1dG8tY2xlYW51cC5cbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvcmU6IENvcmVBSUF1dG9jb21wbGV0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSByYXdTdGF0ZSQ6IEJlaGF2aW9yU3ViamVjdDxDb3JlU3RhdGU+O1xuICAvLyBvcHRpb25zUG9zaXRpb24gaXNuJ3QgcGFydCBvZiBDb3JlU3RhdGUgKGl0J3MgYSBjb3JlIG9wdGlvbiksIHNvIHRyYWNrIGl0XG4gIC8vIGhlcmUgYW5kIGZvbGQgaXQgaW50byBgZHJvcGRvd24kYCBzbyB0aGUgZHJvcGRvd24gY2FuIHJlYWQgcGxhY2VtZW50IGZyb21cbiAgLy8gdGhlIGNvbnRyb2xsZXIg4oCUIGNvbmZpZ3VyZWQgb25jZSwga2VwdCBpbiBzeW5jIHRocm91Z2ggdXBkYXRlKCkuXG4gIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uc1Bvc2l0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XCJhYm92ZVwiIHwgXCJiZWxvd1wiPihcImJlbG93XCIpO1xuICAvLyBUaGUgYWRkLXRvLWNhcnQgaGFuZGxlciBsaXZlcyBoZXJlIHJhdGhlciB0aGFuIGluIHRoZSBjb3JlLCBzbyB1cGRhdGUoKVxuICAvLyBjYW4gc3dhcCBvciByZW1vdmUgaXQgKHRoZSBjb3JlIHRha2VzIGl0IG9uY2UpOyB0aGUgY29yZSBnZXRzIGEgZm9yd2FyZGVyLlxuICAvLyBXaGV0aGVyIG9uZSBpcyBzZXQgZm9sZHMgaW50byBgZHJvcGRvd24kYCwgd2hpY2ggZHJhd3MgdGhlIGJ1dHRvbnMgb2ZmIGl0LlxuICBwcml2YXRlIHByb2R1Y3RBZGRUb0NhcnQ6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlck9wdGlvbnNbXCJvblByb2R1Y3RBZGRUb0NhcnRcIl07XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFzUHJvZHVjdEFkZFRvQ2FydCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSB1bnN1YnNjcmliZUNvcmU6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyA9PT0gUGVyLWZpZWxkIG9ic2VydmFibGVzID09PVxuICAvLyBFYWNoIG9uZSBydW5zIHRocm91Z2ggZGVyaXZlRmllbGQsIHdoaWNoIGJha2VzIGluIGRpc3RpbmN0VW50aWxDaGFuZ2VkXG4gIC8vIGFuZCBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pIHBlciDCpzE5LjQuXG5cbiAgLyoqIFBsYWluLXRleHQgY29udGVudCBvZiB0aGUgZWRpdG9yLiAqL1xuICByZWFkb25seSB0ZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAvKiogQ29tcGxldGVkIChib2xkKSBwYXJhbXMgY3VycmVudGx5IGluIHRoZSBlZGl0b3IuICovXG4gIHJlYWRvbmx5IGNvbXBsZXRlZFBhcmFtcyQ6IE9ic2VydmFibGU8Q29tcGxldGVkUGFyYW1TdGF0ZVtdPjtcbiAgLyoqXG4gICAqIFN1Z2dlc3Rpb25zIHRoZSB1c2VyIGRpc21pc3NlZCB3aXRoIHRoZSBza2lwIGtleSAo4oaSKS4gTm90aGluZyByZW5kZXJzXG4gICAqIHRoZW07IHRoZXkgZXhpc3Qgc28gYSBoYW5kLXJvbGxlZCBzdWJtaXQgY2FuIHBhc3MgdGhlbSB0b1xuICAgKiBgYnVpbGRTdWJtaXRSZXN1bHRgIGFuZCBjYXJyeSB0aGUgc2FtZSBgdGV4dDogXCJza2lwcGVkXCJgIGVudHJpZXMgdGhlXG4gICAqIFNESydzIG93biByZXF1ZXN0cyBkby5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBwZWRQYXJhbXMkOiBPYnNlcnZhYmxlPFNraXBwZWRQYXJhbVN0YXRlW10+O1xuICAvKipcbiAgICogUGFyYW1zIHRoZSBzZXJ2ZXIgaWRlbnRpZmllZCBpbiB0aGUgdXNlcidzIG93biB3b3Jkcy4gQWxyZWFkeSByZW5kZXJlZFxuICAgKiB0aHJvdWdoIGBzZWdtZW50cyRgOyBleHBvc2VkIHNvIGEgaGFuZC1yb2xsZWQgc3VibWl0IGNhbiBwYXNzIHRoZW0gdG9cbiAgICogYGJ1aWxkU3VibWl0UmVzdWx0YCBhbmQgcmVwb3J0IHRoZSBzYW1lIGBpZGVudGlmaWVkX3BhcmFtc2AgdGhlIFNESydzXG4gICAqIG93biByZXN1bHRzIGNhcnJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgaWRlbnRpZmllZFBhcmFtcyQ6IE9ic2VydmFibGU8SWRlbnRpZmllZFBhcmFtU3RhdGVbXT47XG4gIC8qKiBBY3Rpb25hYmxlIHN1Z2dlc3Rpb24gcGlsbHMgKGZpcnN0IG9uZSBpcyB0aGUgYWN0aXZlIHBpbGwpLiAqL1xuICByZWFkb25seSBzdWdnZXN0aW9uUGlsbHMkOiBPYnNlcnZhYmxlPFN1Z2dlc3Rpb25bXT47XG4gIC8qKiBUZXh0ICsgY29tcGxldGVkLXBhcmFtIHNlZ21lbnRzIGZvciByZW5kZXJpbmcgdGhlIGVkaXRvciBib2R5LiAqL1xuICByZWFkb25seSBzZWdtZW50cyQ6IE9ic2VydmFibGU8U2VnbWVudFtdPjtcbiAgLyoqIElEIG9mIHRoZSBtb3N0LXJlY2VudGx5LXByb21vdGVkIHBhcmFtIChkcml2ZXMgc2hpbW1lciBhbmltYXRpb24pLiAqL1xuICByZWFkb25seSBuZXdQYXJhbUlkJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCBudWxsPjtcbiAgLyoqIEFsbCBzdWdnZXN0aW9ucyBmcm9tIHRoZSBzZXJ2ZXIgKGluY2x1ZGluZyBub24tYWN0aW9uYWJsZSBvbmVzKS4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGlvbnMkOiBPYnNlcnZhYmxlPFN1Z2dlc3Rpb25bXT47XG4gIC8qKlxuICAgKiBXaGF0IHRoZSBwcm9kdWN0IHN0cmlwIHNob3dzOiB0aGUgaXRlbXMgdGhlIGxhdGVzdCBgL3N1Z2dlc3RgIHJlc3BvbnNlXG4gICAqIHJlcG9ydGVkIGFzIG1hdGNoaW5nIHRoZSBxdWVyeSwgb3Ig4oCUIHdpdGggYHByb2R1Y3RzYCBjb25maWd1cmVkIG9uIHRoZVxuICAgKiBjb250cm9sbGVyIOKAlCB0aGUgcmVzdWx0cyBvZiB0aGF0IGN1c3RvbSBzZWFyY2guXG4gICAqL1xuICByZWFkb25seSBwcm9kdWN0cyQ6IE9ic2VydmFibGU8UHJvZHVjdFtdPjtcbiAgLyoqXG4gICAqIFRoZSBjYXRhbG9nIGdyb3VuZGluZyByZXBvcnQgdGhlIGxhdGVzdCByZXNwb25zZSBjYXJyaWVkLCBvciBudWxsIHdoZW4gaXRcbiAgICogY2FycmllZCBub25lOiB3aGljaCBvZiB0aGUgcXVlcnkncyBjb25zdHJhaW50cyB0aGUgY2F0YWxvZyBhcHBsaWVkLCB3aGljaFxuICAgKiBpdCBkcm9wcGVkLCBhbmQgaG93IG1hbnkgaXRlbXMgKGFuZCB3aGljaCkgdGhlIGFwcGxpZWQgb25lcyBsZWZ0XG4gICAqIHN0YW5kaW5nLiBOdWxsIGlzIFwibm8gbmV3c1wiLCBub3QgYW4gZW1wdHkgY2F0YWxvZy5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbUZpZWxkcyQ6IE9ic2VydmFibGU8Q3VzdG9tRmllbGRzUmVwb3J0IHwgbnVsbD47XG4gIC8qKiBDdXJyZW50bHkgaGlnaGxpZ2h0ZWQgZHJvcGRvd24gb3B0aW9uIGluZGV4LiAtMSA9IG5vbmUuICovXG4gIHJlYWRvbmx5IGFjdGl2ZUluZGV4JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAvKipcbiAgICogVUktdmlzaWJsZSBsb2FkaW5nIGZsYWcg4oCUIHN1cHByZXNzZWQgZHVyaW5nIHRoZSBwb3N0LXNlbGVjdCBwcmVzc1xuICAgKiBhbmltYXRpb24gYW5kIGR1cmluZyByZS1lZGl0IChjYWNoZWQgb3B0aW9ucyBzdGF5IHZpc2libGUgdGhlcmUpLiBVc2VcbiAgICogdGhpcyBpbnN0ZWFkIG9mIHRoZSByYXcgY29yZSBzdGF0ZSBmb3IgYW55IGxvYWRpbmctc2tlbGV0b24gYmluZGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGlzTG9hZGluZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBTZXJ2ZXItcmVwb3J0ZWQgXCJxdWVyeSBpcyBjb21wbGV0ZVwiIGZsYWcuICovXG4gIHJlYWRvbmx5IGlzUmVhZHkkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKiogV2hldGhlciB0aGUgZWRpdG9yIGN1cnJlbnRseSBoYXMgZm9jdXMuICovXG4gIHJlYWRvbmx5IGlzRm9jdXNlZCQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoZSBkcm9wZG93biBzaG91bGQgY3VycmVudGx5IGJlIHZpc2libGUuICovXG4gIHJlYWRvbmx5IGlzRHJvcGRvd25PcGVuJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFjdGl2ZSAobGVhZGluZykgcGlsbCBzaG91bGQgcmVuZGVyIHNlbGVjdGVkIChmdWxsIG9wYWNpdHkpXG4gICAqIHJhdGhlciB0aGFuIHRoZSBkZS1lbXBoYXNpemVkIGBmaXJzdGAgdGllci4gQXV0byB0cmlnZ2VyIOKHkiB0cnVlIG9ubHkgd2hpbGVcbiAgICogYSBkcm9wZG93biBvcHRpb24gaXMgaGlnaGxpZ2h0ZWQ7IG1hbnVhbCDih5IgdHJ1ZSBvbmNlIHRoZSBwaWxsIGlzIHRhcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWN0aXZlUGlsbFNlbGVjdGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgLyoqIFNlcnZlci1zdWdnZXN0ZWQgcGxhY2Vob2xkZXIgdGV4dCBmb3IgdGhlIGVkaXRvci4gKi9cbiAgcmVhZG9ubHkgcGxhY2Vob2xkZXJUZXh0JDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICAvKiogTGFzdCBmZXRjaCBlcnJvciwgb3IgbnVsbC4gKi9cbiAgcmVhZG9ubHkgZXJyb3IkOiBPYnNlcnZhYmxlPEVycm9yIHwgbnVsbD47XG4gIC8qKiBQYXJhbSBjdXJyZW50bHkgYmVpbmcgcmUtZWRpdGVkLCBvciBudWxsLiAqL1xuICByZWFkb25seSBlZGl0aW5nUGFyYW0kOiBPYnNlcnZhYmxlPENvbXBsZXRlZFBhcmFtU3RhdGUgfCBudWxsPjtcbiAgLyoqIFBsYWluLXRleHQgb2Zmc2V0IHdoZXJlIHRoZSBlZGl0IHJlZ2lvbiBzdGFydHMsIG9yIG51bGwuICovXG4gIHJlYWRvbmx5IGVkaXRpbmdBbmNob3IkOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+O1xuICAvKiogTGl2ZSBjYXJldCBvZmZzZXQgd2l0aGluIHRoZSBlZGl0b3IuICovXG4gIHJlYWRvbmx5IGNhcmV0T2Zmc2V0JDogT2JzZXJ2YWJsZTxudW1iZXIgfCBudWxsPjtcblxuICAvLyA9PT0gQ29tcG9zaXRlIG9ic2VydmFibGVzID09PVxuXG4gIC8qKlxuICAgKiBTbmFwc2hvdCBvZiBldmVyeSBwdWJsaWMgZmllbGQgaW4gb25lIG9iamVjdC4gQ29udmVuaWVudCBmb3JcbiAgICogYCpuZ0lmPVwiY3RybC5zdGF0ZSQgfCBhc3luYyBhcyBzdGF0ZVwiYCB0ZW1wbGF0aW5nIOKAlCBhbGlhc2VzIGFsbCBmaWVsZHNcbiAgICogdW5kZXIgYSBzaW5nbGUgc3Vic2NyaXB0aW9uIGluc3RlYWQgb2YgbXVsdGlwbGUgYHwgYXN5bmNgIHBpcGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGUkOiBPYnNlcnZhYmxlPEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlPjtcblxuICAvKipcbiAgICogQ29tcG9zaXRlIHN0YXRlIGZvciB0aGUgZHJvcGRvd24gdmlldy4gVGllciAyIGNvbnN1bWVycyBzcHJlYWQgdGhpcyBpbnRvXG4gICAqIGA8YWktYXV0b2NvbXBsZXRlLWRyb3Bkb3duPmA7IFRpZXIgMSB1c2VzIHRoZSBzYW1lIHNoYXBlIGludGVybmFsbHkuXG4gICAqL1xuICByZWFkb25seSBkcm9wZG93biQ6IE9ic2VydmFibGU8QUlBdXRvY29tcGxldGVEcm9wZG93blN0YXRlPjtcblxuICAvKipcbiAgICogVGhyb3dzIGlmIGludm9rZWQgb3V0c2lkZSBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIEZvciBTU1IgLyBBbmd1bGFyXG4gICAqIFVuaXZlcnNhbCwgZ2F0ZSBjb25zdHJ1Y3Rpb24gd2l0aCBgaXNQbGF0Zm9ybUJyb3dzZXJgLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0czogQUlBdXRvY29tcGxldGVDb250cm9sbGVyT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFJQXV0b2NvbXBsZXRlQ29udHJvbGxlciByZXF1aXJlcyBhIGJyb3dzZXIgZW52aXJvbm1lbnQuIFwiICtcbiAgICAgICAgICBcIkZvciBTU1IgLyBBbmd1bGFyIFVuaXZlcnNhbCwgZ2F0ZSBjb25zdHJ1Y3Rpb24gd2l0aCBpc1BsYXRmb3JtQnJvd3Nlci5cIixcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gSGVhZGxlc3MgbW9kZSBuZXZlciByZW5kZXJzIHRvIHRoZSBob3N0LCBzbyBhIHRocm93YXdheSBkaXYgaXMgZmluZSDigJRcbiAgICAvLyBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBjb3JlJ3Mgc2lnbmF0dXJlIGZvciBzeW1tZXRyeSB3aXRoIGZ1bGwgbW9kZS5cbiAgICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgIGNvbnN0IHsgb25Qcm9kdWN0QWRkVG9DYXJ0LCAuLi5jb3JlT3B0cyB9ID0gb3B0cztcbiAgICB0aGlzLnByb2R1Y3RBZGRUb0NhcnQgPSBvblByb2R1Y3RBZGRUb0NhcnQ7XG4gICAgdGhpcy5oYXNQcm9kdWN0QWRkVG9DYXJ0JC5uZXh0KHR5cGVvZiBvblByb2R1Y3RBZGRUb0NhcnQgPT09IFwiZnVuY3Rpb25cIik7XG5cbiAgICB0aGlzLmNvcmUgPSBuZXcgQ29yZUFJQXV0b2NvbXBsZXRlKGhvc3QsIHtcbiAgICAgIC4uLmNvcmVPcHRzLFxuICAgICAgb25Qcm9kdWN0QWRkVG9DYXJ0OiAocHJvZHVjdCkgPT4gdGhpcy5wcm9kdWN0QWRkVG9DYXJ0Py4ocHJvZHVjdCksXG4gICAgICByZW5kZXJNb2RlOiBcImhlYWRsZXNzXCIsXG4gICAgICBzb3VyY2U6IG9wdHMuc291cmNlID8/IFwiaGVhZGxlc3Mtc2RrXCIsXG4gICAgICAvLyBIZWFkbGVzcyBtb2RlIG5ldmVyIHJlbmRlcnMgdGhlIGRyb3Bkb3duIERPTSwgYnV0IHRoZSBrZXlib2FyZFxuICAgICAgLy8gY29udHJvbGxlciBzdGlsbCByZWFkcyBgb3B0aW9uc1Bvc2l0aW9uYCB0byBkZWNpZGUgd2hpY2ggdmVydGljYWxcbiAgICAgIC8vIGFycm93IG9wZW5zIHRoZSBkcm9wZG93biBmcm9tIHRoZSBpbnB1dC5cbiAgICAgIG9wdGlvbnNQb3NpdGlvbjogb3B0cy5vcHRpb25zUG9zaXRpb24gPz8gXCJiZWxvd1wiLFxuICAgIH0pO1xuXG4gICAgdGhpcy5yYXdTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENvcmVTdGF0ZT4odGhpcy5jb3JlLmdldFN0YXRlKCkpO1xuICAgIC8vIFB1c2ggdGhlIHN0b3JlJ3MgKmN1cnJlbnQqIHN0YXRlLCBub3QgdGhlIHNuYXBzaG90IHRoZSBsaXN0ZW5lciB3YXNcbiAgICAvLyBoYW5kZWQuIFRoZSBjb3JlIG5vdGlmaWVzIGxpc3RlbmVycyBzeW5jaHJvbm91c2x5LCBhbmQgc29tZSBhY3Rpb25zXG4gICAgLy8gdHJpZ2dlciByZWVudHJhbnQgYHN0b3JlLnNldGAgY2FsbHMgKGUuZy4gdHlwaW5nIGEgbm9uLW1hdGNoaW5nIGNoYXJcbiAgICAvLyBkdXJpbmcgcmUtZWRpdCBtYWtlcyB0aGUgY29yZSBzeW5jaHJvbm91c2x5IGV4aXQgcmUtZWRpdCBhbmQga2ljayBvZmYgYVxuICAgIC8vIGZldGNoKS5cbiAgICAvL1xuICAgIC8vIFRoZSBjb3JlJ3Mgc3RvcmUgdXNlZCB0byBkZWxpdmVyIHN1Y2ggYSBuZXN0ZWQgc2V0IGlubGluZSBhbmQgdGhlblxuICAgIC8vIHJlc3VtZSB0aGUgb3V0ZXIgbGlzdGVuZXIgbG9vcCwgc28gYSBsaXN0ZW5lciBjb3VsZCBiZSBoYW5kZWQgYW4gb2xkZXJcbiAgICAvLyBzdGF0ZSAoc3RpbGwgaW4gcmUtZWRpdCkgKmFmdGVyKiBhIG5ld2VyIG9uZSAocmUtZWRpdCBleGl0ZWQpIOKAlCB3aGljaFxuICAgIC8vIHJlc3VycmVjdGVkIGEgc3RhbGUgYGVkaXRpbmdQYXJhbWAgYW5kIHJldHJpZ2dlcmVkIHRoZSBlZGl0b3IncyByZS1lZGl0XG4gICAgLy8gY2FyZXQtcGFyaywgeWFua2luZyB0aGUgY2FyZXQgYmFjayB0byB3aGVyZSByZS1lZGl0aW5nIHN0YXJ0ZWQuIFRoZVxuICAgIC8vIHN0b3JlIG5vdyBxdWV1ZXMgbm90aWZpY2F0aW9ucyBhbmQgZHJhaW5zIHRoZW0gaW4gb3JkZXIsIHNvIHRoYXRcbiAgICAvLyBvdXQtb2Ytb3JkZXIgZGVsaXZlcnkgY2FuIG5vIGxvbmdlciBoYXBwZW4gYXQgdGhlIHNvdXJjZS5cbiAgICAvL1xuICAgIC8vIFJlYWRpbmcgYGdldFN0YXRlKClgIGF0IGVtaXNzaW9uIHRpbWUgaXMga2VwdCBhcyBiZWx0LWFuZC1icmFjZXM6IGl0XG4gICAgLy8gY29zdHMgbm90aGluZyAoZGlzdGluY3RVbnRpbENoYW5nZWQgZG93bnN0cmVhbSBkcm9wcyB0aGUgZHVwbGljYXRlXG4gICAgLy8gZW1pc3Npb25zKSBhbmQga2VlcHMgdGhpcyBicmlkZ2UgY29ycmVjdCBmb3IgYW55IGZ1dHVyZSBjb25zdW1lciB0aGF0XG4gICAgLy8gZW1pdHMgbWlkLWNhc2NhZGUuIFJlYWN0IG5lZWRzIG5laXRoZXIsIHNpbmNlIGl0IGJhdGNoZXMgcmVuZGVycyBhbmRcbiAgICAvLyBnYXRlcyBpdHMgY2FyZXQgZWZmZWN0cyBvbiBkZXBlbmRlbmNpZXMuXG4gICAgdGhpcy51bnN1YnNjcmliZUNvcmUgPSB0aGlzLmNvcmUuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5pc0Rlc3Ryb3llZCkgdGhpcy5yYXdTdGF0ZSQubmV4dCh0aGlzLmNvcmUuZ2V0U3RhdGUoKSk7XG4gICAgfSk7XG5cbiAgICAvLyA9PT0gUGVyLWZpZWxkIG9ic2VydmFibGVzID09PVxuICAgIC8vIEFycmF5LXZhbHVlZCBmaWVsZHMgdXNlIHNoYWxsb3cgZXF1YWxpdHkuIFRoZSB2YW5pbGxhIHN0b3JlIHNwcmVhZHMgb25cbiAgICAvLyBldmVyeSB3cml0ZSAoYHN0b3JlLnNldCh7IGNvbXBsZXRlZFBhcmFtczogWy4uLl0gfSlgKSwgc28gcmVmZXJlbmNlXG4gICAgLy8gZXF1YWxpdHkgd291bGQgcmUtZmlyZSBkb3duc3RyZWFtIHN1YnNjcmliZXJzIG9uIGV2ZXJ5IHN0YXRlIHRpY2sgZXZlblxuICAgIC8vIHdoZW4gdGhlIGFycmF5J3MgY29udGVudHMgYXJlIHVuY2hhbmdlZC4gVGhlIG90aGVyIGZpZWxkcyBhcmVcbiAgICAvLyBwcmltaXRpdmVzIG9yIHN0YWJsZSBvYmplY3QgcmVmZXJlbmNlcywgc28gZGVmYXVsdCBpZGVudGl0eSBlcXVhbGl0eVxuICAgIC8vIHdvcmtzIGZpbmUuXG4gICAgdGhpcy50ZXh0JCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy50ZXh0KTtcbiAgICB0aGlzLmNvbXBsZXRlZFBhcmFtcyQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuY29tcGxldGVkUGFyYW1zLCBhcnJFcSk7XG4gICAgdGhpcy5za2lwcGVkUGFyYW1zJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5za2lwcGVkUGFyYW1zLCBhcnJFcSk7XG4gICAgdGhpcy5pZGVudGlmaWVkUGFyYW1zJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5pZGVudGlmaWVkUGFyYW1zLCBhcnJFcSk7XG4gICAgdGhpcy5zdWdnZXN0aW9uUGlsbHMkID0gZGVyaXZlRmllbGQoXG4gICAgICB0aGlzLnJhd1N0YXRlJCxcbiAgICAgIChzKSA9PiB3aXRob3V0VHJhZGl0aW9uYWxBdXRvY29tcGxldGUocy5hY3Rpb25hYmxlU3VnZ2VzdGlvbnMpLFxuICAgICAgYXJyRXEsXG4gICAgKTtcbiAgICB0aGlzLnNlZ21lbnRzJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5zZWdtZW50cywgYXJyRXEpO1xuICAgIHRoaXMubmV3UGFyYW1JZCQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMubmV3UGFyYW1JZCk7XG4gICAgdGhpcy5zdWdnZXN0aW9ucyQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuc3VnZ2VzdGlvbnMsIGFyckVxKTtcbiAgICB0aGlzLnByb2R1Y3RzJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5wcm9kdWN0cywgYXJyRXEpO1xuICAgIHRoaXMuY3VzdG9tRmllbGRzJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5jdXN0b21GaWVsZHMpO1xuICAgIHRoaXMuYWN0aXZlSW5kZXgkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgpO1xuICAgIHRoaXMuaXNMb2FkaW5nJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCBjb21wdXRlVWlMb2FkaW5nKTtcbiAgICB0aGlzLmlzUmVhZHkkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlzUmVhZHkpO1xuICAgIHRoaXMuaXNGb2N1c2VkJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5pc0ZvY3VzZWQpO1xuICAgIHRoaXMuaXNEcm9wZG93bk9wZW4kID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLmlzRHJvcGRvd25PcGVuKTtcbiAgICB0aGlzLmlzQWN0aXZlUGlsbFNlbGVjdGVkJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5pc0FjdGl2ZVBpbGxTZWxlY3RlZCk7XG4gICAgdGhpcy5wbGFjZWhvbGRlclRleHQkID0gZGVyaXZlRmllbGQodGhpcy5yYXdTdGF0ZSQsIChzKSA9PiBzLnBsYWNlaG9sZGVyVGV4dCk7XG4gICAgdGhpcy5lcnJvciQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuZXJyb3IpO1xuICAgIHRoaXMuZWRpdGluZ1BhcmFtJCA9IGRlcml2ZUZpZWxkKHRoaXMucmF3U3RhdGUkLCAocykgPT4gcy5lZGl0aW5nUGFyYW0pO1xuICAgIHRoaXMuZWRpdGluZ0FuY2hvciQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuZWRpdGluZ0FuY2hvcik7XG4gICAgdGhpcy5jYXJldE9mZnNldCQgPSBkZXJpdmVGaWVsZCh0aGlzLnJhd1N0YXRlJCwgKHMpID0+IHMuY2FyZXRPZmZzZXQpO1xuXG4gICAgLy8gPT09IENvbXBvc2l0ZSBvYnNlcnZhYmxlcyA9PT1cbiAgICAvLyBQcm9qZWN0IGRpcmVjdGx5IG9mZiBgcmF3U3RhdGUkYCB3aXRoIGEgc2luZ2xlIG1hcCgpIHNvIGVhY2ggc3RvcmVcbiAgICAvLyB0aWNrIHByb2R1Y2VzIGV4YWN0bHkgT05FIGNvaGVyZW50IHN0YXRlJCBlbWlzc2lvbi4gVXNpbmdcbiAgICAvLyBgY29tYmluZUxhdGVzdGAgb3ZlciB0aGUgcGVyLWZpZWxkIG9ic2VydmFibGVzIGhlcmUgd291bGQgZmlyZSBvbmVcbiAgICAvLyBlbWlzc2lvbiBwZXIgaW5uZXItc291cmNlIHRpY2sgKHVwIHRvIE4gcGVyIHN0b3JlIHVwZGF0ZSksIGFuZCB0aGVcbiAgICAvLyBlZGl0b3ItaG9zdCBkaXJlY3RpdmUncyBwb3N0LXByb21vdGUgcmVmb2N1cyB3b3VsZCBydW4gYWdhaW5zdCBhblxuICAgIC8vIGludGVybWVkaWF0ZSBzdGF0ZSB3aGVyZSBgbmV3UGFyYW1JZGAgd2FzIHNldCBidXQgYHNlZ21lbnRzYCAvXG4gICAgLy8gYGNhcmV0T2Zmc2V0YCBzdGlsbCBoZWxkIHRoZWlyIG9sZCB2YWx1ZXMg4oCUIGxlYXZpbmcgdGhlIGNhcmV0IHN0dWNrXG4gICAgLy8gYXQgdGhlIHByZS1jbGljayBwb3NpdGlvbi5cbiAgICB0aGlzLnN0YXRlJCA9IHRoaXMucmF3U3RhdGUkLnBpcGUoXG4gICAgICBtYXAoY29tcHV0ZVN0YXRlKSxcbiAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IHRydWUgfSksXG4gICAgKTtcblxuICAgIHRoaXMub3B0aW9uc1Bvc2l0aW9uJC5uZXh0KG9wdHMub3B0aW9uc1Bvc2l0aW9uID8/IFwiYmVsb3dcIik7XG4gICAgdGhpcy5kcm9wZG93biQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMucmF3U3RhdGUkLFxuICAgICAgdGhpcy5vcHRpb25zUG9zaXRpb24kLFxuICAgICAgdGhpcy5oYXNQcm9kdWN0QWRkVG9DYXJ0JCxcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKChbcywgb3B0aW9uc1Bvc2l0aW9uLCBoYXNDYXJ0XSkgPT4gY29tcHV0ZURyb3Bkb3duKHMsIG9wdGlvbnNQb3NpdGlvbiwgaGFzQ2FydCkpLFxuICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KSxcbiAgICApO1xuICB9XG5cbiAgLy8gPT09IFJlYWQtb25seSBhY2Nlc3NvcnMgPT09XG5cbiAgLyoqIFN0YWJsZSBBUklBIGxpc3Rib3ggSUQgZm9yIHRoZSBkcm9wZG93bi4gUGFzcyB0byBgPHRleHRhcmVhIGFyaWEtY29udHJvbHM9XCIuLi5cIj5gLiAqL1xuICBnZXQgbGlzdGJveElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5saXN0Ym94SWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgZGVzdHJveSgpYCBoYXMgYmVlbiBjYWxsZWQuIEFmdGVyIGRlc3RydWN0aW9uIGFsbCBhY3Rpb24gbWV0aG9kcyBuby1vcC4gKi9cbiAgZ2V0IGRlc3Ryb3llZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0Rlc3Ryb3llZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jaHJvbm91cyBzbmFwc2hvdCBvZiB0aGUgY29udHJvbGxlcidzIGN1cnJlbnQgcHVibGljIHN0YXRlLiBNaXJyb3JzXG4gICAqIHRoZSBsYXRlc3QgZW1pc3Npb24gb2YgYHN0YXRlJGAuIFVzZWZ1bCBpbiBjYWxsYmFja3Mgd2hlcmUgeW91IGNhbid0XG4gICAqIGBzdWJzY3JpYmVgIChlLmcuIGluc2lkZSBhbiBldmVudCBoYW5kbGVyKS5cbiAgICovXG4gIGdldFN0YXRlKCk6IEFJQXV0b2NvbXBsZXRlQ29udHJvbGxlclN0YXRlIHtcbiAgICByZXR1cm4gY29tcHV0ZVN0YXRlKHRoaXMucmF3U3RhdGUkLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc3RydWN0dXJlZCBxdWVyeSBhcyB0aGUgU0RLIHVuZGVyc3RhbmRzIGl0IHJpZ2h0IG5vdyDigJQgdGhlIHNhbWVcbiAgICogb2JqZWN0IGBvblJlc3VsdGAgZGVsaXZlcnMgYWZ0ZXIgZWFjaCByZXNwb25zZSBhbmQgYG9uU3VibWl0YCBkZWxpdmVyc1xuICAgKiBvbiBzdWJtaXQuIFJlYWQgaXQgb24gZGVtYW5kIGZyb20gYSBwbGFjZSB0aGF0IGhhcyBubyBldmVudCBoYW5keSAoYVxuICAgKiBjdXN0b20gc3VibWl0IGJ1dHRvbiwgYSBcInNhdmUgZHJhZnRcIiBhY3Rpb24pLlxuICAgKi9cbiAgZ2V0UmVzdWx0KCk6IEF1dG9jb21wbGV0ZVJlc3VsdCB7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5nZXRSZXN1bHQoKTtcbiAgfVxuXG4gIC8vID09PSBBY3Rpb24gbWV0aG9kcyAocGFzcy10aHJvdWdoIHRvIHRoZSBjb3JlKSA9PT1cbiAgLy9cbiAgLy8gRXZlcnkgYWN0aW9uIG1ldGhvZCBiZWdpbnMgd2l0aCBhbiBgaXNEZXN0cm95ZWRgIGd1YXJkIHNvIHRoYXQgY2FsbGVyc1xuICAvLyB3aG8gaG9sZCBhIHN0YWxlIHJlZmVyZW5jZSBhZnRlciBgZGVzdHJveSgpYCBkb24ndCBhY2NpZGVudGFsbHkgdHJpZ2dlclxuICAvLyB3b3JrIG9uIGEgdG9ybi1kb3duIGNvcmUuIFRoZSB2YW5pbGxhIGNvcmUgZG9lcyBub3QgZ2F0ZSBpdHMgb3duIG1ldGhvZHNcbiAgLy8gcG9zdC1kaXNwb3NlIOKAlCBgcmVzZXQoKWAsIGBoYW5kbGVUZXh0Q2hhbmdlKClgLCBhbmQgZnJpZW5kcyB3b3VsZCBzdGlsbFxuICAvLyBzY2hlZHVsZSBmZXRjaGVzIG9yIGZpcmUgSFRUUCByZXF1ZXN0cyBhZ2FpbnN0IGFuIGFib3J0ZWQgY29udHJvbGxlcixcbiAgLy8gYW5kIHRoZSByZXNwb25zZXMgd291bGQgaGF2ZSBub3doZXJlIHRvIHN1cmZhY2UgKHJhd1N0YXRlJCBpcyBhbHJlYWR5XG4gIC8vIGNvbXBsZXRlKS4gVGhlIGd1YXJkIG1ha2VzIHRoZSBKU0RvYy1wcm9taXNlZCBcIm5vLW9wIHNpbGVudGx5XCJcbiAgLy8gc2VtYW50aWNzIGFjdHVhbGx5IHRydWUuXG5cbiAgLyoqIENsZWFyIGFsbCBzdGF0ZSwgcm90YXRlIGBzZXNzaW9uX2lkYCwgYW5kIHJlLWZldGNoLiBDYWxsIGFmdGVyIHN1Ym1pdC4gKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUucmVzZXQoKTtcbiAgfVxuXG4gIC8qKiBQcmVwYXJlIHRoZSB0eXBlZCB3b3JkIGJlZm9yZSB5b3UgYnVpbGQgYSBzdWJtaXQgcmVzdWx0IGZyb20geW91ciBvd24gYnV0dG9uLiAqL1xuICBwcmVwYXJlU3VibWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnByZXBhcmVTdWJtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvcmRzIGEgc3VibWl0IGluIHRlbGVtZXRyeS4gRW50ZXIgaXMgcmVjb3JkZWQgYnkgdGhlIFNESzsgY2FsbCB0aGlzXG4gICAqIGZyb20gYSBzdWJtaXQgYnV0dG9uIHlvdSByZW5kZXIsIHNvIGVhY2ggc3VibWl0IGlzIGNvdW50ZWQgb25jZS5cbiAgICovXG4gIHJlY29yZFN1Ym1pdChyZXN1bHQ6IEF1dG9jb21wbGV0ZVJlc3VsdCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnJlY29yZFN1Ym1pdChyZXN1bHQpO1xuICB9XG5cbiAgLyoqIFBpY2sgYSBkcm9wZG93biBvcHRpb24gKG9yIHJlcGxhY2UgdGhlIHJlLWVkaXRlZCBwYXJhbSBpZiBpbiByZS1lZGl0IG1vZGUpLiAqL1xuICBzZWxlY3RPcHRpb24ob3B0aW9uOiBTdWdnZXN0aW9uT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuc2VsZWN0T3B0aW9uKG9wdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogQW5ub3VuY2UgYSBwcm9kdWN0IHNlbGVjdGlvbiDigJQgZmlyZXMgdGhlIGBvblByb2R1Y3RTZWxlY3RgIGNhbGxiYWNrIHRoZVxuICAgKiBjb250cm9sbGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoLiBgPGFpLWF1dG9jb21wbGV0ZS1kcm9wZG93bj5gIGNhbGxzIHRoaXNcbiAgICogZm9yIHlvdTsgY29uc3VtZXJzIHJlbmRlcmluZyB0aGVpciBvd24gc3RyaXAgY2FsbCBpdCB0aGVtc2VsdmVzLlxuICAgKlxuICAgKiBFbWl0dGluZyBpcyB0aGUgd2hvbGUgYmVoYXZpb3VyOiB0aGUgU0RLIGRlbGliZXJhdGVseSBkb2VzIG5vdCBuYXZpZ2F0ZSB0b1xuICAgKiBgcHJvZHVjdC51cmxgLCBiZWNhdXNlIG9ubHkgdGhlIGludGVncmF0aW9uIGtub3dzIHdoZXRoZXIgYSBzZWxlY3Rpb25cbiAgICogbWVhbnMgXCJvcGVuIHRoZSBQRFBcIiwgXCJhZGQgdG8gY2FydFwiLCBvciBcImZpbGwgdGhlIGlucHV0XCIuXG4gICAqL1xuICBzZWxlY3RQcm9kdWN0KHByb2R1Y3Q6IFByb2R1Y3QpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZWxlY3RQcm9kdWN0KHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHByb2R1Y3QgdG8gdGhlIGNhcnQgdGhyb3VnaCBgb25Qcm9kdWN0QWRkVG9DYXJ0YC5cbiAgICogYDxhaS1hdXRvY29tcGxldGUtZHJvcGRvd24+YCdzIGNhcnQgYnV0dG9ucyBjYWxsIHRoaXMgZm9yIHlvdTsgY29uc3VtZXJzXG4gICAqIHJlbmRlcmluZyB0aGVpciBvd24gc3RyaXAgY2FsbCBpdCB0aGVtc2VsdmVzLiBSZXNvbHZlcyBvbmNlIHRoZSBoYW5kbGVyJ3NcbiAgICogcHJvbWlzZSBzZXR0bGVzIGFuZCByZWplY3RzIHdpdGggaXRzIGVycm9yLiBXaXRob3V0IGEgaGFuZGxlciBpdCBkb2VzXG4gICAqIG5vdGhpbmcuXG4gICAqL1xuICBhZGRQcm9kdWN0VG9DYXJ0KHByb2R1Y3Q6IFByb2R1Y3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCB8fCAhdGhpcy5wcm9kdWN0QWRkVG9DYXJ0KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIHRoaXMuY29yZS5hZGRQcm9kdWN0VG9DYXJ0KHByb2R1Y3QpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgY2FyZHMgZHJhdyBhIGNhcnQgYnV0dG9uOiBhbiBgb25Qcm9kdWN0QWRkVG9DYXJ0YCBoYW5kbGVyIGlzIHNldC4gKi9cbiAgaGFzUHJvZHVjdEFkZFRvQ2FydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMucHJvZHVjdEFkZFRvQ2FydCA9PT0gXCJmdW5jdGlvblwiO1xuICB9XG5cbiAgLyoqIFByb21vdGUgdGhlIHBpbGwgYXQgYGluZGV4YCB0byBhY3RpdmUgKGZyb250IG9mIHRoZSBsaXN0KS4gKi9cbiAgc2V0QWN0aXZlUGlsbChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuc2V0QWN0aXZlUGlsbChpbmRleCk7XG4gIH1cblxuICAvKipcbiAgICogU2tpcCB0aGUgYWN0aXZlIHBpbGwg4oCUIHNhbWUgYWN0aW9uIGFzIHByZXNzaW5nIOKGkiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC5cbiAgICogVGhlIGRyb3Bkb3duJ3Mgc2tpcCBidXR0b24gY2FsbHMgdGhpczsgY29uc3VtZXJzIHJlbmRlcmluZyB0aGVpciBvd24gc2tpcFxuICAgKiBhZmZvcmRhbmNlIGNhbGwgaXQgZGlyZWN0bHkuIFRoZSBza2lwcGVkIHN1Z2dlc3Rpb24gam9pbnMgYHNraXBwZWRQYXJhbXMkYC5cbiAgICovXG4gIHNraXBBY3RpdmVQaWxsKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnNraXBBY3RpdmVQaWxsKCk7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgbGFzdCBjb21wbGV0ZWQgcGFyYW0ncyBcImNvbXBsZXRlZFwiIHN0YXR1cy4gVGV4dCBzdGF5cyBhcyBwbGFpbiB0ZXh0LiAqL1xuICByZW1vdmVMYXN0UGFyYW0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUucmVtb3ZlTGFzdFBhcmFtKCk7XG4gIH1cblxuICAvKiogQ2xlYXIgdGhlIHNoaW1tZXIgYW5pbWF0aW9uIHN0YXRlIGZvciB0aGUgbW9zdC1yZWNlbnRseS1hZGRlZCBwYXJhbS4gKi9cbiAgY2xlYXJOZXdQYXJhbUlkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLmNsZWFyTmV3UGFyYW1JZCgpO1xuICB9XG5cbiAgLyoqIENvbnRyb2xsZWQtbW9kZSBzZXR0ZXIgZm9yIGVkaXRvciB0ZXh0LiAqL1xuICBzZXRWYWx1ZSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRWYWx1ZSh0ZXh0KTtcbiAgfVxuXG4gIC8qKiBDb250cm9sbGVkLW1vZGUgc2V0dGVyIGZvciBjb21wbGV0ZWQgcGFyYW1zLiAqL1xuICBzZXRDb21wbGV0ZWRQYXJhbXMocGFyYW1zOiBDb21wbGV0ZWRQYXJhbVN0YXRlW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRDb21wbGV0ZWRQYXJhbXMocGFyYW1zKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHBsYWluLXRleHQgaW5wdXQgZnJvbSB0aGUgY29uc3VtZXIncyBgPHRleHRhcmVhPmAgdG8gdGhlIGNvcmUuICovXG4gIGhhbmRsZVRleHRDaGFuZ2UodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLmhhbmRsZVRleHRDaGFuZ2UodmFsdWUpO1xuICB9XG5cbiAgLyoqIEZvcndhcmQga2V5Ym9hcmQgZXZlbnRzIGZyb20gdGhlIGNvbnN1bWVyJ3MgYDx0ZXh0YXJlYT5gIHRvIHRoZSBjb3JlLiAqL1xuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuaGFuZGxlS2V5RG93bihldmVudCk7XG4gIH1cblxuICAvKiogTm90aWZ5IHRoZSBjb3JlIG9mIGZvY3VzIHN0YXRlLiAqL1xuICBzZXRGb2N1c2VkKGZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRGb2N1c2VkKGZvY3VzZWQpO1xuICB9XG5cbiAgLyoqIEVudGVyIHJlLWVkaXQgbW9kZSBmb3IgdGhlIGJvbGQgcGFyYW0gd2l0aCB0aGUgZ2l2ZW4gaWQuICovXG4gIHN0YXJ0RWRpdGluZ1BhcmFtKHBhcmFtSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnN0YXJ0RWRpdGluZ1BhcmFtKHBhcmFtSWQpO1xuICB9XG5cbiAgLyoqIEV4aXQgcmUtZWRpdCBtb2RlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGJvbGQgcGFyYW0uICovXG4gIGV4aXRFZGl0TW9kZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5leGl0RWRpdE1vZGUoKTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHBvc3QtaW5wdXQgY2FyZXQgcG9zaXRpb24gKGV4dGVuZHMgdGhlIGVkaXQgdGFpbCkuICovXG4gIGhhbmRsZUNhcmV0QWZ0ZXJJbnB1dChvZmZzZXQ6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5oYW5kbGVDYXJldEFmdGVySW5wdXQob2Zmc2V0KTtcbiAgfVxuXG4gIC8qKiBGb3J3YXJkIHNlbGVjdGlvbi1vbmx5IGNhcmV0IG1vdmVzIChtYXkgZXhpdCByZS1lZGl0KS4gKi9cbiAgaGFuZGxlQ2FyZXRNb3ZlKG9mZnNldDogbnVtYmVyIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLmhhbmRsZUNhcmV0TW92ZShvZmZzZXQpO1xuICB9XG5cbiAgLyoqIFJlcGxhY2UgdGhlIGJvbGQgcGFyYW0gYmVpbmcgcmUtZWRpdGVkLiBSZXR1cm5zIHRydWUgd2hlbiBhcHBsaWVkLiAqL1xuICByZXBsYWNlRWRpdGluZ1JhbmdlKHJlcGxhY2VtZW50OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiB0aGlzLmNvcmUucmVwbGFjZUVkaXRpbmdSYW5nZShyZXBsYWNlbWVudCk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBoaWdobGlnaHRlZCBvcHRpb24gaW5kZXggKHR5cGljYWxseSBkcml2ZW4gYnkgaG92ZXIpLiAqL1xuICBzZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5zZXRBY3RpdmVEcm9wZG93bkluZGV4KGluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnRlciBsZWZ0IG9wdGlvbiBgaW5kZXhgOiBjbGVhciB0aGUgaGlnaGxpZ2h0IGlmIGl0IGlzIHN0aWxsIG9uIGl0LFxuICAgKiBzbyBFbnRlciBhZnRlcndhcmRzIHN1Ym1pdHMgaW5zdGVhZCBvZiBwaWNraW5nIGFuIG9wdGlvbiB0aGUgcG9pbnRlciBpcyBub1xuICAgKiBsb25nZXIgb24uIEEgaGlnaGxpZ2h0IHRoZSBrZXlib2FyZCBoYXMgc2luY2UgbW92ZWQgaXMgbGVmdCBhbG9uZS5cbiAgICovXG4gIGNsZWFySGlnaGxpZ2h0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuY29yZS5jbGVhckhpZ2hsaWdodChpbmRleCk7XG4gIH1cblxuICAvKiogUGFnZSB0aGUgZGF0ZXBpY2tlciBiYWNrIG9uZSBtb250aC4gTm8tb3AgdW5sZXNzIGEgZGF0ZSBwaWxsIGlzIGFjdGl2ZS4gKi9cbiAgc2hvd1ByZXZpb3VzTW9udGgoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEZXN0cm95ZWQpIHJldHVybjtcbiAgICB0aGlzLmNvcmUuc2hvd1ByZXZpb3VzTW9udGgoKTtcbiAgfVxuXG4gIC8qKiBQYWdlIHRoZSBkYXRlcGlja2VyIGZvcndhcmQgb25lIG1vbnRoLiBOby1vcCB1bmxlc3MgYSBkYXRlIHBpbGwgaXMgYWN0aXZlLiAqL1xuICBzaG93TmV4dE1vbnRoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnNob3dOZXh0TW9udGgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG1hcFByb2R1Y3RzIHN5bmNocm9ub3VzbHkgb24gdGhlIHNob3duIGl0ZW1zIGFnYWluIHdpdGhvdXQgYSByZXF1ZXN0LlxuICAgKiBLZWVwcyB0aGUgc2FtZSBjYXJkcyB3aGlsZSB1cGRhdGluZyB0aGVpciBjb250ZW50LlxuICAgKiBEb2VzIG5vdGhpbmcgd2l0aG91dCBtYXBQcm9kdWN0cyBvciB3aXRoIGEgY3VzdG9tIHByb2R1Y3RzIGludGVncmF0aW9uLlxuICAgKi9cbiAgcmVmcmVzaFByb2R1Y3RzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGVzdHJveWVkKSByZXR1cm47XG4gICAgdGhpcy5jb3JlLnJlZnJlc2hQcm9kdWN0cygpO1xuICB9XG5cbiAgLy8gPT09IExpZmVjeWNsZSA9PT1cblxuICAvKipcbiAgICogQXBwbHkgcnVudGltZSBjaGFuZ2VzIHRvIGEgc3Vic2V0IG9mIG9wdGlvbnMuIEV2ZW50IGNhbGxiYWNrc1xuICAgKiAoYG9uU3VibWl0YCwgYG9uUmVzdWx0YCwgYG9uRXJyb3JgLCBldGMuKSBjYW5ub3QgYmUgc3dhcHBlZCB0aGlzIHdheSDigJQgdGhleSBhcmVcbiAgICogcmVnaXN0ZXJlZCBvbmNlIGF0IGNvbnN0cnVjdGlvbiAobWF0Y2hlcyB0aGUgUmVhY3QgaG9vaydzIGRlc2lnbikuIEZvclxuICAgKiBkeW5hbWljIGV2ZW50IHJlYWN0aXZpdHksIHN1YnNjcmliZSB0byB0aGUgY29ycmVzcG9uZGluZyBvYnNlcnZhYmxlXG4gICAqIChlLmcuIGB0ZXh0JGAgaW5zdGVhZCBvZiBgb25DaGFuZ2VgKS4gVGhlIGV4Y2VwdGlvbiBpc1xuICAgKiBgb25Qcm9kdWN0QWRkVG9DYXJ0YCwgYSBoYW5kbGVyIHJhdGhlciB0aGFuIGFuIGV2ZW50OiBwYXNzaW5nIHRoZSBrZXkgc2V0cyxcbiAgICogc3dhcHMgb3IgKHdpdGggYHVuZGVmaW5lZGApIHJlbW92ZXMgaXQsIGFuZCB0aGUgY2FydCBidXR0b25zIGZvbGxvdy5cbiAgICovXG4gIHVwZGF0ZShvcHRzOiBBSUF1dG9jb21wbGV0ZUNvbnRyb2xsZXJVcGRhdGUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIGNvbnN0IHsgb25Qcm9kdWN0QWRkVG9DYXJ0LCAuLi5jb3JlT3B0cyB9ID0gb3B0cztcbiAgICBpZiAoXCJvblByb2R1Y3RBZGRUb0NhcnRcIiBpbiBvcHRzKSB7XG4gICAgICB0aGlzLnByb2R1Y3RBZGRUb0NhcnQgPSBvblByb2R1Y3RBZGRUb0NhcnQ7XG4gICAgICB0aGlzLmhhc1Byb2R1Y3RBZGRUb0NhcnQkLm5leHQodHlwZW9mIG9uUHJvZHVjdEFkZFRvQ2FydCA9PT0gXCJmdW5jdGlvblwiKTtcbiAgICB9XG4gICAgdGhpcy5jb3JlLnVwZGF0ZShjb3JlT3B0cyk7XG4gICAgaWYgKG9wdHMub3B0aW9uc1Bvc2l0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9uc1Bvc2l0aW9uJC5uZXh0KG9wdHMub3B0aW9uc1Bvc2l0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIOKAlCB1bnN1YnNjcmliZXMgZnJvbSB0aGUgY29yZSwgZGVzdHJveXMgdGhlIGNvcmUsXG4gICAqIGFuZCBjb21wbGV0ZXMgdGhlIGludGVybmFsIHN0YXRlIHN1YmplY3QuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy5cbiAgICogQWZ0ZXIgZGVzdHJ1Y3Rpb24sIGFjdGlvbiBtZXRob2RzIG5vLW9wIHNpbGVudGx5LlxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0Rlc3Ryb3llZCkgcmV0dXJuO1xuICAgIHRoaXMuaXNEZXN0cm95ZWQgPSB0cnVlO1xuICAgIHRoaXMudW5zdWJzY3JpYmVDb3JlKCk7XG4gICAgdGhpcy5jb3JlLmRlc3Ryb3koKTtcbiAgICB0aGlzLnJhd1N0YXRlJC5jb21wbGV0ZSgpO1xuICB9XG59XG5cbi8vID09PT09IFB1cmUgaGVscGVycyDigJQgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBzdXJmYWNlID09PT09XG5cbi8qKlxuICogU2hhbGxvdyBhcnJheSBlcXVhbGl0eS4gVGhlIHZhbmlsbGEgc3RvcmUgcmVhc3NpZ25zIGFycmF5IGZpZWxkcyBvbiBldmVyeVxuICogd3JpdGUgKGBzdG9yZS5zZXQoeyBjb21wbGV0ZWRQYXJhbXM6IFsuLi5wcmV2LCB4XSB9KWApLCBzbyByZWZlcmVuY2VcbiAqIGVxdWFsaXR5IGFsb25lIHdvdWxkIHJlLWVtaXQgZG93bnN0cmVhbSBldmVuIHdoZW4gdGhlIGNvbnRlbnRzIGFyZVxuICogaWRlbnRpY2FsLiBVc2VkIGZvciBgY29tcGxldGVkUGFyYW1zJGAsIGBzdWdnZXN0aW9ucyRgLCBgc3VnZ2VzdGlvblBpbGxzJGAsXG4gKiBhbmQgYHNlZ21lbnRzJGAuXG4gKi9cbmZ1bmN0aW9uIGFyckVxPFQ+KGE6IHJlYWRvbmx5IFRbXSwgYjogcmVhZG9ubHkgVFtdKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogVUktdmlzaWJsZSBsb2FkaW5nIOKAlCB0aGUgY29yZSdzIGBkcm9wZG93bkxvYWRpbmdgIChzZWUgaXRzIGRvY3MpLiAqL1xuZnVuY3Rpb24gY29tcHV0ZVVpTG9hZGluZyhzOiBDb3JlU3RhdGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHMuZHJvcGRvd25Mb2FkaW5nO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3RhdGUoczogQ29yZVN0YXRlKTogQUlBdXRvY29tcGxldGVDb250cm9sbGVyU3RhdGUge1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHMudGV4dCxcbiAgICBjb21wbGV0ZWRQYXJhbXM6IHMuY29tcGxldGVkUGFyYW1zLFxuICAgIHNraXBwZWRQYXJhbXM6IHMuc2tpcHBlZFBhcmFtcyxcbiAgICBpZGVudGlmaWVkUGFyYW1zOiBzLmlkZW50aWZpZWRQYXJhbXMsXG4gICAgc3VnZ2VzdGlvblBpbGxzOiB3aXRob3V0VHJhZGl0aW9uYWxBdXRvY29tcGxldGUocy5hY3Rpb25hYmxlU3VnZ2VzdGlvbnMpLFxuICAgIHNlZ21lbnRzOiBzLnNlZ21lbnRzLFxuICAgIG5ld1BhcmFtSWQ6IHMubmV3UGFyYW1JZCxcbiAgICBzdWdnZXN0aW9uczogcy5zdWdnZXN0aW9ucyxcbiAgICBwcm9kdWN0czogcy5wcm9kdWN0cyxcbiAgICBjdXN0b21GaWVsZHM6IHMuY3VzdG9tRmllbGRzLFxuICAgIGFjdGl2ZUluZGV4OiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgsXG4gICAgaXNMb2FkaW5nOiBjb21wdXRlVWlMb2FkaW5nKHMpLFxuICAgIGlzUmVhZHk6IHMuaXNSZWFkeSxcbiAgICBpc0ZvY3VzZWQ6IHMuaXNGb2N1c2VkLFxuICAgIGlzRHJvcGRvd25PcGVuOiBzLmlzRHJvcGRvd25PcGVuLFxuICAgIHBsYWNlaG9sZGVyVGV4dDogcy5wbGFjZWhvbGRlclRleHQsXG4gICAgZXJyb3I6IHMuZXJyb3IsXG4gICAgZWRpdGluZ1BhcmFtOiBzLmVkaXRpbmdQYXJhbSxcbiAgICBlZGl0aW5nSWRlbnRpZmllZDogcy5lZGl0aW5nSWRlbnRpZmllZCxcbiAgICBlZGl0aW5nQW5jaG9yOiBzLmVkaXRpbmdBbmNob3IsXG4gICAgY2FyZXRPZmZzZXQ6IHMuY2FyZXRPZmZzZXQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVEcm9wZG93bihcbiAgczogQ29yZVN0YXRlLFxuICBvcHRpb25zUG9zaXRpb246IFwiYWJvdmVcIiB8IFwiYmVsb3dcIixcbiAgaGFzUHJvZHVjdEFkZFRvQ2FydDogYm9vbGVhbixcbik6IEFJQXV0b2NvbXBsZXRlRHJvcGRvd25TdGF0ZSB7XG4gIGNvbnN0IGVkaXRpbmdQYXJhbSA9IHMuZWRpdGluZ1BhcmFtO1xuICBjb25zdCBlZGl0aW5nSWRlbnRpZmllZCA9IHMuZWRpdGluZ0lkZW50aWZpZWQ7XG4gIGNvbnN0IGRhdGVTZWxlY3Rpb24gPSBkYXRlU2VsZWN0aW9uRm9yKHMpO1xuICBjb25zdCBhY3RpdmVTdWdnZXN0aW9uID0gcy5hY3Rpb25hYmxlU3VnZ2VzdGlvbnNbMF07XG4gIGNvbnN0IGRyb3Bkb3duUGlsbDogU3VnZ2VzdGlvbiB8IG51bGwgPSBlZGl0aW5nUGFyYW1cbiAgICA/IHtcbiAgICAgICAgcGFyYW1ldGVyOiBlZGl0aW5nUGFyYW0uc3VnZ2VzdGlvblBhcmFtZXRlcixcbiAgICAgICAgdGV4dDogZWRpdGluZ1BhcmFtLnN1Z2dlc3Rpb25QbGFjZWhvbGRlcixcbiAgICAgICAgcmVxdWlyZWQ6IHRydWUsXG4gICAgICAgIG9wdGlvbnM6IGVkaXRpbmdQYXJhbS5vcHRpb25zLFxuICAgICAgfVxuICAgIDogZWRpdGluZ0lkZW50aWZpZWRcbiAgICAgID8gLy8gQW5zd2VyaW5nIGEgc3BhbiB0aGUgdXNlciB3cm90ZSB0aGVtc2VsdmVzOiB0aGUgcGlsbCBuYW1lcyB0aGVcbiAgICAgICAgLy8gcGFyYW1ldGVyIHRoZSBzZXJ2ZXIgbWF0Y2hlZCBpdCB0bywgc28gdGhlIGNhbGVuZGFyIGlzbid0IHVubGFiZWxsZWQuXG4gICAgICAgIHtcbiAgICAgICAgICBwYXJhbWV0ZXI6IGVkaXRpbmdJZGVudGlmaWVkLnBhcmFtZXRlcixcbiAgICAgICAgICB0ZXh0OiBpZGVudGlmaWVkUGFyYW1MYWJlbChlZGl0aW5nSWRlbnRpZmllZC5wYXJhbWV0ZXIpLFxuICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgIG9wdGlvbnM6IFtdLFxuICAgICAgICB9XG4gICAgICA6IG51bGw7XG4gIGNvbnN0IGRyb3Bkb3duQWN0aXZlUGlsbCA9IHMuZHJvcGRvd25TdWdnZXN0aW9uID8/IGRyb3Bkb3duUGlsbCA/PyBhY3RpdmVTdWdnZXN0aW9uO1xuICBjb25zdCBkcm9wZG93blBpbGxzID0gZHJvcGRvd25QaWxsID8gW2Ryb3Bkb3duUGlsbF0gOiBzLmFjdGlvbmFibGVTdWdnZXN0aW9ucztcbiAgcmV0dXJuIHtcbiAgICBzdWdnZXN0aW9uczogZHJvcGRvd25BY3RpdmVQaWxsID8gW3sgLi4uZHJvcGRvd25BY3RpdmVQaWxsLCBvcHRpb25zOiBzLmRyb3Bkb3duT3B0aW9ucyB9XSA6IFtdLFxuICAgIGFjdGl2ZUluZGV4OiBzLmFjdGl2ZURyb3Bkb3duSW5kZXgsXG4gICAgaXNPcGVuOiBzLmlzRHJvcGRvd25PcGVuLFxuICAgIHBpbGxzOiBkcm9wZG93blBpbGxzLFxuICAgIGlzQWN0aXZlUGlsbFNlbGVjdGVkOiBzLmlzQWN0aXZlUGlsbFNlbGVjdGVkLFxuICAgIGlzTG9hZGluZzogY29tcHV0ZVVpTG9hZGluZyhzKSxcbiAgICBza2VsZXRvbkV4aXRpbmc6IHMuc2tlbGV0b25FeGl0aW5nLFxuICAgIGlzSW5wdXRFbXB0eTogcy50ZXh0LnRyaW0oKS5sZW5ndGggPT09IDAsXG4gICAgcHJvZHVjdHM6IHMucHJvZHVjdHMsXG4gICAgaXNFZGl0aW5nOiBCb29sZWFuKGVkaXRpbmdQYXJhbSkgfHwgQm9vbGVhbihlZGl0aW5nSWRlbnRpZmllZCksXG4gICAgaW5TZWxlY3Rpb25BbmltYXRpb246IHMuaW5TZWxlY3Rpb25BbmltYXRpb24sXG4gICAgLy8gRGF0ZXBpY2tlci4gYHMuZmlsdGVyZWRPcHRpb25zYCBhYm92ZSBhbHJlYWR5IGNhcnJpZXMgdGhlIHZpc2libGVcbiAgICAvLyBtb250aCdzIGNlbGxzIHJhdGhlciB0aGFuIHRoZSBzdWdnZXN0aW9uJ3Mgb3duIG9wdGlvbnMgd2hlbiB0aGlzIGlzXG4gICAgLy8gXCJkYXRlXCIg4oCUIHRoZSBjb3JlIHN3YXBwZWQgdGhlbSBpbiBpdHMgZGVyaXZlIGxheWVyLCBzbyB0aGUgZHJvcGRvd24gb25seVxuICAgIC8vIGhhcyB0byBrbm93IHdoaWNoIGJvZHkgdG8gZHJhdy5cbiAgICBmb3JtYXRUeXBlOiBzLmFjdGl2ZUZvcm1hdFR5cGUsXG4gICAgZGF0ZVZpZXc6IHMuZGF0ZVZpZXcsXG4gICAgc2VsZWN0ZWREYXRlSXNvOiBkYXRlU2VsZWN0aW9uLnNlbGVjdGVkSXNvLFxuICAgIHNlbGVjdGVkRGF0ZVJhbmdlOiBkYXRlU2VsZWN0aW9uLnNlbGVjdGVkUmFuZ2UsXG4gICAgZGF0ZVJhbmdlU3RhcnQ6IGRhdGVTZWxlY3Rpb24ucmFuZ2VTdGFydCxcbiAgICBvcHRpb25zUG9zaXRpb24sXG4gICAgaGFzUHJvZHVjdEFkZFRvQ2FydCxcbiAgfTtcbn1cbiJdfQ==
|