@seniorsistemas/data-seniorx-core 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/core/constants/editable-overlay.const.d.ts +4 -0
  2. package/core/constants/help-popover.const.d.ts +7 -0
  3. package/core/constants/input-mask.const.d.ts +5 -0
  4. package/core/constants/navigation-button.const.d.ts +3 -0
  5. package/core/constants/object-card.const.d.ts +21 -0
  6. package/core/constants/thumbnail.const.d.ts +6 -0
  7. package/core/constants/thumbnails.const.d.ts +4 -0
  8. package/core/constants/token-list.const.d.ts +3 -0
  9. package/core/types/button.type.d.ts +1 -1
  10. package/core/types/datepicker.type.d.ts +28 -0
  11. package/core/types/dynamic-form.type.d.ts +29 -0
  12. package/core/types/editable-overlay.type.d.ts +15 -0
  13. package/core/types/help-popover.type.d.ts +2 -0
  14. package/core/types/input-mask.type.d.ts +6 -0
  15. package/core/types/lookup.type.d.ts +45 -0
  16. package/core/types/navigation-button.type.d.ts +9 -0
  17. package/core/types/row-card.type.d.ts +5 -0
  18. package/core/types/semantics.type.d.ts +1 -1
  19. package/core/types/table-options.type.d.ts +1 -0
  20. package/core/types/thumbnail.type.d.ts +1 -0
  21. package/core/types/thumbnails.type.d.ts +20 -0
  22. package/core/types/token-list.type.d.ts +6 -0
  23. package/core/utils/emoji-support.util.d.ts +12 -0
  24. package/core/utils/overlay-dismiss.util.d.ts +25 -0
  25. package/esm2022/core/config/row-card.type.config.mjs +3 -1
  26. package/esm2022/core/constants/country-phone-picker.const.mjs +6 -6
  27. package/esm2022/core/constants/editable-overlay.const.mjs +5 -0
  28. package/esm2022/core/constants/help-popover.const.mjs +7 -0
  29. package/esm2022/core/constants/input-mask.const.mjs +6 -0
  30. package/esm2022/core/constants/navigation-button.const.mjs +4 -0
  31. package/esm2022/core/constants/object-card.const.mjs +23 -0
  32. package/esm2022/core/constants/thumbnail.const.mjs +14 -0
  33. package/esm2022/core/constants/thumbnails.const.mjs +5 -0
  34. package/esm2022/core/constants/token-list.const.mjs +4 -0
  35. package/esm2022/core/types/button.type.mjs +1 -1
  36. package/esm2022/core/types/datepicker.type.mjs +2 -0
  37. package/esm2022/core/types/dynamic-form.type.mjs +2 -0
  38. package/esm2022/core/types/editable-overlay.type.mjs +2 -0
  39. package/esm2022/core/types/help-popover.type.mjs +2 -0
  40. package/esm2022/core/types/input-mask.type.mjs +2 -0
  41. package/esm2022/core/types/lookup.type.mjs +2 -0
  42. package/esm2022/core/types/navigation-button.type.mjs +2 -0
  43. package/esm2022/core/types/row-card.type.mjs +1 -1
  44. package/esm2022/core/types/semantics.type.mjs +1 -1
  45. package/esm2022/core/types/table-options.type.mjs +1 -1
  46. package/esm2022/core/types/thumbnail.type.mjs +2 -0
  47. package/esm2022/core/types/thumbnails.type.mjs +2 -0
  48. package/esm2022/core/types/token-list.type.mjs +2 -0
  49. package/esm2022/core/utils/emoji-support.util.mjs +48 -0
  50. package/esm2022/core/utils/mask.util.mjs +2 -2
  51. package/esm2022/core/utils/overlay-dismiss.util.mjs +38 -0
  52. package/esm2022/features/alert/alert.component.mjs +5 -2
  53. package/esm2022/features/autocomplete/autocomplete.component.mjs +30 -8
  54. package/esm2022/features/bignumber-input/bignumber-input.component.mjs +1 -1
  55. package/esm2022/features/button/button.component.mjs +13 -5
  56. package/esm2022/features/card-list/card/card.component.mjs +2 -2
  57. package/esm2022/features/card-list/card-list.component.mjs +2 -2
  58. package/esm2022/features/checkbox-list/checkbox-list.component.mjs +25 -5
  59. package/esm2022/features/chips/chips.component.mjs +3 -3
  60. package/esm2022/features/code-editor/code-editor.component.mjs +12 -3
  61. package/esm2022/features/combobox/combobox.component.mjs +3 -3
  62. package/esm2022/features/confirm/confirm.component.mjs +2 -2
  63. package/esm2022/features/context-selector/context-selector.component.mjs +1 -1
  64. package/esm2022/features/country-phone-picker/country-phone-picker.component.mjs +22 -18
  65. package/esm2022/features/currency/currency.component.mjs +3 -3
  66. package/esm2022/features/datepicker/datepicker.component.mjs +814 -0
  67. package/esm2022/features/dynamic-form/dynamic-form-field.directive.mjs +178 -0
  68. package/esm2022/features/dynamic-form/dynamic-form.component.mjs +60 -0
  69. package/esm2022/features/dynamic-form/dynamic-form.registry.mjs +13 -0
  70. package/esm2022/features/editable-overlay/editable-overlay-editor.directive.mjs +31 -0
  71. package/esm2022/features/editable-overlay/editable-overlay.component.mjs +217 -0
  72. package/esm2022/features/editor/editor.component.mjs +173 -0
  73. package/esm2022/features/empty-state/empty-state.component.mjs +3 -3
  74. package/esm2022/features/fileupload/fileupload.component.mjs +3 -3
  75. package/esm2022/features/help-popover/help-popover.component.mjs +204 -0
  76. package/esm2022/features/hyperlink/hyperlink.component.mjs +3 -3
  77. package/esm2022/features/icon-picker/icon-picker.component.mjs +4 -4
  78. package/esm2022/features/image-cropper/image-cropper.component.mjs +2 -2
  79. package/esm2022/features/info-sign/info-sign.component.mjs +6 -3
  80. package/esm2022/features/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  81. package/esm2022/features/inline-edit/components/inline-edit-item/inline-edit-item.component.mjs +2 -2
  82. package/esm2022/features/input-mask/input-mask.directive.mjs +510 -0
  83. package/esm2022/features/list/list.component.mjs +2 -2
  84. package/esm2022/features/localized-number-input/localized-number-input.component.mjs +3 -3
  85. package/esm2022/features/lookup/lookup.component.mjs +351 -0
  86. package/esm2022/features/modal/modal.component.mjs +6 -3
  87. package/esm2022/features/modalc/modalc.component.mjs +6 -3
  88. package/esm2022/features/navigation-button/navigation-button.component.mjs +172 -0
  89. package/esm2022/features/number-input/number-input.component.mjs +10 -4
  90. package/esm2022/features/object-card/components/object-card-field/object-card-field.component.mjs +89 -0
  91. package/esm2022/features/object-card/components/object-card-main/object-card-main.component.mjs +114 -0
  92. package/esm2022/features/object-card/object-card.component.mjs +199 -0
  93. package/esm2022/features/password-strength/password-strength.component.mjs +3 -3
  94. package/esm2022/features/pin-code-field/pin-code-field.component.mjs +14 -4
  95. package/esm2022/features/popover/popover.component.mjs +29 -3
  96. package/esm2022/features/profile-picture-picker/profile-picture-picker.component.mjs +13 -4
  97. package/esm2022/features/rating-scale/rating-scale.component.mjs +24 -4
  98. package/esm2022/features/row-card-list/row-card/row-card.component.mjs +19 -4
  99. package/esm2022/features/row-card-list/row-card-list.component.mjs +12 -3
  100. package/esm2022/features/scaffold/scaffold.component.mjs +3 -3
  101. package/esm2022/features/searchbox/searchbox.component.mjs +2 -2
  102. package/esm2022/features/select-button/select-button.component.mjs +26 -4
  103. package/esm2022/features/slider/slider.component.mjs +3 -3
  104. package/esm2022/features/split-button/split-button.component.mjs +1 -1
  105. package/esm2022/features/spotlight/components/spotlight-overlay/spotlight-overlay.component.mjs +15 -18
  106. package/esm2022/features/spotlight/spotlight.component.mjs +2 -2
  107. package/esm2022/features/star-rating/star-rating.component.mjs +25 -4
  108. package/esm2022/features/table/components/table-cell-content.component.mjs +2 -2
  109. package/esm2022/features/table/table.component.mjs +30 -9
  110. package/esm2022/features/textarea/textarea.component.mjs +3 -3
  111. package/esm2022/features/thumbnail/thumbnail.component.mjs +86 -0
  112. package/esm2022/features/thumbnails/components/thumbnail-item/thumbnail-item.component.mjs +59 -0
  113. package/esm2022/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.mjs +25 -0
  114. package/esm2022/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.mjs +50 -0
  115. package/esm2022/features/thumbnails/thumbnails.component.mjs +76 -0
  116. package/esm2022/features/tiered-menu/directives/tiered-menu.directive.mjs +13 -1
  117. package/esm2022/features/token-list/token-list.component.mjs +64 -0
  118. package/esm2022/features/visual-sql-editor/visual-sql-editor.component.mjs +2 -2
  119. package/esm2022/locales/en.json +409 -1
  120. package/esm2022/locales/es-CO.json +423 -2
  121. package/esm2022/locales/pt.json +1037 -630
  122. package/esm2022/providers/features.provider.mjs +20 -2
  123. package/esm2022/providers/primeng-config.provider.mjs +14 -128
  124. package/esm2022/providers/translate.provider.mjs +2 -2
  125. package/esm2022/public-api.mjs +31 -1
  126. package/features/alert/alert.component.d.ts +1 -0
  127. package/features/autocomplete/autocomplete.component.d.ts +9 -3
  128. package/features/button/button.component.d.ts +3 -1
  129. package/features/checkbox-list/checkbox-list.component.d.ts +8 -1
  130. package/features/code-editor/code-editor.component.d.ts +5 -1
  131. package/features/country-phone-picker/country-phone-picker.component.d.ts +3 -0
  132. package/features/datepicker/datepicker.component.d.ts +118 -0
  133. package/features/dynamic-form/dynamic-form-field.directive.d.ts +26 -0
  134. package/features/dynamic-form/dynamic-form.component.d.ts +15 -0
  135. package/features/dynamic-form/dynamic-form.registry.d.ts +11 -0
  136. package/features/editable-overlay/editable-overlay-editor.directive.d.ts +22 -0
  137. package/features/editable-overlay/editable-overlay.component.d.ts +60 -0
  138. package/features/editor/editor.component.d.ts +47 -0
  139. package/features/help-popover/help-popover.component.d.ts +81 -0
  140. package/features/info-sign/info-sign.component.d.ts +2 -1
  141. package/features/input-mask/input-mask.directive.d.ts +117 -0
  142. package/features/lookup/lookup.component.d.ts +104 -0
  143. package/features/modal/modal.component.d.ts +2 -1
  144. package/features/modalc/modalc.component.d.ts +2 -1
  145. package/features/navigation-button/navigation-button.component.d.ts +58 -0
  146. package/features/number-input/number-input.component.d.ts +3 -1
  147. package/features/object-card/components/object-card-field/object-card-field.component.d.ts +48 -0
  148. package/features/object-card/components/object-card-main/object-card-main.component.d.ts +57 -0
  149. package/features/object-card/object-card.component.d.ts +70 -0
  150. package/features/pin-code-field/pin-code-field.component.d.ts +6 -1
  151. package/features/popover/popover.component.d.ts +4 -1
  152. package/features/profile-picture-picker/profile-picture-picker.component.d.ts +5 -1
  153. package/features/rating-scale/rating-scale.component.d.ts +9 -1
  154. package/features/row-card-list/row-card/row-card.component.d.ts +6 -1
  155. package/features/row-card-list/row-card-list.component.d.ts +4 -1
  156. package/features/select-button/select-button.component.d.ts +9 -1
  157. package/features/star-rating/star-rating.component.d.ts +9 -1
  158. package/features/table/table.component.d.ts +2 -1
  159. package/features/thumbnail/thumbnail.component.d.ts +48 -0
  160. package/features/thumbnails/components/thumbnail-item/thumbnail-item.component.d.ts +29 -0
  161. package/features/thumbnails/components/thumbnail-item-image/thumbnail-item-image.component.d.ts +13 -0
  162. package/features/thumbnails/components/thumbnail-item-video/thumbnail-item-video.component.d.ts +19 -0
  163. package/features/thumbnails/thumbnails.component.d.ts +46 -0
  164. package/features/tiered-menu/directives/tiered-menu.directive.d.ts +2 -0
  165. package/features/token-list/token-list.component.d.ts +31 -0
  166. package/fesm2022/seniorsistemas-data-seniorx-core.mjs +11288 -6613
  167. package/fesm2022/seniorsistemas-data-seniorx-core.mjs.map +1 -1
  168. package/package.json +12 -3
  169. package/providers/primeng-config.provider.d.ts +12 -0
  170. package/public-api.d.ts +38 -0
  171. package/src/locales/en.json +409 -1
  172. package/src/locales/es-CO.json +423 -2
  173. package/src/locales/pt.json +1037 -630
  174. package/styles/sdc-global-variables.scss +38 -0
  175. package/styles.css +132 -0
  176. package/styles.scss +2 -0
  177. package/esm2022/providers/custom/button.mjs +0 -93
  178. package/esm2022/providers/custom/toast.mjs +0 -75
  179. package/providers/custom/button.d.ts +0 -16
  180. package/providers/custom/toast.d.ts +0 -14
@@ -951,7 +951,7 @@ export class ComboboxComponent extends InputsComponent {
951
951
  useExisting: forwardRef(() => ComboboxComponent),
952
952
  multi: true
953
953
  }
