@skyux/lookup 9.0.0-alpha.5 → 9.0.0-alpha.6

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.
@@ -1,6 +1,6 @@
1
1
  import { ChangeDetectionStrategy, Component, ContentChild, ElementRef, EventEmitter, Inject, Input, Optional, Output, TemplateRef, ViewChild, } from '@angular/core';
2
2
  import { SKY_STACKING_CONTEXT, SkyAffixAutoFitContext, } from '@skyux/core';
3
- import { Subject, from, fromEvent as observableFromEvent, of, } from 'rxjs';
3
+ import { BehaviorSubject, Subject, from, fromEvent as observableFromEvent, of, } from 'rxjs';
4
4
  import { debounceTime, delay, map, switchMap, take, takeUntil, } from 'rxjs/operators';
5
5
  import { normalizeDiacritics } from '../shared/sky-lookup-string-utils';
6
6
  import { SkyAutocompleteAdapterService } from './autocomplete-adapter.service';
@@ -51,6 +51,17 @@ export class SkyAutocompleteComponent {
51
51
  get descriptorProperty() {
52
52
  return this.#_descriptorProperty;
53
53
  }
54
+ /**
55
+ * @internal
56
+ * Whether to display a button in the dropdown that opens a picker where users can view all options.
57
+ */
58
+ set enableShowMore(value) {
59
+ this.#_enableShowMore = !!value;
60
+ this.#updateIsDropdownVisible();
61
+ }
62
+ get enableShowMore() {
63
+ return this.#_enableShowMore;
64
+ }
54
65
  /**
55
66
  * The observable of `SkyAutocompleteMessage` that can close the dropdown.
56
67
  * @internal
@@ -130,6 +141,18 @@ export class SkyAutocompleteComponent {
130
141
  get searchResultsLimit() {
131
142
  return this.#_searchResultsLimit;
132
143
  }
144
+ /**
145
+ * @internal
146
+ * Whether to display a button that lets users add options to the data source.
147
+ * @default false
148
+ */
149
+ set showAddButton(value) {
150
+ this.#_showAddButton = !!value;
151
+ this.#updateIsDropdownVisible();
152
+ }
153
+ get showAddButton() {
154
+ return this.#_showAddButton;
155
+ }
133
156
  //#endregion
134
157
  //#region template_properties
135
158
  get searchResults() {
@@ -225,10 +248,12 @@ export class SkyAutocompleteComponent {
225
248
  */
226
249
  #overlayFocusableElements;
227
250
  #currentSearchSub;
251
+ #isDropdownVisible;
228
252
  #zIndex;
229
253
  #_data;
230
254
  #_debounceTime;
231
255
  #_descriptorProperty;
256
+ #_enableShowMore;
232
257
  #_highlightText;
233
258
  #_inputDirective;
234
259
  #_messageStream;
@@ -239,18 +264,8 @@ export class SkyAutocompleteComponent {
239
264
  #_searchResults;
240
265
  #_searchResultsLimit;
241
266
  #_searchTextMinimumCharacters;
267
+ #_showAddButton;
242
268
  constructor(changeDetector, elementRef, affixService, adapterService, overlayService, inputBoxHostSvc, stackingContext) {
243
- /**
244
- * @internal
245
- * Whether to display a button in the dropdown that opens a picker where users can view all options.
246
- */
247
- this.enableShowMore = false;
248
- /**
249
- * @internal
250
- * Whether to display a button that lets users add options to the data source.
251
- * @default false
252
- */
253
- this.showAddButton = false;
254
269
  /**
255
270
  * @internal
256
271
  * Allows async search to be disabled even when a listener is specified for
@@ -297,13 +312,16 @@ export class SkyAutocompleteComponent {
297
312
  * elements provided in the consumer's own template.
298
313
  */
299
314
  this.#overlayFocusableElements = [];
315
+ this.#isDropdownVisible = new BehaviorSubject(false);
300
316
  this.#_data = [];
301
317
  this.#_debounceTime = 0;
302
318
  this.#_descriptorProperty = 'name';
319
+ this.#_enableShowMore = false;
303
320
  this.#_messageStream = new Subject();
304
321
  this.#_propertiesToSearch = ['name'];
305
322
  this.#_searchResultsLimit = 0;
306
323
  this.#_searchTextMinimumCharacters = 1;
324
+ this.#_showAddButton = false;
307
325
  this.#changeDetector = changeDetector;
308
326
  this.#elementRef = elementRef;
309
327
  this.#affixService = affixService;
@@ -318,6 +336,7 @@ export class SkyAutocompleteComponent {
318
336
  const id = ++uniqueId;
319
337
  this.resultsListId = `sky-autocomplete-list-${id}`;
320
338
  this.resultsWrapperId = `sky-autocomplete-wrapper-${id}`;
339
+ this.isDropdownVisible = this.#isDropdownVisible.asObservable();
321
340
  }
322
341
  ngAfterViewInit() {
323
342
  this.#addInputEventListeners();
@@ -326,6 +345,7 @@ export class SkyAutocompleteComponent {
326
345
  this.#cancelCurrentSearch();
327
346
  this.#inputDirectiveUnsubscribe.next();
328
347
  this.#inputDirectiveUnsubscribe.complete();
348
+ this.#isDropdownVisible.complete();
329
349
  this.#ngUnsubscribe.next();
330
350
  this.#ngUnsubscribe.complete();
331
351
  this.#destroyAffixer();
@@ -468,6 +488,7 @@ export class SkyAutocompleteComponent {
468
488
  const isLongEnough = searchText.length >= this.searchTextMinimumCharacters;
469
489
  const isDifferent = searchText !== this.searchText;
470
490
  this.searchText = searchText.trim();
491
+ this.#updateIsDropdownVisible();
471
492
  if (isLongEnough && isDifferent) {
472
493
  this.#cancelCurrentSearch();
473
494
  this.#currentSearchSub = this.#performSearch()
@@ -495,6 +516,7 @@ export class SkyAutocompleteComponent {
495
516
  else {
496
517
  this.#activeElementIndex = -1;
497
518
  }
519
+ this.#updateIsDropdownVisible();
498
520
  this.#changeDetector.markForCheck();
499
521
  if (this.isOpen) {
500
522
  // Let the results populate in the DOM before recalculating placement.
@@ -609,8 +631,9 @@ export class SkyAutocompleteComponent {
609
631
  overlay.attachTemplate(this.resultsTemplateRef);
610
632
  this.#overlay = overlay;
611
633
  this.isOpen = true;
634
+ this.#updateIsDropdownVisible();
612
635
  this.#changeDetector.markForCheck();
613
- this.#updateAriaOwns();
636
+ this.#updateAriaControls();
614
637
  this.#initOverlayFocusableElements();
615
638
  this.openChange.emit(true);
616
639
  }
@@ -620,7 +643,7 @@ export class SkyAutocompleteComponent {
620
643
  this.isOpen = false;
621
644
  this.#destroyOverlay();
622
645
  this.#removeActiveDescendant();
623
- this.#updateAriaOwns();
646
+ this.#updateAriaControls();
624
647
  this.#changeDetector.markForCheck();
625
648
  this.openChange.emit(false);
626
649
  }
@@ -637,9 +660,9 @@ export class SkyAutocompleteComponent {
637
660
  this.inputDirective.setActiveDescendant(null);
638
661
  }
639
662
  }
640
- #updateAriaOwns() {
663
+ #updateAriaControls() {
641
664
  if (this.inputDirective) {
642
- this.inputDirective.setAriaOwns(this.#overlay?.id || null);
665
+ this.inputDirective.setAriaControls(this.#overlay?.id || null);
643
666
  }
644
667
  }
645
668
  #resetSearch() {
@@ -650,6 +673,7 @@ export class SkyAutocompleteComponent {
650
673
  this.searchResultsCount = undefined;
651
674
  this.#removeActiveDescendant();
652
675
  this.#initOverlayFocusableElements();
676
+ this.#updateIsDropdownVisible();
653
677
  this.#changeDetector.markForCheck();
654
678
  }
655
679
  #addInputEventListeners() {
@@ -701,7 +725,9 @@ export class SkyAutocompleteComponent {
701
725
  this.#messageStreamSub.unsubscribe();
702
726
  this.#messageStreamSub = undefined;
703
727
  }
704
- this.#messageStreamSub = this.messageStream.subscribe((message) => {
728
+ this.#messageStreamSub = this.messageStream
729
+ .pipe(takeUntil(this.#ngUnsubscribe))
730
+ .subscribe((message) => {
705
731
  switch (message.type) {
706
732
  case SkyAutocompleteMessageType.CloseDropdown:
707
733
  this.#closeDropdown();
@@ -754,12 +780,19 @@ export class SkyAutocompleteComponent {
754
780
  });
755
781
  }
756
782
  }
783
+ #updateIsDropdownVisible() {
784
+ const isDropdownVisible = !!this.searchText &&
785
+ (!this.showActionsArea || this.searchResults.length > 0);
786
+ if (isDropdownVisible !== this.#isDropdownVisible.getValue()) {
787
+ this.#isDropdownVisible.next(isDropdownVisible);
788
+ }
789
+ }
757
790
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAutocompleteComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1.SkyAffixService }, { token: i2.SkyAutocompleteAdapterService }, { token: i1.SkyOverlayService }, { token: i3.SkyInputBoxHostService, optional: true }, { token: SKY_STACKING_CONTEXT, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
758
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: { ariaLabelledBy: "ariaLabelledBy", data: "data", debounceTime: "debounceTime", descriptorProperty: "descriptorProperty", enableShowMore: "enableShowMore", messageStream: "messageStream", wrapperClass: "wrapperClass", propertiesToSearch: "propertiesToSearch", search: "search", searchResultTemplate: "searchResultTemplate", searchTextMinimumCharacters: "searchTextMinimumCharacters", searchFilters: "searchFilters", searchResultsLimit: "searchResultsLimit", showAddButton: "showAddButton", noResultsFoundText: "noResultsFoundText", searchAsyncDisabled: "searchAsyncDisabled" }, outputs: { addClick: "addClick", showMoreClick: "showMoreClick", selectionChange: "selectionChange", searchAsync: "searchAsync", openChange: "openChange" }, providers: [SkyAutocompleteAdapterService], queries: [{ propertyName: "inputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true }], viewQueries: [{ propertyName: "resultsTemplateRef", first: true, predicate: ["resultsTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "resultsRef", first: true, predicate: ["resultsRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"\n (!searchResultsLimit || i < searchResultsLimit) &&\n !(enableShowMore && i >= 5)\n \"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.data-descriptor-value]=\"result.data[descriptorProperty]\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate || defaultSearchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources : (data.length | skyNumeric : { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric : { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.λ11, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { kind: "component", type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i6.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "directive", type: i6.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "component", type: i5.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking", "screenReaderCompletedText"] }, { kind: "pipe", type: i7.SkyLibResourcesPipe, name: "skyLibResources" }, { kind: "pipe", type: i1.SkyNumericPipe, name: "skyNumeric" }, { kind: "pipe", type: i8.SkyAutocompleteSearchAsyncDisabledPipe, name: "skyAutocompleteSearchAsyncDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
791
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: SkyAutocompleteComponent, selector: "sky-autocomplete", inputs: { ariaLabelledBy: "ariaLabelledBy", data: "data", debounceTime: "debounceTime", descriptorProperty: "descriptorProperty", enableShowMore: "enableShowMore", messageStream: "messageStream", wrapperClass: "wrapperClass", propertiesToSearch: "propertiesToSearch", search: "search", searchResultTemplate: "searchResultTemplate", searchTextMinimumCharacters: "searchTextMinimumCharacters", searchFilters: "searchFilters", searchResultsLimit: "searchResultsLimit", showAddButton: "showAddButton", noResultsFoundText: "noResultsFoundText", searchAsyncDisabled: "searchAsyncDisabled" }, outputs: { addClick: "addClick", showMoreClick: "showMoreClick", selectionChange: "selectionChange", searchAsync: "searchAsync", openChange: "openChange" }, providers: [SkyAutocompleteAdapterService], queries: [{ propertyName: "inputDirective", first: true, predicate: SkyAutocompleteInputDirective, descendants: true }], viewQueries: [{ propertyName: "resultsTemplateRef", first: true, predicate: ["resultsTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "resultsRef", first: true, predicate: ["resultsRef"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isDropdownVisible | async\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-controls]=\"(isDropdownVisible | async) ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"isDropdownVisible | async\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"\n (!searchResultsLimit || i < searchResultsLimit) &&\n !(enableShowMore && i >= 5)\n \"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.data-descriptor-value]=\"result.data[descriptorProperty]\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate || defaultSearchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources : (data.length | skyNumeric : { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric : { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.λ11, selector: "[skyHighlight]", inputs: ["skyHighlight"] }, { kind: "component", type: i5.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }, { kind: "directive", type: i6.λ2, selector: "[skyThemeClass]", inputs: ["class", "skyThemeClass"] }, { kind: "directive", type: i6.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { kind: "component", type: i5.λ14, selector: "sky-wait", inputs: ["ariaLabel", "isWaiting", "isFullPage", "isNonBlocking", "screenReaderCompletedText"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.SkyLibResourcesPipe, name: "skyLibResources" }, { kind: "pipe", type: i1.SkyNumericPipe, name: "skyNumeric" }, { kind: "pipe", type: i8.SkyAutocompleteSearchAsyncDisabledPipe, name: "skyAutocompleteSearchAsyncDisabled" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
759
792
  }
760
793
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: SkyAutocompleteComponent, decorators: [{
761
794
  type: Component,
762
- args: [{ selector: 'sky-autocomplete', providers: [SkyAutocompleteAdapterService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-owns]=\"isOpen ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"searchText && (!showActionsArea || searchResults.length > 0)\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"\n (!searchResultsLimit || i < searchResultsLimit) &&\n !(enableShowMore && i >= 5)\n \"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.data-descriptor-value]=\"result.data[descriptorProperty]\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate || defaultSearchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources : (data.length | skyNumeric : { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric : { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"] }]
795
+ args: [{ selector: 'sky-autocomplete', providers: [SkyAutocompleteAdapterService], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n aria-autocomplete=\"list\"\n aria-haspopup=\"listbox\"\n class=\"sky-autocomplete\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isDropdownVisible | async\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.aria-controls]=\"(isDropdownVisible | async) ? resultsListId : null\"\n [attr.id]=\"resultsWrapperId\"\n>\n <ng-content></ng-content>\n</div>\n\n<ng-template #resultsTemplateRef>\n <div\n class=\"sky-autocomplete-results-container\"\n [skyThemeClass]=\"{\n 'sky-shadow': 'default',\n 'sky-elevation-4': 'modern'\n }\"\n (keydown)=\"handleKeydown($event)\"\n #resultsRef\n >\n <div\n *ngIf=\"isSearchingAsync; else resultControlsTemplateRef\"\n class=\"sky-autocomplete-results-waiting\"\n >\n <sky-wait [isWaiting]=\"true\"></sky-wait>\n </div>\n </div>\n</ng-template>\n\n<ng-template #resultControlsTemplateRef>\n <div\n *ngIf=\"isDropdownVisible | async\"\n class=\"sky-autocomplete-results\"\n role=\"listbox\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.id]=\"resultsListId\"\n >\n <ng-container *ngFor=\"let result of searchResults; let i = index\">\n <div\n *ngIf=\"\n (!searchResultsLimit || i < searchResultsLimit) &&\n !(enableShowMore && i >= 5)\n \"\n class=\"sky-autocomplete-result\"\n role=\"option\"\n tabindex=\"0\"\n [attr.aria-selected]=\"isElementFocused(searchResultEl)\"\n [attr.data-descriptor-value]=\"result.data[descriptorProperty]\"\n [attr.id]=\"result.elementId\"\n [skyHighlight]=\"highlightText\"\n (mousedown)=\"onResultMouseDown(result.elementId, $event)\"\n (mousemove)=\"onResultMouseMove(i)\"\n #searchResultEl\n >\n <ng-container\n *ngTemplateOutlet=\"\n searchResultTemplate || defaultSearchResultTemplate;\n context: { item: result.data }\n \"\n >\n </ng-container>\n </div>\n </ng-container>\n <div\n *ngIf=\"searchResults.length === 0\"\n class=\"sky-deemphasized sky-padding-squish-default\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n </div>\n <div *ngIf=\"showActionsArea\" class=\"sky-autocomplete-actions\">\n <button\n *ngIf=\"enableShowMore && (!searchText || searchResults.length > 0)\"\n class=\"sky-autocomplete-action sky-autocomplete-action-more sky-btn sky-btn-link\"\n type=\"button\"\n (mousedown)=\"moreButtonClicked()\"\n >\n <ng-container\n *ngIf=\"\n !(\n searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled\n ) &&\n searchResults.length === 0 &&\n !searchText\n \"\n >\n {{ 'skyux_autocomplete_show_all' | skyLibResources }}\n </ng-container>\n <ng-container\n *ngIf=\"\n (searchAsync\n | skyAutocompleteSearchAsyncDisabled : searchAsyncDisabled) &&\n !searchText\n \"\n >\n {{\n 'skyux_autocomplete_show_all_count'\n | skyLibResources : (data.length | skyNumeric : { truncate: false })\n }}\n </ng-container>\n <ng-container *ngIf=\"searchText\">\n {{\n 'skyux_autocomplete_show_matches_count'\n | skyLibResources\n : (searchResultsCount === undefined\n ? data.length\n : (searchResultsCount | skyNumeric : { truncate: false }))\n }}\n </ng-container>\n </button>\n <div\n *ngIf=\"searchText && searchResults.length === 0\"\n class=\"sky-font-deemphasized sky-autocomplete-actions-no-results\"\n >\n {{\n noResultsFoundText ||\n ('skyux_autocomplete_no_results' | skyLibResources)\n }}\n </div>\n <button\n *ngIf=\"showAddButton\"\n class=\"sky-autocomplete-action sky-autocomplete-action-add sky-btn sky-btn-link\"\n tabindex=\"0\"\n type=\"button\"\n [class.focused]=\"isElementFocused(addButtonEl)\"\n (mousedown)=\"addButtonClicked()\"\n #addButtonEl\n >\n <sky-icon *skyThemeIf=\"'modern'\" icon=\"add\" iconType=\"skyux\"></sky-icon>\n <sky-icon *skyThemeIf=\"'default'\" icon=\"plus-circle\"></sky-icon>\n {{ 'skyux_autocomplete_add' | skyLibResources }}\n </button>\n </div>\n</ng-template>\n\n<ng-template let-item=\"item\" #defaultSearchResultTemplate>\n {{ item[descriptorProperty] }}\n</ng-template>\n", styles: [".sky-autocomplete-results-container{position:fixed;background-color:#fff}.sky-autocomplete-results-waiting{height:70px}.sky-autocomplete-results{display:flex;flex-direction:column;padding:4px;overflow-y:auto;overflow-x:hidden;min-height:35px;max-height:calc(50vh - 50px)}.sky-autocomplete-result{color:#212327;margin-bottom:4px;padding:3px 20px;cursor:pointer}.sky-autocomplete-result:last-child{margin-bottom:0}.sky-autocomplete-actions{border-top:1px solid #cdcfd2}.sky-autocomplete-actions .sky-autocomplete-action{border:none}.sky-autocomplete-actions .sky-autocomplete-actions-no-results{display:inline-block;padding:7px 13px}.sky-autocomplete-action-add{float:right}.sky-autocomplete-action-add sky-icon{padding-right:5px}.sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:#eeeeef}.sky-autocomplete-descendant-focus.sky-autocomplete-action{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px}::ng-deep .sky-theme-modern .sky-autocomplete-results-container{border-radius:6px}::ng-deep .sky-theme-modern .sky-autocomplete-results{padding:10px 0}::ng-deep .sky-theme-modern .sky-autocomplete-result{margin-bottom:0;padding:10px 0 10px 15px}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus:not(.sky-autocomplete-action){background-color:inherit}::ng-deep .sky-theme-modern .sky-autocomplete-descendant-focus{border:none;box-shadow:inset 0 0 0 2px #1870b8,0 1px 8px #0000004d}\n"] }]
763
796
  }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1.SkyAffixService }, { type: i2.SkyAutocompleteAdapterService }, { type: i1.SkyOverlayService }, { type: i3.SkyInputBoxHostService, decorators: [{
764
797
  type: Optional
765
798
  }] }, { type: undefined, decorators: [{
@@ -823,4 +856,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
823
856
  read: ElementRef,
824
857
  }]
825
858
  }] } });
826
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sb29rdXAvc3JjL2xpYi9tb2R1bGVzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xvb2t1cC9zcmMvbGliL21vZHVsZXMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQU12QixNQUFNLGFBQWEsQ0FBQztBQUdyQixPQUFPLEVBRUwsT0FBTyxFQUVQLElBQUksRUFDSixTQUFTLElBQUksbUJBQW1CLEVBQ2hDLEVBQUUsR0FDSCxNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFDTCxZQUFZLEVBQ1osS0FBSyxFQUNMLEdBQUcsRUFDSCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzlGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRS9FLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLG1D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QkFxQkMsb0JBQW9CO3NCQUQxQixLQUFLO2dCQVVLLDJCQUEyQjtzQkFEckMsS0FBSztnQkFrQkssYUFBYTtzQkFEdkIsS0FBSztnQkFvQkssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQWVDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBUUMsa0JBQWtCO3NCQUR4QixLQUFLO2dCQVVDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFRQyxRQUFRO3NCQURkLE1BQU07Z0JBUUEsYUFBYTtzQkFEbkIsTUFBTTtnQkFPQSxlQUFlO3NCQURyQixNQUFNO2dCQVFBLFdBQVc7c0JBRGpCLE1BQU07Z0JBT0EsVUFBVTtzQkFEaEIsTUFBTTtnQkEwQ0ksY0FBYztzQkFEeEIsWUFBWTt1QkFBQyw2QkFBNkI7Z0JBZ0VwQyxrQkFBa0I7c0JBSHhCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUU7d0JBQy9CLElBQUksRUFBRSxXQUFXO3FCQUNsQjtnQkFNVSxVQUFVO3NCQUhwQixTQUFTO3VCQUFDLFlBQVksRUFBRTt3QkFDdkIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgU0tZX1NUQUNLSU5HX0NPTlRFWFQsXG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QWZmaXhlcixcbiAgU2t5T3ZlcmxheUluc3RhbmNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbiAgU2t5U3RhY2tpbmdDb250ZXh0LFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQgeyBTa3lJbnB1dEJveEhvc3RTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBmcm9tLFxuICBmcm9tRXZlbnQgYXMgb2JzZXJ2YWJsZUZyb21FdmVudCxcbiAgb2YsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgZGVib3VuY2VUaW1lLFxuICBkZWxheSxcbiAgbWFwLFxuICBzd2l0Y2hNYXAsXG4gIHRha2UsXG4gIHRha2VVbnRpbCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBub3JtYWxpemVEaWFjcml0aWNzIH0gZnJvbSAnLi4vc2hhcmVkL3NreS1sb29rdXAtc3RyaW5nLXV0aWxzJztcblxuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlQWRhcHRlclNlcnZpY2UgfSBmcm9tICcuL2F1dG9jb21wbGV0ZS1hZGFwdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgc2t5QXV0b2NvbXBsZXRlRGVmYXVsdFNlYXJjaEZ1bmN0aW9uIH0gZnJvbSAnLi9hdXRvY29tcGxldGUtZGVmYXVsdC1zZWFyY2gtZnVuY3Rpb24nO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUgfSBmcm9tICcuL2F1dG9jb21wbGV0ZS1pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLW1lc3NhZ2UnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZVR5cGUgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1tZXNzYWdlLXR5cGUnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2VhcmNoLWFzeW5jLWFyZ3MnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNSZXN1bHQgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtYXN5bmMtcmVzdWx0JztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2VhcmNoLWZ1bmN0aW9uJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uRmlsdGVyIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2VhcmNoLWZ1bmN0aW9uLWZpbHRlcic7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2UgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWxlY3Rpb24tY2hhbmdlJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNob3dNb3JlQXJncyB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNob3ctbW9yZS1hcmdzJztcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuaW50ZXJmYWNlIFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdCB7XG4gIGVsZW1lbnRJZDogc3RyaW5nO1xuICBkYXRhOiBhbnk7XG59XG5cbmxldCB1bmlxdWVJZCA9IDA7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NreS1hdXRvY29tcGxldGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1NreUF1dG9jb21wbGV0ZUFkYXB0ZXJTZXJ2aWNlXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreUF1dG9jb21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vI3JlZ2lvbiBwdWJsaWNfYXBpXG5cbiAgLyoqXG4gICAqIFRoZSBIVE1MIGVsZW1lbnQgSUQgb2YgdGhlIGVsZW1lbnQgdGhhdCBsYWJlbHNcbiAgICogdGhlIGF1dG9jb21wbGV0ZSB0ZXh0IGlucHV0LiBUaGlzIHNldHMgdGhlIGlucHV0J3MgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIHRvIHByb3ZpZGUgYSB0ZXh0IGVxdWl2YWxlbnQgZm9yIHNjcmVlbiByZWFkZXJzXG4gICAqIFt0byBzdXBwb3J0IGFjY2Vzc2liaWxpdHldKGh0dHBzOi8vZGV2ZWxvcGVyLmJsYWNrYmF1ZC5jb20vc2t5dXgvbGVhcm4vYWNjZXNzaWJpbGl0eSkuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGUsIHNlZSB0aGUgW1dBSS1BUklBIGRlZmluaXRpb25dKGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS8jYXJpYS1sYWJlbGxlZGJ5KS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhcmlhTGFiZWxsZWRCeTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3RhdGljIGRhdGEgc291cmNlIGZvciB0aGUgYXV0b2NvbXBsZXRlIGNvbXBvbmVudCB0byBzZWFyY2hcbiAgICogd2hlbiB1c2VycyBlbnRlciB0ZXh0LiBGb3IgYSBkeW5hbWljIGRhdGEgc291cmNlIHN1Y2ggYXMgYW4gYXJyYXkgdGhhdFxuICAgKiBjaGFuZ2VzIGR1ZSB0byBzZXJ2ZXIgY2FsbHMsIHVzZSBgc2VhcmNoYCBvciBgc2VhcmNoQXN5bmNgIGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRhdGEodmFsdWU6IGFueVtdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2RhdGEgPSB2YWx1ZSA/PyBbXTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YSgpOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzZWFyY2hpbmcgd2hpbGUgdXNlcnNcbiAgICogZW50ZXIgdGV4dCBpbiB0aGUgYXV0b2NvbXBsZXRlIGZpZWxkLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGRlYm91bmNlVGltZSh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2RlYm91bmNlVGltZSA9IHZhbHVlID8/IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlYm91bmNlVGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfZGVib3VuY2VUaW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvYmplY3QgcHJvcGVydHkgdG8gZGlzcGxheSBpbiB0aGUgdGV4dCBpbnB1dCBhZnRlciB1c2Vyc1xuICAgKiBzZWxlY3QgYW4gaXRlbSBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQGRlZmF1bHQgXCJuYW1lXCJcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGVzY3JpcHRvclByb3BlcnR5KHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGVzY3JpcHRvclByb3BlcnR5ID0gdmFsdWUgfHwgJ25hbWUnO1xuICB9XG5cbiAgcHVibGljIGdldCBkZXNjcmlwdG9yUHJvcGVydHkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy4jX2Rlc2NyaXB0b3JQcm9wZXJ0eTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogV2hldGhlciB0byBkaXNwbGF5IGEgYnV0dG9uIGluIHRoZSBkcm9wZG93biB0aGF0IG9wZW5zIGEgcGlja2VyIHdoZXJlIHVzZXJzIGNhbiB2aWV3IGFsbCBvcHRpb25zLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGVuYWJsZVNob3dNb3JlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBvYnNlcnZhYmxlIG9mIGBTa3lBdXRvY29tcGxldGVNZXNzYWdlYCB0aGF0IGNhbiBjbG9zZSB0aGUgZHJvcGRvd24uXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBtZXNzYWdlU3RyZWFtKHZhbHVlOiBTdWJqZWN0PFNreUF1dG9jb21wbGV0ZU1lc3NhZ2U+IHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX21lc3NhZ2VTdHJlYW0gPSB2YWx1ZSA/PyBuZXcgU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPigpO1xuICAgIHRoaXMuI2luaXRNZXNzYWdlU3RyZWFtKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1lc3NhZ2VTdHJlYW0oKTogU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuI19tZXNzYWdlU3RyZWFtO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHdyYXBwZXJDbGFzczogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHByb3BlcnRpZXMgdG8gc2VhcmNoLlxuICAgKiBAZGVmYXVsdCBbXCJuYW1lXCJdXG4gICAqIEBkZXByZWNhdGVkIFdlIHJlY29tbWVuZCBhZ2FpbnN0IHVzaW5nIHRoaXMgcHJvcGVydHkuIFRvIHNlYXJjaCBzcGVjaWZpYyBwcm9wZXJ0aWVzLCB1c2UgdGhlIGBzZWFyY2hBc3luY2AgZXZlbnQgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgcHJvcGVydGllc1RvU2VhcmNoKHZhbHVlOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19wcm9wZXJ0aWVzVG9TZWFyY2ggPSB2YWx1ZSA/PyBbJ25hbWUnXTtcblxuICAgIHRoaXMuI3VwZGF0ZURlZmF1bHRTZWFyY2hPcHRpb25zKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHByb3BlcnRpZXNUb1NlYXJjaCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19wcm9wZXJ0aWVzVG9TZWFyY2g7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRoYXQgZHluYW1pY2FsbHkgbWFuYWdlcyB0aGUgZGF0YSBzb3VyY2Ugd2hlbiB1c2Vyc1xuICAgKiBjaGFuZ2UgdGhlIHRleHQgaW4gdGhlIGF1dG9jb21wbGV0ZSBmaWVsZC4gVGhlIHNlYXJjaCBmdW5jdGlvbiBtdXN0IHJldHVyblxuICAgKiBhbiBhcnJheSBvciBhIHByb21pc2Ugb2YgYW4gYXJyYXkuIFRoZSBgc2VhcmNoYCBwcm9wZXJ0eSBpcyBwYXJ0aWN1bGFybHlcbiAgICogdXNlZnVsIHdoZW4gdGhlIGRhdGEgc291cmNlIGRvZXMgbm90IGxpdmUgaW4gdGhlIHNvdXJjZSBjb2RlLlxuICAgKiBAZGVwcmVjYXRlZCBXZSByZWNvbW1lbmQgYWdhaW5zdCB1c2luZyB0aGlzIHByb3BlcnR5LiBUbyBjYWxsIGEgcmVtb3RlIGRhdGEgc291cmNlLCB1c2UgdGhlIGBzZWFyY2hBc3luY2AgZXZlbnQgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoKHZhbHVlOiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19zZWFyY2ggPSB2YWx1ZTtcbiAgICB0aGlzLnNlYXJjaE9yRGVmYXVsdCA9XG4gICAgICB2YWx1ZSB8fFxuICAgICAgc2t5QXV0b2NvbXBsZXRlRGVmYXVsdFNlYXJjaEZ1bmN0aW9uKHtcbiAgICAgICAgcHJvcGVydGllc1RvU2VhcmNoOiB0aGlzLnByb3BlcnRpZXNUb1NlYXJjaCxcbiAgICAgICAgc2VhcmNoRmlsdGVyczogdGhpcy5zZWFyY2hGaWx0ZXJzLFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaCgpOiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19zZWFyY2g7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRlbXBsYXRlIHRoYXQgZm9ybWF0cyBlYWNoIHNlYXJjaCByZXN1bHQgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIFRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IGluamVjdHMgc2VhcmNoIHJlc3VsdCB2YWx1ZXMgaW50byB0aGUgdGVtcGxhdGVcbiAgICogYXMgYGl0ZW1gIHZhcmlhYmxlcyB0aGF0IHJlZmVyZW5jZSBhbGwgb2YgdGhlIG9iamVjdCBwcm9wZXJ0aWVzIG9mIHRoZSBzZWFyY2ggcmVzdWx0cy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWFyY2hSZXN1bHRUZW1wbGF0ZTogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdXNlcnMgbXVzdCBlbnRlciBiZWZvcmVcbiAgICogdGhlIGF1dG9jb21wbGV0ZSBjb21wb25lbnQgc2VhcmNoZXMgdGhlIGRhdGEgc291cmNlIGFuZCBkaXNwbGF5cyBzZWFyY2hcbiAgICogcmVzdWx0cyBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICogQGRlZmF1bHQgMVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnModmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMgPSB2YWx1ZSAmJiB2YWx1ZSA+IDAgPyB2YWx1ZSA6IDE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBhcnJheSBvZiBmdW5jdGlvbnMgdG8gY2FsbCBhZ2FpbnN0IGVhY2ggc2VhcmNoIHJlc3VsdCBpbiBvcmRlclxuICAgKiB0byBmaWx0ZXIgdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgc2VhcmNoIGZ1bmN0aW9uLiBXaGVuXG4gICAqIHVzaW5nIHRoZSBgc2VhcmNoYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IGEgY3VzdG9tIHNlYXJjaCBmdW5jdGlvbiwgeW91IG11c3RcbiAgICogbWFudWFsbHkgYXBwbHkgZmlsdGVycyBpbnNpZGUgdGhhdCBmdW5jdGlvbi4gVGhlIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGB0cnVlYFxuICAgKiBvciBgZmFsc2VgIGZvciBlYWNoIHJlc3VsdCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRvIGRpc3BsYXkgaXQgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIEBkZXByZWNhdGVkIFdlIHJlY29tbWVuZCBhZ2FpbnN0IHVzaW5nIHRoaXMgcHJvcGVydHkuIFRvIGZpbHRlciByZXN1bHRzLCB1c2UgdGhlIGBzZWFyY2hBc3luY2AgZXZlbnQgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoRmlsdGVycyhcbiAgICB2YWx1ZTogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb25GaWx0ZXJbXSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICB0aGlzLiNfc2VhcmNoRmlsdGVycyA9IHZhbHVlO1xuXG4gICAgdGhpcy4jdXBkYXRlRGVmYXVsdFNlYXJjaE9wdGlvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VhcmNoRmlsdGVycygpOlxuICAgIHwgU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb25GaWx0ZXJbXVxuICAgIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlYXJjaEZpbHRlcnM7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlYXJjaCByZXN1bHRzIHRvIGRpc3BsYXkgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIEJ5IGRlZmF1bHQsIHRoZSBjb21wb25lbnQgZGlzcGxheXMgYWxsIG1hdGNoaW5nIHJlc3VsdHMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlYXJjaFJlc3VsdHNMaW1pdCh2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX3NlYXJjaFJlc3VsdHNMaW1pdCA9IHZhbHVlIHx8IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFJlc3VsdHNMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLiNfc2VhcmNoUmVzdWx0c0xpbWl0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgYSBidXR0b24gdGhhdCBsZXRzIHVzZXJzIGFkZCBvcHRpb25zIHRvIHRoZSBkYXRhIHNvdXJjZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzaG93QWRkQnV0dG9uOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBubyBzZWFyY2ggcmVzdWx0cyBhcmUgZm91bmQuXG4gICAqIEBkZWZhdWx0IFwiTm8gbWF0Y2hlcyBmb3VuZFwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9SZXN1bHRzRm91bmRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBBbGxvd3MgYXN5bmMgc2VhcmNoIHRvIGJlIGRpc2FibGVkIGV2ZW4gd2hlbiBhIGxpc3RlbmVyIGlzIHNwZWNpZmllZCBmb3JcbiAgICogdGhlIGBzZWFyY2hBc3luY2Agb3V0cHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNlYXJjaEFzeW5jRGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgc2VsZWN0IHRoZSBidXR0b24gdG8gYWRkIG9wdGlvbnMgdG8gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhZGRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgc2VsZWN0IHRoZSBidXR0b24gdG8gdmlldyBhbGwgb3B0aW9ucy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2hvd01vcmVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCBpdGVtcyBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lBdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgZW50ZXIgbmV3IHNlYXJjaCBpbmZvcm1hdGlvbiBhbmQgYWxsb3dzIHJlc3VsdHMgdG8gYmVcbiAgICogcmV0dXJuZWQgdmlhIGFuIG9ic2VydmFibGUuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNlYXJjaEFzeW5jID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0FyZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiB0ZW1wbGF0ZV9wcm9wZXJ0aWVzXG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRzKCk6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlYXJjaFJlc3VsdHMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlYXJjaFJlc3VsdHModmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdKSB7XG4gICAgdGhpcy4jX3NlYXJjaFJlc3VsdHMgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlnaGxpZ2h0VGV4dCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19oaWdobGlnaHRUZXh0IHx8IFtdO1xuICB9XG5cbiAgcHVibGljIHNldCBoaWdobGlnaHRUZXh0KHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuI19oaWdobGlnaHRUZXh0ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgcHVibGljIHJlc3VsdHNMaXN0SWQ6IHN0cmluZztcblxuICBwdWJsaWMgcmVzdWx0c1dyYXBwZXJJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgcHVibGljIGdldCBzaG93QWN0aW9uc0FyZWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zaG93QWRkQnV0dG9uIHx8ICEhdGhpcy5lbmFibGVTaG93TW9yZTtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG5cbiAgcHVibGljIHNlYXJjaFJlc3VsdHNDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIEBDb250ZW50Q2hpbGQoU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUpXG4gIHB1YmxpYyBzZXQgaW5wdXREaXJlY3RpdmUoXG4gICAgZGlyZWN0aXZlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICAnVGhlIFNreUF1dG9jb21wbGV0ZUNvbXBvbmVudCByZXF1aXJlcyBhIENvbnRlbnRDaGlsZCBpbnB1dCBvcicsXG4gICAgICAgICAgJ3RleHRhcmVhIGJvdW5kIHdpdGggdGhlIFNreUF1dG9jb21wbGV0ZSBkaXJlY3RpdmUuIEZvciBleGFtcGxlOicsXG4gICAgICAgICAgJ2A8aW5wdXQgdHlwZT1cInRleHRcIiBza3lBdXRvY29tcGxldGU+YC4nLFxuICAgICAgICBdLmpvaW4oJyAnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jX2lucHV0RGlyZWN0aXZlICE9PSBkaXJlY3RpdmUpIHtcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gb2xkIHN1YnNjcmlwdGlvbnMgb24gYW55IHByZXZpb3VzIGlucHV0IGRpcmVjdGl2ZVxuICAgICAgdGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5uZXh0KCk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcblxuICAgICAgdGhpcy4jX2lucHV0RGlyZWN0aXZlLmRpc3BsYXlXaXRoID0gdGhpcy5kZXNjcmlwdG9yUHJvcGVydHk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS50ZXh0Q2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBvZihjaGFuZ2UpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2VhcmNoVGV4dENoYW5nZWQoY2hhbmdlLnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIFdlIGRlbGF5IHRoaXMgbGlzdGVuZXIgYnkgMjVtcyB0byBnaXZlIHRoaW5ncyB3YXRjaGluZyB0aGUgdmFsdWUgdGltZSB0byByZXNwb25kIChzdWNoIGFzIHRoZSBzZWFyY2ggYnV0dG9uKS5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS5ibHVyXG4gICAgICAgIC5waXBlKGRlbGF5KDI1KSwgdGFrZVVudGlsKHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBkaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgIHRoaXMuI2NhbmNlbEN1cnJlbnRTZWFyY2goKTtcbiAgICAgICAgICBkaXJlY3RpdmUub25Ub3VjaGVkKCk7XG4gICAgICAgICAgdGhpcy4jaGFzRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS5mb2N1c1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2hhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuI29wZW5Ecm9wZG93bigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbnB1dERpcmVjdGl2ZSgpOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19pbnB1dERpcmVjdGl2ZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHNUZW1wbGF0ZVJlZicsIHtcbiAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgfSlcbiAgcHVibGljIHJlc3VsdHNUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgQFZpZXdDaGlsZCgncmVzdWx0c1JlZicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICB9KVxuICBwdWJsaWMgc2V0IHJlc3VsdHNSZWYodmFsdWU6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI19yZXN1bHRzUmVmID0gdmFsdWU7XG4gICAgICB0aGlzLiNkZXN0cm95QWZmaXhlcigpO1xuICAgICAgdGhpcy4jY3JlYXRlQWZmaXhlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzdWx0c1JlZigpOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3Jlc3VsdHNSZWY7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoT3JEZWZhdWx0OiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbjtcblxuICAvKipcbiAgICogSW5kZXggdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZGVzY2VuZGFudCBvZiB0aGUgb3ZlcmxheSBjdXJyZW50bHkgaGFzIGZvY3VzLlxuICAgKi9cbiAgI2FjdGl2ZUVsZW1lbnRJbmRleCA9IC0xO1xuXG4gICNhZGFwdGVyU2VydmljZTogU2t5QXV0b2NvbXBsZXRlQWRhcHRlclNlcnZpY2U7XG5cbiAgI2FmZml4ZXI6IFNreUFmZml4ZXIgfCB1bmRlZmluZWQ7XG5cbiAgI2FmZml4U2VydmljZTogU2t5QWZmaXhTZXJ2aWNlO1xuXG4gICNjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG5cbiAgI2VsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgI2hhc0ZvY3VzID0gZmFsc2U7XG5cbiAgI2lucHV0Qm94SG9zdFN2YzogU2t5SW5wdXRCb3hIb3N0U2VydmljZSB8IHVuZGVmaW5lZDtcblxuICAjaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI21lc3NhZ2VTdHJlYW1TdWI6IFN1YnNjcmlwdGlvbiB8IHVuZGVmaW5lZDtcblxuICAjbmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgI292ZXJsYXk6IFNreU92ZXJsYXlJbnN0YW5jZSB8IHVuZGVmaW5lZDtcblxuICAjb3ZlcmxheVNlcnZpY2U6IFNreU92ZXJsYXlTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBFbGVtZW50cyB3aXRoaW4gdGhlIGF1dG9jb21wbGV0ZSBkcm9wZG93biB0aGF0IGFyZSBmb2N1c2FibGUuXG4gICAqIFRoZXNlIGFyZSB0eXBpY2FsbHkgdGhlIHNlYXJjaCByZXN1bHRzIGFuZCBhY3Rpb24gYnV0dG9ucywgYnV0IGNvdWxkIGFsc28gYmVcbiAgICogZWxlbWVudHMgcHJvdmlkZWQgaW4gdGhlIGNvbnN1bWVyJ3Mgb3duIHRlbXBsYXRlLlxuICAgKi9cbiAgI292ZXJsYXlGb2N1c2FibGVFbGVtZW50czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICNjdXJyZW50U2VhcmNoU3ViOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgI3pJbmRleDogT2JzZXJ2YWJsZTxudW1iZXI+IHwgdW5kZWZpbmVkO1xuXG4gICNfZGF0YTogYW55W10gPSBbXTtcblxuICAjX2RlYm91bmNlVGltZSA9IDA7XG5cbiAgI19kZXNjcmlwdG9yUHJvcGVydHkgPSAnbmFtZSc7XG5cbiAgI19oaWdobGlnaHRUZXh0OiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcblxuICAjX2lucHV0RGlyZWN0aXZlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB8IHVuZGVmaW5lZDtcblxuICAjX21lc3NhZ2VTdHJlYW0gPSBuZXcgU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPigpO1xuXG4gICNfcHJvcGVydGllc1RvU2VhcmNoID0gWyduYW1lJ107XG5cbiAgI19yZXN1bHRzUmVmOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gICNfc2VhcmNoOiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbiB8IHVuZGVmaW5lZDtcblxuICAjX3NlYXJjaEZpbHRlcnM6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uRmlsdGVyW10gfCB1bmRlZmluZWQ7XG5cbiAgI19zZWFyY2hSZXN1bHRzOiBTa3lBdXRvY29tcGxldGVTZWFyY2hSZXN1bHRbXSB8IHVuZGVmaW5lZDtcblxuICAjX3NlYXJjaFJlc3VsdHNMaW1pdCA9IDA7XG5cbiAgI19zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMgPSAxO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIGFmZml4U2VydmljZTogU2t5QWZmaXhTZXJ2aWNlLFxuICAgIGFkYXB0ZXJTZXJ2aWNlOiBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZSxcbiAgICBvdmVybGF5U2VydmljZTogU2t5T3ZlcmxheVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgaW5wdXRCb3hIb3N0U3ZjPzogU2t5SW5wdXRCb3hIb3N0U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoU0tZX1NUQUNLSU5HX0NPTlRFWFQpXG4gICAgc3RhY2tpbmdDb250ZXh0PzogU2t5U3RhY2tpbmdDb250ZXh0XG4gICkge1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy4jZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7XG4gICAgdGhpcy4jYWZmaXhTZXJ2aWNlID0gYWZmaXhTZXJ2aWNlO1xuICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlID0gYWRhcHRlclNlcnZpY2U7XG4gICAgdGhpcy4jb3ZlcmxheVNlcnZpY2UgPSBvdmVybGF5U2VydmljZTtcbiAgICB0aGlzLiNpbnB1dEJveEhvc3RTdmMgPSBpbnB1dEJveEhvc3RTdmM7XG4gICAgdGhpcy4jekluZGV4ID0gc3RhY2tpbmdDb250ZXh0Py56SW5kZXg7XG5cbiAgICB0aGlzLnNlYXJjaE9yRGVmYXVsdCA9IHNreUF1dG9jb21wbGV0ZURlZmF1bHRTZWFyY2hGdW5jdGlvbih7XG4gICAgICBwcm9wZXJ0aWVzVG9TZWFyY2g6IFsnbmFtZSddLFxuICAgICAgc2VhcmNoRmlsdGVyczogdW5kZWZpbmVkLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaWQgPSArK3VuaXF1ZUlkO1xuICAgIHRoaXMucmVzdWx0c0xpc3RJZCA9IGBza3ktYXV0b2NvbXBsZXRlLWxpc3QtJHtpZH1gO1xuICAgIHRoaXMucmVzdWx0c1dyYXBwZXJJZCA9IGBza3ktYXV0b2NvbXBsZXRlLXdyYXBwZXItJHtpZH1gO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNhZGRJbnB1dEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jY2FuY2VsQ3VycmVudFNlYXJjaCgpO1xuICAgIHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLiNuZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy4jZGVzdHJveUFmZml4ZXIoKTtcbiAgICB0aGlzLiNkZXN0cm95T3ZlcmxheSgpO1xuICAgIHRoaXMub3BlbkNoYW5nZS5jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGFkZEJ1dHRvbkNsaWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRDbGljay5lbWl0KCk7XG4gICAgaWYgKHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgfVxuICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoZXZlbnQua2V5KSB7XG4gICAgICBjb25zdCBrZXkgPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLiNnZXRBY3RpdmVFbGVtZW50KCk7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50SWQgPSBhY3RpdmVFbGVtZW50Py5pZDtcbiAgICAgIGNvbnN0IHRhcmdldElzU2VhcmNoUmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoXG4gICAgICAgIChyKSA9PiByLmVsZW1lbnRJZCA9PT0gYWN0aXZlRWxlbWVudElkXG4gICAgICApO1xuXG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlICdlbnRlcic6XG4gICAgICAgICAgaWYgKHRhcmdldElzU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWxlY3RTZWFyY2hSZXN1bHRCeUlkKGFjdGl2ZUVsZW1lbnRJZCk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy4jcmVzZXRTZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgYWN0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdtb3VzZWRvd24nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd0YWInOlxuICAgICAgICAgIGlmICh0YXJnZXRJc1NlYXJjaFJlc3VsdCkge1xuICAgICAgICAgICAgdGhpcy4jc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChhY3RpdmVFbGVtZW50SWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnJlc3RvcmVJbnB1dFRleHRWYWx1ZVRvUHJldmlvdXNTdGF0ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlc2NhcGUnOlxuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdhcnJvd2Rvd24nOlxuICAgICAgICBjYXNlICdkb3duJzpcbiAgICAgICAgICB0aGlzLiNyZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPT09XG4gICAgICAgICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxIHx8XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggKyAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiNhZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fycm93dXAnOlxuICAgICAgICBjYXNlICd1cCc6XG4gICAgICAgICAgdGhpcy4jcmVtb3ZlRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPVxuICAgICAgICAgICAgICB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4IC0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy4jYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbW9yZUJ1dHRvbkNsaWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zaG93TW9yZUNsaWNrLmVtaXQoeyBpbnB1dFZhbHVlOiB0aGlzLnNlYXJjaFRleHQgfSk7XG4gICAgaWYgKHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgfVxuICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc3VsdE1vdXNlRG93bihpZDogc3RyaW5nLCBldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuI3NlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoaWQpO1xuXG4gICAgaWYgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiNyZXNldFNlYXJjaCgpO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgb25SZXN1bHRNb3VzZU1vdmUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpZCAhPT0gdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4KSB7XG4gICAgICB0aGlzLiNyZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9IGlkO1xuICAgICAgdGhpcy4jYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgaXNFbGVtZW50Rm9jdXNlZChyZWY6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHJlZiA9PT0gdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICAjc2VhcmNoVGV4dENoYW5nZWQoc2VhcmNoVGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI2hhc0ZvY3VzKSB7XG4gICAgICBjb25zdCBpc0VtcHR5ID1cbiAgICAgICAgIXNlYXJjaFRleHQgfHwgIXNlYXJjaFRleHQudHJpbSgpIHx8IHNlYXJjaFRleHQubWF0Y2goL15cXHMrJC8pO1xuXG4gICAgICBpZiAoaXNFbXB0eSkge1xuICAgICAgICAvLyBFbWl0IHNlbGVjdGlvbkNoYW5nZSBpZiB2YWx1ZSBoYXMgYmVlbiBjbGVhcmVkLlxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSAmJiB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZS5lbWl0KHtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbTogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLiNyZXNldFNlYXJjaCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG4gICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaXNMb25nRW5vdWdoID1cbiAgICAgICAgc2VhcmNoVGV4dC5sZW5ndGggPj0gdGhpcy5zZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnM7XG4gICAgICBjb25zdCBpc0RpZmZlcmVudCA9IHNlYXJjaFRleHQgIT09IHRoaXMuc2VhcmNoVGV4dDtcblxuICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gc2VhcmNoVGV4dC50cmltKCk7XG5cbiAgICAgIGlmIChpc0xvbmdFbm91Z2ggJiYgaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgdGhpcy4jY2FuY2VsQ3VycmVudFNlYXJjaCgpO1xuXG4gICAgICAgIHRoaXMuI2N1cnJlbnRTZWFyY2hTdWIgPSB0aGlzLiNwZXJmb3JtU2VhcmNoKClcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSByZXN1bHQ/Lml0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtICYmIHRoaXMuZGVzY3JpcHRvclByb3BlcnR5IGluIGl0ZW07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9XG4gICAgICAgICAgICAgIGl0ZW1zPy5tYXAoKHIsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogYCR7dGhpcy5yZXN1bHRzTGlzdElkfS1pdGVtLSR7aX1gLFxuICAgICAgICAgICAgICAgICAgZGF0YTogcixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pIHx8IFtdO1xuXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNDb3VudCA9IHJlc3VsdD8udG90YWxDb3VudCB8fCAwO1xuXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFRleHQgPSB0aGlzLiNnZXRIaWdobGlnaHRUZXh0KHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgICAgLy8gTGV0IHRoZSByZXN1bHRzIHBvcHVsYXRlIGluIHRoZSBET00gYmVmb3JlIHJlY2FsY3VsYXRpbmcgcGxhY2VtZW50LlxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jYWZmaXhlcikge1xuICAgICAgICAgICAgICAgICAgdGhpcy4jYWZmaXhlci5yZWFmZml4KCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgICAgICAgICB0aGlzLiNpbml0T3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuI29wZW5Ecm9wZG93bigpO1xuICAgICAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaXNTZWFyY2hpbmdBc3luYyA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgI3BlcmZvcm1TZWFyY2goKTogT2JzZXJ2YWJsZTxTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY1Jlc3VsdCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghdGhpcy5zZWFyY2hBc3luY0Rpc2FibGVkICYmIHRoaXMuc2VhcmNoQXN5bmMub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHNlYXJjaEFzeW5jQXJnczogU2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNBcmdzID0ge1xuICAgICAgICBkaXNwbGF5VHlwZTogJ3BvcG92ZXInLFxuICAgICAgICBvZmZzZXQ6IDAsXG4gICAgICAgIHNlYXJjaFRleHQ6IHRoaXMuc2VhcmNoVGV4dCxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VhcmNoQXN5bmMuZW1pdChzZWFyY2hBc3luY0FyZ3MpO1xuXG4gICAgICByZXR1cm4gc2VhcmNoQXN5bmNBcmdzLnJlc3VsdCB8fCBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VhcmNoT3JEZWZhdWx0KHRoaXMuc2VhcmNoVGV4dCwgdGhpcy5kYXRhLCB7XG4gICAgICBjb250ZXh0OiAncG9wb3ZlcicsXG4gICAgfSk7XG5cbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHJldHVybiBvZih7XG4gICAgICAgIGl0ZW1zOiByZXN1bHQsXG4gICAgICAgIHRvdGFsQ291bnQ6IHJlc3VsdC5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZnJvbShyZXN1bHQpLnBpcGUoXG4gICAgICBtYXAoKGl0ZW1zKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgdG90YWxDb3VudDogaXRlbXMubGVuZ3RoLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgI2NhbmNlbEN1cnJlbnRTZWFyY2goKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI2N1cnJlbnRTZWFyY2hTdWIpIHtcbiAgICAgIHRoaXMuI2N1cnJlbnRTZWFyY2hTdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuI2N1cnJlbnRTZWFyY2hTdWIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRleHQgdG8gaGlnaGxpZ2h0IGJhc2VkIG9uIGV4YWN0IG1hdGNoZXMsIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hlcywgYW5kIG1hdGNoZXMgZm9yIGNvcnJlc3BvbmRpbmcgZGlhY3JpdGljYWwgY2hhcmFjdGVycyAoYSB3aWxsIG1hdGNoIMOgKS5cbiAgICovXG4gICNnZXRIaWdobGlnaHRUZXh0KHNlYXJjaFRleHQ6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBub3JtYWxpemVkU2VhcmNoVGV4dCA9IG5vcm1hbGl6ZURpYWNyaXRpY3Moc2VhcmNoVGV4dClcbiAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgpXG4gICAgICAudHJpbSgpO1xuICAgIGlmICghbm9ybWFsaXplZFNlYXJjaFRleHQpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgbWF0Y2hlc1RvSGlnaGxpZ2h0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gdGhpcy5zZWFyY2hSZXN1bHRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnNlYXJjaFJlc3VsdHNbaV0uZGF0YVt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV1cbiAgICAgICAgLnRvU3RyaW5nKClcbiAgICAgICAgLnRvTG9jYWxlVXBwZXJDYXNlKCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZERhdGFWYWx1ZSA9IG5vcm1hbGl6ZURpYWNyaXRpY3ModmFsdWUpO1xuXG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIGxldCBpbmRleDogbnVtYmVyO1xuICAgICAgd2hpbGUgKFxuICAgICAgICAoaW5kZXggPSBub3JtYWxpemVkRGF0YVZhbHVlLmluZGV4T2Yobm9ybWFsaXplZFNlYXJjaFRleHQsIG9mZnNldCkpID4gLTFcbiAgICAgICkge1xuICAgICAgICBjb25zdCBtYXRjaGVkU3RyaW5nID0gdmFsdWUuc2xpY2UoaW5kZXgsIGluZGV4ICsgc2VhcmNoVGV4dC5sZW5ndGgpO1xuICAgICAgICBvZmZzZXQgPSBpbmRleCArIHNlYXJjaFRleHQubGVuZ3RoO1xuICAgICAgICBtYXRjaGVzVG9IaWdobGlnaHQgPSBtYXRjaGVzVG9IaWdobGlnaHQuY29uY2F0KG1hdGNoZWRTdHJpbmcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlbW92ZSBhbnkgZHVwbGljYXRlcyBmcm9tIHRoZSBhcnJheS5cbiAgICByZXR1cm4gWy4uLm5ldyBTZXQobWF0Y2hlc1RvSGlnaGxpZ2h0KV07XG4gIH1cblxuICAjc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zZWFyY2hSZXN1bHRzLmZpbmQoKHIpID0+IHIuZWxlbWVudElkID09PSBpZCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCBkYXRhID0gcmVzdWx0LmRhdGE7XG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSBkYXRhW3RoaXMuZGVzY3JpcHRvclByb3BlcnR5XTtcbiAgICAgIGlmICh0aGlzLmlucHV0RGlyZWN0aXZlKSB7XG4gICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUudmFsdWUgPSBkYXRhO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7XG4gICAgICAgIHNlbGVjdGVkSXRlbTogZGF0YSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gICNvcGVuRHJvcGRvd24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLiNvdmVybGF5ICYmIHRoaXMucmVzdWx0c1RlbXBsYXRlUmVmKSB7XG4gICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy4jb3ZlcmxheVNlcnZpY2UuY3JlYXRlKHtcbiAgICAgICAgZW5hYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgICBlbmFibGVQb2ludGVyRXZlbnRzOiB0cnVlLFxuICAgICAgICB3cmFwcGVyQ2xhc3M6IHRoaXMud3JhcHBlckNsYXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGlmICh0aGlzLiN6SW5kZXgpIHtcbiAgICAgICAgdGhpcy4jekluZGV4LnBpcGUodGFrZVVudGlsKG92ZXJsYXkuY2xvc2VkKSkuc3Vic2NyaWJlKCh6SW5kZXgpID0+IHtcbiAgICAgICAgICBvdmVybGF5LmNvbXBvbmVudFJlZi5pbnN0YW5jZS56SW5kZXggPSB6SW5kZXgudG9TdHJpbmcoMTApO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgb3ZlcmxheS5hdHRhY2hUZW1wbGF0ZSh0aGlzLnJlc3VsdHNUZW1wbGF0ZVJlZik7XG5cbiAgICAgIHRoaXMuI292ZXJsYXkgPSBvdmVybGF5O1xuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB0aGlzLiN1cGRhdGVBcmlhT3ducygpO1xuICAgICAgdGhpcy4jaW5pdE92ZXJsYXlGb2N1c2FibGVFbGVtZW50cygpO1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy4jcmVzZXRTZWFyY2goKTtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuI2Rlc3Ryb3lPdmVybGF5KCk7XG4gICAgdGhpcy4jcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuI3VwZGF0ZUFyaWFPd25zKCk7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgI3NldEFjdGl2ZURlc2NlbmRhbnQoKTogdm9pZCB7XG4gICAgY29uc3QgYWN0aXZlRWxlbWVudCA9XG4gICAgICB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHNbdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4XTtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChhY3RpdmVFbGVtZW50ICYmIHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUuc2V0QWN0aXZlRGVzY2VuZGFudChhY3RpdmVFbGVtZW50LmlkKTtcbiAgICB9XG4gIH1cblxuICAjcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5zZXRBY3RpdmVEZXNjZW5kYW50KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gICN1cGRhdGVBcmlhT3ducygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5zZXRBcmlhT3ducyh0aGlzLiNvdmVybGF5Py5pZCB8fCBudWxsKTtcbiAgICB9XG4gIH1cblxuICAjcmVzZXRTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5oaWdobGlnaHRUZXh0ID0gW107XG4gICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gICNhZGRJbnB1dEV2ZW50TGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLiNlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBvYnNlcnZhYmxlRnJvbUV2ZW50PEtleWJvYXJkRXZlbnQ+KGVsZW1lbnQsICdrZXlkb3duJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlS2V5ZG93bihldmVudCk7XG4gICAgICB9KTtcblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICBpZiAodGhpcy5pc09wZW4gJiYgdGhpcy5yZXN1bHRzUmVmKSB7XG4gICAgICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2V0RHJvcGRvd25XaWR0aChcbiAgICAgICAgICAgIHRoaXMuI2VsZW1lbnRSZWYsXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHNSZWYsXG4gICAgICAgICAgICAhIXRoaXMuI2lucHV0Qm94SG9zdFN2Y1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgI2Rlc3Ryb3lPdmVybGF5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNvdmVybGF5KSB7XG4gICAgICB0aGlzLiNvdmVybGF5U2VydmljZS5jbG9zZSh0aGlzLiNvdmVybGF5KTtcbiAgICAgIHRoaXMuI292ZXJsYXkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2NyZWF0ZUFmZml4ZXIoKTogdm9pZCB7XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIXRoaXMuI2FmZml4ZXIgJiYgdGhpcy5yZXN1bHRzUmVmKSB7XG4gICAgICBjb25zdCBhZmZpeGVyID0gdGhpcy4jYWZmaXhTZXJ2aWNlLmNyZWF0ZUFmZml4ZXIodGhpcy5yZXN1bHRzUmVmKTtcblxuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2Uuc2V0RHJvcGRvd25XaWR0aChcbiAgICAgICAgdGhpcy4jZWxlbWVudFJlZixcbiAgICAgICAgdGhpcy5yZXN1bHRzUmVmLFxuICAgICAgICAhIXRoaXMuI2lucHV0Qm94SG9zdFN2Y1xuICAgICAgKTtcblxuICAgICAgYWZmaXhlci5hZmZpeFRvKHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwge1xuICAgICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgICAgZW5hYmxlQXV0b0ZpdDogdHJ1ZSxcbiAgICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICAgIHBsYWNlbWVudDogJ2JlbG93JyxcbiAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogJ2xlZnQnLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuI2FmZml4ZXIgPSBhZmZpeGVyO1xuICAgIH1cbiAgfVxuXG4gICNkZXN0cm95QWZmaXhlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jYWZmaXhlcikge1xuICAgICAgdGhpcy4jYWZmaXhlci5kZXN0cm95KCk7XG4gICAgICB0aGlzLiNhZmZpeGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gICNpbml0TWVzc2FnZVN0cmVhbSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jbWVzc2FnZVN0cmVhbVN1Yikge1xuICAgICAgdGhpcy4jbWVzc2FnZVN0cmVhbVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy4jbWVzc2FnZVN0cmVhbVN1YiA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLiNtZXNzYWdlU3RyZWFtU3ViID0gdGhpcy5tZXNzYWdlU3RyZWFtLnN1YnNjcmliZSgobWVzc2FnZSkgPT4ge1xuICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5DbG9zZURyb3Bkb3duOlxuICAgICAgICAgIHRoaXMuI2Nsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZS5SZXBvc2l0aW9uRHJvcGRvd246XG4gICAgICAgICAgLy8gU2V0dGltZW91dCB3YWl0cyBmb3IgY2hhbmdlcyBpbiBET00gKGUuZy4sIHRva2VucyBiZWluZyByZW1vdmVkKVxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgICAgIGlmICh0aGlzLiNhZmZpeGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuI2FmZml4ZXIucmVhZmZpeCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTogdm9pZCB7XG4gICAgLy8gV2FpdCBmb3IgZHJvcGRvd24gZWxlbWVudHMgdG8gcmVuZGVyLlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI292ZXJsYXkpIHtcbiAgICAgICAgdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzID1cbiAgICAgICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5nZXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHModGhpcy4jb3ZlcmxheSk7XG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLnNldFRhYkluZGV4KGVsLCAtMSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLiNhZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gICNnZXRBY3RpdmVFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleF07XG4gIH1cblxuICAjcmVtb3ZlRm9jdXNlZENsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2UucmVtb3ZlQ1NTQ2xhc3MoXG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdLFxuICAgICAgICAnc2t5LWF1dG9jb21wbGV0ZS1kZXNjZW5kYW50LWZvY3VzJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAjYWRkRm9jdXNlZENsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPiAtMSkge1xuICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2UuYWRkQ1NTQ2xhc3MoXG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdLFxuICAgICAgICAnc2t5LWF1dG9jb21wbGV0ZS1kZXNjZW5kYW50LWZvY3VzJ1xuICAgICAgKTtcbiAgICAgIHRoaXMuI3NldEFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICB9XG4gIH1cblxuICAjdXBkYXRlRGVmYXVsdFNlYXJjaE9wdGlvbnMoKTogdm9pZCB7XG4gICAgLy8gUmVzZXQgZGVmYXVsdCBzZWFyY2ggaWYgaXQgaXMgd2hhdCBpcyBiZWluZyB1c2VkLlxuICAgIGlmICh0aGlzLnNlYXJjaCAhPT0gdGhpcy5zZWFyY2hPckRlZmF1bHQpIHtcbiAgICAgIHRoaXMuc2VhcmNoT3JEZWZhdWx0ID0gc2t5QXV0b2NvbXBsZXRlRGVmYXVsdFNlYXJjaEZ1bmN0aW9uKHtcbiAgICAgICAgcHJvcGVydGllc1RvU2VhcmNoOiB0aGlzLnByb3BlcnRpZXNUb1NlYXJjaCxcbiAgICAgICAgc2VhcmNoRmlsdGVyczogdGhpcy5zZWFyY2hGaWx0ZXJzLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2XG4gIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiXG4gIGFyaWEtaGFzcG9wdXA9XCJsaXN0Ym94XCJcbiAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlXCJcbiAgcm9sZT1cImNvbWJvYm94XCJcbiAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc09wZW5cIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICBbYXR0ci5hcmlhLW93bnNdPVwiaXNPcGVuID8gcmVzdWx0c0xpc3RJZCA6IG51bGxcIlxuICBbYXR0ci5pZF09XCJyZXN1bHRzV3JhcHBlcklkXCJcbj5cbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjcmVzdWx0c1RlbXBsYXRlUmVmPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLXJlc3VsdHMtY29udGFpbmVyXCJcbiAgICBbc2t5VGhlbWVDbGFzc109XCJ7XG4gICAgICAnc2t5LXNoYWRvdyc6ICdkZWZhdWx0JyxcbiAgICAgICdza3ktZWxldmF0aW9uLTQnOiAnbW9kZXJuJ1xuICAgIH1cIlxuICAgIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiXG4gICAgI3Jlc3VsdHNSZWZcbiAgPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwiaXNTZWFyY2hpbmdBc3luYzsgZWxzZSByZXN1bHRDb250cm9sc1RlbXBsYXRlUmVmXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRzLXdhaXRpbmdcIlxuICAgID5cbiAgICAgIDxza3ktd2FpdCBbaXNXYWl0aW5nXT1cInRydWVcIj48L3NreS13YWl0PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjcmVzdWx0Q29udHJvbHNUZW1wbGF0ZVJlZj5cbiAgPGRpdlxuICAgICpuZ0lmPVwic2VhcmNoVGV4dCAmJiAoIXNob3dBY3Rpb25zQXJlYSB8fCBzZWFyY2hSZXN1bHRzLmxlbmd0aCA+IDApXCJcbiAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtcmVzdWx0c1wiXG4gICAgcm9sZT1cImxpc3Rib3hcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICAgW2F0dHIuaWRdPVwicmVzdWx0c0xpc3RJZFwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCByZXN1bHQgb2Ygc2VhcmNoUmVzdWx0czsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgPGRpdlxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICghc2VhcmNoUmVzdWx0c0xpbWl0IHx8IGkgPCBzZWFyY2hSZXN1bHRzTGltaXQpICYmXG4gICAgICAgICAgIShlbmFibGVTaG93TW9yZSAmJiBpID49IDUpXG4gICAgICAgIFwiXG4gICAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRcIlxuICAgICAgICByb2xlPVwib3B0aW9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc0VsZW1lbnRGb2N1c2VkKHNlYXJjaFJlc3VsdEVsKVwiXG4gICAgICAgIFthdHRyLmRhdGEtZGVzY3JpcHRvci12YWx1ZV09XCJyZXN1bHQuZGF0YVtkZXNjcmlwdG9yUHJvcGVydHldXCJcbiAgICAgICAgW2F0dHIuaWRdPVwicmVzdWx0LmVsZW1lbnRJZFwiXG4gICAgICAgIFtza3lIaWdobGlnaHRdPVwiaGlnaGxpZ2h0VGV4dFwiXG4gICAgICAgIChtb3VzZWRvd24pPVwib25SZXN1bHRNb3VzZURvd24ocmVzdWx0LmVsZW1lbnRJZCwgJGV2ZW50KVwiXG4gICAgICAgIChtb3VzZW1vdmUpPVwib25SZXN1bHRNb3VzZU1vdmUoaSlcIlxuICAgICAgICAjc2VhcmNoUmVzdWx0RWxcbiAgICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRUZW1wbGF0ZSB8fCBkZWZhdWx0U2VhcmNoUmVzdWx0VGVtcGxhdGU7XG4gICAgICAgICAgICBjb250ZXh0OiB7IGl0ZW06IHJlc3VsdC5kYXRhIH1cbiAgICAgICAgICBcIlxuICAgICAgICA+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJzZWFyY2hSZXN1bHRzLmxlbmd0aCA9PT0gMFwiXG4gICAgICBjbGFzcz1cInNreS1kZWVtcGhhc2l6ZWQgc2t5LXBhZGRpbmctc3F1aXNoLWRlZmF1bHRcIlxuICAgID5cbiAgICAgIHt7XG4gICAgICAgIG5vUmVzdWx0c0ZvdW5kVGV4dCB8fFxuICAgICAgICAgICgnc2t5dXhfYXV0b2NvbXBsZXRlX25vX3Jlc3VsdHMnIHwgc2t5TGliUmVzb3VyY2VzKVxuICAgICAgfX1cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJzaG93QWN0aW9uc0FyZWFcIiBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtYWN0aW9uc1wiPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZW5hYmxlU2hvd01vcmUgJiYgKCFzZWFyY2hUZXh0IHx8IHNlYXJjaFJlc3VsdHMubGVuZ3RoID4gMClcIlxuICAgICAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLWFjdGlvbiBza3ktYXV0b2NvbXBsZXRlLWFjdGlvbi1tb3JlIHNreS1idG4gc2t5LWJ0bi1saW5rXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgKG1vdXNlZG93bik9XCJtb3JlQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICA+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgIShcbiAgICAgICAgICAgIHNlYXJjaEFzeW5jXG4gICAgICAgICAgICB8IHNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jRGlzYWJsZWQgOiBzZWFyY2hBc3luY0Rpc2FibGVkXG4gICAgICAgICAgKSAmJlxuICAgICAgICAgIHNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgIXNlYXJjaFRleHRcbiAgICAgICAgXCJcbiAgICAgID5cbiAgICAgICAge3sgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X2FsbCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgIChzZWFyY2hBc3luY1xuICAgICAgICAgICAgfCBza3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0Rpc2FibGVkIDogc2VhcmNoQXN5bmNEaXNhYmxlZCkgJiZcbiAgICAgICAgICAhc2VhcmNoVGV4dFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICB7e1xuICAgICAgICAgICdza3l1eF9hdXRvY29tcGxldGVfc2hvd19hbGxfY291bnQnXG4gICAgICAgICAgICB8IHNreUxpYlJlc291cmNlcyA6IChkYXRhLmxlbmd0aCB8IHNreU51bWVyaWMgOiB7IHRydW5jYXRlOiBmYWxzZSB9KVxuICAgICAgICB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VhcmNoVGV4dFwiPlxuICAgICAgICB7e1xuICAgICAgICAgICdza3l1eF9hdXRvY29tcGxldGVfc2hvd19tYXRjaGVzX2NvdW50J1xuICAgICAgICAgICAgfCBza3lMaWJSZXNvdXJjZXNcbiAgICAgICAgICAgICAgOiAoc2VhcmNoUmVzdWx0c0NvdW50ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgID8gZGF0YS5sZW5ndGhcbiAgICAgICAgICAgICAgICAgIDogKHNlYXJjaFJlc3VsdHNDb3VudCB8IHNreU51bWVyaWMgOiB7IHRydW5jYXRlOiBmYWxzZSB9KSlcbiAgICAgICAgfX1cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvYnV0dG9uPlxuICAgIDxkaXZcbiAgICAgICpuZ0lmPVwic2VhcmNoVGV4dCAmJiBzZWFyY2hSZXN1bHRzLmxlbmd0aCA9PT0gMFwiXG4gICAgICBjbGFzcz1cInNreS1mb250LWRlZW1waGFzaXplZCBza3ktYXV0b2NvbXBsZXRlLWFjdGlvbnMtbm8tcmVzdWx0c1wiXG4gICAgPlxuICAgICAge3tcbiAgICAgICAgbm9SZXN1bHRzRm91bmRUZXh0IHx8XG4gICAgICAgICAgKCdza3l1eF9hdXRvY29tcGxldGVfbm9fcmVzdWx0cycgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwic2hvd0FkZEJ1dHRvblwiXG4gICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtYWN0aW9uIHNreS1hdXRvY29tcGxldGUtYWN0aW9uLWFkZCBza3ktYnRuIHNreS1idG4tbGlua1wiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBbY2xhc3MuZm9jdXNlZF09XCJpc0VsZW1lbnRGb2N1c2VkKGFkZEJ1dHRvbkVsKVwiXG4gICAgICAobW91c2Vkb3duKT1cImFkZEJ1dHRvbkNsaWNrZWQoKVwiXG4gICAgICAjYWRkQnV0dG9uRWxcbiAgICA+XG4gICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiIGljb249XCJhZGRcIiBpY29uVHlwZT1cInNreXV4XCI+PC9za3ktaWNvbj5cbiAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidkZWZhdWx0J1wiIGljb249XCJwbHVzLWNpcmNsZVwiPjwvc2t5LWljb24+XG4gICAgICB7eyAnc2t5dXhfYXV0b2NvbXBsZXRlX2FkZCcgfCBza3lMaWJSZXNvdXJjZXMgfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgbGV0LWl0ZW09XCJpdGVtXCIgI2RlZmF1bHRTZWFyY2hSZXN1bHRUZW1wbGF0ZT5cbiAge3sgaXRlbVtkZXNjcmlwdG9yUHJvcGVydHldIH19XG48L25nLXRlbXBsYXRlPlxuIl19
859
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvY29tcG9uZW50cy9sb29rdXAvc3JjL2xpYi9tb2R1bGVzL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21wb25lbnRzL2xvb2t1cC9zcmMvbGliL21vZHVsZXMvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUVMLFFBQVEsRUFDUixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLHNCQUFzQixHQU12QixNQUFNLGFBQWEsQ0FBQztBQUdyQixPQUFPLEVBQ0wsZUFBZSxFQUVmLE9BQU8sRUFFUCxJQUFJLEVBQ0osU0FBUyxJQUFJLG1CQUFtQixFQUNoQyxFQUFFLEdBQ0gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsWUFBWSxFQUNaLEtBQUssRUFDTCxHQUFHLEVBQ0gsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEdBQ1YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUV4RSxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUM5RixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUsMEJBQTBCLEVB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O3NCQUQ1QixLQUFLO2dCQWNLLGNBQWM7c0JBRHhCLEtBQUs7Z0JBY0ssYUFBYTtzQkFEdkIsS0FBSztnQkFjQyxZQUFZO3NCQURsQixLQUFLO2dCQVNLLGtCQUFrQjtzQkFENUIsS0FBSztnQkFtQkssTUFBTTtzQkFEaEIsS0FBSztnQkFxQkMsb0JBQW9CO3NCQUQxQixLQUFLO2dCQVVLLDJCQUEyQjtzQkFEckMsS0FBSztnQkFrQkssYUFBYTtzQkFEdkIsS0FBSztnQkFvQkssa0JBQWtCO3NCQUQ1QixLQUFLO2dCQWVLLGFBQWE7c0JBRHZCLEtBQUs7Z0JBY0Msa0JBQWtCO3NCQUR4QixLQUFLO2dCQVVDLG1CQUFtQjtzQkFEekIsS0FBSztnQkFRQyxRQUFRO3NCQURkLE1BQU07Z0JBUUEsYUFBYTtzQkFEbkIsTUFBTTtnQkFPQSxlQUFlO3NCQURyQixNQUFNO2dCQVFBLFdBQVc7c0JBRGpCLE1BQU07Z0JBT0EsVUFBVTtzQkFEaEIsTUFBTTtnQkEwQ0ksY0FBYztzQkFEeEIsWUFBWTt1QkFBQyw2QkFBNkI7Z0JBZ0VwQyxrQkFBa0I7c0JBSHhCLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUU7d0JBQy9CLElBQUksRUFBRSxXQUFXO3FCQUNsQjtnQkFNVSxVQUFVO3NCQUhwQixTQUFTO3VCQUFDLFlBQVksRUFBRTt3QkFDdkIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9wdGlvbmFsLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgU0tZX1NUQUNLSU5HX0NPTlRFWFQsXG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5QWZmaXhlcixcbiAgU2t5T3ZlcmxheUluc3RhbmNlLFxuICBTa3lPdmVybGF5U2VydmljZSxcbiAgU2t5U3RhY2tpbmdDb250ZXh0LFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5pbXBvcnQgeyBTa3lJbnB1dEJveEhvc3RTZXJ2aWNlIH0gZnJvbSAnQHNreXV4L2Zvcm1zJztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBPYnNlcnZhYmxlLFxuICBTdWJqZWN0LFxuICBTdWJzY3JpcHRpb24sXG4gIGZyb20sXG4gIGZyb21FdmVudCBhcyBvYnNlcnZhYmxlRnJvbUV2ZW50LFxuICBvZixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBkZWJvdW5jZVRpbWUsXG4gIGRlbGF5LFxuICBtYXAsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZURpYWNyaXRpY3MgfSBmcm9tICcuLi9zaGFyZWQvc2t5LWxvb2t1cC1zdHJpbmctdXRpbHMnO1xuXG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVBZGFwdGVyU2VydmljZSB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWFkYXB0ZXIuc2VydmljZSc7XG5pbXBvcnQgeyBza3lBdXRvY29tcGxldGVEZWZhdWx0U2VhcmNoRnVuY3Rpb24gfSBmcm9tICcuL2F1dG9jb21wbGV0ZS1kZWZhdWx0LXNlYXJjaC1mdW5jdGlvbic7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB9IGZyb20gJy4vYXV0b2NvbXBsZXRlLWlucHV0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtbWVzc2FnZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVNZXNzYWdlVHlwZSB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLW1lc3NhZ2UtdHlwZSc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0FyZ3MgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtYXN5bmMtYXJncyc7XG5pbXBvcnQgeyBTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlYXJjaC1hc3luYy1yZXN1bHQnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24gfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtZnVuY3Rpb24nO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb25GaWx0ZXIgfSBmcm9tICcuL3R5cGVzL2F1dG9jb21wbGV0ZS1zZWFyY2gtZnVuY3Rpb24tZmlsdGVyJztcbmltcG9ydCB7IFNreUF1dG9jb21wbGV0ZVNlbGVjdGlvbkNoYW5nZSB9IGZyb20gJy4vdHlwZXMvYXV0b2NvbXBsZXRlLXNlbGVjdGlvbi1jaGFuZ2UnO1xuaW1wb3J0IHsgU2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzIH0gZnJvbSAnLi90eXBlcy9hdXRvY29tcGxldGUtc2hvdy1tb3JlLWFyZ3MnO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgU2t5QXV0b2NvbXBsZXRlU2VhcmNoUmVzdWx0IHtcbiAgZWxlbWVudElkOiBzdHJpbmc7XG4gIGRhdGE6IGFueTtcbn1cblxubGV0IHVuaXF1ZUlkID0gMDtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LWF1dG9jb21wbGV0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hdXRvY29tcGxldGUuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbU2t5QXV0b2NvbXBsZXRlQWRhcHRlclNlcnZpY2VdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2t5QXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcbiAgLy8jcmVnaW9uIHB1YmxpY19hcGlcblxuICAvKipcbiAgICogVGhlIEhUTUwgZWxlbWVudCBJRCBvZiB0aGUgZWxlbWVudCB0aGF0IGxhYmVsc1xuICAgKiB0aGUgYXV0b2NvbXBsZXRlIHRleHQgaW5wdXQuIFRoaXMgc2V0cyB0aGUgaW5wdXQncyBgYXJpYS1sYWJlbGxlZGJ5YCBhdHRyaWJ1dGUgdG8gcHJvdmlkZSBhIHRleHQgZXF1aXZhbGVudCBmb3Igc2NyZWVuIHJlYWRlcnNcbiAgICogW3RvIHN1cHBvcnQgYWNjZXNzaWJpbGl0eV0oaHR0cHM6Ly9kZXZlbG9wZXIuYmxhY2tiYXVkLmNvbS9za3l1eC9sZWFybi9hY2Nlc3NpYmlsaXR5KS5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGBhcmlhLWxhYmVsbGVkYnlgIGF0dHJpYnV0ZSwgc2VlIHRoZSBbV0FJLUFSSUEgZGVmaW5pdGlvbl0oaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLyNhcmlhLWxhYmVsbGVkYnkpLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIGFyaWFMYWJlbGxlZEJ5OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0aWMgZGF0YSBzb3VyY2UgZm9yIHRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IHRvIHNlYXJjaFxuICAgKiB3aGVuIHVzZXJzIGVudGVyIHRleHQuIEZvciBhIGR5bmFtaWMgZGF0YSBzb3VyY2Ugc3VjaCBhcyBhbiBhcnJheSB0aGF0XG4gICAqIGNoYW5nZXMgZHVlIHRvIHNlcnZlciBjYWxscywgdXNlIGBzZWFyY2hgIG9yIGBzZWFyY2hBc3luY2AgaW5zdGVhZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGF0YSh2YWx1ZTogYW55W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGF0YSA9IHZhbHVlID8/IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy4jX2RhdGE7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNlYXJjaGluZyB3aGlsZSB1c2Vyc1xuICAgKiBlbnRlciB0ZXh0IGluIHRoZSBhdXRvY29tcGxldGUgZmllbGQuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgZGVib3VuY2VUaW1lKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfZGVib3VuY2VUaW1lID0gdmFsdWUgPz8gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVib3VuY2VUaW1lKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuI19kZWJvdW5jZVRpbWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG9iamVjdCBwcm9wZXJ0eSB0byBkaXNwbGF5IGluIHRoZSB0ZXh0IGlucHV0IGFmdGVyIHVzZXJzXG4gICAqIHNlbGVjdCBhbiBpdGVtIGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBAZGVmYXVsdCBcIm5hbWVcIlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBkZXNjcmlwdG9yUHJvcGVydHkodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19kZXNjcmlwdG9yUHJvcGVydHkgPSB2YWx1ZSB8fCAnbmFtZSc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0b3JQcm9wZXJ0eSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiNfZGVzY3JpcHRvclByb3BlcnR5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBXaGV0aGVyIHRvIGRpc3BsYXkgYSBidXR0b24gaW4gdGhlIGRyb3Bkb3duIHRoYXQgb3BlbnMgYSBwaWNrZXIgd2hlcmUgdXNlcnMgY2FuIHZpZXcgYWxsIG9wdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IGVuYWJsZVNob3dNb3JlKHZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jX2VuYWJsZVNob3dNb3JlID0gISF2YWx1ZTtcbiAgICB0aGlzLiN1cGRhdGVJc0Ryb3Bkb3duVmlzaWJsZSgpO1xuICB9XG4gIHB1YmxpYyBnZXQgZW5hYmxlU2hvd01vcmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19lbmFibGVTaG93TW9yZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgb2JzZXJ2YWJsZSBvZiBgU2t5QXV0b2NvbXBsZXRlTWVzc2FnZWAgdGhhdCBjYW4gY2xvc2UgdGhlIGRyb3Bkb3duLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgbWVzc2FnZVN0cmVhbSh2YWx1ZTogU3ViamVjdDxTa3lBdXRvY29tcGxldGVNZXNzYWdlPiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19tZXNzYWdlU3RyZWFtID0gdmFsdWUgPz8gbmV3IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4oKTtcbiAgICB0aGlzLiNpbml0TWVzc2FnZVN0cmVhbSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlU3RyZWFtKCk6IFN1YmplY3Q8U2t5QXV0b2NvbXBsZXRlTWVzc2FnZT4ge1xuICAgIHJldHVybiB0aGlzLiNfbWVzc2FnZVN0cmVhbTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3cmFwcGVyQ2xhc3M6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCBwcm9wZXJ0aWVzIHRvIHNlYXJjaC5cbiAgICogQGRlZmF1bHQgW1wibmFtZVwiXVxuICAgKiBAZGVwcmVjYXRlZCBXZSByZWNvbW1lbmQgYWdhaW5zdCB1c2luZyB0aGlzIHByb3BlcnR5LiBUbyBzZWFyY2ggc3BlY2lmaWMgcHJvcGVydGllcywgdXNlIHRoZSBgc2VhcmNoQXN5bmNgIGV2ZW50IGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHByb3BlcnRpZXNUb1NlYXJjaCh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfcHJvcGVydGllc1RvU2VhcmNoID0gdmFsdWUgPz8gWyduYW1lJ107XG5cbiAgICB0aGlzLiN1cGRhdGVEZWZhdWx0U2VhcmNoT3B0aW9ucygpO1xuICB9XG5cbiAgcHVibGljIGdldCBwcm9wZXJ0aWVzVG9TZWFyY2goKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLiNfcHJvcGVydGllc1RvU2VhcmNoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmdW5jdGlvbiB0aGF0IGR5bmFtaWNhbGx5IG1hbmFnZXMgdGhlIGRhdGEgc291cmNlIHdoZW4gdXNlcnNcbiAgICogY2hhbmdlIHRoZSB0ZXh0IGluIHRoZSBhdXRvY29tcGxldGUgZmllbGQuIFRoZSBzZWFyY2ggZnVuY3Rpb24gbXVzdCByZXR1cm5cbiAgICogYW4gYXJyYXkgb3IgYSBwcm9taXNlIG9mIGFuIGFycmF5LiBUaGUgYHNlYXJjaGAgcHJvcGVydHkgaXMgcGFydGljdWxhcmx5XG4gICAqIHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHNvdXJjZSBkb2VzIG5vdCBsaXZlIGluIHRoZSBzb3VyY2UgY29kZS5cbiAgICogQGRlcHJlY2F0ZWQgV2UgcmVjb21tZW5kIGFnYWluc3QgdXNpbmcgdGhpcyBwcm9wZXJ0eS4gVG8gY2FsbCBhIHJlbW90ZSBkYXRhIHNvdXJjZSwgdXNlIHRoZSBgc2VhcmNoQXN5bmNgIGV2ZW50IGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlYXJjaCh2YWx1ZTogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2VhcmNoID0gdmFsdWU7XG4gICAgdGhpcy5zZWFyY2hPckRlZmF1bHQgPVxuICAgICAgdmFsdWUgfHxcbiAgICAgIHNreUF1dG9jb21wbGV0ZURlZmF1bHRTZWFyY2hGdW5jdGlvbih7XG4gICAgICAgIHByb3BlcnRpZXNUb1NlYXJjaDogdGhpcy5wcm9wZXJ0aWVzVG9TZWFyY2gsXG4gICAgICAgIHNlYXJjaEZpbHRlcnM6IHRoaXMuc2VhcmNoRmlsdGVycyxcbiAgICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2goKTogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNfc2VhcmNoO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZW1wbGF0ZSB0aGF0IGZvcm1hdHMgZWFjaCBzZWFyY2ggcmVzdWx0IGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBUaGUgYXV0b2NvbXBsZXRlIGNvbXBvbmVudCBpbmplY3RzIHNlYXJjaCByZXN1bHQgdmFsdWVzIGludG8gdGhlIHRlbXBsYXRlXG4gICAqIGFzIGBpdGVtYCB2YXJpYWJsZXMgdGhhdCByZWZlcmVuY2UgYWxsIG9mIHRoZSBvYmplY3QgcHJvcGVydGllcyBvZiB0aGUgc2VhcmNoIHJlc3VsdHMuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2VhcmNoUmVzdWx0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHVzZXJzIG11c3QgZW50ZXIgYmVmb3JlXG4gICAqIHRoZSBhdXRvY29tcGxldGUgY29tcG9uZW50IHNlYXJjaGVzIHRoZSBkYXRhIHNvdXJjZSBhbmQgZGlzcGxheXMgc2VhcmNoXG4gICAqIHJlc3VsdHMgaW4gdGhlIGRyb3Bkb3duIGxpc3QuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2VhcmNoVGV4dE1pbmltdW1DaGFyYWN0ZXJzID0gdmFsdWUgJiYgdmFsdWUgPiAwID8gdmFsdWUgOiAxO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2hUZXh0TWluaW11bUNoYXJhY3RlcnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYXJyYXkgb2YgZnVuY3Rpb25zIHRvIGNhbGwgYWdhaW5zdCBlYWNoIHNlYXJjaCByZXN1bHQgaW4gb3JkZXJcbiAgICogdG8gZmlsdGVyIHRoZSBzZWFyY2ggcmVzdWx0cyB3aGVuIHVzaW5nIHRoZSBkZWZhdWx0IHNlYXJjaCBmdW5jdGlvbi4gV2hlblxuICAgKiB1c2luZyB0aGUgYHNlYXJjaGAgcHJvcGVydHkgdG8gc3BlY2lmeSBhIGN1c3RvbSBzZWFyY2ggZnVuY3Rpb24sIHlvdSBtdXN0XG4gICAqIG1hbnVhbGx5IGFwcGx5IGZpbHRlcnMgaW5zaWRlIHRoYXQgZnVuY3Rpb24uIFRoZSBmdW5jdGlvbiBtdXN0IHJldHVybiBgdHJ1ZWBcbiAgICogb3IgYGZhbHNlYCBmb3IgZWFjaCByZXN1bHQgdG8gaW5kaWNhdGUgd2hldGhlciB0byBkaXNwbGF5IGl0IGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBAZGVwcmVjYXRlZCBXZSByZWNvbW1lbmQgYWdhaW5zdCB1c2luZyB0aGlzIHByb3BlcnR5LiBUbyBmaWx0ZXIgcmVzdWx0cywgdXNlIHRoZSBgc2VhcmNoQXN5bmNgIGV2ZW50IGluc3RlYWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNlYXJjaEZpbHRlcnMoXG4gICAgdmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uRmlsdGVyW10gfCB1bmRlZmluZWRcbiAgKSB7XG4gICAgdGhpcy4jX3NlYXJjaEZpbHRlcnMgPSB2YWx1ZTtcblxuICAgIHRoaXMuI3VwZGF0ZURlZmF1bHRTZWFyY2hPcHRpb25zKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaEZpbHRlcnMoKTpcbiAgICB8IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uRmlsdGVyW11cbiAgICB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19zZWFyY2hGaWx0ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWFyY2ggcmVzdWx0cyB0byBkaXNwbGF5IGluIHRoZSBkcm9wZG93biBsaXN0LlxuICAgKiBCeSBkZWZhdWx0LCB0aGUgY29tcG9uZW50IGRpc3BsYXlzIGFsbCBtYXRjaGluZyByZXN1bHRzLlxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzZWFyY2hSZXN1bHRzTGltaXQodmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI19zZWFyY2hSZXN1bHRzTGltaXQgPSB2YWx1ZSB8fCAwO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRzTGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlYXJjaFJlc3VsdHNMaW1pdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICogV2hldGhlciB0byBkaXNwbGF5IGEgYnV0dG9uIHRoYXQgbGV0cyB1c2VycyBhZGQgb3B0aW9ucyB0byB0aGUgZGF0YSBzb3VyY2UuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgc2V0IHNob3dBZGRCdXR0b24odmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNfc2hvd0FkZEJ1dHRvbiA9ICEhdmFsdWU7XG4gICAgdGhpcy4jdXBkYXRlSXNEcm9wZG93blZpc2libGUoKTtcbiAgfVxuICBwdWJsaWMgZ2V0IHNob3dBZGRCdXR0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI19zaG93QWRkQnV0dG9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIGRpc3BsYXkgd2hlbiBubyBzZWFyY2ggcmVzdWx0cyBhcmUgZm91bmQuXG4gICAqIEBkZWZhdWx0IFwiTm8gbWF0Y2hlcyBmb3VuZFwiXG4gICAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgbm9SZXN1bHRzRm91bmRUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKiBBbGxvd3MgYXN5bmMgc2VhcmNoIHRvIGJlIGRpc2FibGVkIGV2ZW4gd2hlbiBhIGxpc3RlbmVyIGlzIHNwZWNpZmllZCBmb3JcbiAgICogdGhlIGBzZWFyY2hBc3luY2Agb3V0cHV0LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgcHVibGljIHNlYXJjaEFzeW5jRGlzYWJsZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgc2VsZWN0IHRoZSBidXR0b24gdG8gYWRkIG9wdGlvbnMgdG8gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBhZGRDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgc2VsZWN0IHRoZSBidXR0b24gdG8gdmlldyBhbGwgb3B0aW9ucy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2hvd01vcmVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8U2t5QXV0b2NvbXBsZXRlU2hvd01vcmVBcmdzPigpO1xuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHVzZXJzIHNlbGVjdCBpdGVtcyBpbiB0aGUgZHJvcGRvd24gbGlzdC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lBdXRvY29tcGxldGVTZWxlY3Rpb25DaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdXNlcnMgZW50ZXIgbmV3IHNlYXJjaCBpbmZvcm1hdGlvbiBhbmQgYWxsb3dzIHJlc3VsdHMgdG8gYmVcbiAgICogcmV0dXJuZWQgdmlhIGFuIG9ic2VydmFibGUuXG4gICAqL1xuICBAT3V0cHV0KClcbiAgcHVibGljIHNlYXJjaEFzeW5jID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lBdXRvY29tcGxldGVTZWFyY2hBc3luY0FyZ3M+KCk7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBvcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIC8vI3JlZ2lvbiB0ZW1wbGF0ZV9wcm9wZXJ0aWVzXG5cbiAgcHVibGljIGdldCBzZWFyY2hSZXN1bHRzKCk6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdIHtcbiAgICByZXR1cm4gdGhpcy4jX3NlYXJjaFJlc3VsdHMgfHwgW107XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlYXJjaFJlc3VsdHModmFsdWU6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdKSB7XG4gICAgdGhpcy4jX3NlYXJjaFJlc3VsdHMgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlnaGxpZ2h0VGV4dCgpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuI19oaWdobGlnaHRUZXh0IHx8IFtdO1xuICB9XG5cbiAgcHVibGljIHNldCBoaWdobGlnaHRUZXh0KHZhbHVlOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuI19oaWdobGlnaHRUZXh0ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XG5cbiAgcHVibGljIHJlc3VsdHNMaXN0SWQ6IHN0cmluZztcblxuICBwdWJsaWMgcmVzdWx0c1dyYXBwZXJJZDogc3RyaW5nO1xuXG4gIHB1YmxpYyBzZWFyY2hUZXh0ID0gJyc7XG5cbiAgcHVibGljIGdldCBzaG93QWN0aW9uc0FyZWEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zaG93QWRkQnV0dG9uIHx8ICEhdGhpcy5lbmFibGVTaG93TW9yZTtcbiAgfVxuXG4gIHB1YmxpYyBpc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG5cbiAgcHVibGljIHNlYXJjaFJlc3VsdHNDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIC8vI2VuZHJlZ2lvblxuXG4gIEBDb250ZW50Q2hpbGQoU2t5QXV0b2NvbXBsZXRlSW5wdXREaXJlY3RpdmUpXG4gIHB1YmxpYyBzZXQgaW5wdXREaXJlY3RpdmUoXG4gICAgZGlyZWN0aXZlOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB8IHVuZGVmaW5lZFxuICApIHtcbiAgICBpZiAoIWRpcmVjdGl2ZSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIFtcbiAgICAgICAgICAnVGhlIFNreUF1dG9jb21wbGV0ZUNvbXBvbmVudCByZXF1aXJlcyBhIENvbnRlbnRDaGlsZCBpbnB1dCBvcicsXG4gICAgICAgICAgJ3RleHRhcmVhIGJvdW5kIHdpdGggdGhlIFNreUF1dG9jb21wbGV0ZSBkaXJlY3RpdmUuIEZvciBleGFtcGxlOicsXG4gICAgICAgICAgJ2A8aW5wdXQgdHlwZT1cInRleHRcIiBza3lBdXRvY29tcGxldGU+YC4nLFxuICAgICAgICBdLmpvaW4oJyAnKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4jX2lucHV0RGlyZWN0aXZlICE9PSBkaXJlY3RpdmUpIHtcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gb2xkIHN1YnNjcmlwdGlvbnMgb24gYW55IHByZXZpb3VzIGlucHV0IGRpcmVjdGl2ZVxuICAgICAgdGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZS5uZXh0KCk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZSA9IGRpcmVjdGl2ZTtcblxuICAgICAgdGhpcy4jX2lucHV0RGlyZWN0aXZlLmRpc3BsYXlXaXRoID0gdGhpcy5kZXNjcmlwdG9yUHJvcGVydHk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS50ZXh0Q2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSksXG4gICAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBvZihjaGFuZ2UpO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2VhcmNoVGV4dENoYW5nZWQoY2hhbmdlLnZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIFdlIGRlbGF5IHRoaXMgbGlzdGVuZXIgYnkgMjVtcyB0byBnaXZlIHRoaW5ncyB3YXRjaGluZyB0aGUgdmFsdWUgdGltZSB0byByZXNwb25kIChzdWNoIGFzIHRoZSBzZWFyY2ggYnV0dG9uKS5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS5ibHVyXG4gICAgICAgIC5waXBlKGRlbGF5KDI1KSwgdGFrZVVudGlsKHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUpKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICBkaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgIHRoaXMuI2NhbmNlbEN1cnJlbnRTZWFyY2goKTtcbiAgICAgICAgICBkaXJlY3RpdmUub25Ub3VjaGVkKCk7XG4gICAgICAgICAgdGhpcy4jaGFzRm9jdXMgPSBmYWxzZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuI19pbnB1dERpcmVjdGl2ZS5mb2N1c1xuICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy4jaW5wdXREaXJlY3RpdmVVbnN1YnNjcmliZSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI2hhc0ZvY3VzID0gdHJ1ZTtcbiAgICAgICAgICBpZiAodGhpcy5zaG93QWN0aW9uc0FyZWEpIHtcbiAgICAgICAgICAgIHRoaXMuI29wZW5Ecm9wZG93bigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbnB1dERpcmVjdGl2ZSgpOiBTa3lBdXRvY29tcGxldGVJbnB1dERpcmVjdGl2ZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI19pbnB1dERpcmVjdGl2ZTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3Jlc3VsdHNUZW1wbGF0ZVJlZicsIHtcbiAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgfSlcbiAgcHVibGljIHJlc3VsdHNUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8dW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgQFZpZXdDaGlsZCgncmVzdWx0c1JlZicsIHtcbiAgICByZWFkOiBFbGVtZW50UmVmLFxuICB9KVxuICBwdWJsaWMgc2V0IHJlc3VsdHNSZWYodmFsdWU6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuI19yZXN1bHRzUmVmID0gdmFsdWU7XG4gICAgICB0aGlzLiNkZXN0cm95QWZmaXhlcigpO1xuICAgICAgdGhpcy4jY3JlYXRlQWZmaXhlcigpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVzdWx0c1JlZigpOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jX3Jlc3VsdHNSZWY7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoT3JEZWZhdWx0OiBTa3lBdXRvY29tcGxldGVTZWFyY2hGdW5jdGlvbjtcblxuICBwcm90ZWN0ZWQgaXNEcm9wZG93blZpc2libGU6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgLyoqXG4gICAqIEluZGV4IHRoYXQgaW5kaWNhdGVzIHdoaWNoIGRlc2NlbmRhbnQgb2YgdGhlIG92ZXJsYXkgY3VycmVudGx5IGhhcyBmb2N1cy5cbiAgICovXG4gICNhY3RpdmVFbGVtZW50SW5kZXggPSAtMTtcblxuICAjYWRhcHRlclNlcnZpY2U6IFNreUF1dG9jb21wbGV0ZUFkYXB0ZXJTZXJ2aWNlO1xuXG4gICNhZmZpeGVyOiBTa3lBZmZpeGVyIHwgdW5kZWZpbmVkO1xuXG4gICNhZmZpeFNlcnZpY2U6IFNreUFmZml4U2VydmljZTtcblxuICAjY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmO1xuXG4gICNlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gICNoYXNGb2N1cyA9IGZhbHNlO1xuXG4gICNpbnB1dEJveEhvc3RTdmM6IFNreUlucHV0Qm94SG9zdFNlcnZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNtZXNzYWdlU3RyZWFtU3ViOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQ7XG5cbiAgI25nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICNvdmVybGF5OiBTa3lPdmVybGF5SW5zdGFuY2UgfCB1bmRlZmluZWQ7XG5cbiAgI292ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZTtcblxuICAvKipcbiAgICogRWxlbWVudHMgd2l0aGluIHRoZSBhdXRvY29tcGxldGUgZHJvcGRvd24gdGhhdCBhcmUgZm9jdXNhYmxlLlxuICAgKiBUaGVzZSBhcmUgdHlwaWNhbGx5IHRoZSBzZWFyY2ggcmVzdWx0cyBhbmQgYWN0aW9uIGJ1dHRvbnMsIGJ1dCBjb3VsZCBhbHNvIGJlXG4gICAqIGVsZW1lbnRzIHByb3ZpZGVkIGluIHRoZSBjb25zdW1lcidzIG93biB0ZW1wbGF0ZS5cbiAgICovXG4gICNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHM6IEhUTUxFbGVtZW50W10gPSBbXTtcblxuICAjY3VycmVudFNlYXJjaFN1YjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICNpc0Ryb3Bkb3duVmlzaWJsZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICN6SW5kZXg6IE9ic2VydmFibGU8bnVtYmVyPiB8IHVuZGVmaW5lZDtcblxuICAjX2RhdGE6IGFueVtdID0gW107XG5cbiAgI19kZWJvdW5jZVRpbWUgPSAwO1xuXG4gICNfZGVzY3JpcHRvclByb3BlcnR5ID0gJ25hbWUnO1xuXG4gICNfZW5hYmxlU2hvd01vcmUgPSBmYWxzZTtcblxuICAjX2hpZ2hsaWdodFRleHQ6IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuXG4gICNfaW5wdXREaXJlY3RpdmU6IFNreUF1dG9jb21wbGV0ZUlucHV0RGlyZWN0aXZlIHwgdW5kZWZpbmVkO1xuXG4gICNfbWVzc2FnZVN0cmVhbSA9IG5ldyBTdWJqZWN0PFNreUF1dG9jb21wbGV0ZU1lc3NhZ2U+KCk7XG5cbiAgI19wcm9wZXJ0aWVzVG9TZWFyY2ggPSBbJ25hbWUnXTtcblxuICAjX3Jlc3VsdHNSZWY6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG5cbiAgI19zZWFyY2g6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuXG4gICNfc2VhcmNoRmlsdGVyczogU2t5QXV0b2NvbXBsZXRlU2VhcmNoRnVuY3Rpb25GaWx0ZXJbXSB8IHVuZGVmaW5lZDtcblxuICAjX3NlYXJjaFJlc3VsdHM6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdFtdIHwgdW5kZWZpbmVkO1xuXG4gICNfc2VhcmNoUmVzdWx0c0xpbWl0ID0gMDtcblxuICAjX3NlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycyA9IDE7XG5cbiAgI19zaG93QWRkQnV0dG9uID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgYWZmaXhTZXJ2aWNlOiBTa3lBZmZpeFNlcnZpY2UsXG4gICAgYWRhcHRlclNlcnZpY2U6IFNreUF1dG9jb21wbGV0ZUFkYXB0ZXJTZXJ2aWNlLFxuICAgIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBpbnB1dEJveEhvc3RTdmM/OiBTa3lJbnB1dEJveEhvc3RTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChTS1lfU1RBQ0tJTkdfQ09OVEVYVClcbiAgICBzdGFja2luZ0NvbnRleHQ/OiBTa3lTdGFja2luZ0NvbnRleHRcbiAgKSB7XG4gICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IgPSBjaGFuZ2VEZXRlY3RvcjtcbiAgICB0aGlzLiNlbGVtZW50UmVmID0gZWxlbWVudFJlZjtcbiAgICB0aGlzLiNhZmZpeFNlcnZpY2UgPSBhZmZpeFNlcnZpY2U7XG4gICAgdGhpcy4jYWRhcHRlclNlcnZpY2UgPSBhZGFwdGVyU2VydmljZTtcbiAgICB0aGlzLiNvdmVybGF5U2VydmljZSA9IG92ZXJsYXlTZXJ2aWNlO1xuICAgIHRoaXMuI2lucHV0Qm94SG9zdFN2YyA9IGlucHV0Qm94SG9zdFN2YztcbiAgICB0aGlzLiN6SW5kZXggPSBzdGFja2luZ0NvbnRleHQ/LnpJbmRleDtcblxuICAgIHRoaXMuc2VhcmNoT3JEZWZhdWx0ID0gc2t5QXV0b2NvbXBsZXRlRGVmYXVsdFNlYXJjaEZ1bmN0aW9uKHtcbiAgICAgIHByb3BlcnRpZXNUb1NlYXJjaDogWyduYW1lJ10sXG4gICAgICBzZWFyY2hGaWx0ZXJzOiB1bmRlZmluZWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpZCA9ICsrdW5pcXVlSWQ7XG4gICAgdGhpcy5yZXN1bHRzTGlzdElkID0gYHNreS1hdXRvY29tcGxldGUtbGlzdC0ke2lkfWA7XG4gICAgdGhpcy5yZXN1bHRzV3JhcHBlcklkID0gYHNreS1hdXRvY29tcGxldGUtd3JhcHBlci0ke2lkfWA7XG4gICAgdGhpcy5pc0Ryb3Bkb3duVmlzaWJsZSA9IHRoaXMuI2lzRHJvcGRvd25WaXNpYmxlLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLiNhZGRJbnB1dEV2ZW50TGlzdGVuZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy4jY2FuY2VsQ3VycmVudFNlYXJjaCgpO1xuICAgIHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI2lucHV0RGlyZWN0aXZlVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZS5jb21wbGV0ZSgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgIHRoaXMuI25nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLiNkZXN0cm95QWZmaXhlcigpO1xuICAgIHRoaXMuI2Rlc3Ryb3lPdmVybGF5KCk7XG4gICAgdGhpcy5vcGVuQ2hhbmdlLmNvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQnV0dG9uQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENsaWNrLmVtaXQoKTtcbiAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5yZXN0b3JlSW5wdXRUZXh0VmFsdWVUb1ByZXZpb3VzU3RhdGUoKTtcbiAgICB9XG4gICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChldmVudC5rZXkpIHtcbiAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgY29uc3QgYWN0aXZlRWxlbWVudCA9IHRoaXMuI2dldEFjdGl2ZUVsZW1lbnQoKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnRJZCA9IGFjdGl2ZUVsZW1lbnQ/LmlkO1xuICAgICAgY29uc3QgdGFyZ2V0SXNTZWFyY2hSZXN1bHQgPSB0aGlzLnNlYXJjaFJlc3VsdHMuZmluZChcbiAgICAgICAgKHIpID0+IHIuZWxlbWVudElkID09PSBhY3RpdmVFbGVtZW50SWRcbiAgICAgICk7XG5cbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ2VudGVyJzpcbiAgICAgICAgICBpZiAodGFyZ2V0SXNTZWFyY2hSZXN1bHQpIHtcbiAgICAgICAgICAgIHRoaXMuI3NlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoYWN0aXZlRWxlbWVudElkKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSkge1xuICAgICAgICAgICAgICB0aGlzLiNjbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLiNyZXNldFNlYXJjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlZG93bicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RhYic6XG4gICAgICAgICAgaWYgKHRhcmdldElzU2VhcmNoUmVzdWx0KSB7XG4gICAgICAgICAgICB0aGlzLiNzZWxlY3RTZWFyY2hSZXN1bHRCeUlkKGFjdGl2ZUVsZW1lbnRJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlucHV0RGlyZWN0aXZlKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUucmVzdG9yZUlucHV0VGV4dFZhbHVlVG9QcmV2aW91c1N0YXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2VzY2FwZSc6XG4gICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2Fycm93ZG93bic6XG4gICAgICAgIGNhc2UgJ2Rvd24nOlxuICAgICAgICAgIHRoaXMuI3JlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9PT1cbiAgICAgICAgICAgICAgdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCAtIDEgfHxcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9PT0gLTFcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9IHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuI2FkZEZvY3VzZWRDbGFzcygpO1xuICAgICAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnYXJyb3d1cCc6XG4gICAgICAgIGNhc2UgJ3VwJzpcbiAgICAgICAgICB0aGlzLiNyZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICBpZiAodGhpcy4jYWN0aXZlRWxlbWVudEluZGV4IDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleCA9XG4gICAgICAgICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50cy5sZW5ndGggLSAxO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLiNhZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBtb3JlQnV0dG9uQ2xpY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dNb3JlQ2xpY2suZW1pdCh7IGlucHV0VmFsdWU6IHRoaXMuc2VhcmNoVGV4dCB9KTtcbiAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgdGhpcy5pbnB1dERpcmVjdGl2ZS5yZXN0b3JlSW5wdXRUZXh0VmFsdWVUb1ByZXZpb3VzU3RhdGUoKTtcbiAgICB9XG4gICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICB9XG5cbiAgcHVibGljIG9uUmVzdWx0TW91c2VEb3duKGlkOiBzdHJpbmcsIGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy4jc2VsZWN0U2VhcmNoUmVzdWx0QnlJZChpZCk7XG5cbiAgICBpZiAoIXRoaXMuc2hvd0FjdGlvbnNBcmVhKSB7XG4gICAgICB0aGlzLiNjbG9zZURyb3Bkb3duKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuI3Jlc2V0U2VhcmNoKCk7XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfVxuXG4gIHB1YmxpYyBvblJlc3VsdE1vdXNlTW92ZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGlkICE9PSB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXgpIHtcbiAgICAgIHRoaXMuI3JlbW92ZUZvY3VzZWRDbGFzcygpO1xuICAgICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gaWQ7XG4gICAgICB0aGlzLiNhZGRGb2N1c2VkQ2xhc3MoKTtcbiAgICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0VsZW1lbnRGb2N1c2VkKHJlZjogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVmID09PSB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHNbdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gICNzZWFyY2hUZXh0Q2hhbmdlZChzZWFyY2hUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jaGFzRm9jdXMpIHtcbiAgICAgIGNvbnN0IGlzRW1wdHkgPVxuICAgICAgICAhc2VhcmNoVGV4dCB8fCAhc2VhcmNoVGV4dC50cmltKCkgfHwgc2VhcmNoVGV4dC5tYXRjaCgvXlxccyskLyk7XG5cbiAgICAgIGlmIChpc0VtcHR5KSB7XG4gICAgICAgIC8vIEVtaXQgc2VsZWN0aW9uQ2hhbmdlIGlmIHZhbHVlIGhhcyBiZWVuIGNsZWFyZWQuXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmICh0aGlzLmlucHV0RGlyZWN0aXZlICYmIHRoaXMuaW5wdXREaXJlY3RpdmUudmFsdWUpIHtcbiAgICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgICAgICAgc2VsZWN0ZWRJdGVtOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2hvd0FjdGlvbnNBcmVhKSB7XG4gICAgICAgICAgdGhpcy4jY2xvc2VEcm9wZG93bigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuI3Jlc2V0U2VhcmNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzU2VhcmNoaW5nQXN5bmMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpc0xvbmdFbm91Z2ggPVxuICAgICAgICBzZWFyY2hUZXh0Lmxlbmd0aCA+PSB0aGlzLnNlYXJjaFRleHRNaW5pbXVtQ2hhcmFjdGVycztcbiAgICAgIGNvbnN0IGlzRGlmZmVyZW50ID0gc2VhcmNoVGV4dCAhPT0gdGhpcy5zZWFyY2hUZXh0O1xuXG4gICAgICB0aGlzLnNlYXJjaFRleHQgPSBzZWFyY2hUZXh0LnRyaW0oKTtcbiAgICAgIHRoaXMuI3VwZGF0ZUlzRHJvcGRvd25WaXNpYmxlKCk7XG5cbiAgICAgIGlmIChpc0xvbmdFbm91Z2ggJiYgaXNEaWZmZXJlbnQpIHtcbiAgICAgICAgdGhpcy4jY2FuY2VsQ3VycmVudFNlYXJjaCgpO1xuXG4gICAgICAgIHRoaXMuI2N1cnJlbnRTZWFyY2hTdWIgPSB0aGlzLiNwZXJmb3JtU2VhcmNoKClcbiAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSByZXN1bHQ/Lml0ZW1zLmZpbHRlcigoaXRlbTogYW55KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtICYmIHRoaXMuZGVzY3JpcHRvclByb3BlcnR5IGluIGl0ZW07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5pc1NlYXJjaGluZ0FzeW5jID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMuc2VhcmNoUmVzdWx0cyA9XG4gICAgICAgICAgICAgIGl0ZW1zPy5tYXAoKHIsIGkpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IFNreUF1dG9jb21wbGV0ZVNlYXJjaFJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogYCR7dGhpcy5yZXN1bHRzTGlzdElkfS1pdGVtLSR7aX1gLFxuICAgICAgICAgICAgICAgICAgZGF0YTogcixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0pIHx8IFtdO1xuXG4gICAgICAgICAgICB0aGlzLnNlYXJjaFJlc3VsdHNDb3VudCA9IHJlc3VsdD8udG90YWxDb3VudCB8fCAwO1xuXG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodFRleHQgPSB0aGlzLiNnZXRIaWdobGlnaHRUZXh0KHRoaXMuc2VhcmNoVGV4dCk7XG4gICAgICAgICAgICB0aGlzLiNyZW1vdmVGb2N1c2VkQ2xhc3MoKTtcbiAgICAgICAgICAgIHRoaXMuI3JlbW92ZUFjdGl2ZURlc2NlbmRhbnQoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaFJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXggPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUlzRHJvcGRvd25WaXNpYmxlKCk7XG4gICAgICAgICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgIC8vIExldCB0aGUgcmVzdWx0cyBwb3B1bGF0ZSBpbiB0aGUgRE9NIGJlZm9yZSByZWNhbGN1bGF0aW5nIHBsYWNlbWVudC5cbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2FmZml4ZXIpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuI2FmZml4ZXIucmVhZmZpeCgpO1xuICAgICAgICAgICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgdGhpcy4jaW5pdE92ZXJsYXlGb2N1c2FibGVFbGVtZW50cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLiNvcGVuRHJvcGRvd24oKTtcbiAgICAgICAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzU2VhcmNoaW5nQXN5bmMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaXNTZWFyY2hpbmdBc3luYyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gICNwZXJmb3JtU2VhcmNoKCk6IE9ic2VydmFibGU8U2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNSZXN1bHQgfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoQXN5bmNEaXNhYmxlZCAmJiB0aGlzLnNlYXJjaEFzeW5jLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBzZWFyY2hBc3luY0FyZ3M6IFNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jQXJncyA9IHtcbiAgICAgICAgZGlzcGxheVR5cGU6ICdwb3BvdmVyJyxcbiAgICAgICAgb2Zmc2V0OiAwLFxuICAgICAgICBzZWFyY2hUZXh0OiB0aGlzLnNlYXJjaFRleHQsXG4gICAgICB9O1xuXG4gICAgICB0aGlzLnNlYXJjaEFzeW5jLmVtaXQoc2VhcmNoQXN5bmNBcmdzKTtcblxuICAgICAgcmV0dXJuIHNlYXJjaEFzeW5jQXJncy5yZXN1bHQgfHwgb2YodW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNlYXJjaE9yRGVmYXVsdCh0aGlzLnNlYXJjaFRleHQsIHRoaXMuZGF0YSwge1xuICAgICAgY29udGV4dDogJ3BvcG92ZXInLFxuICAgIH0pO1xuXG4gICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICByZXR1cm4gb2Yoe1xuICAgICAgICBpdGVtczogcmVzdWx0LFxuICAgICAgICB0b3RhbENvdW50OiByZXN1bHQubGVuZ3RoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZyb20ocmVzdWx0KS5waXBlKFxuICAgICAgbWFwKChpdGVtcykgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zLFxuICAgICAgICAgIHRvdGFsQ291bnQ6IGl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gICNjYW5jZWxDdXJyZW50U2VhcmNoKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNjdXJyZW50U2VhcmNoU3ViKSB7XG4gICAgICB0aGlzLiNjdXJyZW50U2VhcmNoU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLiNjdXJyZW50U2VhcmNoU3ViID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZXh0IHRvIGhpZ2hsaWdodCBiYXNlZCBvbiBleGFjdCBtYXRjaGVzLCBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoZXMsIGFuZCBtYXRjaGVzIGZvciBjb3JyZXNwb25kaW5nIGRpYWNyaXRpY2FsIGNoYXJhY3RlcnMgKGEgd2lsbCBtYXRjaCDDoCkuXG4gICAqL1xuICAjZ2V0SGlnaGxpZ2h0VGV4dChzZWFyY2hUZXh0OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNlYXJjaFRleHQgPSBub3JtYWxpemVEaWFjcml0aWNzKHNlYXJjaFRleHQpXG4gICAgICAudG9Mb2NhbGVVcHBlckNhc2UoKVxuICAgICAgLnRyaW0oKTtcbiAgICBpZiAoIW5vcm1hbGl6ZWRTZWFyY2hUZXh0KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IG1hdGNoZXNUb0hpZ2hsaWdodDogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMCwgbiA9IHRoaXMuc2VhcmNoUmVzdWx0cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5zZWFyY2hSZXN1bHRzW2ldLmRhdGFbdGhpcy5kZXNjcmlwdG9yUHJvcGVydHldXG4gICAgICAgIC50b1N0cmluZygpXG4gICAgICAgIC50b0xvY2FsZVVwcGVyQ2FzZSgpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhVmFsdWUgPSBub3JtYWxpemVEaWFjcml0aWNzKHZhbHVlKTtcblxuICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICBsZXQgaW5kZXg6IG51bWJlcjtcbiAgICAgIHdoaWxlIChcbiAgICAgICAgKGluZGV4ID0gbm9ybWFsaXplZERhdGFWYWx1ZS5pbmRleE9mKG5vcm1hbGl6ZWRTZWFyY2hUZXh0LCBvZmZzZXQpKSA+IC0xXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFN0cmluZyA9IHZhbHVlLnNsaWNlKGluZGV4LCBpbmRleCArIHNlYXJjaFRleHQubGVuZ3RoKTtcbiAgICAgICAgb2Zmc2V0ID0gaW5kZXggKyBzZWFyY2hUZXh0Lmxlbmd0aDtcbiAgICAgICAgbWF0Y2hlc1RvSGlnaGxpZ2h0ID0gbWF0Y2hlc1RvSGlnaGxpZ2h0LmNvbmNhdChtYXRjaGVkU3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgYXJyYXkuXG4gICAgcmV0dXJuIFsuLi5uZXcgU2V0KG1hdGNoZXNUb0hpZ2hsaWdodCldO1xuICB9XG5cbiAgI3NlbGVjdFNlYXJjaFJlc3VsdEJ5SWQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2VhcmNoUmVzdWx0cy5maW5kKChyKSA9PiByLmVsZW1lbnRJZCA9PT0gaWQpO1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC5kYXRhO1xuICAgICAgdGhpcy5zZWFyY2hUZXh0ID0gZGF0YVt0aGlzLmRlc2NyaXB0b3JQcm9wZXJ0eV07XG4gICAgICBpZiAodGhpcy5pbnB1dERpcmVjdGl2ZSkge1xuICAgICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnZhbHVlID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoe1xuICAgICAgICBzZWxlY3RlZEl0ZW06IGRhdGEsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAjb3BlbkRyb3Bkb3duKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jb3ZlcmxheSAmJiB0aGlzLnJlc3VsdHNUZW1wbGF0ZVJlZikge1xuICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuI292ZXJsYXlTZXJ2aWNlLmNyZWF0ZSh7XG4gICAgICAgIGVuYWJsZUNsb3NlOiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogdHJ1ZSxcbiAgICAgICAgd3JhcHBlckNsYXNzOiB0aGlzLndyYXBwZXJDbGFzcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy4jekluZGV4KSB7XG4gICAgICAgIHRoaXMuI3pJbmRleC5waXBlKHRha2VVbnRpbChvdmVybGF5LmNsb3NlZCkpLnN1YnNjcmliZSgoekluZGV4KSA9PiB7XG4gICAgICAgICAgb3ZlcmxheS5jb21wb25lbnRSZWYuaW5zdGFuY2UuekluZGV4ID0gekluZGV4LnRvU3RyaW5nKDEwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIG92ZXJsYXkuYXR0YWNoVGVtcGxhdGUodGhpcy5yZXN1bHRzVGVtcGxhdGVSZWYpO1xuXG4gICAgICB0aGlzLiNvdmVybGF5ID0gb3ZlcmxheTtcbiAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuI3VwZGF0ZUlzRHJvcGRvd25WaXNpYmxlKCk7XG4gICAgICB0aGlzLiNjaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIHRoaXMuI3VwZGF0ZUFyaWFDb250cm9scygpO1xuICAgICAgdGhpcy4jaW5pdE92ZXJsYXlGb2N1c2FibGVFbGVtZW50cygpO1xuICAgICAgdGhpcy5vcGVuQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgI2Nsb3NlRHJvcGRvd24oKTogdm9pZCB7XG4gICAgdGhpcy4jcmVzZXRTZWFyY2goKTtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuI2Rlc3Ryb3lPdmVybGF5KCk7XG4gICAgdGhpcy4jcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuI3VwZGF0ZUFyaWFDb250cm9scygpO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMub3BlbkNoYW5nZS5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gICNzZXRBY3RpdmVEZXNjZW5kYW50KCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPVxuICAgICAgdGhpcy4jb3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzW3RoaXMuI2FjdGl2ZUVsZW1lbnRJbmRleF07XG4gICAgLyogU2FuaXR5IGNoZWNrICovXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoYWN0aXZlRWxlbWVudCAmJiB0aGlzLmlucHV0RGlyZWN0aXZlKSB7XG4gICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnNldEFjdGl2ZURlc2NlbmRhbnQoYWN0aXZlRWxlbWVudC5pZCk7XG4gICAgfVxuICB9XG5cbiAgI3JlbW92ZUFjdGl2ZURlc2NlbmRhbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW5wdXREaXJlY3RpdmUpIHtcbiAgICAgIHRoaXMuaW5wdXREaXJlY3RpdmUuc2V0QWN0aXZlRGVzY2VuZGFudChudWxsKTtcbiAgICB9XG4gIH1cblxuICAjdXBkYXRlQXJpYUNvbnRyb2xzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0RGlyZWN0aXZlKSB7XG4gICAgICB0aGlzLmlucHV0RGlyZWN0aXZlLnNldEFyaWFDb250cm9scyh0aGlzLiNvdmVybGF5Py5pZCB8fCBudWxsKTtcbiAgICB9XG4gIH1cblxuICAjcmVzZXRTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzID0gW107XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gJyc7XG4gICAgdGhpcy5oaWdobGlnaHRUZXh0ID0gW107XG4gICAgdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID0gLTE7XG4gICAgdGhpcy5zZWFyY2hSZXN1bHRzQ291bnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy4jcmVtb3ZlQWN0aXZlRGVzY2VuZGFudCgpO1xuICAgIHRoaXMuI2luaXRPdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMoKTtcbiAgICB0aGlzLiN1cGRhdGVJc0Ryb3Bkb3duVmlzaWJsZSgpO1xuICAgIHRoaXMuI2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgI2FkZElucHV0RXZlbnRMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuI2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgIG9ic2VydmFibGVGcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oZWxlbWVudCwgJ2tleWRvd24nKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVLZXlkb3duKGV2ZW50KTtcbiAgICAgIH0pO1xuXG4gICAgb2JzZXJ2YWJsZUZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuI25nVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiB0aGlzLnJlc3VsdHNSZWYpIHtcbiAgICAgICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5zZXREcm9wZG93bldpZHRoKFxuICAgICAgICAgICAgdGhpcy4jZWxlbWVudFJlZixcbiAgICAgICAgICAgIHRoaXMucmVzdWx0c1JlZixcbiAgICAgICAgICAgICEhdGhpcy4jaW5wdXRCb3hIb3N0U3ZjXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAjZGVzdHJveU92ZXJsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuI292ZXJsYXkpIHtcbiAgICAgIHRoaXMuI292ZXJsYXlTZXJ2aWNlLmNsb3NlKHRoaXMuI292ZXJsYXkpO1xuICAgICAgdGhpcy4jb3ZlcmxheSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAjY3JlYXRlQWZmaXhlcigpOiB2b2lkIHtcbiAgICAvKiBTYW5pdHkgY2hlY2sgKi9cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICghdGhpcy4jYWZmaXhlciAmJiB0aGlzLnJlc3VsdHNSZWYpIHtcbiAgICAgIGNvbnN0IGFmZml4ZXIgPSB0aGlzLiNhZmZpeFNlcnZpY2UuY3JlYXRlQWZmaXhlcih0aGlzLnJlc3VsdHNSZWYpO1xuXG4gICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5zZXREcm9wZG93bldpZHRoKFxuICAgICAgICB0aGlzLiNlbGVtZW50UmVmLFxuICAgICAgICB0aGlzLnJlc3VsdHNSZWYsXG4gICAgICAgICEhdGhpcy4jaW5wdXRCb3hIb3N0U3ZjXG4gICAgICApO1xuXG4gICAgICBhZmZpeGVyLmFmZml4VG8odGhpcy4jZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICAgIGF1dG9GaXRDb250ZXh0OiBTa3lBZmZpeEF1dG9GaXRDb250ZXh0LlZpZXdwb3J0LFxuICAgICAgICBlbmFibGVBdXRvRml0OiB0cnVlLFxuICAgICAgICBpc1N0aWNreTogdHJ1ZSxcbiAgICAgICAgcGxhY2VtZW50OiAnYmVsb3cnLFxuICAgICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAnbGVmdCcsXG4gICAgICB9KTtcblxuICAgICAgdGhpcy4jYWZmaXhlciA9IGFmZml4ZXI7XG4gICAgfVxuICB9XG5cbiAgI2Rlc3Ryb3lBZmZpeGVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNhZmZpeGVyKSB7XG4gICAgICB0aGlzLiNhZmZpeGVyLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuI2FmZml4ZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgI2luaXRNZXNzYWdlU3RyZWFtKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLiNtZXNzYWdlU3RyZWFtU3ViKSB7XG4gICAgICB0aGlzLiNtZXNzYWdlU3RyZWFtU3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgICB0aGlzLiNtZXNzYWdlU3RyZWFtU3ViID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuI21lc3NhZ2VTdHJlYW1TdWIgPSB0aGlzLm1lc3NhZ2VTdHJlYW1cbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLiNuZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgc3dpdGNoIChtZXNzYWdlLnR5cGUpIHtcbiAgICAgICAgICBjYXNlIFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VUeXBlLkNsb3NlRHJvcGRvd246XG4gICAgICAgICAgICB0aGlzLiNjbG9zZURyb3Bkb3duKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFNreUF1dG9jb21wbGV0ZU1lc3NhZ2VUeXBlLlJlcG9zaXRpb25Ecm9wZG93bjpcbiAgICAgICAgICAgIC8vIFNldHRpbWVvdXQgd2FpdHMgZm9yIGNoYW5nZXMgaW4gRE9NIChlLmcuLCB0b2tlbnMgYmVpbmcgcmVtb3ZlZClcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgICAgICAgICBpZiAodGhpcy4jYWZmaXhlcikge1xuICAgICAgICAgICAgICAgIHRoaXMuI2FmZml4ZXIucmVhZmZpeCgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gICNpbml0T3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzKCk6IHZvaWQge1xuICAgIC8vIFdhaXQgZm9yIGRyb3Bkb3duIGVsZW1lbnRzIHRvIHJlbmRlci5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNvdmVybGF5KSB7XG4gICAgICAgIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50cyA9XG4gICAgICAgICAgdGhpcy4jYWRhcHRlclNlcnZpY2UuZ2V0T3ZlcmxheUZvY3VzYWJsZUVsZW1lbnRzKHRoaXMuI292ZXJsYXkpO1xuICAgICAgICB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICB0aGlzLiNhZGFwdGVyU2VydmljZS5zZXRUYWJJbmRleChlbCwgLTEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4jYWRkRm9jdXNlZENsYXNzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAjZ2V0QWN0aXZlRWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuI292ZXJsYXlGb2N1c2FibGVFbGVtZW50c1t0aGlzLiNhY3RpdmVFbGVtZW50SW5kZXhdO1xuICB9XG5cbiAgI3JlbW92ZUZvY3VzZWRDbGFzcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLnJlbW92ZUNTU0NsYXNzKFxuICAgICAgICB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHNbdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4XSxcbiAgICAgICAgJ3NreS1hdXRvY29tcGxldGUtZGVzY2VuZGFudC1mb2N1cydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgI2FkZEZvY3VzZWRDbGFzcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy4jYWN0aXZlRWxlbWVudEluZGV4ID4gLTEpIHtcbiAgICAgIHRoaXMuI2FkYXB0ZXJTZXJ2aWNlLmFkZENTU0NsYXNzKFxuICAgICAgICB0aGlzLiNvdmVybGF5Rm9jdXNhYmxlRWxlbWVudHNbdGhpcy4jYWN0aXZlRWxlbWVudEluZGV4XSxcbiAgICAgICAgJ3NreS1hdXRvY29tcGxldGUtZGVzY2VuZGFudC1mb2N1cydcbiAgICAgICk7XG4gICAgICB0aGlzLiNzZXRBY3RpdmVEZXNjZW5kYW50KCk7XG4gICAgfVxuICB9XG5cbiAgI3VwZGF0ZURlZmF1bHRTZWFyY2hPcHRpb25zKCk6IHZvaWQge1xuICAgIC8vIFJlc2V0IGRlZmF1bHQgc2VhcmNoIGlmIGl0IGlzIHdoYXQgaXMgYmVpbmcgdXNlZC5cbiAgICBpZiAodGhpcy5zZWFyY2ggIT09IHRoaXMuc2VhcmNoT3JEZWZhdWx0KSB7XG4gICAgICB0aGlzLnNlYXJjaE9yRGVmYXVsdCA9IHNreUF1dG9jb21wbGV0ZURlZmF1bHRTZWFyY2hGdW5jdGlvbih7XG4gICAgICAgIHByb3BlcnRpZXNUb1NlYXJjaDogdGhpcy5wcm9wZXJ0aWVzVG9TZWFyY2gsXG4gICAgICAgIHNlYXJjaEZpbHRlcnM6IHRoaXMuc2VhcmNoRmlsdGVycyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gICN1cGRhdGVJc0Ryb3Bkb3duVmlzaWJsZSgpOiB2b2lkIHtcbiAgICBjb25zdCBpc0Ryb3Bkb3duVmlzaWJsZSA9XG4gICAgICAhIXRoaXMuc2VhcmNoVGV4dCAmJlxuICAgICAgKCF0aGlzLnNob3dBY3Rpb25zQXJlYSB8fCB0aGlzLnNlYXJjaFJlc3VsdHMubGVuZ3RoID4gMCk7XG4gICAgaWYgKGlzRHJvcGRvd25WaXNpYmxlICE9PSB0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZS5nZXRWYWx1ZSgpKSB7XG4gICAgICB0aGlzLiNpc0Ryb3Bkb3duVmlzaWJsZS5uZXh0KGlzRHJvcGRvd25WaXNpYmxlKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXZcbiAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcbiAgYXJpYS1oYXNwb3B1cD1cImxpc3Rib3hcIlxuICBjbGFzcz1cInNreS1hdXRvY29tcGxldGVcIlxuICByb2xlPVwiY29tYm9ib3hcIlxuICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzRHJvcGRvd25WaXNpYmxlIHwgYXN5bmNcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkQnlcIlxuICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIihpc0Ryb3Bkb3duVmlzaWJsZSB8IGFzeW5jKSA/IHJlc3VsdHNMaXN0SWQgOiBudWxsXCJcbiAgW2F0dHIuaWRdPVwicmVzdWx0c1dyYXBwZXJJZFwiXG4+XG4gIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3Jlc3VsdHNUZW1wbGF0ZVJlZj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRzLWNvbnRhaW5lclwiXG4gICAgW3NreVRoZW1lQ2xhc3NdPVwie1xuICAgICAgJ3NreS1zaGFkb3cnOiAnZGVmYXVsdCcsXG4gICAgICAnc2t5LWVsZXZhdGlvbi00JzogJ21vZGVybidcbiAgICB9XCJcbiAgICAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxuICAgICNyZXN1bHRzUmVmXG4gID5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cImlzU2VhcmNoaW5nQXN5bmM7IGVsc2UgcmVzdWx0Q29udHJvbHNUZW1wbGF0ZVJlZlwiXG4gICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtcmVzdWx0cy13YWl0aW5nXCJcbiAgICA+XG4gICAgICA8c2t5LXdhaXQgW2lzV2FpdGluZ109XCJ0cnVlXCI+PC9za3ktd2FpdD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3Jlc3VsdENvbnRyb2xzVGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICAqbmdJZj1cImlzRHJvcGRvd25WaXNpYmxlIHwgYXN5bmNcIlxuICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1yZXN1bHRzXCJcbiAgICByb2xlPVwibGlzdGJveFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgICBbYXR0ci5pZF09XCJyZXN1bHRzTGlzdElkXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHJlc3VsdCBvZiBzZWFyY2hSZXN1bHRzOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgKCFzZWFyY2hSZXN1bHRzTGltaXQgfHwgaSA8IHNlYXJjaFJlc3VsdHNMaW1pdCkgJiZcbiAgICAgICAgICAhKGVuYWJsZVNob3dNb3JlICYmIGkgPj0gNSlcbiAgICAgICAgXCJcbiAgICAgICAgY2xhc3M9XCJza3ktYXV0b2NvbXBsZXRlLXJlc3VsdFwiXG4gICAgICAgIHJvbGU9XCJvcHRpb25cIlxuICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzRWxlbWVudEZvY3VzZWQoc2VhcmNoUmVzdWx0RWwpXCJcbiAgICAgICAgW2F0dHIuZGF0YS1kZXNjcmlwdG9yLXZhbHVlXT1cInJlc3VsdC5kYXRhW2Rlc2NyaXB0b3JQcm9wZXJ0eV1cIlxuICAgICAgICBbYXR0ci5pZF09XCJyZXN1bHQuZWxlbWVudElkXCJcbiAgICAgICAgW3NreUhpZ2hsaWdodF09XCJoaWdobGlnaHRUZXh0XCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJvblJlc3VsdE1vdXNlRG93bihyZXN1bHQuZWxlbWVudElkLCAkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvblJlc3VsdE1vdXNlTW92ZShpKVwiXG4gICAgICAgICNzZWFyY2hSZXN1bHRFbFxuICAgICAgPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgIHNlYXJjaFJlc3VsdFRlbXBsYXRlIHx8IGRlZmF1bHRTZWFyY2hSZXN1bHRUZW1wbGF0ZTtcbiAgICAgICAgICAgIGNvbnRleHQ6IHsgaXRlbTogcmVzdWx0LmRhdGEgfVxuICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8ZGl2XG4gICAgICAqbmdJZj1cInNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWRlZW1waGFzaXplZCBza3ktcGFkZGluZy1zcXVpc2gtZGVmYXVsdFwiXG4gICAgPlxuICAgICAge3tcbiAgICAgICAgbm9SZXN1bHRzRm91bmRUZXh0IHx8XG4gICAgICAgICAgKCdza3l1eF9hdXRvY29tcGxldGVfbm9fcmVzdWx0cycgfCBza3lMaWJSZXNvdXJjZXMpXG4gICAgICB9fVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cInNob3dBY3Rpb25zQXJlYVwiIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1hY3Rpb25zXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJlbmFibGVTaG93TW9yZSAmJiAoIXNlYXJjaFRleHQgfHwgc2VhcmNoUmVzdWx0cy5sZW5ndGggPiAwKVwiXG4gICAgICBjbGFzcz1cInNreS1hdXRvY29tcGxldGUtYWN0aW9uIHNreS1hdXRvY29tcGxldGUtYWN0aW9uLW1vcmUgc2t5LWJ0biBza3ktYnRuLWxpbmtcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAobW91c2Vkb3duKT1cIm1vcmVCdXR0b25DbGlja2VkKClcIlxuICAgID5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAhKFxuICAgICAgICAgICAgc2VhcmNoQXN5bmNcbiAgICAgICAgICAgIHwgc2t5QXV0b2NvbXBsZXRlU2VhcmNoQXN5bmNEaXNhYmxlZCA6IHNlYXJjaEFzeW5jRGlzYWJsZWRcbiAgICAgICAgICApICYmXG4gICAgICAgICAgc2VhcmNoUmVzdWx0cy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAhc2VhcmNoVGV4dFxuICAgICAgICBcIlxuICAgICAgPlxuICAgICAgICB7eyAnc2t5dXhfYXV0b2NvbXBsZXRlX3Nob3dfYWxsJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiXG4gICAgICAgICAgKHNlYXJjaEFzeW5jXG4gICAgICAgICAgICB8IHNreUF1dG9jb21wbGV0ZVNlYXJjaEFzeW5jRGlzYWJsZWQgOiBzZWFyY2hBc3luY0Rpc2FibGVkKSAmJlxuICAgICAgICAgICFzZWFyY2hUZXh0XG4gICAgICAgIFwiXG4gICAgICA+XG4gICAgICAgIHt7XG4gICAgICAgICAgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X2FsbF9jb3VudCdcbiAgICAgICAgICAgIHwgc2t5TGliUmVzb3VyY2VzIDogKGRhdGEubGVuZ3RoIHwgc2t5TnVtZXJpYyA6IHsgdHJ1bmNhdGU6IGZhbHNlIH0pXG4gICAgICAgIH19XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWFyY2hUZXh0XCI+XG4gICAgICAgIHt7XG4gICAgICAgICAgJ3NreXV4X2F1dG9jb21wbGV0ZV9zaG93X21hdGNoZXNfY291bnQnXG4gICAgICAgICAgICB8IHNreUxpYlJlc291cmNlc1xuICAgICAgICAgICAgICA6IChzZWFyY2hSZXN1bHRzQ291bnQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgPyBkYXRhLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgOiAoc2VhcmNoUmVzdWx0c0NvdW50IHwgc2t5TnVtZXJpYyA6IHsgdHJ1bmNhdGU6IGZhbHNlIH0pKVxuICAgICAgICB9fVxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9idXR0b24+XG4gICAgPGRpdlxuICAgICAgKm5nSWY9XCJzZWFyY2hUZXh0ICYmIHNlYXJjaFJlc3VsdHMubGVuZ3RoID09PSAwXCJcbiAgICAgIGNsYXNzPVwic2t5LWZvbnQtZGVlbXBoYXNpemVkIHNreS1hdXRvY29tcGxldGUtYWN0aW9ucy1uby1yZXN1bHRzXCJcbiAgICA+XG4gICAgICB7e1xuICAgICAgICBub1Jlc3VsdHNGb3VuZFRleHQgfHxcbiAgICAgICAgICAoJ3NreXV4X2F1dG9jb21wbGV0ZV9ub19yZXN1bHRzJyB8IHNreUxpYlJlc291cmNlcylcbiAgICAgIH19XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzaG93QWRkQnV0dG9uXCJcbiAgICAgIGNsYXNzPVwic2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24gc2t5LWF1dG9jb21wbGV0ZS1hY3Rpb24tYWRkIHNreS1idG4gc2t5LWJ0bi1saW5rXCJcbiAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIFtjbGFzcy5mb2N1c2VkXT1cImlzRWxlbWVudEZvY3VzZWQoYWRkQnV0dG9uRWwpXCJcbiAgICAgIChtb3VzZWRvd24pPVwiYWRkQnV0dG9uQ2xpY2tlZCgpXCJcbiAgICAgICNhZGRCdXR0b25FbFxuICAgID5cbiAgICAgIDxza3ktaWNvbiAqc2t5VGhlbWVJZj1cIidtb2Rlcm4nXCIgaWNvbj1cImFkZFwiIGljb25UeXBlPVwic2t5dXhcIj48L3NreS1pY29uPlxuICAgICAgPHNreS1pY29uICpza3lUaGVtZUlmPVwiJ2RlZmF1bHQnXCIgaWNvbj1cInBsdXMtY2lyY2xlXCI+PC9za3ktaWNvbj5cbiAgICAgIHt7ICdza3l1eF9hdXRvY29tcGxldGVfYWRkJyB8IHNreUxpYlJlc291cmNlcyB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSBsZXQtaXRlbT1cIml0ZW1cIiAjZGVmYXVsdFNlYXJjaFJlc3VsdFRlbXBsYXRlPlxuICB7eyBpdGVtW2Rlc2NyaXB0b3JQcm9wZXJ0eV0gfX1cbjwvbmctdGVtcGxhdGU+XG4iXX0=