@entake/particle 18.0.5 → 19.0.1

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 (207) hide show
  1. package/LICENSE +7 -7
  2. package/app/{modules → shared/components}/accordion/accordion.component.d.ts +3 -3
  3. package/app/{modules/date-picker → shared}/components/calendar/calendar.component.d.ts +7 -12
  4. package/app/{modules → shared/components}/checkbox/checkbox.component.d.ts +5 -7
  5. package/app/{modules → shared/components}/color-picker/color-picker.component.d.ts +3 -9
  6. package/app/{modules → shared/components}/date-picker/date-picker.component.d.ts +20 -26
  7. package/app/{modules/date-picker → shared}/components/date-range-picker/date-range-picker.component.d.ts +10 -11
  8. package/app/{modules → shared/components}/dialog/dialog.component.d.ts +16 -24
  9. package/app/{modules → shared/components}/dropdown/dropdown.component.d.ts +12 -14
  10. package/app/{modules/icons/components → shared/components/icon-select}/icon-select.component.d.ts +14 -17
  11. package/app/{modules → shared/components}/idle-timeout/idle-timeout.component.d.ts +3 -4
  12. package/app/{modules → shared/components}/input-mask/input-mask.component.d.ts +6 -7
  13. package/app/shared/components/layout-full-framing/layout-full-framing.component.d.ts +27 -0
  14. package/app/shared/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +23 -0
  15. package/app/{modules/loader/components → shared/components/loader}/loader.component.d.ts +2 -2
  16. package/app/{modules → shared/components}/multi-select/multi-select.component.d.ts +18 -24
  17. package/app/{modules → shared/components}/notification/notification.component.d.ts +5 -13
  18. package/app/{modules → shared/components}/paginator/paginator.component.d.ts +12 -11
  19. package/app/{modules → shared/components}/popover/popover.component.d.ts +10 -15
  20. package/app/{modules → shared/components}/profile-pic/profile-pic.component.d.ts +1 -1
  21. package/app/shared/components/progress-bar/progress-bar.component.d.ts +15 -0
  22. package/app/{modules → shared/components}/rich-text/rich-text.component.d.ts +11 -12
  23. package/app/shared/components/scroll-to-top/scroll-to-top.component.d.ts +18 -0
  24. package/app/shared/components/slideover/slideover.component.d.ts +35 -0
  25. package/app/{modules → shared/components}/slider/slider.component.d.ts +8 -22
  26. package/app/{modules → shared/components}/toggle-switch/toggle-switch.component.d.ts +4 -6
  27. package/app/{modules → shared/components}/week-picker/week-picker.component.d.ts +21 -22
  28. package/app/{modules/accordion → shared}/directives/accordion-content.directive.d.ts +1 -2
  29. package/app/{modules/accordion → shared}/directives/accordion-header.directive.d.ts +1 -2
  30. package/app/{modules/accordion → shared}/directives/accordion-item.directive.d.ts +1 -1
  31. package/app/{modules/background-carousel → shared/directives}/background-carousel.directive.d.ts +4 -4
  32. package/app/{modules/keyfilter → shared/directives}/keyfilter.directive.d.ts +1 -7
  33. package/app/{modules/tooltip → shared/directives}/tooltip.directive.d.ts +3 -9
  34. package/app/shared/models/carousel-options.model.d.ts +21 -0
  35. package/app/shared/models/pagination-event.model.d.ts +8 -0
  36. package/app/shared/models/particle-component-text.model.d.ts +2 -24
  37. package/app/{modules/icons → shared}/models/particle-icons-solid.model.d.ts +6 -6
  38. package/app/shared/modules/icons/particle-icons.module.d.ts +7 -0
  39. package/app/{modules/ordinal-number-pipe → shared/pipes}/ordinal-number.pipe.d.ts +1 -1
  40. package/app/shared/services/base-data.service.d.ts +2 -2
  41. package/app/shared/services/dialog.service.d.ts +1 -1
  42. package/app/{modules/notification → shared}/services/notification.service.d.ts +0 -4
  43. package/app/{modules/theming → shared}/services/theming.service.d.ts +0 -19
  44. package/fesm2022/entake-particle.mjs +4026 -5721
  45. package/fesm2022/entake-particle.mjs.map +1 -1
  46. package/package.json +16 -25
  47. package/public_api.d.ts +47 -82
  48. package/app/modules/accordion/accordion.module.d.ts +0 -11
  49. package/app/modules/background-carousel/carousel-options.model.d.ts +0 -30
  50. package/app/modules/background-carousel/particle-background-carousel.module.d.ts +0 -8
  51. package/app/modules/checkbox/checkbox.module.d.ts +0 -9
  52. package/app/modules/color-picker/color-picker.module.d.ts +0 -9
  53. package/app/modules/date-picker/date-picker.module.d.ts +0 -15
  54. package/app/modules/dialog/dialog.module.d.ts +0 -9
  55. package/app/modules/dropdown/dropdown.module.d.ts +0 -9
  56. package/app/modules/endpoint-state/components/endpoint-state.component.d.ts +0 -46
  57. package/app/modules/endpoint-state/endpoint-state.module.d.ts +0 -8
  58. package/app/modules/icons/particle-icons.module.d.ts +0 -13
  59. package/app/modules/idle-timeout/particle-idle-timeout.module.d.ts +0 -9
  60. package/app/modules/input-mask/input-mask.module.d.ts +0 -8
  61. package/app/modules/keyfilter/keyfilter.module.d.ts +0 -8
  62. package/app/modules/layout/components/layout-full-framing/layout-full-framing.component.d.ts +0 -27
  63. package/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.d.ts +0 -23
  64. package/app/modules/layout/layout.module.d.ts +0 -10
  65. package/app/modules/loader/loader.module.d.ts +0 -8
  66. package/app/modules/multi-select/multi-select.module.d.ts +0 -8
  67. package/app/modules/notification/notification.module.d.ts +0 -8
  68. package/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.d.ts +0 -8
  69. package/app/modules/paginator/pagination-event.model.d.ts +0 -24
  70. package/app/modules/paginator/particle-paginator.module.d.ts +0 -13
  71. package/app/modules/popover/popover.module.d.ts +0 -9
  72. package/app/modules/profile-pic/particle-profile-pic.module.d.ts +0 -9
  73. package/app/modules/progress-bar/progress-bar.component.d.ts +0 -16
  74. package/app/modules/progress-bar/progress-bar.module.d.ts +0 -8
  75. package/app/modules/push-container/particle-push-container.module.d.ts +0 -9
  76. package/app/modules/push-container/push-container-state.model.d.ts +0 -7
  77. package/app/modules/push-container/push-container.component.d.ts +0 -137
  78. package/app/modules/rich-text/particle-rich-text.module.d.ts +0 -15
  79. package/app/modules/rich-text/render-rich-text.component.d.ts +0 -6
  80. package/app/modules/scroll-to-top/particle-scroll-to-top.module.d.ts +0 -8
  81. package/app/modules/scroll-to-top/scroll-to-top.component.d.ts +0 -19
  82. package/app/modules/slideover/particle-slideover.module.d.ts +0 -8
  83. package/app/modules/slideover/slideover.component.d.ts +0 -35
  84. package/app/modules/slider/slider.module.d.ts +0 -9
  85. package/app/modules/theming/components/theming.component.d.ts +0 -43
  86. package/app/modules/theming/theming.module.d.ts +0 -12
  87. package/app/modules/toggle-switch/toggle-switch.module.d.ts +0 -8
  88. package/app/modules/tooltip/tooltip.module.d.ts +0 -8
  89. package/app/modules/week-picker/week-picker.module.d.ts +0 -13
  90. package/app/shared/enums/endpoint-status.enum.d.ts +0 -9
  91. package/esm2022/app/modules/accordion/accordion.component.mjs +0 -101
  92. package/esm2022/app/modules/accordion/accordion.module.mjs +0 -37
  93. package/esm2022/app/modules/accordion/directives/accordion-content.directive.mjs +0 -17
  94. package/esm2022/app/modules/accordion/directives/accordion-header.directive.mjs +0 -17
  95. package/esm2022/app/modules/accordion/directives/accordion-item.directive.mjs +0 -36
  96. package/esm2022/app/modules/background-carousel/background-carousel.directive.mjs +0 -91
  97. package/esm2022/app/modules/background-carousel/carousel-options.model.mjs +0 -36
  98. package/esm2022/app/modules/background-carousel/particle-background-carousel.module.mjs +0 -24
  99. package/esm2022/app/modules/checkbox/checkbox.component.mjs +0 -108
  100. package/esm2022/app/modules/checkbox/checkbox.module.mjs +0 -28
  101. package/esm2022/app/modules/color-picker/color-picker.component.mjs +0 -306
  102. package/esm2022/app/modules/color-picker/color-picker.module.mjs +0 -19
  103. package/esm2022/app/modules/date-picker/components/calendar/calendar.component.mjs +0 -496
  104. package/esm2022/app/modules/date-picker/components/date-range-picker/date-range-picker.component.mjs +0 -250
  105. package/esm2022/app/modules/date-picker/date-picker.component.mjs +0 -538
  106. package/esm2022/app/modules/date-picker/date-picker.module.mjs +0 -56
  107. package/esm2022/app/modules/dialog/dialog.component.mjs +0 -177
  108. package/esm2022/app/modules/dialog/dialog.module.mjs +0 -28
  109. package/esm2022/app/modules/dropdown/dropdown.component.mjs +0 -682
  110. package/esm2022/app/modules/dropdown/dropdown.module.mjs +0 -28
  111. package/esm2022/app/modules/dropdown/models/dropdown-option-group.model.mjs +0 -2
  112. package/esm2022/app/modules/dropdown/models/dropdown-option.model.mjs +0 -2
  113. package/esm2022/app/modules/endpoint-state/components/endpoint-state.component.mjs +0 -75
  114. package/esm2022/app/modules/endpoint-state/endpoint-state.module.mjs +0 -22
  115. package/esm2022/app/modules/icons/components/icon-select.component.mjs +0 -376
  116. package/esm2022/app/modules/icons/models/fontawesome-icons-brands.model.mjs +0 -471
  117. package/esm2022/app/modules/icons/models/fontawesome-icons-regular.model.mjs +0 -166
  118. package/esm2022/app/modules/icons/models/fontawesome-icons-solid.model.mjs +0 -1016
  119. package/esm2022/app/modules/icons/models/particle-icons-brands.model.mjs +0 -24
  120. package/esm2022/app/modules/icons/models/particle-icons-regular.model.mjs +0 -50
  121. package/esm2022/app/modules/icons/models/particle-icons-solid.model.mjs +0 -89
  122. package/esm2022/app/modules/icons/particle-icons.module.mjs +0 -66
  123. package/esm2022/app/modules/icons/services/icons.service.mjs +0 -82
  124. package/esm2022/app/modules/idle-timeout/idle-timeout.component.mjs +0 -85
  125. package/esm2022/app/modules/idle-timeout/idle-timer.mjs +0 -66
  126. package/esm2022/app/modules/idle-timeout/particle-idle-timeout.module.mjs +0 -28
  127. package/esm2022/app/modules/input-mask/input-mask.component.mjs +0 -594
  128. package/esm2022/app/modules/input-mask/input-mask.module.mjs +0 -18
  129. package/esm2022/app/modules/keyfilter/keyfilter.directive.mjs +0 -174
  130. package/esm2022/app/modules/keyfilter/keyfilter.module.mjs +0 -18
  131. package/esm2022/app/modules/layout/components/layout-full-framing/layout-full-framing.component.mjs +0 -81
  132. package/esm2022/app/modules/layout/components/layout-fullwidth-sidebar/layout-fullwidth-sidebar.component.mjs +0 -67
  133. package/esm2022/app/modules/layout/layout.module.mjs +0 -33
  134. package/esm2022/app/modules/loader/components/loader.component.mjs +0 -30
  135. package/esm2022/app/modules/loader/loader.module.mjs +0 -24
  136. package/esm2022/app/modules/multi-select/models/multi-select-option-group.model.mjs +0 -2
  137. package/esm2022/app/modules/multi-select/models/multi-select-option.model.mjs +0 -2
  138. package/esm2022/app/modules/multi-select/multi-select.component.mjs +0 -665
  139. package/esm2022/app/modules/multi-select/multi-select.module.mjs +0 -18
  140. package/esm2022/app/modules/notification/models/notification.model.mjs +0 -2
  141. package/esm2022/app/modules/notification/notification.component.mjs +0 -122
  142. package/esm2022/app/modules/notification/notification.module.mjs +0 -18
  143. package/esm2022/app/modules/notification/services/notification.service.mjs +0 -84
  144. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number-pipe.module.mjs +0 -20
  145. package/esm2022/app/modules/ordinal-number-pipe/ordinal-number.pipe.mjs +0 -49
  146. package/esm2022/app/modules/paginator/pagination-event.model.mjs +0 -29
  147. package/esm2022/app/modules/paginator/paginator.component.mjs +0 -207
  148. package/esm2022/app/modules/paginator/particle-paginator.module.mjs +0 -48
  149. package/esm2022/app/modules/popover/popover.component.mjs +0 -352
  150. package/esm2022/app/modules/popover/popover.module.mjs +0 -24
  151. package/esm2022/app/modules/profile-pic/particle-profile-pic.module.mjs +0 -28
  152. package/esm2022/app/modules/profile-pic/profile-pic.component.mjs +0 -75
  153. package/esm2022/app/modules/progress-bar/progress-bar.component.mjs +0 -43
  154. package/esm2022/app/modules/progress-bar/progress-bar.module.mjs +0 -24
  155. package/esm2022/app/modules/push-container/particle-push-container.module.mjs +0 -26
  156. package/esm2022/app/modules/push-container/push-container-state.model.mjs +0 -2
  157. package/esm2022/app/modules/push-container/push-container.component.mjs +0 -363
  158. package/esm2022/app/modules/rich-text/particle-rich-text.module.mjs +0 -64
  159. package/esm2022/app/modules/rich-text/render-rich-text.component.mjs +0 -18
  160. package/esm2022/app/modules/rich-text/rich-text-capabilities.model.mjs +0 -2
  161. package/esm2022/app/modules/rich-text/rich-text.component.mjs +0 -209
  162. package/esm2022/app/modules/scroll-to-top/particle-scroll-to-top.module.mjs +0 -24
  163. package/esm2022/app/modules/scroll-to-top/scroll-to-top.component.mjs +0 -49
  164. package/esm2022/app/modules/slideover/particle-slideover.module.mjs +0 -24
  165. package/esm2022/app/modules/slideover/slideover.component.mjs +0 -115
  166. package/esm2022/app/modules/slider/slider.component.mjs +0 -243
  167. package/esm2022/app/modules/slider/slider.module.mjs +0 -26
  168. package/esm2022/app/modules/theming/components/theming.component.mjs +0 -86
  169. package/esm2022/app/modules/theming/models/theme.model.mjs +0 -9
  170. package/esm2022/app/modules/theming/services/theme-change-detection.service.mjs +0 -38
  171. package/esm2022/app/modules/theming/services/theming.service.mjs +0 -510
  172. package/esm2022/app/modules/theming/theming.module.mjs +0 -55
  173. package/esm2022/app/modules/toggle-switch/models/toggle-options.model.mjs +0 -2
  174. package/esm2022/app/modules/toggle-switch/toggle-switch.component.mjs +0 -107
  175. package/esm2022/app/modules/toggle-switch/toggle-switch.module.mjs +0 -24
  176. package/esm2022/app/modules/tooltip/tooltip.directive.mjs +0 -381
  177. package/esm2022/app/modules/tooltip/tooltip.module.mjs +0 -18
  178. package/esm2022/app/modules/week-picker/week-picker.component.mjs +0 -511
  179. package/esm2022/app/modules/week-picker/week-picker.module.mjs +0 -40
  180. package/esm2022/app/shared/enums/endpoint-status.enum.mjs +0 -11
  181. package/esm2022/app/shared/interceptors/json.interceptor.mjs +0 -23
  182. package/esm2022/app/shared/models/auditable.model.mjs +0 -2
  183. package/esm2022/app/shared/models/data-list.model.mjs +0 -2
  184. package/esm2022/app/shared/models/id.model.mjs +0 -2
  185. package/esm2022/app/shared/models/observable-container.mjs +0 -15
  186. package/esm2022/app/shared/models/particle-component-text.model.mjs +0 -2
  187. package/esm2022/app/shared/services/base-data.service.mjs +0 -190
  188. package/esm2022/app/shared/services/dialog.service.mjs +0 -50
  189. package/esm2022/app/shared/services/local-storage.service.mjs +0 -60
  190. package/esm2022/entake-particle.mjs +0 -5
  191. package/esm2022/public_api.mjs +0 -98
  192. /package/app/{modules/dropdown → shared}/models/dropdown-option-group.model.d.ts +0 -0
  193. /package/app/{modules/dropdown → shared}/models/dropdown-option.model.d.ts +0 -0
  194. /package/app/{modules/icons → shared}/models/fontawesome-icons-brands.model.d.ts +0 -0
  195. /package/app/{modules/icons → shared}/models/fontawesome-icons-regular.model.d.ts +0 -0
  196. /package/app/{modules/icons → shared}/models/fontawesome-icons-solid.model.d.ts +0 -0
  197. /package/app/{modules/multi-select → shared}/models/multi-select-option-group.model.d.ts +0 -0
  198. /package/app/{modules/multi-select → shared}/models/multi-select-option.model.d.ts +0 -0
  199. /package/app/{modules/notification → shared}/models/notification.model.d.ts +0 -0
  200. /package/app/{modules/icons → shared}/models/particle-icons-brands.model.d.ts +0 -0
  201. /package/app/{modules/icons → shared}/models/particle-icons-regular.model.d.ts +0 -0
  202. /package/app/{modules/rich-text → shared/models}/rich-text-capabilities.model.d.ts +0 -0
  203. /package/app/{modules/theming → shared}/models/theme.model.d.ts +0 -0
  204. /package/app/{modules/toggle-switch → shared}/models/toggle-options.model.d.ts +0 -0
  205. /package/app/{modules/icons → shared}/services/icons.service.d.ts +0 -0
  206. /package/app/{modules/idle-timeout → shared/services}/idle-timer.d.ts +0 -0
  207. /package/app/{modules/theming → shared}/services/theme-change-detection.service.d.ts +0 -0