954
- ], viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "triggerControlRef", first: true, predicate: ["triggerControlRef"], descendants: true }, { propertyName: "singleInputRef", first: true, predicate: ["singleInputRef"], descendants: true }, { propertyName: "panelSearchbox", first: true, predicate: ["panelSearchboxRef"], descendants: true }, { propertyName: "multiValueRef", first: true, predicate: ["multiValueRef"], descendants: true }, { propertyName: "chipMeasureRef", first: true, predicate: ["chipMeasureRef"], descendants: true }, { propertyName: "optionsViewportRef", first: true, predicate: ["optionsViewportRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n @if (searchable) {\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n }\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses -->\n <!-- ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (\n option of filteredItems;\n track trackByOptionValue(index, option);\n let index = $index\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
954
+ ], viewQueries: [{ propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "triggerControlRef", first: true, predicate: ["triggerControlRef"], descendants: true }, { propertyName: "singleInputRef", first: true, predicate: ["singleInputRef"], descendants: true }, { propertyName: "panelSearchbox", first: true, predicate: ["panelSearchboxRef"], descendants: true }, { propertyName: "multiValueRef", first: true, predicate: ["multiValueRef"], descendants: true }, { propertyName: "chipMeasureRef", first: true, predicate: ["chipMeasureRef"], descendants: true }, { propertyName: "optionsViewportRef", first: true, predicate: ["optionsViewportRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [closeOnScroll]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n @if (searchable) {\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n }\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses -->\n <!-- ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (\n option of filteredItems;\n track trackByOptionValue(index, option);\n let index = $index\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:2px 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:calc(var(--sdc-formfield-default-height, 34px) - 6px);padding:0 .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: IconRendererComponent, selector: "sdc-icon-renderer", inputs: ["icon", "iconType", "size"] }, { kind: "component", type: CheckboxComponent, selector: "sdc-checkbox", inputs: ["label", "disabled", "commonCheckbox", "labelPosition", "size", "checked"], outputs: ["checkedChange"] }, { kind: "component", type: EmptyStateComponent, selector: "sdc-empty-state", inputs: ["id", "title", "variant", "titleParams", "iconClass", "description", "descriptionParams", "showPrimaryAction", "showSecondaryAction", "primaryActionLabel", "primaryActionLabelParams", "secondaryActionLabel", "secondaryActionLabelParams", "primaryModel"], outputs: ["primaryAction", "secondaryAction"] }, { kind: "component", type: PopoverComponent, selector: "sdc-popover", inputs: ["open", "disabled", "toggleOnTriggerClick", "closeOnOutsideClick", "closeOnScroll", "closeOnEscape", "trapFocus", "focusOnOpen", "restoreFocusOnClose", "ariaLabel", "appendTo", "zIndex", "offset", "placement", "role", "matchTriggerWidth", "panelWidth", "panelMinWidth", "panelMaxWidth", "panelMaxHeight", "panelClass"], outputs: ["openChange"] }, { kind: "component", type: SearchboxComponent, selector: "sdc-searchbox", inputs: ["triggerMode", "debounceTimeMs", "ariaLabel", "inputRole", "inputAriaControls", "inputAriaDescribedBy", "inputAriaActiveDescendant", "inputAriaHaspopup", "inputAriaExpanded", "inputAutocomplete", "submitOnEnter", "clearOnEscape"], outputs: ["debouncedValueChange", "onSearch", "onClear"] }, { kind: "component", type: TooltipComponent, selector: "sdc-tooltip", inputs: ["pTooltip", "tooltipPosition", "tooltipEvent", "fitContent", "tooltipDisabled", "allowHtml"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
955
955
  }
956
956
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComboboxComponent, decorators: [{
957
957
  type: Component,
@@ -971,7 +971,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
971
971
  useExisting: forwardRef(() => ComboboxComponent),
972
972
  multi: true
973
973
  }
974
- ], template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n @if (searchable) {\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n }\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses -->\n <!-- ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (\n option of filteredItems;\n track trackByOptionValue(index, option);\n let index = $index\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:.25rem 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:1.8rem;padding:.2rem .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"] }]
974
+ ], template: "<div class=\"sdc-combobox\">\n @if (ui.labelText || ui.infoTooltipText) {\n <div class=\"sdc-combobox__label-row\">\n @if (ui.labelText) {\n <label\n [id]=\"ui.labelId\"\n [for]=\"ui.labelForId\"\n class=\"sdc-combobox__label\"\n [attr.aria-label]=\"required ? ui.labelText + ' ' + ui.requiredFieldText : ui.labelText\"\n >\n <span class=\"sdc-combobox__label-text\">\n {{ ui.labelText }}\n @if (required) {\n <span class=\"required-field\" aria-hidden=\"true\">*</span>\n }\n </span>\n </label>\n }\n @if (ui.infoTooltipText) {\n <sdc-tooltip\n class=\"sdc-combobox__info-tooltip-wrap\"\n [pTooltip]=\"ui.infoTooltipText\"\n [tooltipPosition]=\"infoTooltipPosition\"\n [tooltipEvent]=\"infoTooltipEvent\"\n [allowHtml]=\"infoTooltipAllowHtml\"\n (click)=\"$event.stopPropagation()\"\n >\n <i class=\"fas fa-info-circle sdc-combobox__info-tooltip-icon\" aria-hidden=\"true\"></i>\n </sdc-tooltip>\n }\n </div>\n }\n\n <sdc-popover\n [open]=\"panelOpen\"\n [appendTo]=\"appendTo\"\n [zIndex]=\"zIndex\"\n [offset]=\"ui.panelOffset\"\n [ariaLabel]=\"ui.dropdownAriaLabel\"\n [matchTriggerWidth]=\"true\"\n [toggleOnTriggerClick]=\"false\"\n [closeOnEscape]=\"false\"\n [closeOnScroll]=\"false\"\n [panelClass]=\"ui.panelOverlayClass\"\n (openChange)=\"onPopoverOpenChange($event)\"\n >\n <div\n sdc-popover-trigger\n #triggerControlRef\n class=\"sdc-combobox__control\"\n [attr.id]=\"multiple ? ui.controlId : null\"\n [class.sdc-combobox__control--multiple]=\"multiple\"\n [class.sdc-combobox__control--invalid]=\"invalid\"\n [class.sdc-combobox__control--disabled]=\"disabled\"\n [class.sdc-combobox__control--small]=\"size === 'small'\"\n [ngStyle]=\"getInputStyle()\"\n [attr.tabindex]=\"multiple && !disabled ? 0 : null\"\n [attr.role]=\"multiple ? 'combobox' : null\"\n [attr.aria-haspopup]=\"multiple ? 'listbox' : null\"\n [attr.aria-label]=\"multiple ? ui.comboboxAriaLabel : null\"\n [attr.aria-labelledby]=\"multiple ? ui.comboboxAriaLabelledBy : null\"\n [attr.aria-required]=\"multiple ? required : null\"\n [attr.aria-invalid]=\"multiple ? invalid : null\"\n [attr.aria-expanded]=\"multiple ? (panelOpen ? 'true' : 'false') : null\"\n [attr.aria-controls]=\"multiple ? ui.listboxId : null\"\n [attr.aria-activedescendant]=\"multiple ? activeDescendant : null\"\n [attr.aria-describedby]=\"multiple ? ui.messageId : null\"\n [attr.aria-autocomplete]=\"multiple ? 'list' : null\"\n (mousedown)=\"onControlMouseDown($event)\"\n (click)=\"onControlClick()\"\n (keydown)=\"multiple ? onTriggerKeydown($event) : null\"\n >\n <div class=\"sdc-combobox__value\">\n @if (!multiple) {\n @if (selectedSingleOption?.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__leading-icon\"\n [icon]=\"selectedSingleOption?.icon\"\n [iconType]=\"selectedSingleOption?.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <input\n #singleInputRef\n class=\"sdc-combobox__input\"\n type=\"text\"\n [id]=\"ui.controlId\"\n [name]=\"ui.inputName\"\n [disabled]=\"disabled\"\n [required]=\"required\"\n [readOnly]=\"true\"\n [value]=\"selectedSingleOption?.text ?? ''\"\n [placeholder]=\"ui.placeholderText\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.aria-required]=\"required\"\n [attr.aria-invalid]=\"invalid\"\n aria-expanded=\"false\"\n [attr.aria-expanded]=\"panelOpen ? 'true' : 'false'\"\n [attr.aria-haspopup]=\"'listbox'\"\n aria-controls=\"combobox-field-listbox\"\n [attr.aria-controls]=\"ui.listboxId\"\n [attr.aria-activedescendant]=\"activeDescendant\"\n [attr.aria-describedby]=\"ui.messageId\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n autocomplete=\"off\"\n (focus)=\"onInputFocus()\"\n (keydown)=\"onTriggerKeydown($event)\"\n />\n } @else {\n <div #multiValueRef class=\"sdc-combobox__multi-value\">\n @if (!shouldDisplayChipSummary) {\n @if (selectedItems.length > 0) {\n <ul\n class=\"sdc-combobox__chip-list\"\n [attr.aria-label]=\"selectedSummaryText\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\" [attr.title]=\"item.text\">{{ item.text }}</span>\n <button\n type=\"button\"\n class=\"sdc-combobox__chip-remove\"\n [attr.aria-label]=\"chipRemoveAriaLabel(item)\"\n (click)=\"removeSelectedItem(item, $event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n </li>\n }\n </ul>\n }\n } @else {\n @if (selectedItems.length > 0) {\n <span class=\"sdc-combobox__summary\">\n {{ selectedSummaryText }}\n </span>\n }\n }\n @if (selectedItems.length === 0) {\n <span class=\"sdc-combobox__placeholder\">\n {{ ui.placeholderText }}\n </span>\n }\n @if (selectedItems.length > 0) {\n <ul\n #chipMeasureRef\n class=\"sdc-combobox__chip-list sdc-combobox__chip-list--measure\"\n aria-hidden=\"true\"\n >\n @for (item of selectedItems; track trackByOptionValue($index, item)) {\n <li\n class=\"sdc-combobox__chip\"\n >\n @if (item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__chip-icon\"\n [icon]=\"item.icon\"\n [iconType]=\"item.iconType\"\n [size]=\"14\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__chip-label\">{{ item.text }}</span>\n <span class=\"sdc-combobox__chip-remove-placeholder\" aria-hidden=\"true\">\n <i class=\"fas fa-times\"></i>\n </span>\n </li>\n }\n </ul>\n }\n </div>\n }\n\n </div>\n\n <div class=\"sdc-combobox__actions\">\n @if (hasClearAction) {\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--clear\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.clearFieldText\"\n (click)=\"clearAll($event)\"\n >\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\n </button>\n }\n\n <button\n type=\"button\"\n class=\"sdc-combobox__icon-button sdc-combobox__icon-button--toggle\"\n [disabled]=\"disabled\"\n [attr.aria-label]=\"ui.dropdownAriaLabel\"\n [attr.aria-expanded]=\"panelOpen\"\n (mousedown)=\"onToggleMouseDown($event)\"\n (click)=\"togglePanel($event)\"\n >\n <i\n class=\"fas fa-caret-down sdc-combobox__caret\"\n [class.sdc-combobox__caret--open]=\"panelOpen\"\n aria-hidden=\"true\"\n ></i>\n </button>\n </div>\n </div>\n\n <div\n sdc-popover-content\n class=\"sdc-combobox__panel\"\n [style.max-height.px]=\"panelMaxHeight\"\n >\n @if (searchable) {\n <div class=\"sdc-combobox__panel-search\">\n <div class=\"sdc-combobox__panel-search-row\">\n @if (multiple) {\n <span class=\"sdc-combobox__panel-select-all\">\n <sdc-checkbox\n [ngModel]=\"areAllFilteredItemsSelected\"\n [attr.aria-label]=\"ui.selectAllText\"\n (ngModelChange)=\"toggleAllFilteredItems($event)\"\n ></sdc-checkbox>\n </span>\n }\n\n <sdc-searchbox\n #panelSearchboxRef\n class=\"sdc-combobox__panel-searchbox\"\n [identity]=\"ui.panelSearchIdentity\"\n [disabled]=\"disabled\"\n [placeholder]=\"ui.panelSearchPlaceholder\"\n [ngModel]=\"searchTerm\"\n [debounceTimeMs]=\"0\"\n [submitOnEnter]=\"false\"\n [clearOnEscape]=\"false\"\n [ariaLabel]=\"ui.panelSearchAriaLabel\"\n [inputRole]=\"null\"\n [inputAutocomplete]=\"'off'\"\n [inputAriaControls]=\"ui.listboxId\"\n [inputAriaDescribedBy]=\"ui.messageId\"\n (ngModelChange)=\"onSearchTermChange($event)\"\n (onClear)=\"onSearchCleared()\"\n (keydown)=\"onSearchboxKeydown($event)\"\n ></sdc-searchbox>\n </div>\n </div>\n }\n\n @if (isOptionsLoading) {\n <output class=\"sdc-combobox__loading\" aria-live=\"polite\">\n <i class=\"fas fa-spinner fa-spin sdc-combobox__loading-icon\" aria-hidden=\"true\"></i>\n <span class=\"sdc-combobox__loading-text\">{{ ui.loadingItemsText }}</span>\n </output>\n }\n\n @if (showEmptyState) {\n <sdc-empty-state\n class=\"sdc-combobox__empty\"\n variant=\"inline-text\"\n [title]=\"ui.emptyTitleText\"\n ></sdc-empty-state>\n }\n\n @if (filteredItems.length > 0) {\n @if (useVirtualizedOptions) {\n <div\n #optionsViewportRef\n class=\"sdc-combobox__options sdc-combobox__options--virtualized\"\n (scroll)=\"onOptionsScroll()\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n <!-- NOSONAR: custom combobox popup intentionally uses -->\n <!-- ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options-list\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n >\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"beforeVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n @for (\n visibleOption of visibleFilteredItems;\n track trackByOptionValue(visibleOption.index, visibleOption.item)\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(visibleOption.index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(visibleOption.item)\"\n [attr.data-option-index]=\"visibleOption.index\"\n (mouseenter)=\"onOptionMouseEnter(visibleOption.index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(visibleOption.item)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(visibleOption.item, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(visibleOption.index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(visibleOption.item) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, visibleOption.item)\"\n (click)=\"onOptionClick(visibleOption.item)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (visibleOption.item.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"visibleOption.item.icon\"\n [iconType]=\"visibleOption.item.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ visibleOption.item.text }}</span>\n @if (optionMetaText(visibleOption.item); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(visibleOption.item)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n <div\n class=\"sdc-combobox__virtual-spacer\"\n [style.height.px]=\"afterVirtualSpacerHeight\"\n aria-hidden=\"true\"\n ></div>\n </div>\n </div>\n } @else {\n <!-- NOSONAR: custom combobox popup intentionally uses ARIA listbox semantics instead of a native select -->\n <div\n class=\"sdc-combobox__options\"\n [attr.id]=\"ui.listboxId\"\n [attr.aria-label]=\"ui.comboboxAriaLabel\"\n [attr.aria-labelledby]=\"ui.comboboxAriaLabelledBy\"\n [attr.role]=\"'listbox'\"\n [attr.aria-multiselectable]=\"multiple ? 'true' : null\"\n tabindex=\"-1\"\n (mousemove)=\"onOptionsPanelMouseMove()\"\n (mouseleave)=\"onOptionsPanelMouseLeave()\"\n >\n @for (\n option of filteredItems;\n track trackByOptionValue(index, option);\n let index = $index\n ) {\n <div\n class=\"sdc-combobox__option\"\n [class.sdc-combobox__option--active]=\"isOptionActive(index)\"\n [class.sdc-combobox__option--icon-selector]=\"iconSelector\"\n [class.sdc-combobox__option--selected]=\"!multiple && isOptionSelected(option)\"\n [attr.data-option-index]=\"index\"\n (mouseenter)=\"onOptionMouseEnter(index)\"\n >\n @if (multiple) {\n <div class=\"sdc-combobox__option-check\">\n <sdc-checkbox\n [ngModel]=\"isOptionSelected(option)\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"onOptionCheckboxKeydown($event)\"\n (ngModelChange)=\"onOptionCheckboxChange(option, $event)\"\n ></sdc-checkbox>\n </div>\n }\n <!-- NOSONAR -->\n <!-- the custom listbox keeps option semantics on the focusable action for keyboard navigation -->\n <button\n type=\"button\"\n class=\"sdc-combobox__option-action\"\n [attr.id]=\"optionId(index)\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"isOptionSelected(option) ? 'true' : 'false'\"\n [attr.tabindex]=\"-1\"\n (keydown)=\"onOptionKeydown($event, option)\"\n (click)=\"onOptionClick(option)\"\n >\n <span class=\"sdc-combobox__option-content\">\n @if (option.icon) {\n <sdc-icon-renderer\n class=\"sdc-combobox__option-icon\"\n [icon]=\"option.icon\"\n [iconType]=\"option.iconType\"\n [size]=\"16\"\n ></sdc-icon-renderer>\n }\n <span class=\"sdc-combobox__option-texts\">\n <span class=\"sdc-combobox__option-label\">{{ option.text }}</span>\n @if (optionMetaText(option); as optionMeta) {\n <span\n class=\"sdc-combobox__option-meta\"\n >\n {{ optionMeta }}\n </span>\n }\n </span>\n </span>\n @if (!multiple && isOptionSelected(option)) {\n <i\n class=\"fas fa-check sdc-combobox__option-selected-icon\"\n aria-hidden=\"true\"\n ></i>\n }\n </button>\n </div>\n }\n </div>\n }\n }\n </div>\n </sdc-popover>\n\n @if (ui.messageText) {\n <small\n [id]=\"ui.messageId\"\n [ngClass]=\"getInvalidMessageClass()\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {{ ui.messageText }}\n </small>\n }\n </div>\n", styles: [":host{display:block}.sdc-combobox__label-row{display:flex;align-items:center;gap:var(--sdc-form-label-row-gap);margin-bottom:var(--sdc-form-label-row-mb)}.sdc-combobox__label{display:inline-flex;align-items:center;margin-bottom:0;line-height:1;padding-top:var(--sdc-form-label-py);padding-bottom:var(--sdc-form-label-py);min-width:0}.sdc-combobox__label-text{display:inline-flex;align-items:center}.required-field{margin-left:var(--sdc-form-required-ml);color:var(--sdc-error-color, #dc3545);font-weight:400}.sdc-combobox__info-tooltip-wrap{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;margin:0}.sdc-combobox__info-tooltip-icon{display:inline-flex;align-items:center;justify-content:center;width:var(--sdc-form-tooltip-size);height:var(--sdc-form-tooltip-size);line-height:1;cursor:pointer;color:var(--sdc-form-tooltip-color)}.sdc-combobox__control{display:flex;align-items:stretch;min-height:var(--sdc-formfield-default-height);border:1px solid var(--sdc-formfield-default-border);border-radius:var(--sdc-formfield-border-radius);background:var(--sdc-formfield-default-bg, #fff);box-sizing:border-box;cursor:pointer;transition:border-color .18s ease,box-shadow .18s ease,background-color .18s ease}.sdc-combobox__control:hover{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff))}.sdc-combobox__control:focus-within{border-color:var(--sdc-formfield-focus-color, var(--sdc-tab-primary, #007bff));box-shadow:var(--sdc-formfield-focus-shadow, 0 0 0 2px rgba(0, 123, 255, .14))}.sdc-combobox__control--invalid,.sdc-combobox__control--invalid:hover,.sdc-combobox__control--invalid:focus-within{border-color:var(--sdc-formfield-invalid-border, var(--sdc-error-color, #d98888));box-shadow:var(--sdc-formfield-invalid-focus-shadow, 0 0 0 2px rgba(217, 136, 136, .16))}.sdc-combobox__control--disabled,.sdc-combobox__control--disabled:hover{background-color:var(--sdc-formfield-disabled-bg);border-color:var(--sdc-formfield-default-border);box-shadow:none;cursor:not-allowed}.sdc-combobox__control--small{min-height:30px}.sdc-combobox__value{display:flex;align-items:center;flex:1 1 auto;min-width:0;gap:.5rem;padding:0 .75rem}.sdc-combobox__leading-icon{color:var(--sdc-button-icon-default);flex:0 0 auto}.sdc-combobox__chip-icon,.sdc-combobox__option-icon{color:var(--sdc-button-icon-default)}.sdc-combobox__input{width:100%;min-width:0;border:0;background:transparent;box-shadow:none;outline:0;font:inherit;color:inherit;line-height:var(--sdc-formfield-default-line-height);padding:0;cursor:pointer}.sdc-combobox__input::placeholder{color:var(--sdc-form-placeholder-color, #9ca3af)}.sdc-combobox__input:disabled{cursor:not-allowed}.sdc-combobox__multi-value{display:flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;flex-wrap:nowrap;overflow:hidden;position:relative;padding:2px 0}.sdc-combobox__placeholder{color:var(--sdc-form-placeholder-color, #9ca3af);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__chips{display:none}.sdc-combobox__chip-list{display:flex;align-items:center;gap:.375rem;flex:1 1 auto;min-width:0;margin:0;overflow:hidden;padding:0;list-style:none;white-space:nowrap;mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 12px),transparent 100%)}.sdc-combobox__chip-list--measure{position:fixed;top:-9999px;left:0;z-index:-1;visibility:hidden;opacity:0;flex:0 0 auto;min-width:max-content;overflow:visible;pointer-events:none}.sdc-combobox__chip{display:inline-flex;align-items:center;gap:.5rem;flex:0 1 auto;min-width:0;max-width:100%;min-height:calc(var(--sdc-formfield-default-height, 34px) - 6px);padding:0 .55rem;border:1px solid #888b99;border-radius:6px;background:#eeebf2;color:var(--sdc-text-default, #111827)}.sdc-combobox__chip-label{display:inline-block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__chip-remove,.sdc-combobox__chip-remove-placeholder{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;padding:0;border:0;background:transparent;color:inherit;line-height:1}.sdc-combobox__chip-remove{cursor:pointer}.sdc-combobox__chip-remove:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:2px;border-radius:3px}.sdc-combobox__summary{color:var(--sdc-text-default, #111827);display:inline-block;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sdc-combobox__actions{display:flex;align-items:stretch;flex:0 0 auto}.sdc-combobox__icon-button{display:inline-flex;align-items:center;justify-content:center;min-width:2.5rem;padding:0 .75rem;border:0;background:transparent;color:var(--sdc-button-icon-default);cursor:pointer}.sdc-combobox__icon-button:disabled{background:var(--sdc-formfield-disabled-bg);cursor:not-allowed;opacity:.6}.sdc-combobox__icon-button:focus-visible{outline:2px solid var(--sdc-primary-color, #007bff);outline-offset:-2px;box-shadow:0 0 0 3px #007bff40}.sdc-combobox__icon-button:hover:not(:disabled){background:transparent}.sdc-combobox__icon-button--clear{min-width:2rem;padding:0 .5rem}.sdc-combobox__icon-button--toggle{border-left:1px solid var(--sdc-formfield-default-border)}.sdc-combobox__caret{transition:transform .16s ease}.sdc-combobox__caret--open{transform:rotate(180deg)}.sdc-combobox__panel{--sdc-combobox-panel-padding-x: .625rem;--sdc-combobox-panel-padding-y: .625rem;display:flex;flex-direction:column;gap:0;min-width:100%;padding:var(--sdc-combobox-panel-padding-y) var(--sdc-combobox-panel-padding-x) .5rem;overflow:hidden;box-sizing:border-box}.sdc-combobox__panel-search{flex:0 0 auto;margin-bottom:var(--sdc-combobox-panel-padding-y);width:100%}.sdc-combobox__panel-search-row{display:flex;align-items:center;gap:0;width:100%}.sdc-combobox__panel-select-all{display:inline-flex;align-items:center;justify-content:center;flex:0 0 2.5rem;min-width:2.5rem}.sdc-combobox__panel-searchbox{flex:1 1 auto;min-width:0}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox{width:100%}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__group{width:100%;background:var(--sdc-formfield-default-bg, #fff);box-shadow:none!important;min-height:calc(var(--sdc-formfield-default-height) - .25rem)}.sdc-combobox__panel-searchbox ::ng-deep .sdc-searchbox__input{color:var(--p-text-color, var(--sdc-text-default, #111827));caret-color:var(--p-text-color, var(--sdc-text-default, #111827))}.sdc-combobox__options{display:flex;flex-direction:column;gap:0;flex:1 1 auto;min-height:0;margin:0 calc(-1 * var(--sdc-combobox-panel-padding-x));overflow:auto;padding:0;list-style:none}.sdc-combobox__options--virtualized{display:block}.sdc-combobox__options-list{margin:0;padding:0;list-style:none}.sdc-combobox__option{display:flex;align-items:stretch;gap:0;list-style:none;min-height:2.75rem;background:transparent;transition:background-color .16s ease,color .16s ease}.sdc-combobox__option-action{display:flex;align-items:center;gap:.75rem;min-height:2.75rem;flex:1 1 auto;width:100%;padding:.625rem calc(var(--sdc-combobox-panel-padding-x) + .75rem);border:0;border-radius:0;background:transparent;color:inherit;font:inherit;text-align:left;cursor:pointer;transition:background-color .16s ease,color .16s ease,box-shadow .16s ease;box-sizing:border-box}.sdc-combobox__option--icon-selector .sdc-combobox__option-action{min-height:3.25rem}.sdc-combobox__option-action:hover,.sdc-combobox__option--active .sdc-combobox__option-action{background:transparent;box-shadow:none}.sdc-combobox__option:hover,.sdc-combobox__option--active,.sdc-combobox__option--selected{background:var(--sdc-combobox-option-hover-bg, #eeebf2)}.sdc-combobox__option-check{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));min-width:calc(2.5rem + var(--sdc-combobox-panel-padding-x));padding-left:var(--sdc-combobox-panel-padding-x);box-sizing:border-box}.sdc-combobox__option-check+.sdc-combobox__option-action{padding-left:.75rem}.sdc-combobox__option-content{display:inline-flex;align-items:center;gap:.5rem;flex:1 1 auto;min-width:0;color:#334155;font-size:.95rem}.sdc-combobox__option--icon-selector .sdc-combobox__option-content{align-items:flex-start}.sdc-combobox__option-texts{display:flex;flex:1 1 auto;flex-direction:column;gap:.125rem;min-width:0}.sdc-combobox__option-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-meta{color:var(--p-text-muted-color, #6b7280);font-family:var(--sdc-font-family-mono, \"Courier New\", monospace);font-size:.78rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sdc-combobox__option-selected-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__loading{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.875rem .75rem;color:var(--p-text-muted-color, #6b7280)}.sdc-combobox__loading-icon{color:var(--sdc-primary-color, #007bff)}.sdc-combobox__virtual-spacer{width:100%;flex:0 0 auto}.sdc-combobox__empty{--sdc-empty-state-inline-color: var(--p-text-muted-color, #6b7280);--sdc-empty-state-inline-font-size: .875rem;--sdc-empty-state-inline-line-height: 1.25rem;--sdc-empty-state-inline-padding: .5rem .625rem .375rem;flex:0 0 auto}::ng-deep .sdc-popover__panel.sdc-combobox__overlay-panel{box-shadow:0 12px 28px #0f172a24}\n"] }]
975
975
  }], ctorParameters: () => [], propDecorators: { multiple: [{
976
976
  type: Input
977
977
  }], appendTo: [{
@@ -1027,4 +1027,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
1027
1027
  type: ViewChild,
1028
1028
  args: ['optionsViewportRef']
1029
1029
  }] } });
