@energycap/components 0.39.6-standalone-components.20240125-1433 → 0.39.7-ECAP-23837-combobox-custom-selected-text.20240216-1011

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.
Files changed (140) hide show
  1. package/esm2020/lib/components.module.mjs +20 -73
  2. package/esm2020/lib/controls/banner/banner.component.mjs +5 -5
  3. package/esm2020/lib/controls/button/button.component.mjs +5 -6
  4. package/esm2020/lib/controls/button/copy-button.directive.mjs +3 -4
  5. package/esm2020/lib/controls/button/copy-table-button.directive.mjs +3 -4
  6. package/esm2020/lib/controls/checkbox/checkbox.component.mjs +8 -10
  7. package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +4 -4
  8. package/esm2020/lib/controls/combobox/combobox.component.mjs +14 -13
  9. package/esm2020/lib/controls/dropdown/dropdown.component.mjs +8 -6
  10. package/esm2020/lib/controls/file-upload/file-upload.component.mjs +10 -11
  11. package/esm2020/lib/controls/form-control/form-control.component.mjs +4 -4
  12. package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +4 -5
  13. package/esm2020/lib/controls/form-group/form-group.component.mjs +4 -5
  14. package/esm2020/lib/controls/help-popover/help-popover.component.mjs +6 -7
  15. package/esm2020/lib/controls/item-picker/item-picker.component.mjs +12 -11
  16. package/esm2020/lib/controls/link-button/link-button.component.mjs +3 -3
  17. package/esm2020/lib/controls/menu/menu.component.mjs +8 -9
  18. package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +3 -4
  19. package/esm2020/lib/controls/numericbox/numericbox.component.mjs +6 -6
  20. package/esm2020/lib/controls/popover/popover.component.mjs +5 -5
  21. package/esm2020/lib/controls/radio-button/radio-button.component.mjs +6 -8
  22. package/esm2020/lib/controls/select/select.component.mjs +6 -8
  23. package/esm2020/lib/controls/tabs/tabs.component.mjs +6 -7
  24. package/esm2020/lib/controls/textbox/textbox.component.mjs +10 -8
  25. package/esm2020/lib/display/app-bar/app-bar.component.mjs +6 -6
  26. package/esm2020/lib/display/avatar/avatar.component.mjs +3 -3
  27. package/esm2020/lib/display/confirm/confirm.component.mjs +12 -12
  28. package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +5 -5
  29. package/esm2020/lib/display/dialog/dialog.component.mjs +3 -4
  30. package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +7 -2
  31. package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +7 -7
  32. package/esm2020/lib/display/item-display/item-display.component.mjs +7 -8
  33. package/esm2020/lib/display/json-display/json-display.component.mjs +6 -6
  34. package/esm2020/lib/display/resizable/resizable.component.mjs +3 -3
  35. package/esm2020/lib/display/spinner/spinner.component.mjs +3 -3
  36. package/esm2020/lib/display/splash/splash.component.mjs +3 -3
  37. package/esm2020/lib/display/table/resizable-column.component.mjs +3 -3
  38. package/esm2020/lib/display/table/resizable-table.directive.mjs +3 -4
  39. package/esm2020/lib/display/table/searchable-table.component.mjs +9 -7
  40. package/esm2020/lib/display/table/table-detail-row.component.mjs +3 -3
  41. package/esm2020/lib/display/table/table-locked-column.component.mjs +3 -3
  42. package/esm2020/lib/display/table/table-master-header-row.component.mjs +4 -4
  43. package/esm2020/lib/display/table/table-master-row.component.mjs +6 -6
  44. package/esm2020/lib/display/table/table-pagination.component.mjs +6 -6
  45. package/esm2020/lib/display/table/table-selectable-row.component.mjs +6 -6
  46. package/esm2020/lib/display/table/table.component.mjs +5 -5
  47. package/esm2020/lib/display/tags/tags.component.mjs +5 -6
  48. package/esm2020/lib/display/toast/toast/toast.component.mjs +7 -8
  49. package/esm2020/lib/display/toast/toaster/toaster.component.mjs +4 -4
  50. package/esm2020/lib/display/tooltip/tooltip.component.mjs +5 -5
  51. package/esm2020/lib/display/tooltip-directive/tooltip.directive.mjs +3 -4
  52. package/esm2020/lib/display/tour/tour.component.mjs +6 -6
  53. package/esm2020/lib/display/tree/tree.component.mjs +18 -8
  54. package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +7 -8
  55. package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +3 -4
  56. package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +3 -4
  57. package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +3 -6
  58. package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +4 -13
  59. package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +4 -11
  60. package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +4 -11
  61. package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +4 -11
  62. package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +4 -13
  63. package/esm2020/lib/shared/page/page-title/page-title.component.mjs +5 -5
  64. package/esm2020/lib/shared/page/page-view/page-view.component.mjs +11 -10
  65. package/esm2020/lib/shared/testing/public-mocks.spec.mjs +3 -6
  66. package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +5 -5
  67. package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +5 -6
  68. package/esm2020/public-api.mjs +1 -1
  69. package/fesm2015/energycap-components.mjs +927 -1013
  70. package/fesm2015/energycap-components.mjs.map +1 -1
  71. package/fesm2020/energycap-components.mjs +923 -1010
  72. package/fesm2020/energycap-components.mjs.map +1 -1
  73. package/lib/components.module.d.ts +72 -72
  74. package/lib/controls/banner/banner.component.d.ts +1 -1
  75. package/lib/controls/button/button.component.d.ts +1 -1
  76. package/lib/controls/button/copy-button.directive.d.ts +1 -1
  77. package/lib/controls/button/copy-table-button.directive.d.ts +1 -1
  78. package/lib/controls/checkbox/checkbox.component.d.ts +3 -3
  79. package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +1 -1
  80. package/lib/controls/combobox/combobox.component.d.ts +1 -1
  81. package/lib/controls/dropdown/dropdown.component.d.ts +1 -1
  82. package/lib/controls/file-upload/file-upload.component.d.ts +1 -1
  83. package/lib/controls/form-control/form-control.component.d.ts +1 -1
  84. package/lib/controls/form-control-label/form-control-label.component.d.ts +1 -1
  85. package/lib/controls/form-group/form-group.component.d.ts +1 -1
  86. package/lib/controls/help-popover/help-popover.component.d.ts +1 -1
  87. package/lib/controls/item-picker/item-picker.component.d.ts +1 -1
  88. package/lib/controls/link-button/link-button.component.d.ts +1 -1
  89. package/lib/controls/menu/menu.component.d.ts +3 -1
  90. package/lib/controls/navigation/nav-item-active.directive.d.ts +1 -1
  91. package/lib/controls/numericbox/numericbox.component.d.ts +1 -1
  92. package/lib/controls/popover/popover.component.d.ts +1 -1
  93. package/lib/controls/radio-button/radio-button.component.d.ts +1 -1
  94. package/lib/controls/select/select.component.d.ts +1 -1
  95. package/lib/controls/tabs/tabs.component.d.ts +1 -1
  96. package/lib/controls/textbox/textbox.component.d.ts +1 -1
  97. package/lib/display/app-bar/app-bar.component.d.ts +1 -1
  98. package/lib/display/avatar/avatar.component.d.ts +1 -1
  99. package/lib/display/confirm/confirm.component.d.ts +1 -1
  100. package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +1 -1
  101. package/lib/display/dialog/dialog.component.d.ts +1 -1
  102. package/lib/display/hierarchy/hierarchy-base.d.ts +10 -1
  103. package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +1 -1
  104. package/lib/display/item-display/item-display.component.d.ts +1 -1
  105. package/lib/display/json-display/json-display.component.d.ts +1 -1
  106. package/lib/display/resizable/resizable.component.d.ts +1 -1
  107. package/lib/display/spinner/spinner.component.d.ts +1 -1
  108. package/lib/display/splash/splash.component.d.ts +1 -1
  109. package/lib/display/table/resizable-column.component.d.ts +1 -1
  110. package/lib/display/table/resizable-table.directive.d.ts +1 -1
  111. package/lib/display/table/searchable-table.component.d.ts +1 -1
  112. package/lib/display/table/table-detail-row.component.d.ts +1 -1
  113. package/lib/display/table/table-locked-column.component.d.ts +1 -1
  114. package/lib/display/table/table-master-header-row.component.d.ts +1 -1
  115. package/lib/display/table/table-master-row.component.d.ts +1 -1
  116. package/lib/display/table/table-pagination.component.d.ts +1 -1
  117. package/lib/display/table/table-selectable-row.component.d.ts +1 -1
  118. package/lib/display/table/table.component.d.ts +1 -1
  119. package/lib/display/tags/tags.component.d.ts +1 -1
  120. package/lib/display/toast/toast/toast.component.d.ts +1 -1
  121. package/lib/display/toast/toaster/toaster.component.d.ts +1 -1
  122. package/lib/display/tooltip/tooltip.component.d.ts +1 -1
  123. package/lib/display/tooltip-directive/tooltip.directive.d.ts +1 -1
  124. package/lib/display/tour/tour.component.d.ts +1 -1
  125. package/lib/display/tree/tree.component.d.ts +6 -2
  126. package/lib/display/view-overlay/view-overlay.component.d.ts +1 -1
  127. package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +1 -1
  128. package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +1 -1
  129. package/lib/shared/directives/popup/popup-container.directive.d.ts +1 -1
  130. package/lib/shared/display/pipes/date-display.pipe.d.ts +1 -2
  131. package/lib/shared/display/pipes/highlight-text.pipe.d.ts +1 -2
  132. package/lib/shared/display/pipes/relative-date.pipe.d.ts +1 -2
  133. package/lib/shared/display/pipes/row-count.pipe.d.ts +1 -2
  134. package/lib/shared/display/pipes/time-display.pipe.d.ts +1 -2
  135. package/lib/shared/page/page-title/page-title.component.d.ts +1 -1
  136. package/lib/shared/page/page-view/page-view.component.d.ts +1 -1
  137. package/lib/shared/testing/public-mocks.spec.d.ts +1 -1
  138. package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +1 -1
  139. package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +1 -1
  140. package/package.json +1 -1
@@ -1,19 +1,19 @@
1
1
  import { Component, Input, Output, EventEmitter, ViewChild, HostListener } from '@angular/core';
2
2
  import { UntypedFormControl, Validators } from "@angular/forms";
3
- import { TranslateModule } from "@ngx-translate/core";
4
3
  import { FormControlBase } from '../form-control-base';
5
4
  import { takeUntil, take } from 'rxjs/operators';
6
- import { TextboxComponent } from '../textbox/textbox.component';
7
- import { MenuComponent as MenuComponent_1 } from '../menu/menu.component';
8
5
  import { PopupContainerDirective } from '../../shared/directives/popup/popup-container.directive';
9
- import { ViewOverlayComponent } from '../../display/view-overlay/view-overlay.component';
10
- import { ButtonComponent } from '../button/button.component';
11
- import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common';
12
6
  import * as i0 from "@angular/core";
13
7
  import * as i1 from "../../core/validation-message.service";
14
8
  import * as i2 from "../../shared/form-group.helper";
15
9
  import * as i3 from "@ngx-translate/core";
16
10
  import * as i4 from "../../core/scroll.service";
11
+ import * as i5 from "@angular/common";
12
+ import * as i6 from "../button/button.component";
13
+ import * as i7 from "../textbox/textbox.component";
14
+ import * as i8 from "../../display/view-overlay/view-overlay.component";
15
+ import * as i9 from "../menu/menu.component";
16
+ import * as i10 from "../../shared/directives/popup/popup-container.directive";
17
17
  /**
18
18
  * Select box (select, autocomplete, combobox)
19
19
  *
@@ -608,7 +608,7 @@ export class ComboboxComponent extends FormControlBase {
608
608
  formModelChanged(data) {
609
609
  this.synchronizeDisabledAttributes();
610
610
  if (data) {
611
- this.textboxFormModel.setValue(data.label);
611
+ this.textboxFormModel.setValue(data.selectedLabel || data.label);
612
612
  this.selectedItemIndex = this.findSelectedItemIndex(data);
613
613
  if (this.selectedItemIndex >= 0) {
614
614
  this.selectedItem = this.filteredOptions[this.selectedItemIndex];
@@ -686,7 +686,7 @@ export class ComboboxComponent extends FormControlBase {
686
686
  * @memberof ComboboxComponent
687
687
  */
688
688
  setFormModelValue(item) {
689
- this.textboxFormModel.setValue(item ? item.label : '');
689
+ this.textboxFormModel.setValue(item ? (item.selectedLabel || item.label) : '');
690
690
  this.formModel.setValue(item);
691
691
  this.formModel.markAsDirty();
692
692
  }