@@ -1,511 +0,0 @@
1
- import { Component, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { add, endOfDay, endOfMonth, endOfWeek, getWeek, isEqual, isWithinInterval, setWeek, startOfWeek, sub } from 'date-fns';
4
- import { BehaviorSubject, combineLatest, map, shareReplay, withLatestFrom, } from 'rxjs';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- import * as i2 from "@angular/forms";
8
- import * as i3 from "../popover/popover.component";
9
- import * as i4 from "../tooltip/tooltip.directive";
10
- /**
11
- * Component to allow a user to select a week
12
- */
13
- export class WeekPickerComponent {
14
- changeDetectorRef;
15
- /**
16
- * Set the value of the week picker
17
- * @param value the value to set
18
- */
19
- set value(value) {
20
- if (value?.start && value?.end) {
21
- const startWeek = getWeek(value.start);
22
- const endWeek = getWeek(value.end);
23
- if (startWeek !== endWeek) {
24
- throw new Error('Start and end must be part of the same week of the year');
25
- }
26
- else if (value.start.getDay() !== 0 || value.end.getDay() !== 6) {
27
- throw new Error('Start must be the beginning of its week and end must be the end of its week');
28
- }
29
- this._internalValue.next(value);
30
- }
31
- else {
32
- this._internalValue.next(null);
33
- this._selectedMonth.next(this.currentDate.month);
34
- this._selectedYear.next(this.currentDate.year);
35
- }
36
- this._value = value;
37
- }
38
- /**
39
- * Set disabled
40
- */
41
- set disabled(disabled) {
42
- this._disabled = disabled;
43
- }
44
- /**
45
- * Set the valid date boundary for the week picker
46
- * @param dateRange
47
- */
48
- set dateRange(dateRange) {
49
- this.setSelectionInterval(dateRange);
50
- this.setCurrentDateSelectable();
51
- }
52
- /**
53
- * Class list to apply to the date range input
54
- */
55
- inputClassList = null;
56
- /**
57
- * Class list to apply to the week picker button
58
- */
59
- calendarButtonClassList = '';
60
- /**
61
- * The aria label to apply to the date range input
62
- */
63
- ariaLabel = 'Date';
64
- /**
65
- * Format for the selected date range in the selection preview. Must
66
- * be a valid Angular DatePipe format
67
- */
68
- dateFormat = 'MM/dd/y';
69
- /**
70
- * Close the picker when a selection is made
71
- */
72
- closeOnSelect = true;
73
- text = {
74
- openCalendar: 'open calendar to select week',
75
- selectWeek: 'Select a week',
76
- selectYear: 'Select a year',
77
- selectMonth: 'Select a month',
78
- january: 'January',
79
- february: 'February',
80
- march: 'March',
81
- april: 'April',
82
- may: 'May',
83
- june: 'June',
84
- july: 'July',
85
- august: 'August',
86
- september: 'September',
87
- october: 'October',
88
- november: 'November',
89
- december: 'December',
90
- sundayAbbr: 'Su',
91
- mondayAbbr: 'Mo',
92
- tuesdayAbbr: 'Tu',
93
- wednesdayAbbr: 'We',
94
- thursdayAbbr: 'Th',
95
- fridayAbbr: 'Fr',
96
- saturdayAbbr: 'Sa',
97
- selectLastWeek: 'Select last week',
98
- lastWeek: 'Last Week',
99
- resetWeekSelection: 'Reset week selection to current week',
100
- selectNextWeek: 'Select next week',
101
- nextWeek: 'Next Week'
102
- };
103
- /**
104
- * Event emitted on week select
105
- */
106
- weekSelected = new EventEmitter();
107
- /**
108
- * ViewChild of the calendar popover
109
- */
110
- calendarPopover = null;
111
- /**
112
- * The current date
113
- */
114
- currentDate;
115
- /**
116
- * BehaviorSubject tracking the value of the week picker
117
- */
118
- _internalValue = new BehaviorSubject(null);
119
- /**
120
- * BehaviorSubject tracking the selectable date range
121
- */
122
- _validSelectionInterval = new BehaviorSubject(null);
123
- /**
124
- * BehaviorSubject tracking the currently selected month
125
- */
126
- _selectedMonth = new BehaviorSubject(0);
127
- /**
128
- * BehaviorSubject tracking the currently selected year
129
- */
130
- _selectedYear = new BehaviorSubject(1970);
131
- /**
132
- * The selected week of the year of the start of the selection as an Observable
133
- */
134
- selectedWeek$ = this._internalValue.pipe(map(value => {
135
- return !value?.start ? 0 : getWeek(value.start);
136
- }), shareReplay());
137
- /**
138
- * The year of the start of the selected week as an Observable
139
- */
140
- selectedYear$ = this._internalValue.pipe(map(value => {
141
- return !value?.start ? 0 : value.start.getFullYear();
142
- }), shareReplay());
143
- /**
144
- * Observable boolean representing if next week (relative to the current selection) is selectable
145
- */
146
- canSelectNextWeek$ = this.selectedWeek$.pipe(withLatestFrom(this._validSelectionInterval, this._selectedYear), map(([selectedWeek, selectionInterval, selectedYear]) => {
147
- let canSelect = false;
148
- if (selectedWeek > 0 && selectionInterval) {
149
- const selectedYearStart = new Date(selectedYear, 0, 1);
150
- const weekDate = setWeek(selectedYearStart, selectedWeek);
151
- const nextWeekDate = add(weekDate, { weeks: 1 });
152
- const nextWeekStartDate = startOfWeek(nextWeekDate);
153
- const nextWeekEndDate = endOfWeek(nextWeekDate);
154
- canSelect = isWithinInterval(nextWeekStartDate, selectionInterval) &&
155
- isWithinInterval(nextWeekEndDate, selectionInterval);
156
- }
157
- return canSelect;
158
- }));
159
- /**
160
- * Observable boolean representing if last week (relative to the current selection) is selectable
161
- */
162
- canSelectLastWeek$ = this.selectedWeek$.pipe(withLatestFrom(this._validSelectionInterval, this._selectedYear), map(([selectedWeek, selectionInterval, selectedYear]) => {
163
- let canSelect = false;
164
- if (selectedWeek > 0 && selectionInterval) {
165
- const selectedYearStart = new Date(selectedYear, 0, 1);
166
- const weekDate = setWeek(selectedYearStart, selectedWeek);
167
- const lastWeekDate = sub(weekDate, { weeks: 1 });
168
- const lastWeekStartDate = startOfWeek(lastWeekDate);
169
- const lastWeekEndDate = endOfWeek(lastWeekDate);
170
- canSelect = isWithinInterval(lastWeekStartDate, selectionInterval) &&
171
- isWithinInterval(lastWeekEndDate, selectionInterval);
172
- }
173
- return canSelect;
174
- }));
175
- /**
176
- * The range of selectable years as an Observable
177
- */
178
- validYearRange$ = this._validSelectionInterval.pipe(map(selectionInterval => WeekPickerComponent.generateYearRange(selectionInterval?.start?.getFullYear() ?? null, selectionInterval?.end?.getFullYear() ?? null, this.currentDate.year)));
179
- /**
180
- * An array of MetaWeeks representing a month as an Observable
181
- */
182
- fullMonth$ = combineLatest([
183
- this._selectedMonth,
184
- this._selectedYear,
185
- this._validSelectionInterval
186
- ]).pipe(map(([month, year, selectionInterval]) => {
187
- let fullMonth = null;
188
- if (selectionInterval) {
189
- fullMonth = WeekPickerComponent.generateMonth(month, year, {
190
- start: selectionInterval.start,
191
- end: selectionInterval.end
192
- });
193
- }
194
- return fullMonth;
195
- }));
196
- /**
197
- * The value of the week picker
198
- * @private
199
- */
200
- _value = null;
201
- /**
202
- * Whether the control is disabled
203
- * @private
204
- */
205
- _disabled = false;
206
- /**
207
- * Generate an Array of numbers representing the span of years between the input
208
- * @param minYear the start of the range
209
- * @param maxYear the end of the range
210
- * @param currentYear the current year
211
- */
212
- static generateYearRange(minYear, maxYear, currentYear) {
213
- let start, end;
214
- if (!minYear && maxYear) {
215
- start = maxYear = 50;
216
- end = maxYear;
217
- }
218
- else if (minYear && !maxYear) {
219
- start = minYear;
220
- end = minYear + 50;
221
- }
222
- else if (minYear && maxYear) {
223
- start = minYear;
224
- end = maxYear;
225
- }
226
- else {
227
- start = currentYear - 100;
228
- end = currentYear + 50;
229
- }
230
- const range = [];
231
- for (let i = start; i <= end; i++) {
232
- range.push(i);
233
- }
234
- return range;
235
- }
236
- /**
237
- * Generate a month with week and selectable status metadata
238
- * @param month the month to generate
239
- * @param year the year of the month to generate
240
- * @param selectionInterval the interval representing the
241
- * minimum to the maximum week of the year
242
- * @private
243
- */
244
- static generateMonth(month, year, selectionInterval) {
245
- const metaMonth = [];
246
- const startOfMonth = new Date(year, month, 1);
247
- const monthInterval = { start: startOfMonth, end: endOfMonth(startOfMonth) };
248
- let scrollDate = sub(startOfMonth, { days: startOfMonth.getDay() });
249
- for (let i = 0; i < 6; i++) {
250
- const sundayOfWeek = sub(scrollDate, { days: scrollDate.getDay() });
251
- const saturdayOfWeek = add(scrollDate, { days: 6 - scrollDate.getDay() });
252
- metaMonth.push({
253
- week: getWeek(scrollDate),
254
- year: sundayOfWeek.getFullYear(),
255
- selectable: (isWithinInterval(sundayOfWeek, monthInterval) ||
256
- isWithinInterval(saturdayOfWeek, monthInterval)) &&
257
- isWithinInterval(sundayOfWeek, selectionInterval) &&
258
- isWithinInterval(saturdayOfWeek, selectionInterval),
259
- dates: []
260
- });
261
- for (let j = 0; j < 7; j++) {
262
- metaMonth[i].dates.push(scrollDate.getDate());
263
- scrollDate = add(scrollDate, { days: 1 });
264
- }
265
- }
266
- return metaMonth;
267
- }
268
- /**
269
- * Get the input date as a MetaDate
270
- * @param date the date to transform
271
- * @param selectable whether or not the date is selectable
272
- * @private
273
- */
274
- static getMetaDate(date, selectable = false) {
275
- return {
276
- day: date.getDay(),
277
- date: date.getDate(),
278
- week: getWeek(date),
279
- month: date.getMonth(),
280
- year: date.getFullYear(),
281
- selectable: selectable
282
- };
283
- }
284
- /**
285
- * Function to call on change
286
- */
287
- onChange = () => { };
288
- /**
289
- * Function to call on touch
290
- */
291
- onTouched = () => { };
292
- /**
293
- * Dependency injection site
294
- * @param changeDetectorRef the Angular ChangeDetectorRef
295
- */
296
- constructor(changeDetectorRef) {
297
- this.changeDetectorRef = changeDetectorRef;
298
- this.currentDate = WeekPickerComponent.getMetaDate(new Date(), false);
299
- }
300
- /**
301
- * Get the value of the week picker
302
- */
303
- get value() {
304
- return this._value;
305
- }
306
- /**
307
- * Get whether the control is disabled
308
- */
309
- get disabled() {
310
- return this._disabled;
311
- }
312
- /**
313
- * Write value
314
- * @param value the value to write
315
- */
316
- writeValue(value) {
317
- this.value = value;
318
- this.changeDetectorRef.markForCheck();
319
- }
320
- /**
321
- * Register function on change
322
- * @param fn the function to change
323
- */
324
- registerOnChange(fn) {
325
- this.onChange = fn;
326
- }
327
- /**
328
- * Register function on touch
329
- * @param fn the function to register
330
- */
331
- registerOnTouched(fn) {
332
- this.onTouched = fn;
333
- }
334
- /**
335
- * Set disabled state
336
- * @param isDisabled whether or not the control is disabled
337
- */
338
- setDisabledState(isDisabled) {
339
- this.disabled = isDisabled;
340
- this.changeDetectorRef.markForCheck();
341
- }
342
- /**
343
- * Open the week picker popover
344
- * @param event the event to pass to the popover
345
- */
346
- openCalendar(event) {
347
- if (!this.disabled) {
348
- const selectionInterval = this._validSelectionInterval.getValue();
349
- if (!selectionInterval) {
350
- this.setSelectionInterval(null);
351
- }
352
- this.setCurrentDateSelectable();
353
- if (!this.value) {
354
- this._selectedMonth.next(this.currentDate.month);
355
- this._selectedYear.next(this.currentDate.year);
356
- }
357
- else {
358
- this._internalValue.next(this.value);
359
- this._selectedMonth.next(this.value.start.getMonth());
360
- this._selectedYear.next(this.value.start.getFullYear());
361
- }
362
- this.calendarPopover.toggle(event);
363
- }
364
- }
365
- /**
366
- * Handle week select
367
- * @param week the week of the year
368
- * @param selectable whether or not the week is selectable
369
- */
370
- onWeekSelect(week, selectable) {
371
- const selectedYear = this._selectedYear.getValue();
372
- if (selectable) {
373
- const weekDate = setWeek(new Date(selectedYear, 0, 1), week);
374
- const weekStart = startOfWeek(weekDate);
375
- const weekEnd = endOfDay(endOfWeek(weekDate));
376
- const selectedWeek = { start: weekStart, end: weekEnd };
377
- this.updateModel(selectedWeek);
378
- if (this.closeOnSelect) {
379
- setTimeout(() => this.calendarPopover.close(), 200);
380
- }
381
- }
382
- }
383
- /**
384
- * Select next week (relative to the week of the current selection)
385
- */
386
- selectNextWeek() {
387
- const nextWeekDate = add(this.value.start, { weeks: 1 });
388
- const nextWeekStart = startOfWeek(nextWeekDate);
389
- const nextWeekEnd = endOfDay(endOfWeek(nextWeekDate));
390
- const currentMonth = this.value.start.getMonth();
391
- const selectedWeek = { start: nextWeekStart, end: nextWeekEnd };
392
- this.updateModel(selectedWeek);
393
- if (nextWeekStart.getMonth() !== currentMonth) {
394
- this._selectedMonth.next(nextWeekStart.getMonth());
395
- this._selectedYear.next(nextWeekStart.getFullYear());
396
- }
397
- }
398
- /**
399
- * Select last week (relative to the week of the current selection)
400
- */
401
- selectLastWeek() {
402
- const lastWeekDate = sub(this.value.start, { weeks: 1 });
403
- const lastWeekStart = startOfWeek(lastWeekDate);
404
- const lastWeekEnd = endOfDay(endOfWeek(lastWeekDate));
405
- const currentMonth = this.value.end.getMonth();
406
- const selectedWeek = { start: lastWeekStart, end: lastWeekEnd };
407
- this.updateModel(selectedWeek);
408
- if (lastWeekEnd.getMonth() !== currentMonth) {
409
- this._selectedMonth.next(lastWeekStart.getMonth());
410
- this._selectedYear.next(lastWeekStart.getFullYear());
411
- }
412
- }
413
- /**
414
- * Select the current week
415
- */
416
- selectCurrentWeek() {
417
- const thisWeekDate = new Date(this.currentDate.year, this.currentDate.month, this.currentDate.date);
418
- const thisWeekStart = startOfWeek(thisWeekDate);
419
- const thisWeekEnd = endOfDay(endOfWeek(thisWeekDate));
420
- this.updateModel({ start: thisWeekStart, end: thisWeekEnd });
421
- this._selectedMonth.next(this.currentDate.month);
422
- this._selectedYear.next(this.currentDate.year);
423
- }
424
- /**
425
- * Update model
426
- * @param value the new value of the model
427
- * @private
428
- */
429
- updateModel(value) {
430
- const valueBeforeUpdate = this.value;
431
- if (!this.disabled) {
432
- this.value = value;
433
- if (!isEqual(valueBeforeUpdate.start, this.value.start) &&
434
- !isEqual(valueBeforeUpdate.end, this.value.end)) {
435
- this.onChange(this.value);
436
- this.weekSelected.emit(this.value);
437
- }
438
- }
439
- }
440
- /**
441
- * Set the selection interval
442
- * @param interval the input selection interval
443
- * @private
444
- */
445
- setSelectionInterval(interval) {
446
- if (!interval) {
447
- throw new Error('Start date must be less than end date');
448
- }
449
- if (interval?.start > interval?.end) {
450
- throw new Error('Start date must be less than end date');
451
- }
452
- this._validSelectionInterval.next({
453
- start: interval?.start ?? new Date(this.currentDate.year - 100, 0, 1),
454
- end: interval?.end ?? new Date(this.currentDate.year + 50, 11, 31)
455
- });
456
- }
457
- /**
458
- * Set the selectable status of the current date
459
- * @private
460
- */
461
- setCurrentDateSelectable() {
462
- const today = new Date();
463
- const selectionInterval = this._validSelectionInterval.getValue();
464
- const startOfCurrentWeek = sub(today, { days: this.currentDate.day });
465
- const endOfCurrentWeek = add(today, { days: 6 - this.currentDate.day });
466
- this.currentDate.selectable = isWithinInterval(startOfCurrentWeek, selectionInterval) &&
467
- isWithinInterval(endOfCurrentWeek, selectionInterval);
468
- }
469
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: WeekPickerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
470
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: WeekPickerComponent, selector: "particle-week-picker", inputs: { value: "value", disabled: "disabled", dateRange: "dateRange", inputClassList: "inputClassList", calendarButtonClassList: "calendarButtonClassList", ariaLabel: "ariaLabel", dateFormat: "dateFormat", closeOnSelect: "closeOnSelect", text: "text" }, outputs: { weekSelected: "weekSelected" }, providers: [
471
- {
472
- provide: NG_VALUE_ACCESSOR,
473
- useExisting: forwardRef(() => WeekPickerComponent),
474
- multi: true
475
- }
476
- ], viewQueries: [{ propertyName: "calendarPopover", first: true, predicate: ["calendarPopover"], descendants: true }], ngImport: i0, template: "<div style=\"cursor:default;overflow: hidden;\"\r\n [ngClass]=\"inputClassList ? '' : 'row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir'\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'clear'\"\r\n type=\"button\"\r\n class=\"access btnset width100 height100 center_center\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 ptl_input_text_size ptl_input_padding v_center\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ent_r2l_txt\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"calendarButtonClassList ? calendarButtonClassList : 'bg_overlay ptl_brdr_color'\">\r\n <div class=\"width100 height100 center_center\">\r\n <i class=\"fas fa-calendar-week ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n\r\n<!-- week picker input\r\n<div class=\"wwp_container\" style=\"cursor:default;\"\r\n [ngClass]=\"inputClassList\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n class=\"access content_color wwp_input\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"wwp_placeholder\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </button>\r\n <div class=\"wwp_button\" [ngClass]=\"calendarButtonClassList\">\r\n <i class=\"fas fa-calendar-week\"></i>\r\n </div>\r\n</div>\r\n-->\r\n<!-- TODO: instead of offset 1, attach to wwp_container -->\r\n<!-- calendar widget -->\r\n<particle-popover [offset]=\"1\" #calendarPopover>\r\n <!-- month / year select -->\r\n <div class=\"wwp_options\">\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"wwp_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <ng-container *ngIf=\"fullMonth$ | async as fullMonth\">\r\n <ng-container *ngFor=\"let week of fullMonth\">\r\n <div class=\"wwp_week\"\r\n [ngClass]=\"{ 'currentWeek': week.week === currentDate.week && week.year === currentDate.year }\">\r\n <button (click)=\"onWeekSelect(week.week, week.selectable)\"\r\n [disabled]=\"!week.selectable\"\r\n [ngClass]=\"((selectedWeek$ | async) === week.week) && ((selectedYear$ | async) === week.year)\r\n ? 'ok_button_color'\r\n : 'bg_overlay_rev brdr hov_bg'\"\r\n class=\"access wwp_week_btn\">\r\n <ng-container *ngFor=\"let date of week.dates\">\r\n <div class=\"wwp_day\">\r\n {{date}}\r\n </div>\r\n </ng-container>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <button *ngIf=\"canSelectLastWeek$ | async else disabledLastWeekButton\"\r\n (click)=\"selectLastWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n <ng-template #disabledLastWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n </ng-template>\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"((selectedWeek$ | async) === currentDate.week) && ((selectedYear$ | async) === currentDate.year) else selectCurrentWeekButton\"\r\n disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n <ng-template #selectCurrentWeekButton>\r\n <button (click)=\"selectCurrentWeek()\"\r\n particleTooltip=\"Reset to Current Week\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button\r\n *ngIf=\"canSelectNextWeek$ | async else disabledNextWeekButton\"\r\n (click)=\"selectNextWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n <ng-template #disabledNextWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-popover>\r\n", styles: [":host{width:100%}.wwp_container{width:100%;min-width:150px;position:relative}.wwp_container:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.wwp_input{position:absolute;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.wwp_input:not([disabled]){cursor:pointer}.wwp_input::-ms-expand{display:none}.wwp_button{position:absolute;height:calc(100% + 2px);width:2.25em;top:0;right:0;z-index:var(--z-frame);border-top-left-radius:0!important;border-bottom-left-radius:0!important;font-size:inherit;margin:-1px;-webkit-user-select:none;user-select:none;pointer-events:none;display:flex;align-items:center;justify-content:center}.wwp_button>svg{transition:all .2s ease}.wwp_container:hover .wwp_button>svg{transform:scale(1.2)}.wwp_placeholder{opacity:.5;display:inline}.wwp_options{border-radius:3px;line-height:1.5;overflow:hidden;font-weight:400;z-index:var(--z-overlay);width:300px;background:#fff0;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.wwp_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.wwp_week.currentWeek{border-radius:3px;background-color:#8080801a}.wwp_week_btn{display:flex;align-items:center;width:100%;border:none;padding:0;cursor:pointer}.wwp_week_btn:disabled{cursor:default}.wwp_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.PopoverComponent, selector: "particle-popover", inputs: ["offset", "width", "height", "classList", "targetOverride", "openDirection", "alignment", "scaleForMobile"], outputs: ["opened", "closed"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[particleTooltip]", inputs: ["particleTooltip", "tooltipPosition", "tooltipDisabled"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
477
- }
478
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: WeekPickerComponent, decorators: [{
479
- type: Component,
480
- args: [{ selector: 'particle-week-picker', providers: [
481
- {
482
- provide: NG_VALUE_ACCESSOR,
483
- useExisting: forwardRef(() => WeekPickerComponent),
484
- multi: true
485
- }
486
- ], template: "<div style=\"cursor:default;overflow: hidden;\"\r\n [ngClass]=\"inputClassList ? '' : 'row ptl_input ptl_input_height ptl_input_bg_color ptl_brdr_color ptl_brdr_size ptl_brdr_radius ent_r2l_dir'\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n [ngClass]=\"inputClassList ? inputClassList : 'clear'\"\r\n type=\"button\"\r\n class=\"access btnset width100 height100 center_center\"\r\n style=\"outline-offset: -2px;\"\r\n >\r\n <div class=\"col size_1 height100 width100 ptl_input_text_size ptl_input_padding v_center\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"ent_r2l_txt\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </div>\r\n <div class=\"col min_w50 height100 center_center border_left\"\r\n [ngClass]=\"calendarButtonClassList ? calendarButtonClassList : 'bg_overlay ptl_brdr_color'\">\r\n <div class=\"width100 height100 center_center\">\r\n <i class=\"fas fa-calendar-week ptl_input_text_size\"></i>\r\n </div>\r\n </div>\r\n </button>\r\n</div>\r\n\r\n\r\n<!-- week picker input\r\n<div class=\"wwp_container\" style=\"cursor:default;\"\r\n [ngClass]=\"inputClassList\"\r\n [style.filter]=\"disabled ? 'brightness(.95)' : ''\">\r\n\r\n <button (click)=\"openCalendar($event)\"\r\n aria-haspopup=\"dialog\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"ariaLabel + ', ' + text.openCalendar\"\r\n [attr.aria-expanded]=\"calendarPopover.visible\"\r\n class=\"access content_color wwp_input\">\r\n <ng-container *ngIf=\"_internalValue | async as internalValue else placeholderTemplate\">\r\n {{internalValue.start | date: dateFormat}} - {{internalValue.end | date: dateFormat}}\r\n </ng-container>\r\n <ng-template #placeholderTemplate>\r\n <div class=\"wwp_placeholder\">{{text.selectWeek}}...</div>\r\n </ng-template>\r\n </button>\r\n <div class=\"wwp_button\" [ngClass]=\"calendarButtonClassList\">\r\n <i class=\"fas fa-calendar-week\"></i>\r\n </div>\r\n</div>\r\n-->\r\n<!-- TODO: instead of offset 1, attach to wwp_container -->\r\n<!-- calendar widget -->\r\n<particle-popover [offset]=\"1\" #calendarPopover>\r\n <!-- month / year select -->\r\n <div class=\"wwp_options\">\r\n <div class=\"content_color pad_5 pad_bot0\">\r\n <div class=\"row space_between\">\r\n <div class=\"col size_1 mar_5\">\r\n <select #yearSelect\r\n [ngModel]=\"_selectedYear | async\"\r\n [attr.data-dialog-close-override]=\"true\"\r\n (change)=\"_selectedYear.next(+yearSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectYear\">\r\n <option *ngFor=\"let year of validYearRange$ | async\"\r\n [value]=\"year\">\r\n {{year}}\r\n </option>\r\n </select>\r\n </div>\r\n <div class=\"col size_2 mar_5\">\r\n <select #monthSelect\r\n [ngModel]=\"_selectedMonth | async\"\r\n (change)=\"_selectedMonth.next(+monthSelect.value)\"\r\n class=\"access input sm content_color\"\r\n [attr.aria-label]=\"text.selectMonth\">\r\n <option value=\"0\">{{text.january}}</option>\r\n <option value=\"1\">{{text.february}}</option>\r\n <option value=\"2\">{{text.march}}</option>\r\n <option value=\"3\">{{text.april}}</option>\r\n <option value=\"4\">{{text.may}}</option>\r\n <option value=\"5\">{{text.june}}</option>\r\n <option value=\"6\">{{text.july}}</option>\r\n <option value=\"7\">{{text.august}}</option>\r\n <option value=\"8\">{{text.september}}</option>\r\n <option value=\"9\">{{text.october}}</option>\r\n <option value=\"10\">{{text.november}}</option>\r\n <option value=\"11\">{{text.december}}</option>\r\n </select>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content_color pad_5\">\r\n <!-- weekdays -->\r\n <div class=\"mar_5 mar_bot10\">\r\n <div class=\"row wrap space_between ptl_input_bg_color ptl_brdr_color border_bottom brad_3 mar_bot5\">\r\n <div class=\"wwp_weekday\">{{text.sundayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.mondayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.tuesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.wednesdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.thursdayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.fridayAbbr}}</div>\r\n <div class=\"wwp_weekday\">{{text.saturdayAbbr}}</div>\r\n </div>\r\n <!-- days -->\r\n <ng-container *ngIf=\"fullMonth$ | async as fullMonth\">\r\n <ng-container *ngFor=\"let week of fullMonth\">\r\n <div class=\"wwp_week\"\r\n [ngClass]=\"{ 'currentWeek': week.week === currentDate.week && week.year === currentDate.year }\">\r\n <button (click)=\"onWeekSelect(week.week, week.selectable)\"\r\n [disabled]=\"!week.selectable\"\r\n [ngClass]=\"((selectedWeek$ | async) === week.week) && ((selectedYear$ | async) === week.year)\r\n ? 'ok_button_color'\r\n : 'bg_overlay_rev brdr hov_bg'\"\r\n class=\"access wwp_week_btn\">\r\n <ng-container *ngFor=\"let date of week.dates\">\r\n <div class=\"wwp_day\">\r\n {{date}}\r\n </div>\r\n </ng-container>\r\n </button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"bg_overlay brdr hr mar_5\"></div>\r\n <div class=\"row space_between\">\r\n <button *ngIf=\"canSelectLastWeek$ | async else disabledLastWeekButton\"\r\n (click)=\"selectLastWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n <ng-template #disabledLastWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectLastWeek\">\r\n <i class=\"fas fa-chevron-left mar_right5\"></i><span class=\"text bold\">{{text.lastWeek}}</span>\r\n </button>\r\n </ng-template>\r\n <ng-container *ngIf=\"currentDate.selectable\">\r\n <button *ngIf=\"((selectedWeek$ | async) === currentDate.week) && ((selectedYear$ | async) === currentDate.year) else selectCurrentWeekButton\"\r\n disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n <ng-template #selectCurrentWeekButton>\r\n <button (click)=\"selectCurrentWeek()\"\r\n particleTooltip=\"Reset to Current Week\"\r\n class=\"access btn sm bg_overlay_rev brdr hov_bg mar_5\"\r\n [attr.aria-label]=\"text.resetWeekSelection\">\r\n <i class=\"fas fa-undo-alt\"></i>\r\n </button>\r\n </ng-template>\r\n </ng-container>\r\n <button\r\n *ngIf=\"canSelectNextWeek$ | async else disabledNextWeekButton\"\r\n (click)=\"selectNextWeek()\"\r\n class=\"access btn sm bg_overlay_rev brdr mar_5 hov_bg\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n <ng-template #disabledNextWeekButton>\r\n <button disabled\r\n class=\"access btn sm mar_5\"\r\n [attr.aria-label]=\"text.selectNextWeek\">\r\n <span class=\"text bold\">{{text.nextWeek}}</span><i class=\"fas fa-chevron-right mar_left5\"></i>\r\n </button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</particle-popover>\r\n", styles: [":host{width:100%}.wwp_container{width:100%;min-width:150px;position:relative}.wwp_container:after{content:\"mm/dd/yyyy\";opacity:0;pointer-events:none}.wwp_input{position:absolute;inset:0;padding:inherit;padding-right:2.25em;width:100%;-moz-appearance:none;-webkit-appearance:none;appearance:none;font-size:inherit;outline:none;border:none;text-align:left;-webkit-user-select:none;user-select:none;background-color:transparent;color:inherit;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.wwp_input:not([disabled]){cursor:pointer}.wwp_input::-ms-expand{display:none}.wwp_button{position:absolute;height:calc(100% + 2px);width:2.25em;top:0;right:0;z-index:var(--z-frame);border-top-left-radius:0!important;border-bottom-left-radius:0!important;font-size:inherit;margin:-1px;-webkit-user-select:none;user-select:none;pointer-events:none;display:flex;align-items:center;justify-content:center}.wwp_button>svg{transition:all .2s ease}.wwp_container:hover .wwp_button>svg{transform:scale(1.2)}.wwp_placeholder{opacity:.5;display:inline}.wwp_options{border-radius:3px;line-height:1.5;overflow:hidden;font-weight:400;z-index:var(--z-overlay);width:300px;background:#fff0;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.wwp_weekday{font-size:12px;font-weight:900;min-width:30px;height:32px;display:flex;flex:1;align-items:center;justify-content:center;opacity:.8;-webkit-user-select:none;user-select:none}.wwp_week.currentWeek{border-radius:3px;background-color:#8080801a}.wwp_week_btn{display:flex;align-items:center;width:100%;border:none;padding:0;cursor:pointer}.wwp_week_btn:disabled{cursor:default}.wwp_day{font-size:12px;font-weight:400;min-width:14%;height:32px;display:flex;flex:1;border-radius:3px;-webkit-user-select:none;user-select:none;background-color:transparent;align-items:center;justify-content:center}\n"] }]
487
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { value: [{
488
- type: Input
489
- }], disabled: [{
490
- type: Input
491
- }], dateRange: [{
492
- type: Input
493
- }], inputClassList: [{
494
- type: Input
495
- }], calendarButtonClassList: [{
496
- type: Input
497
- }], ariaLabel: [{
498
- type: Input
499
- }], dateFormat: [{
500
- type: Input
501
- }], closeOnSelect: [{
502
- type: Input
503
- }], text: [{
504
- type: Input
505
- }], weekSelected: [{
506
- type: Output
507
- }], calendarPopover: [{
508
- type: ViewChild,
509
- args: ['calendarPopover']
510
- }] } });
511
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vlay1waWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9tb2R1bGVzL3dlZWstcGlja2VyL3dlZWstcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvbW9kdWxlcy93ZWVrLXBpY2tlci93ZWVrLXBpY2tlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLFVBQVUsRUFDVixTQUFTLEVBQ1QsT0FBTyxFQUNQLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLFdBQVcsRUFDWCxHQUFHLEVBQ0osTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUFFLGVBQWUsRUFBYyxhQUFhLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxjQUFjLEdBQUksTUFBTSxNQUFNLENBQUM7Ozs7OztBQW1FdEc7O0dBRUc7QUFhSCxNQUFNLE9BQU8sbUJBQW1CO0lBd1dWO0lBdFdwQjs7O09BR0c7SUFDSCxJQUNJLEtBQUssQ0FBQyxLQUFpQztRQUN6QyxJQUFJLEtBQUssRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUVuQyxJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtB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TixZQUFZO3NCQURYLE1BQU07Z0JBT1AsZUFBZTtzQkFEZCxTQUFTO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBmb3J3YXJkUmVmLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBWaWV3Q2hpbGRcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIGFkZCxcclxuICBlbmRPZkRheSxcclxuICBlbmRPZk1vbnRoLFxyXG4gIGVuZE9mV2VlayxcclxuICBnZXRXZWVrLFxyXG4gIGlzRXF1YWwsXHJcbiAgaXNXaXRoaW5JbnRlcnZhbCxcclxuICBzZXRXZWVrLFxyXG4gIHN0YXJ0T2ZXZWVrLFxyXG4gIHN1YlxyXG59IGZyb20gJ2RhdGUtZm5zJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBjb21iaW5lTGF0ZXN0LCBtYXAsIHNoYXJlUmVwbGF5LCB3aXRoTGF0ZXN0RnJvbSwgIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFBvcG92ZXJDb21wb25lbnQgfSBmcm9tICcuLi9wb3BvdmVyL3BvcG92ZXIuY29tcG9uZW50JztcclxuaW1wb3J0IHtXZWVrUGlja2VyVGV4dH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9wYXJ0aWNsZS1jb21wb25lbnQtdGV4dC5tb2RlbCc7XHJcblxyXG4vKipcclxuICogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhIERhdGUgYnJva2VuIGRvd24gYnkgZGF5L2RhdGUvd2Vlay9tb250aC95ZWFyXHJcbiAqIHdpdGggZXh0ZW5kZWQgbWV0YWRhdGFcclxuICovXHJcbmRlY2xhcmUgaW50ZXJmYWNlIE1ldGFEYXRlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgd2VlayAoc3RhcnRpbmcgYXQgMClcclxuICAgKi9cclxuICBkYXk6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGRheSBvZiB0aGUgbW9udGggKHN0YXJ0aW5nIGF0IDEpXHJcbiAgICovXHJcbiAgZGF0ZTogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgd2VlayBvZiB0aGUgeWVhclxyXG4gICAqL1xyXG4gIHdlZWs6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG1vbnRoIChzdGFydGluZyBhdCAwKVxyXG4gICAqL1xyXG4gIG1vbnRoOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBmdWxsIHllYXJcclxuICAgKi9cclxuICB5ZWFyOiBudW1iZXI7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGRheSBpcyBzZWxlY3RhYmxlXHJcbiAgICovXHJcbiAgc2VsZWN0YWJsZTogYm9vbGVhbjtcclxufVxyXG5cclxuLyoqXHJcbiAqIEludGVyZmFjZSByZXByZXNlbnRpbmcgYSB3ZWVrIG9mIHRoZSB5ZWFyIHdpdGggbWV0YWRhdGFcclxuICovXHJcbmRlY2xhcmUgaW50ZXJmYWNlIE1ldGFXZWVrIHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHdlZWsgb2YgdGhlIHllYXIgKHN0YXJ0aW5nIGF0IDEpXHJcbiAgICovXHJcbiAgd2VlazogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgeWVhciBvZiB0aGUgd2Vla1xyXG4gICAqL1xyXG4gIHllYXI6IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgd2VlayBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIHdlZWsgcGlja2VyXHJcbiAgICovXHJcbiAgc2VsZWN0YWJsZTogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG51bWVyaWMgZGF0ZXMgb2YgdGhlIGRheXMgaW4gdGhlIHdlZWtcclxuICAgKi9cclxuICBkYXRlczogQXJyYXk8bnVtYmVyPjtcclxufVxyXG5cclxuLyoqXHJcbiAqIENvbXBvbmVudCB0byBhbGxvdyBhIHVzZXIgdG8gc2VsZWN0IGEgd2Vla1xyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdwYXJ0aWNsZS13ZWVrLXBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3dlZWstcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi93ZWVrLXBpY2tlci5jb21wb25lbnQuY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBXZWVrUGlja2VyQ29tcG9uZW50KSxcclxuICAgICAgbXVsdGk6IHRydWVcclxuICAgIH1cclxuICBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWVrUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSB3ZWVrIHBpY2tlclxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgdmFsdWUodmFsdWU6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9KSB7XHJcbiAgICBpZiAodmFsdWU/LnN0YXJ0ICYmIHZhbHVlPy5lbmQpIHtcclxuICAgICAgY29uc3Qgc3RhcnRXZWVrID0gZ2V0V2Vlayh2YWx1ZS5zdGFydCk7XHJcbiAgICAgIGNvbnN0IGVuZFdlZWsgPSBnZXRXZWVrKHZhbHVlLmVuZCk7XHJcblxyXG4gICAgICBpZiAoc3RhcnRXZWVrICE9PSBlbmRXZWVrKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFydCBhbmQgZW5kIG11c3QgYmUgcGFydCBvZiB0aGUgc2FtZSB3ZWVrIG9mIHRoZSB5ZWFyJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAodmFsdWUuc3RhcnQuZ2V0RGF5KCkgIT09IDAgfHwgdmFsdWUuZW5kLmdldERheSgpICE9PSA2KSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTdGFydCBtdXN0IGJlIHRoZSBiZWdpbm5pbmcgb2YgaXRzIHdlZWsgYW5kIGVuZCBtdXN0IGJlIHRoZSBlbmQgb2YgaXRzIHdlZWsnKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5faW50ZXJuYWxWYWx1ZS5uZXh0KHZhbHVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2ludGVybmFsVmFsdWUubmV4dChudWxsIGFzIGFueSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dCh0aGlzLmN1cnJlbnREYXRlLm1vbnRoKTtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRZZWFyLm5leHQodGhpcy5jdXJyZW50RGF0ZS55ZWFyKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlIGFzIGFueTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGRpc2FibGVkKGRpc2FibGVkOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGRpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSB2YWxpZCBkYXRlIGJvdW5kYXJ5IGZvciB0aGUgd2VlayBwaWNrZXJcclxuICAgKiBAcGFyYW0gZGF0ZVJhbmdlXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBzZXQgZGF0ZVJhbmdlKGRhdGVSYW5nZTogeyBzdGFydD86IERhdGUsIGVuZD86IERhdGUgfSkge1xyXG4gICAgdGhpcy5zZXRTZWxlY3Rpb25JbnRlcnZhbChkYXRlUmFuZ2UpO1xyXG4gICAgdGhpcy5zZXRDdXJyZW50RGF0ZVNlbGVjdGFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGxpc3QgdG8gYXBwbHkgdG8gdGhlIGRhdGUgcmFuZ2UgaW5wdXRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGlucHV0Q2xhc3NMaXN0ID0gbnVsbCBhcyBhbnk7XHJcblxyXG4gIC8qKlxyXG4gICAqIENsYXNzIGxpc3QgdG8gYXBwbHkgdG8gdGhlIHdlZWsgcGlja2VyIGJ1dHRvblxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgY2FsZW5kYXJCdXR0b25DbGFzc0xpc3QgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGFyaWEgbGFiZWwgdG8gYXBwbHkgdG8gdGhlIGRhdGUgcmFuZ2UgaW5wdXRcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGFyaWFMYWJlbCA9ICdEYXRlJztcclxuXHJcbiAgLyoqXHJcbiAgICogRm9ybWF0IGZvciB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSBpbiB0aGUgc2VsZWN0aW9uIHByZXZpZXcuIE11c3RcclxuICAgKiBiZSBhIHZhbGlkIEFuZ3VsYXIgRGF0ZVBpcGUgZm9ybWF0XHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBkYXRlRm9ybWF0ID0gJ01NL2RkL3knO1xyXG5cclxuICAvKipcclxuICAgKiBDbG9zZSB0aGUgcGlja2VyIHdoZW4gYSBzZWxlY3Rpb24gaXMgbWFkZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgY2xvc2VPblNlbGVjdCA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgdGV4dDogV2Vla1BpY2tlclRleHQgPSB7XHJcbiAgICBvcGVuQ2FsZW5kYXI6ICdvcGVuIGNhbGVuZGFyIHRvIHNlbGVjdCB3ZWVrJyxcclxuICAgIHNlbGVjdFdlZWs6ICdTZWxlY3QgYSB3ZWVrJyxcclxuICAgIHNlbGVjdFllYXI6ICdTZWxlY3QgYSB5ZWFyJyxcclxuICAgIHNlbGVjdE1vbnRoOiAnU2VsZWN0IGEgbW9udGgnLFxyXG4gICAgamFudWFyeTogJ0phbnVhcnknLFxyXG4gICAgZmVicnVhcnk6ICdGZWJydWFyeScsXHJcbiAgICBtYXJjaDogJ01hcmNoJyxcclxuICAgIGFwcmlsOiAnQXByaWwnLFxyXG4gICAgbWF5OiAnTWF5JyxcclxuICAgIGp1bmU6ICdKdW5lJyxcclxuICAgIGp1bHk6ICdKdWx5JyxcclxuICAgIGF1Z3VzdDogJ0F1Z3VzdCcsXHJcbiAgICBzZXB0ZW1iZXI6ICdTZXB0ZW1iZXInLFxyXG4gICAgb2N0b2JlcjogJ09jdG9iZXInLFxyXG4gICAgbm92ZW1iZXI6ICdOb3ZlbWJlcicsXHJcbiAgICBkZWNlbWJlcjogJ0RlY2VtYmVyJyxcclxuICAgIHN1bmRheUFiYnI6ICdTdScsXHJcbiAgICBtb25kYXlBYmJyOiAnTW8nLFxyXG4gICAgdHVlc2RheUFiYnI6ICdUdScsXHJcbiAgICB3ZWRuZXNkYXlBYmJyOiAnV2UnLFxyXG4gICAgdGh1cnNkYXlBYmJyOiAnVGgnLFxyXG4gICAgZnJpZGF5QWJicjogJ0ZyJyxcclxuICAgIHNhdHVyZGF5QWJicjogJ1NhJyxcclxuICAgIHNlbGVjdExhc3RXZWVrOiAnU2VsZWN0IGxhc3Qgd2VlaycsXHJcbiAgICBsYXN0V2VlazogJ0xhc3QgV2VlaycsXHJcbiAgICByZXNldFdlZWtTZWxlY3Rpb246ICdSZXNldCB3ZWVrIHNlbGVjdGlvbiB0byBjdXJyZW50IHdlZWsnLFxyXG4gICAgc2VsZWN0TmV4dFdlZWs6ICdTZWxlY3QgbmV4dCB3ZWVrJyxcclxuICAgIG5leHRXZWVrOiAnTmV4dCBXZWVrJ1xyXG4gIH0gYXMgV2Vla1BpY2tlclRleHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gd2VlayBzZWxlY3RcclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICB3ZWVrU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9PigpO1xyXG5cclxuICAvKipcclxuICAgKiBWaWV3Q2hpbGQgb2YgdGhlIGNhbGVuZGFyIHBvcG92ZXJcclxuICAgKi9cclxuICBAVmlld0NoaWxkKCdjYWxlbmRhclBvcG92ZXInKVxyXG4gIGNhbGVuZGFyUG9wb3ZlcjogUG9wb3ZlckNvbXBvbmVudCA9IG51bGwgYXMgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgY3VycmVudCBkYXRlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY3VycmVudERhdGU6IE1ldGFEYXRlO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIHZhbHVlIG9mIHRoZSB3ZWVrIHBpY2tlclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9pbnRlcm5hbFZhbHVlID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUgfT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIHNlbGVjdGFibGUgZGF0ZSByYW5nZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF92YWxpZFNlbGVjdGlvbkludGVydmFsID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7IHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUgfT4obnVsbCBhcyBhbnkpO1xyXG5cclxuICAvKipcclxuICAgKiBCZWhhdmlvclN1YmplY3QgdHJhY2tpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtb250aFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZE1vbnRoID0gbmV3IEJlaGF2aW9yU3ViamVjdCgwKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQmVoYXZpb3JTdWJqZWN0IHRyYWNraW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgeWVhclxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IF9zZWxlY3RlZFllYXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KDE5NzApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2VsZWN0ZWQgd2VlayBvZiB0aGUgeWVhciBvZiB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiBhcyBhbiBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgc2VsZWN0ZWRXZWVrJDogT2JzZXJ2YWJsZTxudW1iZXI+ID0gdGhpcy5faW50ZXJuYWxWYWx1ZS5waXBlKFxyXG4gICAgbWFwKHZhbHVlID0+IHtcclxuICAgICAgcmV0dXJuICF2YWx1ZT8uc3RhcnQgPyAwIDogZ2V0V2Vlayh2YWx1ZS5zdGFydCk7XHJcbiAgICB9KSxcclxuICAgIHNoYXJlUmVwbGF5KClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgeWVhciBvZiB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGVkIHdlZWsgYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNlbGVjdGVkWWVhciQ6IE9ic2VydmFibGU8bnVtYmVyPiA9IHRoaXMuX2ludGVybmFsVmFsdWUucGlwZShcclxuICAgIG1hcCh2YWx1ZSA9PiB7XHJcbiAgICAgIHJldHVybiAhdmFsdWU/LnN0YXJ0ID8gMCA6IHZhbHVlLnN0YXJ0LmdldEZ1bGxZZWFyKCk7XHJcbiAgICB9KSxcclxuICAgIHNoYXJlUmVwbGF5KClcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIGJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIG5leHQgd2VlayAocmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uKSBpcyBzZWxlY3RhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY2FuU2VsZWN0TmV4dFdlZWskOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zZWxlY3RlZFdlZWskLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLCB0aGlzLl9zZWxlY3RlZFllYXIpLFxyXG4gICAgbWFwKChbc2VsZWN0ZWRXZWVrLCBzZWxlY3Rpb25JbnRlcnZhbCwgc2VsZWN0ZWRZZWFyXSkgPT4ge1xyXG4gICAgICBsZXQgY2FuU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0ZWRXZWVrID4gMCAmJiBzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhclN0YXJ0ID0gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCAwLCAxKTtcclxuICAgICAgICBjb25zdCB3ZWVrRGF0ZSA9IHNldFdlZWsoc2VsZWN0ZWRZZWFyU3RhcnQsIHNlbGVjdGVkV2Vlayk7XHJcbiAgICAgICAgY29uc3QgbmV4dFdlZWtEYXRlID0gYWRkKHdlZWtEYXRlLCB7IHdlZWtzOiAxIH0pO1xyXG4gICAgICAgIGNvbnN0IG5leHRXZWVrU3RhcnREYXRlID0gc3RhcnRPZldlZWsobmV4dFdlZWtEYXRlKTtcclxuICAgICAgICBjb25zdCBuZXh0V2Vla0VuZERhdGUgPSBlbmRPZldlZWsobmV4dFdlZWtEYXRlKTtcclxuXHJcbiAgICAgICAgY2FuU2VsZWN0ID0gaXNXaXRoaW5JbnRlcnZhbChuZXh0V2Vla1N0YXJ0RGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpICYmXHJcbiAgICAgICAgICBpc1dpdGhpbkludGVydmFsKG5leHRXZWVrRW5kRGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2FuU2VsZWN0O1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIGJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIGxhc3Qgd2VlayAocmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2VsZWN0aW9uKSBpcyBzZWxlY3RhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgY2FuU2VsZWN0TGFzdFdlZWskOiBPYnNlcnZhYmxlPGJvb2xlYW4+ID0gdGhpcy5zZWxlY3RlZFdlZWskLnBpcGUoXHJcbiAgICB3aXRoTGF0ZXN0RnJvbSh0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLCB0aGlzLl9zZWxlY3RlZFllYXIpLFxyXG4gICAgbWFwKChbc2VsZWN0ZWRXZWVrLCBzZWxlY3Rpb25JbnRlcnZhbCwgc2VsZWN0ZWRZZWFyXSkgPT4ge1xyXG4gICAgICBsZXQgY2FuU2VsZWN0ID0gZmFsc2U7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0ZWRXZWVrID4gMCAmJiBzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkWWVhclN0YXJ0ID0gbmV3IERhdGUoc2VsZWN0ZWRZZWFyLCAwLCAxKTtcclxuICAgICAgICBjb25zdCB3ZWVrRGF0ZSA9IHNldFdlZWsoc2VsZWN0ZWRZZWFyU3RhcnQsIHNlbGVjdGVkV2Vlayk7XHJcbiAgICAgICAgY29uc3QgbGFzdFdlZWtEYXRlID0gc3ViKHdlZWtEYXRlLCB7IHdlZWtzOiAxIH0pO1xyXG4gICAgICAgIGNvbnN0IGxhc3RXZWVrU3RhcnREYXRlID0gc3RhcnRPZldlZWsobGFzdFdlZWtEYXRlKTtcclxuICAgICAgICBjb25zdCBsYXN0V2Vla0VuZERhdGUgPSBlbmRPZldlZWsobGFzdFdlZWtEYXRlKTtcclxuXHJcbiAgICAgICAgY2FuU2VsZWN0ID0gaXNXaXRoaW5JbnRlcnZhbChsYXN0V2Vla1N0YXJ0RGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpICYmXHJcbiAgICAgICAgICBpc1dpdGhpbkludGVydmFsKGxhc3RXZWVrRW5kRGF0ZSwgc2VsZWN0aW9uSW50ZXJ2YWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gY2FuU2VsZWN0O1xyXG4gICAgfSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgcmFuZ2Ugb2Ygc2VsZWN0YWJsZSB5ZWFycyBhcyBhbiBPYnNlcnZhYmxlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgdmFsaWRZZWFyUmFuZ2UkOiBPYnNlcnZhYmxlPEFycmF5PG51bWJlcj4+ID0gdGhpcy5fdmFsaWRTZWxlY3Rpb25JbnRlcnZhbC5waXBlKFxyXG4gICAgbWFwKHNlbGVjdGlvbkludGVydmFsID0+IFdlZWtQaWNrZXJDb21wb25lbnQuZ2VuZXJhdGVZZWFyUmFuZ2UoXHJcbiAgICAgIHNlbGVjdGlvbkludGVydmFsPy5zdGFydD8uZ2V0RnVsbFllYXIoKSA/PyBudWxsLFxyXG4gICAgICBzZWxlY3Rpb25JbnRlcnZhbD8uZW5kPy5nZXRGdWxsWWVhcigpID8/IG51bGwsXHJcbiAgICAgIHRoaXMuY3VycmVudERhdGUueWVhclxyXG4gICAgKSlcclxuICApO1xyXG5cclxuICAvKipcclxuICAgKiBBbiBhcnJheSBvZiBNZXRhV2Vla3MgcmVwcmVzZW50aW5nIGEgbW9udGggYXMgYW4gT2JzZXJ2YWJsZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGZ1bGxNb250aCQ6IE9ic2VydmFibGU8QXJyYXk8TWV0YVdlZWs+PiA9IGNvbWJpbmVMYXRlc3QoW1xyXG4gICAgdGhpcy5fc2VsZWN0ZWRNb250aCxcclxuICAgIHRoaXMuX3NlbGVjdGVkWWVhcixcclxuICAgIHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWxcclxuICBdKS5waXBlKFxyXG4gICAgbWFwKChbbW9udGgsIHllYXIsIHNlbGVjdGlvbkludGVydmFsXSkgPT4ge1xyXG4gICAgICBsZXQgZnVsbE1vbnRoOiBBcnJheTxNZXRhV2Vlaz4gPSBudWxsIGFzIGFueTtcclxuXHJcbiAgICAgIGlmIChzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIGZ1bGxNb250aCA9IFdlZWtQaWNrZXJDb21wb25lbnQuZ2VuZXJhdGVNb250aChcclxuICAgICAgICAgIG1vbnRoLFxyXG4gICAgICAgICAgeWVhcixcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgc3RhcnQ6IHNlbGVjdGlvbkludGVydmFsLnN0YXJ0LFxyXG4gICAgICAgICAgICBlbmQ6IHNlbGVjdGlvbkludGVydmFsLmVuZFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBmdWxsTW9udGg7XHJcbiAgICB9KVxyXG4gICk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgd2VlayBwaWNrZXJcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgX3ZhbHVlID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogR2VuZXJhdGUgYW4gQXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRpbmcgdGhlIHNwYW4gb2YgeWVhcnMgYmV0d2VlbiB0aGUgaW5wdXRcclxuICAgKiBAcGFyYW0gbWluWWVhciB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlXHJcbiAgICogQHBhcmFtIG1heFllYXIgdGhlIGVuZCBvZiB0aGUgcmFuZ2VcclxuICAgKiBAcGFyYW0gY3VycmVudFllYXIgdGhlIGN1cnJlbnQgeWVhclxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdlbmVyYXRlWWVhclJhbmdlKG1pblllYXI6IG51bWJlciwgbWF4WWVhcjogbnVtYmVyLCBjdXJyZW50WWVhcjogbnVtYmVyKTogQXJyYXk8bnVtYmVyPiB7XHJcbiAgICBsZXQgc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXI7XHJcbiAgICBpZiAoIW1pblllYXIgJiYgbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1heFllYXIgPSA1MDtcclxuICAgICAgZW5kID0gbWF4WWVhcjtcclxuICAgIH0gZWxzZSBpZiAobWluWWVhciAmJiAhbWF4WWVhcikge1xyXG4gICAgICBzdGFydCA9IG1pblllYXI7XHJcbiAgICAgIGVuZCA9IG1pblllYXIgKyA1MDtcclxuICAgIH0gZWxzZSBpZiAobWluWWVhciAmJiBtYXhZZWFyKSB7XHJcbiAgICAgIHN0YXJ0ID0gbWluWWVhcjtcclxuICAgICAgZW5kID0gbWF4WWVhcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN0YXJ0ID0gY3VycmVudFllYXIgLSAxMDA7XHJcbiAgICAgIGVuZCA9IGN1cnJlbnRZZWFyICsgNTA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmFuZ2U6IEFycmF5PG51bWJlcj4gPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8PSBlbmQ7IGkrKykge1xyXG4gICAgICByYW5nZS5wdXNoKGkpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByYW5nZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdlbmVyYXRlIGEgbW9udGggd2l0aCB3ZWVrIGFuZCBzZWxlY3RhYmxlIHN0YXR1cyBtZXRhZGF0YVxyXG4gICAqIEBwYXJhbSBtb250aCB0aGUgbW9udGggdG8gZ2VuZXJhdGVcclxuICAgKiBAcGFyYW0geWVhciB0aGUgeWVhciBvZiB0aGUgbW9udGggdG8gZ2VuZXJhdGVcclxuICAgKiBAcGFyYW0gc2VsZWN0aW9uSW50ZXJ2YWwgdGhlIGludGVydmFsIHJlcHJlc2VudGluZyB0aGVcclxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0gdG8gdGhlIG1heGltdW0gd2VlayBvZiB0aGUgeWVhclxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgZ2VuZXJhdGVNb250aChtb250aDogbnVtYmVyLCB5ZWFyOiBudW1iZXIsIHNlbGVjdGlvbkludGVydmFsOiB7IHN0YXJ0OiBEYXRlLCBlbmQ6IERhdGUgfSk6IEFycmF5PE1ldGFXZWVrPiB7XHJcbiAgICBjb25zdCBtZXRhTW9udGg6IEFycmF5PE1ldGFXZWVrPiA9IFtdO1xyXG4gICAgY29uc3Qgc3RhcnRPZk1vbnRoID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpO1xyXG4gICAgY29uc3QgbW9udGhJbnRlcnZhbCA9IHsgc3RhcnQ6IHN0YXJ0T2ZNb250aCwgZW5kOiBlbmRPZk1vbnRoKHN0YXJ0T2ZNb250aCkgfTtcclxuICAgIGxldCBzY3JvbGxEYXRlID0gc3ViKHN0YXJ0T2ZNb250aCwgeyBkYXlzOiBzdGFydE9mTW9udGguZ2V0RGF5KCkgfSk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2OyBpKyspIHtcclxuICAgICAgY29uc3Qgc3VuZGF5T2ZXZWVrID0gc3ViKHNjcm9sbERhdGUsIHsgZGF5czogc2Nyb2xsRGF0ZS5nZXREYXkoKSB9KTtcclxuICAgICAgY29uc3Qgc2F0dXJkYXlPZldlZWsgPSBhZGQoc2Nyb2xsRGF0ZSwgeyBkYXlzOiA2IC0gc2Nyb2xsRGF0ZS5nZXREYXkoKSB9KTtcclxuXHJcbiAgICAgIG1ldGFNb250aC5wdXNoKHtcclxuICAgICAgICB3ZWVrOiBnZXRXZWVrKHNjcm9sbERhdGUpLFxyXG4gICAgICAgIHllYXI6IHN1bmRheU9mV2Vlay5nZXRGdWxsWWVhcigpLFxyXG4gICAgICAgIHNlbGVjdGFibGU6IChpc1dpdGhpbkludGVydmFsKHN1bmRheU9mV2VlaywgbW9udGhJbnRlcnZhbCkgfHxcclxuICAgICAgICAgIGlzV2l0aGluSW50ZXJ2YWwoc2F0dXJkYXlPZldlZWssIG1vbnRoSW50ZXJ2YWwpKSAmJlxyXG4gICAgICAgICAgaXNXaXRoaW5JbnRlcnZhbChzdW5kYXlPZldlZWssIHNlbGVjdGlvbkludGVydmFsKSAmJlxyXG4gICAgICAgICAgaXNXaXRoaW5JbnRlcnZhbChzYXR1cmRheU9mV2Vlaywgc2VsZWN0aW9uSW50ZXJ2YWwpLFxyXG4gICAgICAgIGRhdGVzOiBbXVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgNzsgaisrKSB7XHJcbiAgICAgICAgbWV0YU1vbnRoW2ldLmRhdGVzLnB1c2goc2Nyb2xsRGF0ZS5nZXREYXRlKCkpO1xyXG4gICAgICAgIHNjcm9sbERhdGUgPSBhZGQoc2Nyb2xsRGF0ZSwgeyBkYXlzOiAxIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHJldHVybiBtZXRhTW9udGg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgdGhlIGlucHV0IGRhdGUgYXMgYSBNZXRhRGF0ZVxyXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHRyYW5zZm9ybVxyXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRlIGlzIHNlbGVjdGFibGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3RhdGljIGdldE1ldGFEYXRlKGRhdGU6IERhdGUsIHNlbGVjdGFibGUgPSBmYWxzZSk6IE1ldGFEYXRlIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGRheTogZGF0ZS5nZXREYXkoKSxcclxuICAgICAgZGF0ZTogZGF0ZS5nZXREYXRlKCksXHJcbiAgICAgIHdlZWs6IGdldFdlZWsoZGF0ZSksXHJcbiAgICAgIG1vbnRoOiBkYXRlLmdldE1vbnRoKCksXHJcbiAgICAgIHllYXI6IGRhdGUuZ2V0RnVsbFllYXIoKSxcclxuICAgICAgc2VsZWN0YWJsZTogc2VsZWN0YWJsZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gY2hhbmdlXHJcbiAgICovXHJcbiAgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge307XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRvIGNhbGwgb24gdG91Y2hcclxuICAgKi9cclxuICBvblRvdWNoZWQ6ICgpID0+IGFueSA9ICgpID0+IHt9O1xyXG5cclxuICAvKipcclxuICAgKiBEZXBlbmRlbmN5IGluamVjdGlvbiBzaXRlXHJcbiAgICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIHRoZSBBbmd1bGFyIENoYW5nZURldGVjdG9yUmVmXHJcbiAgICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICAgIHRoaXMuY3VycmVudERhdGUgPSBXZWVrUGlja2VyQ29tcG9uZW50LmdldE1ldGFEYXRlKG5ldyBEYXRlKCksIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHdlZWsgcGlja2VyXHJcbiAgICovXHJcbiAgZ2V0IHZhbHVlKCk6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9IHtcclxuICAgIHJldHVybiB0aGlzLl92YWx1ZSBhcyBhbnk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgd2hldGhlciB0aGUgY29udHJvbCBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdyaXRlIHZhbHVlXHJcbiAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byB3cml0ZVxyXG4gICAqL1xyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXIgZnVuY3Rpb24gb24gY2hhbmdlXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byBjaGFuZ2VcclxuICAgKi9cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlZ2lzdGVyIGZ1bmN0aW9uIG9uIHRvdWNoXHJcbiAgICogQHBhcmFtIGZuIHRoZSBmdW5jdGlvbiB0byByZWdpc3RlclxyXG4gICAqL1xyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgZGlzYWJsZWQgc3RhdGVcclxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCB3aGV0aGVyIG9yIG5vdCB0aGUgY29udHJvbCBpcyBkaXNhYmxlZFxyXG4gICAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT3BlbiB0aGUgd2VlayBwaWNrZXIgcG9wb3ZlclxyXG4gICAqIEBwYXJhbSBldmVudCB0aGUgZXZlbnQgdG8gcGFzcyB0byB0aGUgcG9wb3ZlclxyXG4gICAqL1xyXG4gIG9wZW5DYWxlbmRhcihldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBjb25zdCBzZWxlY3Rpb25JbnRlcnZhbCA9IHRoaXMuX3ZhbGlkU2VsZWN0aW9uSW50ZXJ2YWwuZ2V0VmFsdWUoKTtcclxuICAgICAgaWYgKCFzZWxlY3Rpb25JbnRlcnZhbCkge1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uSW50ZXJ2YWwobnVsbCBhcyBhbnkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldEN1cnJlbnREYXRlU2VsZWN0YWJsZSgpO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KHRoaXMuY3VycmVudERhdGUubW9udGgpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KHRoaXMuY3VycmVudERhdGUueWVhcik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5faW50ZXJuYWxWYWx1ZS5uZXh0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dCh0aGlzLnZhbHVlLnN0YXJ0LmdldE1vbnRoKCkpO1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KHRoaXMudmFsdWUuc3RhcnQuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuY2FsZW5kYXJQb3BvdmVyLnRvZ2dsZShldmVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgd2VlayBzZWxlY3RcclxuICAgKiBAcGFyYW0gd2VlayB0aGUgd2VlayBvZiB0aGUgeWVhclxyXG4gICAqIEBwYXJhbSBzZWxlY3RhYmxlIHdoZXRoZXIgb3Igbm90IHRoZSB3ZWVrIGlzIHNlbGVjdGFibGVcclxuICAgKi9cclxuICBvbldlZWtTZWxlY3Qod2VlazogbnVtYmVyLCBzZWxlY3RhYmxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBjb25zdCBzZWxlY3RlZFllYXIgPSB0aGlzLl9zZWxlY3RlZFllYXIuZ2V0VmFsdWUoKTtcclxuXHJcbiAgICBpZiAoc2VsZWN0YWJsZSkge1xyXG4gICAgICBjb25zdCB3ZWVrRGF0ZSA9IHNldFdlZWsobmV3IERhdGUoc2VsZWN0ZWRZZWFyLCAwLCAxKSwgd2Vlayk7XHJcbiAgICAgIGNvbnN0IHdlZWtTdGFydCA9IHN0YXJ0T2ZXZWVrKHdlZWtEYXRlKTtcclxuICAgICAgY29uc3Qgd2Vla0VuZCA9IGVuZE9mRGF5KGVuZE9mV2Vlayh3ZWVrRGF0ZSkpO1xyXG4gICAgICBjb25zdCBzZWxlY3RlZFdlZWsgPSB7IHN0YXJ0OiB3ZWVrU3RhcnQsIGVuZDogd2Vla0VuZCB9O1xyXG5cclxuICAgICAgdGhpcy51cGRhdGVNb2RlbChzZWxlY3RlZFdlZWspO1xyXG5cclxuICAgICAgaWYgKHRoaXMuY2xvc2VPblNlbGVjdCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5jYWxlbmRhclBvcG92ZXIuY2xvc2UoKSwgMjAwKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0IG5leHQgd2VlayAocmVsYXRpdmUgdG8gdGhlIHdlZWsgb2YgdGhlIGN1cnJlbnQgc2VsZWN0aW9uKVxyXG4gICAqL1xyXG4gIHNlbGVjdE5leHRXZWVrKCk6IHZvaWQge1xyXG4gICAgY29uc3QgbmV4dFdlZWtEYXRlID0gYWRkKHRoaXMudmFsdWUuc3RhcnQsIHsgd2Vla3M6IDEgfSk7XHJcbiAgICBjb25zdCBuZXh0V2Vla1N0YXJ0ID0gc3RhcnRPZldlZWsobmV4dFdlZWtEYXRlKTtcclxuICAgIGNvbnN0IG5leHRXZWVrRW5kID0gZW5kT2ZEYXkoZW5kT2ZXZWVrKG5leHRXZWVrRGF0ZSkpO1xyXG4gICAgY29uc3QgY3VycmVudE1vbnRoID0gdGhpcy52YWx1ZS5zdGFydC5nZXRNb250aCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRXZWVrID0geyBzdGFydDogbmV4dFdlZWtTdGFydCwgZW5kOiBuZXh0V2Vla0VuZCB9O1xyXG5cclxuICAgIHRoaXMudXBkYXRlTW9kZWwoc2VsZWN0ZWRXZWVrKTtcclxuXHJcbiAgICBpZiAobmV4dFdlZWtTdGFydC5nZXRNb250aCgpICE9PSBjdXJyZW50TW9udGgpIHtcclxuICAgICAgdGhpcy5fc2VsZWN0ZWRNb250aC5uZXh0KG5leHRXZWVrU3RhcnQuZ2V0TW9udGgoKSk7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KG5leHRXZWVrU3RhcnQuZ2V0RnVsbFllYXIoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZWxlY3QgbGFzdCB3ZWVrIChyZWxhdGl2ZSB0byB0aGUgd2VlayBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24pXHJcbiAgICovXHJcbiAgc2VsZWN0TGFzdFdlZWsoKTogdm9pZCB7XHJcbiAgICBjb25zdCBsYXN0V2Vla0RhdGUgPSBzdWIodGhpcy52YWx1ZS5zdGFydCwgeyB3ZWVrczogMSB9KTtcclxuICAgIGNvbnN0IGxhc3RXZWVrU3RhcnQgPSBzdGFydE9mV2VlayhsYXN0V2Vla0RhdGUpO1xyXG4gICAgY29uc3QgbGFzdFdlZWtFbmQgPSBlbmRPZkRheShlbmRPZldlZWsobGFzdFdlZWtEYXRlKSk7XHJcbiAgICBjb25zdCBjdXJyZW50TW9udGggPSB0aGlzLnZhbHVlLmVuZC5nZXRNb250aCgpO1xyXG4gICAgY29uc3Qgc2VsZWN0ZWRXZWVrID0geyBzdGFydDogbGFzdFdlZWtTdGFydCwgZW5kOiBsYXN0V2Vla0VuZCB9O1xyXG5cclxuICAgIHRoaXMudXBkYXRlTW9kZWwoc2VsZWN0ZWRXZWVrKTtcclxuXHJcbiAgICBpZiAobGFzdFdlZWtFbmQuZ2V0TW9udGgoKSAhPT0gY3VycmVudE1vbnRoKSB7XHJcbiAgICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dChsYXN0V2Vla1N0YXJ0LmdldE1vbnRoKCkpO1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFllYXIubmV4dChsYXN0V2Vla1N0YXJ0LmdldEZ1bGxZZWFyKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2VsZWN0IHRoZSBjdXJyZW50IHdlZWtcclxuICAgKi9cclxuICBzZWxlY3RDdXJyZW50V2VlaygpOiB2b2lkIHtcclxuICAgIGNvbnN0IHRoaXNXZWVrRGF0ZSA9IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUueWVhciwgdGhpcy5jdXJyZW50RGF0ZS5tb250aCwgdGhpcy5jdXJyZW50RGF0ZS5kYXRlKTtcclxuICAgIGNvbnN0IHRoaXNXZWVrU3RhcnQgPSBzdGFydE9mV2Vlayh0aGlzV2Vla0RhdGUpO1xyXG4gICAgY29uc3QgdGhpc1dlZWtFbmQgPSBlbmRPZkRheShlbmRPZldlZWsodGhpc1dlZWtEYXRlKSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVNb2RlbCh7IHN0YXJ0OiB0aGlzV2Vla1N0YXJ0LCBlbmQ6IHRoaXNXZWVrRW5kIH0pO1xyXG5cclxuICAgIHRoaXMuX3NlbGVjdGVkTW9udGgubmV4dCh0aGlzLmN1cnJlbnREYXRlLm1vbnRoKTtcclxuICAgIHRoaXMuX3NlbGVjdGVkWWVhci5uZXh0KHRoaXMuY3VycmVudERhdGUueWVhcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGUgbW9kZWxcclxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgbW9kZWxcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwodmFsdWU6IHsgc3RhcnQ6IERhdGUsIGVuZDogRGF0ZSB9KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZUJlZm9yZVVwZGF0ZSA9IHRoaXMudmFsdWU7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgIGlmICghaXNFcXVhbCh2YWx1ZUJlZm9yZVVwZGF0ZS5zdGFydCwgdGhpcy52YWx1ZS5zdGFydCkgJiZcclxuICAgICAgICAhaXNFcXVhbCh2YWx1ZUJlZm9yZVVwZGF0ZS5lbmQsIHRoaXMudmFsdWUuZW5kKSkge1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy53ZWVrU2VsZWN0ZWQuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRoZSBzZWxlY3Rpb24gaW50ZXJ2YWxcclxuICAgKiBAcGFyYW0gaW50ZXJ2YWwgdGhlIGlucHV0IHNlbGVjdGlvbiBpbnRlcnZhbFxyXG4gICAqIEBwcml2YXRlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzZXRTZWxlY3Rpb25JbnRlcnZhbChpbnRlcnZhbDogeyBzdGFydD86IERhdGUsIGVuZD86IERhdGUgfSk6IHZvaWQge1xyXG4gICAgaWYgKCFpbnRlcnZhbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YXJ0IGRhdGUgbXVzdCBiZSBsZXNzIHRoYW4gZW5kIGRhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoKGludGVydmFsIGFzIGFueSk/LnN0YXJ0ID4gKGludGVydmFsIGFzIGFueSk/LmVuZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1N0YXJ0IGRhdGUgbXVzdCBiZSBsZXNzIHRoYW4gZW5kIGRhdGUnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLm5leHQoe1xyXG4gICAgICBzdGFydDogKGludGVydmFsIGFzIGFueSk/LnN0YXJ0ID8/IG5ldyBEYXRlKHRoaXMuY3VycmVudERhdGUueWVhciAtIDEwMCwgMCwgMSksXHJcbiAgICAgIGVuZDogKGludGVydmFsIGFzIGFueSk/LmVuZCA/PyBuZXcgRGF0ZSh0aGlzLmN1cnJlbnREYXRlLnllYXIgKyA1MCwgMTEsIDMxKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXQgdGhlIHNlbGVjdGFibGUgc3RhdHVzIG9mIHRoZSBjdXJyZW50IGRhdGVcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0Q3VycmVudERhdGVTZWxlY3RhYmxlKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uSW50ZXJ2YWwgPSB0aGlzLl92YWxpZFNlbGVjdGlvbkludGVydmFsLmdldFZhbHVlKCk7XHJcbiAgICBjb25zdCBzdGFydE9mQ3VycmVudFdlZWsgPSBzdWIodG9kYXksIHsgZGF5czogdGhpcy5jdXJyZW50RGF0ZS5kYXkgfSk7XHJcbiAgICBjb25zdCBlbmRPZkN1cnJlbnRXZWVrID0gYWRkKHRvZGF5LCB7IGRheXM6IDYgLSB0aGlzLmN1cnJlbnREYXRlLmRheSB9KTtcclxuXHJcbiAgICB0aGlzLmN1cnJlbnREYXRlLnNlbGVjdGFibGUgPSBpc1dpdGhpbkludGVydmFsKHN0YXJ0T2ZDdXJyZW50V2Vlaywgc2VsZWN0aW9uSW50ZXJ2YWwpICYmXHJcbiAgICAgIGlzV2l0aGluSW50ZXJ2YWwoZW5kT2ZDdXJyZW50V2Vlaywgc2VsZWN0aW9uSW50ZXJ2YWwpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IHN0eWxlPVwiY3Vyc29yOmRlZmF1bHQ7b3ZlcmZsb3c6IGhpZGRlbjtcIlxyXG4gICAgIFtuZ0NsYXNzXT1cImlucHV0Q2xhc3NMaXN0ID8gJycgOiAncm93IHB0bF9pbnB1dCBwdGxfaW5wdXRfaGVpZ2h0IHB0bF9pbnB1dF9iZ19jb2xvciBwdGxfYnJkcl9jb2xvciBwdGxfYnJkcl9zaXplIHB0bF9icmRyX3JhZGl1cyBlbnRfcjJsX2RpcidcIlxyXG4gICAgIFtzdHlsZS5maWx0ZXJdPVwiZGlzYWJsZWQgPyAnYnJpZ2h0bmVzcyguOTUpJyA6ICcnXCI+XHJcbiAgPGJ1dHRvbiAoY2xpY2spPVwib3BlbkNhbGVuZGFyKCRldmVudClcIlxyXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgKyAnLCAnICsgdGV4dC5vcGVuQ2FsZW5kYXJcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjYWxlbmRhclBvcG92ZXIudmlzaWJsZVwiXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJpbnB1dENsYXNzTGlzdCA/IGlucHV0Q2xhc3NMaXN0IDogJ2NsZWFyJ1wiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0bnNldCB3aWR0aDEwMCBoZWlnaHQxMDAgY2VudGVyX2NlbnRlclwiXHJcbiAgICAgICAgICBzdHlsZT1cIm91dGxpbmUtb2Zmc2V0OiAtMnB4O1wiXHJcbiAgPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzEgaGVpZ2h0MTAwIHdpZHRoMTAwIHB0bF9pbnB1dF90ZXh0X3NpemUgcHRsX2lucHV0X3BhZGRpbmcgdl9jZW50ZXJcIj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9pbnRlcm5hbFZhbHVlIHwgYXN5bmMgYXMgaW50ZXJuYWxWYWx1ZSBlbHNlIHBsYWNlaG9sZGVyVGVtcGxhdGVcIj5cclxuICAgICAgICB7e2ludGVybmFsVmFsdWUuc3RhcnQgfCBkYXRlOiBkYXRlRm9ybWF0fX0gLSB7e2ludGVybmFsVmFsdWUuZW5kIHwgZGF0ZTogZGF0ZUZvcm1hdH19XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVGVtcGxhdGU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImVudF9yMmxfdHh0XCI+e3t0ZXh0LnNlbGVjdFdlZWt9fS4uLjwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29sIG1pbl93NTAgaGVpZ2h0MTAwIGNlbnRlcl9jZW50ZXIgYm9yZGVyX2xlZnRcIlxyXG4gICAgICAgICBbbmdDbGFzc109XCJjYWxlbmRhckJ1dHRvbkNsYXNzTGlzdCA/IGNhbGVuZGFyQnV0dG9uQ2xhc3NMaXN0IDogJ2JnX292ZXJsYXkgcHRsX2JyZHJfY29sb3InXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3aWR0aDEwMCBoZWlnaHQxMDAgY2VudGVyX2NlbnRlclwiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLXdlZWsgcHRsX2lucHV0X3RleHRfc2l6ZVwiPjwvaT5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcblxyXG5cclxuPCEtLSB3ZWVrIHBpY2tlciBpbnB1dFxyXG48ZGl2IGNsYXNzPVwid3dwX2NvbnRhaW5lclwiIHN0eWxlPVwiY3Vyc29yOmRlZmF1bHQ7XCJcclxuICAgICBbbmdDbGFzc109XCJpbnB1dENsYXNzTGlzdFwiXHJcbiAgICAgW3N0eWxlLmZpbHRlcl09XCJkaXNhYmxlZCA/ICdicmlnaHRuZXNzKC45NSknIDogJydcIj5cclxuXHJcbiAgPGJ1dHRvbiAoY2xpY2spPVwib3BlbkNhbGVuZGFyKCRldmVudClcIlxyXG4gICAgICAgICAgYXJpYS1oYXNwb3B1cD1cImRpYWxvZ1wiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWwgKyAnLCAnICsgdGV4dC5vcGVuQ2FsZW5kYXJcIlxyXG4gICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJjYWxlbmRhclBvcG92ZXIudmlzaWJsZVwiXHJcbiAgICAgICAgICBjbGFzcz1cImFjY2VzcyBjb250ZW50X2NvbG9yIHd3cF9pbnB1dFwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9pbnRlcm5hbFZhbHVlIHwgYXN5bmMgYXMgaW50ZXJuYWxWYWx1ZSBlbHNlIHBsYWNlaG9sZGVyVGVtcGxhdGVcIj5cclxuICAgICAge3tpbnRlcm5hbFZhbHVlLnN0YXJ0IHwgZGF0ZTogZGF0ZUZvcm1hdH19IC0ge3tpbnRlcm5hbFZhbHVlLmVuZCB8IGRhdGU6IGRhdGVGb3JtYXR9fVxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctdGVtcGxhdGUgI3BsYWNlaG9sZGVyVGVtcGxhdGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ3d3BfcGxhY2Vob2xkZXJcIj57e3RleHQuc2VsZWN0V2Vla319Li4uPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvYnV0dG9uPlxyXG4gIDxkaXYgY2xhc3M9XCJ3d3BfYnV0dG9uXCIgW25nQ2xhc3NdPVwiY2FsZW5kYXJCdXR0b25DbGFzc0xpc3RcIj5cclxuICAgIDxpIGNsYXNzPVwiZmFzIGZhLWNhbGVuZGFyLXdlZWtcIj48L2k+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4tLT5cclxuPCEtLSBUT0RPOiBpbnN0ZWFkIG9mIG9mZnNldCAxLCBhdHRhY2ggdG8gd3dwX2NvbnRhaW5lciAtLT5cclxuPCEtLSBjYWxlbmRhciB3aWRnZXQgLS0+XHJcbjxwYXJ0aWNsZS1wb3BvdmVyIFtvZmZzZXRdPVwiMVwiICNjYWxlbmRhclBvcG92ZXI+XHJcbiAgPCEtLSBtb250aCAvIHllYXIgc2VsZWN0IC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJ3d3Bfb3B0aW9uc1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNvbnRlbnRfY29sb3IgcGFkXzUgcGFkX2JvdDBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBzcGFjZV9iZXR3ZWVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzEgbWFyXzVcIj5cclxuICAgICAgICAgIDxzZWxlY3QgI3llYXJTZWxlY3RcclxuICAgICAgICAgICAgICAgICAgW25nTW9kZWxdPVwiX3NlbGVjdGVkWWVhciB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kaWFsb2ctY2xvc2Utb3ZlcnJpZGVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwiX3NlbGVjdGVkWWVhci5uZXh0KCt5ZWFyU2VsZWN0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGlucHV0IHNtIGNvbnRlbnRfY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0WWVhclwiPlxyXG4gICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHZhbGlkWWVhclJhbmdlJCB8IGFzeW5jXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwieWVhclwiPlxyXG4gICAgICAgICAgICAgIHt7eWVhcn19XHJcbiAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBzaXplXzIgbWFyXzVcIj5cclxuICAgICAgICAgIDxzZWxlY3QgI21vbnRoU2VsZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtuZ01vZGVsXT1cIl9zZWxlY3RlZE1vbnRoIHwgYXN5bmNcIlxyXG4gICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIl9zZWxlY3RlZE1vbnRoLm5leHQoK21vbnRoU2VsZWN0LnZhbHVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGlucHV0IHNtIGNvbnRlbnRfY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0TW9udGhcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjBcIj57e3RleHQuamFudWFyeX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+e3t0ZXh0LmZlYnJ1YXJ5fX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjJcIj57e3RleHQubWFyY2h9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiM1wiPnt7dGV4dC5hcHJpbH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI0XCI+e3t0ZXh0Lm1heX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI1XCI+e3t0ZXh0Lmp1bmV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNlwiPnt7dGV4dC5qdWx5fX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjdcIj57e3RleHQuYXVndXN0fX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjhcIj57e3RleHQuc2VwdGVtYmVyfX08L29wdGlvbj5cclxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjlcIj57e3RleHQub2N0b2Jlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMFwiPnt7dGV4dC5ub3ZlbWJlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMVwiPnt7dGV4dC5kZWNlbWJlcn19PC9vcHRpb24+XHJcbiAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50X2NvbG9yIHBhZF81XCI+XHJcbiAgICAgIDwhLS0gd2Vla2RheXMgLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXJfNSBtYXJfYm90MTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IHdyYXAgc3BhY2VfYmV0d2VlbiBwdGxfaW5wdXRfYmdfY29sb3IgcHRsX2JyZHJfY29sb3IgYm9yZGVyX2JvdHRvbSBicmFkXzMgbWFyX2JvdDVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5zdW5kYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5tb25kYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC50dWVzZGF5QWJicn19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3dwX3dlZWtkYXlcIj57e3RleHQud2VkbmVzZGF5QWJicn19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3dwX3dlZWtkYXlcIj57e3RleHQudGh1cnNkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5mcmlkYXlBYmJyfX08L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3d3Bfd2Vla2RheVwiPnt7dGV4dC5zYXR1cmRheUFiYnJ9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gZGF5cyAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZnVsbE1vbnRoJCB8IGFzeW5jIGFzIGZ1bGxNb250aFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgd2VlayBvZiBmdWxsTW9udGhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInd3cF93ZWVrXCJcclxuICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjdXJyZW50V2Vlayc6IHdlZWsud2VlayA9PT0gY3VycmVudERhdGUud2VlayAmJiB3ZWVrLnllYXIgPT09IGN1cnJlbnREYXRlLnllYXIgfVwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uV2Vla1NlbGVjdCh3ZWVrLndlZWssIHdlZWsuc2VsZWN0YWJsZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF3ZWVrLnNlbGVjdGFibGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiKChzZWxlY3RlZFdlZWskIHwgYXN5bmMpID09PSB3ZWVrLndlZWspICYmICgoc2VsZWN0ZWRZZWFyJCB8IGFzeW5jKSA9PT0gd2Vlay55ZWFyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdva19idXR0b25fY29sb3InXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JnX292ZXJsYXlfcmV2IGJyZHIgaG92X2JnJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyB3d3Bfd2Vla19idG5cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGUgb2Ygd2Vlay5kYXRlc1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid3dwX2RheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7ZGF0ZX19XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmdfb3ZlcmxheSBicmRyIGhyIG1hcl81XCI+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgc3BhY2VfYmV0d2VlblwiPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJjYW5TZWxlY3RMYXN0V2VlayQgfCBhc3luYyBlbHNlIGRpc2FibGVkTGFzdFdlZWtCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExhc3RXZWVrKClcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNtIGJnX292ZXJsYXlfcmV2IGJyZHIgbWFyXzUgaG92X2JnXCJcclxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RMYXN0V2Vla1wiPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1sZWZ0IG1hcl9yaWdodDVcIj48L2k+PHNwYW4gY2xhc3M9XCJ0ZXh0IGJvbGRcIj57e3RleHQubGFzdFdlZWt9fTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc2FibGVkTGFzdFdlZWtCdXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGRpc2FibGVkXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBtYXJfNVwiXHJcbiAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5zZWxlY3RMYXN0V2Vla1wiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWxlZnQgbWFyX3JpZ2h0NVwiPjwvaT48c3BhbiBjbGFzcz1cInRleHQgYm9sZFwiPnt7dGV4dC5sYXN0V2Vla319PC9zcGFuPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudERhdGUuc2VsZWN0YWJsZVwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIigoc2VsZWN0ZWRXZWVrJCB8IGFzeW5jKSA9PT0gY3VycmVudERhdGUud2VlaykgJiYgKChzZWxlY3RlZFllYXIkIHwgYXN5bmMpID09PSBjdXJyZW50RGF0ZS55ZWFyKSBlbHNlIHNlbGVjdEN1cnJlbnRXZWVrQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWRcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhY2Nlc3MgYnRuIHNtIG1hcl81XCJcclxuICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0ZXh0LnJlc2V0V2Vla1NlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS11bmRvLWFsdFwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RDdXJyZW50V2Vla0J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2VsZWN0Q3VycmVudFdlZWsoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgcGFydGljbGVUb29sdGlwPVwiUmVzZXQgdG8gQ3VycmVudCBXZWVrXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc20gYmdfb3ZlcmxheV9yZXYgYnJkciBob3ZfYmcgbWFyXzVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwidGV4dC5yZXNldFdlZWtTZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS11bmRvLWFsdFwiPjwvaT5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgICpuZ0lmPVwiY2FuU2VsZWN0TmV4dFdlZWskIHwgYXN5bmMgZWxzZSBkaXNhYmxlZE5leHRXZWVrQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3ROZXh0V2VlaygpXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWNjZXNzIGJ0biBzbSBiZ19vdmVybGF5X3JldiBicmRyIG1hcl81IGhvdl9iZ1wiXHJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0TmV4dFdlZWtcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dCBib2xkXCI+e3t0ZXh0Lm5leHRXZWVrfX08L3NwYW4+PGkgY2xhc3M9XCJmYXMgZmEtY2hldnJvbi1yaWdodCBtYXJfbGVmdDVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNhYmxlZE5leHRXZWVrQnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImFjY2VzcyBidG4gc20gbWFyXzVcIlxyXG4gICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRleHQuc2VsZWN0TmV4dFdlZWtcIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0IGJvbGRcIj57e3RleHQubmV4dFdlZWt9fTwvc3Bhbj48aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLXJpZ2h0IG1hcl9sZWZ0NVwiPjwvaT5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvcGFydGljbGUtcG9wb3Zlcj5cclxuIl19