@fundamental-ngx/core 0.34.3-rc.38 → 0.34.3-rc.40

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 (127) hide show
  1. package/action-bar/package.json +1 -1
  2. package/action-sheet/package.json +1 -1
  3. package/alert/package.json +1 -1
  4. package/avatar/package.json +1 -1
  5. package/avatar-group/package.json +1 -1
  6. package/bar/package.json +1 -1
  7. package/breadcrumb/package.json +1 -1
  8. package/busy-indicator/package.json +1 -1
  9. package/button/package.json +1 -1
  10. package/calendar/esm2020/calendar-views/calendar-day-view/calendar-day-view.component.mjs +3 -3
  11. package/calendar/fesm2015/fundamental-ngx-core-calendar.mjs +2 -2
  12. package/calendar/fesm2015/fundamental-ngx-core-calendar.mjs.map +1 -1
  13. package/calendar/fesm2020/fundamental-ngx-core-calendar.mjs +2 -2
  14. package/calendar/fesm2020/fundamental-ngx-core-calendar.mjs.map +1 -1
  15. package/calendar/package.json +1 -1
  16. package/card/package.json +1 -1
  17. package/carousel/package.json +1 -1
  18. package/checkbox/package.json +1 -1
  19. package/combobox/package.json +1 -1
  20. package/date-picker/package.json +1 -1
  21. package/datetime/esm2020/fd-datetime-pipes.module.mjs +19 -0
  22. package/datetime/esm2020/fd-datetime.module.mjs +6 -7
  23. package/datetime/esm2020/public_api.mjs +2 -1
  24. package/datetime/fd-datetime-pipes.module.d.ts +8 -0
  25. package/datetime/fd-datetime.module.d.ts +2 -2
  26. package/datetime/fesm2015/fundamental-ngx-core-datetime.mjs +21 -6
  27. package/datetime/fesm2015/fundamental-ngx-core-datetime.mjs.map +1 -1
  28. package/datetime/fesm2020/fundamental-ngx-core-datetime.mjs +21 -6
  29. package/datetime/fesm2020/fundamental-ngx-core-datetime.mjs.map +1 -1
  30. package/datetime/package.json +1 -1
  31. package/datetime/public_api.d.ts +1 -0
  32. package/datetime-picker/package.json +1 -1
  33. package/dialog/package.json +1 -1
  34. package/dynamic-page/package.json +1 -1
  35. package/dynamic-side-content/package.json +1 -1
  36. package/esm2020/calendar/calendar-views/calendar-day-view/calendar-day-view.component.mjs +3 -3
  37. package/esm2020/datetime/fd-datetime-pipes.module.mjs +19 -0
  38. package/esm2020/datetime/fd-datetime.module.mjs +6 -7
  39. package/esm2020/datetime/public_api.mjs +2 -1
  40. package/esm2020/time/time-column/time-column.component.mjs +3 -3
  41. package/facets/package.json +1 -1
  42. package/feed-input/package.json +1 -1
  43. package/feed-list-item/package.json +1 -1
  44. package/fesm2015/fundamental-ngx-core-calendar.mjs +2 -2
  45. package/fesm2015/fundamental-ngx-core-calendar.mjs.map +1 -1
  46. package/fesm2015/fundamental-ngx-core-datetime.mjs +21 -6
  47. package/fesm2015/fundamental-ngx-core-datetime.mjs.map +1 -1
  48. package/fesm2015/fundamental-ngx-core-time.mjs +2 -2
  49. package/fesm2015/fundamental-ngx-core-time.mjs.map +1 -1
  50. package/fesm2020/fundamental-ngx-core-calendar.mjs +2 -2
  51. package/fesm2020/fundamental-ngx-core-calendar.mjs.map +1 -1
  52. package/fesm2020/fundamental-ngx-core-datetime.mjs +21 -6
  53. package/fesm2020/fundamental-ngx-core-datetime.mjs.map +1 -1
  54. package/fesm2020/fundamental-ngx-core-time.mjs +2 -2
  55. package/fesm2020/fundamental-ngx-core-time.mjs.map +1 -1
  56. package/file-uploader/package.json +1 -1
  57. package/fixed-card-layout/package.json +1 -1
  58. package/flexible-column-layout/package.json +1 -1
  59. package/form/package.json +1 -1
  60. package/formatted-text/package.json +1 -1
  61. package/grid-list/package.json +1 -1
  62. package/icon/package.json +1 -1
  63. package/illustrated-message/package.json +1 -1
  64. package/infinite-scroll/package.json +1 -1
  65. package/info-label/package.json +1 -1
  66. package/inline-help/package.json +1 -1
  67. package/input-group/package.json +1 -1
  68. package/layout-grid/package.json +1 -1
  69. package/layout-panel/package.json +1 -1
  70. package/link/package.json +1 -1
  71. package/list/package.json +1 -1
  72. package/menu/package.json +1 -1
  73. package/message-box/package.json +1 -1
  74. package/message-strip/package.json +1 -1
  75. package/message-toast/package.json +1 -1
  76. package/micro-process-flow/package.json +1 -1
  77. package/mobile-mode/package.json +1 -1
  78. package/multi-input/package.json +1 -1
  79. package/nested-list/package.json +1 -1
  80. package/notification/package.json +1 -1
  81. package/object-identifier/package.json +1 -1
  82. package/object-marker/package.json +1 -1
  83. package/object-number/package.json +1 -1
  84. package/object-status/package.json +1 -1
  85. package/package.json +1 -1
  86. package/pagination/package.json +1 -1
  87. package/panel/package.json +1 -1
  88. package/popover/package.json +1 -1
  89. package/product-switch/package.json +1 -1
  90. package/progress-indicator/package.json +1 -1
  91. package/quick-view/package.json +1 -1
  92. package/radio/package.json +1 -1
  93. package/rating-indicator/package.json +1 -1
  94. package/resizable-card-layout/package.json +1 -1
  95. package/scroll-spy/package.json +1 -1
  96. package/scrollbar/package.json +1 -1
  97. package/segmented-button/package.json +1 -1
  98. package/select/package.json +1 -1
  99. package/shared/package.json +1 -1
  100. package/shellbar/package.json +1 -1
  101. package/side-navigation/package.json +1 -1
  102. package/slider/package.json +1 -1
  103. package/split-button/package.json +1 -1
  104. package/splitter/package.json +1 -1
  105. package/status-indicator/package.json +1 -1
  106. package/step-input/package.json +1 -1
  107. package/switch/package.json +1 -1
  108. package/table/package.json +1 -1
  109. package/tabs/package.json +1 -1
  110. package/text/package.json +1 -1
  111. package/tile/package.json +1 -1
  112. package/time/esm2020/time-column/time-column.component.mjs +3 -3
  113. package/time/fesm2015/fundamental-ngx-core-time.mjs +2 -2
  114. package/time/fesm2015/fundamental-ngx-core-time.mjs.map +1 -1
  115. package/time/fesm2020/fundamental-ngx-core-time.mjs +2 -2
  116. package/time/fesm2020/fundamental-ngx-core-time.mjs.map +1 -1
  117. package/time/package.json +1 -1
  118. package/time-picker/package.json +1 -1
  119. package/timeline/package.json +1 -1
  120. package/title/package.json +1 -1
  121. package/token/package.json +1 -1
  122. package/toolbar/package.json +1 -1
  123. package/tree/package.json +1 -1
  124. package/upload-collection/package.json +1 -1
  125. package/utils/package.json +1 -1
  126. package/vertical-navigation/package.json +1 -1
  127. package/wizard/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/action-bar",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/action-sheet",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/alert",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/avatar",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/avatar-group",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
package/bar/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/bar",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/breadcrumb",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/busy-indicator",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fundamental-ngx/core/button",
3
- "version": "0.34.3-rc.38",
3
+ "version": "0.34.3-rc.40",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^13.0.0",
6
6
  "@angular/core": "^13.0.0"
@@ -766,13 +766,13 @@ export class CalendarDayViewComponent {
766
766
  }
767
767
  }
768
768
  CalendarDayViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: CalendarDayViewComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.CalendarService }, { token: DATE_TIME_FORMATS }, { token: i2.DatetimeAdapter }, { token: i3.CalendarI18nLabels }], target: i0.ɵɵFactoryTarget.Component });
769
- CalendarDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", type: CalendarDayViewComponent, selector: "fd-calendar-day-view", inputs: { currentlyDisplayed: "currentlyDisplayed", selectedDate: "selectedDate", selectedRangeDate: "selectedRangeDate", startingDayOfWeek: "startingDayOfWeek", calType: "calType", id: "id", rangeHoverEffect: "rangeHoverEffect", markWeekends: "markWeekends", showWeekNumbers: "showWeekNumbers", focusEscapeFunction: "focusEscapeFunction", specialDaysRules: "specialDaysRules", disableFunction: "disableFunction", disableRangeStartFunction: "disableRangeStartFunction", disableRangeEndFunction: "disableRangeEndFunction" }, outputs: { selectedRangeDateChange: "selectedRangeDateChange", nextMonthSelect: "nextMonthSelect", previousMonthSelect: "previousMonthSelect", selectedDateChange: "selectedDateChange" }, host: { properties: { "attr.id": "viewId" }, classAttribute: "fd-calendar__dates" }, usesOnChanges: true, ngImport: i0, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
769
+ CalendarDayViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.4", type: CalendarDayViewComponent, selector: "fd-calendar-day-view", inputs: { currentlyDisplayed: "currentlyDisplayed", selectedDate: "selectedDate", selectedRangeDate: "selectedRangeDate", startingDayOfWeek: "startingDayOfWeek", calType: "calType", id: "id", rangeHoverEffect: "rangeHoverEffect", markWeekends: "markWeekends", showWeekNumbers: "showWeekNumbers", focusEscapeFunction: "focusEscapeFunction", specialDaysRules: "specialDaysRules", disableFunction: "disableFunction", disableRangeStartFunction: "disableRangeStartFunction", disableRangeEndFunction: "disableRangeEndFunction" }, outputs: { selectedRangeDateChange: "selectedRangeDateChange", nextMonthSelect: "nextMonthSelect", previousMonthSelect: "previousMonthSelect", selectedDateChange: "selectedDateChange" }, host: { properties: { "attr.id": "viewId" }, classAttribute: "fd-calendar__dates" }, usesOnChanges: true, ngImport: i0, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
770
770
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImport: i0, type: CalendarDayViewComponent, decorators: [{
771
771
  type: Component,
772
772
  args: [{ selector: 'fd-calendar-day-view', encapsulation: ViewEncapsulation.None, host: {
773
773
  '[attr.id]': 'viewId',
774
774
  class: 'fd-calendar__dates'
775
- }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
775
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<table class=\"fd-calendar__table\" role=\"grid\" [attr.aria-roledescription]=\"_viewRoleDescription\">\n <thead class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n [attr.id]=\"_weekNumbersColumnHeaderId\"\n [attr.aria-label]=\"_weekColumnLabelAriaLabel\"\n ></th>\n <th\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"columnheader\"\n *ngFor=\"let day of shortWeekDays; index as i\"\n [attr.aria-label]=\"longWeekDays[i]\"\n >\n <span class=\"fd-calendar__text\">{{ day }}</span>\n </th>\n </tr>\n </thead>\n <tbody class=\"fd-calendar__group\" role=\"rowgroup\">\n <tr class=\"fd-calendar__row\" role=\"row\" *ngFor=\"let row of _dayViewGrid; let rowIndex = index\">\n <th\n *ngIf=\"showWeekNumbers\"\n class=\"fd-calendar__item fd-calendar__item--side-helper\"\n role=\"rowheader\"\n scope=\"row\"\n [attr.data-fd-calendar-week]=\"_weeks[rowIndex]\"\n [attr.id]=\"viewId + '-week-' + _weeks[rowIndex]\"\n [attr.aria-labelledby]=\"_weekNumbersColumnHeaderId + ' ' + (viewId + '-week-' + _weeks[rowIndex])\"\n >\n <span *ngIf=\"_weeks && _weeks[rowIndex]\" class=\"fd-calendar__text\">\n {{ _weeks[rowIndex] }}\n </span>\n </th>\n\n <td\n class=\"fd-calendar__item\"\n role=\"gridcell\"\n *ngFor=\"let cell of row; let cellIndex = index\"\n [class.is-active]=\"cell.selectedFirst || cell.selectedLast || cell.selected\"\n [class.fd-calendar__item--range]=\"\n (cell.selectedRange || cell.hoverRange) && !cell.selectedFirst && !cell.selectedLast\n \"\n [class.fd-calendar__item--current]=\"cell.current\"\n [class.fd-calendar__item--weekend]=\"cell.weekend && markWeekends && cell.monthStatus === 'current'\"\n [class.fd-calendar__item--other-month]=\"cell.monthStatus !== 'current'\"\n [class.is-disabled]=\"cell.disabled\"\n [class]=\"cell.specialNumber ? 'fd-calendar__special-day--' + cell.specialNumber : ''\"\n [attr.id]=\"cell.id\"\n [attr.data-fd-calendar-day]=\"cell.index\"\n [attr.aria-selected]=\"cell.selected\"\n [attr.aria-disabled]=\"cell.disabled\"\n [attr.tabindex]=\"cell.isTabIndexed ? 0 : -1\"\n (click)=\"selectDate(cell, $event)\"\n (mouseenter)=\"_refreshHoverRange(cell)\"\n (keydown)=\"_onKeydownDayHandler($event, cell, _getIndex(rowIndex, cellIndex))\"\n >\n <span\n class=\"fd-calendar__text\"\n role=\"button\"\n [attr.aria-labelledby]=\"\n cell.id +\n '-aria-label ' +\n (cell.selectedFirst ? _dateRangeStartLabelId + ' ' : '') +\n (cell.selectedLast ? _dateRangeEndLabelId + ' ' : '') +\n (cell.current ? _todayLabelId + ' ' : '') +\n (cell.selected && calType === 'single' ? _selectedDateLabelId + ' ' : '') +\n (cell.past ? _dateInPastLabelId : '')\n \"\n >{{ cell.label }}</span\n >\n <span hidden aria-hidden=\"true\" [attr.id]=\"cell.id + '-aria-label'\">\n {{ cell.ariaLabel }}\n </span>\n </td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length <= 5\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n <tr class=\"fd-calendar__row\" *ngIf=\"_dayViewGrid.length === 4\">\n <td class=\"fd-calendar__item hidden-day\"></td>\n </tr>\n </tbody>\n</table>\n\n<!-- Hidden elements for aria purposes -->\n<div hidden aria-hidden=\"true\">\n <div [attr.id]=\"_todayLabelId\">{{ _todayAriaLabel }}</div>\n <div [attr.id]=\"_selectedDateLabelId\">{{ _selectedDateAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeStartLabelId\">{{ _rangeStartAriaLabel }}</div>\n <div [attr.id]=\"_dateRangeEndLabelId\">{{ _rangeEndAriaLabel }}</div>\n <div [attr.id]=\"_dateInPastLabelId\">{{ _dateInPastAriaLabel }}</div>\n</div>\n", styles: [".hidden-day{visibility:hidden}\n"] }]
776
776
  }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.CalendarService }, { type: undefined, decorators: [{
777
777
  type: Inject,
778
778
  args: [DATE_TIME_FORMATS]
@@ -813,4 +813,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.4", ngImpor
813
813
  }], disableRangeEndFunction: [{
814
814
  type: Input
815
815
  }] } });