@@ -747,8 +747,9 @@ export class ComboboxComponent extends FormControlBase {
747
747
  syncModelValues() {
748
748
  // If there is a formModel value, reset the selected item. If there isn't, make
749
749
  // sure we clear the textbox
750
- if (this.formModel.value && this.formModel.value.label !== this.textboxFormModel.value) {
751
- this.textboxFormModel.setValue(this.formModel.value.label);
750
+ const newLabel = this.formModel.value?.selectedLabel || this.formModel.value?.label;
751
+ if (this.formModel.value && (newLabel !== this.textboxFormModel.value)) {
752
+ this.textboxFormModel.setValue(newLabel);
752
753
  }
753
754
  else if (!this.formModel.value) {
754
755
  this.textboxFormModel.setValue('');
@@ -813,10 +814,10 @@ export class ComboboxComponent extends FormControlBase {
813
814
  }
814
815
  }
815
816
  ComboboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ComboboxComponent, deps: [{ token: i1.ValidationMessageService }, { token: i2.FormGroupHelper }, { token: i3.TranslateService }, { token: i4.ScrollService }], target: i0.ɵɵFactoryTarget.Component });
816
- ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ComboboxComponent, isStandalone: true, selector: "ec-combobox", inputs: { addNew: "addNew", addNewOptions: "addNewOptions", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", preserveIconSpace: "preserveIconSpace", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText", truncateItems: "truncateItems" }, outputs: { addNewClick: "addNewClick", search: "search" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true }, { propertyName: "popup", first: true, predicate: PopupContainerDirective, descendants: true }, { propertyName: "addNewButton", first: true, predicate: ["addNewButton"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\" ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">{{validationErrors}}</span>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\" *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong \r\n class=\"ec-util-truncate\" \r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: PopupContainerDirective, selector: "[ecPopup]", inputs: ["ecPopup", "options"] }, { kind: "component", type: TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: MenuComponent_1, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }] });
817
+ ComboboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: ComboboxComponent, selector: "ec-combobox", inputs: { addNew: "addNew", addNewOptions: "addNewOptions", maxlength: "maxlength", menuPosition: "menuPosition", minlength: "minlength", options: "options", templateType: "templateType", customMenuTemplate: "customMenuTemplate", preserveIconSpace: "preserveIconSpace", popupFixed: "popupFixed", totalRecords: "totalRecords", upperCase: "upperCase", placeholder: "placeholder", loadOnOpenObservable: "loadOnOpenObservable", hideToggleButton: "hideToggleButton", alwaysOpen: "alwaysOpen", menuElementClasses: "menuElementClasses", textboxElementClasses: "textboxElementClasses", hideNoMatches: "hideNoMatches", noMatchesText: "noMatchesText", truncateItems: "truncateItems" }, outputs: { addNewClick: "addNewClick", search: "search" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "textbox", first: true, predicate: ["textbox"], descendants: true }, { propertyName: "popup", first: true, predicate: PopupContainerDirective, descendants: true }, { propertyName: "addNewButton", first: true, predicate: ["addNewButton"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\" ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">{{validationErrors}}</span>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\" *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong \r\n class=\"ec-util-truncate\" \r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i7.TextboxComponent, selector: "ec-textbox", inputs: ["autocomplete", "type", "placeholder", "maxlength", "minlength", "rows", "selectOnAutofocus", "upperCase"] }, { kind: "component", type: i8.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i9.MenuComponent, selector: "ec-menu", inputs: ["id", "items", "selected", "parent", "templateType", "customMenuTemplate", "title", "showNoItems", "noDataText", "enableKeyNav", "highlightedItem", "maintainSelectedItem", "truncateItems", "preserveIconSpace", "dropdownToggleButton"], outputs: ["selectedChanged", "menuClosed"] }, { kind: "directive", type: i10.PopupContainerDirective, selector: "[ecPopup]", inputs: ["ecPopup", "options"] }, { kind: "pipe", type: i3.TranslatePipe, name: "translate" }] });
817
818
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ComboboxComponent, decorators: [{
818
819
  type: Component,
819
- args: [{ selector: 'ec-combobox', standalone: true, imports: [NgClass, NgIf, NgTemplateOutlet, PopupContainerDirective, TextboxComponent, ButtonComponent, ViewOverlayComponent, TranslateModule, MenuComponent_1], template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\" ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">{{validationErrors}}</span>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\" *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong \r\n class=\"ec-util-truncate\" \r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"] }]
820
+ args: [{ selector: 'ec-combobox', template: "<div class=\"control control-label-{{labelPosition}}\"\r\n [ngClass]=\"{'open': menuStatus === 'visible',\r\n 'invalid': formModel.touched && formModel.invalid,\r\n 'has-icon': ((templateType === 'iconAndLabel' || templateType === 'iconLabelCaption') && formModel.value && formModel.value.icon && formModel.value.label === textboxFormModel.value),\r\n 'is-readonly': readonly,\r\n 'is-disabled': formModel.disabled,\r\n 'is-always-open': alwaysOpen}\">\r\n\r\n <label *ngIf=\"label\" ngPreserveWhitespaces>\r\n <span>{{label | translate}}</span>\r\n <span *ngIf=\"validationErrors.length > 0 && formModel.touched && formModel.invalid\">{{validationErrors}}</span>\r\n </label>\r\n\r\n <ng-container *ngIf=\"alwaysOpen; else popupTarget\">\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n\r\n <ng-container *ngIf=\"filteredOptions.length > 0 || textboxFormModel.value\">\r\n <ng-container *ngTemplateOutlet=\"dropdownmenu\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<ng-template #popupTarget>\r\n <div class=\"textbox-group control-input\" [ngClass]=\"textboxElementClasses\" *ecPopup=\"dropdownmenu\">\r\n <ng-container *ngTemplateOutlet=\"textbox\"></ng-container>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #textbox>\r\n <i class=\"ec-icon {{formModel.value?.icon}}\"></i>\r\n\r\n <ec-textbox class=\"textbox-group-input mb-0\"\r\n #textbox\r\n [id]=\"id\"\r\n [autofocus]=\"autofocus\"\r\n [formModel]=\"textboxFormModel\"\r\n [maxlength]=\"maxlength\"\r\n [minlength]=\"minlength\"\r\n [placeholder]=\"effectivePlaceholder\"\r\n [required]=\"required\"\r\n [tabindex]=\"tabindex\"\r\n [readonly]=\"readonly\"\r\n (input)=\"textboxValueChanged($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n (focusout)=\"onBlur()\"\r\n [upperCase]=\"upperCase\"\r\n [pending]=\"pending && alwaysOpen\"\r\n [autocomplete]=\"'off'\"></ec-textbox>\r\n\r\n <ec-button class=\"textbox-group-btn-right\"\r\n *ngIf=\"!hideToggleButton\"\r\n [id]=\"id + '_button'\"\r\n [disabled]=\"formModel.disabled\"\r\n icon=\"icon-caret-down\"\r\n [tabindex]=\"-1\"\r\n type=\"secondary\"\r\n (click)=\"toggleMenu($event)\"\r\n (keydown)=\"keyNavigate($event)\"\r\n [class.active]=\"menuStatus === 'visible'\"></ec-button>\r\n</ng-template>\r\n\r\n<ng-template #dropdownmenu>\r\n <div class=\"popup\"\r\n ecOverlay\r\n [status]=\"pending && !alwaysOpen ? 'pending' : 'hasData'\">\r\n\r\n <button class=\"add-new {{addNewOptions?.classList}}\"\r\n id=\"{{id}}_addNew\"\r\n #addNewButton\r\n [class.is-selected]=\"addNewSelected\"\r\n *ngIf=\"addNew\"\r\n [hidden]=\"foundMatch || (addNew === 'dynamic' && (!textboxFormModel.value || (formModel.value && textboxFormModel.value === formModel.value.label)))\"\r\n (click)=\"onAddNew($event)\">\r\n <span class=\"add-new-label ec-util-truncate\">\r\n <span *ngIf=\"addNew === 'static' || addNew === true\"\r\n translate>{{addNewOptions?.label}}\r\n </span>\r\n <span *ngIf=\"addNew === 'dynamic'\">{{'Add' | translate}} <strong \r\n class=\"ec-util-truncate\" \r\n [ngClass]=\"{'text-uppercase': upperCase}\">{{textboxFormModel.value}}</strong>\r\n </span>\r\n </span>\r\n <i class=\"ec-icon {{addNewOptions?.icon}}\"></i>\r\n </button>\r\n\r\n <ec-menu id=\"{{id}}_menu\"\r\n [class.border-top-0]=\"!filteredOptions.length && hideNoMatches\"\r\n [ngClass]=\"menuElementClasses\"\r\n [templateType]=\"templateType\"\r\n [customMenuTemplate]=\"customMenuTemplate\"\r\n [showNoItems]=\"!hideNoMatches\"\r\n [noDataText]=\"noMatchesText\"\r\n [items]=\"filteredOptions\"\r\n [selected]=\"selectedItem\"\r\n (selectedChanged)=\"selectedChanged($event)\"\r\n [preserveIconSpace]=\"preserveIconSpace\"\r\n [truncateItems]=\"truncateItems\"></ec-menu>\r\n\r\n <footer *ngIf=\"totalRecords && totalRecords > filteredOptions.length && filteredOptions.length > 0\">\r\n <span>{{filteredOptionCount}} {{'of' | translate}} {{totalRecords}}</span>\r\n </footer>\r\n </div>\r\n</ng-template>\r\n", styles: [":host{color:var(--ec-form-control-color);font-size:var(--ec-form-control-font-size);display:block;margin-bottom:1rem;width:100%}:host :host-context(.form-condensed){margin-bottom:.5rem}:host .control{width:100%;display:flex;flex-direction:column}:host .control.control-label-bottom{flex-direction:column-reverse}:host .control.control-label-left{flex-direction:row}:host .control.control-label-left label{margin-right:.25rem}:host .control.control-label-right{flex-direction:row-reverse}:host .control.control-label-right label{margin-left:.25rem}:host .control.control-label-left,:host .control.control-label-right{align-items:center}:host .control.control-label-left label,:host .control.control-label-right label{flex:1 1;margin-top:0;margin-bottom:0}:host .control.control-label-left .control-input,:host .control.control-label-right .control-input{flex:2 2}:host .control.is-readonly input,:host .control.is-readonly select,:host .control.is-readonly textarea{border-color:var(--ec-form-control-border-color-readonly);background-color:var(--ec-form-control-background-color-readonly);background-clip:border-box;background-image:none;color:var(--ec-form-control-color-readonly);opacity:1;-webkit-user-select:none;user-select:none;pointer-events:none;overflow:hidden;white-space:nowrap}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host .control.invalid .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host .control.invalid:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}:host .textbox-group{display:flex;position:relative}:host textarea:focus,:host input:focus,:host select:focus{outline:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid{background-color:var(--ec-form-control-background-color-invalid);border-color:var(--ec-form-control-border-color-invalid);background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem;background-image:none}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid:focus,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid:focus{border-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-invalid,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-invalid{display:inline-flex;position:absolute;left:.5rem;top:.5rem;z-index:1}:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-invalid~.icon-required,:host(.invalid) .control .textbox-group-input ::ng-deep .control input.ng-valid~.icon-required{display:none}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button{background-color:var(--ec-form-control-background-color-invalid)}:host(.invalid) .control:not(.open) .textbox-group-btn-right ::ng-deep button:not(:focus){border-color:var(--ec-form-control-border-color-invalid)}.control{position:relative}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched{background-image:none;padding-left:.5rem}.control ec-textbox ::ng-deep input.ng-invalid.ng-touched:not(.is-empty)~.units-left{left:0}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty{background-image:none;background-repeat:no-repeat;background-position:.5rem center;background-size:1rem,1rem;padding-left:1.75rem}.control ec-textbox ::ng-deep input:required:not(:disabled).is-empty:focus{border-color:var(--ec-form-control-border-color-focus);box-shadow:var(--ec-form-control-box-shadow-focus);position:relative;z-index:1}.control .textbox-group .ec-icon{display:none;position:absolute;top:.5rem;left:.5rem;z-index:2}.control.has-icon:not(.invalid) .ec-icon{display:inline-flex}.control.has-icon:not(.invalid) ec-textbox ::ng-deep input{padding-left:1.75rem}.control.is-disabled:not(.is-readonly) .ec-icon{filter:grayscale(100%);opacity:var(--ec-form-control-opacity-disabled)}.control.is-readonly ec-textbox ::ng-deep input{border-right-width:1px;border-top-right-radius:var(--ec-border-radius);border-bottom-right-radius:var(--ec-border-radius)}.control.is-readonly ec-button{display:none}.control.is-always-open{height:100%}.control.is-always-open label,.control.is-always-open .textbox-group{margin-left:1rem;margin-right:1rem}.control.is-always-open .textbox-group{margin-bottom:1rem}.control.is-always-open .popup{background-color:transparent;box-shadow:none;flex:1 1;border:0;margin:0;z-index:0;min-height:0}.control.is-always-open ec-menu{border-top:1px solid var(--ec-border-color)}.control.is-always-open ec-menu ::ng-deep ul{max-height:none}label{color:var(--ec-form-control-label-color, var(--ec-color-secondary-dark));display:block;font-size:var(--ec-font-size-label);line-height:1;margin:calc(var(--ec-font-size-label) / 2) 0}.popup{background-color:var(--ec-background-color);border-radius:var(--ec-border-radius-card);box-shadow:var(--ec-box-shadow-overlay);margin-top:.25rem;overflow:hidden;z-index:var(--ec-z-index-popup)}ec-menu{display:block}ec-menu:not(:first-child){border-top:1px solid var(--ec-border-color)}ec-menu ::ng-deep ul{max-height:30vh}ec-menu ::ng-deep ul li{white-space:nowrap}.add-new{height:2rem;line-height:1.25rem;padding:.25rem .5rem;display:flex;align-items:center;background-color:var(--ec-background-color);cursor:pointer;border:0;width:100%}.add-new:hover,.add-new.is-selected{background-color:var(--ec-background-color-hover)}.add-new:focus{outline:none;background-color:var(--ec-background-color-hover)}.add-new-label{flex:1 1;margin-right:.5rem;text-align:left}.add-new .ec-icon{flex:0 0 auto}footer{padding:.5rem;border-top:1px solid var(--ec-border-color);color:var(--ec-color-hint-dark);font-size:var(--ec-font-size-label);text-align:right;line-height:1}ec-button{--ec-button-border-color-secondary: var(--ec-form-control-border-color);--ec-button-border-color-secondary-focus: var(--ec-form-control-border-color);--ec-button-color-icon-secondary: var(--ec-color-icon)}.open:not(.is-always-open) .textbox-group ec-textbox{--ec-form-control-box-shadow-focus: none;--ec-form-control-border-color-focus: var(--ec-form-control-border-color)}.open:not(.is-always-open) .textbox-group ec-button{--ec-button-box-shadow-focus-secondary: none;--ec-button-background-color-secondary: var(--ec-background-color-selected)}\n"] }]
820
821
  }], ctorParameters: function () { return [{ type: i1.ValidationMessageService }, { type: i2.FormGroupHelper }, { type: i3.TranslateService }, { type: i4.ScrollService }]; }, propDecorators: { onResize: [{
821
822
  type: HostListener,
822
823
  args: ['window:resize']
@@ -876,4 +877,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
876
877
  type: ViewChild,
877
878
  args: ['addNewButton']
878
879
  }] } });
879
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBQW9CLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBR2hFLE9BQU8sRUFBc0QsYUFBYSxJQUFJLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlILE9BQU8sRUFBRSx1QkFBdUIsRUFBZSxNQUFNLHlEQUF5RCxDQUFDO0FBRS9HLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7Ozs7QUF3QmxFOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBUUgsTUFBTSxPQUFP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LEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQzt3TUFVbEksUUFBUTtzQkFBdEMsWUFBWTt1QkFBQyxlQUFlO2dCQU9iLE1BQU07c0JBQXJCLEtBQUs7Z0JBY1UsYUFBYTtzQkFBNUIsS0FBSztnQkFVVSxTQUFTO3NCQUF4QixLQUFLO2dCQVFVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBUVUsU0FBUztzQkFBeEIsS0FBSztnQkFRVSxPQUFPO3NCQUF0QixLQUFLO2dCQVFVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBVWEsa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUtPLGlCQUFpQjtzQkFBaEMsS0FBSztnQkFPVSxVQUFVO3NCQUF6QixLQUFLO2dCQU1VLFlBQVk7c0JBQTNCLEtBQUs7Z0JBS1UsU0FBUztzQkFBeEIsS0FBSztnQkFNVSxXQUFXO3NCQUExQixLQUFLO2dCQUdVLG9CQUFvQjtzQkFBbkMsS0FBSztnQkFHVSxnQkFBZ0I7c0JBQS9CLEtBQUs7Z0JBTVUsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBS1UscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUdVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBS1csYUFBYTtzQkFBNUIsS0FBSztnQkFLUyxhQUFhO3NCQUE1QixLQUFLO2dCQVNXLFdBQVc7c0JBQTNCLE1BQU07Z0JBTVUsTUFBTTtzQkFBdEIsTUFBTTtnQkFHc0IsT0FBTztzQkFBbkMsU0FBUzt1QkFBQyxTQUFTO2dCQUt3QixLQUFLO3NCQUFoRCxTQUFTO3VCQUFDLHVCQUF1QjtnQkFNQyxZQUFZO3NCQUE5QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UsIFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Db250cm9sQmFzZSB9IGZyb20gJy4uL2Zvcm0tY29udHJvbC1iYXNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFRleHRib3hDb21wb25lbnQgfSBmcm9tICcuLi90ZXh0Ym94L3RleHRib3guY29tcG9uZW50JztcclxuaW1wb3J0IHsgVmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS92YWxpZGF0aW9uLW1lc3NhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cEhlbHBlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9mb3JtLWdyb3VwLmhlbHBlcic7XHJcbmltcG9ydCB7IE1lbnVJdGVtLCBNZW51VGVtcGxhdGVUeXBlLCBNZW51SG9zdEVsZW1lbnRDbGFzc2VzLCBNZW51Q29tcG9uZW50IGFzIE1lbnVDb21wb25lbnRfMSB9IGZyb20gJy4uL21lbnUvbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSwgUG9wdXBTdGF0dXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlyZWN0aXZlcy9wb3B1cC9wb3B1cC1jb250YWluZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWaWV3T3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2Rpc3BsYXkvdmlldy1vdmVybGF5L3ZpZXctb3ZlcmxheS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nQ2xhc3MsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuLyoqXHJcbiAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSBpbnB1dFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ29tYm9ib3hNZW51UG9zaXRpb24gPSBcInRvcF9yaWdodFwiIHwgXCJ0b3BfbGVmdFwiIHwgXCJib3R0b21fbGVmdFwiIHwgXCJib3R0b21fcmlnaHRcIjtcclxuXHJcblxyXG4vKipcclxuICogVGhlIHR5cGUgb2YgYWRkIG5ldyBpbXBsZW1lbnRhdGlvbi4gU3RhdGljIGRpc3BsYXlzIGEgc2ltcGxlIHN0YXRpYyBidXR0b24gd2hpbGUgZHluYW1pYyB1cGRhdGVzXHJcbiAqIHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHdpdGggdmFsdWUgb2YgdGhlIHRleHRib3hcclxuICovXHJcbnR5cGUgQWRkTmV3VHlwZSA9IFwiZHluYW1pY1wiIHwgXCJzdGF0aWNcIiB8IGJvb2xlYW47XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIFwiQWRkIG5ld1wiIGJ1dHRvbiB3aGVuIGluIHN0YXRpYyBtb2RlXHJcbiAqL1xyXG50eXBlIEFkZE5ld09wdGlvbnMgPSB7XHJcblx0bGFiZWw/OiBzdHJpbmc7IFx0LyoqIEEgY3VzdG9tIGxhYmVsIHRvIGRpc3BsYXkgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgXCJBZGQgbmV3Li4uXCIgKi9cclxuXHRjbGFzc0xpc3Q/OiBzdHJpbmc7IFx0LyoqIEEgc3RyaW5nIG9mIHNwYWNlLXNlcGFyYXRlZCB1dGlsaXR5IGNsYXNzZXMgd2UnbGwgYXBwbHkgdG8gdGhlIGxhYmVsICovXHJcblx0aWNvbj86IHN0cmluZzsgXHQvKiogQSBjdXN0b20gaWNvbiB0byBkaXNwbGF5IGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0ICdpY29uLWFkZCcgKi9cclxufTtcclxuXHJcblxyXG4vKipcclxuICogU2VsZWN0IGJveCAoc2VsZWN0LCBhdXRvY29tcGxldGUsIGNvbWJvYm94KVxyXG4gKlxyXG4gKiBOT1RFOiBNaW4vbWF4IGxlbmd0aCB2YWxpZGF0aW9uIGlzIGltcGxlbWVudGVkIG9uIHRoZSBpbnRlcm5hbCBlYy10ZXh0Ym94LlxyXG4gKiBWYWx1ZXMgcGFzc2VkIGluIHZpYSBpbnB1dCBwcm9wZXJ0aWVzIChAc2VlIG1heGxlbmd0aCAsIEBzZWUgbWlubGVuZ3RoIClcclxuICogYXJlIHVzZWQgdG8gY3JlYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3guICBXaGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZVxyXG4gKiB0ZXh0Ym94IGZhaWxzLCB0aGUgdmFsaWRhdGlvbiBlcnJvcihzKSBnZXQgcGFzc2VkIHVwIHRvIHRoZSB7QHNlZSBmb3JtTW9kZWwgfS5cclxuICogV2hlbiBzZXR0aW5nIHVwIHRoaXMgY29tcG9uZW50J3Mge0BzZWUgRm9ybUNvbnRyb2wgfSwgeW91IGRvIE5PVCBuZWVkIHRvIHNldCB0aGVcclxuICogVmFsaWRhdG9ycy5taW5MZW5ndGggb3IgVmFsaWRhdG9ycy5tYXhMZW5ndGggdmFsaWRhdG9ycy5cclxuICpcclxuICogUmVxdWlyZWQgaXMgYWxzbyBwYXNzZWQgdmlhIGlucHV0IHByb3BlcnR5LCBidXQgeW91IFNIT1VMRCBhbHNvIHNldCB1cCB0aGVcclxuICogVmFsaWRhdG9ycy5yZXF1aXJlZCB2YWxpZGF0b3Igb24gdGhpcyBjb21wb25lbnQncyBGb3JtQ29udHJvbC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2VjLWNvbWJvYm94JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnY29tYm9ib3guY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnXSxcclxuICAgIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgICBpbXBvcnRzOiBbTmdDbGFzcywgTmdJZiwgTmdUZW1wbGF0ZU91dGxldCwgUG9wdXBDb250YWluZXJEaXJlY3RpdmUsIFRleHRib3hDb21wb25lbnQsIEJ1dHRvbkNvbXBvbmVudCwgVmlld092ZXJsYXlDb21wb25lbnQsIFRyYW5zbGF0ZU1vZHVsZSwgTWVudUNvbXBvbmVudF8xXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsb3NlIHRoZSBwb3B1cCBtZW51IG9uIHJlc2l6ZSBzbyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uaW5nIGNhbiBiZSByZWNhbGN1bGF0ZWRcclxuXHQgKiBjb3JyZWN0bHkuIENhbm5vdCBiZSBwbGFjZWQgb24gdGhlIHBvcHVwRGlyZWN0aXZlIGJlY2F1c2Ugb2YgYSBidWcgd2hlcmVcclxuXHQgKiBIb3N0TGlzdGVuZXJzIGZvciBnbG9iYWwgZXZlbnRzIGRvbid0IGZpcmVcclxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0MTkxXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpIG9uUmVzaXplKCkge1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgYWRkIG5ldyBidXR0b24gaW4gdGhlIHBvcHVwXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ldz86IEFkZE5ld1R5cGU7XHJcblxyXG5cdC8qKiBDb25maWd1cmUgdGhlIGFkZE5ldyBidXR0b24gbGFiZWwgJiBpY29uIHdoZW4gYWRkTmV3IGlzIHRydWUgYW5kIHNldCB0byBzdGF0aWNcclxuXHQgKiBEZWZhdWx0IGlzIHNldCB0bzogeyBsYWJlbDogJ0FsbCBuZXcuLi4nLCBpY29uOiAnaWNvbi1hZGQnfVxyXG5cdCAqIEBzZWUgQWRkTmV3T3B0aW9uc1xyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogPGVjLWNvbWJvYm94IFthZGROZXddPVwidHJ1ZVwiIFxyXG5cdCAqIFx0ICAgICAgICAgW2FkZE5ld09wdGlvbnNdPVwieyBcclxuKiBcdFx0XHRcdFx0XHRsYWJlbDogJ0hlbHAgbWUgY2hvb3NlLi4uJyxcclxuKiBcdFx0XHRcdFx0XHRpY29uOiAnaWNvbi1zZWFyY2gnLFxyXG4qIFx0XHRcdFx0XHRcdGNsYXNzTGlzdDogJ3RleHQtYm9keS0yIHRleHQtbGluaycgfVwiPlxyXG5cdCAqIDwvZWMtY29tYm9ib3g+XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ld09wdGlvbnM/OiBBZGROZXdPcHRpb25zID0geyBcclxuXHRcdGxhYmVsOiAnQWRkIG5ldy4uLicsXHJcblx0XHRpY29uOiAnaWNvbi1hZGQnLFxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIFRleHRib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWF4bGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIHRleHQgYm94XHJcblx0ICogQGRlZmF1bHQgJ2JvdHRvbV9yaWdodCdcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWVudVBvc2l0aW9uPzogQ29tYm9ib3hNZW51UG9zaXRpb24gPSAnYm90dG9tX3JpZ2h0JztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgVGV4dGJveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtaW5sZW5ndGg/OiBudW1iZXI7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJdGVtcyB0byBzaG93IGluIGNvbWJvYm94IG1lbnVcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BsYXkgdGVtcGxhdGUgZm9yIG1lbnUgaXRlbXNcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0ZW1wbGF0ZVR5cGU6IE1lbnVUZW1wbGF0ZVR5cGUgPSAnbGFiZWwnO1xyXG5cclxuXHQvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcblx0ICogaW5wdXQgdmFyaWFibGUgY2FsbGVkIFwiaXRlbVwiIGxpa2Ugc286IDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOYW1lIGxldC1pdGVtPixcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gdHJ1ZSwgdGhlIG1lbnUgaXRlbXMgd2lsbCBwcmVzZXJ2ZSB0aGUgaWNvbiBzcGFjZSB3aGVuIHRoZXJlIGlzIG5vIGljb25cclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gdGhlIG1lbnUgYXMgZml4ZWQsIGlkZWFsIHdoZW4gY29tYm9ib3hlcyBhcmUgaW5zaWRlIGRpYWxvZ3NcclxuXHQgKiBEZWZhdWx0aW5nIHRvIHRydWUgc28gYWxsIG1lbnVzIHdpbGwgYmUgYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZVxyXG5cdCAqIHRleHRib3ggKyBidXR0b24sIGJ1dCBjYW4gZ3JvdyB3aWRlciBpZiB0aGUgaW5uZXIgZWxlbWVudHMgbmVlZCBpdFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwb3B1cEZpeGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBmcm9tIHRoZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRvdGFsUmVjb3Jkcz86IG51bWJlcjtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgc2V0IHRvIHRydWUsIHdlIHdpbGwgdXBwZXJDYXNlIHRoZSB0ZXh0IGJveCBhbmQgYXBwbHkgdGhlIGNsYXNzIG9uIHRoZSBhZGQgYm94XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHVwcGVyQ2FzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqVGhlIHBsYWNlaG9sZGVyIHRvIHNob3cgaW4gdGhlIGNvbWJvYm94LiBMZWF2ZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBiZWhhdmlvciBkZXRlcm1pbmVkXHJcblx0ICogYnkgd2hldGhlciBBZGQgTmV3IGlzIGVuYWJsZWRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogT2JzZXJ2YWJsZSB0byBzdWJzY3JpYmUgdG8gd2hlbiB0aGUgY29tYm9ib3ggbWVudSBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovXHJcblx0QElucHV0KCkgcHVibGljIGxvYWRPbk9wZW5PYnNlcnZhYmxlPzogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuXHJcblx0LyoqIERvIG5vdCBkaXNwbGF5IHRoZSB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlVG9nZ2xlQnV0dG9uID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsd2F5cyBzaG93IHRoZSBtZW51IHdoZW4gdGhlIGZvcm1Nb2RlbCBoYXMgYSB2YWx1ZS4gU2V0c1xyXG5cdCAqIGhpZGVUb2dnbGVCdXR0b24gdG8gdHJ1ZSBhbmQgbWVudVN0YXR1cyB0byB2aXNpYmxlIGFzIHdlbGwuXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFsd2F5c09wZW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGVjLW1lbnUgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51RWxlbWVudENsYXNzZXM6IE1lbnVIb3N0RWxlbWVudENsYXNzZXMgfCBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIC50ZXh0Ym94LWdyb3VwIGVsZW1lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGV4dGJveEVsZW1lbnRDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKiogSGlkZSAnTm8gbWF0Y2hlcycgbWVzc2FnZSB3aGVuIHRydWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgaGlkZU5vTWF0Y2hlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuICAgKiBUZXh0IHRvIHNob3cgd2hlbiB0aGUgbWVudSBpcyBlbXB0eS4gXCJObyBtYXRjaGVzXCIgaXMgdGhlIGRlZmF1bHQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG5vTWF0Y2hlc1RleHQ6IHN0cmluZyA9ICdOb01hdGNoZXNfU0MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBUcnVuY2F0ZSBtZW51IGl0ZW1zIHdoZW4gdHJ1ZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0cnVuY2F0ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlIGFkZCBuZXcgYnV0dG9uIHdhcyBjbGlja2VkXHJcblx0ICogQHRvZG8gZGlzY3VzcyBpZiB3ZSBuZWVkIHRvIHNlbmQgYWxvbmcgdGhlIHZhbHVlIG9yIHNob3VsZFxyXG5cdCAqIHRoZSBwYXJlbnQgZ2V0IGl0IGZyb20gdGhlIGZvcm1Nb2RlbFxyXG5cdCAqIChsd2YgMjAxNy4wNy4xMyk6IEkgdGhpbmsgd2UgbWlnaHQgYXMgd2VsbCBzZW5kIHRoZSB2YWx1ZSBhbG9uZyBhbmRcclxuXHQgKiBsZWF2ZSBpdCB1cCB0byB0aGUgcGFyZW50IHRvIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0LlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBwdWJsaWMgYWRkTmV3Q2xpY2s6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBOb3RpZnkgcGFyZW50IHdoZW4gdGV4dCB0eXBlZCBpbnRvIHRleHRib3hcclxuXHQgKi9cclxuXHRAT3V0cHV0KCkgcHVibGljIHNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcblxyXG5cdEBWaWV3Q2hpbGQoJ3RleHRib3gnKSBwdWJsaWMgdGV4dGJveCE6IFRleHRib3hDb21wb25lbnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjY2VzcyB0byB0aGUgbWVudSdzIGNvbXBvbmVudCB2aWEgdGhlICB7QGxpbmsgUG9wdXBDb250YWluZXJEaXJlY3RpdmV9XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSkgcHJpdmF0ZSBwb3B1cD86IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRoZSBhZGQtbmV3IGJ1dHRvbiBlbGVtZW50XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnYWRkTmV3QnV0dG9uJykgcHJpdmF0ZSBhZGROZXdCdXR0b24hOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmlsdGVyZWQgSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3MgaWYgdGhlIG1lbnUgaXMgb3BlbiBvciBoaWRkZW5cclxuXHQgKi9cclxuXHRwdWJsaWMgbWVudVN0YXR1czogUG9wdXBTdGF0dXMgPSAnaGlkZGVuJztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFBsYWNlaG9sZGVyIHRvIGFzc2lnbiB0byB0ZXh0Ym94XHJcblx0ICovXHJcblx0cHVibGljIGVmZmVjdGl2ZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5LXNlbGVjdGVkIG1lbnUgaXRlbVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3RlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtQ29udHJvbCBmb3IgdGhlIHRleHRib3hcclxuXHQgKi9cclxuXHRwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3Mgd2hldGhlciB0aGUgYWRkIG5ldyBidXR0b24gaXMgc2VsZWN0ZWRcclxuXHQgKi9cclxuXHRwdWJsaWMgYWRkTmV3U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyB3aGV0aGVyIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsIHZhbHVlIG1hdGNoZXMgYW4gaXRlbSBpbiB0aGUgZmlsdGVyZWRPcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIGZvdW5kTWF0Y2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogTnVtYmVyIG9mIGZpbHRlcmVkIG9wdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyLiAgRXhjbHVkZXMgaGVhZGluZ3MuXHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgb3B0aW9uc1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0ZWRJdGVtSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3IgJ0Nob29zZSBvciBBZGQuLi4nICovXHJcblx0cHJpdmF0ZSBjaG9vc2VPckFkZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yICdDaG9vc2UnICovXHJcblx0cHJpdmF0ZSBjaG9vc2VQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cdHByaXZhdGUgaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgZm9ybUdyb3VwSGVscGVyOiBGb3JtR3JvdXBIZWxwZXIsXHJcblx0XHRwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2VcclxuXHQpIHtcclxuXHRcdHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBvbkNoYW5nZXMgbGlmZWN5Y2xlIGV2ZW50XHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG5cclxuXHRcdC8vIHdoZW4gb3B0aW9ucyBjaGFuZ2VzXHJcblx0XHRpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcblx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIHBvc2l0aW9uXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cC51cGRhdGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSB2YWxpZGF0b3JzIG9uIHRoZSB0ZXh0Ym94XHJcblx0XHRpZiAoY2hhbmdlcy5yZXF1aXJlZCB8fCBjaGFuZ2VzLm1pbmxlbmd0aCB8fCBjaGFuZ2VzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLnNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHBsYWNlaG9sZGVyIHRleHQgd2hlbiAnQWRkIE5ldycgaXMgY29uZGl0aW9uYWwuXHJcblx0XHQvLyBuZ09uQ2hhbmdlcygpIGtpY2tzIG9mZiBiZWZvcmUgbmdPbkluaXQsIHNvIGluIG9yZGVyXHJcblx0XHQvLyB0byBub3Qgb3ZlcndyaXRlIGEgdXNlci1wcm92aWRlZCBwbGFjZWhvbGRlciwgZG8gbm90XHJcblx0XHQvLyB1cGRhdGUgcGxhY2Vob2xkZXIgb24gZmlyc3QgY2hhbmdlIChuZ09uSW5pdCB3aWxsIHRha2UgY2FyZSBvZiBpdCkuXHJcblx0XHRpZiAoKGNoYW5nZXMuYWRkTmV3ICYmICFjaGFuZ2VzLmFkZE5ldy5pc0ZpcnN0Q2hhbmdlKCkpIHx8IGNoYW5nZXMucGxhY2Vob2xkZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlclRleHQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIG9uSW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuYWx3YXlzT3Blbikge1xyXG5cdFx0XHR0aGlzLmhpZGVUb2dnbGVCdXR0b24gPSB0cnVlO1xyXG5cdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSAndmlzaWJsZSc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IHRyYW5zbGF0ZWQgcGxhY2Vob2xkZXIgdGV4dFxyXG5cdFx0dGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlIG9yIGFkZCcpfS4uLmA7XHJcblx0XHR0aGlzLmNob29zZVBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlJyl9YDtcclxuXHJcblx0XHR0aGlzLmZvcm1Nb2RlbENoYW5nZWQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0dGhpcy5zZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpO1xyXG5cclxuXHRcdC8vIEVycm9ycyBmb3IgdGhpcyBjb21wb25lbnQgYXJlIGRpc3BsYXllZCB2aWEgdGhlIHZhbGlkYXRpb25FcnJvcnMgcHJvcGVydHksIHdoaWNoIGlzXHJcblx0XHQvLyBwb3B1bGF0ZWQgd2hlbiB0cmFuc2xhdGVWYWxpZGF0aW9uTWVzc2FnZXMgaXMgcnVuLlxyXG5cdFx0Ly8gV2hlbiB0aGUgaW50ZXJuYWwgVGV4dGJveENvbXBvbmVudCBoYXMgdmFsaWRhdGlvbiBlcnJvcnMsIHdlIHNldCB0aGVtIG9uIHRoZVxyXG5cdFx0Ly8gZm9ybU1vZGVsIGFzIHdlbGwuICBUaGlzIHVwZGF0ZXMgdGhlIHZhbGlkaXR5IG9mIG91ciBDb21ib2JveENvbXBvbmVudCBjb250cm9sLFxyXG5cdFx0Ly8gYnV0IGRvZXMgbm90IHRyaWdnZXIgdHJhbnNsYXRpb24uICBTdWJzY3JpYmUgdG8gc3RhdHVzQ2hhbmdlcyBoZXJlIHNvIGNvbXBvbmVudFxyXG5cdFx0Ly8gdmFsaWRhdGlvbiBlcnJvcnMgd2lsbCBhcHBlYXIgYWxvbmcgd2l0aCB0aGUgQ29tYm9ib3hDb21wb25lbnQncyBsYWJlbC5cclxuXHRcdHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuZm9ybU1vZGVsQ2hhbmdlZChkYXRhKSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YSkpO1xyXG5cclxuXHRcdC8vIGRlZmF1bHQgcGxhY2Vob2xkZXJcclxuXHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgYWZ0ZXJWaWV3SW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFsbG93IG92ZXJmbG93IG91dCBvZiB0aGUgc2Nyb2xsUGFyZW50XHJcblx0XHQvLyBwcmV2ZW50cyBtZW51IGZyb20gb2JzY3VyaW5nIHRoZSBjb21ib2JveFxyXG5cdFx0bGV0IHBvcHBlck9wdGlvbnM6IFBvcHBlci5Qb3BwZXJPcHRpb25zID0ge1xyXG5cdFx0XHRtb2RpZmllcnM6IHtcclxuXHRcdFx0XHRwcmV2ZW50T3ZlcmZsb3c6IHtcclxuXHRcdFx0XHRcdGJvdW5kYXJpZXNFbGVtZW50OiAndmlld3BvcnQnXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGNvbnZlcnQgdGhlIENvbWJvYm94TWVudVBvc2l0aW9uIGludG8gYSBQb3BwZXJQbGFjZW1lbnRcclxuXHRcdHN3aXRjaCAodGhpcy5tZW51UG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAoXCJ0b3BfbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3Atc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcInRvcF9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3AtZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoXCJib3R0b21fbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcImJvdHRvbV9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVudVBvc2l0aW9uIGZvciBDb21ib2JveENvbXBvbmVudC5gKVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNjcm9sbCB0aGUgbWVudSB0byB0aGUgc2VsZWN0ZWQgaXRlbSBvbmNlIHRoZSBwb3B1cCBtZW51IGlzIHJlYWR5XHJcblx0XHRwb3BwZXJPcHRpb25zLm9uQ3JlYXRlID0gKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwRml4ZWQpIHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwIS5maXhQb3NpdGlvbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMucG9wdXBGaXhlZCkge1xyXG5cdFx0XHRwb3BwZXJPcHRpb25zLm9uVXBkYXRlID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAhLmZpeFBvc2l0aW9uKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBvcHVwLnBvcHBlck9wdGlvbnMgPSBwb3BwZXJPcHRpb25zO1xyXG5cclxuXHRcdHRoaXMucG9wdXAucG9wcGVyU3RhdHVzQ2hhbmdlLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKChldmVudDogJ3Zpc2libGUnIHwgJ2hpZGRlbicpID0+IHtcclxuXHRcdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSBldmVudDtcclxuXHJcblx0XHRcdFx0Ly8gU3luY2hyb25pemUgdGhlIGZvcm1Nb2RlbCBhbmQgdGV4dEZvcm1Nb2RlbCB2YWx1ZXMgd2hlbiB0aGVcclxuXHRcdFx0XHQvLyBwb3B1cCBtZW51IGNsb3NlcyBhbmQgdW4tZmlsdGVyIHRoZSBvcHRpb25zIGFuZCByZXNldCB0aGVcclxuXHRcdFx0XHQvLyBzZWxlY3RlZEl0ZW0gYW5kIGluZGV4XHJcblx0XHRcdFx0aWYgKGV2ZW50ID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0dGhpcy5zeW5jTW9kZWxWYWx1ZXMoKTtcclxuXHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgZXJyb3JzIG9uIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsLCB3aGljaCB3aWxsIHRoZW4gc2V0IGVycm9ycyBvbiB0aGVcclxuXHQgKiBmb3JtTW9kZWwuIEFsc28gbWFyayB0aGUgZm9ybU1vZGVsIGFzIHRvdWNoZWQgdG8gZGlzcGxheSBhbnkgZXJyb3JzLlxyXG5cdCAqIEBwYXJhbSBlcnJvcnMga2V5KHMpIG9mIFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSBlcnJvcnMgdG8gZGlzcGxheSBvciByZW1vdmVcclxuXHQgKiBAbWVtYmVyb2YgQ29tb2JvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHNldEVycm9ycyhlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0RXJyb3JzKGVycm9ycyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVW5maWx0ZXIgb3B0aW9ucyBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW0gYW5kIHNlbGVjdGVkSXRlbUluZGV4XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHJlc2V0T3B0aW9ucyhvcHRpb25zPzogTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMub3B0aW9ucztcclxuXHRcdC8vIGRvIG5vdCBjb3VudCBoZWFkaW5nc1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbkNvdW50ID0gdGhpcy5maWx0ZXJlZE9wdGlvbnM/LmZpbHRlcihvID0+IG8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKS5sZW5ndGggfHwgMDtcclxuXHJcblx0XHQvL2lmIHRoZXkgaGF2ZSBubyBzZWFyY2ggdGVybSwgZG9uJ3QgdHJ5IHRvIHNlbGVjdCBhbnl0aGluZyBzbyB0aGV5IGNhbiBjbGVhciB0aGUgYm94IG91dCBieSBoaXR0aW5nIGVudGVyXHJcblx0XHQvL2lmIHRoZXkgaGF2ZSBhIHNlYXJjaCB0ZXJtIGFuZCB0aGUgb3B0aW9ucyBjaGFuZ2VkLCBzZWxlY3QgYW4gb3B0aW9uIGZyb20gdGhlIG1lbnUgc28gdGhleSB3aWxsIGdldCBpdCBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgaGl0IGVudGVyXHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlICE9PSAnJykge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kRGVmYXVsdFNlbGVjdGlvbkluZGV4KHRoaXMuZmlsdGVyZWRPcHRpb25zLCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdIHx8IG51bGw7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSh0aGlzLnNlbGVjdGVkSXRlbUluZGV4KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vaWYgdGhleSBoYXZlIG5vIHNlYXJjaCB0ZXJtIGFuZCB0aGUgb3B0aW9ucyBhcmUgcmVzZXQsIGRvbid0IGF1dG8tcGljayB0aGUgZmlyc3Qgb25lXHJcblx0XHRcdC8vc28gdGhhdCBlbnRlciB3aWxsIGFsbG93IHRoZW0gdG8gd2lwZSBvdXQgdGhlaXIgbGFzdCBzZWxlY3Rpb25cclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlzdGVuIHRvIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIGV2ZW50IGZyb20ge0BsaW5rIE1lbnVDb21wb25lbnR9IGFuZCB1cGRhdGUgdGhlIGZvcm1cclxuXHQgKiBtb2RlbCBhbmQgY2xvc2UgbWVudVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3RlZENoYW5nZWQoaXRlbTogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbSk7XHJcblx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93IGFuZCBoaWRlIHRoZSBwb3B1cCBtZW51XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgdG9nZ2xlTWVudShldmVudD86IEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChldmVudCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdC8vIFdoZW4gdGhlIHBvcHVwIGlzIGhpZGRlbiBpdCB3aWxsIGVtaXQgaXRzIGNoYW5nZWQgc3RhdHVzIGFuZFxyXG5cdFx0XHRcdC8vIHdlIHdpbGwgcmVzZXQgdmFsdWVzIGlmIG5lZWQgYmUuXHJcblx0XHRcdFx0dGhpcy5wb3B1cC5oaWRlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0aWYgKHRoaXMubG9hZE9uT3Blbk9ic2VydmFibGUgJiYgIXRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4pIHtcclxuXHRcdFx0XHRcdHRoaXMucGVuZGluZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5sb2FkT25PcGVuT2JzZXJ2YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgocmVzdWx0OiBNZW51SXRlbVtdKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4gPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucyA9IHJlc3VsdDtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucG9wdXAhLnNob3coKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnBvcHVwLnNob3coKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQ29udHJvbCB0aGUgbWVudSB3aXRoIGtleWJvYXJkIG5hdmlnYXRpb25cclxuXHQgKlxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSNFeGFtcGxlIHwgS2V5Ym9hcmRFdmVudC5rZXl9XHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5L0tleV9WYWx1ZXMgfCBLZXkgVmFsdWVzfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XHJcblx0XHRcdGNhc2UgXCJVcFwiOlxyXG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0dGhpcy5vbkFycm93RG93blVwKGV2ZW50KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJCYWNrc3BhY2VcIjpcclxuXHRcdFx0Y2FzZSBcIkRlbGV0ZVwiOlxyXG5cdFx0XHRjYXNlIFwiRGVsXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSBcIlRhYlwiOlxyXG5cdFx0XHRcdC8vIElmIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveCB0byB0aGUgYnV0dG9uLCBvdmVycmlkZSB0aGUgdGV4dGJveCBhcyBiZWluZ1xyXG5cdFx0XHRcdC8vIG1hcmtlZCB0b3VjaGVkIHNvIHdlIGRvbid0IHNlZSB0aGUgaW52YWxpZCBzdGF0ZS4gT25seSBzaG93IHRoZSBpbnZhbGlkIHN0YXRlXHJcblx0XHRcdFx0Ly8gd2hlbiB0YWJiaW5nIG91dCBvZiBjb21ib2JveCBmcm9tIHRoZSBidXR0b24gb3IgYmFjayB0YWJiaW5nIGZyb20gdGhlIHRleHRib3hcclxuXHRcdFx0XHQvLyBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xyXG5cdFx0XHRcdC8vIFx0aWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH1cclxuXHRcdFx0XHQvLyB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiBldmVudC5zcmNFbGVtZW50LnRhZ05hbWUgPT09ICdCVVRUT04nKSB7XHJcblx0XHRcdFx0Ly8gXHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH1cclxuXHRcdFx0XHQvLyB9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0Ly9pZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGlzIHRoZSBhZGQgbmV3IGJ1dHRvbiBsZXQgaXQgZmlyZSBidXQgZG9uJ3QgYWxsb3dcclxuXHRcdFx0XHRcdC8vdGhlIHRhYiBldmVudCB0byBjYXJyeSB0aGVtIGZvcndhcmQgZnJvbSB3aGVyZXZlciB0aGV5IGxhbmQgLSB0aGV5IHdvdWxkIHNraXAgdGhlIGZpcnN0IGJveCBvbiB0aGUgYWRkIG5ldyBmb3JtXHJcblx0XHRcdFx0XHQvL0luIHRoZSBub3JtYWwgY2FzZSB3ZSB3YW50IHRvIGFsbG93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9yIHRoZXkgd29uJ3QgYmUgYWJsZSB0byB0YWIgb3V0IG9mIHRoZSBjb250cm9sIGF0IGFsbC5cclxuXHRcdFx0XHRcdGlmKHRoaXMuYWRkTmV3U2VsZWN0ZWQpe1xyXG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiRW50ZXJcIjpcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiRXNjYXBlXCI6XHJcblx0XHRcdGNhc2UgXCJFc2NcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdC8vIEp1c3QgY2xvc2UgdGhlIG1lbnUsIGRvIG5vdCBmb2N1cyB0aGUgbmV4dCBlbGVtZW50IG9uIHRhYlxyXG5cdFx0XHRcdFx0Ly8gdW5sZXNzIHRoZSBtZW51IGlzIGhpZGRlblxyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBDbG9zZSB0aGUgbWVudSBiZWZvcmUgd2UgcmVzZXQgc2VsZWN0ZWRJdGVtIHNvIHdlIGRvbid0IHNlZSB0aGUgaGlnaGxpZ2h0IGNoYW5naW5nXHJcblx0XHRcdFx0XHQvLyB3aGVuIHJlc2V0IHRoZSBzZWxlY3RlZCBpdGVtIGJhY2sgdG8gdGhlIGZvcm1Nb2RlbFxyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIiBcIjpcclxuXHRcdFx0Y2FzZSBcIlNwYWNlYmFyXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nICYmIGV2ZW50LmtleSAhPT0gJ1NoaWZ0Jykge1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY2lsaXRhdGVzIGFkZGluZyBpdGVtcyB0byBhIGNvbWJvYm94XHJcblx0ICpcclxuXHQgKiBAcGFyYW0gYWRkRm4gRnVuY3Rpb24gZnJvbSBwYXJlbnQgdGhhdCBzaG91bGQgbWFrZSBhbiBBUEkgcmVxdWVzdCB0byBhZGQgYSBuZXcgaXRlbSB0byB0aGUgY29tYm9ib3gncyBvcHRpb25zXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGFkZE5ld0l0ZW0oYWRkRm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFkZEZuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGdhdmUgaXQgb3VyIGJlc3QgdHJ5LCBzb21ldGhpbmcgaXMgcmVhbGx5IHdoYWNrLCBzbyBsZXQncyBqdXN0IHNldCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgdGhpcy5zZXRFcnJvcnMoeyAnYWRkbmV3JzogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2dnbGVNZW51KCk7XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpZ3VyZSBvdXQgd2hldGhlciB0aGV5IGFyZSBhZGRpbmcgbmV3IG9yIGhhdmUgYW4gaXRlbSBzZWxlY3RlZCwgYW5kIGNvbW1pdCBpdCB0byB0aGUgZm9ybSBtb2RlbFxyXG5cdCAqL1xyXG4gIHByaXZhdGUgY29tbWl0U2VsZWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5vbkFkZE5ldyhldmVudCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuXHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB0ZXh0Ym94IHRvIHRoZSBwYXJlbnQgd2hlbiB0aGUgYWRkIG5ldyBidXR0b24gaXNcclxuXHQgKiBjbGlja2VkXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXZlbnQgQWRkIG5ldyBidXR0b24gY2xpY2sgb3IgZW50ZXIga2V5IGV2ZW50XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIG9uQWRkTmV3KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLmFkZE5ld0NsaWNrLmVtaXQodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHRcdHRoaXMucG9wdXA/LmhpZGUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBOYXZpZ2F0ZSB0aGUgZHJvcGRvd24gbWVudSB1c2luZyB1cCBhbmQgZG93biBhcnJvdyBrZXlzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXZlbnQgVXAgb3IgZG93biBhcnJvdyBrZXlkb3duIGV2ZW50XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBvbkFycm93RG93blVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJEb3duXCI6XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgIXRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA8IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vaWYgdGhlIGxhc3QgaXRlbSBpcyBhIGhlYWRpbmcgYW5kIHdlIGFyZSBvbiB0aGUgc2Vjb25kIGxhc3QgaXRlbSwgd2Ugc2hvdWxkbid0IGluY3JlbWVudCB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggYmVjYXVzZSB0aGF0IHdvdWxkIHNlbGVjdCB0aGUgaGVhZGluZ1xyXG5cdFx0XHRcdFx0aWYoICEodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAyICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrMV0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsrO1xyXG5cdFx0XHRcdFx0XHQvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPCB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrKztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XHJcblx0XHRcdGNhc2UgXCJVcFwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgdGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PT0gMCAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4LS07XHJcblx0XHRcdFx0XHQvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcclxuXHJcblx0XHRcdFx0XHRcdC8vaWYgdGhlIHNlbGVjdGVkSXRlbUluZGV4IGlzIC0xLCB0aGF0IG1lYW5zIHRoZSB2ZXJ5IGZpcnN0IGl0ZW0gd2FzIGEgaGVhZGluZyBhbmQgd2UganVzdCBza2lwcGVkIG92ZXIgaXQuXHJcblx0XHRcdFx0XHRcdGlmKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHQvL2lmIHRoZXJlIGlzIGFuIGFkZCBuZXcgYnV0dG9uIHdlIHNob3VsZCBzZWxlY3QgaXQuIG90aGVyd2lzZSB3ZSBzaG91bGQgbG9jayB0aGVtIGF0IGluZGV4IDEgKHJpZ2h0IGJlZm9yZSB0aGUgaGVhZGluZylcclxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gMTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuICAgICAgICAgIFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cclxuXHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cclxuXHQvKipcclxuXHJcblx0ICogRmlsdGVyIGFycmF5IG9mIG9wdGlvbnMgYnkgbGFiZWwgb3IgY2FwdGlvbiAoY29udGFpbnMpXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZmlsdGVyVGV4dCBUaGUgdmFsdWUgb2YgdGV4dGJveCB0aGF0IHdlIHdpbGwgZmlsdGVyIG91ciBvcHRpb25zIGJ5XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnNBcnJheShmaWx0ZXJUZXh0OiBzdHJpbmcpOiBBcnJheTxNZW51SXRlbT4ge1xyXG5cdFx0bGV0IHNlYXJjaFRleHQgPSBmaWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRpZiAoZmlsdGVyVGV4dCAmJiBmaWx0ZXJUZXh0ICE9PSAnJykge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihpdGVtID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMCB8fCBcclxuXHRcdFx0XHRcdFx0KGl0ZW0uY2FwdGlvbiAmJiBpdGVtLmNhcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID49IDApO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGaW5kIGEgZ2l2ZW4gaXRlbSdzIGluZGV4IGluIHRoZSBmaWx0ZXJlZCBpdGVtcyBhcnJheS5cclxuXHQgKlxyXG5cdCAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kXHJcblx0ICogQHBhcmFtIGl0ZW0gVGhlIG1hdGNoaW5nIGl0ZW0gdG8gZmluZCBpbiB0aGVcclxuXHQgKiBmaWx0ZXJkT3B0aW9ucyBhcnJheS4gV2lsbCB1c2UgdGhlIHNlbGVjdGVkSXRlbSBpZiBub3RoaW5nIGlzIHBhc3NlZC5cclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRTZWxlY3RlZEl0ZW1JbmRleChpdGVtPzogTWVudUl0ZW0pOiBudW1iZXIge1xyXG5cdFx0bGV0IGl0ZW1Ub0ZpbmQgPSBpdGVtID8gaXRlbSA6IHRoaXMuc2VsZWN0ZWRJdGVtO1xyXG5cclxuXHRcdGlmIChpdGVtVG9GaW5kKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kSW5kZXgoaXRlbSA9PiB7XHJcblx0XHRcdFx0aWYoaXRlbS5pZCAmJiAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmlkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbCAmJiBpdGVtLmlkID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmlkXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBpdGVtLmxhYmVsID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmxhYmVsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlYWN0IHRvIG91ciBmb3JtTW9kZWwgY2hhbmdpbmdcclxuXHQgKlxyXG5cdCAqIFRoZSBmb3JtTW9kZWwgcmVwcmVzZW50cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIE1vZGVsSXRlbVxyXG5cdCAqIFdoZW4gY2hhbmdlZCwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgVGV4dGJveENvbXBvbmVudCBhbmRcclxuXHQgKiBmaW5kIGluZGV4IG9mIGl0ZW0gaW4gb3B0aW9ucyBsaXN0LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmb3JtTW9kZWxDaGFuZ2VkKGRhdGE/OiBNZW51SXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5zeW5jaHJvbml6ZURpc2FibGVkQXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGlmIChkYXRhKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShkYXRhLmxhYmVsKTtcclxuXHJcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPSB0aGlzLmZpbmRTZWxlY3RlZEl0ZW1JbmRleChkYXRhKTtcclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPj0gMCkge1xyXG5cdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtID0gdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF07XHJcblx0XHRcdH1cclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vVGhlIGhvc3Qgd2lwZWQgb3V0IHRoZSBkYXRhIGV4dGVybmFsbHksIGNsZWFyIHRoZSB0ZXh0Ym94IGFuZCB0aGUgdHJhY2tpbmcgc3RhdGVcclxuXHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnJlc2V0KCk7XHJcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTY3JvbGwgdGhlIG1lbnUgaWYgdGhlIGN1cnJlbnQgc2VsZWN0ZWRJdGVtSW5kZXggaXMgb3V0IG9mIHZpZXdcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2Nyb2xsTWVudShrbm93bkluZGV4PzogbnVtYmVyKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5maWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHNlbGVjdGVkSXRlbUluZGV4IGluIGNhc2Ugb3VyIG9wdGlvbnMgY2hhbmdlZFxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0ga25vd25JbmRleCA9PT0gdW5kZWZpbmVkID8gdGhpcy5maW5kU2VsZWN0ZWRJdGVtSW5kZXgoKSA6IGtub3duSW5kZXg7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+IC0xICYmIHRoaXMuc2VsZWN0ZWRJdGVtKSB7XHJcblx0XHRcdFx0Ly8gVGhlIG1lbnUgY29tcG9uZW50IHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBpZHMgZm9yIHRoZSBtZW51IGl0ZW1zIGlmIHRoZXkgZG9udCBoYXZlIHRoZW0sXHJcblx0XHRcdFx0Ly8gc28gdGhleSBuZWVkIHRvIGJlIGFjY291bnRlZCBmb3IgaGVyZSBzaW5jZSB0aGUgY29tYm9ib3ggZG9lc24ndCBrbm93IGFib3V0IHRob3NlIGlkc1xyXG5cdFx0XHRcdGxldCBpdGVtU2VsZWN0b3IgPSB0aGlzLnNlbGVjdGVkSXRlbS5pZCA/IGAjJHt0aGlzLnNlbGVjdGVkSXRlbS5pZH1gIDogYCMke3RoaXMuaWR9X21lbnVfaXRlbSR7dGhpcy5zZWxlY3RlZEl0ZW1JbmRleH1gO1xyXG5cclxuXHRcdFx0XHQvL3RyaWdnZXIgdGhlIHNjcm9sbGluZyBhZnRlciBhIHRpY2sgdG8gYWxsb3cgdGhlIG1lbnUgdG8gYmUgdXAgdG8gZGF0ZSAoYW5kIHBlbmRpbmcgbWFzayBjbGVhcmVkKSBiZWZvcmUgbWVhc3VyaW5nXHJcblx0XHRcdFx0c2V0VGltZW91dCgoKT0+e1xyXG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxTZXJ2aWNlLnNjcm9sbEl0ZW1DZW50ZXJlZChgIyR7dGhpcy5pZH1fbWVudV9saXN0YCwgaXRlbVNlbGVjdG9yKTtcclxuXHRcdFx0XHR9LCAwKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZWFyY2gvRmlsdGVyIGJhc2VkIG9uIHRleHRib3ggaW5wdXRcclxuXHQgKiBOT1RFOiBzbyBhcyBub3QgdG8gcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBvbiBldmVyeSBrZXkgZXZlbnQsIHdlIHN1Z2dlc3QgeW91IGRlYm91bmNlIHlvdXJcclxuXHQgKiBzdWJzY3JpcHRpb25cclxuXHQgKiBAc2VlIHtAbGluayBodHRwOi8vcmVhY3RpdmV4LmlvL3J4anMvY2xhc3MvZXM2L09ic2VydmFibGUuanN+T2JzZXJ2YWJsZS5odG1sI2luc3RhbmNlLW1ldGhvZC1kZWJvdW5jZVRpbWUgfCBPYnNlcnZhYmxlLmRlYm91bmNlVGltZX1cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VhcmNoQW5kRmlsdGVyKHNlYXJjaFRleHQ/OiBzdHJpbmcpOiB2b2lkIHtcclxuXHJcblx0XHQvLyBhbHdheXMgZW1pdFxyXG5cdFx0dGhpcy5zZWFyY2guZW1pdChzZWFyY2hUZXh0KTtcclxuXHJcblx0XHQvLyBkbyBpbnRlcm5hbCBmaWx0ZXJpbmcgaWYgbm8gb25lJ3Mgc3Vic2NyaWJlZCB0byBvdXIgc2VhcmNoIGVtaXR0ZXJcclxuXHRcdGlmICh0aGlzLnNlYXJjaC5vYnNlcnZlcnMubGVuZ3RoID09PSAwICYmIHNlYXJjaFRleHQgIT09IHVuZGVmaW5lZCkge1xyXG5cdFx0XHR0aGlzLnJlc2V0T3B0aW9ucyh0aGlzLmZpbHRlck9wdGlvbnNBcnJheShzZWFyY2hUZXh0KSk7XHJcblxyXG5cdFx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCAmJiAhdGhpcy5hZGROZXdCdXR0b24pIHtcclxuXHRcdFx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQge0BsaW5rIGZvcm1Nb2RlbCB9J3MgdmFsaWRhdGlvbiBlcnJvcnMgZXF1YWwgdG8gdGhlIGludGVybmFsIHRleHRib3gncy5cclxuXHQgKlxyXG5cdCAqIFdoZW4gdGhlIGludGVybmFsIHRleHRib3ggaXMgaW52YWxpZCwgbmVlZCB0byBzZXQgdGhpcyBjb250cm9sJ3NcclxuXHQgKiBlcnJvcnMgYmVjYXVzZSB3ZSBhcmUgdXNpbmcgb3VyIG93biBsYWJlbCwgbm90IFRleHRib3hDb250cm9sJ3MuXHJcblx0ICogV2UgdXNlIG91ciBvd24gbGFiZWwgc28gbGFiZWwgdGV4dCB3aWxsIHdyYXAgYXQgdGhlIGVuZCBvZiB0aGUgYnV0dG9uLFxyXG5cdCAqIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0Ym94LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXRGb3JtTW9kZWxWYWxpZGF0aW9uRXJyb3JzKGRhdGE/OiBhbnkpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwuaW52YWxpZCkge1xyXG5cdFx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnModGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmVycm9ycyk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRFcnJvcnMobnVsbCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGUgdGhlIGZvcm0gbW9kZWwgdmFsdWUgd2l0aCB0aGUgc2VsZWN0ZWQgaXRlbSBvciByZXNldCBmb3JtIG1vZGVsIHZhbHVlIGlmIGl0ZW0gaXMgbnVsbFxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXRGb3JtTW9kZWxWYWx1ZShpdGVtOiBNZW51SXRlbSB8IG51bGwpOiB2b2lkIHtcclxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShpdGVtID8gaXRlbS5sYWJlbCA6ICcnKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLnNldFZhbHVlKGl0ZW0pO1xyXG5cdFx0dGhpcy5mb3JtTW9kZWwubWFya0FzRGlydHkoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgdmFsaWRhdG9ycyBvbiB0aGUge0BzZWUgdGV4dGJveEZvcm1Nb2RlbCB9XHJcblx0ICpcclxuXHQgKiBWYWxpZGF0b3JzIGFyZSBjdXJyZW50bHkgc2V0IGJhc2VkIG9uIHRoZSB7QHNlZSBtYXhsZW5ndGggfSxcclxuXHQgKiB7QHNlZSBtaW5sZW5ndGggfSwgYW5kIHtAc2VlIHJlcXVpcmVkIH0gaW5wdXRzLiAgVGhpcyB3b3JrcyB3ZWxsXHJcblx0ICogd2l0aCB7QHNlZSBUZXh0Ym94Q29tcG9uZW50IH0sIHdoaWNoIG5lZWRzIHRoZXNlIGlucHV0cyB0byBhcHBseVxyXG5cdCAqIHRoZSBwcm9wZXIgYXR0cmlidXRlcyB0byBpdHMgaW5wdXRzLlxyXG5cdCAqXHJcblx0ICogQSBmdXR1cmUgcmVsZWFzZSBvZiBBbmd1bGFyIHdpbGwgc3VwcG9zZWRseSBhZGQgdGhlc2UgYXR0cmlidXRlc1xyXG5cdCAqIGZvciB5b3UsIHdoaWNoIHdpbGwgZWxpbWluYXRlIHRoZSBuZWVkIGZvciBUZXh0Ym94Q29tcG9uZW50IHRvIGhhdmVcclxuXHQgKiBzdWNoIGlucHV0cy4gIFRoaXMgY29tcG9uZW50LCBob3dldmVyLCB3aWxsIHN0aWxsIG5lZWQgdGhlc2UgaW5wdXRzXHJcblx0ICogYXMgdGhlcmUgaXMgbm8gY3VycmVudCB3YXkgdG8ga25vdyB3aGljaCB2YWxpZGF0b3JzIGFyZSBhcHBsaWVkIHRvIGl0XHJcblx0ICogZnJvbSBpdHMgcGFyZW50IFZpZXcgQ29tcG9uZW50LlxyXG5cdCAqXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk6IHZvaWQge1xyXG5cdFx0bGV0IHZhbGlkYXRvcnM6IEFycmF5PFZhbGlkYXRvckZuPiA9IFtdO1xyXG5cclxuXHRcdGlmICh0aGlzLnJlcXVpcmVkKSB7XHJcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLnJlcXVpcmVkKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5taW5sZW5ndGgpIHtcclxuXHRcdFx0dmFsaWRhdG9ycy5wdXNoKFZhbGlkYXRvcnMubWluTGVuZ3RoKHRoaXMubWlubGVuZ3RoKSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMubWF4bGVuZ3RoKSB7XHJcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heGxlbmd0aCkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWxpZGF0b3JzKHZhbGlkYXRvcnMpO1xyXG5cclxuXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogS2VlcCB0ZXh0Ym94J3MgZGlzYWJsZWQgc3RhdHVzIGluLXN5bmMgd2l0aCBjb21ib2JveCdzXHJcblx0ICpcclxuXHQgKiB7QGxpbmsgVGV4dGJveENvbXBvbmVudH0gZ2V0cyBpdHMgZGlzYWJsZWQgc3RhdHVzIGZyb20gaXRzIHtAbGluayBGb3JtQ29udHJvbH1cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3luY2hyb25pemVEaXNhYmxlZEF0dHJpYnV0ZXMoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQgIT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC5kaXNhYmxlZCkge1xyXG5cdFx0XHRpZiAodGhpcy5mb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZSgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lbmFibGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRoZSBmb3JtTW9kZWwgdmFsdWUgYW5kIHRleHRib3ggdmFsdWUgZG8gbm90IG1hdGNoLCByZXNldCB0aGUgdGV4dGJveCBhbmQgc2VsZWN0ZWRJdGVtIHRvXHJcblx0ICogdGhlIGZvcm1Nb2RsZSB2YWx1ZS4gSWYgdGhlcmUgaXMgbm8gZm9ybU1vZGVsIHZhbHVlLCBtYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHRleHRib3guIFJlc2V0IHRoZVxyXG5cdCAqIGZpbHRlcmVkT3B0aW9ucyB0byB0aGUgZnVsbCBsaXN0IGFuZCB1cGRhdGUgdGhlIHNlbGVjdGVkSXRlbUluZGV4XHJcblx0ICpcclxuXHQgKi9cclxuXHRwcml2YXRlIHN5bmNNb2RlbFZhbHVlcygpOiB2b2lkIHtcclxuXHRcdC8vIElmIHRoZXJlIGlzIGEgZm9ybU1vZGVsIHZhbHVlLCByZXNldCB0aGUgc2VsZWN0ZWQgaXRlbS4gSWYgdGhlcmUgaXNuJ3QsIG1ha2VcclxuXHRcdC8vIHN1cmUgd2UgY2xlYXIgdGhlIHRleHRib3hcclxuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC52YWx1ZSAmJiB0aGlzLmZvcm1Nb2RlbC52YWx1ZS5sYWJlbCAhPT0gdGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSh0aGlzLmZvcm1Nb2RlbC52YWx1ZS5sYWJlbCk7XHJcblx0XHR9IGVsc2UgaWYgKCF0aGlzLmZvcm1Nb2RlbC52YWx1ZSkge1xyXG5cdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoJycpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFNlYXJjaCBhbmQgZmlsdGVyIHRoZSBvcHRpb25zIGxpc3Qgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIHRleHRib3ggaW5wdXQgY2hhbmdlcy4gSWYgYWRkTmV3IGlzXHJcblx0ICogc2V0IGFsc28gY2hlY2sgZm9yIG1hdGNoZXMgaW4gb3VyIGZpbHRlcmVkT3B0aW9ucyB0byBjb25kaXRpb25hbGx5IHNob3cgYW5kIGhpZGUgdGhlIGFkZCBuZXdcclxuXHQgKiBidXR0b25cclxuXHQgKlxyXG5cdCAqIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvRXZlbnRzL2lucHV0XHJcblx0ICovXHJcblx0cHVibGljIHRleHRib3hWYWx1ZUNoYW5nZWQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcblx0XHR0aGlzLnNlYXJjaEFuZEZpbHRlcih0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cclxuXHRcdGlmICh0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUgPT09ICcnKSB7XHJcblx0XHRcdHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW0oKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5hZGROZXcpIHtcclxuXHRcdFx0bGV0IG1hdGNoID0gdGhpcy5maWx0ZXJlZE9wdGlvbnMuZmluZCgob3B0aW9uKSA9PiB7XHJcblx0XHRcdFx0cmV0dXJuIG9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHRcdFx0fSk7XHJcblx0XHRcdHRoaXMuZm91bmRNYXRjaCA9IG1hdGNoID8gdHJ1ZSA6IGZhbHNlO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFVwZGF0ZSB0aGUgcG9wdXAgbWVudSBwb3NpdGlvbiB3aGVuIGlucHV0IHZhbHVlIGNoYW5nZXNcclxuXHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdHRoaXMucG9wdXAudXBkYXRlKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGNsZWFyU2VsZWN0ZWRJdGVtKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IC0xO1xyXG5cdH1cclxuXHJcblx0LyoqUmVjb21wdXRlIHdoYXQgdGhlIHBsYWNlaG9sZGVyIHNob3VsZCBiZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSB1c2VyIHByb3ZpZGVkIG9uZSBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFkZE5ldyBpbnB1dCAqL1xyXG5cdHByaXZhdGUgdXBkYXRlUGxhY2Vob2xkZXJUZXh0KCl7XHJcblx0XHRpZiAodGhpcy5wbGFjZWhvbGRlcikge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh0aGlzLnBsYWNlaG9sZGVyKTtcclxuXHRcdH0gZWxzZSBpZiAodGhpcy5hZGROZXcpIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMuY2hvb3NlT3JBZGRQbGFjZWhvbGRlcjtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLmNob29zZVBsYWNlaG9sZGVyO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqRmluZCB0aGUgb3B0aW9uIHdlIHdhbnQgdG8gYmUgdGhlIGRlZmF1bHQgc2VsZWN0aW9uLiBJZiB0aGVyZSBpcyBhbiBleGFjdCBtYXRjaCwgdXNlIHRoYXRcclxuXHQgKiBvdGhlcndpc2UgaWYgdGhlcmUgYXJlIGl0ZW1zLCByZXR1cm4gemVybyB0byBpbmRpY2F0ZSB0aGUgZmlyc3QgaXRlbS4gT3RoZXJ3aXNlIHJldHVybiAtMVxyXG5cdCAqIHRvIGluZGljYXRlIG5vIHNlbGVjdGlvblxyXG5cdCAqL1xyXG5cdHByaXZhdGUgZmluZERlZmF1bHRTZWxlY3Rpb25JbmRleChvcHRpb25zOiBNZW51SXRlbVtdLCBzZWFyY2hUZXh0OiBzdHJpbmcpOiBudW1iZXIge1xyXG5cdFx0bGV0IGluZGV4ID0gLTE7XHJcblxyXG5cdFx0aWYob3B0aW9ucyAmJiBvcHRpb25zLmxlbmd0aCl7XHJcblx0XHRcdGluZGV4ID0gb3B0aW9ucy5maW5kSW5kZXgob3B0aW9uPT5vcHRpb24gIT0gbnVsbCAmJiBvcHRpb24uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKTtcclxuXHJcblx0XHRcdGlmKHNlYXJjaFRleHQpe1xyXG5cdFx0XHRcdHNlYXJjaFRleHQgPSBzZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG5cdFx0XHRcdGxldCBleGFjdE1hdGNoSW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb249Pm9wdGlvbi5sYWJlbC50b0xvd2VyQ2FzZSgpID09IHNlYXJjaFRleHQgJiYgb3B0aW9uLmRpc3BsYXkgIT09ICdoZWFkaW5nJyk7XHJcblx0XHRcdFx0aWYoZXhhY3RNYXRjaEluZGV4ID49MCl7XHJcblx0XHRcdFx0XHRpbmRleCA9IGV4YWN0TWF0Y2hJbmRleDtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHRcdHJldHVybiBpbmRleDtcclxuXHR9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250cm9sIGNvbnRyb2wtbGFiZWwte3tsYWJlbFBvc2l0aW9ufX1cIlxyXG4gICAgIFtuZ0NsYXNzXT1cInsnb3Blbic6IG1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJyxcclxuICAgICAgICAgICAgICAgICAnaW52YWxpZCc6IGZvcm1Nb2RlbC50b3VjaGVkICYmIGZvcm1Nb2RlbC5pbnZhbGlkLFxyXG4gICAgICAgICAgICAgICAgICdoYXMtaWNvbic6ICgodGVtcGxhdGVUeXBlID09PSAnaWNvbkFuZExhYmVsJyB8fCB0ZW1wbGF0ZVR5cGUgPT09ICdpY29uTGFiZWxDYXB0aW9uJykgJiYgZm9ybU1vZGVsLnZhbHVlICYmIGZvcm1Nb2RlbC52YWx1ZS5pY29uICYmIGZvcm1Nb2RlbC52YWx1ZS5sYWJlbCA9PT0gdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSksXHJcbiAgICAgICAgICAgICAgICAgJ2lzLXJlYWRvbmx5JzogcmVhZG9ubHksXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWRpc2FibGVkJzogZm9ybU1vZGVsLmRpc2FibGVkLFxyXG4gICAgICAgICAgICAgICAgICdpcy1hbHdheXMtb3Blbic6IGFsd2F5c09wZW59XCI+XHJcblxyXG4gIDxsYWJlbCAqbmdJZj1cImxhYmVsXCIgbmdQcmVzZXJ2ZVdoaXRlc3BhY2VzPlxyXG4gICAgICA8c3Bhbj57e2xhYmVsIHwgdHJhbnNsYXRlfX08L3NwYW4+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwidmFsaWRhdGlvbkVycm9ycy5sZW5ndGggPiAwICYmIGZvcm1Nb2RlbC50b3VjaGVkICYmIGZvcm1Nb2RlbC5pbnZhbGlkXCI+e3t2YWxpZGF0aW9uRXJyb3JzfX08L3NwYW4+XHJcbiAgPC9sYWJlbD5cclxuXHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFsd2F5c09wZW47IGVsc2UgcG9wdXBUYXJnZXRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwIGNvbnRyb2wtaW5wdXRcIiBbbmdDbGFzc109XCJ0ZXh0Ym94RWxlbWVudENsYXNzZXNcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRleHRib3hcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMCB8fCB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlXCI+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkcm9wZG93bm1lbnVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG48L2Rpdj5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjcG9wdXBUYXJnZXQ+XHJcbiAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiICplY1BvcHVwPVwiZHJvcGRvd25tZW51XCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICN0ZXh0Ym94PlxyXG4gIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2Zvcm1Nb2RlbC52YWx1ZT8uaWNvbn19XCI+PC9pPlxyXG5cclxuICAgIDxlYy10ZXh0Ym94IGNsYXNzPVwidGV4dGJveC1ncm91cC1pbnB1dCBtYi0wXCJcclxuICAgICAgICAgICAgICAgICN0ZXh0Ym94XHJcbiAgICAgICAgICAgICAgICBbaWRdPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgW2F1dG9mb2N1c109XCJhdXRvZm9jdXNcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Nb2RlbF09XCJ0ZXh0Ym94Rm9ybU1vZGVsXCJcclxuICAgICAgICAgICAgICAgIFttYXhsZW5ndGhdPVwibWF4bGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgIFttaW5sZW5ndGhdPVwibWlubGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJlZmZlY3RpdmVQbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcclxuICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwidGV4dGJveFZhbHVlQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cImtleU5hdmlnYXRlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGZvY3Vzb3V0KT1cIm9uQmx1cigpXCJcclxuICAgICAgICAgICAgICAgIFt1cHBlckNhc2VdPVwidXBwZXJDYXNlXCJcclxuICAgICAgICAgICAgICAgIFtwZW5kaW5nXT1cInBlbmRpbmcgJiYgYWx3YXlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cIidvZmYnXCI+PC9lYy10ZXh0Ym94PlxyXG5cclxuICAgIDxlYy1idXR0b24gY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWJ0bi1yaWdodFwiXHJcbiAgICAgICAgICAgICAgICpuZ0lmPVwiIWhpZGVUb2dnbGVCdXR0b25cIlxyXG4gICAgICAgICAgICAgICBbaWRdPVwiaWQgKyAnX2J1dHRvbidcIlxyXG4gICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybU1vZGVsLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgaWNvbj1cImljb24tY2FyZXQtZG93blwiXHJcbiAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCItMVwiXHJcbiAgICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlTWVudSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnXCI+PC9lYy1idXR0b24+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2Ryb3Bkb3dubWVudT5cclxuICA8ZGl2IGNsYXNzPVwicG9wdXBcIlxyXG4gICAgICAgZWNPdmVybGF5XHJcbiAgICAgICBbc3RhdHVzXT1cInBlbmRpbmcgJiYgIWFsd2F5c09wZW4gPyAncGVuZGluZycgOiAnaGFzRGF0YSdcIj5cclxuXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYWRkLW5ldyB7e2FkZE5ld09wdGlvbnM/LmNsYXNzTGlzdH19XCJcclxuICAgICAgICAgICAgaWQ9XCJ7e2lkfX1fYWRkTmV3XCJcclxuICAgICAgICAgICAgI2FkZE5ld0J1dHRvblxyXG4gICAgICAgICAgICBbY2xhc3MuaXMtc2VsZWN0ZWRdPVwiYWRkTmV3U2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImFkZE5ld1wiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiZm91bmRNYXRjaCB8fCAoYWRkTmV3ID09PSAnZHluYW1pYycgJiYgKCF0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlIHx8IChmb3JtTW9kZWwudmFsdWUgJiYgdGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gZm9ybU1vZGVsLnZhbHVlLmxhYmVsKSkpXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkTmV3KCRldmVudClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJhZGQtbmV3LWxhYmVsIGVjLXV0aWwtdHJ1bmNhdGVcIj5cclxuICAgICAgICA8c3BhbiAqbmdJZj1cImFkZE5ldyA9PT0gJ3N0YXRpYycgfHwgYWRkTmV3ID09PSB0cnVlXCJcclxuICAgICAgICAgICAgICB0cmFuc2xhdGU+e3thZGROZXdPcHRpb25zPy5sYWJlbH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRkTmV3ID09PSAnZHluYW1pYydcIj57eydBZGQnIHwgdHJhbnNsYXRlfX0gPHN0cm9uZyBcclxuICAgICAgICAgICAgICBjbGFzcz1cImVjLXV0aWwtdHJ1bmNhdGVcIiBcclxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RleHQtdXBwZXJjYXNlJzogdXBwZXJDYXNlfVwiPnt7dGV4dGJveEZvcm1Nb2RlbC52YWx1ZX19PC9zdHJvbmc+XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICAgIDxpIGNsYXNzPVwiZWMtaWNvbiB7e2FkZE5ld09wdGlvbnM/Lmljb259fVwiPjwvaT5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxlYy1tZW51IGlkPVwie3tpZH19X21lbnVcIlxyXG4gICAgICAgICAgICAgW2NsYXNzLmJvcmRlci10b3AtMF09XCIhZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBoaWRlTm9NYXRjaGVzXCJcclxuICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIm1lbnVFbGVtZW50Q2xhc3Nlc1wiXHJcbiAgICAgICAgICAgICBbdGVtcGxhdGVUeXBlXT1cInRlbXBsYXRlVHlwZVwiXHJcbiAgICAgICAgICAgICBbY3VzdG9tTWVudVRlbXBsYXRlXT1cImN1c3RvbU1lbnVUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICBbc2hvd05vSXRlbXNdPVwiIWhpZGVOb01hdGNoZXNcIlxyXG4gICAgICAgICAgICAgW25vRGF0YVRleHRdPVwibm9NYXRjaGVzVGV4dFwiXHJcbiAgICAgICAgICAgICBbaXRlbXNdPVwiZmlsdGVyZWRPcHRpb25zXCJcclxuICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJzZWxlY3RlZEl0ZW1cIlxyXG4gICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlZCk9XCJzZWxlY3RlZENoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICBbcHJlc2VydmVJY29uU3BhY2VdPVwicHJlc2VydmVJY29uU3BhY2VcIlxyXG4gICAgICAgICAgICAgW3RydW5jYXRlSXRlbXNdPVwidHJ1bmNhdGVJdGVtc1wiPjwvZWMtbWVudT5cclxuXHJcbiAgICA8Zm9vdGVyICpuZ0lmPVwidG90YWxSZWNvcmRzICYmIHRvdGFsUmVjb3JkcyA+IGZpbHRlcmVkT3B0aW9ucy5sZW5ndGggJiYgZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDBcIj5cclxuICAgICAgPHNwYW4+e3tmaWx0ZXJlZE9wdGlvbkNvdW50fX0ge3snb2YnIHwgdHJhbnNsYXRlfX0ge3t0b3RhbFJlY29yZHN9fTwvc3Bhbj5cclxuICAgIDwvZm9vdGVyPlxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG4iXX0=
880
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcmMvbGliL2NvbnRyb2xzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9jb250cm9scy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFtRCxTQUFTLEVBQWMsWUFBWSxFQUFlLE1BQU0sZUFBZSxDQUFDO0FBQzFLLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQWUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUtqRCxPQUFPLEVBQUUsdUJBQXVCLEVBQWUsTUFBTSx5REFBeUQsQ0FBQzs7Ozs7Ozs7Ozs7O0FBeUIvRzs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQU1ILE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUFlO0lBRXJEOzs7OztPQUtHO0lBQzRCLFFBQVE7UUFDdEMsSUFBSSxJQUFJLENBQUMsS0FBSztZQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQWtPRCxZQUNXLHdCQUFrRCxFQUNsRCxlQUFnQyxFQUNoQyxTQUEyQixFQUMzQixhQUE0QjtRQUV0QyxLQUFLLENBQUMsd0JBQXdCLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFMdkMsNkJBQXdCLEdBQXhCLHdCQUF3QixDQUEwQjtRQUNsRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsY0FBUyxH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TVUsVUFBVTtzQkFBekIsS0FBSztnQkFLVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBS1UscUJBQXFCO3NCQUFwQyxLQUFLO2dCQUdVLGFBQWE7c0JBQTVCLEtBQUs7Z0JBS1csYUFBYTtzQkFBNUIsS0FBSztnQkFLUyxhQUFhO3NCQUE1QixLQUFLO2dCQVNXLFdBQVc7c0JBQTNCLE1BQU07Z0JBTVUsTUFBTTtzQkFBdEIsTUFBTTtnQkFHc0IsT0FBTztzQkFBbkMsU0FBUzt1QkFBQyxTQUFTO2dCQUt3QixLQUFLO3NCQUFoRCxTQUFTO3VCQUFDLHVCQUF1QjtnQkFNQyxZQUFZO3NCQUE5QyxTQUFTO3VCQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIEFmdGVyVmlld0luaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIFZhbGlkYXRvckZuIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tIFwiQG5neC10cmFuc2xhdGUvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtQ29udHJvbEJhc2UgfSBmcm9tICcuLi9mb3JtLWNvbnRyb2wtYmFzZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBUZXh0Ym94Q29tcG9uZW50IH0gZnJvbSAnLi4vdGV4dGJveC90ZXh0Ym94LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvdmFsaWRhdGlvbi1tZXNzYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXBIZWxwZXIgfSBmcm9tICcuLi8uLi9zaGFyZWQvZm9ybS1ncm91cC5oZWxwZXInO1xyXG5pbXBvcnQgeyBNZW51SXRlbSwgTWVudVRlbXBsYXRlVHlwZSwgTWVudUhvc3RFbGVtZW50Q2xhc3NlcyB9IGZyb20gJy4uL21lbnUvbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSwgUG9wdXBTdGF0dXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZGlyZWN0aXZlcy9wb3B1cC9wb3B1cC1jb250YWluZXIuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU2Nyb2xsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2Nyb2xsLnNlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIFBvc2l0aW9uIG9mIHRoZSBtZW51IHJlbGF0aXZlIHRvIHRoZSBpbnB1dFxyXG4gKi9cclxuZXhwb3J0IHR5cGUgQ29tYm9ib3hNZW51UG9zaXRpb24gPSBcInRvcF9yaWdodFwiIHwgXCJ0b3BfbGVmdFwiIHwgXCJib3R0b21fbGVmdFwiIHwgXCJib3R0b21fcmlnaHRcIjtcclxuXHJcblxyXG4vKipcclxuICogVGhlIHR5cGUgb2YgYWRkIG5ldyBpbXBsZW1lbnRhdGlvbi4gU3RhdGljIGRpc3BsYXlzIGEgc2ltcGxlIHN0YXRpYyBidXR0b24gd2hpbGUgZHluYW1pYyB1cGRhdGVzXHJcbiAqIHRoZSBsYWJlbCBvZiB0aGUgYnV0dG9uIHdpdGggdmFsdWUgb2YgdGhlIHRleHRib3hcclxuICovXHJcbnR5cGUgQWRkTmV3VHlwZSA9IFwiZHluYW1pY1wiIHwgXCJzdGF0aWNcIiB8IGJvb2xlYW47XHJcblxyXG4vKipcclxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIFwiQWRkIG5ld1wiIGJ1dHRvbiB3aGVuIGluIHN0YXRpYyBtb2RlXHJcbiAqL1xyXG50eXBlIEFkZE5ld09wdGlvbnMgPSB7XHJcblx0bGFiZWw/OiBzdHJpbmc7IFx0LyoqIEEgY3VzdG9tIGxhYmVsIHRvIGRpc3BsYXkgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQgXCJBZGQgbmV3Li4uXCIgKi9cclxuXHRjbGFzc0xpc3Q/OiBzdHJpbmc7IFx0LyoqIEEgc3RyaW5nIG9mIHNwYWNlLXNlcGFyYXRlZCB1dGlsaXR5IGNsYXNzZXMgd2UnbGwgYXBwbHkgdG8gdGhlIGxhYmVsICovXHJcblx0aWNvbj86IHN0cmluZzsgXHQvKiogQSBjdXN0b20gaWNvbiB0byBkaXNwbGF5IGluIHBsYWNlIG9mIHRoZSBkZWZhdWx0ICdpY29uLWFkZCcgKi9cclxufTtcclxuXHJcblxyXG4vKipcclxuICogU2VsZWN0IGJveCAoc2VsZWN0LCBhdXRvY29tcGxldGUsIGNvbWJvYm94KVxyXG4gKlxyXG4gKiBOT1RFOiBNaW4vbWF4IGxlbmd0aCB2YWxpZGF0aW9uIGlzIGltcGxlbWVudGVkIG9uIHRoZSBpbnRlcm5hbCBlYy10ZXh0Ym94LlxyXG4gKiBWYWx1ZXMgcGFzc2VkIGluIHZpYSBpbnB1dCBwcm9wZXJ0aWVzIChAc2VlIG1heGxlbmd0aCAsIEBzZWUgbWlubGVuZ3RoIClcclxuICogYXJlIHVzZWQgdG8gY3JlYXRlIHZhbGlkYXRvcnMgb24gdGhlIHRleHRib3guICBXaGVuIHRoZSB2YWxpZGF0aW9uIG9uIHRoZVxyXG4gKiB0ZXh0Ym94IGZhaWxzLCB0aGUgdmFsaWRhdGlvbiBlcnJvcihzKSBnZXQgcGFzc2VkIHVwIHRvIHRoZSB7QHNlZSBmb3JtTW9kZWwgfS5cclxuICogV2hlbiBzZXR0aW5nIHVwIHRoaXMgY29tcG9uZW50J3Mge0BzZWUgRm9ybUNvbnRyb2wgfSwgeW91IGRvIE5PVCBuZWVkIHRvIHNldCB0aGVcclxuICogVmFsaWRhdG9ycy5taW5MZW5ndGggb3IgVmFsaWRhdG9ycy5tYXhMZW5ndGggdmFsaWRhdG9ycy5cclxuICpcclxuICogUmVxdWlyZWQgaXMgYWxzbyBwYXNzZWQgdmlhIGlucHV0IHByb3BlcnR5LCBidXQgeW91IFNIT1VMRCBhbHNvIHNldCB1cCB0aGVcclxuICogVmFsaWRhdG9ycy5yZXF1aXJlZCB2YWxpZGF0b3Igb24gdGhpcyBjb21wb25lbnQncyBGb3JtQ29udHJvbC5cclxuICpcclxuICogQGV4cG9ydFxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICdlYy1jb21ib2JveCcsXHJcblx0dGVtcGxhdGVVcmw6ICdjb21ib2JveC5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vY29tYm9ib3guY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tYm9ib3hDb21wb25lbnQgZXh0ZW5kcyBGb3JtQ29udHJvbEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XHJcblxyXG5cdC8qKlxyXG5cdCAqIENsb3NlIHRoZSBwb3B1cCBtZW51IG9uIHJlc2l6ZSBzbyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uaW5nIGNhbiBiZSByZWNhbGN1bGF0ZWRcclxuXHQgKiBjb3JyZWN0bHkuIENhbm5vdCBiZSBwbGFjZWQgb24gdGhlIHBvcHVwRGlyZWN0aXZlIGJlY2F1c2Ugb2YgYSBidWcgd2hlcmVcclxuXHQgKiBIb3N0TGlzdGVuZXJzIGZvciBnbG9iYWwgZXZlbnRzIGRvbid0IGZpcmVcclxuXHQgKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE0MTkxXHJcblx0ICovXHJcblx0QEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpIG9uUmVzaXplKCkge1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHRoaXMucG9wdXAuaGlkZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2hvdyB0aGUgYWRkIG5ldyBidXR0b24gaW4gdGhlIHBvcHVwXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ldz86IEFkZE5ld1R5cGU7XHJcblxyXG5cdC8qKiBDb25maWd1cmUgdGhlIGFkZE5ldyBidXR0b24gbGFiZWwgJiBpY29uIHdoZW4gYWRkTmV3IGlzIHRydWUgYW5kIHNldCB0byBzdGF0aWNcclxuXHQgKiBEZWZhdWx0IGlzIHNldCB0bzogeyBsYWJlbDogJ0FsbCBuZXcuLi4nLCBpY29uOiAnaWNvbi1hZGQnfVxyXG5cdCAqIEBzZWUgQWRkTmV3T3B0aW9uc1xyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqIEBleGFtcGxlXHJcblx0ICogPGVjLWNvbWJvYm94IFthZGROZXddPVwidHJ1ZVwiIFxyXG5cdCAqIFx0ICAgICAgICAgW2FkZE5ld09wdGlvbnNdPVwieyBcclxuKiBcdFx0XHRcdFx0XHRsYWJlbDogJ0hlbHAgbWUgY2hvb3NlLi4uJyxcclxuKiBcdFx0XHRcdFx0XHRpY29uOiAnaWNvbi1zZWFyY2gnLFxyXG4qIFx0XHRcdFx0XHRcdGNsYXNzTGlzdDogJ3RleHQtYm9keS0yIHRleHQtbGluaycgfVwiPlxyXG5cdCAqIDwvZWMtY29tYm9ib3g+XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFkZE5ld09wdGlvbnM/OiBBZGROZXdPcHRpb25zID0geyBcclxuXHRcdGxhYmVsOiAnQWRkIG5ldy4uLicsXHJcblx0XHRpY29uOiAnaWNvbi1hZGQnLFxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIFRleHRib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWF4bGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gb2YgdGhlIG1lbnUgcmVsYXRpdmUgdG8gdGhlIHRleHQgYm94XHJcblx0ICogQGRlZmF1bHQgJ2JvdHRvbV9yaWdodCdcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgbWVudVBvc2l0aW9uPzogQ29tYm9ib3hNZW51UG9zaXRpb24gPSAnYm90dG9tX3JpZ2h0JztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgaW4gdGhlIGlucHV0XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgVGV4dGJveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtaW5sZW5ndGg/OiBudW1iZXI7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJdGVtcyB0byBzaG93IGluIGNvbWJvYm94IG1lbnVcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBvcHRpb25zOiBBcnJheTxNZW51SXRlbT4gPSBbXTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIERpc3BsYXkgdGVtcGxhdGUgZm9yIG1lbnUgaXRlbXNcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0ZW1wbGF0ZVR5cGU6IE1lbnVUZW1wbGF0ZVR5cGUgPSAnbGFiZWwnO1xyXG5cclxuXHQvKipcclxuICAgICAqIE9wdGlvbmFsIGN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIG1lbnUgaXRlbXMuIE11c3QgZGVjbGFyZSBhIHRlbXBsYXRlXHJcblx0ICogaW5wdXQgdmFyaWFibGUgY2FsbGVkIFwiaXRlbVwiIGxpa2Ugc286IDxuZy10ZW1wbGF0ZSAjdGVtcGxhdGVOYW1lIGxldC1pdGVtPixcclxuXHQgKiB3aGVyZSBpdGVtIHJlcHJlc2VudHMgdGhlIG1lbnVJdGVtLlxyXG4gICAgICogV2lsbCBvdmVycmlkZSB0aGUgY2hvaWNlIGZvciB0ZW1wbGF0ZVR5cGUgaWYgcHJvdmlkZWQuXHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGN1c3RvbU1lbnVUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFdoZW4gdHJ1ZSwgdGhlIG1lbnUgaXRlbXMgd2lsbCBwcmVzZXJ2ZSB0aGUgaWNvbiBzcGFjZSB3aGVuIHRoZXJlIGlzIG5vIGljb25cclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcHJlc2VydmVJY29uU3BhY2U6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogUG9zaXRpb24gdGhlIG1lbnUgYXMgZml4ZWQsIGlkZWFsIHdoZW4gY29tYm9ib3hlcyBhcmUgaW5zaWRlIGRpYWxvZ3NcclxuXHQgKiBEZWZhdWx0aW5nIHRvIHRydWUgc28gYWxsIG1lbnVzIHdpbGwgYmUgYXQgbGVhc3QgdGhlIHdpZHRoIG9mIHRoZVxyXG5cdCAqIHRleHRib3ggKyBidXR0b24sIGJ1dCBjYW4gZ3JvdyB3aWRlciBpZiB0aGUgaW5uZXIgZWxlbWVudHMgbmVlZCBpdFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBwb3B1cEZpeGVkOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcmVjb3JkcyBmcm9tIHRoZSBkYXRhc291cmNlXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHRvdGFsUmVjb3Jkcz86IG51bWJlcjtcclxuXHJcblx0LyoqXHJcblx0ICogSWYgc2V0IHRvIHRydWUsIHdlIHdpbGwgdXBwZXJDYXNlIHRoZSB0ZXh0IGJveCBhbmQgYXBwbHkgdGhlIGNsYXNzIG9uIHRoZSBhZGQgYm94XHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIHVwcGVyQ2FzZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHJcblx0LyoqVGhlIHBsYWNlaG9sZGVyIHRvIHNob3cgaW4gdGhlIGNvbWJvYm94LiBMZWF2ZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBiZWhhdmlvciBkZXRlcm1pbmVkXHJcblx0ICogYnkgd2hldGhlciBBZGQgTmV3IGlzIGVuYWJsZWRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgcGxhY2Vob2xkZXI6IHN0cmluZyA9ICcnO1xyXG5cclxuXHQvKiogT2JzZXJ2YWJsZSB0byBzdWJzY3JpYmUgdG8gd2hlbiB0aGUgY29tYm9ib3ggbWVudSBpcyBvcGVuZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovXHJcblx0QElucHV0KCkgcHVibGljIGxvYWRPbk9wZW5PYnNlcnZhYmxlPzogT2JzZXJ2YWJsZTxNZW51SXRlbVtdPiB8IHVuZGVmaW5lZDtcclxuXHJcblx0LyoqIERvIG5vdCBkaXNwbGF5IHRoZSB0b2dnbGUgYnV0dG9uIHdoZW4gdHJ1ZSAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBoaWRlVG9nZ2xlQnV0dG9uID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFsd2F5cyBzaG93IHRoZSBtZW51IHdoZW4gdGhlIGZvcm1Nb2RlbCBoYXMgYSB2YWx1ZS4gU2V0c1xyXG5cdCAqIGhpZGVUb2dnbGVCdXR0b24gdG8gdHJ1ZSBhbmQgbWVudVN0YXR1cyB0byB2aXNpYmxlIGFzIHdlbGwuXHJcblx0ICovXHJcblx0QElucHV0KCkgcHVibGljIGFsd2F5c09wZW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogQWRkaXRvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGVjLW1lbnUgZWxlbWVudFxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyBtZW51RWxlbWVudENsYXNzZXM6IE1lbnVIb3N0RWxlbWVudENsYXNzZXMgfCBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBBZGRpdGlvbmFsIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIC50ZXh0Ym94LWdyb3VwIGVsZW1lbnRcclxuXHQgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgdGV4dGJveEVsZW1lbnRDbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKiogSGlkZSAnTm8gbWF0Y2hlcycgbWVzc2FnZSB3aGVuIHRydWUgKi9cclxuXHRASW5wdXQoKSBwdWJsaWMgaGlkZU5vTWF0Y2hlczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuICAgKiBUZXh0IHRvIHNob3cgd2hlbiB0aGUgbWVudSBpcyBlbXB0eS4gXCJObyBtYXRjaGVzXCIgaXMgdGhlIGRlZmF1bHQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIG5vTWF0Y2hlc1RleHQ6IHN0cmluZyA9ICdOb01hdGNoZXNfU0MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBUcnVuY2F0ZSBtZW51IGl0ZW1zIHdoZW4gdHJ1ZVxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIHB1YmxpYyB0cnVuY2F0ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5vdGlmeSB0aGUgcGFyZW50IHRoYXQgdGhlIGFkZCBuZXcgYnV0dG9uIHdhcyBjbGlja2VkXHJcblx0ICogQHRvZG8gZGlzY3VzcyBpZiB3ZSBuZWVkIHRvIHNlbmQgYWxvbmcgdGhlIHZhbHVlIG9yIHNob3VsZFxyXG5cdCAqIHRoZSBwYXJlbnQgZ2V0IGl0IGZyb20gdGhlIGZvcm1Nb2RlbFxyXG5cdCAqIChsd2YgMjAxNy4wNy4xMyk6IEkgdGhpbmsgd2UgbWlnaHQgYXMgd2VsbCBzZW5kIHRoZSB2YWx1ZSBhbG9uZyBhbmRcclxuXHQgKiBsZWF2ZSBpdCB1cCB0byB0aGUgcGFyZW50IHRvIGRlY2lkZSBob3cgdG8gaGFuZGxlIGl0LlxyXG5cdCAqL1xyXG5cdEBPdXRwdXQoKSBwdWJsaWMgYWRkTmV3Q2xpY2s6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBOb3RpZnkgcGFyZW50IHdoZW4gdGV4dCB0eXBlZCBpbnRvIHRleHRib3hcclxuXHQgKi9cclxuXHRAT3V0cHV0KCkgcHVibGljIHNlYXJjaDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcblxyXG5cdEBWaWV3Q2hpbGQoJ3RleHRib3gnKSBwdWJsaWMgdGV4dGJveCE6IFRleHRib3hDb21wb25lbnQ7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEFjY2VzcyB0byB0aGUgbWVudSdzIGNvbXBvbmVudCB2aWEgdGhlICB7QGxpbmsgUG9wdXBDb250YWluZXJEaXJlY3RpdmV9XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChQb3B1cENvbnRhaW5lckRpcmVjdGl2ZSkgcHJpdmF0ZSBwb3B1cD86IFBvcHVwQ29udGFpbmVyRGlyZWN0aXZlO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRoZSBhZGQtbmV3IGJ1dHRvbiBlbGVtZW50XHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnYWRkTmV3QnV0dG9uJykgcHJpdmF0ZSBhZGROZXdCdXR0b24hOiBFbGVtZW50UmVmO1xyXG5cclxuXHJcblx0LyoqXHJcblx0ICogRmlsdGVyZWQgSXRlbXMgdG8gc2hvdyBpbiBjb21ib2JveCBtZW51XHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uczogQXJyYXk8TWVudUl0ZW0+ID0gW107XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3MgaWYgdGhlIG1lbnUgaXMgb3BlbiBvciBoaWRkZW5cclxuXHQgKi9cclxuXHRwdWJsaWMgbWVudVN0YXR1czogUG9wdXBTdGF0dXMgPSAnaGlkZGVuJztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFBsYWNlaG9sZGVyIHRvIGFzc2lnbiB0byB0ZXh0Ym94XHJcblx0ICovXHJcblx0cHVibGljIGVmZmVjdGl2ZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5LXNlbGVjdGVkIG1lbnUgaXRlbVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3RlZEl0ZW06IE1lbnVJdGVtIHwgbnVsbCA9IG51bGw7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtQ29udHJvbCBmb3IgdGhlIHRleHRib3hcclxuXHQgKi9cclxuXHRwdWJsaWMgdGV4dGJveEZvcm1Nb2RlbDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJyk7XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUcmFja3Mgd2hldGhlciB0aGUgYWRkIG5ldyBidXR0b24gaXMgc2VsZWN0ZWRcclxuXHQgKi9cclxuXHRwdWJsaWMgYWRkTmV3U2VsZWN0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFRyYWNrcyB3aGV0aGVyIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsIHZhbHVlIG1hdGNoZXMgYW4gaXRlbSBpbiB0aGUgZmlsdGVyZWRPcHRpb25zXHJcblx0ICovXHJcblx0cHVibGljIGZvdW5kTWF0Y2g6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogTnVtYmVyIG9mIGZpbHRlcmVkIG9wdGlvbnMgdG8gZGlzcGxheSBpbiB0aGUgZm9vdGVyLiAgRXhjbHVkZXMgaGVhZGluZ3MuXHJcblx0ICovXHJcblx0cHVibGljIGZpbHRlcmVkT3B0aW9uQ291bnQ6IG51bWJlciA9IDA7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQgb3B0aW9uc1xyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2VsZWN0ZWRJdGVtSW5kZXg6IG51bWJlciA9IC0xO1xyXG5cclxuXHQvKiogUGxhY2Vob2xkZXIgdGV4dCBmb3IgJ0Nob29zZSBvciBBZGQuLi4nICovXHJcblx0cHJpdmF0ZSBjaG9vc2VPckFkZFBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuXHJcblx0LyoqIFBsYWNlaG9sZGVyIHRleHQgZm9yICdDaG9vc2UnICovXHJcblx0cHJpdmF0ZSBjaG9vc2VQbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XHJcblxyXG5cdHByaXZhdGUgaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0Y29uc3RydWN0b3IoXHJcblx0XHRwcm90ZWN0ZWQgdmFsaWRhdGlvbk1lc3NhZ2VTZXJ2aWNlOiBWYWxpZGF0aW9uTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgZm9ybUdyb3VwSGVscGVyOiBGb3JtR3JvdXBIZWxwZXIsXHJcblx0XHRwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxyXG5cdFx0cHJvdGVjdGVkIHNjcm9sbFNlcnZpY2U6IFNjcm9sbFNlcnZpY2VcclxuXHQpIHtcclxuXHRcdHN1cGVyKHZhbGlkYXRpb25NZXNzYWdlU2VydmljZSwgZm9ybUdyb3VwSGVscGVyKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgYW5ndWxhciBvbkNoYW5nZXMgbGlmZWN5Y2xlIGV2ZW50XHJcblx0ICogQHNlZSBodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvbGlmZWN5Y2xlLWhvb2tzXHJcblx0ICovXHJcblx0cHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xyXG5cclxuXHRcdC8vIHdoZW4gb3B0aW9ucyBjaGFuZ2VzXHJcblx0XHRpZiAoY2hhbmdlcy5vcHRpb25zKSB7XHJcblx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblxyXG5cdFx0XHQvLyBVcGRhdGUgdGhlIHBvcHVwIHBvc2l0aW9uXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwKSB7XHJcblx0XHRcdFx0dGhpcy5wb3B1cC51cGRhdGUoKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIHVwZGF0ZSB2YWxpZGF0b3JzIG9uIHRoZSB0ZXh0Ym94XHJcblx0XHRpZiAoY2hhbmdlcy5yZXF1aXJlZCB8fCBjaGFuZ2VzLm1pbmxlbmd0aCB8fCBjaGFuZ2VzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR0aGlzLnNldFRleHRib3hGb3JtTW9kZWxWYWxpZGF0b3JzKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHBsYWNlaG9sZGVyIHRleHQgd2hlbiAnQWRkIE5ldycgaXMgY29uZGl0aW9uYWwuXHJcblx0XHQvLyBuZ09uQ2hhbmdlcygpIGtpY2tzIG9mZiBiZWZvcmUgbmdPbkluaXQsIHNvIGluIG9yZGVyXHJcblx0XHQvLyB0byBub3Qgb3ZlcndyaXRlIGEgdXNlci1wcm92aWRlZCBwbGFjZWhvbGRlciwgZG8gbm90XHJcblx0XHQvLyB1cGRhdGUgcGxhY2Vob2xkZXIgb24gZmlyc3QgY2hhbmdlIChuZ09uSW5pdCB3aWxsIHRha2UgY2FyZSBvZiBpdCkuXHJcblx0XHRpZiAoKGNoYW5nZXMuYWRkTmV3ICYmICFjaGFuZ2VzLmFkZE5ldy5pc0ZpcnN0Q2hhbmdlKCkpIHx8IGNoYW5nZXMucGxhY2Vob2xkZXIpIHtcclxuXHRcdFx0dGhpcy51cGRhdGVQbGFjZWhvbGRlclRleHQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBhbmd1bGFyIG9uSW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHN1cGVyLm5nT25Jbml0KCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuYWx3YXlzT3Blbikge1xyXG5cdFx0XHR0aGlzLmhpZGVUb2dnbGVCdXR0b24gPSB0cnVlO1xyXG5cdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSAndmlzaWJsZSc7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gR2V0IHRyYW5zbGF0ZWQgcGxhY2Vob2xkZXIgdGV4dFxyXG5cdFx0dGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlIG9yIGFkZCcpfS4uLmA7XHJcblx0XHR0aGlzLmNob29zZVBsYWNlaG9sZGVyID0gYCR7dGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQ2hvb3NlJyl9YDtcclxuXHJcblx0XHR0aGlzLmZvcm1Nb2RlbENoYW5nZWQodGhpcy5mb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0dGhpcy5zZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpO1xyXG5cclxuXHRcdC8vIEVycm9ycyBmb3IgdGhpcyBjb21wb25lbnQgYXJlIGRpc3BsYXllZCB2aWEgdGhlIHZhbGlkYXRpb25FcnJvcnMgcHJvcGVydHksIHdoaWNoIGlzXHJcblx0XHQvLyBwb3B1bGF0ZWQgd2hlbiB0cmFuc2xhdGVWYWxpZGF0aW9uTWVzc2FnZXMgaXMgcnVuLlxyXG5cdFx0Ly8gV2hlbiB0aGUgaW50ZXJuYWwgVGV4dGJveENvbXBvbmVudCBoYXMgdmFsaWRhdGlvbiBlcnJvcnMsIHdlIHNldCB0aGVtIG9uIHRoZVxyXG5cdFx0Ly8gZm9ybU1vZGVsIGFzIHdlbGwuICBUaGlzIHVwZGF0ZXMgdGhlIHZhbGlkaXR5IG9mIG91ciBDb21ib2JveENvbXBvbmVudCBjb250cm9sLFxyXG5cdFx0Ly8gYnV0IGRvZXMgbm90IHRyaWdnZXIgdHJhbnNsYXRpb24uICBTdWJzY3JpYmUgdG8gc3RhdHVzQ2hhbmdlcyBoZXJlIHNvIGNvbXBvbmVudFxyXG5cdFx0Ly8gdmFsaWRhdGlvbiBlcnJvcnMgd2lsbCBhcHBlYXIgYWxvbmcgd2l0aCB0aGUgQ29tYm9ib3hDb21wb25lbnQncyBsYWJlbC5cclxuXHRcdHRoaXMuZm9ybU1vZGVsLnZhbHVlQ2hhbmdlcy5waXBlKFxyXG5cdFx0XHR0YWtlVW50aWwodGhpcy5jb21wb25lbnREZXN0cm95ZWQpXHJcblx0XHQpLnN1YnNjcmliZShkYXRhID0+IHRoaXMuZm9ybU1vZGVsQ2hhbmdlZChkYXRhKSk7XHJcblxyXG5cdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnN0YXR1c0NoYW5nZXMucGlwZShcclxuXHRcdFx0dGFrZVVudGlsKHRoaXMuY29tcG9uZW50RGVzdHJveWVkKVxyXG5cdFx0KS5zdWJzY3JpYmUoZGF0YSA9PiB0aGlzLnNldEZvcm1Nb2RlbFZhbGlkYXRpb25FcnJvcnMoZGF0YSkpO1xyXG5cclxuXHRcdC8vIGRlZmF1bHQgcGxhY2Vob2xkZXJcclxuXHRcdHRoaXMudXBkYXRlUGxhY2Vob2xkZXJUZXh0KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGFuZ3VsYXIgYWZ0ZXJWaWV3SW5pdCBsaWZlY3ljbGUgaG9va1xyXG5cdCAqIEBzZWUgaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2xpZmVjeWNsZS1ob29rc1xyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8vIGFsbG93IG92ZXJmbG93IG91dCBvZiB0aGUgc2Nyb2xsUGFyZW50XHJcblx0XHQvLyBwcmV2ZW50cyBtZW51IGZyb20gb2JzY3VyaW5nIHRoZSBjb21ib2JveFxyXG5cdFx0bGV0IHBvcHBlck9wdGlvbnM6IFBvcHBlci5Qb3BwZXJPcHRpb25zID0ge1xyXG5cdFx0XHRtb2RpZmllcnM6IHtcclxuXHRcdFx0XHRwcmV2ZW50T3ZlcmZsb3c6IHtcclxuXHRcdFx0XHRcdGJvdW5kYXJpZXNFbGVtZW50OiAndmlld3BvcnQnXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9O1xyXG5cclxuXHRcdC8vIGNvbnZlcnQgdGhlIENvbWJvYm94TWVudVBvc2l0aW9uIGludG8gYSBQb3BwZXJQbGFjZW1lbnRcclxuXHRcdHN3aXRjaCAodGhpcy5tZW51UG9zaXRpb24pIHtcclxuXHRcdFx0Y2FzZSAoXCJ0b3BfbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3Atc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcInRvcF9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICd0b3AtZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSAoXCJib3R0b21fbGVmdFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tc3RhcnQnO1xyXG5cdFx0XHRcdGJyZWFrO1xyXG5cdFx0XHRjYXNlIChcImJvdHRvbV9yaWdodFwiKTpcclxuXHRcdFx0XHRwb3BwZXJPcHRpb25zLnBsYWNlbWVudCA9ICdib3R0b20tZW5kJztcclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0ZGVmYXVsdDpcclxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbWVudVBvc2l0aW9uIGZvciBDb21ib2JveENvbXBvbmVudC5gKVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIFNjcm9sbCB0aGUgbWVudSB0byB0aGUgc2VsZWN0ZWQgaXRlbSBvbmNlIHRoZSBwb3B1cCBtZW51IGlzIHJlYWR5XHJcblx0XHRwb3BwZXJPcHRpb25zLm9uQ3JlYXRlID0gKCkgPT4ge1xyXG5cdFx0XHR0aGlzLnNjcm9sbE1lbnUoKTtcclxuXHJcblx0XHRcdGlmICh0aGlzLnBvcHVwRml4ZWQpIHtcclxuXHRcdFx0XHR0aGlzLnBvcHVwIS5maXhQb3NpdGlvbigpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMucG9wdXBGaXhlZCkge1xyXG5cdFx0XHRwb3BwZXJPcHRpb25zLm9uVXBkYXRlID0gKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMucG9wdXAhLmZpeFBvc2l0aW9uKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnBvcHVwLnBvcHBlck9wdGlvbnMgPSBwb3BwZXJPcHRpb25zO1xyXG5cclxuXHRcdHRoaXMucG9wdXAucG9wcGVyU3RhdHVzQ2hhbmdlLnBpcGUoXHJcblx0XHRcdHRha2VVbnRpbCh0aGlzLmNvbXBvbmVudERlc3Ryb3llZClcclxuXHRcdCkuc3Vic2NyaWJlKChldmVudDogJ3Zpc2libGUnIHwgJ2hpZGRlbicpID0+IHtcclxuXHRcdFx0XHR0aGlzLm1lbnVTdGF0dXMgPSBldmVudDtcclxuXHJcblx0XHRcdFx0Ly8gU3luY2hyb25pemUgdGhlIGZvcm1Nb2RlbCBhbmQgdGV4dEZvcm1Nb2RlbCB2YWx1ZXMgd2hlbiB0aGVcclxuXHRcdFx0XHQvLyBwb3B1cCBtZW51IGNsb3NlcyBhbmQgdW4tZmlsdGVyIHRoZSBvcHRpb25zIGFuZCByZXNldCB0aGVcclxuXHRcdFx0XHQvLyBzZWxlY3RlZEl0ZW0gYW5kIGluZGV4XHJcblx0XHRcdFx0aWYgKGV2ZW50ID09PSAnaGlkZGVuJykge1xyXG5cdFx0XHRcdFx0dGhpcy5zeW5jTW9kZWxWYWx1ZXMoKTtcclxuXHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTZXQgZXJyb3JzIG9uIHRoZSB0ZXh0Ym94Rm9ybU1vZGVsLCB3aGljaCB3aWxsIHRoZW4gc2V0IGVycm9ycyBvbiB0aGVcclxuXHQgKiBmb3JtTW9kZWwuIEFsc28gbWFyayB0aGUgZm9ybU1vZGVsIGFzIHRvdWNoZWQgdG8gZGlzcGxheSBhbnkgZXJyb3JzLlxyXG5cdCAqIEBwYXJhbSBlcnJvcnMga2V5KHMpIG9mIFZhbGlkYXRpb25NZXNzYWdlU2VydmljZSBlcnJvcnMgdG8gZGlzcGxheSBvciByZW1vdmVcclxuXHQgKiBAbWVtYmVyb2YgQ29tb2JvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHNldEVycm9ycyhlcnJvcnM6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9KTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0RXJyb3JzKGVycm9ycyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogVW5maWx0ZXIgb3B0aW9ucyBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW0gYW5kIHNlbGVjdGVkSXRlbUluZGV4XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIHJlc2V0T3B0aW9ucyhvcHRpb25zPzogTWVudUl0ZW1bXSk6IHZvaWQge1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbnMgPSBvcHRpb25zIHx8IHRoaXMub3B0aW9ucztcclxuXHRcdC8vIGRvIG5vdCBjb3VudCBoZWFkaW5nc1xyXG5cdFx0dGhpcy5maWx0ZXJlZE9wdGlvbkNvdW50ID0gdGhpcy5maWx0ZXJlZE9wdGlvbnM/LmZpbHRlcihvID0+IG8uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKS5sZW5ndGggfHwgMDtcclxuXHJcblx0XHQvL2lmIHRoZXkgaGF2ZSBubyBzZWFyY2ggdGVybSwgZG9uJ3QgdHJ5IHRvIHNlbGVjdCBhbnl0aGluZyBzbyB0aGV5IGNhbiBjbGVhciB0aGUgYm94IG91dCBieSBoaXR0aW5nIGVudGVyXHJcblx0XHQvL2lmIHRoZXkgaGF2ZSBhIHNlYXJjaCB0ZXJtIGFuZCB0aGUgb3B0aW9ucyBjaGFuZ2VkLCBzZWxlY3QgYW4gb3B0aW9uIGZyb20gdGhlIG1lbnUgc28gdGhleSB3aWxsIGdldCBpdCBhdXRvbWF0aWNhbGx5IGlmIHRoZXkgaGl0IGVudGVyXHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlICE9PSAnJykge1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kRGVmYXVsdFNlbGVjdGlvbkluZGV4KHRoaXMuZmlsdGVyZWRPcHRpb25zLCB0aGlzLnRleHRib3hGb3JtTW9kZWwudmFsdWUpO1xyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdIHx8IG51bGw7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSh0aGlzLnNlbGVjdGVkSXRlbUluZGV4KTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdC8vaWYgdGhleSBoYXZlIG5vIHNlYXJjaCB0ZXJtIGFuZCB0aGUgb3B0aW9ucyBhcmUgcmVzZXQsIGRvbid0IGF1dG8tcGljayB0aGUgZmlyc3Qgb25lXHJcblx0XHRcdC8vc28gdGhhdCBlbnRlciB3aWxsIGFsbG93IHRoZW0gdG8gd2lwZSBvdXQgdGhlaXIgbGFzdCBzZWxlY3Rpb25cclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlzdGVuIHRvIHRoZSBzZWxlY3RlZCBjaGFuZ2VkIGV2ZW50IGZyb20ge0BsaW5rIE1lbnVDb21wb25lbnR9IGFuZCB1cGRhdGUgdGhlIGZvcm1cclxuXHQgKiBtb2RlbCBhbmQgY2xvc2UgbWVudVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZWxlY3RlZENoYW5nZWQoaXRlbTogTWVudUl0ZW0pOiB2b2lkIHtcclxuXHRcdHRoaXMuc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbSk7XHJcblx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBTaG93IGFuZCBoaWRlIHRoZSBwb3B1cCBtZW51XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwdWJsaWMgdG9nZ2xlTWVudShldmVudD86IEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAoIXRoaXMucG9wdXApIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmIChldmVudCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAoIXRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdC8vIFdoZW4gdGhlIHBvcHVwIGlzIGhpZGRlbiBpdCB3aWxsIGVtaXQgaXRzIGNoYW5nZWQgc3RhdHVzIGFuZFxyXG5cdFx0XHRcdC8vIHdlIHdpbGwgcmVzZXQgdmFsdWVzIGlmIG5lZWQgYmUuXHJcblx0XHRcdFx0dGhpcy5wb3B1cC5oaWRlKCk7XHJcblx0XHRcdH1cclxuXHRcdFx0ZWxzZSB7XHJcblx0XHRcdFx0aWYgKHRoaXMubG9hZE9uT3Blbk9ic2VydmFibGUgJiYgIXRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4pIHtcclxuXHRcdFx0XHRcdHRoaXMucGVuZGluZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdFx0dGhpcy5sb2FkT25PcGVuT2JzZXJ2YWJsZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgocmVzdWx0OiBNZW51SXRlbVtdKSA9PiB7XHJcblx0XHRcdFx0XHRcdHRoaXMuaGFzRGF0YUJlZW5Mb2FkZWRPbk9wZW4gPSB0cnVlO1xyXG5cclxuXHRcdFx0XHRcdFx0dGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcblx0XHRcdFx0XHRcdHRoaXMub3B0aW9ucyA9IHJlc3VsdDtcclxuXHJcblx0XHRcdFx0XHRcdHRoaXMucmVzZXRPcHRpb25zKCk7XHJcblx0XHRcdFx0XHRcdHRoaXMucG9wdXAhLnNob3coKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHR0aGlzLnBvcHVwLnNob3coKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogQ29udHJvbCB0aGUgbWVudSB3aXRoIGtleWJvYXJkIG5hdmlnYXRpb25cclxuXHQgKlxyXG5cdCAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2tleSNFeGFtcGxlIHwgS2V5Ym9hcmRFdmVudC5rZXl9XHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0tleWJvYXJkRXZlbnQva2V5L0tleV9WYWx1ZXMgfCBLZXkgVmFsdWVzfVxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIGtleU5hdmlnYXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XHJcblx0XHRcdGNhc2UgXCJVcFwiOlxyXG5cdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG5cdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0dGhpcy5vbkFycm93RG93blVwKGV2ZW50KTtcclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJCYWNrc3BhY2VcIjpcclxuXHRcdFx0Y2FzZSBcIkRlbGV0ZVwiOlxyXG5cdFx0XHRjYXNlIFwiRGVsXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdHRoaXMudG9nZ2xlTWVudSgpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdFx0Y2FzZSBcIlRhYlwiOlxyXG5cdFx0XHRcdC8vIElmIHRhYmJpbmcgZnJvbSB0aGUgdGV4dGJveCB0byB0aGUgYnV0dG9uLCBvdmVycmlkZSB0aGUgdGV4dGJveCBhcyBiZWluZ1xyXG5cdFx0XHRcdC8vIG1hcmtlZCB0b3VjaGVkIHNvIHdlIGRvbid0IHNlZSB0aGUgaW52YWxpZCBzdGF0ZS4gT25seSBzaG93IHRoZSBpbnZhbGlkIHN0YXRlXHJcblx0XHRcdFx0Ly8gd2hlbiB0YWJiaW5nIG91dCBvZiBjb21ib2JveCBmcm9tIHRoZSBidXR0b24gb3IgYmFjayB0YWJiaW5nIGZyb20gdGhlIHRleHRib3hcclxuXHRcdFx0XHQvLyBpZiAoZXZlbnQua2V5ID09PSAnVGFiJyAmJiBldmVudC5zcmNFbGVtZW50ICYmIGV2ZW50LnNyY0VsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xyXG5cdFx0XHRcdC8vIFx0aWYgKGV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5tYXJrQXNUb3VjaGVkKCk7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH0gZWxzZSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH1cclxuXHRcdFx0XHQvLyB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgZXZlbnQuc3JjRWxlbWVudCAmJiBldmVudC5zcmNFbGVtZW50LnRhZ05hbWUgPT09ICdCVVRUT04nKSB7XHJcblx0XHRcdFx0Ly8gXHRpZiAoIWV2ZW50LnNoaWZ0S2V5KSB7XHJcblx0XHRcdFx0Ly8gXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdFx0XHQvLyBcdH1cclxuXHRcdFx0XHQvLyB9XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICd2aXNpYmxlJykge1xyXG5cdFx0XHRcdFx0Ly9pZiB0aGUgc2VsZWN0ZWQgb3B0aW9uIGlzIHRoZSBhZGQgbmV3IGJ1dHRvbiBsZXQgaXQgZmlyZSBidXQgZG9uJ3QgYWxsb3dcclxuXHRcdFx0XHRcdC8vdGhlIHRhYiBldmVudCB0byBjYXJyeSB0aGVtIGZvcndhcmQgZnJvbSB3aGVyZXZlciB0aGV5IGxhbmQgLSB0aGV5IHdvdWxkIHNraXAgdGhlIGZpcnN0IGJveCBvbiB0aGUgYWRkIG5ldyBmb3JtXHJcblx0XHRcdFx0XHQvL0luIHRoZSBub3JtYWwgY2FzZSB3ZSB3YW50IHRvIGFsbG93IHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9yIHRoZXkgd29uJ3QgYmUgYWJsZSB0byB0YWIgb3V0IG9mIHRoZSBjb250cm9sIGF0IGFsbC5cclxuXHRcdFx0XHRcdGlmKHRoaXMuYWRkTmV3U2VsZWN0ZWQpe1xyXG5cdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiRW50ZXJcIjpcclxuXHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdHRoaXMuY29tbWl0U2VsZWN0aW9uKGV2ZW50KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRjYXNlIFwiRXNjYXBlXCI6XHJcblx0XHRcdGNhc2UgXCJFc2NcIjpcclxuXHRcdFx0XHRpZiAodGhpcy5tZW51U3RhdHVzID09PSAndmlzaWJsZScpIHtcclxuXHRcdFx0XHRcdC8vIEp1c3QgY2xvc2UgdGhlIG1lbnUsIGRvIG5vdCBmb2N1cyB0aGUgbmV4dCBlbGVtZW50IG9uIHRhYlxyXG5cdFx0XHRcdFx0Ly8gdW5sZXNzIHRoZSBtZW51IGlzIGhpZGRlblxyXG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0XHQvLyBDbG9zZSB0aGUgbWVudSBiZWZvcmUgd2UgcmVzZXQgc2VsZWN0ZWRJdGVtIHNvIHdlIGRvbid0IHNlZSB0aGUgaGlnaGxpZ2h0IGNoYW5naW5nXHJcblx0XHRcdFx0XHQvLyB3aGVuIHJlc2V0IHRoZSBzZWxlY3RlZCBpdGVtIGJhY2sgdG8gdGhlIGZvcm1Nb2RlbFxyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0Y2FzZSBcIiBcIjpcclxuXHRcdFx0Y2FzZSBcIlNwYWNlYmFyXCI6XHJcblx0XHRcdFx0aWYgKHRoaXMubWVudVN0YXR1cyA9PT0gJ2hpZGRlbicpIHtcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnRvZ2dsZU1lbnUoKTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nICYmIGV2ZW50LmtleSAhPT0gJ1NoaWZ0Jykge1xyXG5cdFx0XHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRicmVhaztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZhY2lsaXRhdGVzIGFkZGluZyBpdGVtcyB0byBhIGNvbWJvYm94XHJcblx0ICpcclxuXHQgKiBAcGFyYW0gYWRkRm4gRnVuY3Rpb24gZnJvbSBwYXJlbnQgdGhhdCBzaG91bGQgbWFrZSBhbiBBUEkgcmVxdWVzdCB0byBhZGQgYSBuZXcgaXRlbSB0byB0aGUgY29tYm9ib3gncyBvcHRpb25zXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIGFzeW5jIGFkZE5ld0l0ZW0oYWRkRm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IGFkZEZuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIC8vIFdlIGdhdmUgaXQgb3VyIGJlc3QgdHJ5LCBzb21ldGhpbmcgaXMgcmVhbGx5IHdoYWNrLCBzbyBsZXQncyBqdXN0IHNldCB0aGUgZXJyb3JcclxuICAgICAgICAgICAgdGhpcy5zZXRFcnJvcnMoeyAnYWRkbmV3JzogdHJ1ZSB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy50b2dnbGVNZW51KCk7XHJcbiAgICB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZpZ3VyZSBvdXQgd2hldGhlciB0aGV5IGFyZSBhZGRpbmcgbmV3IG9yIGhhdmUgYW4gaXRlbSBzZWxlY3RlZCwgYW5kIGNvbW1pdCBpdCB0byB0aGUgZm9ybSBtb2RlbFxyXG5cdCAqL1xyXG4gIHByaXZhdGUgY29tbWl0U2VsZWN0aW9uKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuXHRcdFx0dGhpcy5vbkFkZE5ldyhldmVudCk7XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuXHRcdFx0dGhpcy50b2dnbGVNZW51KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZW5kIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSB0ZXh0Ym94IHRvIHRoZSBwYXJlbnQgd2hlbiB0aGUgYWRkIG5ldyBidXR0b24gaXNcclxuXHQgKiBjbGlja2VkXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXZlbnQgQWRkIG5ldyBidXR0b24gY2xpY2sgb3IgZW50ZXIga2V5IGV2ZW50XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHVibGljIG9uQWRkTmV3KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG5cdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcblx0XHR0aGlzLmFkZE5ld1NlbGVjdGVkID0gZmFsc2U7XHJcblx0XHR0aGlzLmFkZE5ld0NsaWNrLmVtaXQodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKTtcclxuXHRcdHRoaXMucG9wdXA/LmhpZGUoKTtcclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBOYXZpZ2F0ZSB0aGUgZHJvcGRvd24gbWVudSB1c2luZyB1cCBhbmQgZG93biBhcnJvdyBrZXlzXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZXZlbnQgVXAgb3IgZG93biBhcnJvdyBrZXlkb3duIGV2ZW50XHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBvbkFycm93RG93blVwKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XHJcblx0XHRzd2l0Y2ggKGV2ZW50LmtleSkge1xyXG5cdFx0XHRjYXNlIFwiQXJyb3dEb3duXCI6XHJcblx0XHRcdGNhc2UgXCJEb3duXCI6XHJcblxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgIXRoaXMuYWRkTmV3U2VsZWN0ZWQpIHtcclxuXHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA8IHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAtIDEpIHtcclxuXHRcdFx0XHRcdGlmICh0aGlzLmFkZE5ld1NlbGVjdGVkKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSBmYWxzZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdC8vaWYgdGhlIGxhc3QgaXRlbSBpcyBhIGhlYWRpbmcgYW5kIHdlIGFyZSBvbiB0aGUgc2Vjb25kIGxhc3QgaXRlbSwgd2Ugc2hvdWxkbid0IGluY3JlbWVudCB0aGUgc2VsZWN0ZWRJdGVtSW5kZXggYmVjYXVzZSB0aGF0IHdvdWxkIHNlbGVjdCB0aGUgaGVhZGluZ1xyXG5cdFx0XHRcdFx0aWYoICEodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAyICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrMV0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSApIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCsrO1xyXG5cdFx0XHRcdFx0XHQvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPCB0aGlzLmZpbHRlcmVkT3B0aW9ucy5sZW5ndGggLSAxICYmIHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdLmRpc3BsYXkgPT09ICdoZWFkaW5nJykge1xyXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgrKztcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH1cclxuXHRcdFx0XHRicmVhaztcclxuXHJcblx0XHRcdGNhc2UgXCJBcnJvd1VwXCI6XHJcblx0XHRcdGNhc2UgXCJVcFwiOlxyXG5cdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID09PSAtMSAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4gJiYgdGhpcy5hZGROZXdTZWxlY3RlZCkge1xyXG5cdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA+IC0xKSB7XHJcblx0XHRcdFx0XHRpZiAodGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9PT0gMCAmJiB0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IHRydWU7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4LS07XHJcblx0XHRcdFx0XHQvLyBTa2lwIGFueSBpbi1tZW51IGhlYWRpbmcgaXRlbXNcclxuXHRcdFx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID4gLTEgJiYgdGhpcy5maWx0ZXJlZE9wdGlvbnNbdGhpcy5zZWxlY3RlZEl0ZW1JbmRleF0uZGlzcGxheSA9PT0gJ2hlYWRpbmcnKSB7XHJcblx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXgtLTtcclxuXHJcblx0XHRcdFx0XHRcdC8vaWYgdGhlIHNlbGVjdGVkSXRlbUluZGV4IGlzIC0xLCB0aGF0IG1lYW5zIHRoZSB2ZXJ5IGZpcnN0IGl0ZW0gd2FzIGEgaGVhZGluZyBhbmQgd2UganVzdCBza2lwcGVkIG92ZXIgaXQuXHJcblx0XHRcdFx0XHRcdGlmKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPT0gLTEpIHtcclxuXHRcdFx0XHRcdFx0XHQvL2lmIHRoZXJlIGlzIGFuIGFkZCBuZXcgYnV0dG9uIHdlIHNob3VsZCBzZWxlY3QgaXQuIG90aGVyd2lzZSB3ZSBzaG91bGQgbG9jayB0aGVtIGF0IGluZGV4IDEgKHJpZ2h0IGJlZm9yZSB0aGUgaGVhZGluZylcclxuXHRcdFx0XHRcdFx0XHRpZih0aGlzLmFkZE5ld0J1dHRvbiAmJiAhdGhpcy5hZGROZXdCdXR0b24ubmF0aXZlRWxlbWVudC5oaWRkZW4pIHtcclxuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYWRkTmV3U2VsZWN0ZWQgPSB0cnVlO1xyXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gMTtcclxuXHRcdFx0XHRcdFx0XHR9XHJcblx0XHRcdFx0XHRcdH1cclxuICAgICAgICAgIFx0XHRcdH1cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWs7XHJcblxyXG5cdFx0XHRkZWZhdWx0OlxyXG5cdFx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cclxuXHRcdGlmICh0aGlzLm1lbnVTdGF0dXMgPT09ICdoaWRkZW4nKSB7XHJcblxyXG5cdFx0XHR0aGlzLnNldEZvcm1Nb2RlbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdHRoaXMuc2Nyb2xsTWVudSgpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblxyXG5cclxuXHQvKipcclxuXHJcblx0ICogRmlsdGVyIGFycmF5IG9mIG9wdGlvbnMgYnkgbGFiZWwgb3IgY2FwdGlvbiAoY29udGFpbnMpXHJcblx0ICpcclxuXHQgKiBAcGFyYW0gZmlsdGVyVGV4dCBUaGUgdmFsdWUgb2YgdGV4dGJveCB0aGF0IHdlIHdpbGwgZmlsdGVyIG91ciBvcHRpb25zIGJ5XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbHRlck9wdGlvbnNBcnJheShmaWx0ZXJUZXh0OiBzdHJpbmcpOiBBcnJheTxNZW51SXRlbT4ge1xyXG5cdFx0bGV0IHNlYXJjaFRleHQgPSBmaWx0ZXJUZXh0LnRvTG93ZXJDYXNlKCk7XHJcblx0XHRpZiAoZmlsdGVyVGV4dCAmJiBmaWx0ZXJUZXh0ICE9PSAnJykge1xyXG5cdFx0XHRyZXR1cm4gdGhpcy5vcHRpb25zLmZpbHRlcihpdGVtID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluZGV4T2Yoc2VhcmNoVGV4dCkgPj0gMCB8fCBcclxuXHRcdFx0XHRcdFx0KGl0ZW0uY2FwdGlvbiAmJiBpdGVtLmNhcHRpb24udG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQpID49IDApO1xyXG5cdFx0XHR9KVxyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMub3B0aW9ucztcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBGaW5kIGEgZ2l2ZW4gaXRlbSdzIGluZGV4IGluIHRoZSBmaWx0ZXJlZCBpdGVtcyBhcnJheS5cclxuXHQgKlxyXG5cdCAqIFJldHVybnMgLTEgaWYgbm90IGZvdW5kXHJcblx0ICogQHBhcmFtIGl0ZW0gVGhlIG1hdGNoaW5nIGl0ZW0gdG8gZmluZCBpbiB0aGVcclxuXHQgKiBmaWx0ZXJkT3B0aW9ucyBhcnJheS4gV2lsbCB1c2UgdGhlIHNlbGVjdGVkSXRlbSBpZiBub3RoaW5nIGlzIHBhc3NlZC5cclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIGZpbmRTZWxlY3RlZEl0ZW1JbmRleChpdGVtPzogTWVudUl0ZW0pOiBudW1iZXIge1xyXG5cdFx0bGV0IGl0ZW1Ub0ZpbmQgPSBpdGVtID8gaXRlbSA6IHRoaXMuc2VsZWN0ZWRJdGVtO1xyXG5cclxuXHRcdGlmIChpdGVtVG9GaW5kKSB7XHJcblx0XHRcdHJldHVybiB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kSW5kZXgoaXRlbSA9PiB7XHJcblx0XHRcdFx0aWYoaXRlbS5pZCAmJiAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmlkKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gaXRlbS5sYWJlbCA9PT0gKDxNZW51SXRlbT5pdGVtVG9GaW5kKS5sYWJlbCAmJiBpdGVtLmlkID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmlkXHJcblx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdHJldHVybiBpdGVtLmxhYmVsID09PSAoPE1lbnVJdGVtPml0ZW1Ub0ZpbmQpLmxhYmVsO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIC0xO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlYWN0IHRvIG91ciBmb3JtTW9kZWwgY2hhbmdpbmdcclxuXHQgKlxyXG5cdCAqIFRoZSBmb3JtTW9kZWwgcmVwcmVzZW50cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIE1vZGVsSXRlbVxyXG5cdCAqIFdoZW4gY2hhbmdlZCwgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgVGV4dGJveENvbXBvbmVudCBhbmRcclxuXHQgKiBmaW5kIGluZGV4IG9mIGl0ZW0gaW4gb3B0aW9ucyBsaXN0LlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBmb3JtTW9kZWxDaGFuZ2VkKGRhdGE/OiBNZW51SXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5zeW5jaHJvbml6ZURpc2FibGVkQXR0cmlidXRlcygpO1xyXG5cclxuXHRcdGlmIChkYXRhKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZShkYXRhLnNlbGVjdGVkTGFiZWwgfHwgZGF0YS5sYWJlbCk7XHJcblxyXG5cdFx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gdGhpcy5maW5kU2VsZWN0ZWRJdGVtSW5kZXgoZGF0YSk7XHJcblx0XHRcdGlmICh0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID49IDApIHtcclxuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IHRoaXMuZmlsdGVyZWRPcHRpb25zW3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXhdO1xyXG5cdFx0XHR9XHJcblx0XHR9IGVsc2Uge1xyXG5cdFx0XHQvL1RoZSBob3N0IHdpcGVkIG91dCB0aGUgZGF0YSBleHRlcm5hbGx5LCBjbGVhciB0aGUgdGV4dGJveCBhbmQgdGhlIHRyYWNraW5nIHN0YXRlXHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5yZXNldCgpO1xyXG5cdFx0XHR0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2Nyb2xsIHRoZSBtZW51IGlmIHRoZSBjdXJyZW50IHNlbGVjdGVkSXRlbUluZGV4IGlzIG91dCBvZiB2aWV3XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNjcm9sbE1lbnUoa25vd25JbmRleD86IG51bWJlcik6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZmlsdGVyZWRPcHRpb25zLmxlbmd0aCA+IDApIHtcclxuXHRcdFx0Ly8gVXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleCBpbiBjYXNlIG91ciBvcHRpb25zIGNoYW5nZWRcclxuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1JbmRleCA9IGtub3duSW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuZmluZFNlbGVjdGVkSXRlbUluZGV4KCkgOiBrbm93bkluZGV4O1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuc2VsZWN0ZWRJdGVtSW5kZXggPiAtMSAmJiB0aGlzLnNlbGVjdGVkSXRlbSkge1xyXG5cdFx0XHRcdC8vIFRoZSBtZW51IGNvbXBvbmVudCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgaWRzIGZvciB0aGUgbWVudSBpdGVtcyBpZiB0aGV5IGRvbnQgaGF2ZSB0aGVtLFxyXG5cdFx0XHRcdC8vIHNvIHRoZXkgbmVlZCB0byBiZSBhY2NvdW50ZWQgZm9yIGhlcmUgc2luY2UgdGhlIGNvbWJvYm94IGRvZXNuJ3Qga25vdyBhYm91dCB0aG9zZSBpZHNcclxuXHRcdFx0XHRsZXQgaXRlbVNlbGVjdG9yID0gdGhpcy5zZWxlY3RlZEl0ZW0uaWQgPyBgIyR7dGhpcy5zZWxlY3RlZEl0ZW0uaWR9YCA6IGAjJHt0aGlzLmlkfV9tZW51X2l0ZW0ke3RoaXMuc2VsZWN0ZWRJdGVtSW5kZXh9YDtcclxuXHJcblx0XHRcdFx0Ly90cmlnZ2VyIHRoZSBzY3JvbGxpbmcgYWZ0ZXIgYSB0aWNrIHRvIGFsbG93IHRoZSBtZW51IHRvIGJlIHVwIHRvIGRhdGUgKGFuZCBwZW5kaW5nIG1hc2sgY2xlYXJlZCkgYmVmb3JlIG1lYXN1cmluZ1xyXG5cdFx0XHRcdHNldFRpbWVvdXQoKCk9PntcclxuXHRcdFx0XHRcdHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxJdGVtQ2VudGVyZWQoYCMke3RoaXMuaWR9X21lbnVfbGlzdGAsIGl0ZW1TZWxlY3Rvcik7XHJcblx0XHRcdFx0fSwgMCk7XHJcblx0XHRcdH0gZWxzZSB7XHJcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW0gPSBudWxsO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoL0ZpbHRlciBiYXNlZCBvbiB0ZXh0Ym94IGlucHV0XHJcblx0ICogTk9URTogc28gYXMgbm90IHRvIHJlY2VpdmUgYSBub3RpZmljYXRpb24gb24gZXZlcnkga2V5IGV2ZW50LCB3ZSBzdWdnZXN0IHlvdSBkZWJvdW5jZSB5b3VyXHJcblx0ICogc3Vic2NyaXB0aW9uXHJcblx0ICogQHNlZSB7QGxpbmsgaHR0cDovL3JlYWN0aXZleC5pby9yeGpzL2NsYXNzL2VzNi9PYnNlcnZhYmxlLmpzfk9ic2VydmFibGUuaHRtbCNpbnN0YW5jZS1tZXRob2QtZGVib3VuY2VUaW1lIHwgT2JzZXJ2YWJsZS5kZWJvdW5jZVRpbWV9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHNlYXJjaEFuZEZpbHRlcihzZWFyY2hUZXh0Pzogc3RyaW5nKTogdm9pZCB7XHJcblxyXG5cdFx0Ly8gYWx3YXlzIGVtaXRcclxuXHRcdHRoaXMuc2VhcmNoLmVtaXQoc2VhcmNoVGV4dCk7XHJcblxyXG5cdFx0Ly8gZG8gaW50ZXJuYWwgZmlsdGVyaW5nIGlmIG5vIG9uZSdzIHN1YnNjcmliZWQgdG8gb3VyIHNlYXJjaCBlbWl0dGVyXHJcblx0XHRpZiAodGhpcy5zZWFyY2gub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hUZXh0ICE9PSB1bmRlZmluZWQpIHtcclxuXHRcdFx0dGhpcy5yZXNldE9wdGlvbnModGhpcy5maWx0ZXJPcHRpb25zQXJyYXkoc2VhcmNoVGV4dCkpO1xyXG5cclxuXHRcdFx0aWYgKHRoaXMuYWRkTmV3U2VsZWN0ZWQgJiYgIXRoaXMuYWRkTmV3QnV0dG9uKSB7XHJcblx0XHRcdFx0dGhpcy5hZGROZXdTZWxlY3RlZCA9IGZhbHNlO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHtAbGluayBmb3JtTW9kZWwgfSdzIHZhbGlkYXRpb24gZXJyb3JzIGVxdWFsIHRvIHRoZSBpbnRlcm5hbCB0ZXh0Ym94J3MuXHJcblx0ICpcclxuXHQgKiBXaGVuIHRoZSBpbnRlcm5hbCB0ZXh0Ym94IGlzIGludmFsaWQsIG5lZWQgdG8gc2V0IHRoaXMgY29udHJvbCdzXHJcblx0ICogZXJyb3JzIGJlY2F1c2Ugd2UgYXJlIHVzaW5nIG91ciBvd24gbGFiZWwsIG5vdCBUZXh0Ym94Q29udHJvbCdzLlxyXG5cdCAqIFdlIHVzZSBvdXIgb3duIGxhYmVsIHNvIGxhYmVsIHRleHQgd2lsbCB3cmFwIGF0IHRoZSBlbmQgb2YgdGhlIGJ1dHRvbixcclxuXHQgKiBub3QgYXQgdGhlIGVuZCBvZiB0aGUgdGV4dGJveC5cclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsaWRhdGlvbkVycm9ycyhkYXRhPzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmludmFsaWQpIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKHRoaXMudGV4dGJveEZvcm1Nb2RlbC5lcnJvcnMpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5mb3JtTW9kZWwuc2V0RXJyb3JzKG51bGwpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVXBkYXRlIHRoZSBmb3JtIG1vZGVsIHZhbHVlIHdpdGggdGhlIHNlbGVjdGVkIGl0ZW0gb3IgcmVzZXQgZm9ybSBtb2RlbCB2YWx1ZSBpZiBpdGVtIGlzIG51bGxcclxuXHQgKlxyXG5cdCAqIEBtZW1iZXJvZiBDb21ib2JveENvbXBvbmVudFxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2V0Rm9ybU1vZGVsVmFsdWUoaXRlbTogTWVudUl0ZW0gfCBudWxsKTogdm9pZCB7XHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsdWUoaXRlbSA/IChpdGVtLnNlbGVjdGVkTGFiZWwgfHwgaXRlbS5sYWJlbCkgOiAnJyk7XHJcblx0XHR0aGlzLmZvcm1Nb2RlbC5zZXRWYWx1ZShpdGVtKTtcclxuXHRcdHRoaXMuZm9ybU1vZGVsLm1hcmtBc0RpcnR5KCk7XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2V0IHZhbGlkYXRvcnMgb24gdGhlIHtAc2VlIHRleHRib3hGb3JtTW9kZWwgfVxyXG5cdCAqXHJcblx0ICogVmFsaWRhdG9ycyBhcmUgY3VycmVudGx5IHNldCBiYXNlZCBvbiB0aGUge0BzZWUgbWF4bGVuZ3RoIH0sXHJcblx0ICoge0BzZWUgbWlubGVuZ3RoIH0sIGFuZCB7QHNlZSByZXF1aXJlZCB9IGlucHV0cy4gIFRoaXMgd29ya3Mgd2VsbFxyXG5cdCAqIHdpdGgge0BzZWUgVGV4dGJveENvbXBvbmVudCB9LCB3aGljaCBuZWVkcyB0aGVzZSBpbnB1dHMgdG8gYXBwbHlcclxuXHQgKiB0aGUgcHJvcGVyIGF0dHJpYnV0ZXMgdG8gaXRzIGlucHV0cy5cclxuXHQgKlxyXG5cdCAqIEEgZnV0dXJlIHJlbGVhc2Ugb2YgQW5ndWxhciB3aWxsIHN1cHBvc2VkbHkgYWRkIHRoZXNlIGF0dHJpYnV0ZXNcclxuXHQgKiBmb3IgeW91LCB3aGljaCB3aWxsIGVsaW1pbmF0ZSB0aGUgbmVlZCBmb3IgVGV4dGJveENvbXBvbmVudCB0byBoYXZlXHJcblx0ICogc3VjaCBpbnB1dHMuICBUaGlzIGNvbXBvbmVudCwgaG93ZXZlciwgd2lsbCBzdGlsbCBuZWVkIHRoZXNlIGlucHV0c1xyXG5cdCAqIGFzIHRoZXJlIGlzIG5vIGN1cnJlbnQgd2F5IHRvIGtub3cgd2hpY2ggdmFsaWRhdG9ycyBhcmUgYXBwbGllZCB0byBpdFxyXG5cdCAqIGZyb20gaXRzIHBhcmVudCBWaWV3IENvbXBvbmVudC5cclxuXHQgKlxyXG5cdCAqXHJcblx0ICogQG1lbWJlcm9mIENvbWJvYm94Q29tcG9uZW50XHJcblx0ICovXHJcblx0cHJpdmF0ZSBzZXRUZXh0Ym94Rm9ybU1vZGVsVmFsaWRhdG9ycygpOiB2b2lkIHtcclxuXHRcdGxldCB2YWxpZGF0b3JzOiBBcnJheTxWYWxpZGF0b3JGbj4gPSBbXTtcclxuXHJcblx0XHRpZiAodGhpcy5yZXF1aXJlZCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMubWlubGVuZ3RoKSB7XHJcblx0XHRcdHZhbGlkYXRvcnMucHVzaChWYWxpZGF0b3JzLm1pbkxlbmd0aCh0aGlzLm1pbmxlbmd0aCkpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLm1heGxlbmd0aCkge1xyXG5cdFx0XHR2YWxpZGF0b3JzLnB1c2goVmFsaWRhdG9ycy5tYXhMZW5ndGgodGhpcy5tYXhsZW5ndGgpKTtcclxuXHRcdH1cclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcclxuXHJcblx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdH1cclxuXHJcblxyXG5cdC8qKlxyXG5cdCAqIEtlZXAgdGV4dGJveCdzIGRpc2FibGVkIHN0YXR1cyBpbi1zeW5jIHdpdGggY29tYm9ib3gnc1xyXG5cdCAqXHJcblx0ICoge0BsaW5rIFRleHRib3hDb21wb25lbnR9IGdldHMgaXRzIGRpc2FibGVkIHN0YXR1cyBmcm9tIGl0cyB7QGxpbmsgRm9ybUNvbnRyb2x9XHJcblx0ICpcclxuXHQgKiBAbWVtYmVyb2YgQ29tYm9ib3hDb21wb25lbnRcclxuXHQgKi9cclxuXHRwcml2YXRlIHN5bmNocm9uaXplRGlzYWJsZWRBdHRyaWJ1dGVzKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkICE9PSB0aGlzLnRleHRib3hGb3JtTW9kZWwuZGlzYWJsZWQpIHtcclxuXHRcdFx0aWYgKHRoaXMuZm9ybU1vZGVsLmRpc2FibGVkKSB7XHJcblx0XHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLmRpc2FibGUoKTtcclxuXHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHR0aGlzLnRleHRib3hGb3JtTW9kZWwuZW5hYmxlKCk7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cclxuXHQvKipcclxuXHQgKiBJZiB0aGUgZm9ybU1vZGVsIHZhbHVlIGFuZCB0ZXh0Ym94IHZhbHVlIGRvIG5vdCBtYXRjaCwgcmVzZXQgdGhlIHRleHRib3ggYW5kIHNlbGVjdGVkSXRlbSB0b1xyXG5cdCAqIHRoZSBmb3JtTW9kbGUgdmFsdWUuIElmIHRoZXJlIGlzIG5vIGZvcm1Nb2RlbCB2YWx1ZSwgbWFrZSBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94LiBSZXNldCB0aGVcclxuXHQgKiBmaWx0ZXJlZE9wdGlvbnMgdG8gdGhlIGZ1bGwgbGlzdCBhbmQgdXBkYXRlIHRoZSBzZWxlY3RlZEl0ZW1JbmRleFxyXG5cdCAqXHJcblx0ICovXHJcblx0cHJpdmF0ZSBzeW5jTW9kZWxWYWx1ZXMoKTogdm9pZCB7XHJcblx0XHQvLyBJZiB0aGVyZSBpcyBhIGZvcm1Nb2RlbCB2YWx1ZSwgcmVzZXQgdGhlIHNlbGVjdGVkIGl0ZW0uIElmIHRoZXJlIGlzbid0LCBtYWtlXHJcblx0XHQvLyBzdXJlIHdlIGNsZWFyIHRoZSB0ZXh0Ym94XHJcblx0XHRjb25zdCBuZXdMYWJlbCA9IHRoaXMuZm9ybU1vZGVsLnZhbHVlPy5zZWxlY3RlZExhYmVsIHx8IHRoaXMuZm9ybU1vZGVsLnZhbHVlPy5sYWJlbDtcclxuXHRcdGlmICh0aGlzLmZvcm1Nb2RlbC52YWx1ZSAmJiAobmV3TGFiZWwgIT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSkpIHtcclxuXHRcdFx0dGhpcy50ZXh0Ym94Rm9ybU1vZGVsLnNldFZhbHVlKG5ld0xhYmVsKTtcclxuXHRcdH0gZWxzZSBpZiAoIXRoaXMuZm9ybU1vZGVsLnZhbHVlKSB7XHJcblx0XHRcdHRoaXMudGV4dGJveEZvcm1Nb2RlbC5zZXRWYWx1ZSgnJyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHJcblx0LyoqXHJcblx0ICogU2VhcmNoIGFuZCBmaWx0ZXIgdGhlIG9wdGlvbnMgbGlzdCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dGJveCBpbnB1dCBjaGFuZ2VzLiBJZiBhZGROZXcgaXNcclxuXHQgKiBzZXQgYWxzbyBjaGVjayBmb3IgbWF0Y2hlcyBpbiBvdXIgZmlsdGVyZWRPcHRpb25zIHRvIGNvbmRpdGlvbmFsbHkgc2hvdyBhbmQgaGlkZSB0aGUgYWRkIG5ld1xyXG5cdCAqIGJ1dHRvblxyXG5cdCAqXHJcblx0ICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9FdmVudHMvaW5wdXRcclxuXHQgKi9cclxuXHRwdWJsaWMgdGV4dGJveFZhbHVlQ2hhbmdlZChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2VhcmNoQW5kRmlsdGVyKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSk7XHJcblxyXG5cdFx0aWYgKHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZSA9PT0gJycpIHtcclxuXHRcdFx0dGhpcy5jbGVhclNlbGVjdGVkSXRlbSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLmFkZE5ldykge1xyXG5cdFx0XHRsZXQgbWF0Y2ggPSB0aGlzLmZpbHRlcmVkT3B0aW9ucy5maW5kKChvcHRpb24pID0+IHtcclxuXHRcdFx0XHRyZXR1cm4gb3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT09IHRoaXMudGV4dGJveEZvcm1Nb2RlbC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0XHR9KTtcclxuXHRcdFx0dGhpcy5mb3VuZE1hdGNoID0gbWF0Y2ggPyB0cnVlIDogZmFsc2U7XHJcblx0XHR9XHJcblxyXG5cdFx0Ly8gVXBkYXRlIHRoZSBwb3B1cCBtZW51IHBvc2l0aW9uIHdoZW4gaW5wdXQgdmFsdWUgY2hhbmdlc1xyXG5cdFx0aWYgKHRoaXMucG9wdXApIHtcclxuXHRcdFx0dGhpcy5wb3B1cC51cGRhdGUoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHByaXZhdGUgY2xlYXJTZWxlY3RlZEl0ZW0oKTogdm9pZCB7XHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7XHJcblx0XHR0aGlzLnNlbGVjdGVkSXRlbUluZGV4ID0gLTE7XHJcblx0fVxyXG5cclxuXHQvKipSZWNvbXB1dGUgd2hhdCB0aGUgcGxhY2Vob2xkZXIgc2hvdWxkIGJlIGJhc2VkIG9uIHdoZXRoZXIgdGhlIHVzZXIgcHJvdmlkZWQgb25lIGFuZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgYWRkTmV3IGlucHV0ICovXHJcblx0cHJpdmF0ZSB1cGRhdGVQbGFjZWhvbGRlclRleHQoKXtcclxuXHRcdGlmICh0aGlzLnBsYWNlaG9sZGVyKSB7XHJcblx0XHRcdHRoaXMuZWZmZWN0aXZlUGxhY2Vob2xkZXIgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHRoaXMucGxhY2Vob2xkZXIpO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLmFkZE5ldykge1xyXG5cdFx0XHR0aGlzLmVmZmVjdGl2ZVBsYWNlaG9sZGVyID0gdGhpcy5jaG9vc2VPckFkZFBsYWNlaG9sZGVyO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0dGhpcy5lZmZlY3RpdmVQbGFjZWhvbGRlciA9IHRoaXMuY2hvb3NlUGxhY2Vob2xkZXI7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipGaW5kIHRoZSBvcHRpb24gd2Ugd2FudCB0byBiZSB0aGUgZGVmYXVsdCBzZWxlY3Rpb24uIElmIHRoZXJlIGlzIGFuIGV4YWN0IG1hdGNoLCB1c2UgdGhhdFxyXG5cdCAqIG90aGVyd2lzZSBpZiB0aGVyZSBhcmUgaXRlbXMsIHJldHVybiB6ZXJvIHRvIGluZGljYXRlIHRoZSBmaXJzdCBpdGVtLiBPdGhlcndpc2UgcmV0dXJuIC0xXHJcblx0ICogdG8gaW5kaWNhdGUgbm8gc2VsZWN0aW9uXHJcblx0ICovXHJcblx0cHJpdmF0ZSBmaW5kRGVmYXVsdFNlbGVjdGlvbkluZGV4KG9wdGlvbnM6IE1lbnVJdGVtW10sIHNlYXJjaFRleHQ6IHN0cmluZyk6IG51bWJlciB7XHJcblx0XHRsZXQgaW5kZXggPSAtMTtcclxuXHJcblx0XHRpZihvcHRpb25zICYmIG9wdGlvbnMubGVuZ3RoKXtcclxuXHRcdFx0aW5kZXggPSBvcHRpb25zLmZpbmRJbmRleChvcHRpb249Pm9wdGlvbiAhPSBudWxsICYmIG9wdGlvbi5kaXNwbGF5ICE9PSAnaGVhZGluZycpO1xyXG5cclxuXHRcdFx0aWYoc2VhcmNoVGV4dCl7XHJcblx0XHRcdFx0c2VhcmNoVGV4dCA9IHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKS50cmltKCk7XHJcblx0XHRcdFx0bGV0IGV4YWN0TWF0Y2hJbmRleCA9IG9wdGlvbnMuZmluZEluZGV4KG9wdGlvbj0+b3B0aW9uLmxhYmVsLnRvTG93ZXJDYXNlKCkgPT0gc2VhcmNoVGV4dCAmJiBvcHRpb24uZGlzcGxheSAhPT0gJ2hlYWRpbmcnKTtcclxuXHRcdFx0XHRpZihleGFjdE1hdGNoSW5kZXggPj0wKXtcclxuXHRcdFx0XHRcdGluZGV4ID0gZXhhY3RNYXRjaEluZGV4O1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cmV0dXJuIGluZGV4O1xyXG5cdH1cclxuXHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cImNvbnRyb2wgY29udHJvbC1sYWJlbC17e2xhYmVsUG9zaXRpb259fVwiXHJcbiAgICAgW25nQ2xhc3NdPVwieydvcGVuJzogbWVudVN0YXR1cyA9PT0gJ3Zpc2libGUnLFxyXG4gICAgICAgICAgICAgICAgICdpbnZhbGlkJzogZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWQsXHJcbiAgICAgICAgICAgICAgICAgJ2hhcy1pY29uJzogKCh0ZW1wbGF0ZVR5cGUgPT09ICdpY29uQW5kTGFiZWwnIHx8IHRlbXBsYXRlVHlwZSA9PT0gJ2ljb25MYWJlbENhcHRpb24nKSAmJiBmb3JtTW9kZWwudmFsdWUgJiYgZm9ybU1vZGVsLnZhbHVlLmljb24gJiYgZm9ybU1vZGVsLnZhbHVlLmxhYmVsID09PSB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlKSxcclxuICAgICAgICAgICAgICAgICAnaXMtcmVhZG9ubHknOiByZWFkb25seSxcclxuICAgICAgICAgICAgICAgICAnaXMtZGlzYWJsZWQnOiBmb3JtTW9kZWwuZGlzYWJsZWQsXHJcbiAgICAgICAgICAgICAgICAgJ2lzLWFsd2F5cy1vcGVuJzogYWx3YXlzT3Blbn1cIj5cclxuXHJcbiAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBuZ1ByZXNlcnZlV2hpdGVzcGFjZXM+XHJcbiAgICAgIDxzcGFuPnt7bGFiZWwgfCB0cmFuc2xhdGV9fTwvc3Bhbj5cclxuICAgICAgPHNwYW4gKm5nSWY9XCJ2YWxpZGF0aW9uRXJyb3JzLmxlbmd0aCA+IDAgJiYgZm9ybU1vZGVsLnRvdWNoZWQgJiYgZm9ybU1vZGVsLmludmFsaWRcIj57e3ZhbGlkYXRpb25FcnJvcnN9fTwvc3Bhbj5cclxuICA8L2xhYmVsPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWx3YXlzT3BlbjsgZWxzZSBwb3B1cFRhcmdldFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRleHRib3gtZ3JvdXAgY29udHJvbC1pbnB1dFwiIFtuZ0NsYXNzXT1cInRleHRib3hFbGVtZW50Q2xhc3Nlc1wiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGV4dGJveFwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZpbHRlcmVkT3B0aW9ucy5sZW5ndGggPiAwIHx8IHRleHRib3hGb3JtTW9kZWwudmFsdWVcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRyb3Bkb3dubWVudVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuPG5nLXRlbXBsYXRlICNwb3B1cFRhcmdldD5cclxuICA8ZGl2IGNsYXNzPVwidGV4dGJveC1ncm91cCBjb250cm9sLWlucHV0XCIgW25nQ2xhc3NdPVwidGV4dGJveEVsZW1lbnRDbGFzc2VzXCIgKmVjUG9wdXA9XCJkcm9wZG93bm1lbnVcIj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZXh0Ym94XCI+PC9uZy1jb250YWluZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI3RleHRib3g+XHJcbiAgPGkgY2xhc3M9XCJlYy1pY29uIHt7Zm9ybU1vZGVsLnZhbHVlPy5pY29ufX1cIj48L2k+XHJcblxyXG4gICAgPGVjLXRleHRib3ggY2xhc3M9XCJ0ZXh0Ym94LWdyb3VwLWlucHV0IG1iLTBcIlxyXG4gICAgICAgICAgICAgICAgI3RleHRib3hcclxuICAgICAgICAgICAgICAgIFtpZF09XCJpZFwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cImF1dG9mb2N1c1wiXHJcbiAgICAgICAgICAgICAgICBbZm9ybU1vZGVsXT1cInRleHRib3hGb3JtTW9kZWxcIlxyXG4gICAgICAgICAgICAgICAgW21heGxlbmd0aF09XCJtYXhsZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW21pbmxlbmd0aF09XCJtaW5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImVmZmVjdGl2ZVBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXHJcbiAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIChpbnB1dCk9XCJ0ZXh0Ym94VmFsdWVDaGFuZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwia2V5TmF2aWdhdGUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoZm9jdXNvdXQpPVwib25CbHVyKClcIlxyXG4gICAgICAgICAgICAgICAgW3VwcGVyQ2FzZV09XCJ1cHBlckNhc2VcIlxyXG4gICAgICAgICAgICAgICAgW3BlbmRpbmddPVwicGVuZGluZyAmJiBhbHdheXNPcGVuXCJcclxuICAgICAgICAgICAgICAgIFthdXRvY29tcGxldGVdPVwiJ29mZidcIj48L2VjLXRleHRib3g+XHJcblxyXG4gICAgPGVjLWJ1dHRvbiBjbGFzcz1cInRleHRib3gtZ3JvdXAtYnRuLXJpZ2h0XCJcclxuICAgICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVRvZ2dsZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgIFtpZF09XCJpZCArICdfYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtTW9kZWwuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICBpY29uPVwiaWNvbi1jYXJldC1kb3duXCJcclxuICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIi0xXCJcclxuICAgICAgICAgICAgICAgdHlwZT1cInNlY29uZGFyeVwiXHJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVNZW51KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAoa2V5ZG93bik9XCJrZXlOYXZpZ2F0ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJtZW51U3RhdHVzID09PSAndmlzaWJsZSdcIj48L2VjLWJ1dHRvbj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZHJvcGRvd25tZW51PlxyXG4gIDxkaXYgY2xhc3M9XCJwb3B1cFwiXHJcbiAgICAgICBlY092ZXJsYXlcclxuICAgICAgIFtzdGF0dXNdPVwicGVuZGluZyAmJiAhYWx3YXlzT3BlbiA/ICdwZW5kaW5nJyA6ICdoYXNEYXRhJ1wiPlxyXG5cclxuICAgIDxidXR0b24gY2xhc3M9XCJhZGQtbmV3IHt7YWRkTmV3T3B0aW9ucz8uY2xhc3NMaXN0fX1cIlxyXG4gICAgICAgICAgICBpZD1cInt7aWR9fV9hZGROZXdcIlxyXG4gICAgICAgICAgICAjYWRkTmV3QnV0dG9uXHJcbiAgICAgICAgICAgIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJhZGROZXdTZWxlY3RlZFwiXHJcbiAgICAgICAgICAgICpuZ0lmPVwiYWRkTmV3XCJcclxuICAgICAgICAgICAgW2hpZGRlbl09XCJmb3VuZE1hdGNoIHx8IChhZGROZXcgPT09ICdkeW5hbWljJyAmJiAoIXRleHRib3hGb3JtTW9kZWwudmFsdWUgfHwgKGZvcm1Nb2RlbC52YWx1ZSAmJiB0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlID09PSBmb3JtTW9kZWwudmFsdWUubGFiZWwpKSlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwib25BZGROZXcoJGV2ZW50KVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImFkZC1uZXctbGFiZWwgZWMtdXRpbC10cnVuY2F0ZVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiYWRkTmV3ID09PSAnc3RhdGljJyB8fCBhZGROZXcgPT09IHRydWVcIlxyXG4gICAgICAgICAgICAgIHRyYW5zbGF0ZT57e2FkZE5ld09wdGlvbnM/LmxhYmVsfX1cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJhZGROZXcgPT09ICdkeW5hbWljJ1wiPnt7J0FkZCcgfCB0cmFuc2xhdGV9fSA8c3Ryb25nIFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwiZWMtdXRpbC10cnVuY2F0ZVwiIFxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndGV4dC11cHBlcmNhc2UnOiB1cHBlckNhc2V9XCI+e3t0ZXh0Ym94Rm9ybU1vZGVsLnZhbHVlfX08L3N0cm9uZz5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgICAgPGkgY2xhc3M9XCJlYy1pY29uIHt7YWRkTmV3T3B0aW9ucz8uaWNvbn19XCI+PC9pPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPGVjLW1lbnUgaWQ9XCJ7e2lkfX1fbWVudVwiXHJcbiAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLXRvcC0wXT1cIiFmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoICYmIGhpZGVOb01hdGNoZXNcIlxyXG4gICAgICAgICAgICAgW25nQ2xhc3NdPVwibWVudUVsZW1lbnRDbGFzc2VzXCJcclxuICAgICAgICAgICAgIFt0ZW1wbGF0ZVR5cGVdPVwidGVtcGxhdGVUeXBlXCJcclxuICAgICAgICAgICAgIFtjdXN0b21NZW51VGVtcGxhdGVdPVwiY3VzdG9tTWVudVRlbXBsYXRlXCJcclxuICAgICAgICAgICAgIFtzaG93Tm9JdGVtc109XCIhaGlkZU5vTWF0Y2hlc1wiXHJcbiAgICAgICAgICAgICBbbm9EYXRhVGV4dF09XCJub01hdGNoZXNUZXh0XCJcclxuICAgICAgICAgICAgIFtpdGVtc109XCJmaWx0ZXJlZE9wdGlvbnNcIlxyXG4gICAgICAgICAgICAgW3NlbGVjdGVkXT1cInNlbGVjdGVkSXRlbVwiXHJcbiAgICAgICAgICAgICAoc2VsZWN0ZWRDaGFuZ2VkKT1cInNlbGVjdGVkQ2hhbmdlZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgIFtwcmVzZXJ2ZUljb25TcGFjZV09XCJwcmVzZXJ2ZUljb25TcGFjZVwiXHJcbiAgICAgICAgICAgICBbdHJ1bmNhdGVJdGVtc109XCJ0cnVuY2F0ZUl0ZW1zXCI+PC9lYy1tZW51PlxyXG5cclxuICAgIDxmb290ZXIgKm5nSWY9XCJ0b3RhbFJlY29yZHMgJiYgdG90YWxSZWNvcmRzID4gZmlsdGVyZWRPcHRpb25zLmxlbmd0aCAmJiBmaWx0ZXJlZE9wdGlvbnMubGVuZ3RoID4gMFwiPlxyXG4gICAgICA8c3Bhbj57e2ZpbHRlcmVkT3B0aW9uQ291bnR9fSB7eydvZicgfCB0cmFuc2xhdGV9fSB7e3RvdGFsUmVjb3Jkc319PC9zcGFuPlxyXG4gICAgPC9mb290ZXI+XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==