1030
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JPLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLHlDQUF5QyxFQUN6Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEVBQy9DLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDbEMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxF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O2dCQUNNLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24sIGZvcndhcmRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENPTUJPQk9YX0RFRkFVTFRfTUFYX1NFTEVDVEVEX0xBQkVMUyxcbiAgQ09NQk9CT1hfREVGQVVMVF9QQU5FTF9NQVhfSEVJR0hULFxuICBDT01CT0JPWF9ERUZBVUxUX1pfSU5ERVgsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfQlVGRkVSX1NJWkUsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hULFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTUyxcbiAgQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9WSUVXUE9SVF9GQUxMQkFDS19IRUlHSFQsXG4gIENPTUJPQk9YX1JFTU9WRV9DSElQX0xBQkVMX0tFWSxcbiAgQ09NQk9CT1hfU0VMRUNURURfSVRFTVNfTEFCRUxfS0VZXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2NvbWJvYm94LmNvbnN0JztcbmltcG9ydCB7IEljb25TZWxlY3RvckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9pY29uLXNlbGVjdG9yLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBJbnB1dHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvaW5wdXRzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgdHlwZSB7IENoaXBSZW1vdmVFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvY2hpcHMudHlwZSc7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbkl0ZW0sIE9wdGlvbnMsIE9wdGlvblZhbHVlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZW1hbnRpY3MudHlwZSc7XG5pbXBvcnQgdHlwZSB7IFRvb2x0aXBFdmVudCwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90b29sdGlwLnR5cGUnO1xuaW1wb3J0IHsgcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2kxOG4udXRpbCc7XG5pbXBvcnQgeyBuZXh0U2VxdWVudGlhbElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pZC51dGlsJztcbmltcG9ydCB7IEljb25SZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvY29tcG9uZW50cy9pY29uLXJlbmRlcmVyL2ljb24tcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoYm94L3NlYXJjaGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgYXNDb21ib2JveEFycmF5LCBidWlsZENvbWJvYm94U2VhcmNoVGV4dCwgYnVpbGRDb21ib2JveFVpU3RhdGUsIGJ1aWxkSWNvblNlbGVjdG9yQ29tYm9ib3hPcHRpb25zLCBidWlsZFZpc2libGVDb21ib2JveE9wdGlvbnMsIGNyZWF0ZVJlc29sdmVkQ29tYm9ib3hPcHRpb24sIGdldEFjdGl2ZU9wdGlvblZhbHVlLCBnZXRGaXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSwgZ2V0U2VsZWN0ZWRDb3VudCwgbm9ybWFsaXplQ29tYm9ib3hTZWFyY2hUZXh0LCBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUsIHNob3VsZENvbGxhcHNlQ29tYm9ib3hDaGlwRGlzcGxheSwgdHlwZSBDb21ib2JveERpc3BsYXlNb2RlLCB0eXBlIENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIHR5cGUgQ29tYm9ib3hVaVN0YXRlLCB0eXBlIENvbWJvYm94VmFsdWUsIHR5cGUgQ29tYm9ib3hWaXNpYmxlT3B0aW9uLCB0eXBlIEhpZ2hsaWdodFN0ZXAsIHR5cGUgUGFuZWxDbG9zZVJlYXNvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvY29tYm9ib3gudXRpbCc7XG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgSWNvblJlbmRlcmVyQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgUG9wb3ZlckNvbXBvbmVudCxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgVG9vbHRpcENvbXBvbmVudFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ3NkYy1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIElucHV0c0NvbXBvbmVudDxPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGljb25TZWxlY3RvckRhdGEgPSBpbmplY3QoSWNvblNlbGVjdG9yRGF0YVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdGVkSWQgPSBuZXh0U2VxdWVudGlhbElkKCdzZGMtY29tYm9ib3gnKTtcbiAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwZW5kVG86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgekluZGV4ID0gQ09NQk9CT1hfREVGQVVMVF9aX0lOREVYO1xuICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25zIHwgc3RyaW5nID0gW107XG4gIEBJbnB1dCgpIG92ZXJyaWRlQ2hpcE1lc3NhZ2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heFNlbGVjdGVkTGFiZWxzID0gQ09NQk9CT1hfREVGQVVMVF9NQVhfU0VMRUNURURfTEFCRUxTO1xuICBASW5wdXQoKSBzaG93Q2xlYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzZWFyY2hhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgaWNvblNlbGVjdG9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dJY29uQ2xhc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgaW5mb1Rvb2x0aXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSAncmlnaHQnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcEV2ZW50OiBUb29sdGlwRXZlbnQgPSAnYm90aCc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwQWxsb3dIdG1sID0gZmFsc2U7XG4gIEBPdXRwdXQoJ29uU2VsZWN0ZWRJdGVtJykgc2VsZWN0ZWRWYWx1ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib2JveFZhbHVlPigpO1xuICBAT3V0cHV0KCkgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudCkgcG9wb3Zlcj86IFBvcG92ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJDb250cm9sUmVmJykgdHJpZ2dlckNvbnRyb2xSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2luZ2xlSW5wdXRSZWYnKSBzaW5nbGVJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsU2VhcmNoYm94UmVmJykgcGFuZWxTZWFyY2hib3g/OiBTZWFyY2hib3hDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ211bHRpVmFsdWVSZWYnKSBtdWx0aVZhbHVlUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NoaXBNZWFzdXJlUmVmJykgY2hpcE1lYXN1cmVSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1ZpZXdwb3J0UmVmJykgb3B0aW9uc1ZpZXdwb3J0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHZpc2libGVGaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFZpc2libGVPcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsdWU6IENvbWJvYm94VmFsdWUgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU1vZGU6IENvbWJvYm94RGlzcGxheU1vZGUgPSAnY2hpcCc7XG4gIHB1YmxpYyBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgcHVibGljIGhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgcHVibGljIHNlYXJjaFRlcm0gPSAnJztcbiAgcHVibGljIGljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVLZXk6IHVua25vd24gPSBudWxsO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnNDYWNoZTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGU6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGljb25PcHRpb25zTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBza2lwTmV4dEZvY3VzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlO1xuICBwcml2YXRlIGNoaXBMYXlvdXRPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHZpc2libGVTdGFydEluZGV4ID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlRW5kSW5kZXggPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLmhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIHRoaXMuaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHRoaXMuaW52YWxpZCAmJiAhdGhpcy5oYXNTZWFyY2hRdWVyeSk7XG4gICAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzKSkge1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtdWx0aVZhbHVlRWxlbWVudCA9IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBtdWx0aVZhbHVlRWxlbWVudCkge1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCkpO1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIub2JzZXJ2ZShtdWx0aVZhbHVlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hpcExheW91dE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogQ29tYm9ib3hWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUodmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB1aSgpOiBDb21ib2JveFVpU3RhdGUge1xuICAgIHJldHVybiBidWlsZENvbWJvYm94VWlTdGF0ZSh7XG4gICAgICBnZW5lcmF0ZWRJZDogdGhpcy5nZW5lcmF0ZWRJZCxcbiAgICAgIGlkZW50aXR5SWQ6IHRoaXMuaWRlbnRpdHkuaWQsXG4gICAgICBpZGVudGl0eU5hbWU6IHRoaXMuaWRlbnRpdHkubmFtZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBpbmZvVG9vbHRpcDogdGhpcy5pbmZvVG9vbHRpcCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkLFxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRyYW5zbGF0ZVRleHQ6ICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKVxuICAgIH0pO1xuICB9XG4gIGdldCBub3JtYWxpemVkT3B0aW9ucygpOiBPcHRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTaW5nbGVPcHRpb24oKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLnZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiB0aGlzLnJlc29sdmVPcHRpb24oZW50cnkpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiA9PiAhIWl0ZW0pO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ3N1bW1hcnknICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzZWxlY3RlZEl0ZW1zTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRoaXMub3ZlcnJpZGVDaGlwTWVzc2FnZSxcbiAgICAgIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWSxcbiAgICAgIHsgY291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCB9XG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXNMYWJlbC5yZXBsYWNlKC9cXHtjb3VudFxcfS9nLCBTdHJpbmcodGhpcy5zZWxlY3RlZENvdW50KSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwID8gdGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpIDogbnVsbDtcbiAgfVxuICBnZXQgaGFzQ2xlYXJBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyICYmIHRoaXMuc2VsZWN0ZWRDb3VudCA+IDA7XG4gIH1cbiAgZ2V0IHBhbmVsTWF4SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVDtcbiAgfVxuICBnZXQgYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMuaXNPcHRpb25TZWxlY3RlZChpdGVtKSk7XG4gIH1cbiAgZ2V0IGhhc1NlYXJjaFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5zZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBpc09wdGlvbnNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmljb25TZWxlY3RvciAmJiB0aGlzLmljb25PcHRpb25zTG9hZGluZyAmJiB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyAhPT0gdGhpcy5jdXJyZW50TGFuZztcbiAgfVxuICBnZXQgdXNlVmlydHVhbGl6ZWRPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmljb25TZWxlY3RvciAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgc2hvd0VtcHR5U3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT3B0aW9uc0xvYWRpbmcgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBnZXQgb3B0aW9uUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ljb25DbGFzc1xuICAgICAgPyBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTU1xuICAgICAgOiBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0RFRkFVTFRfUk9XX0hFSUdIVDtcbiAgfVxuICBnZXQgYmVmb3JlVmlydHVhbFNwYWNlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVTdGFydEluZGV4ICogdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gIH1cbiAgZ2V0IGFmdGVyVmlydHVhbFNwYWNlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMudmlzaWJsZUVuZEluZGV4KSAqIHRoaXMub3B0aW9uUm93SGVpZ2h0KTtcbiAgfVxuICBvblNlYXJjaChldmVudDogeyBxdWVyeT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25TZWFyY2hUZXJtQ2hhbmdlKFN0cmluZyhldmVudD8ucXVlcnkgPz8gJycpKTtcbiAgfVxuICBvblBhbmVsSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaFRlcm1DaGFuZ2UoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCk/LnZhbHVlID8/ICcnKTtcbiAgfVxuICBvblNlYXJjaFRlcm1DaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogZmFsc2UgfSk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gIH1cbiAgb25PcHRpb25zU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoKTtcbiAgfVxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2tpcE5leHRGb2N1c09wZW4pIHtcbiAgICAgIHRoaXMuc2tpcE5leHRGb2N1c09wZW4gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xpY2tXaWxsT3BlblBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgb25JbnB1dEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0LmlkID09PSB0aGlzLnVpLnBhbmVsU2VhcmNoSWRlbnRpdHkuaWQpIHtcbiAgICAgIHRoaXMub25TZWFyY2hib3hLZXlkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblRyaWdnZXJLZXlkb3duKGV2ZW50KTtcbiAgfVxuICBvblRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlUHJpbnRhYmxlVHJpZ2dlcktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlVHJpZ2dlckFycm93S2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVUcmlnZ2VyT3BlbktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBvblNlYXJjaGJveEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVNlYXJjaGJveFNlbGVjdGlvbktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBvbkNvbnRyb2xNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIC8vIEtlZXAgdGhlIHBhbmVsIHNlYXJjaGJveCBmb2N1c2VkIGV2ZW4gd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHRyaWdnZXIgYXJlYSBhZ2Fpbi5cbiAgICAgIC8vIFdpdGhvdXQgcHJldmVudGluZyB0aGUgdHJpZ2dlciBmcm9tIHRha2luZyBmb2N1cyBmaXJzdCwgdGhlIGNhcmV0IG1heSBkaXNhcHBlYXIgZXZlblxuICAgICAgLy8gdGhvdWdoIHR5cGluZyBzdGlsbCB1cGRhdGVzIHRoZSBzZWFyY2hib3guXG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdXBwcmVzcyBmb2N1cy10cmlnZ2VyZWQgb3BlbjogaW4gc2luZ2xlIG1vZGUgdGhlIGlucHV0IHJlY2VpdmVzIGZvY3VzIG9uIG1vdXNlZG93bixcbiAgICAvLyB3aGljaCBmaXJlcyBvbklucHV0Rm9jdXMoKSBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50LiBXaXRob3V0IHRoaXMgZmxhZywgb25JbnB1dEZvY3VzXG4gICAgLy8gd291bGQgb3BlbiB0aGUgcGFuZWwgYW5kIHRoZSBzdWJzZXF1ZW50IGNsaWNrIChvbkNvbnRyb2xDbGljaykgd291bGQgaW1tZWRpYXRlbHkgY2xvc2UgaXQuXG4gICAgdGhpcy5jbGlja1dpbGxPcGVuUGFuZWwgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlOyB9LCAwKTtcbiAgfVxuICBvbkNvbnRyb2xDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgfVxuICBvblRvZ2dsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIG9uUG9wb3Zlck9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChvcGVuIHx8ICF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlUGFuZWwoJ291dHNpZGUnKTtcbiAgfVxuICB0b2dnbGVQYW5lbChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgndG9nZ2xlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgfVxuICBjbGVhckFsbChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBjb25zdCBjbGVhcmVkVmFsdWU6IE9wdGlvblZhbHVlIHwgT3B0aW9uVmFsdWVbXSB8IG51bGwgPSB0aGlzLm11bHRpcGxlID8gW10gOiBudWxsO1xuICAgIGNvbnN0IHNob3VsZFJlZm9jdXNTZWFyY2ggPSB0aGlzLnBhbmVsT3BlbjtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnZhbHVlID0gY2xlYXJlZFZhbHVlO1xuICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlKGNsZWFyZWRWYWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlRXZlbnQuZW1pdChjbGVhcmVkVmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheU1vZGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHNob3VsZFJlZm9jdXNTZWFyY2gpIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIG9uT3B0aW9uQ2xpY2sob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlT3B0aW9uKG9wdGlvbik7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdFNpbmdsZU9wdGlvbihvcHRpb24pO1xuICB9XG4gIG9uT3B0aW9uQ2hlY2tib3hDaGFuZ2Uob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVPcHRpb24ob3B0aW9uLCBjaGVja2VkKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIG9uT3B0aW9uQ2hlY2tib3hLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCd0b2dnbGUnKTtcbiAgICB9XG4gIH1cbiAgb25PcHRpb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vbk9wdGlvbkNsaWNrKG9wdGlvbik7XG4gIH1cbiAgdG9nZ2xlQWxsRmlsdGVyZWRJdGVtcyhjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKSk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5maWx0ZXJlZEl0ZW1zKSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWVzLmRlbGV0ZShvcHRpb24udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcmRlcmVkVmFsdWVzID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKClcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBzZWxlY3RlZFZhbHVlcy5oYXMoZW50cnkudmFsdWUpKVxuICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcmRlcmVkVmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihjdXJyZW50QWN0aXZlVmFsdWUpO1xuICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gIH1cbiAgcmVtb3ZlU2VsZWN0ZWRJdGVtKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKS5maWx0ZXIoKGVudHJ5KSA9PiAhT2JqZWN0LmlzKGVudHJ5LCBvcHRpb24udmFsdWUpKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShjdXJyZW50VmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihjdXJyZW50QWN0aXZlVmFsdWUpO1xuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICB9XG4gIH1cbiAgb25DaGlwUmVtb3ZlZChldmVudDogQ2hpcFJlbW92ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5yZXNvbHZlT3B0aW9uKGV2ZW50LnZhbHVlKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkSXRlbShvcHRpb24sIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICB9XG4gIHJlc29sdmVPcHRpb24ob3B0T3JWYWx1ZTogdW5rbm93bik6IENvbWJvYm94UmVzb2x2ZWRPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgICBpZiAob3B0T3JWYWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRPclZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgb2JqID0gb3B0T3JWYWx1ZSBhcyB7IHRleHQ/OiBzdHJpbmc7IHZhbHVlPzogT3B0aW9uVmFsdWUgfTtcbiAgICAgIGlmICgndGV4dCcgaW4gb2JqICYmICd2YWx1ZScgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uKG9iaiBhcyBPcHRpb25JdGVtKSxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVRleHQob2JqLnRleHQpLFxuICAgICAgICAgIHNlYXJjaFRleHQ6IGJ1aWxkQ29tYm9ib3hTZWFyY2hUZXh0KHRoaXMudHJhbnNsYXRlVGV4dChvYmoudGV4dCksIHRoaXMuYXNUZXh0KG9iai52YWx1ZSkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIGFsbC5maW5kKChvcHRpb24pID0+IE9iamVjdC5pcyhvcHRpb24udmFsdWUsIG9iai52YWx1ZSkpID8/IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGwuZmluZCgob3B0aW9uKSA9PiBPYmplY3QuaXMob3B0aW9uLnZhbHVlLCBvcHRPclZhbHVlIGFzIE9wdGlvblZhbHVlKSkgPz8gbnVsbDtcbiAgfVxuICBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkuc29tZSgoZW50cnkpID0+IE9iamVjdC5pcyhlbnRyeSwgb3B0aW9uLnZhbHVlKSk7XG4gIH1cbiAgaXNPcHRpb25BY3RpdmUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPT09IGluZGV4O1xuICB9XG4gIG9uT3B0aW9uTW91c2VFbnRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KGluZGV4LCBmYWxzZSk7XG4gIH1cbiAgb25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgb3B0aW9uTWV0YVRleHQob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmljb25TZWxlY3RvciB8fCAhdGhpcy5zaG93SWNvbkNsYXNzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbi5pY29uQ2xhc3NOYW1lID8/IG51bGw7XG4gIH1cbiAgb3B0aW9uSWQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudWkuY29udHJvbElkfS1vcHRpb24tJHtpbmRleH1gO1xuICB9XG4gIGNoaXBSZW1vdmVBcmlhTGFiZWwob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHJlc29sdmVUcmFuc2xhdGFibGVUZXh0KHRoaXMudHJhbnNsYXRlLCBudWxsLCBDT01CT0JPWF9SRU1PVkVfQ0hJUF9MQUJFTF9LRVkpO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtsYWJlbFxcfS9nLCBvcHRpb24udGV4dCk7XG4gIH1cbiAgdHJhY2tCeU9wdGlvblZhbHVlID0gKF9pbmRleDogbnVtYmVyLCBpdGVtOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogT3B0aW9uVmFsdWUgPT4gaXRlbS52YWx1ZTtcbiAgcHJpdmF0ZSBvcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5QYW5lbCh7IGZvY3VzU2VhcmNoOiB0aGlzLnNlYXJjaGFibGUgfSk7XG4gIH1cbiAgcHJpdmF0ZSBvcGVuUGFuZWwob3B0aW9uczogeyBmb2N1c1NlYXJjaDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbih0aGlzLnJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnBvcG92ZXI/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKHRydWUpO1xuICAgIGlmIChvcHRpb25zLmZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsb3NlUGFuZWwocmVhc29uOiBQYW5lbENsb3NlUmVhc29uKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdG9yZVRyaWdnZXJGb2N1cyA9IHJlYXNvbiA9PT0gJ2VzY2FwZScgfHwgcmVhc29uID09PSAnc2VsZWN0aW9uJyB8fCByZWFzb24gPT09ICd0b2dnbGUnO1xuICAgIHRoaXMucGFuZWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMucGFuZWxDbG9zZWQuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChyZXN0b3JlVHJpZ2dlckZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJpZ2dlclNvb24oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmb2N1c1NlYXJjaGJveFNvb24oKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNTZWFyY2hib3goKSwgMCk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgfVxuICBwcml2YXRlIGZvY3VzVHJpZ2dlclNvb24oKTogdm9pZCB7IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNUcmlnZ2VyKCkpOyB9XG4gIHByaXZhdGUgZm9jdXNTZWFyY2hib3goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2luZ2xlSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmJsdXIoKTtcbiAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5ibHVyPy4oKTtcbiAgICB0aGlzLnBhbmVsU2VhcmNoYm94Py5mb2N1c0lucHV0KCk7XG4gICAgdGhpcy5wb3BvdmVyPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnNpbmdsZUlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG4gIHByaXZhdGUgcmVmcmVzaEZpbHRlcmVkSXRlbXMocHJlc2VydmVDdXJyZW50SW52YWxpZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaGFibGUgPyBub3JtYWxpemVDb21ib2JveFNlYXJjaFRleHQodGhpcy5zZWFyY2hUZXJtKSA6ICcnO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpO1xuICAgIGlmICh0aGlzLmlzT3B0aW9uc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gcXVlcnlcbiAgICAgID8gYWxsLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWFyY2hUZXh0LmluY2x1ZGVzKHF1ZXJ5KSlcbiAgICAgIDogYWxsLnNsaWNlKCk7XG4gICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoIXF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5ICYmIHByZXNlcnZlQ3VycmVudEludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnZhbGlkID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkubGVuZ3RoID09PSAwICYmIHF1ZXJ5Lmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJpdmF0ZSBzZXRIaWdobGlnaHRlZEluZGV4KGluZGV4OiBudW1iZXIsIGVuc3VyZVZpc2libGUgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKSk7XG4gICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gbmV4dEluZGV4O1xuICAgIGlmIChlbnN1cmVWaXNpYmxlICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLnNjcm9sbEhpZ2hsaWdodGVkT3B0aW9uSW50b1ZpZXcoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBtb3ZlSGlnaGxpZ2h0KHN0ZXA6IEhpZ2hsaWdodFN0ZXApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oaWdobGlnaHRlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHN0ZXAgPiAwID8gMCA6IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gZmFsc2U7XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KCh0aGlzLmhpZ2hsaWdodGVkSW5kZXggKyBzdGVwICsgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkgJSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKHByZWZlcnJlZFZhbHVlOiBPcHRpb25WYWx1ZSB8IG51bGwgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FuZGlkYXRlVmFsdWVzID0gW1xuICAgICAgcHJlZmVycmVkVmFsdWUsXG4gICAgICAhdGhpcy5tdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWRTaW5nbGVPcHRpb24/LnZhbHVlID8/IG51bGwgOiB0aGlzLmZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlLFxuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zWzBdPy52YWx1ZSA/PyBudWxsXG4gICAgXTtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBjYW5kaWRhdGVWYWx1ZXNcbiAgICAgIC5tYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PSBudWxsID8gLTEgOiB0aGlzLmZpbHRlcmVkSXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBPYmplY3QuaXMoaXRlbS52YWx1ZSwgdmFsdWUpKSlcbiAgICAgIC5maW5kKChpbmRleCkgPT4gaW5kZXggPj0gMCk7XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KG5leHRJbmRleCA/PyAwKTtcbiAgfVxuICBwcml2YXRlIHNjcm9sbEhpZ2hsaWdodGVkT3B0aW9uSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMub3B0aW9uc1ZpZXdwb3J0UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvblRvcCA9IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCAqIHRoaXMub3B0aW9uUm93SGVpZ2h0O1xuICAgICAgY29uc3Qgb3B0aW9uQm90dG9tID0gb3B0aW9uVG9wICsgdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gICAgICBjb25zdCB2aWV3cG9ydFRvcCA9IHZpZXdwb3J0LnNjcm9sbFRvcDtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Qm90dG9tID0gdmlld3BvcnRUb3AgKyB2aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG4gICAgICBpZiAob3B0aW9uVG9wIDwgdmlld3BvcnRUb3ApIHtcbiAgICAgICAgdmlld3BvcnQuc2Nyb2xsVG9wID0gb3B0aW9uVG9wO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25Cb3R0b20gPiB2aWV3cG9ydEJvdHRvbSkge1xuICAgICAgICB2aWV3cG9ydC5zY3JvbGxUb3AgPSBvcHRpb25Cb3R0b20gLSB2aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgaGlnaGxpZ2h0ZWQgb3B0aW9uIGlzIGFscmVhZHkgZnVsbHkgdmlzaWJsZS5cbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbklkKHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCkpO1xuICAgICAgaWYgKHR5cGVvZiBub2RlPy5zY3JvbGxJbnRvVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBub2RlLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdEhpZ2hsaWdodGVkT3B0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMuZmlsdGVyZWRJdGVtc1t0aGlzLmhpZ2hsaWdodGVkSW5kZXhdO1xuICAgIGlmICghYWN0aXZlT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbihhY3RpdmVPcHRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTaW5nbGVPcHRpb24oYWN0aXZlT3B0aW9uKTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdFNpbmdsZU9wdGlvbihvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIHRoaXMuY2xvc2VQYW5lbCgnc2VsZWN0aW9uJyk7XG4gIH1cbiAgcHJpdmF0ZSB0b2dnbGVPcHRpb24ob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gbmV3IFNldChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkpO1xuICAgIGNvbnN0IHNob3VsZFNlbGVjdCA9IHRoaXMucmVzb2x2ZU9wdGlvbkNoZWNrZWRTdGF0ZShzZWxlY3RlZFZhbHVlcywgb3B0aW9uLCBmb3JjZUNoZWNrZWQpO1xuICAgIGlmIChzaG91bGRTZWxlY3QpIHtcbiAgICAgIHNlbGVjdGVkVmFsdWVzLmFkZChvcHRpb24udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZFZhbHVlcy5kZWxldGUob3B0aW9uLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3JkZXJlZFZhbHVlcyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gc2VsZWN0ZWRWYWx1ZXMuaGFzKGVudHJ5LnZhbHVlKSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3JkZXJlZFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24ob3B0aW9uLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gYnVpbGRWaXNpYmxlQ29tYm9ib3hPcHRpb25zKHtcbiAgICAgIHJlc2V0U2Nyb2xsLFxuICAgICAgYnVmZmVyU2l6ZTogQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9CVUZGRVJfU0laRSxcbiAgICAgIGZhbGxiYWNrVmlld3BvcnRIZWlnaHQ6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfVklFV1BPUlRfRkFMTEJBQ0tfSEVJR0hULFxuICAgICAgZmlsdGVyZWRJdGVtczogdGhpcy5maWx0ZXJlZEl0ZW1zLFxuICAgICAgb3B0aW9uUm93SGVpZ2h0OiB0aGlzLm9wdGlvblJvd0hlaWdodCxcbiAgICAgIHVzZVZpcnR1YWxpemVkT3B0aW9uczogdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMsXG4gICAgICB2aWV3cG9ydDogdGhpcy5vcHRpb25zVmlld3BvcnRSZWY/Lm5hdGl2ZUVsZW1lbnRcbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGVTdGFydEluZGV4ID0gbmV4dFN0YXRlLnZpc2libGVTdGFydEluZGV4O1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gbmV4dFN0YXRlLnZpc2libGVFbmRJbmRleDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gbmV4dFN0YXRlLnZpc2libGVGaWx0ZXJlZEl0ZW1zO1xuICB9XG4gIHByaXZhdGUgbm9ybWFsaXplT3B0aW9ucygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIGlmICh0aGlzLmljb25TZWxlY3Rvcikge1xuICAgICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgICBpZiAodGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb25PcHRpb25zQ2FjaGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5jdXJyZW50TGFuZztcbiAgICBpZiAodGhpcy5vcHRpb25zID09PSB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgJiYgdGhpcy5fb3B0aW9uc0NhY2hlTGFuZyA9PT0gY3VycmVudExhbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBhcnNlTm9ybWFsaXplZE9wdGlvbnNJbnB1dCgpO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUtleSA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVMYW5nID0gY3VycmVudExhbmc7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlID0gbmV4dC5tYXAoKG9wdGlvbikgPT4gY3JlYXRlUmVzb2x2ZWRDb21ib2JveE9wdGlvbihvcHRpb24sICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKSkpO1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ2FjaGU7XG4gIH1cbiAgcHJpdmF0ZSBhc1RleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7IH1cbiAgcHJpdmF0ZSB0cmFuc2xhdGVUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHsgcmV0dXJuIHJlc29sdmVUcmFuc2xhdGFibGVUZXh0KHRoaXMudHJhbnNsYXRlLCB0aGlzLmFzVGV4dCh2YWx1ZSkpOyB9XG4gIHByaXZhdGUgcGFyc2VOb3JtYWxpemVkT3B0aW9uc0lucHV0KCk6IE9wdGlvbkl0ZW1bXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyBhcyBPcHRpb25JdGVtW107XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRoaXMub3B0aW9ucyB8fCAnW10nKTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyAocGFyc2VkIGFzIE9wdGlvbkl0ZW1bXSkgOiBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3VycmVudExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgPz8gdGhpcy50cmFuc2xhdGUuZ2V0RGVmYXVsdExhbmc/LigpID8/ICcnO1xuICB9XG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRDb3VudCh0aGlzLnZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgfVxuICBwcml2YXRlIGdldCBhY3RpdmVPcHRpb25WYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIHJldHVybiBnZXRBY3RpdmVPcHRpb25WYWx1ZSh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUoKTogT3B0aW9uVmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gZ2V0Rmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZURpc3BsYXlNb2RlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5kaXNwbGF5TW9kZSA9ICdzdW1tYXJ5JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IHRoaXMuc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpID8gJ3N1bW1hcnknIDogJ2NoaXAnO1xuICB9XG4gIHByaXZhdGUgcHJvcGFnYXRlRnJvbVZhbHVlKHZhbHVlOiBPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIGlmIChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVtaXR0ZWRWYWx1ZSA9IHRoaXMudmFsdWUgPz8gKHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUV2ZW50LmVtaXQoZW1pdHRlZFZhbHVlKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUNoYXJhY3RlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk6IHZvaWQge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuc3luY0NoaXBQcmVzZW50YXRpb24oKSk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5zeW5jQ2hpcFByZXNlbnRhdGlvbigpKTtcbiAgfVxuICBwcml2YXRlIHN5bmNDaGlwUHJlc2VudGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHREaXNwbGF5TW9kZTogJ2NoaXAnIHwgJ3N1bW1hcnknID0gdGhpcy5zaG91bGRDb2xsYXBzZUNoaXBEaXNwbGF5VG9TdW1tYXJ5KCkgPyAnc3VtbWFyeScgOiAnY2hpcCc7XG4gICAgaWYgKHRoaXMuZGlzcGxheU1vZGUgPT09IG5leHREaXNwbGF5TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXlNb2RlID0gbmV4dERpc3BsYXlNb2RlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHByaXZhdGUgc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2hvdWxkQ29sbGFwc2VDb21ib2JveENoaXBEaXNwbGF5KHtcbiAgICAgIG11bHRpcGxlOiB0aGlzLm11bHRpcGxlLFxuICAgICAgc2VsZWN0ZWRJdGVtQ291bnQ6IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICBzZWxlY3RlZENvdW50OiB0aGlzLnNlbGVjdGVkQ291bnQsXG4gICAgICBtYXhTZWxlY3RlZExhYmVsczogdGhpcy5tYXhTZWxlY3RlZExhYmVscyxcbiAgICAgIGF2YWlsYWJsZVdpZHRoOiB0aGlzLm11bHRpVmFsdWVSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudFdpZHRoID8/IDAsXG4gICAgICByZXF1aXJlZFdpZHRoOiB0aGlzLmNoaXBNZWFzdXJlUmVmPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxXaWR0aCA/PyAwXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldE9wdGlvbnNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgPSBudWxsO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUxhbmcgPSAnJztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGUgPSBbXTtcbiAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9ICcnO1xuICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBbXTtcbiAgfVxuICBwcml2YXRlIHJlZnJlc2hDb21ib2JveFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZU9wdGlvbnNDYWNoZUNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVzZXRPcHRpb25zQ2FjaGUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVWaXJ0dWFsV2luZG93Q2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZWxlY3RvciddIHx8IGNoYW5nZXNbJ3Nob3dJY29uQ2xhc3MnXSkge1xuICAgICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVJY29uU2VsZWN0b3JDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaWNvblNlbGVjdG9yJ10pIHtcbiAgICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNPcHRpb25DaGFuZ2VzID0gISFjaGFuZ2VzWydvcHRpb25zJ107XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uQ2hhbmdlcyA9ICEhY2hhbmdlc1snbXVsdGlwbGUnXSB8fCAhIWNoYW5nZXNbJ3ZhbHVlJ107XG4gICAgY29uc3QgaGFzSWNvbkNoYW5nZXMgPSAhIWNoYW5nZXNbJ2ljb25TZWxlY3RvciddIHx8ICEhY2hhbmdlc1snc2hvd0ljb25DbGFzcyddO1xuXG4gICAgcmV0dXJuIGhhc09wdGlvbkNoYW5nZXMgfHwgaGFzU2VsZWN0aW9uQ2hhbmdlcyB8fCBoYXNJY29uQ2hhbmdlcztcbiAgfVxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNoYW5nZXNbJ211bHRpcGxlJ10gfHwgY2hhbmdlc1snbWF4U2VsZWN0ZWRMYWJlbHMnXSB8fCBjaGFuZ2VzWyd2YWx1ZSddKTtcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIWNoYW5nZXNbJ211bHRpcGxlJ10gfHwgIXRoaXMubXVsdGlwbGUgfHwgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSB8fCB0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IFt0aGlzLnZhbHVlXTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVByaW50YWJsZVRyaWdnZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ByaW50YWJsZUNoYXJhY3RlcihldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBldmVudC5rZXk7XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyQXJyb3dLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubmF2aWdhdGVUcmlnZ2VyQXJyb3coMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRyaWdnZXJBcnJvdygtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgbmF2aWdhdGVUcmlnZ2VyQXJyb3coc3RlcDogSGlnaGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgICAgIGlmIChzdGVwIDwgMCkge1xuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vdmVIaWdobGlnaHQoc3RlcCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyT3BlbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzT3BlbktleSA9IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJztcblxuICAgIGlmICghaXNPcGVuS2V5IHx8IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KDApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbmQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZE9wdGlvbigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgnZXNjYXBlJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuY2xvc2VQYW5lbCgndGFiJykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdCYWNrc3BhY2UnIHx8ICF0aGlzLm11bHRpcGxlIHx8IHRoaXMuaGFzU2VhcmNoUXVlcnkgfHwgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0sIGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhhc1NlYXJjaFF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNpbmdsZU9wdGlvbj8udmFsdWUgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uQ2hlY2tlZFN0YXRlKFxuICAgIHNlbGVjdGVkVmFsdWVzOiBTZXQ8T3B0aW9uVmFsdWU+LFxuICAgIG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbixcbiAgICBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChmb3JjZUNoZWNrZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmb3JjZUNoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiAhc2VsZWN0ZWRWYWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pY29uU2VsZWN0b3IgfHwgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcgfHwgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UgPSB0aGlzLmljb25TZWxlY3RvckRhdGFcbiAgICAgIC5sb2FkRm9udEF3ZXNvbWVWNVNvbGlkSWNvbnMoKVxuICAgICAgLnRoZW4oKGljb25zKSA9PiB7XG4gICAgICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBidWlsZEljb25TZWxlY3RvckNvbWJvYm94T3B0aW9ucyhpY29ucywgKHZhbHVlKSA9PiB0aGlzLnRyYW5zbGF0ZVRleHQodmFsdWUpKTtcbiAgICAgICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPSB0aGlzLmN1cnJlbnRMYW5nO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29tYm9ib3hTdGF0ZSgpO1xuICAgICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpc2libGVPcHRpb25zU3luYyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMocmVzZXRTY3JvbGwpKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCkpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRWaXJ0dWFsV2luZG93KCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggPSAwO1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gMDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gW107XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hcIj5cbiAgQGlmICh1aS5sYWJlbFRleHQgfHwgdWkuaW5mb1Rvb2x0aXBUZXh0KSB7XG4gICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWwtcm93XCI+XG4gICAgICBAaWYgKHVpLmxhYmVsVGV4dCkge1xuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBbaWRdPVwidWkubGFiZWxJZFwiXG4gICAgICAgICAgW2Zvcl09XCJ1aS5sYWJlbEZvcklkXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVxdWlyZWQgPyB1aS5sYWJlbFRleHQgKyAnICcgKyB1aS5yZXF1aXJlZEZpZWxkVGV4dCA6IHVpLmxhYmVsVGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbC10ZXh0XCI+XG4gICAgICAgICAgICB7eyB1aS5sYWJlbFRleHQgfX1cbiAgICAgICAgICAgIEBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgfVxuICAgICAgQGlmICh1aS5pbmZvVG9vbHRpcFRleHQpIHtcbiAgICAgICAgPHNkYy10b29sdGlwXG4gICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2luZm8tdG9vbHRpcC13cmFwXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwidWkuaW5mb1Rvb2x0aXBUZXh0XCJcbiAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImluZm9Ub29sdGlwUG9zaXRpb25cIlxuICAgICAgICAgIFt0b29sdGlwRXZlbnRdPVwiaW5mb1Rvb2x0aXBFdmVudFwiXG4gICAgICAgICAgW2FsbG93SHRtbF09XCJpbmZvVG9vbHRpcEFsbG93SHRtbFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlIHNkYy1jb21ib2JveF9faW5mby10b29sdGlwLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc2RjLXRvb2x0aXA+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8c2RjLXBvcG92ZXJcbiAgICBbb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgIFthcHBlbmRUb109XCJhcHBlbmRUb1wiXG4gICAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICAgIFtvZmZzZXRdPVwidWkucGFuZWxPZmZzZXRcIlxuICAgIFthcmlhTGFiZWxdPVwidWkuZHJvcGRvd25BcmlhTGFiZWxcIlxuICAgIFttYXRjaFRyaWdnZXJXaWR0aF09XCJ0cnVlXCJcbiAgICBbdG9nZ2xlT25UcmlnZ2VyQ2xpY2tdPVwiZmFsc2VcIlxuICAgIFtjbG9zZU9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICBbcGFuZWxDbGFzc109XCJ1aS5wYW5lbE92ZXJsYXlDbGFzc1wiXG4gICAgKG9wZW5DaGFuZ2UpPVwib25Qb3BvdmVyT3BlbkNoYW5nZSgkZXZlbnQpXCJcbiAgICA+XG4gICAgPGRpdlxuICAgICAgc2RjLXBvcG92ZXItdHJpZ2dlclxuICAgICAgI3RyaWdnZXJDb250cm9sUmVmXG4gICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY29udHJvbFwiXG4gICAgICBbYXR0ci5pZF09XCJtdWx0aXBsZSA/IHVpLmNvbnRyb2xJZCA6IG51bGxcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0tbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxuICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY29udHJvbC0taW52YWxpZF09XCJpbnZhbGlkXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLWRpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLXNtYWxsXT1cInNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgW25nU3R5bGVdPVwiZ2V0SW5wdXRTdHlsZSgpXCJcbiAgICAgIFthdHRyLnRhYmluZGV4XT1cIm11bHRpcGxlICYmICFkaXNhYmxlZCA/IDAgOiBudWxsXCJcbiAgICAgIFthdHRyLnJvbGVdPVwibXVsdGlwbGUgPyAnY29tYm9ib3gnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIm11bHRpcGxlID8gJ2xpc3Rib3gnIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIm11bHRpcGxlID8gdWkuY29tYm9ib3hBcmlhTGFiZWwgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJtdWx0aXBsZSA/IHVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnkgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwibXVsdGlwbGUgPyByZXF1aXJlZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cIm11bHRpcGxlID8gaW52YWxpZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJtdWx0aXBsZSA/IChwYW5lbE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnKSA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJtdWx0aXBsZSA/IHVpLmxpc3Rib3hJZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1hY3RpdmVkZXNjZW5kYW50XT1cIm11bHRpcGxlID8gYWN0aXZlRGVzY2VuZGFudCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1kZXNjcmliZWRieV09XCJtdWx0aXBsZSA/IHVpLm1lc3NhZ2VJZCA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1hdXRvY29tcGxldGVdPVwibXVsdGlwbGUgPyAnbGlzdCcgOiBudWxsXCJcbiAgICAgIChtb3VzZWRvd24pPVwib25Db250cm9sTW91c2VEb3duKCRldmVudClcIlxuICAgICAgKGNsaWNrKT1cIm9uQ29udHJvbENsaWNrKClcIlxuICAgICAgKGtleWRvd24pPVwibXVsdGlwbGUgPyBvblRyaWdnZXJLZXlkb3duKCRldmVudCkgOiBudWxsXCJcbiAgICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3ZhbHVlXCI+XG4gICAgICAgIEBpZiAoIW11bHRpcGxlKSB7XG4gICAgICAgICAgQGlmIChzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvbikge1xuICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19sZWFkaW5nLWljb25cIlxuICAgICAgICAgICAgICBbaWNvbl09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvblwiXG4gICAgICAgICAgICAgIFtpY29uVHlwZV09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8uaWNvblR5cGVcIlxuICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICB9XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAjc2luZ2xlSW5wdXRSZWZcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19pbnB1dFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBbaWRdPVwidWkuY29udHJvbElkXCJcbiAgICAgICAgICAgIFtuYW1lXT1cInVpLmlucHV0TmFtZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInJlcXVpcmVkXCJcbiAgICAgICAgICAgIFtyZWFkT25seV09XCJ0cnVlXCJcbiAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZFNpbmdsZU9wdGlvbj8udGV4dCA/PyAnJ1wiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidWkucGxhY2Vob2xkZXJUZXh0XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1yZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICAgICAgICBhcmlhLWV4cGFuZGVkPVwiZmFsc2VcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW4gPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGFzcG9wdXBdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgIGFyaWEtY29udHJvbHM9XCJjb21ib2JveC1maWVsZC1saXN0Ym94XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJhY3RpdmVEZXNjZW5kYW50XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgIHJvbGU9XCJjb21ib2JveFwiXG4gICAgICAgICAgICBhcmlhLWF1dG9jb21wbGV0ZT1cImxpc3RcIlxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJvbklucHV0Rm9jdXMoKVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblRyaWdnZXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgI211bHRpVmFsdWVSZWYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX211bHRpLXZhbHVlXCI+XG4gICAgICAgICAgICAgIEBpZiAoIXNob3VsZERpc3BsYXlDaGlwU3VtbWFyeSkge1xuICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGlzdFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwic2VsZWN0ZWRTdW1tYXJ5VGV4dFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoJGluZGV4LCBpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChpdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwiaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwiaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxhYmVsXCIgW2F0dHIudGl0bGVdPVwiaXRlbS50ZXh0XCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtcmVtb3ZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJjaGlwUmVtb3ZlQXJpYUxhYmVsKGl0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkSXRlbShpdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3N1bW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgc2VsZWN0ZWRTdW1tYXJ5VGV4dCB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BsYWNlaG9sZGVyXCI+XG4gICAgICAgICAgICAgICAgICB7eyB1aS5wbGFjZWhvbGRlclRleHQgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICA8dWxcbiAgICAgICAgICAgICAgICAgICNjaGlwTWVhc3VyZVJlZlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtbGlzdCBzZGMtY29tYm9ib3hfX2NoaXAtbGlzdC0tbWVhc3VyZVwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBzZWxlY3RlZEl0ZW1zOyB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoJGluZGV4LCBpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXAtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJpdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxhYmVsXCI+e3sgaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLXJlbW92ZS1wbGFjZWhvbGRlclwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19hY3Rpb25zXCI+XG4gICAgICAgICAgQGlmIChoYXNDbGVhckFjdGlvbikge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uIHNkYy1jb21ib2JveF9faWNvbi1idXR0b24tLWNsZWFyXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jbGVhckZpZWxkVGV4dFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckFsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS10aW1lc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH1cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uIHNkYy1jb21ib2JveF9faWNvbi1idXR0b24tLXRvZ2dsZVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5kcm9wZG93bkFyaWFMYWJlbFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uVG9nZ2xlTW91c2VEb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZVBhbmVsKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2FyZXQtZG93biBzZGMtY29tYm9ib3hfX2NhcmV0XCJcbiAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fY2FyZXQtLW9wZW5dPVwicGFuZWxPcGVuXCJcbiAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXZcbiAgICAgICAgc2RjLXBvcG92ZXItY29udGVudFxuICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWxcIlxuICAgICAgICBbc3R5bGUubWF4LWhlaWdodC5weF09XCJwYW5lbE1heEhlaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgQGlmIChzZWFyY2hhYmxlKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VhcmNoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2gtcm93XCI+XG4gICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VsZWN0LWFsbFwiPlxuICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJhcmVBbGxGaWx0ZXJlZEl0ZW1zU2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLnNlbGVjdEFsbFRleHRcIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ0b2dnbGVBbGxGaWx0ZXJlZEl0ZW1zKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgPjwvc2RjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIDxzZGMtc2VhcmNoYm94XG4gICAgICAgICAgICAgICAgI3BhbmVsU2VhcmNoYm94UmVmXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsLXNlYXJjaGJveFwiXG4gICAgICAgICAgICAgICAgW2lkZW50aXR5XT1cInVpLnBhbmVsU2VhcmNoSWRlbnRpdHlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInVpLnBhbmVsU2VhcmNoUGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFRlcm1cIlxuICAgICAgICAgICAgICAgIFtkZWJvdW5jZVRpbWVNc109XCIwXCJcbiAgICAgICAgICAgICAgICBbc3VibWl0T25FbnRlcl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgW2NsZWFyT25Fc2NhcGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFthcmlhTGFiZWxdPVwidWkucGFuZWxTZWFyY2hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFtpbnB1dFJvbGVdPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgW2lucHV0QXV0b2NvbXBsZXRlXT1cIidvZmYnXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRBcmlhQ29udHJvbHNdPVwidWkubGlzdGJveElkXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRBcmlhRGVzY3JpYmVkQnldPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaFRlcm1DaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9uQ2xlYXIpPVwib25TZWFyY2hDbGVhcmVkKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uU2VhcmNoYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgPjwvc2RjLXNlYXJjaGJveD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChpc09wdGlvbnNMb2FkaW5nKSB7XG4gICAgICAgICAgPG91dHB1dCBjbGFzcz1cInNkYy1jb21ib2JveF9fbG9hZGluZ1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtc3Bpbm5lciBmYS1zcGluIHNkYy1jb21ib2JveF9fbG9hZGluZy1pY29uXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xvYWRpbmctdGV4dFwiPnt7IHVpLmxvYWRpbmdJdGVtc1RleHQgfX08L3NwYW4+XG4gICAgICAgICAgPC9vdXRwdXQ+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKHNob3dFbXB0eVN0YXRlKSB7XG4gICAgICAgICAgPHNkYy1lbXB0eS1zdGF0ZVxuICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2VtcHR5XCJcbiAgICAgICAgICAgIHZhcmlhbnQ9XCJpbmxpbmUtdGV4dFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwidWkuZW1wdHlUaXRsZVRleHRcIlxuICAgICAgICAgID48L3NkYy1lbXB0eS1zdGF0ZT5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgQGlmICh1c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgI29wdGlvbnNWaWV3cG9ydFJlZlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9ucyBzZGMtY29tYm9ib3hfX29wdGlvbnMtLXZpcnR1YWxpemVkXCJcbiAgICAgICAgICAgICAgKHNjcm9sbCk9XCJvbk9wdGlvbnNTY3JvbGwoKVwiXG4gICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8IS0tIE5PU09OQVI6IGN1c3RvbSBjb21ib2JveCBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgLS0+XG4gICAgICAgICAgICAgIDwhLS0gQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25zLWxpc3RcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cInVpLmxpc3Rib3hJZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5jb21ib2JveEFyaWFMYWJlbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLW11bHRpc2VsZWN0YWJsZV09XCJtdWx0aXBsZSA/ICd0cnVlJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fdmlydHVhbC1zcGFjZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJiZWZvcmVWaXJ0dWFsU3BhY2VySGVpZ2h0XCJcbiAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICAgICAgdmlzaWJsZU9wdGlvbiBvZiB2aXNpYmxlRmlsdGVyZWRJdGVtcztcbiAgICAgICAgICAgICAgICAgIHRyYWNrIHRyYWNrQnlPcHRpb25WYWx1ZSh2aXNpYmxlT3B0aW9uLmluZGV4LCB2aXNpYmxlT3B0aW9uLml0ZW0pXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWFjdGl2ZV09XCJpc09wdGlvbkFjdGl2ZSh2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0taWNvbi1zZWxlY3Rvcl09XCJpY29uU2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLXNlbGVjdGVkXT1cIiFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLW9wdGlvbi1pbmRleF09XCJ2aXNpYmxlT3B0aW9uLmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25PcHRpb25Nb3VzZUVudGVyKHZpc2libGVPcHRpb24uaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNoZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cImlzT3B0aW9uU2VsZWN0ZWQodmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk9wdGlvbkNoZWNrYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25PcHRpb25DaGVja2JveENoYW5nZSh2aXNpYmxlT3B0aW9uLml0ZW0sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gTk9TT05BUiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgY3VzdG9tIGxpc3Rib3gga2VlcHMgb3B0aW9uIHNlbWFudGljcyBvbiB0aGUgZm9jdXNhYmxlIGFjdGlvbiBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJvcHRpb25JZCh2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInb3B0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSkgPyAndHJ1ZScgOiAnZmFsc2UnXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25LZXlkb3duKCRldmVudCwgdmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uT3B0aW9uQ2xpY2sodmlzaWJsZU9wdGlvbi5pdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmICh2aXNpYmxlT3B0aW9uLml0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInZpc2libGVPcHRpb24uaXRlbS5pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwidmlzaWJsZU9wdGlvbi5pdGVtLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi10ZXh0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWxhYmVsXCI+e3sgdmlzaWJsZU9wdGlvbi5pdGVtLnRleHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uTWV0YVRleHQodmlzaWJsZU9wdGlvbi5pdGVtKTsgYXMgb3B0aW9uTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLW1ldGFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uTWV0YSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKCFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNoZWNrIHNkYy1jb21ib2JveF9fb3B0aW9uLXNlbGVjdGVkLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X192aXJ0dWFsLXNwYWNlclwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImFmdGVyVmlydHVhbFNwYWNlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDwhLS0gTk9TT05BUjogY3VzdG9tIGNvbWJvYm94IHBvcHVwIGludGVudGlvbmFsbHkgdXNlcyBBUklBIGxpc3Rib3ggc2VtYW50aWNzIGluc3RlYWQgb2YgYSBuYXRpdmUgc2VsZWN0IC0tPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uc1wiXG4gICAgICAgICAgICAgIFthdHRyLmlkXT1cInVpLmxpc3Rib3hJZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidWkuY29tYm9ib3hBcmlhTGFiZWxsZWRCeVwiXG4gICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ2xpc3Rib3gnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibXVsdGlwbGUgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgIChtb3VzZW1vdmUpPVwib25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKVwiXG4gICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VMZWF2ZSgpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICBvcHRpb24gb2YgZmlsdGVyZWRJdGVtcztcbiAgICAgICAgICAgICAgICB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUoaW5kZXgsIG9wdGlvbik7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gJGluZGV4XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb25cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1hY3RpdmVdPVwiaXNPcHRpb25BY3RpdmUoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0taWNvbi1zZWxlY3Rvcl09XCJpY29uU2VsZWN0b3JcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1zZWxlY3RlZF09XCIhbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtb3B0aW9uLWluZGV4XT1cImluZGV4XCJcbiAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uT3B0aW9uTW91c2VFbnRlcihpbmRleClcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY2hlY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c2RjLWNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc09wdGlvblNlbGVjdGVkKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbk9wdGlvbkNoZWNrYm94S2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uQ2hlY2tib3hDaGFuZ2Uob3B0aW9uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtY2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPCEtLSBOT1NPTkFSIC0tPlxuICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgY3VzdG9tIGxpc3Rib3gga2VlcHMgb3B0aW9uIHNlbWFudGljcyBvbiB0aGUgZm9jdXNhYmxlIGFjdGlvbiBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwib3B0aW9uSWQoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIucm9sZV09XCInb3B0aW9uJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIi0xXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25LZXlkb3duKCRldmVudCwgb3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaWNvbi1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJvcHRpb24uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uVHlwZV09XCJvcHRpb24uaWNvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbc2l6ZV09XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi10ZXh0c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1sYWJlbFwiPnt7IG9wdGlvbi50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChvcHRpb25NZXRhVGV4dChvcHRpb24pOyBhcyBvcHRpb25NZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1tZXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgb3B0aW9uTWV0YSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoIW11bHRpcGxlICYmIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGVjayBzZGMtY29tYm9ib3hfX29wdGlvbi1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9zZGMtcG9wb3Zlcj5cblxuICAgIEBpZiAodWkubWVzc2FnZVRleHQpIHtcbiAgICAgIDxzbWFsbFxuICAgICAgICBbaWRdPVwidWkubWVzc2FnZUlkXCJcbiAgICAgICAgW25nQ2xhc3NdPVwiZ2V0SW52YWxpZE1lc3NhZ2VDbGFzcygpXCJcbiAgICAgICAgcm9sZT1cImFsZXJ0XCJcbiAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCJcbiAgICAgICAgPlxuICAgICAgICB7eyB1aS5tZXNzYWdlVGV4dCB9fVxuICAgICAgPC9zbWFsbD5cbiAgICB9XG4gIDwvZGl2PlxuIl19
1030
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9mZWF0dXJlcy9jb21ib2JveC9jb21ib2JveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWIvc3JjL2ZlYXR1cmVzL2NvbWJvYm94L2NvbWJvYm94LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUF3QixNQUFNLEVBQWlCLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JPLE9BQU8sRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQ0wsb0NBQW9DLEVBQ3BDLGlDQUFpQyxFQUNqQyx3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLHlDQUF5QyxFQUN6Qyw0Q0FBNEMsRUFDNUMsK0NBQStDLEVBQy9DLDhCQUE4QixFQUM5QixpQ0FBaUMsRUFDbEMsTUFBTSxxQ0FBcUMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUN6RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxF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O2dCQUNNLGtCQUFrQjtzQkFBbEQsU0FBUzt1QkFBQyxvQkFBb0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24sIGZvcndhcmRSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIENPTUJPQk9YX0RFRkFVTFRfTUFYX1NFTEVDVEVEX0xBQkVMUyxcbiAgQ09NQk9CT1hfREVGQVVMVF9QQU5FTF9NQVhfSEVJR0hULFxuICBDT01CT0JPWF9ERUZBVUxUX1pfSU5ERVgsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfQlVGRkVSX1NJWkUsXG4gIENPTUJPQk9YX0lDT05fU0VMRUNUT1JfREVGQVVMVF9ST1dfSEVJR0hULFxuICBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTUyxcbiAgQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9WSUVXUE9SVF9GQUxMQkFDS19IRUlHSFQsXG4gIENPTUJPQk9YX1JFTU9WRV9DSElQX0xBQkVMX0tFWSxcbiAgQ09NQk9CT1hfU0VMRUNURURfSVRFTVNfTEFCRUxfS0VZXG59IGZyb20gJy4uLy4uL2NvcmUvY29uc3RhbnRzL2NvbWJvYm94LmNvbnN0JztcbmltcG9ydCB7IEljb25TZWxlY3RvckRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9pY29uLXNlbGVjdG9yLWRhdGEuc2VydmljZSc7XG5pbXBvcnQgeyBJbnB1dHNDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvaW5wdXRzLmRpcmVjdGl2ZSc7XG5pbXBvcnQgdHlwZSB7IENoaXBSZW1vdmVFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMvY2hpcHMudHlwZSc7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbkl0ZW0sIE9wdGlvbnMsIE9wdGlvblZhbHVlIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy9zZW1hbnRpY3MudHlwZSc7XG5pbXBvcnQgdHlwZSB7IFRvb2x0aXBFdmVudCwgVG9vbHRpcFBvc2l0aW9uIH0gZnJvbSAnLi4vLi4vY29yZS90eXBlcy90b29sdGlwLnR5cGUnO1xuaW1wb3J0IHsgcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQgfSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2kxOG4udXRpbCc7XG5pbXBvcnQgeyBuZXh0U2VxdWVudGlhbElkIH0gZnJvbSAnLi4vLi4vY29yZS91dGlscy9pZC51dGlsJztcbmltcG9ydCB7IEljb25SZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvcmUvY29tcG9uZW50cy9pY29uLXJlbmRlcmVyL2ljb24tcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hlY2tib3gvY2hlY2tib3guY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbXBvbmVudCB9IGZyb20gJy4uL3BvcG92ZXIvcG9wb3Zlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2VhcmNoYm94Q29tcG9uZW50IH0gZnJvbSAnLi4vc2VhcmNoYm94L3NlYXJjaGJveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgVG9vbHRpcENvbXBvbmVudCB9IGZyb20gJy4uL3Rvb2x0aXAvdG9vbHRpcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgYXNDb21ib2JveEFycmF5LCBidWlsZENvbWJvYm94U2VhcmNoVGV4dCwgYnVpbGRDb21ib2JveFVpU3RhdGUsIGJ1aWxkSWNvblNlbGVjdG9yQ29tYm9ib3hPcHRpb25zLCBidWlsZFZpc2libGVDb21ib2JveE9wdGlvbnMsIGNyZWF0ZVJlc29sdmVkQ29tYm9ib3hPcHRpb24sIGdldEFjdGl2ZU9wdGlvblZhbHVlLCBnZXRGaXJzdFNlbGVjdGVkRmlsdGVyZWRWYWx1ZSwgZ2V0U2VsZWN0ZWRDb3VudCwgbm9ybWFsaXplQ29tYm9ib3hTZWFyY2hUZXh0LCBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUsIHNob3VsZENvbGxhcHNlQ29tYm9ib3hDaGlwRGlzcGxheSwgdHlwZSBDb21ib2JveERpc3BsYXlNb2RlLCB0eXBlIENvbWJvYm94UmVzb2x2ZWRPcHRpb24sIHR5cGUgQ29tYm9ib3hVaVN0YXRlLCB0eXBlIENvbWJvYm94VmFsdWUsIHR5cGUgQ29tYm9ib3hWaXNpYmxlT3B0aW9uLCB0eXBlIEhpZ2hsaWdodFN0ZXAsIHR5cGUgUGFuZWxDbG9zZVJlYXNvbiB9IGZyb20gJy4uLy4uL2NvcmUvdXRpbHMvY29tYm9ib3gudXRpbCc7XG5AQ29tcG9uZW50KHtcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBGb3Jtc01vZHVsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgSWNvblJlbmRlcmVyQ29tcG9uZW50LFxuICAgIENoZWNrYm94Q29tcG9uZW50LFxuICAgIEVtcHR5U3RhdGVDb21wb25lbnQsXG4gICAgUG9wb3ZlckNvbXBvbmVudCxcbiAgICBTZWFyY2hib3hDb21wb25lbnQsXG4gICAgVG9vbHRpcENvbXBvbmVudFxuICBdLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ3NkYy1jb21ib2JveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb21ib2JveC5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb21ib2JveENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBDb21ib2JveENvbXBvbmVudCBleHRlbmRzIElucHV0c0NvbXBvbmVudDxPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGljb25TZWxlY3RvckRhdGEgPSBpbmplY3QoSWNvblNlbGVjdG9yRGF0YVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2VuZXJhdGVkSWQgPSBuZXh0U2VxdWVudGlhbElkKCdzZGMtY29tYm9ib3gnKTtcbiAgQElucHV0KCkgbXVsdGlwbGUgPSBmYWxzZTtcbiAgQElucHV0KCkgYXBwZW5kVG86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCkgekluZGV4ID0gQ09NQk9CT1hfREVGQVVMVF9aX0lOREVYO1xuICBASW5wdXQoKSBvcHRpb25zOiBPcHRpb25zIHwgc3RyaW5nID0gW107XG4gIEBJbnB1dCgpIG92ZXJyaWRlQ2hpcE1lc3NhZ2U/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1heFNlbGVjdGVkTGFiZWxzID0gQ09NQk9CT1hfREVGQVVMVF9NQVhfU0VMRUNURURfTEFCRUxTO1xuICBASW5wdXQoKSBzaG93Q2xlYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzZWFyY2hhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgaWNvblNlbGVjdG9yID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dJY29uQ2xhc3MgPSBmYWxzZTtcbiAgQElucHV0KCkgaW5mb1Rvb2x0aXA6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcFBvc2l0aW9uOiBUb29sdGlwUG9zaXRpb24gPSAncmlnaHQnO1xuICBASW5wdXQoKSBpbmZvVG9vbHRpcEV2ZW50OiBUb29sdGlwRXZlbnQgPSAnYm90aCc7XG4gIEBJbnB1dCgpIGluZm9Ub29sdGlwQWxsb3dIdG1sID0gZmFsc2U7XG4gIEBPdXRwdXQoJ29uU2VsZWN0ZWRJdGVtJykgc2VsZWN0ZWRWYWx1ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDb21ib2JveFZhbHVlPigpO1xuICBAT3V0cHV0KCkgcGFuZWxDbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoUG9wb3ZlckNvbXBvbmVudCkgcG9wb3Zlcj86IFBvcG92ZXJDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJDb250cm9sUmVmJykgdHJpZ2dlckNvbnRyb2xSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnc2luZ2xlSW5wdXRSZWYnKSBzaW5nbGVJbnB1dFJlZj86IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3BhbmVsU2VhcmNoYm94UmVmJykgcGFuZWxTZWFyY2hib3g/OiBTZWFyY2hib3hDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ211bHRpVmFsdWVSZWYnKSBtdWx0aVZhbHVlUmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NoaXBNZWFzdXJlUmVmJykgY2hpcE1lYXN1cmVSZWY/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQFZpZXdDaGlsZCgnb3B0aW9uc1ZpZXdwb3J0UmVmJykgb3B0aW9uc1ZpZXdwb3J0UmVmPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG4gIHB1YmxpYyBmaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10gPSBbXTtcbiAgcHVibGljIHZpc2libGVGaWx0ZXJlZEl0ZW1zOiBDb21ib2JveFZpc2libGVPcHRpb25bXSA9IFtdO1xuICBwdWJsaWMgb3ZlcnJpZGUgdmFsdWU6IENvbWJvYm94VmFsdWUgPSBudWxsO1xuICBwdWJsaWMgZGlzcGxheU1vZGU6IENvbWJvYm94RGlzcGxheU1vZGUgPSAnY2hpcCc7XG4gIHB1YmxpYyBwYW5lbE9wZW4gPSBmYWxzZTtcbiAgcHVibGljIGhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgcHJpdmF0ZSBwb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgcHVibGljIHNlYXJjaFRlcm0gPSAnJztcbiAgcHVibGljIGljb25PcHRpb25zTG9hZGluZyA9IGZhbHNlO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVLZXk6IHVua25vd24gPSBudWxsO1xuICBwcml2YXRlIF9vcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX29wdGlvbnNDYWNoZTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbltdID0gW107XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGVMYW5nID0gJyc7XG4gIHByaXZhdGUgX2ljb25PcHRpb25zQ2FjaGU6IENvbWJvYm94UmVzb2x2ZWRPcHRpb25bXSA9IFtdO1xuICBwcml2YXRlIGljb25PcHRpb25zTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBza2lwTmV4dEZvY3VzT3BlbiA9IGZhbHNlO1xuICBwcml2YXRlIGNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlO1xuICBwcml2YXRlIGNoaXBMYXlvdXRPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICBwcml2YXRlIHZpc2libGVTdGFydEluZGV4ID0gMDtcbiAgcHJpdmF0ZSB2aXNpYmxlRW5kSW5kZXggPSAwO1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNldE9wdGlvbnNDYWNoZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hDb21ib2JveFN0YXRlKCk7XG4gICAgICB9KVxuICAgICk7XG4gIH1cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIHRoaXMuaGFuZGxlT3B0aW9uc0NhY2hlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLmhhbmRsZVZpcnR1YWxXaW5kb3dDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIHRoaXMuaGFuZGxlSWNvblNlbGVjdG9yQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICB0aGlzLm5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXMpO1xuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXMpKSB7XG4gICAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKHRoaXMuaW52YWxpZCAmJiAhdGhpcy5oYXNTZWFyY2hRdWVyeSk7XG4gICAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzKSkge1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgfVxuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBtdWx0aVZhbHVlRWxlbWVudCA9IHRoaXMubXVsdGlWYWx1ZVJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJyAmJiBtdWx0aVZhbHVlRWxlbWVudCkge1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCkpO1xuICAgICAgdGhpcy5jaGlwTGF5b3V0T2JzZXJ2ZXIub2JzZXJ2ZShtdWx0aVZhbHVlRWxlbWVudCk7XG4gICAgfVxuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuY2hpcExheW91dE9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gIH1cbiAgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogQ29tYm9ib3hWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVFeHRlcm5hbENvbWJvYm94VmFsdWUodmFsdWUsIHRoaXMubXVsdGlwbGUpO1xuICAgIHRoaXMuc2VhcmNoVGVybSA9ICcnO1xuICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIGdldCB1aSgpOiBDb21ib2JveFVpU3RhdGUge1xuICAgIHJldHVybiBidWlsZENvbWJvYm94VWlTdGF0ZSh7XG4gICAgICBnZW5lcmF0ZWRJZDogdGhpcy5nZW5lcmF0ZWRJZCxcbiAgICAgIGlkZW50aXR5SWQ6IHRoaXMuaWRlbnRpdHkuaWQsXG4gICAgICBpZGVudGl0eU5hbWU6IHRoaXMuaWRlbnRpdHkubmFtZSxcbiAgICAgIGxhYmVsOiB0aGlzLmxhYmVsLFxuICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucGxhY2Vob2xkZXIsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBpbmZvVG9vbHRpcDogdGhpcy5pbmZvVG9vbHRpcCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkLFxuICAgICAgdHJhbnNsYXRlOiB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRyYW5zbGF0ZVRleHQ6ICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKVxuICAgIH0pO1xuICB9XG4gIGdldCBub3JtYWxpemVkT3B0aW9ucygpOiBPcHRpb25JdGVtW10ge1xuICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTaW5nbGVPcHRpb24oKTogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiB8IG51bGwge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVzb2x2ZU9wdGlvbih0aGlzLnZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRJdGVtcygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiB0aGlzLnJlc29sdmVPcHRpb24oZW50cnkpKVxuICAgICAgLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiA9PiAhIWl0ZW0pO1xuICB9XG4gIGdldCBzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgJiYgdGhpcy5kaXNwbGF5TW9kZSA9PT0gJ3N1bW1hcnknICYmIHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBzZWxlY3RlZEl0ZW1zTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcmVzb2x2ZVRyYW5zbGF0YWJsZVRleHQoXG4gICAgICB0aGlzLnRyYW5zbGF0ZSxcbiAgICAgIHRoaXMub3ZlcnJpZGVDaGlwTWVzc2FnZSxcbiAgICAgIENPTUJPQk9YX1NFTEVDVEVEX0lURU1TX0xBQkVMX0tFWSxcbiAgICAgIHsgY291bnQ6IHRoaXMuc2VsZWN0ZWRDb3VudCB9XG4gICAgKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRTdW1tYXJ5VGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXNMYWJlbC5yZXBsYWNlKC9cXHtjb3VudFxcfS9nLCBTdHJpbmcodGhpcy5zZWxlY3RlZENvdW50KSk7XG4gIH1cbiAgZ2V0IGFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA+PSAwID8gdGhpcy5vcHRpb25JZCh0aGlzLmhpZ2hsaWdodGVkSW5kZXgpIDogbnVsbDtcbiAgfVxuICBnZXQgaGFzQ2xlYXJBY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0NsZWFyICYmIHRoaXMuc2VsZWN0ZWRDb3VudCA+IDA7XG4gIH1cbiAgZ2V0IHBhbmVsTWF4SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIENPTUJPQk9YX0RFRkFVTFRfUEFORUxfTUFYX0hFSUdIVDtcbiAgfVxuICBnZXQgYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCAmJiB0aGlzLmZpbHRlcmVkSXRlbXMuZXZlcnkoKGl0ZW0pID0+IHRoaXMuaXNPcHRpb25TZWxlY3RlZChpdGVtKSk7XG4gIH1cbiAgZ2V0IGhhc1NlYXJjaFF1ZXJ5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlYXJjaGFibGUgJiYgdGhpcy5zZWFyY2hUZXJtLnRyaW0oKS5sZW5ndGggPiAwO1xuICB9XG4gIGdldCBpc09wdGlvbnNMb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmljb25TZWxlY3RvciAmJiB0aGlzLmljb25PcHRpb25zTG9hZGluZyAmJiB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyAhPT0gdGhpcy5jdXJyZW50TGFuZztcbiAgfVxuICBnZXQgdXNlVmlydHVhbGl6ZWRPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmljb25TZWxlY3RvciAmJiB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgc2hvd0VtcHR5U3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzT3B0aW9uc0xvYWRpbmcgJiYgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMDtcbiAgfVxuICBnZXQgb3B0aW9uUm93SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ljb25DbGFzc1xuICAgICAgPyBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX1JPV19IRUlHSFRfV0lUSF9DTEFTU1xuICAgICAgOiBDT01CT0JPWF9JQ09OX1NFTEVDVE9SX0RFRkFVTFRfUk9XX0hFSUdIVDtcbiAgfVxuICBnZXQgYmVmb3JlVmlydHVhbFNwYWNlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnZpc2libGVTdGFydEluZGV4ICogdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gIH1cbiAgZ2V0IGFmdGVyVmlydHVhbFNwYWNlckhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCAodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIHRoaXMudmlzaWJsZUVuZEluZGV4KSAqIHRoaXMub3B0aW9uUm93SGVpZ2h0KTtcbiAgfVxuICBvblNlYXJjaChldmVudDogeyBxdWVyeT86IHN0cmluZyB9IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIHRoaXMub25TZWFyY2hUZXJtQ2hhbmdlKFN0cmluZyhldmVudD8ucXVlcnkgPz8gJycpKTtcbiAgfVxuICBvblBhbmVsSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5vblNlYXJjaFRlcm1DaGFuZ2UoKGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbCk/LnZhbHVlID8/ICcnKTtcbiAgfVxuICBvblNlYXJjaFRlcm1DaGFuZ2UodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gdmFsdWUgPz8gJyc7XG4gICAgdGhpcy5vcGVuUGFuZWwoeyBmb2N1c1NlYXJjaDogZmFsc2UgfSk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24oY3VycmVudEFjdGl2ZVZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBvblNlYXJjaENsZWFyZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNlYXJjaGFibGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gIH1cbiAgb25PcHRpb25zU2Nyb2xsKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoKTtcbiAgfVxuICBvbklucHV0Rm9jdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2tpcE5leHRGb2N1c09wZW4pIHtcbiAgICAgIHRoaXMuc2tpcE5leHRGb2N1c09wZW4gPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2xpY2tXaWxsT3BlblBhbmVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gIH1cbiAgb25JbnB1dEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0LmlkID09PSB0aGlzLnVpLnBhbmVsU2VhcmNoSWRlbnRpdHkuaWQpIHtcbiAgICAgIHRoaXMub25TZWFyY2hib3hLZXlkb3duKGV2ZW50KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5vblRyaWdnZXJLZXlkb3duKGV2ZW50KTtcbiAgfVxuICBvblRyaWdnZXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlUHJpbnRhYmxlVHJpZ2dlcktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlVHJpZ2dlckFycm93S2V5KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVUcmlnZ2VyT3BlbktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBvblNlYXJjaGJveEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmhhbmRsZVNlYXJjaGJveFNlbGVjdGlvbktleShldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oYW5kbGVDbG9zZU9yQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBvbkNvbnRyb2xNb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBldmVudC5idXR0b24gIT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIC8vIEtlZXAgdGhlIHBhbmVsIHNlYXJjaGJveCBmb2N1c2VkIGV2ZW4gd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIHRyaWdnZXIgYXJlYSBhZ2Fpbi5cbiAgICAgIC8vIFdpdGhvdXQgcHJldmVudGluZyB0aGUgdHJpZ2dlciBmcm9tIHRha2luZyBmb2N1cyBmaXJzdCwgdGhlIGNhcmV0IG1heSBkaXNhcHBlYXIgZXZlblxuICAgICAgLy8gdGhvdWdoIHR5cGluZyBzdGlsbCB1cGRhdGVzIHRoZSBzZWFyY2hib3guXG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBTdXBwcmVzcyBmb2N1cy10cmlnZ2VyZWQgb3BlbjogaW4gc2luZ2xlIG1vZGUgdGhlIGlucHV0IHJlY2VpdmVzIGZvY3VzIG9uIG1vdXNlZG93bixcbiAgICAvLyB3aGljaCBmaXJlcyBvbklucHV0Rm9jdXMoKSBiZWZvcmUgdGhlIGNsaWNrIGV2ZW50LiBXaXRob3V0IHRoaXMgZmxhZywgb25JbnB1dEZvY3VzXG4gICAgLy8gd291bGQgb3BlbiB0aGUgcGFuZWwgYW5kIHRoZSBzdWJzZXF1ZW50IGNsaWNrIChvbkNvbnRyb2xDbGljaykgd291bGQgaW1tZWRpYXRlbHkgY2xvc2UgaXQuXG4gICAgdGhpcy5jbGlja1dpbGxPcGVuUGFuZWwgPSB0cnVlO1xuICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmNsaWNrV2lsbE9wZW5QYW5lbCA9IGZhbHNlOyB9LCAwKTtcbiAgfVxuICBvbkNvbnRyb2xDbGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgfVxuICBvblRvZ2dsZU1vdXNlRG93bihldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IGV2ZW50LmJ1dHRvbiAhPT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG4gIG9uUG9wb3Zlck9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChvcGVuIHx8ICF0aGlzLnBhbmVsT3Blbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlUGFuZWwoJ291dHNpZGUnKTtcbiAgfVxuICB0b2dnbGVQYW5lbChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgndG9nZ2xlJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgfVxuICBjbGVhckFsbChldmVudD86IEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQ/LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uPy4oKTtcbiAgICBjb25zdCBjbGVhcmVkVmFsdWU6IE9wdGlvblZhbHVlIHwgT3B0aW9uVmFsdWVbXSB8IG51bGwgPSB0aGlzLm11bHRpcGxlID8gW10gOiBudWxsO1xuICAgIGNvbnN0IHNob3VsZFJlZm9jdXNTZWFyY2ggPSB0aGlzLnBhbmVsT3BlbjtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnZhbHVlID0gY2xlYXJlZFZhbHVlO1xuICAgIHRoaXMuaW52YWxpZCA9IGZhbHNlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlKGNsZWFyZWRWYWx1ZSk7XG4gICAgdGhpcy5zZWxlY3RlZFZhbHVlRXZlbnQuZW1pdChjbGVhcmVkVmFsdWUpO1xuICAgIHRoaXMudXBkYXRlRGlzcGxheU1vZGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlQ2hpcFByZXNlbnRhdGlvblN5bmMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgaWYgKHNob3VsZFJlZm9jdXNTZWFyY2gpIHtcbiAgICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gICAgfVxuICB9XG4gIG9uT3B0aW9uQ2xpY2sob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMudG9nZ2xlT3B0aW9uKG9wdGlvbik7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdFNpbmdsZU9wdGlvbihvcHRpb24pO1xuICB9XG4gIG9uT3B0aW9uQ2hlY2tib3hDaGFuZ2Uob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy50b2dnbGVPcHRpb24ob3B0aW9uLCBjaGVja2VkKTtcbiAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICB9XG4gIG9uT3B0aW9uQ2hlY2tib3hLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgdGhpcy5jbG9zZVBhbmVsKCd0b2dnbGUnKTtcbiAgICB9XG4gIH1cbiAgb25PcHRpb25LZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInICYmIGV2ZW50LmtleSAhPT0gJyAnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5vbk9wdGlvbkNsaWNrKG9wdGlvbik7XG4gIH1cbiAgdG9nZ2xlQWxsRmlsdGVyZWRJdGVtcyhjaGVja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgY29uc3Qgc2VsZWN0ZWRWYWx1ZXMgPSBuZXcgU2V0KGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKSk7XG4gICAgZm9yIChjb25zdCBvcHRpb24gb2YgdGhpcy5maWx0ZXJlZEl0ZW1zKSB7XG4gICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICBzZWxlY3RlZFZhbHVlcy5hZGQob3B0aW9uLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlbGVjdGVkVmFsdWVzLmRlbGV0ZShvcHRpb24udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBvcmRlcmVkVmFsdWVzID0gdGhpcy5ub3JtYWxpemVPcHRpb25zKClcbiAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBzZWxlY3RlZFZhbHVlcy5oYXMoZW50cnkudmFsdWUpKVxuICAgICAgLm1hcCgoZW50cnkpID0+IGVudHJ5LnZhbHVlKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcmRlcmVkVmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihjdXJyZW50QWN0aXZlVmFsdWUpO1xuICAgIHRoaXMuZm9jdXNTZWFyY2hib3hTb29uKCk7XG4gIH1cbiAgcmVtb3ZlU2VsZWN0ZWRJdGVtKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbiwgZXZlbnQ/OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRBY3RpdmVWYWx1ZSA9IHRoaXMuYWN0aXZlT3B0aW9uVmFsdWU7XG4gICAgY29uc3QgY3VycmVudFZhbHVlcyA9IGFzQ29tYm9ib3hBcnJheSh0aGlzLnZhbHVlKS5maWx0ZXIoKGVudHJ5KSA9PiAhT2JqZWN0LmlzKGVudHJ5LCBvcHRpb24udmFsdWUpKTtcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShjdXJyZW50VmFsdWVzKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbihjdXJyZW50QWN0aXZlVmFsdWUpO1xuICAgIGlmICh0aGlzLnBhbmVsT3Blbikge1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICB9XG4gIH1cbiAgb25DaGlwUmVtb3ZlZChldmVudDogQ2hpcFJlbW92ZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3B0aW9uID0gdGhpcy5yZXNvbHZlT3B0aW9uKGV2ZW50LnZhbHVlKTtcbiAgICBpZiAoIW9wdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlbW92ZVNlbGVjdGVkSXRlbShvcHRpb24sIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICB9XG4gIHJlc29sdmVPcHRpb24ob3B0T3JWYWx1ZTogdW5rbm93bik6IENvbWJvYm94UmVzb2x2ZWRPcHRpb24gfCBudWxsIHtcbiAgICBjb25zdCBhbGwgPSB0aGlzLm5vcm1hbGl6ZU9wdGlvbnMoKTtcbiAgICBpZiAob3B0T3JWYWx1ZSA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBvcHRPclZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3Qgb2JqID0gb3B0T3JWYWx1ZSBhcyB7IHRleHQ/OiBzdHJpbmc7IHZhbHVlPzogT3B0aW9uVmFsdWUgfTtcbiAgICAgIGlmICgndGV4dCcgaW4gb2JqICYmICd2YWx1ZScgaW4gb2JqKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uKG9iaiBhcyBPcHRpb25JdGVtKSxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZVRleHQob2JqLnRleHQpLFxuICAgICAgICAgIHNlYXJjaFRleHQ6IGJ1aWxkQ29tYm9ib3hTZWFyY2hUZXh0KHRoaXMudHJhbnNsYXRlVGV4dChvYmoudGV4dCksIHRoaXMuYXNUZXh0KG9iai52YWx1ZSkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoJ3ZhbHVlJyBpbiBvYmopIHtcbiAgICAgICAgcmV0dXJuIGFsbC5maW5kKChvcHRpb24pID0+IE9iamVjdC5pcyhvcHRpb24udmFsdWUsIG9iai52YWx1ZSkpID8/IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhbGwuZmluZCgob3B0aW9uKSA9PiBPYmplY3QuaXMob3B0aW9uLnZhbHVlLCBvcHRPclZhbHVlIGFzIE9wdGlvblZhbHVlKSkgPz8gbnVsbDtcbiAgfVxuICBpc09wdGlvblNlbGVjdGVkKG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkuc29tZSgoZW50cnkpID0+IE9iamVjdC5pcyhlbnRyeSwgb3B0aW9uLnZhbHVlKSk7XG4gIH1cbiAgaXNPcHRpb25BY3RpdmUoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPT09IGluZGV4O1xuICB9XG4gIG9uT3B0aW9uTW91c2VFbnRlcihpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KGluZGV4LCBmYWxzZSk7XG4gIH1cbiAgb25PcHRpb25zUGFuZWxNb3VzZU1vdmUoKTogdm9pZCB7XG4gICAgdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gdHJ1ZTtcbiAgfVxuICBvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBvaW50ZXJNb3ZlZFNpbmNlS2V5Ym9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gLTE7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgb3B0aW9uTWV0YVRleHQob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmljb25TZWxlY3RvciB8fCAhdGhpcy5zaG93SWNvbkNsYXNzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG9wdGlvbi5pY29uQ2xhc3NOYW1lID8/IG51bGw7XG4gIH1cbiAgb3B0aW9uSWQoaW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMudWkuY29udHJvbElkfS1vcHRpb24tJHtpbmRleH1gO1xuICB9XG4gIGNoaXBSZW1vdmVBcmlhTGFiZWwob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogc3RyaW5nIHtcbiAgICBjb25zdCB0ZW1wbGF0ZSA9IHJlc29sdmVUcmFuc2xhdGFibGVUZXh0KHRoaXMudHJhbnNsYXRlLCBudWxsLCBDT01CT0JPWF9SRU1PVkVfQ0hJUF9MQUJFTF9LRVkpO1xuICAgIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKC9cXHtsYWJlbFxcfS9nLCBvcHRpb24udGV4dCk7XG4gIH1cbiAgdHJhY2tCeU9wdGlvblZhbHVlID0gKF9pbmRleDogbnVtYmVyLCBpdGVtOiBDb21ib2JveFJlc29sdmVkT3B0aW9uKTogT3B0aW9uVmFsdWUgPT4gaXRlbS52YWx1ZTtcbiAgcHJpdmF0ZSBvcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5QYW5lbCh7IGZvY3VzU2VhcmNoOiB0aGlzLnNlYXJjaGFibGUgfSk7XG4gIH1cbiAgcHJpdmF0ZSBvcGVuUGFuZWwob3B0aW9uczogeyBmb2N1c1NlYXJjaDogYm9vbGVhbiB9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgdGhpcy5wYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbih0aGlzLnJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB0aGlzLnBvcG92ZXI/LnJlcG9zaXRpb24oKTtcbiAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKHRydWUpO1xuICAgIGlmIChvcHRpb25zLmZvY3VzU2VhcmNoKSB7XG4gICAgICB0aGlzLmZvY3VzU2VhcmNoYm94U29vbigpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNsb3NlUGFuZWwocmVhc29uOiBQYW5lbENsb3NlUmVhc29uKTogdm9pZCB7XG4gICAgY29uc3QgcmVzdG9yZVRyaWdnZXJGb2N1cyA9IHJlYXNvbiA9PT0gJ2VzY2FwZScgfHwgcmVhc29uID09PSAnc2VsZWN0aW9uJyB8fCByZWFzb24gPT09ICd0b2dnbGUnO1xuICAgIHRoaXMucGFuZWxPcGVuID0gZmFsc2U7XG4gICAgdGhpcy5zZWFyY2hUZXJtID0gJyc7XG4gICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB0aGlzLnJlZnJlc2hGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgdGhpcy5zeW5jSGlnaGxpZ2h0V2l0aFNlbGVjdGlvbigpO1xuICAgIHRoaXMucGFuZWxDbG9zZWQuZW1pdCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGlmIChyZXN0b3JlVHJpZ2dlckZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJpZ2dlclNvb24oKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBmb2N1c1NlYXJjaGJveFNvb24oKTogdm9pZCB7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgICBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNTZWFyY2hib3goKSwgMCk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5mb2N1c1NlYXJjaGJveCgpKTtcbiAgfVxuICBwcml2YXRlIGZvY3VzVHJpZ2dlclNvb24oKTogdm9pZCB7IHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuZm9jdXNUcmlnZ2VyKCkpOyB9XG4gIHByaXZhdGUgZm9jdXNTZWFyY2hib3goKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2luZ2xlSW5wdXRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmJsdXIoKTtcbiAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5ibHVyPy4oKTtcbiAgICB0aGlzLnBhbmVsU2VhcmNoYm94Py5mb2N1c0lucHV0KCk7XG4gICAgdGhpcy5wb3BvdmVyPy5yZXBvc2l0aW9uKCk7XG4gICAgdGhpcy5zY2hlZHVsZVZpc2libGVPcHRpb25zU3luYygpO1xuICB9XG4gIHByaXZhdGUgZm9jdXNUcmlnZ2VyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRyaWdnZXJDb250cm9sUmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNraXBOZXh0Rm9jdXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnNpbmdsZUlucHV0UmVmPy5uYXRpdmVFbGVtZW50Py5mb2N1cygpO1xuICB9XG4gIHByaXZhdGUgcmVmcmVzaEZpbHRlcmVkSXRlbXMocHJlc2VydmVDdXJyZW50SW52YWxpZCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaGFibGUgPyBub3JtYWxpemVDb21ib2JveFNlYXJjaFRleHQodGhpcy5zZWFyY2hUZXJtKSA6ICcnO1xuICAgIGNvbnN0IGFsbCA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpO1xuICAgIGlmICh0aGlzLmlzT3B0aW9uc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyA9IFtdO1xuICAgICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXModHJ1ZSk7XG4gICAgICB0aGlzLmludmFsaWQgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5maWx0ZXJlZEl0ZW1zID0gcXVlcnlcbiAgICAgID8gYWxsLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5zZWFyY2hUZXh0LmluY2x1ZGVzKHF1ZXJ5KSlcbiAgICAgIDogYWxsLnNsaWNlKCk7XG4gICAgdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMoIXF1ZXJ5KTtcbiAgICBpZiAoIXF1ZXJ5ICYmIHByZXNlcnZlQ3VycmVudEludmFsaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnZhbGlkID0gdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCA9PT0gMCAmJiBhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkubGVuZ3RoID09PSAwICYmIHF1ZXJ5Lmxlbmd0aCA+IDA7XG4gIH1cbiAgcHJpdmF0ZSBzZXRIaWdobGlnaHRlZEluZGV4KGluZGV4OiBudW1iZXIsIGVuc3VyZVZpc2libGUgPSB0cnVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV4dEluZGV4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oaW5kZXgsIHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKSk7XG4gICAgdGhpcy5oaWdobGlnaHRlZEluZGV4ID0gbmV4dEluZGV4O1xuICAgIGlmIChlbnN1cmVWaXNpYmxlICYmIHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICB0aGlzLnNjcm9sbEhpZ2hsaWdodGVkT3B0aW9uSW50b1ZpZXcoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBtb3ZlSGlnaGxpZ2h0KHN0ZXA6IEhpZ2hsaWdodFN0ZXApOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCA9IC0xO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5oaWdobGlnaHRlZEluZGV4IDwgMCkge1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHN0ZXAgPiAwID8gMCA6IHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wb2ludGVyTW92ZWRTaW5jZUtleWJvYXJkID0gZmFsc2U7XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KCh0aGlzLmhpZ2hsaWdodGVkSW5kZXggKyBzdGVwICsgdGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCkgJSB0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKTtcbiAgfVxuICBwcml2YXRlIHN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKHByZWZlcnJlZFZhbHVlOiBPcHRpb25WYWx1ZSB8IG51bGwgPSB0aGlzLmFjdGl2ZU9wdGlvblZhbHVlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmZpbHRlcmVkSXRlbXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmhpZ2hsaWdodGVkSW5kZXggPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2FuZGlkYXRlVmFsdWVzID0gW1xuICAgICAgcHJlZmVycmVkVmFsdWUsXG4gICAgICAhdGhpcy5tdWx0aXBsZSA/IHRoaXMuc2VsZWN0ZWRTaW5nbGVPcHRpb24/LnZhbHVlID8/IG51bGwgOiB0aGlzLmZpcnN0U2VsZWN0ZWRGaWx0ZXJlZFZhbHVlLFxuICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zWzBdPy52YWx1ZSA/PyBudWxsXG4gICAgXTtcbiAgICBjb25zdCBuZXh0SW5kZXggPSBjYW5kaWRhdGVWYWx1ZXNcbiAgICAgIC5tYXAoKHZhbHVlKSA9PiB2YWx1ZSA9PSBudWxsID8gLTEgOiB0aGlzLmZpbHRlcmVkSXRlbXMuZmluZEluZGV4KChpdGVtKSA9PiBPYmplY3QuaXMoaXRlbS52YWx1ZSwgdmFsdWUpKSlcbiAgICAgIC5maW5kKChpbmRleCkgPT4gaW5kZXggPj0gMCk7XG4gICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KG5leHRJbmRleCA/PyAwKTtcbiAgfVxuICBwcml2YXRlIHNjcm9sbEhpZ2hsaWdodGVkT3B0aW9uSW50b1ZpZXcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMudXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMub3B0aW9uc1ZpZXdwb3J0UmVmPy5uYXRpdmVFbGVtZW50O1xuICAgICAgaWYgKCF2aWV3cG9ydCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlVmlzaWJsZU9wdGlvbnNTeW5jKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9wdGlvblRvcCA9IHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCAqIHRoaXMub3B0aW9uUm93SGVpZ2h0O1xuICAgICAgY29uc3Qgb3B0aW9uQm90dG9tID0gb3B0aW9uVG9wICsgdGhpcy5vcHRpb25Sb3dIZWlnaHQ7XG4gICAgICBjb25zdCB2aWV3cG9ydFRvcCA9IHZpZXdwb3J0LnNjcm9sbFRvcDtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Qm90dG9tID0gdmlld3BvcnRUb3AgKyB2aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG4gICAgICBpZiAob3B0aW9uVG9wIDwgdmlld3BvcnRUb3ApIHtcbiAgICAgICAgdmlld3BvcnQuc2Nyb2xsVG9wID0gb3B0aW9uVG9wO1xuICAgICAgfSBlbHNlIGlmIChvcHRpb25Cb3R0b20gPiB2aWV3cG9ydEJvdHRvbSkge1xuICAgICAgICB2aWV3cG9ydC5zY3JvbGxUb3AgPSBvcHRpb25Cb3R0b20gLSB2aWV3cG9ydC5jbGllbnRIZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUaGUgaGlnaGxpZ2h0ZWQgb3B0aW9uIGlzIGFscmVhZHkgZnVsbHkgdmlzaWJsZS5cbiAgICAgIH1cbiAgICAgIHRoaXMuc3luY1Zpc2libGVGaWx0ZXJlZEl0ZW1zKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbklkKHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCkpO1xuICAgICAgaWYgKHR5cGVvZiBub2RlPy5zY3JvbGxJbnRvVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBub2RlLnNjcm9sbEludG9WaWV3KHsgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdEhpZ2hsaWdodGVkT3B0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGFjdGl2ZU9wdGlvbiA9IHRoaXMuZmlsdGVyZWRJdGVtc1t0aGlzLmhpZ2hsaWdodGVkSW5kZXhdO1xuICAgIGlmICghYWN0aXZlT3B0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLnRvZ2dsZU9wdGlvbihhY3RpdmVPcHRpb24pO1xuICAgICAgdGhpcy5mb2N1c1NlYXJjaGJveFNvb24oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RTaW5nbGVPcHRpb24oYWN0aXZlT3B0aW9uKTtcbiAgfVxuICBwcml2YXRlIHNlbGVjdFNpbmdsZU9wdGlvbihvcHRpb246IENvbWJvYm94UmVzb2x2ZWRPcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSAnJztcbiAgICB0aGlzLnByb3BhZ2F0ZUZyb21WYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIHRoaXMuY2xvc2VQYW5lbCgnc2VsZWN0aW9uJyk7XG4gIH1cbiAgcHJpdmF0ZSB0b2dnbGVPcHRpb24ob3B0aW9uOiBDb21ib2JveFJlc29sdmVkT3B0aW9uLCBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IHNlbGVjdGVkVmFsdWVzID0gbmV3IFNldChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkpO1xuICAgIGNvbnN0IHNob3VsZFNlbGVjdCA9IHRoaXMucmVzb2x2ZU9wdGlvbkNoZWNrZWRTdGF0ZShzZWxlY3RlZFZhbHVlcywgb3B0aW9uLCBmb3JjZUNoZWNrZWQpO1xuICAgIGlmIChzaG91bGRTZWxlY3QpIHtcbiAgICAgIHNlbGVjdGVkVmFsdWVzLmFkZChvcHRpb24udmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZWxlY3RlZFZhbHVlcy5kZWxldGUob3B0aW9uLnZhbHVlKTtcbiAgICB9XG4gICAgY29uc3Qgb3JkZXJlZFZhbHVlcyA9IHRoaXMubm9ybWFsaXplT3B0aW9ucygpXG4gICAgICAuZmlsdGVyKChlbnRyeSkgPT4gc2VsZWN0ZWRWYWx1ZXMuaGFzKGVudHJ5LnZhbHVlKSlcbiAgICAgIC5tYXAoKGVudHJ5KSA9PiBlbnRyeS52YWx1ZSk7XG4gICAgdGhpcy5wcm9wYWdhdGVGcm9tVmFsdWUob3JkZXJlZFZhbHVlcyk7XG4gICAgdGhpcy5yZWZyZXNoRmlsdGVyZWRJdGVtcygpO1xuICAgIHRoaXMuc3luY0hpZ2hsaWdodFdpdGhTZWxlY3Rpb24ob3B0aW9uLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgY29uc3QgbmV4dFN0YXRlID0gYnVpbGRWaXNpYmxlQ29tYm9ib3hPcHRpb25zKHtcbiAgICAgIHJlc2V0U2Nyb2xsLFxuICAgICAgYnVmZmVyU2l6ZTogQ09NQk9CT1hfSUNPTl9TRUxFQ1RPUl9CVUZGRVJfU0laRSxcbiAgICAgIGZhbGxiYWNrVmlld3BvcnRIZWlnaHQ6IENPTUJPQk9YX0lDT05fU0VMRUNUT1JfVklFV1BPUlRfRkFMTEJBQ0tfSEVJR0hULFxuICAgICAgZmlsdGVyZWRJdGVtczogdGhpcy5maWx0ZXJlZEl0ZW1zLFxuICAgICAgb3B0aW9uUm93SGVpZ2h0OiB0aGlzLm9wdGlvblJvd0hlaWdodCxcbiAgICAgIHVzZVZpcnR1YWxpemVkT3B0aW9uczogdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMsXG4gICAgICB2aWV3cG9ydDogdGhpcy5vcHRpb25zVmlld3BvcnRSZWY/Lm5hdGl2ZUVsZW1lbnRcbiAgICB9KTtcbiAgICB0aGlzLnZpc2libGVTdGFydEluZGV4ID0gbmV4dFN0YXRlLnZpc2libGVTdGFydEluZGV4O1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gbmV4dFN0YXRlLnZpc2libGVFbmRJbmRleDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gbmV4dFN0YXRlLnZpc2libGVGaWx0ZXJlZEl0ZW1zO1xuICB9XG4gIHByaXZhdGUgbm9ybWFsaXplT3B0aW9ucygpOiBDb21ib2JveFJlc29sdmVkT3B0aW9uW10ge1xuICAgIGlmICh0aGlzLmljb25TZWxlY3Rvcikge1xuICAgICAgdGhpcy5lbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk7XG4gICAgICBpZiAodGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ljb25PcHRpb25zQ2FjaGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gdGhpcy5jdXJyZW50TGFuZztcbiAgICBpZiAodGhpcy5vcHRpb25zID09PSB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgJiYgdGhpcy5fb3B0aW9uc0NhY2hlTGFuZyA9PT0gY3VycmVudExhbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ2FjaGU7XG4gICAgfVxuICAgIGNvbnN0IG5leHQgPSB0aGlzLnBhcnNlTm9ybWFsaXplZE9wdGlvbnNJbnB1dCgpO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUtleSA9IHRoaXMub3B0aW9ucztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVMYW5nID0gY3VycmVudExhbmc7XG4gICAgdGhpcy5fb3B0aW9uc0NhY2hlID0gbmV4dC5tYXAoKG9wdGlvbikgPT4gY3JlYXRlUmVzb2x2ZWRDb21ib2JveE9wdGlvbihvcHRpb24sICh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGVUZXh0KHZhbHVlKSkpO1xuICAgIHJldHVybiB0aGlzLl9vcHRpb25zQ2FjaGU7XG4gIH1cbiAgcHJpdmF0ZSBhc1RleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlIDogJyc7IH1cbiAgcHJpdmF0ZSB0cmFuc2xhdGVUZXh0KHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHsgcmV0dXJuIHJlc29sdmVUcmFuc2xhdGFibGVUZXh0KHRoaXMudHJhbnNsYXRlLCB0aGlzLmFzVGV4dCh2YWx1ZSkpOyB9XG4gIHByaXZhdGUgcGFyc2VOb3JtYWxpemVkT3B0aW9uc0lucHV0KCk6IE9wdGlvbkl0ZW1bXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5vcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucyBhcyBPcHRpb25JdGVtW107XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKHRoaXMub3B0aW9ucyB8fCAnW10nKTtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyAocGFyc2VkIGFzIE9wdGlvbkl0ZW1bXSkgOiBbXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXQgY3VycmVudExhbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcgPz8gdGhpcy50cmFuc2xhdGUuZ2V0RGVmYXVsdExhbmc/LigpID8/ICcnO1xuICB9XG4gIHByaXZhdGUgZ2V0IHNlbGVjdGVkQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZ2V0U2VsZWN0ZWRDb3VudCh0aGlzLnZhbHVlLCB0aGlzLm11bHRpcGxlKTtcbiAgfVxuICBwcml2YXRlIGdldCBhY3RpdmVPcHRpb25WYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIHJldHVybiBnZXRBY3RpdmVPcHRpb25WYWx1ZSh0aGlzLmZpbHRlcmVkSXRlbXMsIHRoaXMuaGlnaGxpZ2h0ZWRJbmRleCk7XG4gIH1cbiAgcHJpdmF0ZSBnZXQgZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUoKTogT3B0aW9uVmFsdWUgfCBudWxsIHtcbiAgICByZXR1cm4gZ2V0Rmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWUodGhpcy5maWx0ZXJlZEl0ZW1zLCB0aGlzLnZhbHVlKTtcbiAgfVxuICBwcml2YXRlIHVwZGF0ZURpc3BsYXlNb2RlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5kaXNwbGF5TW9kZSA9ICdzdW1tYXJ5JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IHRoaXMuc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpID8gJ3N1bW1hcnknIDogJ2NoaXAnO1xuICB9XG4gIHByaXZhdGUgcHJvcGFnYXRlRnJvbVZhbHVlKHZhbHVlOiBPcHRpb25WYWx1ZSB8IE9wdGlvblZhbHVlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIGlmIChhc0NvbWJvYm94QXJyYXkodGhpcy52YWx1ZSkubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5pbnZhbGlkID0gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVtaXR0ZWRWYWx1ZSA9IHRoaXMudmFsdWUgPz8gKHRoaXMubXVsdGlwbGUgPyBbXSA6IG51bGwpO1xuICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZUV2ZW50LmVtaXQoZW1pdHRlZFZhbHVlKTtcbiAgICB0aGlzLmNvbW1pdFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZURpc3BsYXlNb2RlKCk7XG4gICAgdGhpcy5zY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbiAgcHJpdmF0ZSBpc1ByaW50YWJsZUNoYXJhY3RlcihldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBldmVudC5rZXkubGVuZ3RoID09PSAxICYmICFldmVudC5hbHRLZXkgJiYgIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50Lm1ldGFLZXk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZUNoaXBQcmVzZW50YXRpb25TeW5jKCk6IHZvaWQge1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuc3luY0NoaXBQcmVzZW50YXRpb24oKSk7XG4gICAgY29uc3Qgc2NoZWR1bGUgPSB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAnZnVuY3Rpb24nXG4gICAgICA/IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgOiAoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKSA9PiBnbG9iYWxUaGlzLndpbmRvdy5zZXRUaW1lb3V0KCgpID0+IGNhbGxiYWNrKHBlcmZvcm1hbmNlLm5vdygpKSwgMCk7XG4gICAgc2NoZWR1bGUoKCkgPT4gdGhpcy5zeW5jQ2hpcFByZXNlbnRhdGlvbigpKTtcbiAgfVxuICBwcml2YXRlIHN5bmNDaGlwUHJlc2VudGF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IG5leHREaXNwbGF5TW9kZTogJ2NoaXAnIHwgJ3N1bW1hcnknID0gdGhpcy5zaG91bGRDb2xsYXBzZUNoaXBEaXNwbGF5VG9TdW1tYXJ5KCkgPyAnc3VtbWFyeScgOiAnY2hpcCc7XG4gICAgaWYgKHRoaXMuZGlzcGxheU1vZGUgPT09IG5leHREaXNwbGF5TW9kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXlNb2RlID0gbmV4dERpc3BsYXlNb2RlO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG4gIHByaXZhdGUgc2hvdWxkQ29sbGFwc2VDaGlwRGlzcGxheVRvU3VtbWFyeSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc2hvdWxkQ29sbGFwc2VDb21ib2JveENoaXBEaXNwbGF5KHtcbiAgICAgIG11bHRpcGxlOiB0aGlzLm11bHRpcGxlLFxuICAgICAgc2VsZWN0ZWRJdGVtQ291bnQ6IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgsXG4gICAgICBzZWxlY3RlZENvdW50OiB0aGlzLnNlbGVjdGVkQ291bnQsXG4gICAgICBtYXhTZWxlY3RlZExhYmVsczogdGhpcy5tYXhTZWxlY3RlZExhYmVscyxcbiAgICAgIGF2YWlsYWJsZVdpZHRoOiB0aGlzLm11bHRpVmFsdWVSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudFdpZHRoID8/IDAsXG4gICAgICByZXF1aXJlZFdpZHRoOiB0aGlzLmNoaXBNZWFzdXJlUmVmPy5uYXRpdmVFbGVtZW50Py5zY3JvbGxXaWR0aCA/PyAwXG4gICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSByZXNldE9wdGlvbnNDYWNoZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGVLZXkgPSBudWxsO1xuICAgIHRoaXMuX29wdGlvbnNDYWNoZUxhbmcgPSAnJztcbiAgICB0aGlzLl9vcHRpb25zQ2FjaGUgPSBbXTtcbiAgICB0aGlzLl9pY29uT3B0aW9uc0NhY2hlTGFuZyA9ICcnO1xuICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBbXTtcbiAgfVxuICBwcml2YXRlIHJlZnJlc2hDb21ib2JveFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgdGhpcy51cGRhdGVEaXNwbGF5TW9kZSgpO1xuICAgIHRoaXMuc2NoZWR1bGVDaGlwUHJlc2VudGF0aW9uU3luYygpO1xuICAgIHRoaXMuc2NoZWR1bGVWaXNpYmxlT3B0aW9uc1N5bmMoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZU9wdGlvbnNDYWNoZUNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydvcHRpb25zJ10pIHtcbiAgICAgIHRoaXMucmVzZXRPcHRpb25zQ2FjaGUoKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVWaXJ0dWFsV2luZG93Q2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXNbJ2ljb25TZWxlY3RvciddIHx8IGNoYW5nZXNbJ3Nob3dJY29uQ2xhc3MnXSkge1xuICAgICAgdGhpcy5yZXNldFZpcnR1YWxXaW5kb3coKTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVJY29uU2VsZWN0b3JDaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaWNvblNlbGVjdG9yJ10pIHtcbiAgICAgIHRoaXMuZW5zdXJlSWNvblNlbGVjdG9yT3B0aW9uc0xvYWRlZCgpO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hGaWx0ZXJlZFN0YXRlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiBib29sZWFuIHtcbiAgICBjb25zdCBoYXNPcHRpb25DaGFuZ2VzID0gISFjaGFuZ2VzWydvcHRpb25zJ107XG4gICAgY29uc3QgaGFzU2VsZWN0aW9uQ2hhbmdlcyA9ICEhY2hhbmdlc1snbXVsdGlwbGUnXSB8fCAhIWNoYW5nZXNbJ3ZhbHVlJ107XG4gICAgY29uc3QgaGFzSWNvbkNoYW5nZXMgPSAhIWNoYW5nZXNbJ2ljb25TZWxlY3RvciddIHx8ICEhY2hhbmdlc1snc2hvd0ljb25DbGFzcyddO1xuXG4gICAgcmV0dXJuIGhhc09wdGlvbkNoYW5nZXMgfHwgaGFzU2VsZWN0aW9uQ2hhbmdlcyB8fCBoYXNJY29uQ2hhbmdlcztcbiAgfVxuICBwcml2YXRlIHNob3VsZFJlZnJlc2hEaXNwbGF5TW9kZShjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhKGNoYW5nZXNbJ211bHRpcGxlJ10gfHwgY2hhbmdlc1snbWF4U2VsZWN0ZWRMYWJlbHMnXSB8fCBjaGFuZ2VzWyd2YWx1ZSddKTtcbiAgfVxuICBwcml2YXRlIG5vcm1hbGl6ZVZhbHVlRm9yTXVsdGlwbGVNb2RlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoIWNoYW5nZXNbJ211bHRpcGxlJ10gfHwgIXRoaXMubXVsdGlwbGUgfHwgQXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKSB8fCB0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IFt0aGlzLnZhbHVlXTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVByaW50YWJsZVRyaWdnZXJLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2VhcmNoYWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1ByaW50YWJsZUNoYXJhY3RlcihldmVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLnNlYXJjaFRlcm0gPSBldmVudC5rZXk7XG4gICAgdGhpcy5vcGVuUGFuZWxBbmRGb2N1c1NlYXJjaCgpO1xuICAgIHRoaXMucmVmcmVzaEZpbHRlcmVkSXRlbXMoKTtcbiAgICB0aGlzLnN5bmNIaWdobGlnaHRXaXRoU2VsZWN0aW9uKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyQXJyb3dLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnQXJyb3dEb3duJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubmF2aWdhdGVUcmlnZ2VyQXJyb3coMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRyaWdnZXJBcnJvdygtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgbmF2aWdhdGVUcmlnZ2VyQXJyb3coc3RlcDogSGlnaGxpZ2h0U3RlcCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHRoaXMub3BlblBhbmVsQW5kRm9jdXNTZWFyY2goKTtcbiAgICAgIGlmIChzdGVwIDwgMCkge1xuICAgICAgICB0aGlzLnNldEhpZ2hsaWdodGVkSW5kZXgodGhpcy5maWx0ZXJlZEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm1vdmVIaWdobGlnaHQoc3RlcCk7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVUcmlnZ2VyT3BlbktleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGlzT3BlbktleSA9IGV2ZW50LmtleSA9PT0gJ0VudGVyJyB8fCBldmVudC5rZXkgPT09ICcgJztcblxuICAgIGlmICghaXNPcGVuS2V5IHx8IHRoaXMucGFuZWxPcGVuKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLm9wZW5QYW5lbEFuZEZvY3VzU2VhcmNoKCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hBcnJvd0tleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5tb3ZlSGlnaGxpZ2h0KDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd1VwJykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMubW92ZUhpZ2hsaWdodCgtMSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlU2VhcmNoYm94Qm91bmRhcnlLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0hvbWUnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KDApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChldmVudC5rZXkgPT09ICdFbmQnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5zZXRIaWdobGlnaHRlZEluZGV4KHRoaXMuZmlsdGVyZWRJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBoYW5kbGVTZWFyY2hib3hTZWxlY3Rpb25LZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRW50ZXInKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zZWxlY3RIaWdobGlnaHRlZE9wdGlvbigpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHByaXZhdGUgaGFuZGxlQ2xvc2VPckJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlQmFja3NwYWNlS2V5KGV2ZW50KTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZVBhbmVsQ2xvc2VLZXkoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiB0aGlzLnBhbmVsT3Blbikge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbCgnZXNjYXBlJyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgdGhpcy5wYW5lbE9wZW4pIHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHRoaXMuY2xvc2VQYW5lbCgndGFiJykpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBwcml2YXRlIGhhbmRsZUJhY2tzcGFjZUtleShldmVudDogS2V5Ym9hcmRFdmVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChldmVudC5rZXkgIT09ICdCYWNrc3BhY2UnIHx8ICF0aGlzLm11bHRpcGxlIHx8IHRoaXMuaGFzU2VhcmNoUXVlcnkgfHwgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtc1t0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoIC0gMV0sIGV2ZW50KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBwcml2YXRlIHJlc29sdmVQcmVmZXJyZWRIaWdobGlnaHRWYWx1ZSgpOiBPcHRpb25WYWx1ZSB8IG51bGwge1xuICAgIGlmICh0aGlzLmhhc1NlYXJjaFF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVPcHRpb25WYWx1ZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNpbmdsZU9wdGlvbj8udmFsdWUgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlyc3RTZWxlY3RlZEZpbHRlcmVkVmFsdWU7XG4gIH1cbiAgcHJpdmF0ZSByZXNvbHZlT3B0aW9uQ2hlY2tlZFN0YXRlKFxuICAgIHNlbGVjdGVkVmFsdWVzOiBTZXQ8T3B0aW9uVmFsdWU+LFxuICAgIG9wdGlvbjogQ29tYm9ib3hSZXNvbHZlZE9wdGlvbixcbiAgICBmb3JjZUNoZWNrZWQ6IGJvb2xlYW4gfCBudWxsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmIChmb3JjZUNoZWNrZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmb3JjZUNoZWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiAhc2VsZWN0ZWRWYWx1ZXMuaGFzKG9wdGlvbi52YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBlbnN1cmVJY29uU2VsZWN0b3JPcHRpb25zTG9hZGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pY29uU2VsZWN0b3IgfHwgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPT09IHRoaXMuY3VycmVudExhbmcgfHwgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaWNvbk9wdGlvbnNMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmljb25PcHRpb25zTG9hZFByb21pc2UgPSB0aGlzLmljb25TZWxlY3RvckRhdGFcbiAgICAgIC5sb2FkRm9udEF3ZXNvbWVWNVNvbGlkSWNvbnMoKVxuICAgICAgLnRoZW4oKGljb25zKSA9PiB7XG4gICAgICAgIHRoaXMuX2ljb25PcHRpb25zQ2FjaGUgPSBidWlsZEljb25TZWxlY3RvckNvbWJvYm94T3B0aW9ucyhpY29ucywgKHZhbHVlKSA9PiB0aGlzLnRyYW5zbGF0ZVRleHQodmFsdWUpKTtcbiAgICAgICAgdGhpcy5faWNvbk9wdGlvbnNDYWNoZUxhbmcgPSB0aGlzLmN1cnJlbnRMYW5nO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pY29uT3B0aW9uc0xvYWRQcm9taXNlID0gbnVsbDtcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29tYm9ib3hTdGF0ZSgpO1xuICAgICAgfSk7XG4gIH1cbiAgcHJpdmF0ZSBzY2hlZHVsZVZpc2libGVPcHRpb25zU3luYyhyZXNldFNjcm9sbCA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhbmVsT3BlbiB8fCAhdGhpcy51c2VWaXJ0dWFsaXplZE9wdGlvbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5zeW5jVmlzaWJsZUZpbHRlcmVkSXRlbXMocmVzZXRTY3JvbGwpKTtcbiAgICBjb25zdCBzY2hlZHVsZSA9IHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPT09ICdmdW5jdGlvbidcbiAgICAgID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgICA6IChjYWxsYmFjazogRnJhbWVSZXF1ZXN0Q2FsbGJhY2spID0+IGdsb2JhbFRoaXMud2luZG93LnNldFRpbWVvdXQoKCkgPT4gY2FsbGJhY2socGVyZm9ybWFuY2Uubm93KCkpLCAwKTtcbiAgICBzY2hlZHVsZSgoKSA9PiB0aGlzLnN5bmNWaXNpYmxlRmlsdGVyZWRJdGVtcyhyZXNldFNjcm9sbCkpO1xuICB9XG4gIHByaXZhdGUgcmVzZXRWaXJ0dWFsV2luZG93KCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZVN0YXJ0SW5kZXggPSAwO1xuICAgIHRoaXMudmlzaWJsZUVuZEluZGV4ID0gMDtcbiAgICB0aGlzLnZpc2libGVGaWx0ZXJlZEl0ZW1zID0gW107XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hcIj5cbiAgQGlmICh1aS5sYWJlbFRleHQgfHwgdWkuaW5mb1Rvb2x0aXBUZXh0KSB7XG4gICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWwtcm93XCI+XG4gICAgICBAaWYgKHVpLmxhYmVsVGV4dCkge1xuICAgICAgICA8bGFiZWxcbiAgICAgICAgICBbaWRdPVwidWkubGFiZWxJZFwiXG4gICAgICAgICAgW2Zvcl09XCJ1aS5sYWJlbEZvcklkXCJcbiAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fbGFiZWxcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwicmVxdWlyZWQgPyB1aS5sYWJlbFRleHQgKyAnICcgKyB1aS5yZXF1aXJlZEZpZWxkVGV4dCA6IHVpLmxhYmVsVGV4dFwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sYWJlbC10ZXh0XCI+XG4gICAgICAgICAgICB7eyB1aS5sYWJlbFRleHQgfX1cbiAgICAgICAgICAgIEBpZiAocmVxdWlyZWQpIHtcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1maWVsZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgfVxuICAgICAgQGlmICh1aS5pbmZvVG9vbHRpcFRleHQpIHtcbiAgICAgICAgPHNkYy10b29sdGlwXG4gICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2luZm8tdG9vbHRpcC13cmFwXCJcbiAgICAgICAgICBbcFRvb2x0aXBdPVwidWkuaW5mb1Rvb2x0aXBUZXh0XCJcbiAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cImluZm9Ub29sdGlwUG9zaXRpb25cIlxuICAgICAgICAgIFt0b29sdGlwRXZlbnRdPVwiaW5mb1Rvb2x0aXBFdmVudFwiXG4gICAgICAgICAgW2FsbG93SHRtbF09XCJpbmZvVG9vbHRpcEFsbG93SHRtbFwiXG4gICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWluZm8tY2lyY2xlIHNkYy1jb21ib2JveF9faW5mby10b29sdGlwLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgIDwvc2RjLXRvb2x0aXA+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cblxuICA8c2RjLXBvcG92ZXJcbiAgICBbb3Blbl09XCJwYW5lbE9wZW5cIlxuICAgIFthcHBlbmRUb109XCJhcHBlbmRUb1wiXG4gICAgW3pJbmRleF09XCJ6SW5kZXhcIlxuICAgIFtvZmZzZXRdPVwidWkucGFuZWxPZmZzZXRcIlxuICAgIFthcmlhTGFiZWxdPVwidWkuZHJvcGRvd25BcmlhTGFiZWxcIlxuICAgIFttYXRjaFRyaWdnZXJXaWR0aF09XCJ0cnVlXCJcbiAgICBbdG9nZ2xlT25UcmlnZ2VyQ2xpY2tdPVwiZmFsc2VcIlxuICAgIFtjbG9zZU9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICBbY2xvc2VPblNjcm9sbF09XCJmYWxzZVwiXG4gICAgW3BhbmVsQ2xhc3NdPVwidWkucGFuZWxPdmVybGF5Q2xhc3NcIlxuICAgIChvcGVuQ2hhbmdlKT1cIm9uUG9wb3Zlck9wZW5DaGFuZ2UoJGV2ZW50KVwiXG4gICAgPlxuICAgIDxkaXZcbiAgICAgIHNkYy1wb3BvdmVyLXRyaWdnZXJcbiAgICAgICN0cmlnZ2VyQ29udHJvbFJlZlxuICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NvbnRyb2xcIlxuICAgICAgW2F0dHIuaWRdPVwibXVsdGlwbGUgPyB1aS5jb250cm9sSWQgOiBudWxsXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLW11bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NvbnRyb2wtLWludmFsaWRdPVwiaW52YWxpZFwiXG4gICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jb250cm9sLS1kaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19jb250cm9sLS1zbWFsbF09XCJzaXplID09PSAnc21hbGwnXCJcbiAgICAgIFtuZ1N0eWxlXT1cImdldElucHV0U3R5bGUoKVwiXG4gICAgICBbYXR0ci50YWJpbmRleF09XCJtdWx0aXBsZSAmJiAhZGlzYWJsZWQgPyAwIDogbnVsbFwiXG4gICAgICBbYXR0ci5yb2xlXT1cIm11bHRpcGxlID8gJ2NvbWJvYm94JyA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJtdWx0aXBsZSA/ICdsaXN0Ym94JyA6IG51bGxcIlxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJtdWx0aXBsZSA/IHVpLmNvbWJvYm94QXJpYUxhYmVsIDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwibXVsdGlwbGUgPyB1aS5jb21ib2JveEFyaWFMYWJlbGxlZEJ5IDogbnVsbFwiXG4gICAgICBbYXR0ci5hcmlhLXJlcXVpcmVkXT1cIm11bHRpcGxlID8gcmVxdWlyZWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtaW52YWxpZF09XCJtdWx0aXBsZSA/IGludmFsaWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwibXVsdGlwbGUgPyAocGFuZWxPcGVuID8gJ3RydWUnIDogJ2ZhbHNlJykgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwibXVsdGlwbGUgPyB1aS5saXN0Ym94SWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudF09XCJtdWx0aXBsZSA/IGFjdGl2ZURlc2NlbmRhbnQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwibXVsdGlwbGUgPyB1aS5tZXNzYWdlSWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtYXV0b2NvbXBsZXRlXT1cIm11bHRpcGxlID8gJ2xpc3QnIDogbnVsbFwiXG4gICAgICAobW91c2Vkb3duKT1cIm9uQ29udHJvbE1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgIChjbGljayk9XCJvbkNvbnRyb2xDbGljaygpXCJcbiAgICAgIChrZXlkb3duKT1cIm11bHRpcGxlID8gb25UcmlnZ2VyS2V5ZG93bigkZXZlbnQpIDogbnVsbFwiXG4gICAgICA+XG4gICAgICA8ZGl2IGNsYXNzPVwic2RjLWNvbWJvYm94X192YWx1ZVwiPlxuICAgICAgICBAaWYgKCFtdWx0aXBsZSkge1xuICAgICAgICAgIEBpZiAoc2VsZWN0ZWRTaW5nbGVPcHRpb24/Lmljb24pIHtcbiAgICAgICAgICAgIDxzZGMtaWNvbi1yZW5kZXJlclxuICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fbGVhZGluZy1pY29uXCJcbiAgICAgICAgICAgICAgW2ljb25dPVwic2VsZWN0ZWRTaW5nbGVPcHRpb24/Lmljb25cIlxuICAgICAgICAgICAgICBbaWNvblR5cGVdPVwic2VsZWN0ZWRTaW5nbGVPcHRpb24/Lmljb25UeXBlXCJcbiAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgfVxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgI3NpbmdsZUlucHV0UmVmXG4gICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9faW5wdXRcIlxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgW2lkXT1cInVpLmNvbnRyb2xJZFwiXG4gICAgICAgICAgICBbbmFtZV09XCJ1aS5pbnB1dE5hbWVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFtyZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gICAgICAgICAgICBbcmVhZE9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWRTaW5nbGVPcHRpb24/LnRleHQgPz8gJydcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInVpLnBsYWNlaG9sZGVyVGV4dFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNvbWJvYm94QXJpYUxhYmVsXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ1aS5jb21ib2JveEFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImludmFsaWRcIlxuICAgICAgICAgICAgYXJpYS1leHBhbmRlZD1cImZhbHNlXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwicGFuZWxPcGVuID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWhhc3BvcHVwXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICBhcmlhLWNvbnRyb2xzPVwiY29tYm9ib3gtZmllbGQtbGlzdGJveFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cInVpLmxpc3Rib3hJZFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnRdPVwiYWN0aXZlRGVzY2VuZGFudFwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cInVpLm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICByb2xlPVwiY29tYm9ib3hcIlxuICAgICAgICAgICAgYXJpYS1hdXRvY29tcGxldGU9XCJsaXN0XCJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKClcIlxuICAgICAgICAgICAgKGtleWRvd24pPVwib25UcmlnZ2VyS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2ICNtdWx0aVZhbHVlUmVmIGNsYXNzPVwic2RjLWNvbWJvYm94X19tdWx0aS12YWx1ZVwiPlxuICAgICAgICAgICAgICBAaWYgKCFzaG91bGREaXNwbGF5Q2hpcFN1bW1hcnkpIHtcbiAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxpc3RcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNlbGVjdGVkU3VtbWFyeVRleHRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtczsgdHJhY2sgdHJhY2tCeU9wdGlvblZhbHVlKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8bGlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoaXRlbS5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZGMtaWNvbi1yZW5kZXJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpY29uXT1cIml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cIml0ZW0uaWNvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1sYWJlbFwiIFthdHRyLnRpdGxlXT1cIml0ZW0udGV4dFwiPnt7IGl0ZW0udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLXJlbW92ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiY2hpcFJlbW92ZUFyaWFMYWJlbChpdGVtKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVTZWxlY3RlZEl0ZW0oaXRlbSwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19zdW1tYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHNlbGVjdGVkU3VtbWFyeVRleHQgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19wbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgICAge3sgdWkucGxhY2Vob2xkZXJUZXh0IH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgPHVsXG4gICAgICAgICAgICAgICAgICAjY2hpcE1lYXN1cmVSZWZcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWxpc3Qgc2RjLWNvbWJvYm94X19jaGlwLWxpc3QtLW1lYXN1cmVcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtczsgdHJhY2sgdHJhY2tCeU9wdGlvblZhbHVlKCRpbmRleCwgaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgPGxpXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2NoaXBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKGl0ZW0uaWNvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19jaGlwLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJpdGVtLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwiaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtzaXplXT1cIjE0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1pY29uLXJlbmRlcmVyPlxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1sYWJlbFwiPnt7IGl0ZW0udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fY2hpcC1yZW1vdmUtcGxhY2Vob2xkZXJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXRpbWVzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fYWN0aW9uc1wiPlxuICAgICAgICAgIEBpZiAoaGFzQ2xlYXJBY3Rpb24pIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19pY29uLWJ1dHRvbiBzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uLS1jbGVhclwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY2xlYXJGaWVsZFRleHRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJBbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19pY29uLWJ1dHRvbiBzZGMtY29tYm9ib3hfX2ljb24tYnV0dG9uLS10b2dnbGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuZHJvcGRvd25BcmlhTGFiZWxcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJwYW5lbE9wZW5cIlxuICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvblRvZ2dsZU1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVQYW5lbCgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmFzIGZhLWNhcmV0LWRvd24gc2RjLWNvbWJvYm94X19jYXJldFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX2NhcmV0LS1vcGVuXT1cInBhbmVsT3BlblwiXG4gICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIHNkYy1wb3BvdmVyLWNvbnRlbnRcbiAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsXCJcbiAgICAgICAgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwicGFuZWxNYXhIZWlnaHRcIlxuICAgICAgICA+XG4gICAgICAgIEBpZiAoc2VhcmNoYWJsZSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsLXNlYXJjaFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fcGFuZWwtc2VhcmNoLXJvd1wiPlxuICAgICAgICAgICAgICBAaWYgKG11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX3BhbmVsLXNlbGVjdC1hbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxzZGMtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiYXJlQWxsRmlsdGVyZWRJdGVtc1NlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ1aS5zZWxlY3RBbGxUZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwidG9nZ2xlQWxsRmlsdGVyZWRJdGVtcygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICA8c2RjLXNlYXJjaGJveFxuICAgICAgICAgICAgICAgICNwYW5lbFNlYXJjaGJveFJlZlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19wYW5lbC1zZWFyY2hib3hcIlxuICAgICAgICAgICAgICAgIFtpZGVudGl0eV09XCJ1aS5wYW5lbFNlYXJjaElkZW50aXR5XCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJ1aS5wYW5lbFNlYXJjaFBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJzZWFyY2hUZXJtXCJcbiAgICAgICAgICAgICAgICBbZGVib3VuY2VUaW1lTXNdPVwiMFwiXG4gICAgICAgICAgICAgICAgW3N1Ym1pdE9uRW50ZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgIFtjbGVhck9uRXNjYXBlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICBbYXJpYUxhYmVsXT1cInVpLnBhbmVsU2VhcmNoQXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgICBbaW5wdXRSb2xlXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgIFtpbnB1dEF1dG9jb21wbGV0ZV09XCInb2ZmJ1wiXG4gICAgICAgICAgICAgICAgW2lucHV0QXJpYUNvbnRyb2xzXT1cInVpLmxpc3Rib3hJZFwiXG4gICAgICAgICAgICAgICAgW2lucHV0QXJpYURlc2NyaWJlZEJ5XT1cInVpLm1lc3NhZ2VJZFwiXG4gICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2hUZXJtQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvbkNsZWFyKT1cIm9uU2VhcmNoQ2xlYXJlZCgpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvblNlYXJjaGJveEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L3NkYy1zZWFyY2hib3g+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoaXNPcHRpb25zTG9hZGluZykge1xuICAgICAgICAgIDxvdXRwdXQgY2xhc3M9XCJzZGMtY29tYm9ib3hfX2xvYWRpbmdcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLXNwaW5uZXIgZmEtc3BpbiBzZGMtY29tYm9ib3hfX2xvYWRpbmctaWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19sb2FkaW5nLXRleHRcIj57eyB1aS5sb2FkaW5nSXRlbXNUZXh0IH19PC9zcGFuPlxuICAgICAgICAgIDwvb3V0cHV0PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChzaG93RW1wdHlTdGF0ZSkge1xuICAgICAgICAgIDxzZGMtZW1wdHktc3RhdGVcbiAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19lbXB0eVwiXG4gICAgICAgICAgICB2YXJpYW50PVwiaW5saW5lLXRleHRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cInVpLmVtcHR5VGl0bGVUZXh0XCJcbiAgICAgICAgICA+PC9zZGMtZW1wdHktc3RhdGU+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIEBpZiAodXNlVmlydHVhbGl6ZWRPcHRpb25zKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICNvcHRpb25zVmlld3BvcnRSZWZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnMgc2RjLWNvbWJvYm94X19vcHRpb25zLS12aXJ0dWFsaXplZFwiXG4gICAgICAgICAgICAgIChzY3JvbGwpPVwib25PcHRpb25zU2Nyb2xsKClcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPCEtLSBOT1NPTkFSOiBjdXN0b20gY29tYm9ib3ggcG9wdXAgaW50ZW50aW9uYWxseSB1c2VzIC0tPlxuICAgICAgICAgICAgICA8IS0tIEFSSUEgbGlzdGJveCBzZW1hbnRpY3MgaW5zdGVhZCBvZiBhIG5hdGl2ZSBzZWxlY3QgLS0+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9ucy1saXN0XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidWkuY29tYm9ib3hBcmlhTGFiZWxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ1aS5jb21ib2JveEFyaWFMYWJlbGxlZEJ5XCJcbiAgICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1tdWx0aXNlbGVjdGFibGVdPVwibXVsdGlwbGUgPyAndHJ1ZScgOiBudWxsXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX3ZpcnR1YWwtc3BhY2VyXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiYmVmb3JlVmlydHVhbFNwYWNlckhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICBAZm9yIChcbiAgICAgICAgICAgICAgICAgIHZpc2libGVPcHRpb24gb2YgdmlzaWJsZUZpbHRlcmVkSXRlbXM7XG4gICAgICAgICAgICAgICAgICB0cmFjayB0cmFja0J5T3B0aW9uVmFsdWUodmlzaWJsZU9wdGlvbi5pbmRleCwgdmlzaWJsZU9wdGlvbi5pdGVtKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1hY3RpdmVdPVwiaXNPcHRpb25BY3RpdmUodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWljb24tc2VsZWN0b3JdPVwiaWNvblNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkYy1jb21ib2JveF9fb3B0aW9uLS1zZWxlY3RlZF09XCIhbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1vcHRpb24taW5kZXhdPVwidmlzaWJsZU9wdGlvbi5pbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIm9uT3B0aW9uTW91c2VFbnRlcih2aXNpYmxlT3B0aW9uLmluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtdWx0aXBsZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1jaGVja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdNb2RlbF09XCJpc09wdGlvblNlbGVjdGVkKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25DaGVja2JveEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uT3B0aW9uQ2hlY2tib3hDaGFuZ2UodmlzaWJsZU9wdGlvbi5pdGVtLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NkYy1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8IS0tIE5PU09OQVIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwib3B0aW9uSWQodmlzaWJsZU9wdGlvbi5pbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ29wdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pID8gJ3RydWUnIDogJ2ZhbHNlJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiLTFcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uS2V5ZG93bigkZXZlbnQsIHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk9wdGlvbkNsaWNrKHZpc2libGVPcHRpb24uaXRlbSlcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAodmlzaWJsZU9wdGlvbi5pdGVtLmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNkYy1pY29uLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvbl09XCJ2aXNpYmxlT3B0aW9uLml0ZW0uaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25UeXBlXT1cInZpc2libGVPcHRpb24uaXRlbS5pY29uVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9zZGMtaWNvbi1yZW5kZXJlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tdGV4dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1sYWJlbFwiPnt7IHZpc2libGVPcHRpb24uaXRlbS50ZXh0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbk1ldGFUZXh0KHZpc2libGVPcHRpb24uaXRlbSk7IGFzIG9wdGlvbk1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1tZXRhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbk1ldGEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgQGlmICghbXVsdGlwbGUgJiYgaXNPcHRpb25TZWxlY3RlZCh2aXNpYmxlT3B0aW9uLml0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZhcyBmYS1jaGVjayBzZGMtY29tYm9ib3hfX29wdGlvbi1zZWxlY3RlZC1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fdmlydHVhbC1zcGFjZXJcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJhZnRlclZpcnR1YWxTcGFjZXJIZWlnaHRcIlxuICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8IS0tIE5PU09OQVI6IGN1c3RvbSBjb21ib2JveCBwb3B1cCBpbnRlbnRpb25hbGx5IHVzZXMgQVJJQSBsaXN0Ym94IHNlbWFudGljcyBpbnN0ZWFkIG9mIGEgbmF0aXZlIHNlbGVjdCAtLT5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbnNcIlxuICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ1aS5saXN0Ym94SWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInVpLmNvbWJvYm94QXJpYUxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cInVpLmNvbWJvYm94QXJpYUxhYmVsbGVkQnlcIlxuICAgICAgICAgICAgICBbYXR0ci5yb2xlXT1cIidsaXN0Ym94J1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbXVsdGlzZWxlY3RhYmxlXT1cIm11bHRpcGxlID8gJ3RydWUnIDogbnVsbFwiXG4gICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAobW91c2Vtb3ZlKT1cIm9uT3B0aW9uc1BhbmVsTW91c2VNb3ZlKClcIlxuICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbk9wdGlvbnNQYW5lbE1vdXNlTGVhdmUoKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQGZvciAoXG4gICAgICAgICAgICAgICAgb3B0aW9uIG9mIGZpbHRlcmVkSXRlbXM7XG4gICAgICAgICAgICAgICAgdHJhY2sgdHJhY2tCeU9wdGlvblZhbHVlKGluZGV4LCBvcHRpb24pO1xuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9ICRpbmRleFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0tYWN0aXZlXT1cImlzT3B0aW9uQWN0aXZlKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICBbY2xhc3Muc2RjLWNvbWJvYm94X19vcHRpb24tLWljb24tc2VsZWN0b3JdPVwiaWNvblNlbGVjdG9yXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5zZGMtY29tYm9ib3hfX29wdGlvbi0tc2VsZWN0ZWRdPVwiIW11bHRpcGxlICYmIGlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKVwiXG4gICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLW9wdGlvbi1pbmRleF09XCJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJvbk9wdGlvbk1vdXNlRW50ZXIoaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBpZiAobXVsdGlwbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNoZWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNkYy1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiaXNPcHRpb25TZWxlY3RlZChvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwib25PcHRpb25DaGVja2JveEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk9wdGlvbkNoZWNrYm94Q2hhbmdlKG9wdGlvbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwhLS0gTk9TT05BUiAtLT5cbiAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGN1c3RvbSBsaXN0Ym94IGtlZXBzIG9wdGlvbiBzZW1hbnRpY3Mgb24gdGhlIGZvY3VzYWJsZSBhY3Rpb24gZm9yIGtleWJvYXJkIG5hdmlnYXRpb24gLS0+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIm9wdGlvbklkKGluZGV4KVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnJvbGVdPVwiJ29wdGlvbidcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzT3B0aW9uU2VsZWN0ZWQob3B0aW9uKSA/ICd0cnVlJyA6ICdmYWxzZSdcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCItMVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIm9uT3B0aW9uS2V5ZG93bigkZXZlbnQsIG9wdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25PcHRpb25DbGljayhvcHRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNkYy1jb21ib2JveF9fb3B0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICBAaWYgKG9wdGlvbi5pY29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8c2RjLWljb24tcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZGMtY29tYm9ib3hfX29wdGlvbi1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW2ljb25dPVwib3B0aW9uLmljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaWNvblR5cGVdPVwib3B0aW9uLmljb25UeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpemVdPVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvc2RjLWljb24tcmVuZGVyZXI+XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tdGV4dHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tbGFiZWxcIj57eyBvcHRpb24udGV4dCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAob3B0aW9uTWV0YVRleHQob3B0aW9uKTsgYXMgb3B0aW9uTWV0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2RjLWNvbWJvYm94X19vcHRpb24tbWV0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbk1ldGEgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKCFtdWx0aXBsZSAmJiBpc09wdGlvblNlbGVjdGVkKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8aVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYXMgZmEtY2hlY2sgc2RjLWNvbWJvYm94X19vcHRpb24tc2VsZWN0ZWQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvc2RjLXBvcG92ZXI+XG5cbiAgICBAaWYgKHVpLm1lc3NhZ2VUZXh0KSB7XG4gICAgICA8c21hbGxcbiAgICAgICAgW2lkXT1cInVpLm1lc3NhZ2VJZFwiXG4gICAgICAgIFtuZ0NsYXNzXT1cImdldEludmFsaWRNZXNzYWdlQ2xhc3MoKVwiXG4gICAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICAgIGFyaWEtbGl2ZT1cInBvbGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAge3sgdWkubWVzc2FnZVRleHQgfX1cbiAgICAgIDwvc21hbGw+XG4gICAgfVxuICA8L2Rpdj5cbiJdfQ==