816
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckcsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSw2QkFBNkIsSUFBSSw2QkFBNkIsRUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBR3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBR3JFLDJEQUEyRDtBQVkzRCxNQUFNLE9BQU8sd0JBQXdCO0lBOEtqQyxjQUFjO0lBQ2QsWUFDWSxJQUFnQixFQUNoQixZ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LEtBQUs7Z0JBT04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFXTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLRyx1QkFBdUI7c0JBRC9CLE1BQU07Z0JBS0UsZUFBZTtzQkFEdkIsTUFBTTtnQkFLRSxtQkFBbUI7c0JBRDNCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQWdEUCxlQUFlO3NCQURkLEtBQUs7Z0JBUU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQVFOLHVCQUF1QjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVFMsIERhdGVUaW1lRm9ybWF0cywgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RhdGV0aW1lJztcbmltcG9ydCB7IFNwZWNpYWxEYXlSdWxlLCBOdWxsYWJsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5cbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRlLXJhbmdlJztcbmltcG9ydCB7IENhbGVuZGFyQ3VycmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci1jdXJyZW50JztcbmltcG9ydCB7IEFjdGl2ZUNhbGVuZGFyRGF5Q2VsbFN0cmF0ZWd5IGFzIENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5LCBDYWxlbmRhckRheSB9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci1kYXknO1xuXG5pbXBvcnQgeyBDYWxlbmRhclR5cGUsIERheXNPZldlZWsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jYWxlbmRhci5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFySTE4bkxhYmVscyB9IGZyb20gJy4uLy4uL2kxOG4vY2FsZW5kYXItaTE4bi1sYWJlbHMnO1xuaW1wb3J0IHsgRGlzYWJsZURhdGVGdW5jdGlvbiwgRXNjYXBlRm9jdXNGdW5jdGlvbiwgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbW1vbic7XG5cbi8qKiBDb21wb25lbnQgcmVwcmVzZW50aW5nIHRoZSBkYXkgdmlldyBvZiB0aGUgY2FsZW5kYXIuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWNhbGVuZGFyLWRheS12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbYXR0ci5pZF0nOiAndmlld0lkJyxcbiAgICAgICAgY2xhc3M6ICdmZC1jYWxlbmRhcl9fZGF0ZXMnXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRheVZpZXdDb21wb25lbnQ8RD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBGb2N1c2FibGVDYWxlbmRhclZpZXcge1xuICAgIC8qKiBDdXJyZW50bHkgZGlzcGxheWVkIG1vbnRoIGFuZCB5ZWFyIGZvciBkYXlzICovXG4gICAgQElucHV0KClcbiAgICBzZXQgY3VycmVudGx5RGlzcGxheWVkKGN1cnJlbnRseURpc3BsYXllZDogQ2FsZW5kYXJDdXJyZW50KSB7XG4gICAgICAgIGlmICghZXF1YWwoY3VycmVudGx5RGlzcGxheWVkLCB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSBjdXJyZW50bHlEaXNwbGF5ZWQ7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRseURpc3BsYXllZCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudGx5RGlzcGxheWVkO1xuICAgIH1cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2N1cnJlbnRseURpc3BsYXllZDogQ2FsZW5kYXJDdXJyZW50O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZSBtb2RlbCBpbiBzaW5nbGUgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZERhdGUoZGF0ZTogTnVsbGFibGU8RD4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICAgICAgaWYgKHRoaXMuX2RheVZpZXdHcmlkKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlGcm9tRGF0ZSA9IHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCBkYXRlKSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFNpbmdsZURheShkYXlGcm9tRGF0ZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWREYXRlKCk6IE51bGxhYmxlPEQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZTtcbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWRSYW5nZURhdGUoZGF0ZVJhbmdlOiBEYXRlUmFuZ2U8RD4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2Uuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2UuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSBkYXRlUmFuZ2U7XG4gICAgICAgIGlmICh0aGlzLl9kYXlWaWV3R3JpZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZVJhbmdlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzZWxlY3RlZFJhbmdlRGF0ZSgpOiBEYXRlUmFuZ2U8RD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGU7XG4gICAgfVxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRSYW5nZURhdGU6IERhdGVSYW5nZTxEPjtcblxuICAgIC8qKiBUaGUgZGF5IG9mIHRoZSB3ZWVrIHRoZSBjYWxlbmRhciBzaG91bGQgc3RhcnQgb24uIDEgcmVwcmVzZW50cyBTdW5kYXksIDIgaXMgTW9uZGF5LCAzIGlzIFR1ZXNkYXksIGFuZCBzbyBvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHN0YXJ0aW5nRGF5T2ZXZWVrOiBEYXlzT2ZXZWVrO1xuXG4gICAgLyoqIFRoZSB0eXBlIG9mIGNhbGVuZGFyLCAnc2luZ2xlJyBmb3Igc2luZ2xlIGRhdGUgc2VsZWN0aW9uIG9yICdyYW5nZScgZm9yIGEgcmFuZ2Ugb2YgZGF0ZXMuICovXG4gICAgQElucHV0KClcbiAgICBjYWxUeXBlOiBDYWxlbmRhclR5cGUgPSAnc2luZ2xlJztcblxuICAgIC8qKiBJZCBvZiB0aGUgY2FsZW5kYXIuIElmIG5vbmUgaXMgcHJvdmlkZWQsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBkYXkgY2VsbHMgb24gaG92ZXIuXG4gICAgICogV29ya3Mgb25seSBvbiByYW5nZSBtb2RlLCB3aGVuIHN0YXJ0IGRhdGUgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByYW5nZUhvdmVyRWZmZWN0ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBzdW5kYXkvc2F0dXJkYXkgd2l0aCBgZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRgIGNsYXNzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBtYXJrV2Vla2VuZHMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBzaG93IHdlZWsgbnVtYmVycyBuZXh0IHRvIGRheXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dXZWVrTnVtYmVycyA9IHRydWU7XG5cbiAgICAvKiogRnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gc3BlY2lmeSB3aGljaCBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsZWQsIHdoZW4gZm9jdXMgd2FudHMgdG8gZXNjYXBlICovXG4gICAgQElucHV0KClcbiAgICBmb2N1c0VzY2FwZUZ1bmN0aW9uOiBFc2NhcGVGb2N1c0Z1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lhbCBkYXlzIG1hcmssIGl0IGNhbiBiZSB1c2VkIGJ5IHBhc3NpbmcgYXJyYXkgb2Ygb2JqZWN0IHdpdGhcbiAgICAgKiBTcGVjaWFsIGRheSBudW1iZXIsIGxpc3QgMS0yMCBbY2xhc3M6YGZkLWNhbGVuZGFyX19zcGVjaWFsLWRheS0te3tudW1iZXJ9fWBdIGlzIGF2YWlsYWJsZSB0aGVyZTpcbiAgICAgKiBodHRwczovL3NhcC5naXRodWIuaW8vZnVuZGFtZW50YWwtc3R5bGVzL2NvbXBvbmVudHMvY2FsZW5kYXIuaHRtbCBjYWxlbmRhciBzcGVjaWFsIGRheXMgc2VjdGlvblxuICAgICAqIFJ1bGUgYWNjZXB0cyBtZXRob2Qgd2l0aCBkYXRlIG9iamVjdCBhcyBhIHBhcmFtZXRlci4gZXg6XG4gICAgICogYHJ1bGU6IChkYXRlOiBEKSA9PiB0aGlzLmRhdGVBZGFwdGVyLmdldERheShkYXRlKSA9PT0gMWAsIHdoaWNoIHdpbGwgbWFyayBhbGwgc3VuZGF5cyBhcyBzcGVjaWFsIGRheS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNwZWNpYWxEYXlzUnVsZXM6IFNwZWNpYWxEYXlSdWxlPEQ+W10gPSBbXTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBtb2RlbCBpcyBjaGFuZ2VkIGluIHJhbmdlIG1vZGUgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBuZXh0IG1vbnRoIGlzIHNlbGVjdGVkLCBieSBmb2N1cyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG5leHRNb250aFNlbGVjdDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgYWx3YXlzLCB3aGVuIHByZXZpb3VzIG1vbnRoIGlzIHNlbGVjdGVkLCBieSBmb2N1cyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHByZXZpb3VzTW9udGhTZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBtb2RlbCBpcyBjaGFuZ2VkIGluIHNpbmdsZSBtb2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RD4gPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQWN0dWFsIGRheSBncmlkIHdpdGggcHJldmlvdXMvY3VycmVudC9uZXh0IG1vbnRoIGRheXNcbiAgICAgKi9cbiAgICBfZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBcnJheSBvZiB3ZWVrIG51bWJlcnMgZGlzcGxheWVkIGZvciBjdXJyZW50IG1vbnRoL3llYXJcbiAgICAgKi9cbiAgICBfd2Vla3M6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFuIFJ4SlMgU3ViamVjdCB0aGF0IHdpbGwga2lsbCB0aGUgZGF0YSBzdHJlYW0gdXBvbiBjb21wb25lbnTigJlzIGRlc3RydWN0aW9uIChmb3IgdW5zdWJzY3JpYmluZylcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXlzIHBlciB3ZWVrXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYW1vdW50T2ZDb2xzID0gNztcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzT25SYW5nZVBpY2sgPSBmYWxzZTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzSW5pdGlhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmFyaWFibGUgdGhhdCBjb250YWlucyBzaG9ydCB3ZWVrZGF5IG5hbWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nob3J0V2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHRoYXQgY29udGFpbnMgc2hvcnQgd2Vla2RheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb25nV2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgdHlwZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZUZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGZvciB0aGUgcmFuZ2Ugc3RhcnQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb246IERpc2FibGVEYXRlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBlbmQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoREFURV9USU1FX0ZPUk1BVFMpIHByaXZhdGUgX2RhdGVUaW1lRm9ybWF0czogRGF0ZVRpbWVGb3JtYXRzLFxuICAgICAgICBwdWJsaWMgX2RhdGVUaW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEQ+LFxuICAgICAgICBwcml2YXRlIF9jYWxlbmRhckkxOG5MYWJlbHM6IENhbGVuZGFySTE4bkxhYmVsc1xuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9zZXR1cEtleWJvYXJkU2VydmljZSgpO1xuXG4gICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG5cbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuXG4gICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5sb2NhbGVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFNob3J0V2Vla0RheXMoKTtcbiAgICAgICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgLyoqIENoYW5nZXMgb2YgdGhvc2UgcHJvcGVydGllcyBhcmUgZG9uZSBpbnNpZGUgaXRzIHNldHRlcnMgKi9cbiAgICAgICAgaWYgKCFjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSAmJiAhY2hhbmdlc1snc2VsZWN0ZWRSYW5nZURhdGUnXSAmJiAhY2hhbmdlc1snY3VycmVudGx5RGlzcGxheWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gZm9yIHNlbGVjdGluZyBhIGRhdGUgb24gdGhlIGNhbGVuZGFyLiBUeXBpY2FsbHkgY2FsbGVkIHdoZW4gYSBkYXRlIGlzIGNsaWNrZWQsIGJ1dCBjYW4gYWxzbyBiZSBjYWxsZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0gZGF5IENhbGVuZGFyRGF5IG9iamVjdCB0byBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXk8RD4sIGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlcmUgYXJlIHNvbWUgcHJvYmxlbXMgd2l0aCBwb3B1cCBpbnRlZ3JhdGlvbi4gQWZ0ZXIgY2xpY2tpbmcgaW5zaWRlIGRheSBjb21wb25lbnQsIHRoZSBwb3BvdmVyIGNsb3Nlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXkuZGlzYWJsZWQgJiYgIWRheS5ibG9ja2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgIC8qKiBSZW1vdmUgc2VsZWN0aW9ucyBmcm9tIG90aGVyIGRheSBhbmQgcHV0IHNlbGVjdGlvbiB0byBjaG9zZW4gZGF5ICovXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZSA9IGRheS5kYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMCB8fCB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0geyBzdGFydDogZGF5LmRhdGUsIGVuZDogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGUgcGlja2VkIGlzIGhpZ2hlciB0aGFuIGFscmVhZHkgY2hvc2VuLCBvdGhlcndpc2UganVzdCByZXZlcnNlIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0ISwgZGF5LmRhdGUpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBkYXkuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXkuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyh0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5yYW5nZUhvdmVyRWZmZWN0ICYmIHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDEgJiYgZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzT25SYW5nZVBpY2sgPSAhdGhpcy5faXNPblJhbmdlUGljaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzT25SYW5nZVBpY2sgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBmb2N1cyBvbiBkZWZhdWx0IGZvY3VzYWJsZSBjZWxsXG4gICAgICovXG4gICAgc2V0Rm9jdXNPbkNlbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNlbGxUb0ZvY3VzID0gbmV3IENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5KCkuZ2V0QWN0aXZlQ2VsbCh0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICBpZiAoIWNlbGxUb0ZvY3VzPy5pbmRleCAmJiBjZWxsVG9Gb2N1cz8uaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChjZWxsVG9Gb2N1cy5pbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVmcmVzaEhvdmVyUmFuZ2UoZGF5OiBDYWxlbmRhckRheTxEPik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGU/LnN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5faXNPblJhbmdlUGljayAmJiBzdGFydCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXkuZGF0ZSwgc3RhcnQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoX2RheS5kYXRlLCBkYXkuZGF0ZSkgPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoX2RheS5kYXRlLCBzdGFydCkgPCAwO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpID4gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiAgQW1vdW50IG9mIHNlbGVjdGVkIGRheXNcbiAgICAgKiAgMCwgd2hlbiB0aGVyZSBpcyBubyBkYXkgc2VsZWN0ZWQsIG9yIHN0YXJ0IGRhdGUgaXMgaW52YWxpZCxcbiAgICAgKiAgMSwgd2hlbiB0aGVyZSBpcyBvbmx5IHZhbGlkIHN0YXJ0IGRhdGUsIG9yIGVuZCBkYXRlIGlzIHNhbWUgYXMgc3RhcnQgZGF0ZSxcbiAgICAgKiAgMiwgd2hlbiBib3RoIGRhdGVzIGFyZSB2YWxpZFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0Q291bnRlcigpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSYW5nZURhdGUgfHwgIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0ICYmXG4gICAgICAgICAgICAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSAmJlxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgc2hvcnQgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IHNob3J0V2Vla0RheXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvcnRXZWVrRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyB3ZWVrZGF5IG5hbWUuXG4gICAgICogQ2FuIGJlIGNoYW5nZWQgYnkgdXNlciBieSBwcm92aWRpbmcgb3RoZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBEYXRldGltZUFkYXB0ZXJcbiAgICAgKi9cbiAgICBnZXQgbG9uZ1dlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdXZWVrRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRnVuY3Rpb24gdGhhdCBnaXZlcyBhcnJheSBvZiBhbGwgZGlzcGxheWVkIENhbGVuZGFyRGF5c1xuICAgICAqL1xuICAgIGdldCBfY2FsZW5kYXJEYXlMaXN0KCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5Vmlld0dyaWQucmVkdWNlKCh0b3RhbENhbGVuZGFyUm93czogQ2FsZW5kYXJEYXk8RD5bXSwgY2FsZW5kYXJSb3c6IENhbGVuZGFyRGF5PEQ+W10pID0+IHtcbiAgICAgICAgICAgIGlmICghY2FsZW5kYXJSb3cpIHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhclJvdyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsQ2FsZW5kYXJSb3dzLmNvbmNhdChjYWxlbmRhclJvdyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUb2RheSBjZWxsIGxhYmVsLlxuICAgICAqIElzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjZWxsIGRhdGUgaXRzZWxmXG4gICAgICovXG4gICAgZ2V0IF90b2RheUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLnRvZGF5TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNlbGVjdGVkIGRhdGUgY2VsbCBsYWJlbC5cbiAgICAgKiBJcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2VsbCBkYXRlIGl0c2VsZlxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0ZWREYXRlQXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckkxOG5MYWJlbHMuZGF0ZVNlbGVjdGVkTGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIGNvbHVtbiBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfd2Vla0NvbHVtbkxhYmVsQXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckkxOG5MYWJlbHMud2Vla0NvbHVtbkxhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSYW5nZSBzdGFydCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfcmFuZ2VTdGFydEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLnJhbmdlU3RhcnRMYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmFuZ2UgZW5kIGxhYmVsXG4gICAgICovXG4gICAgZ2V0IF9yYW5nZUVuZEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLnJhbmdlRW5kTGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgaW4gcGFzdCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfZGF0ZUluUGFzdEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmRheUluUGFzdExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBWaWV3IGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgZ2V0IF92aWV3Um9sZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckkxOG5MYWJlbHMuY2FsZW5kYXJEYXlWaWV3RGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmlldyBJRFxuICAgICAqL1xuICAgIGdldCB2aWV3SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQgKyAnLWRheS12aWV3JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogV2VlayBjb2x1bW4gaGVhZGVyIElEXG4gICAgICovXG4gICAgZ2V0IF93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctd2Vlay1jb2x1bW4taGVhZGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVG9kYXkgY2VsbCBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfdG9kYXlMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctdG9kYXktbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZWxlY3RlZCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9zZWxlY3RlZERhdGVMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctc2VsZWN0ZWQtZGF0ZS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgcmFuZ2Ugc3RhcnQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfZGF0ZVJhbmdlU3RhcnRMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctcmFuZ2Utc3RhcnQtZGF0ZS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgcmFuZ2UgZW5kIGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVSYW5nZUVuZExhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1yYW5nZS1lbmQtZGF0ZS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgaW4gcGFzdCBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfZGF0ZUluUGFzdExhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1kYXktaW4tcGFzdC1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGhhbmRsZXMgZGF5IGNlbGxzIGtleWRvd24gZXZlbnRzLFxuICAgICAqIEBwYXJhbSBldmVudCBLZXlib2FyZEV2ZW50XG4gICAgICogQHBhcmFtIGNlbGwgQ2FsZW5kYXJEYXlcbiAgICAgKiBAcGFyYW0gZ3JpZCB3aXRoIHNwZWNpZmllZCBjb2x1bW4gYW5kIHJvdyBhcyBhIHggYW5kIHlcbiAgICAgKi9cbiAgICBfb25LZXlkb3duRGF5SGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCwgY2VsbDogQ2FsZW5kYXJEYXk8RD4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uS2V5ZG93bkhhbmRsZXIoZXZlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiAgTWV0aG9kIHRoYXQgYWxsb3cgdG8gZm9jdXMgZWxlbWVudHMgaW5zaWRlIHRoaXMgY29tcG9uZW50XG4gICAgICovXG4gICAgX2ZvY3VzRWxlbWVudEJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFRvRm9jdXM6IEhUTUxFbGVtZW50ID0gdGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudFRvRm9jdXM/LmZvY3VzKSB7XG4gICAgICAgICAgICBlbGVtZW50VG9Gb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFN0YW5kYXJkaXplZCBtZXRob2QgdG8gY2FsY3VsYXRlIGdyaWQgW3hdW3ldIHRvIGluZGV4IG51bWJlciBvZiBmbGF0dGVuIGxpc3RcbiAgICAgKi9cbiAgICBfZ2V0SW5kZXgocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU2VydmljZS5nZXRJZChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIHByZXZpb3VzIG1vbnRoXG4gICAgICogVHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgbW9udGggaXMgY2hhbmdlZCBkdXJpbmcgY2hhbmdpbmcgZm9jdXNcbiAgICAgKiBBbHNvIHRyaWdnZXJzIGV2ZW50IHRvIHBhcmVudCBjYWxlbmRhciBjb21wb25lbnQgYW5kIHJlYnVpbGRzIGRheSB2aWV3IGdyaWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoKCk7XG4gICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c01vbnRoU2VsZWN0LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBuZXh0IG1vbnRoXG4gICAgICogVHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgbW9udGggaXMgY2hhbmdlZCBkdXJpbmcgY2hhbmdpbmcgZm9jdXNcbiAgICAgKiBBbHNvIHRyaWdnZXJzIGV2ZW50IHRvIHBhcmVudCBjYWxlbmRhciBjb21wb25lbnQgYW5kIHJlYnVpbGRzIGRheSB2aWV3IGdyaWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3ROZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHRoaXMuX2dldE5leHRNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMubmV4dE1vbnRoU2VsZWN0LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgY3JlYXRlcyBhcnJheSBvZiBDYWxlbmRhckRheSBtb2RlbHMgd2hpY2ggd2lsbCBiZSBzaG93biBvbiBkYXkgZ3JpZCxcbiAgICAgKiBkZXBlbmRpbmcgb24gY3VycmVudCBtb250aCBhbmQgeWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9wb3B1bGF0ZUNhbGVuZGFyKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBsZXQgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10gPSBbXTtcblxuICAgICAgICBjYWxlbmRhciA9IHRoaXMuX2dldFByZXZpb3VzTW9udGhEYXlzKGNhbGVuZGFyKTtcbiAgICAgICAgY2FsZW5kYXIgPSBjYWxlbmRhci5jb25jYXQodGhpcy5fZ2V0Q3VycmVudE1vbnRoRGF5cygpKTtcbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXROZXh0TW9udGhEYXlzKGNhbGVuZGFyKTtcblxuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChjYWxsLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjYWxsLmlkID0gdGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCk7XG4gICAgICAgICAgICBjYWxsLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdzaW5nbGUnICYmIHRoaXMuX3NlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgX2RheSA9IGNhbGVuZGFyLmZpbmQoKGRheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF5LmRhdGUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoX2RheSwgY2FsZW5kYXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3JhbmdlJyAmJiB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxlbmRhcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgYnVpbGRzIDIgZGltZW5zaW9ucyBkYXkgdmlldyBncmlkLCBhbHNvIHNldHMgdXAgY3VycmVudGx5IGRpc3BsYXllZCBtb250aCwgb3IgeWVhcixcbiAgICAgKiB3aGVuIHRoZXJlIGlzIG5vdCBhbnkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYnVpbGREYXlWaWV3R3JpZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRseURpc3BsYXllZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcih0b2RheSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzID0gdGhpcy5fcG9wdWxhdGVDYWxlbmRhcigpO1xuICAgICAgICBjb25zdCBkYXlWaWV3R3JpZDogQ2FsZW5kYXJEYXk8RD5bXVtdID0gW107XG5cbiAgICAgICAgd2hpbGUgKGNhbGVuZGFyRGF5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkYXlWaWV3R3JpZC5wdXNoKGNhbGVuZGFyRGF5cy5zcGxpY2UoMCwgdGhpcy5fYW1vdW50T2ZDb2xzKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5yb3dBbW91bnQgPSBkYXlWaWV3R3JpZC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fZGF5Vmlld0dyaWQgPSBkYXlWaWV3R3JpZDtcbiAgICAgICAgdGhpcy5fd2Vla3MgPSB0aGlzLl9yZWZyZXNoV2Vla0NvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCBpZCBvZiBjYWxlbmRhcidzIGRheSBpdGVtXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0Q2VsbElkQnlJbmRleChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1kYXktJyArIGluZGV4ICsgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSxcbiAgICAgKiB3aGljaCBjb250YWlucyBldmVyeSBzaW5nbGUgZGF5IG9mIGN1cnJlbnRseSBzaG93biBtb250aC95ZWFyLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEN1cnJlbnRNb250aERheXMoKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGg7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyO1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10gPSBbXTtcbiAgICAgICAgY29uc3QgYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b2RheSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpO1xuICAgICAgICBmb3IgKGxldCBkYXlOdW1iZXIgPSAxOyBkYXlOdW1iZXIgPD0gYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg7IGRheU51bWJlcisrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheU51bWJlcik7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLFxuICAgICAgICAgICAgICAgIG1vbnRoU3RhdHVzOiAnY3VycmVudCcsXG4gICAgICAgICAgICAgICAgY3VycmVudDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwodG9kYXksIGRhdGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5fZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXMpO1xuICAgICAgICBjZWxsICYmIChjZWxsLmlzVGFiSW5kZXhlZCA9IHRydWUpO1xuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFjdGl2ZSBjZWxsLCB3aGljaCBtZWFuczpcbiAgICAgKiBpZiB0aGVyZSBpcyBhbnkgc2VsZWN0ZWQgZGF5LCByZXR1cm4gc2VsZWN0ZWQgZGF5XG4gICAgICogaWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWQgZGF5LCBidXQgdGhlcmUgaXMgdG9kYXkgZGF5LCByZXR1cm4gdG9kYXkgZGF5XG4gICAgICogaWYgdGhlcmUgaXMgbm8gdG9kYXksIG9yIHNlbGVjdGVkLCByZXR1cm4gZmlyc3Qgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5PEQ+KCkuZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgbGFzdCAwLTYgZGF5cyBvZiBwcmV2aW91cyBtb250aC95ZWFyLiBUaGVzZXMgZGF5c1xuICAgICAqIGZpbGxzIHRoZSBnYXAgYmV0d2VlbiBzdGFydGluZyBzdGFydGluZ0RheU9mV2VlayBhbmQgZmlyc3QgZGF5IG9mIGN1cnJlbnQgbW9udGhcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA+IDEgPyB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCAtIDEgOiAxMjtcbiAgICAgICAgY29uc3QgeWVhciA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA+IDEgPyB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyIDogdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDE7XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERhdGUgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGgpO1xuICAgICAgICBjb25zdCBwcmV2TW9udGhMYXN0RGF5ID0gYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg7XG4gICAgICAgIGxldCBwcmV2TW9udGhMYXN0V2Vla0RheSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWsocHJldk1vbnRoTGFzdERhdGUpIC0gdGhpcy5zdGFydGluZ0RheU9mV2VlaztcblxuICAgICAgICAvKiogQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIHNvbWUgZGF5cyBjdXQgYnkgc3RhcnRpbmdEYXlPZldlZWsgb3B0aW9uXG4gICAgICAgICAqICBJZiB5ZXMsIHRoZXJlIGlzIHdob2xlIHdlZWsgYWRkZWQsIHRvIGF2b2lkIGhpZGluZ1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgMCkge1xuICAgICAgICAgICAgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSBwcmV2TW9udGhMYXN0V2Vla0RheSArIDc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldk1vbnRoTGFzdFdlZWtEYXkgPCA2KSB7XG4gICAgICAgICAgICB3aGlsZSAocHJldk1vbnRoTGFzdFdlZWtEYXkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNb250aERheSA9IHByZXZNb250aExhc3REYXkgLSBwcmV2TW9udGhMYXN0V2Vla0RheTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIHByZXZNb250aERheSk7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goeyAuLi50aGlzLl9nZXREYXkoZGF0ZSksIG1vbnRoU3RhdHVzOiAncHJldmlvdXMnIH0pO1xuICAgICAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5LS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LCB3aGljaCBjb250YWlucyBmaXJzdCBkYXlzIG9mIG5leHQgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gbGFzdCBkYXkgb2YgY3VycmVudCBkYXkgYW5kIGVuZCBvZiA2LXdlZWtzIGNhbGVuZGFyIGdyaWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIDogMTtcbiAgICAgICAgY29uc3QgeWVhciA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgKyAxO1xuXG4gICAgICAgIC8vIFRoZSBjYWxlbmRhciBncmlkIGNhbiBoYXZlIDUgKDM1IGRheXMpIG9yIDYgKDQyIGRheXMpIHdlZWtzXG4gICAgICAgIGNvbnN0IG5leHRNb250aERpc3BsYXllZERheXMgPSAoNDIgLSBjYWxlbmRhckRheXMubGVuZ3RoKSAlIDc7XG5cbiAgICAgICAgZm9yIChsZXQgbmV4dEQgPSAxOyBuZXh0RCA8PSBuZXh0TW9udGhEaXNwbGF5ZWREYXlzOyBuZXh0RCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIG5leHREKTtcbiAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ25leHQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc1dlZWtlbmREYXkoZGF5T2ZXZWVrOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRheU9mV2VlayA9PT0gMSB8fCBkYXlPZldlZWsgPT09IDc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGdlbmVyYXRlcyB3aG9sZSBkYXkgbW9kZWwgYmFzaW5nIG9uIGRhdGUsIGRpc2FibGluZyBmdW5jdGlvbnMsIGJsb2NrIGZ1bmN0aW9ucywgYW5kIGFjdHVhbGx5XG4gICAgICogY2hvc2VuIHJhbmdlIC8gc2luZ2xlIGRhdGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0RGF5KGRhdGU6IEQpOiBDYWxlbmRhckRheTxEPiB7XG4gICAgICAgIGNvbnN0IHdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXlPZk1vbnRoID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlTmFtZXMoKTtcbiAgICAgICAgY29uc3QgaXNQYXN0ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpKSA8IDA7XG4gICAgICAgIGNvbnN0IGRheTogQ2FsZW5kYXJEYXk8RD4gPSB7XG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgbGFiZWw6IGRhdGVOYW1lc1tkYXlPZk1vbnRoIC0gMV0sXG4gICAgICAgICAgICB3ZWVrRGF5LFxuICAgICAgICAgICAgd2Vla2VuZDogdGhpcy5faXNXZWVrZW5kRGF5KHdlZWtEYXkpLFxuICAgICAgICAgICAgYXJpYUxhYmVsOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuX2RhdGVUaW1lRm9ybWF0cy5kaXNwbGF5LmRhdGVBMTF5TGFiZWwpLFxuICAgICAgICAgICAgc3BlY2lhbE51bWJlcjogdGhpcy5fZ2V0U3BlY2lhbERheShkYXRlKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICBwYXN0OiBpc1Bhc3RcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogQXBwbHkgZGlzYWJsZWQgc3RhdGUgdG8gZGF5cyBtYXJrZWQgd2l0aCBwYXNzZWQgZnVuY3Rpb24gKi9cbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBkYXkuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVGdW5jdGlvbihkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGlzIGNhbGxlZCB0byByZWZyZXNoIGkxOG4gc2hvcnQgd2VlayBkYXlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaG9ydERheU9mV2Vla05hbWVzID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdzaG9ydCcpO1xuICAgICAgICBjb25zdCBkYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpO1xuXG4gICAgICAgIHRoaXMuX3Nob3J0V2Vla0RheXMgPSBzaG9ydERheU9mV2Vla05hbWVzXG4gICAgICAgICAgICAuc2xpY2UodGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpXG4gICAgICAgICAgICAuY29uY2F0KHNob3J0RGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLl9sb25nV2Vla0RheXMgPSBkYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChkYXlPZldlZWtOYW1lcy5zbGljZSgwLCB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSkpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHNwZWNpYWwgZGF5IG51bWJlciBvZiBzcGVjaWZpZWQgZGF0ZSBtb2RlbFxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldFNwZWNpYWxEYXkoZGF0ZTogRCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBzcGVjaWFsRGF5ID0gdGhpcy5zcGVjaWFsRGF5c1J1bGVzLmZpbmQoKHNwZWNpYWxEYXlSdWxlKSA9PiBzcGVjaWFsRGF5UnVsZS5ydWxlKGRhdGUpKTtcbiAgICAgICAgaWYgKHNwZWNpYWxEYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzcGVjaWFsRGF5LnNwZWNpYWxEYXlOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgYXJyYXkgb2Ygd2VlaydzIGNvdW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfcmVmcmVzaFdlZWtDb3VudCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5TGlzdCA9IHRoaXMuX2NhbGVuZGFyRGF5TGlzdDtcbiAgICAgICAgY29uc3Qgd2Vla051bWJlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gNjsgaW5kZXggPCBjYWxlbmRhckRheUxpc3QubGVuZ3RoOyBpbmRleCA9IGluZGV4ICsgNikge1xuICAgICAgICAgICAgd2Vla051bWJlcnMucHVzaCh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0V2Vla05hbWUoY2FsZW5kYXJEYXlMaXN0W2luZGV4XS5kYXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtOdW1iZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgeWVhciBhbmQgbW9udGggZm9yIHByZXZpb3VzIHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRQcmV2aW91c01vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciwgbW9udGg6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCAtIDEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHllYXI6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyIC0gMSwgbW9udGg6IDEyIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBuZXh0IHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXROZXh0TW9udGgoKTogQ2FsZW5kYXJDdXJyZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciwgbW9udGg6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCArIDEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHllYXI6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMSwgbW9udGg6IDEgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdG8gcHV0IGNvbmZpZ3VyYXRpb24gYW5kIGxpc3RlbmVycyBvbiBjYWxlbmRhciBrZXlib2FyZCBzZXJ2aWNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0dXBLZXlib2FyZFNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmNvbEFtb3VudCA9IHRoaXMuX2Ftb3VudE9mQ29scztcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5mb2N1c0VzY2FwZUZ1bmN0aW9uID0gdGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uRm9jdXNJZENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleVNlbGVjdC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKHRoaXMuX2NhbGVuZGFyRGF5TGlzdFtpbmRleF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkxpc3RTdGFydEFwcHJvYWNoLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RQcmV2aW91c01vbnRoKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENhbGN1bGF0ZSBmb2N1c2VkIGNlbGwgaW4gbmV3IGdyaWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNb250aCA9IHRoaXMuX2dldE5leHRNb250aCgpOyAvLyBtb250aCB0aGF0IHdhcyBiZWZvcmUgbW92aW5nIGJhY2tcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTW9udGgueWVhcixcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLm1vbnRoLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdEYXlPZldlZWtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2TW9udGhBbW91bnRPZldlZWtzID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldEFtb3VudE9mV2Vla3MoXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdEYXlPZldlZWtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIHJlbmRlcmluZyBmb3IgbmV3IGdyaWQgc28gZm9jdXMgY2FuIGJlIHNldFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXggLSA3ICogKG9yaWdpbmFsQW1vdW50T2ZXZWVrcyAtIHByZXZNb250aEFtb3VudE9mV2Vla3MpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0RW5kQXBwcm9hY2gucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE5leHRNb250aCgpO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIENoYW5nZSBzZWxlY3Rpb24gZmxhZyBvbiBkYXlzIHRvIGZhbHNlLCBiZXNpZGVzIHRoZSBzZWxlY3RlZCBvbmVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VTZWxlY3RlZFNpbmdsZURheShkYXk6IENhbGVuZGFyRGF5PEQ+IHwgdW5kZWZpbmVkLCBjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgIGlmIChkYXkgJiYgIWRheS5ibG9ja2VkICYmICFkYXkuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGRheS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2UgcHJvcGVydGllcyBvZiByYW5nZSBkYXlzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRvIG5vdCByZWJ1aWxkIHdob2xlIGdyaWQgZnJvbSBzY3JhdGNoLFxuICAgICAqIGl0IGp1c3QgY2hhbmdlcyBwcm9wZXJ0aWVzIG9mIG5ld2x5IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyhkYXRlczogRGF0ZVJhbmdlPEQ+LCBjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICAvKiogUHVsbCBsaXN0IG9mIGNhbGVuZGFyIGRheXMgKi9cbiAgICAgICAgY29uc3QgY2FsZW5kYXJMaXN0ID0gY2FsZW5kYXI7XG5cbiAgICAgICAgLyoqIFJlc2V0IGNoYW5naW5nIHByb3BlcnRpZXMgKi9cbiAgICAgICAgY2FsZW5kYXJMaXN0LmZvckVhY2goXG4gICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZEZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZExhc3QgPVxuICAgICAgICAgICAgICAgICAgICBfZGF5LnNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5pc1RhYkluZGV4ZWQgPVxuICAgICAgICAgICAgICAgICAgICBfZGF5LmRpc2FibGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZFJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkYXRlcykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0RGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBlbmREYXk6IENhbGVuZGFyRGF5PEQ+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGRhdGVzLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgLyoqIEZpbmQgc3RhcnQgZGF0ZSBhbmQgbWFyayBpdCBhcyBzZWxlY3RlZCAqL1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuc3RhcnQpKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ICYmXG4gICAgICAgICAgICAgICAgICAgICFzdGFydERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFzdGFydERheS5kaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbihzdGFydERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGFydERheS5zZWxlY3RlZEZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgLyoqIEZpbmQgZW5kIGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBlbmREYXkgPSBjYWxlbmRhckxpc3QuZmluZCgoX2RheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoX2RheS5kYXRlLCBkYXRlcy5lbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVuZERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhZW5kRGF5LmJsb2NrZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5kaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHwgIXRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24oZW5kRGF5LmRhdGUpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBlbmREYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbmREYXkuc2VsZWN0ZWRMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiBWZXJpZnkgaWYgc3RhcnQgZGF5IGFuZCBlbmQgZGF5IGlzIHZhbGlkLCBvdGhlcndpc2UgZG9uJ3QgcHV0IHJhbmdlIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgaWYgKGRhdGVzLnN0YXJ0ICYmIGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBNYXJrIGFsbCBkYXlzLCB3aGljaCBhcmUgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGRhdGUgKi9cbiAgICAgICAgICAgICAgICBjYWxlbmRhckxpc3RcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChfZGF5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNCZXR3ZWVuKF9kYXkuZGF0ZSwgZGF0ZXMuc3RhcnQhLCBkYXRlcy5lbmQhKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWRSYW5nZSA9IHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyTGlzdCk7XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgY2FsZW5kYXJMaXN0LmZvckVhY2goKF9kYXkpID0+IChfZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMCB8fCB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAyKSAmJiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IF9kYXkuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uIShfZGF5LmRhdGUpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IF9kYXkuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbiEoX2RheS5kYXRlKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUYWJJbmRleChjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5pc1RhYkluZGV4ZWQgPSBmYWxzZSkpO1xuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5fZ2V0QWN0aXZlQ2VsbChjYWxlbmRhci5maWx0ZXIoKF9kYXkpID0+IF9kYXkubW9udGhTdGF0dXMgPT09ICdjdXJyZW50JykpO1xuICAgICAgICBjZWxsICYmIChjZWxsLmlzVGFiSW5kZXhlZCA9IHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBmb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGAjJHt0aGlzLl9nZXRDZWxsSWRCeUluZGV4KGluZGV4KX1gKTtcbiAgICB9XG59XG4iLCI8dGFibGUgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGFibGVcIiByb2xlPVwiZ3JpZFwiIFthdHRyLmFyaWEtcm9sZWRlc2NyaXB0aW9uXT1cIl92aWV3Um9sZURlc2NyaXB0aW9uXCI+XG4gICAgPHRoZWFkIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2dyb3VwXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiByb2xlPVwicm93XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIl93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIl93ZWVrQ29sdW1uTGFiZWxBcmlhTGFiZWxcIlxuICAgICAgICAgICAgPjwvdGg+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBzaG9ydFdlZWtEYXlzOyBpbmRleCBhcyBpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvbmdXZWVrRGF5c1tpXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHkgY2xhc3M9XCJmZC1jYWxlbmRhcl9fZ3JvdXBcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3Jvd1wiIHJvbGU9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIF9kYXlWaWV3R3JpZDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1dlZWtOdW1iZXJzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd2hlYWRlclwiXG4gICAgICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cInZpZXdJZCArICctd2Vlay0nICsgX3dlZWtzW3Jvd0luZGV4XVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cIl93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkICsgJyAnICsgKHZpZXdJZCArICctd2Vlay0nICsgX3dlZWtzW3Jvd0luZGV4XSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiX3dlZWtzICYmIF93ZWVrc1tyb3dJbmRleF1cIiBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IF93ZWVrc1tyb3dJbmRleF0gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdzsgbGV0IGNlbGxJbmRleCA9IGluZGV4XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtYWN0aXZlXT1cImNlbGwuc2VsZWN0ZWRGaXJzdCB8fCBjZWxsLnNlbGVjdGVkTGFzdCB8fCBjZWxsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXJhbmdlXT1cIlxuICAgICAgICAgICAgICAgICAgICAoY2VsbC5zZWxlY3RlZFJhbmdlIHx8IGNlbGwuaG92ZXJSYW5nZSkgJiYgIWNlbGwuc2VsZWN0ZWRGaXJzdCAmJiAhY2VsbC5zZWxlY3RlZExhc3RcbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tY3VycmVudF09XCJjZWxsLmN1cnJlbnRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0td2Vla2VuZF09XCJjZWxsLndlZWtlbmQgJiYgbWFya1dlZWtlbmRzICYmIGNlbGwubW9udGhTdGF0dXMgPT09ICdjdXJyZW50J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1vdGhlci1tb250aF09XCJjZWxsLm1vbnRoU3RhdHVzICE9PSAnY3VycmVudCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1kaXNhYmxlZF09XCJjZWxsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiY2VsbC5zcGVjaWFsTnVtYmVyID8gJ2ZkLWNhbGVuZGFyX19zcGVjaWFsLWRheS0tJyArIGNlbGwuc3BlY2lhbE51bWJlciA6ICcnXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJjZWxsLmlkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImNlbGwuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiY2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiY2VsbC5pc1RhYkluZGV4ZWQgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGNlbGwsICRldmVudClcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cIl9yZWZyZXNoSG92ZXJSYW5nZShjZWxsKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwiX29uS2V5ZG93bkRheUhhbmRsZXIoJGV2ZW50LCBjZWxsLCBfZ2V0SW5kZXgocm93SW5kZXgsIGNlbGxJbmRleCkpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX190ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuaWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJy1hcmlhLWxhYmVsICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRGaXJzdCA/IF9kYXRlUmFuZ2VTdGFydExhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRMYXN0ID8gX2RhdGVSYW5nZUVuZExhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuY3VycmVudCA/IF90b2RheUxhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWQgJiYgY2FsVHlwZSA9PT0gJ3NpbmdsZScgPyBfc2VsZWN0ZWREYXRlTGFiZWxJZCArICcgJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2VsbC5wYXN0ID8gX2RhdGVJblBhc3RMYWJlbElkIDogJycpXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID57eyBjZWxsLmxhYmVsIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxzcGFuIGhpZGRlbiBhcmlhLWhpZGRlbj1cInRydWVcIiBbYXR0ci5pZF09XCJjZWxsLmlkICsgJy1hcmlhLWxhYmVsJ1wiPlxuICAgICAgICAgICAgICAgICAgICB7eyBjZWxsLmFyaWFMYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiAqbmdJZj1cIl9kYXlWaWV3R3JpZC5sZW5ndGggPD0gNVwiPlxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2l0ZW0gaGlkZGVuLWRheVwiPjwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiAqbmdJZj1cIl9kYXlWaWV3R3JpZC5sZW5ndGggPT09IDRcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGJvZHk+XG48L3RhYmxlPlxuXG48IS0tIEhpZGRlbiBlbGVtZW50cyBmb3IgYXJpYSBwdXJwb3NlcyAtLT5cbjxkaXYgaGlkZGVuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX3RvZGF5TGFiZWxJZFwiPnt7IF90b2RheUFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX3NlbGVjdGVkRGF0ZUxhYmVsSWRcIj57eyBfc2VsZWN0ZWREYXRlQXJpYUxhYmVsIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlU3RhcnRMYWJlbElkXCI+e3sgX3JhbmdlU3RhcnRBcmlhTGFiZWwgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9kYXRlUmFuZ2VFbmRMYWJlbElkXCI+e3sgX3JhbmdlRW5kQXJpYUxhYmVsIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZUluUGFzdExhYmVsSWRcIj57eyBfZGF0ZUluUGFzdEFyaWFMYWJlbCB9fTwvZGl2PlxuPC9kaXY+XG4iXX0=
816
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY2FsZW5kYXIvY2FsZW5kYXItdmlld3MvY2FsZW5kYXItZGF5LXZpZXcvY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osS0FBSyxFQUlMLE1BQU0sRUFFTixpQkFBaUIsRUFDakIsTUFBTSxFQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBbUIsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFckcsT0FBTyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXBELE9BQU8sRUFBRSw2QkFBNkIsSUFBSSw2QkFBNkIsRUFBZSxNQUFNLDJCQUEyQixDQUFDO0FBR3hILE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7O0FBR3JFLDJEQUEyRDtBQVkzRCxNQUFNLE9BQU8sd0JBQXdCO0lBOEtqQyxjQUFjO0lBQ2QsWUFDWSxJQUFnQixFQUNoQixZ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LEtBQUs7Z0JBT04sZUFBZTtzQkFEZCxLQUFLO2dCQUtOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFXTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFLRyx1QkFBdUI7c0JBRC9CLE1BQU07Z0JBS0UsZUFBZTtzQkFEdkIsTUFBTTtnQkFLRSxtQkFBbUI7c0JBRDNCLE1BQU07Z0JBS0Usa0JBQWtCO3NCQUQxQixNQUFNO2dCQWdEUCxlQUFlO3NCQURkLEtBQUs7Z0JBUU4seUJBQXlCO3NCQUR4QixLQUFLO2dCQVFOLHVCQUF1QjtzQkFEdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIEluamVjdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgREFURV9USU1FX0ZPUk1BVFMsIERhdGVUaW1lRm9ybWF0cywgRGF0ZXRpbWVBZGFwdGVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2RhdGV0aW1lJztcbmltcG9ydCB7IFNwZWNpYWxEYXlSdWxlLCBOdWxsYWJsZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9zaGFyZWQnO1xuaW1wb3J0IGVxdWFsIGZyb20gJ2Zhc3QtZGVlcC1lcXVhbCc7XG5cbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uLy4uL21vZGVscy9kYXRlLXJhbmdlJztcbmltcG9ydCB7IENhbGVuZGFyQ3VycmVudCB9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci1jdXJyZW50JztcbmltcG9ydCB7IEFjdGl2ZUNhbGVuZGFyRGF5Q2VsbFN0cmF0ZWd5IGFzIENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5LCBDYWxlbmRhckRheSB9IGZyb20gJy4uLy4uL21vZGVscy9jYWxlbmRhci1kYXknO1xuXG5pbXBvcnQgeyBDYWxlbmRhclR5cGUsIERheXNPZldlZWsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jYWxlbmRhci5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGVuZGFySTE4bkxhYmVscyB9IGZyb20gJy4uLy4uL2kxOG4vY2FsZW5kYXItaTE4bi1sYWJlbHMnO1xuaW1wb3J0IHsgRGlzYWJsZURhdGVGdW5jdGlvbiwgRXNjYXBlRm9jdXNGdW5jdGlvbiwgRm9jdXNhYmxlQ2FsZW5kYXJWaWV3IH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvbW1vbic7XG5cbi8qKiBDb21wb25lbnQgcmVwcmVzZW50aW5nIHRoZSBkYXkgdmlldyBvZiB0aGUgY2FsZW5kYXIuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWNhbGVuZGFyLWRheS12aWV3JyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vY2FsZW5kYXItZGF5LXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLWRheS12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbYXR0ci5pZF0nOiAndmlld0lkJyxcbiAgICAgICAgY2xhc3M6ICdmZC1jYWxlbmRhcl9fZGF0ZXMnXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhckRheVZpZXdDb21wb25lbnQ8RD4gaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBGb2N1c2FibGVDYWxlbmRhclZpZXcge1xuICAgIC8qKiBDdXJyZW50bHkgZGlzcGxheWVkIG1vbnRoIGFuZCB5ZWFyIGZvciBkYXlzICovXG4gICAgQElucHV0KClcbiAgICBzZXQgY3VycmVudGx5RGlzcGxheWVkKGN1cnJlbnRseURpc3BsYXllZDogQ2FsZW5kYXJDdXJyZW50KSB7XG4gICAgICAgIGlmICghZXF1YWwoY3VycmVudGx5RGlzcGxheWVkLCB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQpKSB7XG4gICAgICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSBjdXJyZW50bHlEaXNwbGF5ZWQ7XG4gICAgICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGN1cnJlbnRseURpc3BsYXllZCgpOiBDYWxlbmRhckN1cnJlbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudGx5RGlzcGxheWVkO1xuICAgIH1cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2N1cnJlbnRseURpc3BsYXllZDogQ2FsZW5kYXJDdXJyZW50O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0ZSBtb2RlbCBpbiBzaW5nbGUgbW9kZS4gKi9cbiAgICBASW5wdXQoKVxuICAgIHNldCBzZWxlY3RlZERhdGUoZGF0ZTogTnVsbGFibGU8RD4pIHtcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICAgICAgaWYgKHRoaXMuX2RheVZpZXdHcmlkKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlGcm9tRGF0ZSA9IHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5maW5kKChkYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKGRheS5kYXRlLCBkYXRlKSk7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFNpbmdsZURheShkYXlGcm9tRGF0ZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgc2VsZWN0ZWREYXRlKCk6IE51bGxhYmxlPEQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkRGF0ZTtcbiAgICB9XG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZWxlY3RlZERhdGU6IE51bGxhYmxlPEQ+O1xuXG4gICAgLyoqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgRmREYXRlcyBtb2RlbCBzdGFydCBhbmQgZW5kIGluIHJhbmdlIG1vZGUuICovXG4gICAgQElucHV0KClcbiAgICBzZXQgc2VsZWN0ZWRSYW5nZURhdGUoZGF0ZVJhbmdlOiBEYXRlUmFuZ2U8RD4pIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZGF0ZVJhbmdlICYmXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2Uuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpICYmXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZGF0ZXNFcXVhbChkYXRlUmFuZ2UuZW5kLCB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLmVuZClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSBkYXRlUmFuZ2U7XG4gICAgICAgIGlmICh0aGlzLl9kYXlWaWV3R3JpZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXMoZGF0ZVJhbmdlLCB0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzZWxlY3RlZFJhbmdlRGF0ZSgpOiBEYXRlUmFuZ2U8RD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGU7XG4gICAgfVxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWRSYW5nZURhdGU6IERhdGVSYW5nZTxEPjtcblxuICAgIC8qKiBUaGUgZGF5IG9mIHRoZSB3ZWVrIHRoZSBjYWxlbmRhciBzaG91bGQgc3RhcnQgb24uIDEgcmVwcmVzZW50cyBTdW5kYXksIDIgaXMgTW9uZGF5LCAzIGlzIFR1ZXNkYXksIGFuZCBzbyBvbi4gKi9cbiAgICBASW5wdXQoKVxuICAgIHN0YXJ0aW5nRGF5T2ZXZWVrOiBEYXlzT2ZXZWVrO1xuXG4gICAgLyoqIFRoZSB0eXBlIG9mIGNhbGVuZGFyLCAnc2luZ2xlJyBmb3Igc2luZ2xlIGRhdGUgc2VsZWN0aW9uIG9yICdyYW5nZScgZm9yIGEgcmFuZ2Ugb2YgZGF0ZXMuICovXG4gICAgQElucHV0KClcbiAgICBjYWxUeXBlOiBDYWxlbmRhclR5cGUgPSAnc2luZ2xlJztcblxuICAgIC8qKiBJZCBvZiB0aGUgY2FsZW5kYXIuIElmIG5vbmUgaXMgcHJvdmlkZWQsIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBkYXkgY2VsbHMgb24gaG92ZXIuXG4gICAgICogV29ya3Mgb25seSBvbiByYW5nZSBtb2RlLCB3aGVuIHN0YXJ0IGRhdGUgaXMgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICByYW5nZUhvdmVyRWZmZWN0ID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHVzZXIgd2FudHMgdG8gbWFyayBzdW5kYXkvc2F0dXJkYXkgd2l0aCBgZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRgIGNsYXNzXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBtYXJrV2Vla2VuZHMgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdXNlciB3YW50cyB0byBzaG93IHdlZWsgbnVtYmVycyBuZXh0IHRvIGRheXNcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNob3dXZWVrTnVtYmVycyA9IHRydWU7XG5cbiAgICAvKiogRnVuY3Rpb24gdGhhdCBhbGxvd3MgdG8gc3BlY2lmeSB3aGljaCBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsZWQsIHdoZW4gZm9jdXMgd2FudHMgdG8gZXNjYXBlICovXG4gICAgQElucHV0KClcbiAgICBmb2N1c0VzY2FwZUZ1bmN0aW9uOiBFc2NhcGVGb2N1c0Z1bmN0aW9uO1xuXG4gICAgLyoqXG4gICAgICogU3BlY2lhbCBkYXlzIG1hcmssIGl0IGNhbiBiZSB1c2VkIGJ5IHBhc3NpbmcgYXJyYXkgb2Ygb2JqZWN0IHdpdGhcbiAgICAgKiBTcGVjaWFsIGRheSBudW1iZXIsIGxpc3QgMS0yMCBbY2xhc3M6YGZkLWNhbGVuZGFyX19zcGVjaWFsLWRheS0te3tudW1iZXJ9fWBdIGlzIGF2YWlsYWJsZSB0aGVyZTpcbiAgICAgKiBodHRwczovL3NhcC5naXRodWIuaW8vZnVuZGFtZW50YWwtc3R5bGVzL2NvbXBvbmVudHMvY2FsZW5kYXIuaHRtbCBjYWxlbmRhciBzcGVjaWFsIGRheXMgc2VjdGlvblxuICAgICAqIFJ1bGUgYWNjZXB0cyBtZXRob2Qgd2l0aCBkYXRlIG9iamVjdCBhcyBhIHBhcmFtZXRlci4gZXg6XG4gICAgICogYHJ1bGU6IChkYXRlOiBEKSA9PiB0aGlzLmRhdGVBZGFwdGVyLmdldERheShkYXRlKSA9PT0gMWAsIHdoaWNoIHdpbGwgbWFyayBhbGwgc3VuZGF5cyBhcyBzcGVjaWFsIGRheS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHNwZWNpYWxEYXlzUnVsZXM6IFNwZWNpYWxEYXlSdWxlPEQ+W10gPSBbXTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBtb2RlbCBpcyBjaGFuZ2VkIGluIHJhbmdlIG1vZGUgKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBzZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZTogRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4gPSBuZXcgRXZlbnRFbWl0dGVyPERhdGVSYW5nZTxEPj4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBuZXh0IG1vbnRoIGlzIHNlbGVjdGVkLCBieSBmb2N1cyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG5leHRNb250aFNlbGVjdDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgYWx3YXlzLCB3aGVuIHByZXZpb3VzIG1vbnRoIGlzIHNlbGVjdGVkLCBieSBmb2N1cyAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IHByZXZpb3VzTW9udGhTZWxlY3Q6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcblxuICAgIC8qKiBFdmVudCBlbWl0dGVkIGFsd2F5cywgd2hlbiBtb2RlbCBpcyBjaGFuZ2VkIGluIHNpbmdsZSBtb2RlICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgc2VsZWN0ZWREYXRlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8RD4gPSBuZXcgRXZlbnRFbWl0dGVyPEQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQWN0dWFsIGRheSBncmlkIHdpdGggcHJldmlvdXMvY3VycmVudC9uZXh0IG1vbnRoIGRheXNcbiAgICAgKi9cbiAgICBfZGF5Vmlld0dyaWQ6IENhbGVuZGFyRGF5PEQ+W11bXTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBBcnJheSBvZiB3ZWVrIG51bWJlcnMgZGlzcGxheWVkIGZvciBjdXJyZW50IG1vbnRoL3llYXJcbiAgICAgKi9cbiAgICBfd2Vla3M6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEFuIFJ4SlMgU3ViamVjdCB0aGF0IHdpbGwga2lsbCB0aGUgZGF0YSBzdHJlYW0gdXBvbiBjb21wb25lbnTigJlzIGRlc3RydWN0aW9uIChmb3IgdW5zdWJzY3JpYmluZylcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRlc3Ryb3kkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBEYXlzIHBlciB3ZWVrXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYW1vdW50T2ZDb2xzID0gNztcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzT25SYW5nZVBpY2sgPSBmYWxzZTtcbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzSW5pdGlhdGVkID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVmFyaWFibGUgdGhhdCBjb250YWlucyBzaG9ydCB3ZWVrZGF5IG5hbWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3Nob3J0V2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHRoYXQgY29udGFpbnMgc2hvcnQgd2Vla2RheSBuYW1lcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9sb25nV2Vla0RheXM6IHN0cmluZ1tdO1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgdHlwZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZUZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gdXNlZCB0byBkaXNhYmxlIGNlcnRhaW4gZGF0ZXMgaW4gdGhlIGNhbGVuZGFyIGZvciB0aGUgcmFuZ2Ugc3RhcnQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb246IERpc2FibGVEYXRlRnVuY3Rpb248RD47XG5cbiAgICAvKipcbiAgICAgKiBGdW5jdGlvbiB1c2VkIHRvIGRpc2FibGUgY2VydGFpbiBkYXRlcyBpbiB0aGUgY2FsZW5kYXIgZm9yIHRoZSByYW5nZSBlbmQgc2VsZWN0aW9uLlxuICAgICAqIEBwYXJhbSBkYXRlIGRhdGUgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGRpc2FibGVSYW5nZUVuZEZ1bmN0aW9uOiBEaXNhYmxlRGF0ZUZ1bmN0aW9uPEQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBlUmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIGNoYW5nZURldFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoREFURV9USU1FX0ZPUk1BVFMpIHByaXZhdGUgX2RhdGVUaW1lRm9ybWF0czogRGF0ZVRpbWVGb3JtYXRzLFxuICAgICAgICBwdWJsaWMgX2RhdGVUaW1lQWRhcHRlcjogRGF0ZXRpbWVBZGFwdGVyPEQ+LFxuICAgICAgICBwcml2YXRlIF9jYWxlbmRhckkxOG5MYWJlbHM6IENhbGVuZGFySTE4bkxhYmVsc1xuICAgICkge31cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2lzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLl9zZXR1cEtleWJvYXJkU2VydmljZSgpO1xuXG4gICAgICAgIHRoaXMuX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk7XG5cbiAgICAgICAgdGhpcy5fYnVpbGREYXlWaWV3R3JpZCgpO1xuXG4gICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5sb2NhbGVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fcmVmcmVzaFNob3J0V2Vla0RheXMoKTtcbiAgICAgICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgLyoqIENoYW5nZXMgb2YgdGhvc2UgcHJvcGVydGllcyBhcmUgZG9uZSBpbnNpZGUgaXRzIHNldHRlcnMgKi9cbiAgICAgICAgaWYgKCFjaGFuZ2VzWydzZWxlY3RlZERhdGUnXSAmJiAhY2hhbmdlc1snc2VsZWN0ZWRSYW5nZURhdGUnXSAmJiAhY2hhbmdlc1snY3VycmVudGx5RGlzcGxheWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnVuY3Rpb24gZm9yIHNlbGVjdGluZyBhIGRhdGUgb24gdGhlIGNhbGVuZGFyLiBUeXBpY2FsbHkgY2FsbGVkIHdoZW4gYSBkYXRlIGlzIGNsaWNrZWQsIGJ1dCBjYW4gYWxzbyBiZSBjYWxsZWQgcHJvZ3JhbW1hdGljYWxseS5cbiAgICAgKiBAcGFyYW0gZGF5IENhbGVuZGFyRGF5IG9iamVjdCB0byBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBzZWxlY3REYXRlKGRheTogQ2FsZW5kYXJEYXk8RD4sIGV2ZW50PzogTW91c2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlcmUgYXJlIHNvbWUgcHJvYmxlbXMgd2l0aCBwb3B1cCBpbnRlZ3JhdGlvbi4gQWZ0ZXIgY2xpY2tpbmcgaW5zaWRlIGRheSBjb21wb25lbnQsIHRoZSBwb3BvdmVyIGNsb3Nlcy5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXkuZGlzYWJsZWQgJiYgIWRheS5ibG9ja2VkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5jYWxUeXBlID09PSAnc2luZ2xlJykge1xuICAgICAgICAgICAgICAgIC8qKiBSZW1vdmUgc2VsZWN0aW9ucyBmcm9tIG90aGVyIGRheSBhbmQgcHV0IHNlbGVjdGlvbiB0byBjaG9zZW4gZGF5ICovXG4gICAgICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJEYXlMaXN0LmZvckVhY2goKF9kYXkpID0+IChfZGF5LnNlbGVjdGVkID0gZmFsc2UpKTtcbiAgICAgICAgICAgICAgICBkYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkRGF0ZSA9IGRheS5kYXRlO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoZGF5LmRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMCB8fCB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0geyBzdGFydDogZGF5LmRhdGUsIGVuZDogbnVsbCB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGUgcGlja2VkIGlzIGhpZ2hlciB0aGFuIGFscmVhZHkgY2hvc2VuLCBvdGhlcndpc2UganVzdCByZXZlcnNlIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZSh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0ISwgZGF5LmRhdGUpIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBkYXkuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUmFuZ2VEYXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXkuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhbmdlRGF0ZUNoYW5nZS5lbWl0KHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyh0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSwgdGhpcy5fY2FsZW5kYXJEYXlMaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdyYW5nZScgJiYgdGhpcy5yYW5nZUhvdmVyRWZmZWN0ICYmIHRoaXMuX3NlbGVjdENvdW50ZXIgPT09IDEgJiYgZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lzT25SYW5nZVBpY2sgPSAhdGhpcy5faXNPblJhbmdlUGljaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2lzT25SYW5nZVBpY2sgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBmb2N1cyBvbiBkZWZhdWx0IGZvY3VzYWJsZSBjZWxsXG4gICAgICovXG4gICAgc2V0Rm9jdXNPbkNlbGwoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNlbGxUb0ZvY3VzID0gbmV3IENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5KCkuZ2V0QWN0aXZlQ2VsbCh0aGlzLl9jYWxlbmRhckRheUxpc3QpO1xuICAgICAgICBpZiAoIWNlbGxUb0ZvY3VzPy5pbmRleCAmJiBjZWxsVG9Gb2N1cz8uaW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZvY3VzT25DZWxsQnlJbmRleChjZWxsVG9Gb2N1cy5pbmRleCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfcmVmcmVzaEhvdmVyUmFuZ2UoZGF5OiBDYWxlbmRhckRheTxEPik6IHZvaWQge1xuICAgICAgICBjb25zdCBzdGFydCA9IHRoaXMuc2VsZWN0ZWRSYW5nZURhdGU/LnN0YXJ0O1xuICAgICAgICBpZiAodGhpcy5faXNPblJhbmdlUGljayAmJiBzdGFydCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jb21wYXJlRGF0ZShkYXkuZGF0ZSwgc3RhcnQpIDwgMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyRGF5TGlzdC5mb3JFYWNoKChfZGF5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIF9kYXkuaG92ZXJSYW5nZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoX2RheS5kYXRlLCBkYXkuZGF0ZSkgPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY29tcGFyZURhdGUoX2RheS5kYXRlLCBzdGFydCkgPCAwO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jYWxlbmRhckRheUxpc3QuZm9yRWFjaCgoX2RheSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBfZGF5LmhvdmVyUmFuZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgZGF5LmRhdGUpIDwgMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKF9kYXkuZGF0ZSwgc3RhcnQpID4gMDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiAgQW1vdW50IG9mIHNlbGVjdGVkIGRheXNcbiAgICAgKiAgMCwgd2hlbiB0aGVyZSBpcyBubyBkYXkgc2VsZWN0ZWQsIG9yIHN0YXJ0IGRhdGUgaXMgaW52YWxpZCxcbiAgICAgKiAgMSwgd2hlbiB0aGVyZSBpcyBvbmx5IHZhbGlkIHN0YXJ0IGRhdGUsIG9yIGVuZCBkYXRlIGlzIHNhbWUgYXMgc3RhcnQgZGF0ZSxcbiAgICAgKiAgMiwgd2hlbiBib3RoIGRhdGVzIGFyZSB2YWxpZFxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0Q291bnRlcigpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRSYW5nZURhdGUgfHwgIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0ICYmXG4gICAgICAgICAgICAoIXRoaXMuX2RhdGVUaW1lQWRhcHRlci5pc1ZhbGlkKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuc3RhcnQsIHRoaXMuc2VsZWN0ZWRSYW5nZURhdGUuZW5kKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNWYWxpZCh0aGlzLnNlbGVjdGVkUmFuZ2VEYXRlLnN0YXJ0KSAmJlxuICAgICAgICAgICAgdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmlzVmFsaWQodGhpcy5zZWxlY3RlZFJhbmdlRGF0ZS5lbmQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgc2hvcnQgd2Vla2RheSBuYW1lLlxuICAgICAqIENhbiBiZSBjaGFuZ2VkIGJ5IHVzZXIgYnkgcHJvdmlkaW5nIG90aGVyIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgRGF0ZXRpbWVBZGFwdGVyXG4gICAgICovXG4gICAgZ2V0IHNob3J0V2Vla0RheXMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvcnRXZWVrRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgcmV0dXJucyB3ZWVrZGF5IG5hbWUuXG4gICAgICogQ2FuIGJlIGNoYW5nZWQgYnkgdXNlciBieSBwcm92aWRpbmcgb3RoZXIgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyBEYXRldGltZUFkYXB0ZXJcbiAgICAgKi9cbiAgICBnZXQgbG9uZ1dlZWtEYXlzKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdXZWVrRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogRnVuY3Rpb24gdGhhdCBnaXZlcyBhcnJheSBvZiBhbGwgZGlzcGxheWVkIENhbGVuZGFyRGF5c1xuICAgICAqL1xuICAgIGdldCBfY2FsZW5kYXJEYXlMaXN0KCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF5Vmlld0dyaWQucmVkdWNlKCh0b3RhbENhbGVuZGFyUm93czogQ2FsZW5kYXJEYXk8RD5bXSwgY2FsZW5kYXJSb3c6IENhbGVuZGFyRGF5PEQ+W10pID0+IHtcbiAgICAgICAgICAgIGlmICghY2FsZW5kYXJSb3cpIHtcbiAgICAgICAgICAgICAgICBjYWxlbmRhclJvdyA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRvdGFsQ2FsZW5kYXJSb3dzLmNvbmNhdChjYWxlbmRhclJvdyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBUb2RheSBjZWxsIGxhYmVsLlxuICAgICAqIElzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBjZWxsIGRhdGUgaXRzZWxmXG4gICAgICovXG4gICAgZ2V0IF90b2RheUFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLnRvZGF5TGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFNlbGVjdGVkIGRhdGUgY2VsbCBsYWJlbC5cbiAgICAgKiBJcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggY2VsbCBkYXRlIGl0c2VsZlxuICAgICAqL1xuICAgIGdldCBfc2VsZWN0ZWREYXRlQXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckkxOG5MYWJlbHMuZGF0ZVNlbGVjdGVkTGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIGNvbHVtbiBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfd2Vla0NvbHVtbkxhYmVsQXJpYUxhYmVsKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckkxOG5MYWJlbHMud2Vla0NvbHVtbkxhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBSYW5nZSBzdGFydCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfcmFuZ2VTdGFydEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLnJhbmdlU3RhcnRMYWJlbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogUmFuZ2UgZW5kIGxhYmVsXG4gICAgICovXG4gICAgZ2V0IF9yYW5nZUVuZEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLnJhbmdlRW5kTGFiZWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgaW4gcGFzdCBsYWJlbFxuICAgICAqL1xuICAgIGdldCBfZGF0ZUluUGFzdEFyaWFMYWJlbCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsZW5kYXJJMThuTGFiZWxzLmRheUluUGFzdExhYmVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBWaWV3IGRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgZ2V0IF92aWV3Um9sZURlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhckkxOG5MYWJlbHMuY2FsZW5kYXJEYXlWaWV3RGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVmlldyBJRFxuICAgICAqL1xuICAgIGdldCB2aWV3SWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQgKyAnLWRheS12aWV3JztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogV2VlayBjb2x1bW4gaGVhZGVyIElEXG4gICAgICovXG4gICAgZ2V0IF93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctd2Vlay1jb2x1bW4taGVhZGVyJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogVG9kYXkgY2VsbCBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfdG9kYXlMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctdG9kYXktbGFiZWwnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBTZWxlY3RlZCBkYXRlIGxhYmVsIElEXG4gICAgICovXG4gICAgZ2V0IF9zZWxlY3RlZERhdGVMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctc2VsZWN0ZWQtZGF0ZS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgcmFuZ2Ugc3RhcnQgZGF0ZSBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfZGF0ZVJhbmdlU3RhcnRMYWJlbElkKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdJZCArICctcmFuZ2Utc3RhcnQtZGF0ZS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgcmFuZ2UgZW5kIGRhdGUgbGFiZWwgSURcbiAgICAgKi9cbiAgICBnZXQgX2RhdGVSYW5nZUVuZExhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1yYW5nZS1lbmQtZGF0ZS1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIERhdGUgaW4gcGFzdCBsYWJlbCBJRFxuICAgICAqL1xuICAgIGdldCBfZGF0ZUluUGFzdExhYmVsSWQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1kYXktaW4tcGFzdC1sYWJlbCc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGhhbmRsZXMgZGF5IGNlbGxzIGtleWRvd24gZXZlbnRzLFxuICAgICAqIEBwYXJhbSBldmVudCBLZXlib2FyZEV2ZW50XG4gICAgICogQHBhcmFtIGNlbGwgQ2FsZW5kYXJEYXlcbiAgICAgKiBAcGFyYW0gZ3JpZCB3aXRoIHNwZWNpZmllZCBjb2x1bW4gYW5kIHJvdyBhcyBhIHggYW5kIHlcbiAgICAgKi9cbiAgICBfb25LZXlkb3duRGF5SGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCwgY2VsbDogQ2FsZW5kYXJEYXk8RD4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uS2V5ZG93bkhhbmRsZXIoZXZlbnQsIGluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiAgTWV0aG9kIHRoYXQgYWxsb3cgdG8gZm9jdXMgZWxlbWVudHMgaW5zaWRlIHRoaXMgY29tcG9uZW50XG4gICAgICovXG4gICAgX2ZvY3VzRWxlbWVudEJ5U2VsZWN0b3IoZWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZWxlbWVudFRvRm9jdXM6IEhUTUxFbGVtZW50ID0gdGhpcy5lUmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50U2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudFRvRm9jdXM/LmZvY3VzKSB7XG4gICAgICAgICAgICBlbGVtZW50VG9Gb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIFN0YW5kYXJkaXplZCBtZXRob2QgdG8gY2FsY3VsYXRlIGdyaWQgW3hdW3ldIHRvIGluZGV4IG51bWJlciBvZiBmbGF0dGVuIGxpc3RcbiAgICAgKi9cbiAgICBfZ2V0SW5kZXgocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGVuZGFyU2VydmljZS5nZXRJZChyb3dJbmRleCwgY29sSW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCBzZWxlY3RzIHByZXZpb3VzIG1vbnRoXG4gICAgICogVHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgbW9udGggaXMgY2hhbmdlZCBkdXJpbmcgY2hhbmdpbmcgZm9jdXNcbiAgICAgKiBBbHNvIHRyaWdnZXJzIGV2ZW50IHRvIHBhcmVudCBjYWxlbmRhciBjb21wb25lbnQgYW5kIHJlYnVpbGRzIGRheSB2aWV3IGdyaWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB0aGlzLl9nZXRQcmV2aW91c01vbnRoKCk7XG4gICAgICAgIHRoaXMuX2J1aWxkRGF5Vmlld0dyaWQoKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c01vbnRoU2VsZWN0LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgc2VsZWN0cyBuZXh0IG1vbnRoXG4gICAgICogVHJpZ2dlcmVkIG9ubHkgd2hlbiB0aGUgbW9udGggaXMgY2hhbmdlZCBkdXJpbmcgY2hhbmdpbmcgZm9jdXNcbiAgICAgKiBBbHNvIHRyaWdnZXJzIGV2ZW50IHRvIHBhcmVudCBjYWxlbmRhciBjb21wb25lbnQgYW5kIHJlYnVpbGRzIGRheSB2aWV3IGdyaWRcbiAgICAgKi9cbiAgICBwcml2YXRlIF9zZWxlY3ROZXh0TW9udGgoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRseURpc3BsYXllZCA9IHRoaXMuX2dldE5leHRNb250aCgpO1xuICAgICAgICB0aGlzLl9idWlsZERheVZpZXdHcmlkKCk7XG4gICAgICAgIHRoaXMubmV4dE1vbnRoU2VsZWN0LmVtaXQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgY3JlYXRlcyBhcnJheSBvZiBDYWxlbmRhckRheSBtb2RlbHMgd2hpY2ggd2lsbCBiZSBzaG93biBvbiBkYXkgZ3JpZCxcbiAgICAgKiBkZXBlbmRpbmcgb24gY3VycmVudCBtb250aCBhbmQgeWVhci5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9wb3B1bGF0ZUNhbGVuZGFyKCk6IENhbGVuZGFyRGF5PEQ+W10ge1xuICAgICAgICBsZXQgY2FsZW5kYXI6IENhbGVuZGFyRGF5PEQ+W10gPSBbXTtcblxuICAgICAgICBjYWxlbmRhciA9IHRoaXMuX2dldFByZXZpb3VzTW9udGhEYXlzKGNhbGVuZGFyKTtcbiAgICAgICAgY2FsZW5kYXIgPSBjYWxlbmRhci5jb25jYXQodGhpcy5fZ2V0Q3VycmVudE1vbnRoRGF5cygpKTtcbiAgICAgICAgY2FsZW5kYXIgPSB0aGlzLl9nZXROZXh0TW9udGhEYXlzKGNhbGVuZGFyKTtcblxuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChjYWxsLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjYWxsLmlkID0gdGhpcy5fZ2V0Q2VsbElkQnlJbmRleChpbmRleCk7XG4gICAgICAgICAgICBjYWxsLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmNhbFR5cGUgPT09ICdzaW5nbGUnICYmIHRoaXMuX3NlbGVjdGVkRGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgX2RheSA9IGNhbGVuZGFyLmZpbmQoKGRheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoZGF5LmRhdGUsIHRoaXMuX3NlbGVjdGVkRGF0ZSkpO1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRTaW5nbGVEYXkoX2RheSwgY2FsZW5kYXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuY2FsVHlwZSA9PT0gJ3JhbmdlJyAmJiB0aGlzLl9zZWxlY3RlZFJhbmdlRGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlU2VsZWN0ZWRSYW5nZURheXModGhpcy5fc2VsZWN0ZWRSYW5nZURhdGUsIGNhbGVuZGFyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjYWxlbmRhcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHRoYXQgYnVpbGRzIDIgZGltZW5zaW9ucyBkYXkgdmlldyBncmlkLCBhbHNvIHNldHMgdXAgY3VycmVudGx5IGRpc3BsYXllZCBtb250aCwgb3IgeWVhcixcbiAgICAgKiB3aGVuIHRoZXJlIGlzIG5vdCBhbnkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfYnVpbGREYXlWaWV3R3JpZCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmN1cnJlbnRseURpc3BsYXllZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkID0ge1xuICAgICAgICAgICAgICAgICAgICBtb250aDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldE1vbnRoKHRoaXMuc2VsZWN0ZWREYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgeWVhcjogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldFllYXIodGhpcy5zZWxlY3RlZERhdGUpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG9kYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIudG9kYXkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TW9udGgodG9kYXkpLFxuICAgICAgICAgICAgICAgICAgICB5ZWFyOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0WWVhcih0b2RheSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsZW5kYXJEYXlzID0gdGhpcy5fcG9wdWxhdGVDYWxlbmRhcigpO1xuICAgICAgICBjb25zdCBkYXlWaWV3R3JpZDogQ2FsZW5kYXJEYXk8RD5bXVtdID0gW107XG5cbiAgICAgICAgd2hpbGUgKGNhbGVuZGFyRGF5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkYXlWaWV3R3JpZC5wdXNoKGNhbGVuZGFyRGF5cy5zcGxpY2UoMCwgdGhpcy5fYW1vdW50T2ZDb2xzKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5yb3dBbW91bnQgPSBkYXlWaWV3R3JpZC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5fZGF5Vmlld0dyaWQgPSBkYXlWaWV3R3JpZDtcbiAgICAgICAgdGhpcy5fd2Vla3MgPSB0aGlzLl9yZWZyZXNoV2Vla0NvdW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIEdldCBpZCBvZiBjYWxlbmRhcidzIGRheSBpdGVtXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0Q2VsbElkQnlJbmRleChpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld0lkICsgJy1kYXktJyArIGluZGV4ICsgJyc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB3aGljaCBwcm92aWRlcyBhcnJheSBvZiBDYWxlbmRhckRheSxcbiAgICAgKiB3aGljaCBjb250YWlucyBldmVyeSBzaW5nbGUgZGF5IG9mIGN1cnJlbnRseSBzaG93biBtb250aC95ZWFyLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldEN1cnJlbnRNb250aERheXMoKTogQ2FsZW5kYXJEYXk8RD5bXSB7XG4gICAgICAgIGNvbnN0IG1vbnRoID0gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGg7XG4gICAgICAgIGNvbnN0IHllYXIgPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyO1xuICAgICAgICBjb25zdCBjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10gPSBbXTtcbiAgICAgICAgY29uc3QgYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg6IG51bWJlciA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXROdW1EYXlzSW5Nb250aChcbiAgICAgICAgICAgIHRoaXMuX2RhdGVUaW1lQWRhcHRlci5jcmVhdGVEYXRlKHllYXIsIG1vbnRoLCAxKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0b2RheSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpO1xuICAgICAgICBmb3IgKGxldCBkYXlOdW1iZXIgPSAxOyBkYXlOdW1iZXIgPD0gYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg7IGRheU51bWJlcisrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIGRheU51bWJlcik7XG4gICAgICAgICAgICBjYWxlbmRhckRheXMucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLFxuICAgICAgICAgICAgICAgIG1vbnRoU3RhdHVzOiAnY3VycmVudCcsXG4gICAgICAgICAgICAgICAgY3VycmVudDogdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwodG9kYXksIGRhdGUpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5fZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXMpO1xuICAgICAgICBjZWxsICYmIChjZWxsLmlzVGFiSW5kZXhlZCA9IHRydWUpO1xuICAgICAgICByZXR1cm4gY2FsZW5kYXJEYXlzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdGhhdCByZXR1cm5zIGFjdGl2ZSBjZWxsLCB3aGljaCBtZWFuczpcbiAgICAgKiBpZiB0aGVyZSBpcyBhbnkgc2VsZWN0ZWQgZGF5LCByZXR1cm4gc2VsZWN0ZWQgZGF5XG4gICAgICogaWYgdGhlcmUgaXMgbm8gc2VsZWN0ZWQgZGF5LCBidXQgdGhlcmUgaXMgdG9kYXkgZGF5LCByZXR1cm4gdG9kYXkgZGF5XG4gICAgICogaWYgdGhlcmUgaXMgbm8gdG9kYXksIG9yIHNlbGVjdGVkLCByZXR1cm4gZmlyc3Qgb25lXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gbmV3IENhbGVuZGFyQWN0aXZlRGF5Q2VsbFN0cmF0ZWd5PEQ+KCkuZ2V0QWN0aXZlQ2VsbChjYWxlbmRhckRheXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2Qgd2hpY2ggcHJvdmlkZXMgYXJyYXkgb2YgQ2FsZW5kYXJEYXksXG4gICAgICogd2hpY2ggY29udGFpbnMgbGFzdCAwLTYgZGF5cyBvZiBwcmV2aW91cyBtb250aC95ZWFyLiBUaGVzZXMgZGF5c1xuICAgICAqIGZpbGxzIHRoZSBnYXAgYmV0d2VlbiBzdGFydGluZyBzdGFydGluZ0RheU9mV2VlayBhbmQgZmlyc3QgZGF5IG9mIGN1cnJlbnQgbW9udGhcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRQcmV2aW91c01vbnRoRGF5cyhjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA+IDEgPyB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCAtIDEgOiAxMjtcbiAgICAgICAgY29uc3QgeWVhciA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA+IDEgPyB0aGlzLmN1cnJlbnRseURpc3BsYXllZC55ZWFyIDogdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciAtIDE7XG4gICAgICAgIGNvbnN0IGFtb3VudE9mRGF5c0luQ3VycmVudE1vbnRoOiBudW1iZXIgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0TnVtRGF5c0luTW9udGgoXG4gICAgICAgICAgICB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgMSlcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcHJldk1vbnRoTGFzdERhdGUgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGgpO1xuICAgICAgICBjb25zdCBwcmV2TW9udGhMYXN0RGF5ID0gYW1vdW50T2ZEYXlzSW5DdXJyZW50TW9udGg7XG4gICAgICAgIGxldCBwcmV2TW9udGhMYXN0V2Vla0RheSA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWsocHJldk1vbnRoTGFzdERhdGUpIC0gdGhpcy5zdGFydGluZ0RheU9mV2VlaztcblxuICAgICAgICAvKiogQ2hlY2tpbmcgaWYgdGhlcmUgYXJlIHNvbWUgZGF5cyBjdXQgYnkgc3RhcnRpbmdEYXlPZldlZWsgb3B0aW9uXG4gICAgICAgICAqICBJZiB5ZXMsIHRoZXJlIGlzIHdob2xlIHdlZWsgYWRkZWQsIHRvIGF2b2lkIGhpZGluZ1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHByZXZNb250aExhc3RXZWVrRGF5IDwgMCkge1xuICAgICAgICAgICAgcHJldk1vbnRoTGFzdFdlZWtEYXkgPSBwcmV2TW9udGhMYXN0V2Vla0RheSArIDc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldk1vbnRoTGFzdFdlZWtEYXkgPCA2KSB7XG4gICAgICAgICAgICB3aGlsZSAocHJldk1vbnRoTGFzdFdlZWtEYXkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZNb250aERheSA9IHByZXZNb250aExhc3REYXkgLSBwcmV2TW9udGhMYXN0V2Vla0RheTtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIHByZXZNb250aERheSk7XG4gICAgICAgICAgICAgICAgY2FsZW5kYXJEYXlzLnB1c2goeyAuLi50aGlzLl9nZXREYXkoZGF0ZSksIG1vbnRoU3RhdHVzOiAncHJldmlvdXMnIH0pO1xuICAgICAgICAgICAgICAgIHByZXZNb250aExhc3RXZWVrRGF5LS07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhbGVuZGFyRGF5cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogTWV0aG9kIHdoaWNoIHByb3ZpZGVzIGFycmF5IG9mIENhbGVuZGFyRGF5LCB3aGljaCBjb250YWlucyBmaXJzdCBkYXlzIG9mIG5leHQgbW9udGgveWVhci4gVGhlc2VzIGRheXNcbiAgICAgKiBmaWxscyB0aGUgZ2FwIGJldHdlZW4gbGFzdCBkYXkgb2YgY3VycmVudCBkYXkgYW5kIGVuZCBvZiA2LXdlZWtzIGNhbGVuZGFyIGdyaWQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0TmV4dE1vbnRoRGF5cyhjYWxlbmRhckRheXM6IENhbGVuZGFyRGF5PEQ+W10pOiBDYWxlbmRhckRheTxEPltdIHtcbiAgICAgICAgY29uc3QgbW9udGggPSB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggKyAxIDogMTtcbiAgICAgICAgY29uc3QgeWVhciA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyID8gdGhpcy5jdXJyZW50bHlEaXNwbGF5ZWQueWVhciA6IHRoaXMuY3VycmVudGx5RGlzcGxheWVkLnllYXIgKyAxO1xuXG4gICAgICAgIC8vIFRoZSBjYWxlbmRhciBncmlkIGNhbiBoYXZlIDUgKDM1IGRheXMpIG9yIDYgKDQyIGRheXMpIHdlZWtzXG4gICAgICAgIGNvbnN0IG5leHRNb250aERpc3BsYXllZERheXMgPSAoNDIgLSBjYWxlbmRhckRheXMubGVuZ3RoKSAlIDc7XG5cbiAgICAgICAgZm9yIChsZXQgbmV4dEQgPSAxOyBuZXh0RCA8PSBuZXh0TW9udGhEaXNwbGF5ZWREYXlzOyBuZXh0RCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRlID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNyZWF0ZURhdGUoeWVhciwgbW9udGgsIG5leHREKTtcbiAgICAgICAgICAgIGNhbGVuZGFyRGF5cy5wdXNoKHsgLi4udGhpcy5fZ2V0RGF5KGRhdGUpLCBtb250aFN0YXR1czogJ25leHQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxlbmRhckRheXM7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc1dlZWtlbmREYXkoZGF5T2ZXZWVrOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGRheU9mV2VlayA9PT0gMSB8fCBkYXlPZldlZWsgPT09IDc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGdlbmVyYXRlcyB3aG9sZSBkYXkgbW9kZWwgYmFzaW5nIG9uIGRhdGUsIGRpc2FibGluZyBmdW5jdGlvbnMsIGJsb2NrIGZ1bmN0aW9ucywgYW5kIGFjdHVhbGx5XG4gICAgICogY2hvc2VuIHJhbmdlIC8gc2luZ2xlIGRhdGUuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZ2V0RGF5KGRhdGU6IEQpOiBDYWxlbmRhckRheTxEPiB7XG4gICAgICAgIGNvbnN0IHdlZWtEYXkgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0RGF5T2ZXZWVrKGRhdGUpO1xuICAgICAgICBjb25zdCBkYXlPZk1vbnRoID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERhdGUoZGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXRlTmFtZXMoKTtcbiAgICAgICAgY29uc3QgaXNQYXN0ID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmNvbXBhcmVEYXRlKGRhdGUsIHRoaXMuX2RhdGVUaW1lQWRhcHRlci50b2RheSgpKSA8IDA7XG4gICAgICAgIGNvbnN0IGRheTogQ2FsZW5kYXJEYXk8RD4gPSB7XG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICAgICAgbGFiZWw6IGRhdGVOYW1lc1tkYXlPZk1vbnRoIC0gMV0sXG4gICAgICAgICAgICB3ZWVrRGF5LFxuICAgICAgICAgICAgd2Vla2VuZDogdGhpcy5faXNXZWVrZW5kRGF5KHdlZWtEYXkpLFxuICAgICAgICAgICAgYXJpYUxhYmVsOiB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuX2RhdGVUaW1lRm9ybWF0cy5kaXNwbGF5LmRhdGVBMTF5TGFiZWwpLFxuICAgICAgICAgICAgc3BlY2lhbE51bWJlcjogdGhpcy5fZ2V0U3BlY2lhbERheShkYXRlKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICBwYXN0OiBpc1Bhc3RcbiAgICAgICAgfTtcblxuICAgICAgICAvKiogQXBwbHkgZGlzYWJsZWQgc3RhdGUgdG8gZGF5cyBtYXJrZWQgd2l0aCBwYXNzZWQgZnVuY3Rpb24gKi9cbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZUZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBkYXkuZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVGdW5jdGlvbihkYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IGlzIGNhbGxlZCB0byByZWZyZXNoIGkxOG4gc2hvcnQgd2VlayBkYXlzLlxuICAgICAqL1xuICAgIHByaXZhdGUgX3JlZnJlc2hTaG9ydFdlZWtEYXlzKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaG9ydERheU9mV2Vla05hbWVzID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldERheU9mV2Vla05hbWVzKCdzaG9ydCcpO1xuICAgICAgICBjb25zdCBkYXlPZldlZWtOYW1lcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXREYXlPZldlZWtOYW1lcygnbG9uZycpO1xuXG4gICAgICAgIHRoaXMuX3Nob3J0V2Vla0RheXMgPSBzaG9ydERheU9mV2Vla05hbWVzXG4gICAgICAgICAgICAuc2xpY2UodGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpXG4gICAgICAgICAgICAuY29uY2F0KHNob3J0RGF5T2ZXZWVrTmFtZXMuc2xpY2UoMCwgdGhpcy5zdGFydGluZ0RheU9mV2VlayAtIDEpKTtcblxuICAgICAgICB0aGlzLl9sb25nV2Vla0RheXMgPSBkYXlPZldlZWtOYW1lc1xuICAgICAgICAgICAgLnNsaWNlKHRoaXMuc3RhcnRpbmdEYXlPZldlZWsgLSAxKVxuICAgICAgICAgICAgLmNvbmNhdChkYXlPZldlZWtOYW1lcy5zbGljZSgwLCB0aGlzLnN0YXJ0aW5nRGF5T2ZXZWVrIC0gMSkpO1xuXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXRzIHNwZWNpYWwgZGF5IG51bWJlciBvZiBzcGVjaWZpZWQgZGF0ZSBtb2RlbFxuICAgICAqL1xuICAgIHByaXZhdGUgX2dldFNwZWNpYWxEYXkoZGF0ZTogRCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBjb25zdCBzcGVjaWFsRGF5ID0gdGhpcy5zcGVjaWFsRGF5c1J1bGVzLmZpbmQoKHNwZWNpYWxEYXlSdWxlKSA9PiBzcGVjaWFsRGF5UnVsZS5ydWxlKGRhdGUpKTtcbiAgICAgICAgaWYgKHNwZWNpYWxEYXkpIHtcbiAgICAgICAgICAgIHJldHVybiBzcGVjaWFsRGF5LnNwZWNpYWxEYXlOdW1iZXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIE1ldGhvZCB0aGF0IHJldHVybnMgYXJyYXkgb2Ygd2VlaydzIGNvdW50XG4gICAgICovXG4gICAgcHJpdmF0ZSBfcmVmcmVzaFdlZWtDb3VudCgpOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IGNhbGVuZGFyRGF5TGlzdCA9IHRoaXMuX2NhbGVuZGFyRGF5TGlzdDtcbiAgICAgICAgY29uc3Qgd2Vla051bWJlcnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gNjsgaW5kZXggPCBjYWxlbmRhckRheUxpc3QubGVuZ3RoOyBpbmRleCA9IGluZGV4ICsgNikge1xuICAgICAgICAgICAgd2Vla051bWJlcnMucHVzaCh0aGlzLl9kYXRlVGltZUFkYXB0ZXIuZ2V0V2Vla05hbWUoY2FsZW5kYXJEYXlMaXN0W2luZGV4XS5kYXRlKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdlZWtOdW1iZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBHZXQgeWVhciBhbmQgbW9udGggZm9yIHByZXZpb3VzIHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXRQcmV2aW91c01vbnRoKCk6IENhbGVuZGFyQ3VycmVudCB7XG4gICAgICAgIGlmICh0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQubW9udGggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciwgbW9udGg6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCAtIDEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHllYXI6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyIC0gMSwgbW9udGg6IDEyIH07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogR2V0IHllYXIgYW5kIG1vbnRoIGZvciBuZXh0IHllYXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9nZXROZXh0TW9udGgoKTogQ2FsZW5kYXJDdXJyZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCA8IDEyKSB7XG4gICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB0aGlzLl9jdXJyZW50bHlEaXNwbGF5ZWQueWVhciwgbW9udGg6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC5tb250aCArIDEgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7IHllYXI6IHRoaXMuX2N1cnJlbnRseURpc3BsYXllZC55ZWFyICsgMSwgbW9udGg6IDEgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBNZXRob2QgdG8gcHV0IGNvbmZpZ3VyYXRpb24gYW5kIGxpc3RlbmVycyBvbiBjYWxlbmRhciBrZXlib2FyZCBzZXJ2aWNlXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc2V0dXBLZXlib2FyZFNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLmNvbEFtb3VudCA9IHRoaXMuX2Ftb3VudE9mQ29scztcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5mb2N1c0VzY2FwZUZ1bmN0aW9uID0gdGhpcy5mb2N1c0VzY2FwZUZ1bmN0aW9uO1xuXG4gICAgICAgIHRoaXMuY2FsZW5kYXJTZXJ2aWNlLm9uRm9jdXNJZENoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbktleVNlbGVjdC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3REYXRlKHRoaXMuX2NhbGVuZGFyRGF5TGlzdFtpbmRleF0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNhbGVuZGFyU2VydmljZS5vbkxpc3RTdGFydEFwcHJvYWNoLnBpcGUodGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpKS5zdWJzY3JpYmUoKGluZGV4KSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zZWxlY3RQcmV2aW91c01vbnRoKCk7XG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIENhbGN1bGF0ZSBmb2N1c2VkIGNlbGwgaW4gbmV3IGdyaWRcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNb250aCA9IHRoaXMuX2dldE5leHRNb250aCgpOyAvLyBtb250aCB0aGF0IHdhcyBiZWZvcmUgbW92aW5nIGJhY2tcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQW1vdW50T2ZXZWVrcyA9IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5nZXRBbW91bnRPZldlZWtzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTW9udGgueWVhcixcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1vbnRoLm1vbnRoLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdEYXlPZldlZWtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBwcmV2TW9udGhBbW91bnRPZldlZWtzID0gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmdldEFtb3VudE9mV2Vla3MoXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLnllYXIsXG4gICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudGx5RGlzcGxheWVkLm1vbnRoLFxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRpbmdEYXlPZldlZWtcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIHJlbmRlcmluZyBmb3IgbmV3IGdyaWQgc28gZm9jdXMgY2FuIGJlIHNldFxuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXggLSA3ICogKG9yaWdpbmFsQW1vdW50T2ZXZWVrcyAtIHByZXZNb250aEFtb3VudE9mV2Vla3MpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxlbmRhclNlcnZpY2Uub25MaXN0RW5kQXBwcm9hY2gucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpLnN1YnNjcmliZSgoaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3NlbGVjdE5leHRNb250aCgpO1xuICAgICAgICAgICAgLy8gdHJpZ2dlciByZW5kZXJpbmcgZm9yIG5ldyBncmlkIHNvIGZvY3VzIGNhbiBiZSBzZXRcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbkNlbGxCeUluZGV4KGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqIENoYW5nZSBzZWxlY3Rpb24gZmxhZyBvbiBkYXlzIHRvIGZhbHNlLCBiZXNpZGVzIHRoZSBzZWxlY3RlZCBvbmVcbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VTZWxlY3RlZFNpbmdsZURheShkYXk6IENhbGVuZGFyRGF5PEQ+IHwgdW5kZWZpbmVkLCBjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5zZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICAgIGlmIChkYXkgJiYgIWRheS5ibG9ja2VkICYmICFkYXkuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGRheS5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWZyZXNoVGFiSW5kZXgoY2FsZW5kYXIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBDaGFuZ2UgcHJvcGVydGllcyBvZiByYW5nZSBkYXlzLCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHRvIG5vdCByZWJ1aWxkIHdob2xlIGdyaWQgZnJvbSBzY3JhdGNoLFxuICAgICAqIGl0IGp1c3QgY2hhbmdlcyBwcm9wZXJ0aWVzIG9mIG5ld2x5IHNlbGVjdGVkL3Vuc2VsZWN0ZWQgZGF5cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIF9jaGFuZ2VTZWxlY3RlZFJhbmdlRGF5cyhkYXRlczogRGF0ZVJhbmdlPEQ+LCBjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICAvKiogUHVsbCBsaXN0IG9mIGNhbGVuZGFyIGRheXMgKi9cbiAgICAgICAgY29uc3QgY2FsZW5kYXJMaXN0ID0gY2FsZW5kYXI7XG5cbiAgICAgICAgLyoqIFJlc2V0IGNoYW5naW5nIHByb3BlcnRpZXMgKi9cbiAgICAgICAgY2FsZW5kYXJMaXN0LmZvckVhY2goXG4gICAgICAgICAgICAoX2RheSkgPT5cbiAgICAgICAgICAgICAgICAoX2RheS5zZWxlY3RlZEZpcnN0ID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZExhc3QgPVxuICAgICAgICAgICAgICAgICAgICBfZGF5LnNlbGVjdGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5pc1RhYkluZGV4ZWQgPVxuICAgICAgICAgICAgICAgICAgICBfZGF5LmRpc2FibGVkID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5ob3ZlclJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgX2RheS5zZWxlY3RlZFJhbmdlID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKVxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChkYXRlcykge1xuICAgICAgICAgICAgbGV0IHN0YXJ0RGF5OiBDYWxlbmRhckRheTxEPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCBlbmREYXk6IENhbGVuZGFyRGF5PEQ+IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGRhdGVzLnN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgLyoqIEZpbmQgc3RhcnQgZGF0ZSBhbmQgbWFyayBpdCBhcyBzZWxlY3RlZCAqL1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gY2FsZW5kYXJMaXN0LmZpbmQoKF9kYXkpID0+IHRoaXMuX2RhdGVUaW1lQWRhcHRlci5kYXRlc0VxdWFsKF9kYXkuZGF0ZSwgZGF0ZXMuc3RhcnQpKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0RGF5ICYmXG4gICAgICAgICAgICAgICAgICAgICFzdGFydERheS5ibG9ja2VkICYmXG4gICAgICAgICAgICAgICAgICAgICFzdGFydERheS5kaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuZGlzYWJsZVJhbmdlU3RhcnRGdW5jdGlvbihzdGFydERheS5kYXRlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnREYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBzdGFydERheS5zZWxlY3RlZEZpcnN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGF0ZXMuZW5kKSB7XG4gICAgICAgICAgICAgICAgLyoqIEZpbmQgZW5kIGRhdGUgYW5kIG1hcmsgaXQgYXMgc2VsZWN0ZWQgKi9cbiAgICAgICAgICAgICAgICBlbmREYXkgPSBjYWxlbmRhckxpc3QuZmluZCgoX2RheSkgPT4gdGhpcy5fZGF0ZVRpbWVBZGFwdGVyLmRhdGVzRXF1YWwoX2RheS5kYXRlLCBkYXRlcy5lbmQpKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVuZERheSAmJlxuICAgICAgICAgICAgICAgICAgICAhZW5kRGF5LmJsb2NrZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIWVuZERheS5kaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24gIT09ICdmdW5jdGlvbicgfHwgIXRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24oZW5kRGF5LmRhdGUpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBlbmREYXkuc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBlbmREYXkuc2VsZWN0ZWRMYXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qKiBWZXJpZnkgaWYgc3RhcnQgZGF5IGFuZCBlbmQgZGF5IGlzIHZhbGlkLCBvdGhlcndpc2UgZG9uJ3QgcHV0IHJhbmdlIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgaWYgKGRhdGVzLnN0YXJ0ICYmIGRhdGVzLmVuZCkge1xuICAgICAgICAgICAgICAgIC8qKiBNYXJrIGFsbCBkYXlzLCB3aGljaCBhcmUgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGRhdGUgKi9cbiAgICAgICAgICAgICAgICBjYWxlbmRhckxpc3RcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIChfZGF5KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfZGF5LnNlbGVjdGVkUmFuZ2UgPSB0aGlzLl9kYXRlVGltZUFkYXB0ZXIuaXNCZXR3ZWVuKF9kYXkuZGF0ZSwgZGF0ZXMuc3RhcnQhLCBkYXRlcy5lbmQhKSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoX2RheSkgPT4gKF9kYXkuc2VsZWN0ZWRSYW5nZSA9IHRydWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaFRhYkluZGV4KGNhbGVuZGFyTGlzdCk7XG5cbiAgICAgICAgLyoqIEFwcGx5IGRpc2FibGVkIHN0YXRlIHRvIGRheXMgbWFya2VkIHdpdGggcGFzc2VkIGZ1bmN0aW9uICovXG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVGdW5jdGlvbikge1xuICAgICAgICAgICAgY2FsZW5kYXJMaXN0LmZvckVhY2goKF9kYXkpID0+IChfZGF5LmRpc2FibGVkID0gdGhpcy5kaXNhYmxlRnVuY3Rpb24hKF9kYXkuZGF0ZSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgodGhpcy5fc2VsZWN0Q291bnRlciA9PT0gMCB8fCB0aGlzLl9zZWxlY3RDb3VudGVyID09PSAyKSAmJiB0aGlzLmRpc2FibGVSYW5nZVN0YXJ0RnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKFxuICAgICAgICAgICAgICAgIChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IF9kYXkuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmFuZ2VTdGFydEZ1bmN0aW9uIShfZGF5LmRhdGUpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9zZWxlY3RDb3VudGVyID09PSAxICYmIHRoaXMuZGlzYWJsZVJhbmdlRW5kRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGNhbGVuZGFyTGlzdC5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5kaXNhYmxlZCA9IF9kYXkuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlUmFuZ2VFbmRGdW5jdGlvbiEoX2RheS5kYXRlKSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlZnJlc2hUYWJJbmRleChjYWxlbmRhcjogQ2FsZW5kYXJEYXk8RD5bXSk6IHZvaWQge1xuICAgICAgICBjYWxlbmRhci5mb3JFYWNoKChfZGF5KSA9PiAoX2RheS5pc1RhYkluZGV4ZWQgPSBmYWxzZSkpO1xuICAgICAgICBjb25zdCBjZWxsID0gdGhpcy5fZ2V0QWN0aXZlQ2VsbChjYWxlbmRhci5maWx0ZXIoKF9kYXkpID0+IF9kYXkubW9udGhTdGF0dXMgPT09ICdjdXJyZW50JykpO1xuICAgICAgICBjZWxsICYmIChjZWxsLmlzVGFiSW5kZXhlZCA9IHRydWUpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBmb2N1c09uQ2VsbEJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9mb2N1c0VsZW1lbnRCeVNlbGVjdG9yKGAjJHt0aGlzLl9nZXRDZWxsSWRCeUluZGV4KGluZGV4KX1gKTtcbiAgICB9XG59XG4iLCI8dGFibGUgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGFibGVcIiByb2xlPVwiZ3JpZFwiIFthdHRyLmFyaWEtcm9sZWRlc2NyaXB0aW9uXT1cIl92aWV3Um9sZURlc2NyaXB0aW9uXCI+XG4gICAgPHRoZWFkIGNsYXNzPVwiZmQtY2FsZW5kYXJfX2dyb3VwXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgIDx0ciBjbGFzcz1cImZkLWNhbGVuZGFyX19yb3dcIiByb2xlPVwicm93XCI+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dXZWVrTnVtYmVyc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBmZC1jYWxlbmRhcl9faXRlbS0tc2lkZS1oZWxwZXJcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJjb2x1bW5oZWFkZXJcIlxuICAgICAgICAgICAgICAgIFthdHRyLmlkXT1cIl93ZWVrTnVtYmVyc0NvbHVtbkhlYWRlcklkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIl93ZWVrQ29sdW1uTGFiZWxBcmlhTGFiZWxcIlxuICAgICAgICAgICAgPjwvdGg+XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImNvbHVtbmhlYWRlclwiXG4gICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiBzaG9ydFdlZWtEYXlzOyBpbmRleCBhcyBpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvbmdXZWVrRGF5c1tpXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgIDwvdHI+XG4gICAgPC90aGVhZD5cbiAgICA8dGJvZHkgY2xhc3M9XCJmZC1jYWxlbmRhcl9fZ3JvdXBcIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgPHRyIGNsYXNzPVwiZmQtY2FsZW5kYXJfX3Jvd1wiIHJvbGU9XCJyb3dcIiAqbmdGb3I9XCJsZXQgcm93IG9mIF9kYXlWaWV3R3JpZDsgbGV0IHJvd0luZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1dlZWtOdW1iZXJzXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGZkLWNhbGVuZGFyX19pdGVtLS1zaWRlLWhlbHBlclwiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd2hlYWRlclwiXG4gICAgICAgICAgICAgICAgc2NvcGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZmQtY2FsZW5kYXItd2Vla109XCJfd2Vla3Nbcm93SW5kZXhdXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJ2aWV3SWQgKyAnLXdlZWstJyArIF93ZWVrc1tyb3dJbmRleF1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJfd2Vla051bWJlcnNDb2x1bW5IZWFkZXJJZCArICcgJyArICh2aWV3SWQgKyAnLXdlZWstJyArIF93ZWVrc1tyb3dJbmRleF0pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cIl93ZWVrcyAmJiBfd2Vla3Nbcm93SW5kZXhdXCIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBfd2Vla3Nbcm93SW5kZXhdIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC90aD5cblxuICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbVwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY2VsbCBvZiByb3c7IGxldCBjZWxsSW5kZXggPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJjZWxsLnNlbGVjdGVkRmlyc3QgfHwgY2VsbC5zZWxlY3RlZExhc3QgfHwgY2VsbC5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1yYW5nZV09XCJcbiAgICAgICAgICAgICAgICAgICAgKGNlbGwuc2VsZWN0ZWRSYW5nZSB8fCBjZWxsLmhvdmVyUmFuZ2UpICYmICFjZWxsLnNlbGVjdGVkRmlyc3QgJiYgIWNlbGwuc2VsZWN0ZWRMYXN0XG4gICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLWN1cnJlbnRdPVwiY2VsbC5jdXJyZW50XCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRdPVwiY2VsbC53ZWVrZW5kICYmIG1hcmtXZWVrZW5kcyAmJiBjZWxsLm1vbnRoU3RhdHVzID09PSAnY3VycmVudCdcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5mZC1jYWxlbmRhcl9faXRlbS0tb3RoZXItbW9udGhdPVwiY2VsbC5tb250aFN0YXR1cyAhPT0gJ2N1cnJlbnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuaXMtZGlzYWJsZWRdPVwiY2VsbC5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImNlbGwuc3BlY2lhbE51bWJlciA/ICdmZC1jYWxlbmRhcl9fc3BlY2lhbC1kYXktLScgKyBjZWxsLnNwZWNpYWxOdW1iZXIgOiAnJ1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuaWRdPVwiY2VsbC5pZFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1mZC1jYWxlbmRhci1kYXldPVwiY2VsbC5pbmRleFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJjZWxsLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImNlbGwuZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cImNlbGwuaXNUYWJJbmRleGVkID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShjZWxsLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJfcmVmcmVzaEhvdmVyUmFuZ2UoY2VsbClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIl9vbktleWRvd25EYXlIYW5kbGVyKCRldmVudCwgY2VsbCwgX2dldEluZGV4KHJvd0luZGV4LCBjZWxsSW5kZXgpKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC1jYWxlbmRhcl9fdGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjZWxsLmlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICctYXJpYS1sYWJlbCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkRmlyc3QgPyBfZGF0ZVJhbmdlU3RhcnRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkTGFzdCA/IF9kYXRlUmFuZ2VFbmRMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLmN1cnJlbnQgPyBfdG9kYXlMYWJlbElkICsgJyAnIDogJycpICtcbiAgICAgICAgICAgICAgICAgICAgICAgIChjZWxsLnNlbGVjdGVkICYmIGNhbFR5cGUgPT09ICdzaW5nbGUnID8gX3NlbGVjdGVkRGF0ZUxhYmVsSWQgKyAnICcgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKGNlbGwucGFzdCA/IF9kYXRlSW5QYXN0TGFiZWxJZCA6ICcnKVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICA+e3sgY2VsbC5sYWJlbCB9fTwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8c3BhbiBoaWRkZW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgW2F0dHIuaWRdPVwiY2VsbC5pZCArICctYXJpYS1sYWJlbCdcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgY2VsbC5hcmlhTGFiZWwgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoIDw9IDVcIj5cbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZkLWNhbGVuZGFyX19pdGVtIGhpZGRlbi1kYXlcIj48L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICA8dHIgY2xhc3M9XCJmZC1jYWxlbmRhcl9fcm93XCIgKm5nSWY9XCJfZGF5Vmlld0dyaWQubGVuZ3RoID09PSA0XCI+XG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJmZC1jYWxlbmRhcl9faXRlbSBoaWRkZW4tZGF5XCI+PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cblxuPCEtLSBIaWRkZW4gZWxlbWVudHMgZm9yIGFyaWEgcHVycG9zZXMgLS0+XG48ZGl2IGhpZGRlbiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl90b2RheUxhYmVsSWRcIj57eyBfdG9kYXlBcmlhTGFiZWwgfX08L2Rpdj5cbiAgICA8ZGl2IFthdHRyLmlkXT1cIl9zZWxlY3RlZERhdGVMYWJlbElkXCI+e3sgX3NlbGVjdGVkRGF0ZUFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVSYW5nZVN0YXJ0TGFiZWxJZFwiPnt7IF9yYW5nZVN0YXJ0QXJpYUxhYmVsIH19PC9kaXY+XG4gICAgPGRpdiBbYXR0ci5pZF09XCJfZGF0ZVJhbmdlRW5kTGFiZWxJZFwiPnt7IF9yYW5nZUVuZEFyaWFMYWJlbCB9fTwvZGl2PlxuICAgIDxkaXYgW2F0dHIuaWRdPVwiX2RhdGVJblBhc3RMYWJlbElkXCI+e3sgX2RhdGVJblBhc3RBcmlhTGFiZWwgfX08L2Rpdj5cbjwvZGl2PlxuIl19