@skyux/datetime 5.1.4 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README.md +6 -4
  2. package/bundles/skyux-datetime.umd.js +80 -80
  3. package/documentation.json +379 -22
  4. package/esm2015/index.js +28 -0
  5. package/esm2015/index.js.map +1 -0
  6. package/esm2015/lib/modules/date-pipe/date-format-utility.js +48 -0
  7. package/esm2015/lib/modules/date-pipe/date-format-utility.js.map +1 -0
  8. package/esm2015/lib/modules/date-pipe/date-pipe.module.js +21 -0
  9. package/esm2015/lib/modules/date-pipe/date-pipe.module.js.map +1 -0
  10. package/esm2015/lib/modules/date-pipe/date.pipe.js +65 -0
  11. package/esm2015/lib/modules/date-pipe/date.pipe.js.map +1 -0
  12. package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js +47 -0
  13. package/esm2015/lib/modules/date-pipe/fuzzy-date.pipe.js.map +1 -0
  14. package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js +464 -0
  15. package/esm2015/lib/modules/date-range-picker/date-range-picker.component.js.map +1 -0
  16. package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js +47 -0
  17. package/esm2015/lib/modules/date-range-picker/date-range-picker.module.js.map +1 -0
  18. package/esm2015/lib/modules/date-range-picker/date-range.service.js +97 -0
  19. package/esm2015/lib/modules/date-range-picker/date-range.service.js.map +1 -0
  20. package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js +2 -0
  21. package/esm2015/lib/modules/date-range-picker/types/date-range-calculation.js.map +1 -0
  22. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js +2 -0
  23. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-config.js.map +1 -0
  24. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js +2 -0
  25. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-date-range-function.js.map +1 -0
  26. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js +118 -0
  27. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-id.js.map +1 -0
  28. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js +23 -0
  29. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-type.js.map +1 -0
  30. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js +2 -0
  31. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator-validate-function.js.map +1 -0
  32. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js +56 -0
  33. package/esm2015/lib/modules/date-range-picker/types/date-range-calculator.js.map +1 -0
  34. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js +2 -0
  35. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-config.js.map +1 -0
  36. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js +147 -0
  37. package/esm2015/lib/modules/date-range-picker/types/date-range-default-calculator-configs.js.map +1 -0
  38. package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js +252 -0
  39. package/esm2015/lib/modules/date-range-picker/types/date-range-relative-value.js.map +1 -0
  40. package/esm2015/lib/modules/date-range-picker/types/date-range.js +2 -0
  41. package/esm2015/lib/modules/date-range-picker/types/date-range.js.map +1 -0
  42. package/esm2015/lib/modules/datepicker/date-formatter.js +38 -0
  43. package/esm2015/lib/modules/datepicker/date-formatter.js.map +1 -0
  44. package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js +33 -0
  45. package/esm2015/lib/modules/datepicker/datepicker-adapter.service.js.map +1 -0
  46. package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js +2 -0
  47. package/esm2015/lib/modules/datepicker/datepicker-calendar-change.js.map +1 -0
  48. package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js +315 -0
  49. package/esm2015/lib/modules/datepicker/datepicker-calendar-inner.component.js.map +1 -0
  50. package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js +109 -0
  51. package/esm2015/lib/modules/datepicker/datepicker-calendar.component.js.map +1 -0
  52. package/esm2015/lib/modules/datepicker/datepicker-config.service.js +21 -0
  53. package/esm2015/lib/modules/datepicker/datepicker-config.service.js.map +1 -0
  54. package/esm2015/lib/modules/datepicker/datepicker-custom-date.js +2 -0
  55. package/esm2015/lib/modules/datepicker/datepicker-custom-date.js.map +1 -0
  56. package/esm2015/lib/modules/datepicker/datepicker-date.js +2 -0
  57. package/esm2015/lib/modules/datepicker/datepicker-date.js.map +1 -0
  58. package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js +457 -0
  59. package/esm2015/lib/modules/datepicker/datepicker-input-fuzzy.directive.js.map +1 -0
  60. package/esm2015/lib/modules/datepicker/datepicker-input.directive.js +435 -0
  61. package/esm2015/lib/modules/datepicker/datepicker-input.directive.js.map +1 -0
  62. package/esm2015/lib/modules/datepicker/datepicker.component.js +333 -0
  63. package/esm2015/lib/modules/datepicker/datepicker.component.js.map +1 -0
  64. package/esm2015/lib/modules/datepicker/datepicker.module.js +95 -0
  65. package/esm2015/lib/modules/datepicker/datepicker.module.js.map +1 -0
  66. package/esm2015/lib/modules/datepicker/datepicker.service.js +21 -0
  67. package/esm2015/lib/modules/datepicker/datepicker.service.js.map +1 -0
  68. package/esm2015/lib/modules/datepicker/daypicker-button.component.js +26 -0
  69. package/esm2015/lib/modules/datepicker/daypicker-button.component.js.map +1 -0
  70. package/esm2015/lib/modules/datepicker/daypicker-cell.component.js +130 -0
  71. package/esm2015/lib/modules/datepicker/daypicker-cell.component.js.map +1 -0
  72. package/esm2015/lib/modules/datepicker/daypicker.component.js +215 -0
  73. package/esm2015/lib/modules/datepicker/daypicker.component.js.map +1 -0
  74. package/esm2015/lib/modules/datepicker/fuzzy-date.js +2 -0
  75. package/esm2015/lib/modules/datepicker/fuzzy-date.js.map +1 -0
  76. package/esm2015/lib/modules/datepicker/fuzzy-date.service.js +403 -0
  77. package/esm2015/lib/modules/datepicker/fuzzy-date.service.js.map +1 -0
  78. package/esm2015/lib/modules/datepicker/monthpicker.component.js +84 -0
  79. package/esm2015/lib/modules/datepicker/monthpicker.component.js.map +1 -0
  80. package/esm2015/lib/modules/datepicker/yearpicker.component.js +90 -0
  81. package/esm2015/lib/modules/datepicker/yearpicker.component.js.map +1 -0
  82. package/esm2015/lib/modules/shared/sky-datetime-resources.module.js +131 -0
  83. package/esm2015/lib/modules/shared/sky-datetime-resources.module.js.map +1 -0
  84. package/esm2015/lib/modules/timepicker/timepicker.component.js +367 -0
  85. package/esm2015/lib/modules/timepicker/timepicker.component.js.map +1 -0
  86. package/esm2015/lib/modules/timepicker/timepicker.directive.js +229 -0
  87. package/esm2015/lib/modules/timepicker/timepicker.directive.js.map +1 -0
  88. package/esm2015/lib/modules/timepicker/timepicker.interface.js +2 -0
  89. package/esm2015/lib/modules/timepicker/timepicker.interface.js.map +1 -0
  90. package/esm2015/lib/modules/timepicker/timepicker.module.js +46 -0
  91. package/esm2015/lib/modules/timepicker/timepicker.module.js.map +1 -0
  92. package/esm2015/skyux-datetime.js +2 -2
  93. package/esm2015/skyux-datetime.js.map +1 -0
  94. package/esm2015/testing/datepicker-fixture.js +1 -1
  95. package/esm2015/testing/datepicker-fixture.js.map +1 -0
  96. package/esm2015/testing/public-api.js +1 -1
  97. package/esm2015/testing/public-api.js.map +1 -0
  98. package/esm2015/testing/skyux-datetime-testing.js +1 -1
  99. package/esm2015/testing/skyux-datetime-testing.js.map +1 -0
  100. package/esm2015/testing/timepicker-fixture.js +1 -1
  101. package/esm2015/testing/timepicker-fixture.js.map +1 -0
  102. package/fesm2015/skyux-datetime-testing.js.map +1 -1
  103. package/fesm2015/skyux-datetime.js +301 -301
  104. package/fesm2015/skyux-datetime.js.map +1 -1
  105. package/index.d.ts +25 -0
  106. package/{modules → lib/modules}/date-pipe/date-format-utility.d.ts +0 -0
  107. package/{modules → lib/modules}/date-pipe/date-pipe.module.d.ts +0 -0
  108. package/{modules → lib/modules}/date-pipe/date.pipe.d.ts +0 -0
  109. package/{modules → lib/modules}/date-pipe/fuzzy-date.pipe.d.ts +0 -0
  110. package/{modules → lib/modules}/date-range-picker/date-range-picker.component.d.ts +0 -0
  111. package/{modules → lib/modules}/date-range-picker/date-range-picker.module.d.ts +0 -0
  112. package/{modules → lib/modules}/date-range-picker/date-range.service.d.ts +0 -0
  113. package/{modules → lib/modules}/date-range-picker/types/date-range-calculation.d.ts +0 -0
  114. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-config.d.ts +0 -0
  115. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-date-range-function.d.ts +0 -0
  116. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-id.d.ts +0 -0
  117. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-type.d.ts +0 -0
  118. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator-validate-function.d.ts +0 -0
  119. package/{modules → lib/modules}/date-range-picker/types/date-range-calculator.d.ts +0 -0
  120. package/{modules → lib/modules}/date-range-picker/types/date-range-default-calculator-config.d.ts +0 -0
  121. package/{modules → lib/modules}/date-range-picker/types/date-range-default-calculator-configs.d.ts +0 -0
  122. package/{modules → lib/modules}/date-range-picker/types/date-range-relative-value.d.ts +0 -0
  123. package/{modules → lib/modules}/date-range-picker/types/date-range.d.ts +0 -0
  124. package/{modules → lib/modules}/datepicker/date-formatter.d.ts +0 -0
  125. package/{modules → lib/modules}/datepicker/datepicker-adapter.service.d.ts +0 -0
  126. package/{modules → lib/modules}/datepicker/datepicker-calendar-change.d.ts +0 -0
  127. package/{modules → lib/modules}/datepicker/datepicker-calendar-inner.component.d.ts +0 -0
  128. package/{modules → lib/modules}/datepicker/datepicker-calendar.component.d.ts +0 -0
  129. package/{modules → lib/modules}/datepicker/datepicker-config.service.d.ts +0 -0
  130. package/{modules → lib/modules}/datepicker/datepicker-custom-date.d.ts +0 -0
  131. package/{modules → lib/modules}/datepicker/datepicker-date.d.ts +0 -0
  132. package/{modules → lib/modules}/datepicker/datepicker-input-fuzzy.directive.d.ts +0 -0
  133. package/{modules → lib/modules}/datepicker/datepicker-input.directive.d.ts +0 -0
  134. package/{modules → lib/modules}/datepicker/datepicker.component.d.ts +0 -0
  135. package/{modules → lib/modules}/datepicker/datepicker.module.d.ts +0 -0
  136. package/{modules → lib/modules}/datepicker/datepicker.service.d.ts +0 -0
  137. package/{modules → lib/modules}/datepicker/daypicker-button.component.d.ts +0 -0
  138. package/{modules → lib/modules}/datepicker/daypicker-cell.component.d.ts +0 -0
  139. package/{modules → lib/modules}/datepicker/daypicker.component.d.ts +0 -0
  140. package/{modules → lib/modules}/datepicker/fuzzy-date.d.ts +0 -0
  141. package/{modules → lib/modules}/datepicker/fuzzy-date.service.d.ts +0 -0
  142. package/{modules → lib/modules}/datepicker/monthpicker.component.d.ts +0 -0
  143. package/{modules → lib/modules}/datepicker/yearpicker.component.d.ts +0 -0
  144. package/{modules → lib/modules}/shared/sky-datetime-resources.module.d.ts +0 -0
  145. package/{modules → lib/modules}/timepicker/timepicker.component.d.ts +0 -0
  146. package/{modules → lib/modules}/timepicker/timepicker.directive.d.ts +0 -0
  147. package/{modules → lib/modules}/timepicker/timepicker.interface.d.ts +0 -0
  148. package/{modules → lib/modules}/timepicker/timepicker.module.d.ts +0 -0
  149. package/package.json +24 -10
  150. package/skyux-datetime.d.ts +1 -1
  151. package/LICENSE +0 -21
  152. package/bundles/skyux-datetime-testing.umd.js.map +0 -1
  153. package/bundles/skyux-datetime.umd.js.map +0 -1
  154. package/esm2015/modules/date-pipe/date-format-utility.js +0 -48
  155. package/esm2015/modules/date-pipe/date-pipe.module.js +0 -21
  156. package/esm2015/modules/date-pipe/date.pipe.js +0 -64
  157. package/esm2015/modules/date-pipe/fuzzy-date.pipe.js +0 -46
  158. package/esm2015/modules/date-range-picker/date-range-picker.component.js +0 -460
  159. package/esm2015/modules/date-range-picker/date-range-picker.module.js +0 -47
  160. package/esm2015/modules/date-range-picker/date-range.service.js +0 -96
  161. package/esm2015/modules/date-range-picker/types/date-range-calculation.js +0 -2
  162. package/esm2015/modules/date-range-picker/types/date-range-calculator-config.js +0 -2
  163. package/esm2015/modules/date-range-picker/types/date-range-calculator-date-range-function.js +0 -2
  164. package/esm2015/modules/date-range-picker/types/date-range-calculator-id.js +0 -118
  165. package/esm2015/modules/date-range-picker/types/date-range-calculator-type.js +0 -23
  166. package/esm2015/modules/date-range-picker/types/date-range-calculator-validate-function.js +0 -2
  167. package/esm2015/modules/date-range-picker/types/date-range-calculator.js +0 -56
  168. package/esm2015/modules/date-range-picker/types/date-range-default-calculator-config.js +0 -2
  169. package/esm2015/modules/date-range-picker/types/date-range-default-calculator-configs.js +0 -147
  170. package/esm2015/modules/date-range-picker/types/date-range-relative-value.js +0 -252
  171. package/esm2015/modules/date-range-picker/types/date-range.js +0 -2
  172. package/esm2015/modules/datepicker/date-formatter.js +0 -38
  173. package/esm2015/modules/datepicker/datepicker-adapter.service.js +0 -33
  174. package/esm2015/modules/datepicker/datepicker-calendar-change.js +0 -2
  175. package/esm2015/modules/datepicker/datepicker-calendar-inner.component.js +0 -315
  176. package/esm2015/modules/datepicker/datepicker-calendar.component.js +0 -108
  177. package/esm2015/modules/datepicker/datepicker-config.service.js +0 -21
  178. package/esm2015/modules/datepicker/datepicker-custom-date.js +0 -2
  179. package/esm2015/modules/datepicker/datepicker-date.js +0 -2
  180. package/esm2015/modules/datepicker/datepicker-input-fuzzy.directive.js +0 -453
  181. package/esm2015/modules/datepicker/datepicker-input.directive.js +0 -432
  182. package/esm2015/modules/datepicker/datepicker.component.js +0 -331
  183. package/esm2015/modules/datepicker/datepicker.module.js +0 -95
  184. package/esm2015/modules/datepicker/datepicker.service.js +0 -21
  185. package/esm2015/modules/datepicker/daypicker-button.component.js +0 -25
  186. package/esm2015/modules/datepicker/daypicker-cell.component.js +0 -128
  187. package/esm2015/modules/datepicker/daypicker.component.js +0 -214
  188. package/esm2015/modules/datepicker/fuzzy-date.js +0 -2
  189. package/esm2015/modules/datepicker/fuzzy-date.service.js +0 -402
  190. package/esm2015/modules/datepicker/monthpicker.component.js +0 -83
  191. package/esm2015/modules/datepicker/yearpicker.component.js +0 -89
  192. package/esm2015/modules/shared/sky-datetime-resources.module.js +0 -131
  193. package/esm2015/modules/timepicker/timepicker.component.js +0 -365
  194. package/esm2015/modules/timepicker/timepicker.directive.js +0 -227
  195. package/esm2015/modules/timepicker/timepicker.interface.js +0 -2
  196. package/esm2015/modules/timepicker/timepicker.module.js +0 -46
  197. package/esm2015/public-api.js +0 -28
  198. package/public-api.d.ts +0 -25
@@ -1,365 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Optional, Output, TemplateRef, ViewChild, ViewEncapsulation, } from '@angular/core';
2
- import { SkyAffixAutoFitContext, } from '@skyux/core';
3
- import { fromEvent, Subject } from 'rxjs';
4
- import { takeUntil } from 'rxjs/operators';
5
- import moment from 'moment';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@skyux/core";
8
- import * as i2 from "@skyux/forms";
9
- import * as i3 from "@skyux/theme";
10
- import * as i4 from "@skyux/indicators";
11
- import * as i5 from "@angular/common";
12
- import * as i6 from "@skyux/i18n";
13
- let nextId = 0;
14
- /**
15
- * Creates a SKY UX-themed replacement for the HTML `input` element with `type="time"`.
16
- * The value that users select is driven through the `ngModel` attribute
17
- * specified on the `input` element. You must wrap this component around an `input`
18
- * with the `skyTimepickerInput` directive.
19
- */
20
- export class SkyTimepickerComponent {
21
- constructor(affixService, changeDetector, coreAdapter, overlayService, inputBoxHostService, themeSvc) {
22
- this.affixService = affixService;
23
- this.changeDetector = changeDetector;
24
- this.coreAdapter = coreAdapter;
25
- this.overlayService = overlayService;
26
- this.inputBoxHostService = inputBoxHostService;
27
- /**
28
- * Fires when the value in the timepicker input changes.
29
- */
30
- this.selectedTimeChanged = new EventEmitter();
31
- this.is8601 = false;
32
- this.timeFormat = 'hh';
33
- this.ngUnsubscribe = new Subject();
34
- const uniqueId = nextId++;
35
- this.timepickerId = `sky-timepicker-${uniqueId}`;
36
- this.triggerButtonId = `sky-timepicker-button-${uniqueId}`;
37
- // Update icons when theme changes.
38
- themeSvc === null || themeSvc === void 0 ? void 0 : themeSvc.settingsChange.pipe(takeUntil(this.ngUnsubscribe)).subscribe(() => {
39
- this.changeDetector.markForCheck();
40
- });
41
- }
42
- set disabled(value) {
43
- this._disabled = value;
44
- this.changeDetector.markForCheck();
45
- }
46
- get disabled() {
47
- return this._disabled;
48
- }
49
- set selectedHour(setHour) {
50
- let hour;
51
- let hourOffset = 0;
52
- if (this.selectedMeridies === 'AM' && setHour === 12) {
53
- hourOffset = -12;
54
- }
55
- if (this.selectedMeridies === 'PM' && setHour !== 12) {
56
- hourOffset = 12;
57
- }
58
- if (this.is8601) {
59
- hourOffset = 0;
60
- }
61
- hour = moment({ hour: setHour }).add(hourOffset, 'hours').hour();
62
- this.activeTime = moment({
63
- hour: hour,
64
- minute: moment(this.activeTime).get('minute') + 0,
65
- }).toDate();
66
- this.selectedTimeChanged.emit(this.selectedTime);
67
- }
68
- get selectedHour() {
69
- if (!this.is8601) {
70
- /* istanbul ignore next */
71
- return parseInt(moment(this.activeTime).format('h'), 0) || 1;
72
- }
73
- /* istanbul ignore else */
74
- if (this.is8601) {
75
- return moment(this.activeTime).hour() + 0;
76
- }
77
- }
78
- set selectedMeridies(meridies) {
79
- /* istanbul ignore else */
80
- if (!this.is8601) {
81
- if (meridies.trim() !== this.selectedMeridies) {
82
- this.activeTime = moment(this.activeTime).add(12, 'hours').toDate();
83
- this.selectedTimeChanged.emit(this.selectedTime);
84
- }
85
- }
86
- }
87
- get selectedMeridies() {
88
- if (this.activeTime) {
89
- return moment(this.activeTime).format('A');
90
- }
91
- return '';
92
- }
93
- set selectedMinute(minute) {
94
- this.activeTime = moment({
95
- hour: moment(this.activeTime).get('hour') + 0,
96
- minute: minute,
97
- }).toDate();
98
- this.selectedTimeChanged.emit(this.selectedTime);
99
- }
100
- get selectedMinute() {
101
- return moment(this.activeTime).minute() + 0;
102
- }
103
- set selectedTime(newTime) {
104
- if (typeof newTime !== 'undefined') {
105
- /* sanity check */
106
- /* istanbul ignore else */
107
- if (newTime.local !== 'Invalid date') {
108
- this.activeTime = newTime.iso8601;
109
- this.changeDetector.markForCheck();
110
- }
111
- }
112
- }
113
- get selectedTime() {
114
- const time = {
115
- hour: moment(this.activeTime).hour(),
116
- minute: moment(this.activeTime).minute(),
117
- meridie: moment(this.activeTime).format('A'),
118
- timezone: parseInt(moment(this.activeTime).format('Z'), 10),
119
- iso8601: this.activeTime,
120
- local: moment(this.activeTime).format(this.localeFormat),
121
- customFormat: typeof this.returnFormat !== 'undefined'
122
- ? this.returnFormat
123
- : this.localeFormat,
124
- };
125
- return time;
126
- }
127
- set timepickerRef(value) {
128
- if (value) {
129
- this._timepickerRef = value;
130
- // Wait for the timepicker component to render before guaging dimensions.
131
- setTimeout(() => {
132
- this.destroyAffixer();
133
- this.createAffixer();
134
- setTimeout(() => {
135
- this.coreAdapter.getFocusableChildrenAndApplyFocus(this.timepickerRef, '.sky-timepicker-content', false);
136
- this.isVisible = true;
137
- this.changeDetector.markForCheck();
138
- });
139
- });
140
- }
141
- }
142
- get timepickerRef() {
143
- return this._timepickerRef;
144
- }
145
- ngOnInit() {
146
- this.setFormat(this.timeFormat);
147
- this.addKeydownListner();
148
- if (this.inputBoxHostService) {
149
- this.inputBoxHostService.populate({
150
- inputTemplate: this.inputTemplateRef,
151
- buttonsTemplate: this.triggerButtonTemplateRef,
152
- });
153
- }
154
- }
155
- ngOnDestroy() {
156
- this.ngUnsubscribe.next();
157
- this.ngUnsubscribe.complete();
158
- this.removePickerEventListeners();
159
- this.destroyAffixer();
160
- this.destroyOverlay();
161
- }
162
- setFormat(format) {
163
- let h = 12;
164
- let m = 12;
165
- let minuteMultiplier = 5;
166
- let localeFormat = 'h:mm A';
167
- if (format === 'hh') {
168
- h = 12;
169
- m = 12;
170
- minuteMultiplier = 5;
171
- localeFormat = 'h:mm A';
172
- this.is8601 = false;
173
- }
174
- if (format === 'HH') {
175
- h = 24;
176
- m = 4;
177
- minuteMultiplier = 15;
178
- localeFormat = 'HH:mm';
179
- this.is8601 = true;
180
- }
181
- let data;
182
- data = {
183
- hours: Array.apply(undefined, Array(h)).map(function (x, i) {
184
- if (format === 'hh') {
185
- return ++i;
186
- }
187
- /* istanbul ignore else */
188
- if (format === 'HH') {
189
- return i;
190
- }
191
- /* istanbul ignore next */
192
- /* sanity check */
193
- return 0;
194
- }),
195
- minutes: Array.apply(undefined, Array(m)).map(function (x, i) {
196
- return i * minuteMultiplier;
197
- }),
198
- localeFormat: localeFormat,
199
- minuteMultiplier: minuteMultiplier,
200
- };
201
- this.hours = data.hours;
202
- this.minutes = data.minutes;
203
- this.localeFormat = data.localeFormat;
204
- this.minuteMultiplier = data.minuteMultiplier;
205
- }
206
- onCloseButtonCick() {
207
- this.closePicker();
208
- }
209
- setTime(event) {
210
- /* istanbul ignore else */
211
- if (typeof event !== 'undefined') {
212
- /* istanbul ignore else */
213
- if (event.type === 'click') {
214
- event.stopPropagation();
215
- if (event.target.name === 'hour') {
216
- this.selectedHour = parseInt(event.target.innerHTML, 0);
217
- }
218
- if (event.target.name === 'minute') {
219
- this.selectedMinute = parseInt(event.target.innerHTML, 0);
220
- }
221
- if (event.target.name === 'meridie') {
222
- this.selectedMeridies = event.target.innerHTML;
223
- }
224
- }
225
- }
226
- }
227
- onTriggerButtonClick() {
228
- this.openPicker();
229
- }
230
- closePicker() {
231
- this.destroyAffixer();
232
- this.destroyOverlay();
233
- this.removePickerEventListeners();
234
- this.triggerButtonRef.nativeElement.focus();
235
- this.isOpen = false;
236
- }
237
- openPicker() {
238
- this.isVisible = false;
239
- this.changeDetector.markForCheck();
240
- this.removePickerEventListeners();
241
- this.timepickerUnsubscribe = new Subject();
242
- this.destroyOverlay();
243
- this.createOverlay();
244
- this.isOpen = true;
245
- this.changeDetector.markForCheck();
246
- }
247
- createAffixer() {
248
- const affixer = this.affixService.createAffixer(this.timepickerRef);
249
- // Hide timepicker when trigger button is scrolled off screen.
250
- affixer.placementChange
251
- .pipe(takeUntil(this.timepickerUnsubscribe))
252
- .subscribe((change) => {
253
- this.isVisible = change.placement !== null;
254
- this.changeDetector.markForCheck();
255
- });
256
- affixer.affixTo(this.triggerButtonRef.nativeElement, {
257
- autoFitContext: SkyAffixAutoFitContext.Viewport,
258
- enableAutoFit: true,
259
- horizontalAlignment: 'right',
260
- isSticky: true,
261
- placement: 'below',
262
- });
263
- this.affixer = affixer;
264
- }
265
- destroyAffixer() {
266
- /*istanbul ignore else*/
267
- if (this.affixer) {
268
- this.affixer.destroy();
269
- this.affixer = undefined;
270
- }
271
- }
272
- createOverlay() {
273
- const overlay = this.overlayService.create({
274
- enableClose: false,
275
- enablePointerEvents: false,
276
- });
277
- overlay.backdropClick
278
- .pipe(takeUntil(this.timepickerUnsubscribe))
279
- .subscribe(() => {
280
- /* istanbul ignore else */
281
- if (this.isOpen) {
282
- this.closePicker();
283
- }
284
- });
285
- this.addKeydownListner();
286
- overlay.attachTemplate(this.timepickerTemplateRef);
287
- this.overlay = overlay;
288
- }
289
- destroyOverlay() {
290
- /*istanbul ignore else*/
291
- if (this.overlay) {
292
- this.overlayService.close(this.overlay);
293
- this.overlay = undefined;
294
- }
295
- }
296
- addKeydownListner() {
297
- this.overlayKeydownListner = fromEvent(window.document, 'keydown')
298
- .pipe(takeUntil(this.ngUnsubscribe))
299
- .subscribe((event) => {
300
- var _a;
301
- const key = (_a = event.key) === null || _a === void 0 ? void 0 : _a.toLowerCase();
302
- /* istanbul ignore else */
303
- if (key === 'escape' && this.isOpen) {
304
- this.closePicker();
305
- }
306
- });
307
- }
308
- removePickerEventListeners() {
309
- var _a;
310
- /* istanbul ignore else */
311
- if (this.timepickerUnsubscribe) {
312
- this.timepickerUnsubscribe.next();
313
- this.timepickerUnsubscribe.complete();
314
- this.timepickerUnsubscribe = undefined;
315
- }
316
- /* istanbul ignore next */
317
- (_a = this.overlayKeydownListner) === null || _a === void 0 ? void 0 : _a.unsubscribe();
318
- }
319
- }
320
- SkyTimepickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.14", ngImport: i0, type: SkyTimepickerComponent, deps: [{ token: i1.SkyAffixService }, { token: i0.ChangeDetectorRef }, { token: i1.SkyCoreAdapterService }, { token: i1.SkyOverlayService }, { token: i2.SkyInputBoxHostService, optional: true }, { token: i3.SkyThemeService, optional: true }], target: i0.ɵɵFactoryTarget.Component });
321
- SkyTimepickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.14", type: SkyTimepickerComponent, selector: "sky-timepicker", outputs: { selectedTimeChanged: "selectedTimeChanged" }, viewQueries: [{ propertyName: "timepickerRef", first: true, predicate: ["timepickerRef"], descendants: true, read: ElementRef }, { propertyName: "timepickerTemplateRef", first: true, predicate: ["timepickerTemplateRef"], descendants: true, read: TemplateRef }, { propertyName: "triggerButtonRef", first: true, predicate: ["triggerButtonRef"], descendants: true, read: ElementRef }, { propertyName: "inputTemplateRef", first: true, predicate: ["inputTemplateRef"], descendants: true, read: TemplateRef, static: true }, { propertyName: "triggerButtonTemplateRef", first: true, predicate: ["triggerButtonTemplateRef"], descendants: true, read: TemplateRef, static: true }], ngImport: i0, template: "<div class=\"sky-timepicker\">\n <ng-container *ngIf=\"!inputBoxHostService\">\n <div class=\"sky-input-group\">\n <ng-container *ngTemplateOutlet=\"inputTemplateRef\"></ng-container>\n <ng-container *ngTemplateOutlet=\"triggerButtonTemplateRef\"></ng-container>\n </div>\n </ng-container>\n</div>\n\n<ng-template #inputTemplateRef>\n <ng-content></ng-content>\n</ng-template>\n\n<ng-template #triggerButtonTemplateRef>\n <div class=\"sky-input-group-btn\">\n <button\n aria-haspopup=\"dialog\"\n class=\"sky-btn sky-btn-default sky-input-group-timepicker-btn\"\n type=\"button\"\n [attr.aria-controls]=\"isOpen ? timepickerId : null\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-label]=\"'skyux_timepicker_button_label' | skyLibResources\"\n [attr.id]=\"triggerButtonId\"\n [attr.title]=\"'skyux_timepicker_button_label' | skyLibResources\"\n [disabled]=\"disabled\"\n (click)=\"onTriggerButtonClick()\"\n #triggerButtonRef\n >\n <sky-icon *skyThemeIf=\"'default'\" icon=\"clock-o\" size=\"lg\"></sky-icon>\n <sky-icon\n *skyThemeIf=\"'modern'\"\n icon=\"clock\"\n size=\"lg\"\n iconType=\"skyux\"\n ></sky-icon>\n </button>\n </div>\n</ng-template>\n\n<ng-template #timepickerTemplateRef>\n <div\n class=\"sky-timepicker-container sky-shadow sky-box sky-elevation-4\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"triggerButtonId\"\n [attr.id]=\"timepickerId\"\n [class.sky-timepicker-hidden]=\"!isVisible\"\n #timepickerRef\n >\n <div class=\"sky-timepicker-content\">\n <section\n class=\"sky-timepicker-column\"\n [ngClass]=\"{ 'sky-timepicker-24hour': is8601 }\"\n >\n <ol>\n <li *ngFor=\"let hour of hours\">\n <button\n name=\"hour\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedHour === hour }\"\n (click)=\"setTime($event)\"\n >\n {{ hour }}\n </button>\n </li>\n </ol>\n </section>\n <section class=\"sky-timepicker-column\">\n <ol>\n <li *ngFor=\"let minute of minutes\">\n <button\n name=\"minute\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMinute === minute }\"\n (click)=\"setTime($event)\"\n >\n {{ '00'.substring(0, 2 - minute.toString().length) + minute }}\n </button>\n </li>\n </ol>\n </section>\n <section *ngIf=\"!is8601\" class=\"sky-timepicker-column\">\n <ol>\n <li>\n <button\n name=\"meridie\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMeridies === 'AM' }\"\n (click)=\"setTime($event)\"\n >\n AM\n </button>\n </li>\n <li>\n <button\n name=\"meridie\"\n type=\"button\"\n [ngClass]=\"{ 'sky-btn-active': selectedMeridies === 'PM' }\"\n (click)=\"setTime($event)\"\n >\n PM\n </button>\n </li>\n </ol>\n </section>\n </div>\n <div class=\"sky-timepicker-footer\">\n <section class=\"sky-timepicker-column\">\n <button\n class=\"sky-btn sky-btn-primary\"\n type=\"button\"\n (click)=\"onCloseButtonCick()\"\n >\n {{ 'skyux_timepicker_close' | skyLibResources }}\n </button>\n </section>\n </div>\n </div>\n</ng-template>\n", styles: [".sky-timepicker-container{position:fixed;font-size:15px;padding:5px;background-color:#eeeeef;border-radius:5px}.sky-timepicker-container :last-child ol{display:flex;flex-direction:column;height:100%}.sky-timepicker-container :last-child ol li{border-bottom:1px solid #e2e3e4;flex:1}.sky-timepicker-column{margin:5px}.sky-timepicker-column ol{border-top:1px solid #e2e3e4;border-right:1px solid #e2e3e4;border-bottom:1px solid #e2e3e4;border-left:1px solid #e2e3e4;grid-column-gap:1px;column-gap:1px;columns:2;list-style-type:none;margin:0;padding:0}.sky-timepicker-column ol li{text-align:center;cursor:pointer;margin:0}.sky-timepicker-column ol li button{cursor:pointer}.sky-timepicker-column ol li button:focus{outline:thin dotted;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.sky-timepicker-column ol li button:hover{background-color:#eeeeef}.sky-timepicker-column ol li button:active{background-color:#e2e3e4}.sky-timepicker-column ol li button.sky-btn-active:hover{background-color:#c1e8fb}.sky-timepicker-column ol .sky-btn-active{background-color:#c1e8fb;box-shadow:inset 0 0 0 2px #00b4f1;border-radius:3px}.sky-timepicker-column.sky-timepicker-24hour ol{columns:4}.sky-timepicker-column.sky-timepicker-24hour ol li{border-bottom-width:0}.sky-timepicker-content{display:flex}.sky-timepicker-content button{background-color:#fff;border-width:0;padding:5px 15px;width:100%;height:100%}.sky-timepicker-footer{margin:0;padding:0 5px}.sky-timepicker-footer .sky-timepicker-column{margin-left:0;margin-right:0;width:100%}.sky-timepicker-hidden{visibility:hidden}.sky-timepicker-clock-icon-modern{display:none}.sky-theme-modern .sky-timepicker-clock-icon-default{display:none}.sky-theme-modern .sky-timepicker-clock-icon-modern{display:inline}.sky-theme-modern .sky-timepicker-container{background-color:#fff;border:solid 1px #cdcfd2;border-radius:6px;font-size:16px}.sky-theme-modern .sky-timepicker-container:focus-within{border:solid 2px #1870B8;padding:4px}.sky-theme-modern .sky-timepicker-container:last-child ol li{border-bottom:none}.sky-theme-modern .sky-timepicker-container .sky-timepicker-column ol .sky-btn-default{border-width:1px;border-color:transparent;padding:4px 6px;outline:none}.sky-theme-modern .sky-timepicker-container .sky-timepicker-column ol button:hover:not(.sky-btn-active){background-color:transparent}.sky-theme-modern .sky-timepicker-container .sky-timepicker-column ol .sky-btn-active,.sky-theme-modern .sky-timepicker-container .sky-timepicker-column ol button:hover{box-shadow:inset 0 0 0 1px #00b4f1;border-radius:6px}.sky-theme-modern .sky-timepicker-container .sky-timepicker-column ol button:active,.sky-theme-modern .sky-timepicker-container .sky-timepicker-column ol button:focus{outline:none;border-radius:6px;box-shadow:inset 0 0 0 2px #1870b8}.sky-theme-modern.sky-theme-mode-dark .sky-timepicker-container{color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-timepicker-container:not(:focus-within){border-color:#686c73}.sky-theme-modern.sky-theme-mode-dark .sky-timepicker-column ol{border-color:#686c73}.sky-theme-modern.sky-theme-mode-dark .sky-timepicker-column ol button{background-color:transparent;color:#fbfcfe}.sky-theme-modern.sky-theme-mode-dark .sky-timepicker-column ol .sky-btn-active{background-color:#009cd1}\n"], components: [{ type: i4.λ4, selector: "sky-icon", inputs: ["icon", "iconType", "size", "fixedWidth", "variant"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i3.λ3, selector: "[skyThemeIf]", inputs: ["skyThemeIf"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "skyLibResources": i6.SkyLibResourcesPipe }, changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
322
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.14", ngImport: i0, type: SkyTimepickerComponent, decorators: [{
323
- type: Component,
324
- args: [{
325
- selector: 'sky-timepicker',
326
- templateUrl: './timepicker.component.html',
327
- styleUrls: ['./timepicker.component.scss'],
328
- encapsulation: ViewEncapsulation.None,
329
- changeDetection: ChangeDetectionStrategy.OnPush,
330
- }]
331
- }], ctorParameters: function () { return [{ type: i1.SkyAffixService }, { type: i0.ChangeDetectorRef }, { type: i1.SkyCoreAdapterService }, { type: i1.SkyOverlayService }, { type: i2.SkyInputBoxHostService, decorators: [{
332
- type: Optional
333
- }] }, { type: i3.SkyThemeService, decorators: [{
334
- type: Optional
335
- }] }]; }, propDecorators: { selectedTimeChanged: [{
336
- type: Output
337
- }], timepickerRef: [{
338
- type: ViewChild,
339
- args: ['timepickerRef', {
340
- read: ElementRef,
341
- }]
342
- }], timepickerTemplateRef: [{
343
- type: ViewChild,
344
- args: ['timepickerTemplateRef', {
345
- read: TemplateRef,
346
- }]
347
- }], triggerButtonRef: [{
348
- type: ViewChild,
349
- args: ['triggerButtonRef', {
350
- read: ElementRef,
351
- }]
352
- }], inputTemplateRef: [{
353
- type: ViewChild,
354
- args: ['inputTemplateRef', {
355
- read: TemplateRef,
356
- static: true,
357
- }]
358
- }], triggerButtonTemplateRef: [{
359
- type: ViewChild,
360
- args: ['triggerButtonTemplateRef', {
361
- read: TemplateRef,
362
- static: true,
363
- }]
364
- }] } });
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRldGltZS9zcmMvbW9kdWxlcy90aW1lcGlja2VyL3RpbWVwaWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGF0ZXRpbWUvc3JjL21vZHVsZXMvdGltZXBpY2tlci90aW1lcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBR1osUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0wsc0JBQXNCLEdBTXZCLE1BQU0sYUFBYSxDQUFDO0FBTXJCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUV4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJM0MsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7Ozs7OztBQUU1QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFFZjs7Ozs7R0FLRztBQVFILE1BQU0sT0FBTyxzQkFBc0I7SUFtTWpDLFlBQ1UsWUFBNkIsRUFDN0IsY0FBaUMsRUFDakMsV0FBa0MsRUFDbEMsY0FBaUMsRUFDdEIsbUJBQTRDLEVBQ25ELFFBQTBCO1FBTDlCLGlCQUFZLEdBQVosWUFBWSxDQUFpQjtRQUM3QixtQkFBYyxHQUFkLGNBQWMsQ0FBbUI7UUFDakMsZ0JBQVcsR0FBWCxXQUFXLENBQXVCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXlCO1FBdk1qRTs7V0FFRztRQUVJLHdCQUFtQixHQUEwQyxJQUFJLFlBQVksRUFB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LGVBQWUsRUFBRTt3QkFDMUIsSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO2dCQStCTyxxQkFBcUI7c0JBSDVCLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUU7d0JBQ2xDLElBQUksRUFBRSxXQUFXO3FCQUNsQjtnQkFNTyxnQkFBZ0I7c0JBSHZCLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUU7d0JBQzdCLElBQUksRUFBRSxVQUFVO3FCQUNqQjtnQkFPTyxnQkFBZ0I7c0JBSnZCLFNBQVM7dUJBQUMsa0JBQWtCLEVBQUU7d0JBQzdCLElBQUksRUFBRSxXQUFXO3dCQUNqQixNQUFNLEVBQUUsSUFBSTtxQkFDYjtnQkFPTyx3QkFBd0I7c0JBSi9CLFNBQVM7dUJBQUMsMEJBQTBCLEVBQUU7d0JBQ3JDLElBQUksRUFBRSxXQUFXO3dCQUNqQixNQUFNLEVBQUUsSUFBSTtxQkFDYiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7XG4gIFNreUFmZml4QXV0b0ZpdENvbnRleHQsXG4gIFNreUFmZml4ZXIsXG4gIFNreUFmZml4U2VydmljZSxcbiAgU2t5Q29yZUFkYXB0ZXJTZXJ2aWNlLFxuICBTa3lPdmVybGF5SW5zdGFuY2UsXG4gIFNreU92ZXJsYXlTZXJ2aWNlLFxufSBmcm9tICdAc2t5dXgvY29yZSc7XG5cbmltcG9ydCB7IFNreUlucHV0Qm94SG9zdFNlcnZpY2UgfSBmcm9tICdAc2t5dXgvZm9ybXMnO1xuXG5pbXBvcnQgeyBTa3lUaGVtZVNlcnZpY2UgfSBmcm9tICdAc2t5dXgvdGhlbWUnO1xuXG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFNreVRpbWVwaWNrZXJUaW1lT3V0cHV0IH0gZnJvbSAnLi90aW1lcGlja2VyLmludGVyZmFjZSc7XG5cbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQ3JlYXRlcyBhIFNLWSBVWC10aGVtZWQgcmVwbGFjZW1lbnQgZm9yIHRoZSBIVE1MIGBpbnB1dGAgZWxlbWVudCB3aXRoIGB0eXBlPVwidGltZVwiYC5cbiAqIFRoZSB2YWx1ZSB0aGF0IHVzZXJzIHNlbGVjdCBpcyBkcml2ZW4gdGhyb3VnaCB0aGUgYG5nTW9kZWxgIGF0dHJpYnV0ZVxuICogc3BlY2lmaWVkIG9uIHRoZSBgaW5wdXRgIGVsZW1lbnQuIFlvdSBtdXN0IHdyYXAgdGhpcyBjb21wb25lbnQgYXJvdW5kIGFuIGBpbnB1dGBcbiAqIHdpdGggdGhlIGBza3lUaW1lcGlja2VySW5wdXRgIGRpcmVjdGl2ZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2t5LXRpbWVwaWNrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGltZXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3RpbWVwaWNrZXIuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNreVRpbWVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB2YWx1ZSBpbiB0aGUgdGltZXBpY2tlciBpbnB1dCBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZFRpbWVDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8U2t5VGltZXBpY2tlclRpbWVPdXRwdXQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxTa3lUaW1lcGlja2VyVGltZU91dHB1dD4oKTtcblxuICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHVibGljIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlbGVjdGVkSG91cihzZXRIb3VyOiBudW1iZXIpIHtcbiAgICBsZXQgaG91cjogbnVtYmVyO1xuICAgIGxldCBob3VyT2Zmc2V0OiBudW1iZXIgPSAwO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkTWVyaWRpZXMgPT09ICdBTScgJiYgc2V0SG91ciA9PT0gMTIpIHtcbiAgICAgIGhvdXJPZmZzZXQgPSAtMTI7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkTWVyaWRpZXMgPT09ICdQTScgJiYgc2V0SG91ciAhPT0gMTIpIHtcbiAgICAgIGhvdXJPZmZzZXQgPSAxMjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXM4NjAxKSB7XG4gICAgICBob3VyT2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgaG91ciA9IG1vbWVudCh7IGhvdXI6IHNldEhvdXIgfSkuYWRkKGhvdXJPZmZzZXQsICdob3VycycpLmhvdXIoKTtcblxuICAgIHRoaXMuYWN0aXZlVGltZSA9IG1vbWVudCh7XG4gICAgICBob3VyOiBob3VyLFxuICAgICAgbWludXRlOiBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5nZXQoJ21pbnV0ZScpICsgMCxcbiAgICB9KS50b0RhdGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkVGltZUNoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkVGltZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkSG91cigpOiBudW1iZXIge1xuICAgIGlmICghdGhpcy5pczg2MDEpIHtcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICByZXR1cm4gcGFyc2VJbnQobW9tZW50KHRoaXMuYWN0aXZlVGltZSkuZm9ybWF0KCdoJyksIDApIHx8IDE7XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuaXM4NjAxKSB7XG4gICAgICByZXR1cm4gbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuaG91cigpICsgMDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlbGVjdGVkTWVyaWRpZXMobWVyaWRpZXM6IHN0cmluZykge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCF0aGlzLmlzODYwMSkge1xuICAgICAgaWYgKG1lcmlkaWVzLnRyaW0oKSAhPT0gdGhpcy5zZWxlY3RlZE1lcmlkaWVzKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGltZSA9IG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmFkZCgxMiwgJ2hvdXJzJykudG9EYXRlKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRUaW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbGVjdGVkTWVyaWRpZXMoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5hY3RpdmVUaW1lKSB7XG4gICAgICByZXR1cm4gbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuZm9ybWF0KCdBJyk7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2VsZWN0ZWRNaW51dGUobWludXRlOiBudW1iZXIpIHtcbiAgICB0aGlzLmFjdGl2ZVRpbWUgPSBtb21lbnQoe1xuICAgICAgaG91cjogbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuZ2V0KCdob3VyJykgKyAwLFxuICAgICAgbWludXRlOiBtaW51dGUsXG4gICAgfSkudG9EYXRlKCk7XG4gICAgdGhpcy5zZWxlY3RlZFRpbWVDaGFuZ2VkLmVtaXQodGhpcy5zZWxlY3RlZFRpbWUpO1xuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZE1pbnV0ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5taW51dGUoKSArIDA7XG4gIH1cblxuICBwdWJsaWMgc2V0IHNlbGVjdGVkVGltZShuZXdUaW1lOiBTa3lUaW1lcGlja2VyVGltZU91dHB1dCkge1xuICAgIGlmICh0eXBlb2YgbmV3VGltZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8qIHNhbml0eSBjaGVjayAqL1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChuZXdUaW1lLmxvY2FsICE9PSAnSW52YWxpZCBkYXRlJykge1xuICAgICAgICB0aGlzLmFjdGl2ZVRpbWUgPSBuZXdUaW1lLmlzbzg2MDE7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzZWxlY3RlZFRpbWUoKTogU2t5VGltZXBpY2tlclRpbWVPdXRwdXQge1xuICAgIGNvbnN0IHRpbWU6IFNreVRpbWVwaWNrZXJUaW1lT3V0cHV0ID0ge1xuICAgICAgaG91cjogbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuaG91cigpLFxuICAgICAgbWludXRlOiBtb21lbnQodGhpcy5hY3RpdmVUaW1lKS5taW51dGUoKSxcbiAgICAgIG1lcmlkaWU6IG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmZvcm1hdCgnQScpLFxuICAgICAgdGltZXpvbmU6IHBhcnNlSW50KG1vbWVudCh0aGlzLmFjdGl2ZVRpbWUpLmZvcm1hdCgnWicpLCAxMCksXG4gICAgICBpc284NjAxOiB0aGlzLmFjdGl2ZVRpbWUsXG4gICAgICBsb2NhbDogbW9tZW50KHRoaXMuYWN0aXZlVGltZSkuZm9ybWF0KHRoaXMubG9jYWxlRm9ybWF0KSxcbiAgICAgIGN1c3RvbUZvcm1hdDpcbiAgICAgICAgdHlwZW9mIHRoaXMucmV0dXJuRm9ybWF0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgID8gdGhpcy5yZXR1cm5Gb3JtYXRcbiAgICAgICAgICA6IHRoaXMubG9jYWxlRm9ybWF0LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGltZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmVUaW1lOiBEYXRlO1xuXG4gIHB1YmxpYyBob3VyczogQXJyYXk8bnVtYmVyPjtcblxuICBwdWJsaWMgaXM4NjAxOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHVibGljIGlzT3BlbjogYm9vbGVhbjtcblxuICBwdWJsaWMgaXNWaXNpYmxlOiBib29sZWFuO1xuXG4gIHB1YmxpYyBsb2NhbGVGb3JtYXQ6IHN0cmluZztcblxuICBwdWJsaWMgbWludXRlczogQXJyYXk8bnVtYmVyPjtcblxuICBwdWJsaWMgbWludXRlTXVsdGlwbGllcjogbnVtYmVyO1xuXG4gIHB1YmxpYyByZXR1cm5Gb3JtYXQ6IHN0cmluZztcblxuICBwdWJsaWMgdGltZUZvcm1hdDogc3RyaW5nID0gJ2hoJztcblxuICBwdWJsaWMgdGltZXBpY2tlcklkOiBzdHJpbmc7XG5cbiAgcHVibGljIHRyaWdnZXJCdXR0b25JZDogc3RyaW5nO1xuXG4gIEBWaWV3Q2hpbGQoJ3RpbWVwaWNrZXJSZWYnLCB7XG4gICAgcmVhZDogRWxlbWVudFJlZixcbiAgfSlcbiAgcHJpdmF0ZSBzZXQgdGltZXBpY2tlclJlZih2YWx1ZTogRWxlbWVudFJlZikge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgdGhpcy5fdGltZXBpY2tlclJlZiA9IHZhbHVlO1xuXG4gICAgICAvLyBXYWl0IGZvciB0aGUgdGltZXBpY2tlciBjb21wb25lbnQgdG8gcmVuZGVyIGJlZm9yZSBndWFnaW5nIGRpbWVuc2lvbnMuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kZXN0cm95QWZmaXhlcigpO1xuICAgICAgICB0aGlzLmNyZWF0ZUFmZml4ZXIoKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmNvcmVBZGFwdGVyLmdldEZvY3VzYWJsZUNoaWxkcmVuQW5kQXBwbHlGb2N1cyhcbiAgICAgICAgICAgIHRoaXMudGltZXBpY2tlclJlZixcbiAgICAgICAgICAgICcuc2t5LXRpbWVwaWNrZXItY29udGVudCcsXG4gICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCB0aW1lcGlja2VyUmVmKCk6IEVsZW1lbnRSZWYge1xuICAgIHJldHVybiB0aGlzLl90aW1lcGlja2VyUmVmO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgndGltZXBpY2tlclRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICB9KVxuICBwcml2YXRlIHRpbWVwaWNrZXJUZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAVmlld0NoaWxkKCd0cmlnZ2VyQnV0dG9uUmVmJywge1xuICAgIHJlYWQ6IEVsZW1lbnRSZWYsXG4gIH0pXG4gIHByaXZhdGUgdHJpZ2dlckJ1dHRvblJlZjogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCdpbnB1dFRlbXBsYXRlUmVmJywge1xuICAgIHJlYWQ6IFRlbXBsYXRlUmVmLFxuICAgIHN0YXRpYzogdHJ1ZSxcbiAgfSlcbiAgcHJpdmF0ZSBpbnB1dFRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIEBWaWV3Q2hpbGQoJ3RyaWdnZXJCdXR0b25UZW1wbGF0ZVJlZicsIHtcbiAgICByZWFkOiBUZW1wbGF0ZVJlZixcbiAgICBzdGF0aWM6IHRydWUsXG4gIH0pXG4gIHByaXZhdGUgdHJpZ2dlckJ1dHRvblRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIHByaXZhdGUgYWZmaXhlcjogU2t5QWZmaXhlcjtcblxuICBwcml2YXRlIHRpbWVwaWNrZXJVbnN1YnNjcmliZTogU3ViamVjdDx2b2lkPjtcblxuICBwcml2YXRlIG5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHByaXZhdGUgb3ZlcmxheTogU2t5T3ZlcmxheUluc3RhbmNlO1xuXG4gIHByaXZhdGUgb3ZlcmxheUtleWRvd25MaXN0bmVyOiBTdWJzY3JpcHRpb247XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBfdGltZXBpY2tlclJlZjogRWxlbWVudFJlZjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGFmZml4U2VydmljZTogU2t5QWZmaXhTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgY29yZUFkYXB0ZXI6IFNreUNvcmVBZGFwdGVyU2VydmljZSxcbiAgICBwcml2YXRlIG92ZXJsYXlTZXJ2aWNlOiBTa3lPdmVybGF5U2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwdWJsaWMgaW5wdXRCb3hIb3N0U2VydmljZT86IFNreUlucHV0Qm94SG9zdFNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKCkgdGhlbWVTdmM/OiBTa3lUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgY29uc3QgdW5pcXVlSWQgPSBuZXh0SWQrKztcbiAgICB0aGlzLnRpbWVwaWNrZXJJZCA9IGBza3ktdGltZXBpY2tlci0ke3VuaXF1ZUlkfWA7XG4gICAgdGhpcy50cmlnZ2VyQnV0dG9uSWQgPSBgc2t5LXRpbWVwaWNrZXItYnV0dG9uLSR7dW5pcXVlSWR9YDtcblxuICAgIC8vIFVwZGF0ZSBpY29ucyB3aGVuIHRoZW1lIGNoYW5nZXMuXG4gICAgdGhlbWVTdmM/LnNldHRpbmdzQ2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRGb3JtYXQodGhpcy50aW1lRm9ybWF0KTtcbiAgICB0aGlzLmFkZEtleWRvd25MaXN0bmVyKCk7XG5cbiAgICBpZiAodGhpcy5pbnB1dEJveEhvc3RTZXJ2aWNlKSB7XG4gICAgICB0aGlzLmlucHV0Qm94SG9zdFNlcnZpY2UucG9wdWxhdGUoe1xuICAgICAgICBpbnB1dFRlbXBsYXRlOiB0aGlzLmlucHV0VGVtcGxhdGVSZWYsXG4gICAgICAgIGJ1dHRvbnNUZW1wbGF0ZTogdGhpcy50cmlnZ2VyQnV0dG9uVGVtcGxhdGVSZWYsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTtcbiAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICB0aGlzLnJlbW92ZVBpY2tlckV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy5kZXN0cm95QWZmaXhlcigpO1xuICAgIHRoaXMuZGVzdHJveU92ZXJsYXkoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsZXQgaDogbnVtYmVyID0gMTI7XG4gICAgbGV0IG06IG51bWJlciA9IDEyO1xuICAgIGxldCBtaW51dGVNdWx0aXBsaWVyOiBudW1iZXIgPSA1O1xuICAgIGxldCBsb2NhbGVGb3JtYXQ6IHN0cmluZyA9ICdoOm1tIEEnO1xuICAgIGlmIChmb3JtYXQgPT09ICdoaCcpIHtcbiAgICAgIGggPSAxMjtcbiAgICAgIG0gPSAxMjtcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXIgPSA1O1xuICAgICAgbG9jYWxlRm9ybWF0ID0gJ2g6bW0gQSc7XG4gICAgICB0aGlzLmlzODYwMSA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSAnSEgnKSB7XG4gICAgICBoID0gMjQ7XG4gICAgICBtID0gNDtcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXIgPSAxNTtcbiAgICAgIGxvY2FsZUZvcm1hdCA9ICdISDptbSc7XG4gICAgICB0aGlzLmlzODYwMSA9IHRydWU7XG4gICAgfVxuICAgIGxldCBkYXRhOiB7XG4gICAgICBob3VyczogQXJyYXk8bnVtYmVyPjtcbiAgICAgIG1pbnV0ZXM6IEFycmF5PG51bWJlcj47XG4gICAgICBsb2NhbGVGb3JtYXQ6IHN0cmluZztcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXI6IG51bWJlcjtcbiAgICB9O1xuXG4gICAgZGF0YSA9IHtcbiAgICAgIGhvdXJzOiBBcnJheS5hcHBseSh1bmRlZmluZWQsIEFycmF5KGgpKS5tYXAoZnVuY3Rpb24gKFxuICAgICAgICB4OiBudW1iZXIsXG4gICAgICAgIGk6IG51bWJlclxuICAgICAgKSB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdoaCcpIHtcbiAgICAgICAgICByZXR1cm4gKytpO1xuICAgICAgICB9XG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICAgIGlmIChmb3JtYXQgPT09ICdISCcpIHtcbiAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgICAvKiBzYW5pdHkgY2hlY2sgKi9cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9KSxcbiAgICAgIG1pbnV0ZXM6IEFycmF5LmFwcGx5KHVuZGVmaW5lZCwgQXJyYXkobSkpLm1hcChmdW5jdGlvbiAoXG4gICAgICAgIHg6IG51bWJlcixcbiAgICAgICAgaTogbnVtYmVyXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGkgKiBtaW51dGVNdWx0aXBsaWVyO1xuICAgICAgfSksXG4gICAgICBsb2NhbGVGb3JtYXQ6IGxvY2FsZUZvcm1hdCxcbiAgICAgIG1pbnV0ZU11bHRpcGxpZXI6IG1pbnV0ZU11bHRpcGxpZXIsXG4gICAgfTtcblxuICAgIHRoaXMuaG91cnMgPSBkYXRhLmhvdXJzO1xuICAgIHRoaXMubWludXRlcyA9IGRhdGEubWludXRlcztcbiAgICB0aGlzLmxvY2FsZUZvcm1hdCA9IGRhdGEubG9jYWxlRm9ybWF0O1xuICAgIHRoaXMubWludXRlTXVsdGlwbGllciA9IGRhdGEubWludXRlTXVsdGlwbGllcjtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsb3NlQnV0dG9uQ2ljaygpOiB2b2lkIHtcbiAgICB0aGlzLmNsb3NlUGlja2VyKCk7XG4gIH1cblxuICBwdWJsaWMgc2V0VGltZShldmVudDogYW55KTogdm9pZCB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAodHlwZW9mIGV2ZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm5hbWUgPT09ICdob3VyJykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRIb3VyID0gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LmlubmVySFRNTCwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5uYW1lID09PSAnbWludXRlJykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNaW51dGUgPSBwYXJzZUludChldmVudC50YXJnZXQuaW5uZXJIVE1MLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnQudGFyZ2V0Lm5hbWUgPT09ICdtZXJpZGllJykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXJpZGllcyA9IGV2ZW50LnRhcmdldC5pbm5lckhUTUw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25UcmlnZ2VyQnV0dG9uQ2xpY2soKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGlja2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNsb3NlUGlja2VyKCkge1xuICAgIHRoaXMuZGVzdHJveUFmZml4ZXIoKTtcbiAgICB0aGlzLmRlc3Ryb3lPdmVybGF5KCk7XG4gICAgdGhpcy5yZW1vdmVQaWNrZXJFdmVudExpc3RlbmVycygpO1xuICAgIHRoaXMudHJpZ2dlckJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgb3BlblBpY2tlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG5cbiAgICB0aGlzLnJlbW92ZVBpY2tlckV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy50aW1lcGlja2VyVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICAgIHRoaXMuZGVzdHJveU92ZXJsYXkoKTtcbiAgICB0aGlzLmNyZWF0ZU92ZXJsYXkoKTtcblxuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBZmZpeGVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGFmZml4ZXIgPSB0aGlzLmFmZml4U2VydmljZS5jcmVhdGVBZmZpeGVyKHRoaXMudGltZXBpY2tlclJlZik7XG5cbiAgICAvLyBIaWRlIHRpbWVwaWNrZXIgd2hlbiB0cmlnZ2VyIGJ1dHRvbiBpcyBzY3JvbGxlZCBvZmYgc2NyZWVuLlxuICAgIGFmZml4ZXIucGxhY2VtZW50Q2hhbmdlXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy50aW1lcGlja2VyVW5zdWJzY3JpYmUpKVxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gY2hhbmdlLnBsYWNlbWVudCAhPT0gbnVsbDtcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuXG4gICAgYWZmaXhlci5hZmZpeFRvKHRoaXMudHJpZ2dlckJ1dHRvblJlZi5uYXRpdmVFbGVtZW50LCB7XG4gICAgICBhdXRvRml0Q29udGV4dDogU2t5QWZmaXhBdXRvRml0Q29udGV4dC5WaWV3cG9ydCxcbiAgICAgIGVuYWJsZUF1dG9GaXQ6IHRydWUsXG4gICAgICBob3Jpem9udGFsQWxpZ25tZW50OiAncmlnaHQnLFxuICAgICAgaXNTdGlja3k6IHRydWUsXG4gICAgICBwbGFjZW1lbnQ6ICdiZWxvdycsXG4gICAgfSk7XG5cbiAgICB0aGlzLmFmZml4ZXIgPSBhZmZpeGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95QWZmaXhlcigpOiB2b2lkIHtcbiAgICAvKmlzdGFuYnVsIGlnbm9yZSBlbHNlKi9cbiAgICBpZiAodGhpcy5hZmZpeGVyKSB7XG4gICAgICB0aGlzLmFmZml4ZXIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5hZmZpeGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlT3ZlcmxheSgpOiB2b2lkIHtcbiAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5vdmVybGF5U2VydmljZS5jcmVhdGUoe1xuICAgICAgZW5hYmxlQ2xvc2U6IGZhbHNlLFxuICAgICAgZW5hYmxlUG9pbnRlckV2ZW50czogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBvdmVybGF5LmJhY2tkcm9wQ2xpY2tcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLnRpbWVwaWNrZXJVbnN1YnNjcmliZSkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5jbG9zZVBpY2tlcigpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIHRoaXMuYWRkS2V5ZG93bkxpc3RuZXIoKTtcblxuICAgIG92ZXJsYXkuYXR0YWNoVGVtcGxhdGUodGhpcy50aW1lcGlja2VyVGVtcGxhdGVSZWYpO1xuXG4gICAgdGhpcy5vdmVybGF5ID0gb3ZlcmxheTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveU92ZXJsYXkoKTogdm9pZCB7XG4gICAgLyppc3RhbmJ1bCBpZ25vcmUgZWxzZSovXG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5U2VydmljZS5jbG9zZSh0aGlzLm92ZXJsYXkpO1xuICAgICAgdGhpcy5vdmVybGF5ID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkS2V5ZG93bkxpc3RuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5vdmVybGF5S2V5ZG93bkxpc3RuZXIgPSBmcm9tRXZlbnQod2luZG93LmRvY3VtZW50LCAna2V5ZG93bicpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSlcbiAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGtleSA9IGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICAgICAgaWYgKGtleSA9PT0gJ2VzY2FwZScgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICB0aGlzLmNsb3NlUGlja2VyKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVQaWNrZXJFdmVudExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0aGlzLnRpbWVwaWNrZXJVbnN1YnNjcmliZSkge1xuICAgICAgdGhpcy50aW1lcGlja2VyVW5zdWJzY3JpYmUubmV4dCgpO1xuICAgICAgdGhpcy50aW1lcGlja2VyVW5zdWJzY3JpYmUuY29tcGxldGUoKTtcbiAgICAgIHRoaXMudGltZXBpY2tlclVuc3Vic2NyaWJlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHRoaXMub3ZlcmxheUtleWRvd25MaXN0bmVyPy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwic2t5LXRpbWVwaWNrZXJcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpbnB1dEJveEhvc3RTZXJ2aWNlXCI+XG4gICAgPGRpdiBjbGFzcz1cInNreS1pbnB1dC1ncm91cFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImlucHV0VGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0cmlnZ2VyQnV0dG9uVGVtcGxhdGVSZWZcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNpbnB1dFRlbXBsYXRlUmVmPlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3RyaWdnZXJCdXR0b25UZW1wbGF0ZVJlZj5cbiAgPGRpdiBjbGFzcz1cInNreS1pbnB1dC1ncm91cC1idG5cIj5cbiAgICA8YnV0dG9uXG4gICAgICBhcmlhLWhhc3BvcHVwPVwiZGlhbG9nXCJcbiAgICAgIGNsYXNzPVwic2t5LWJ0biBza3ktYnRuLWRlZmF1bHQgc2t5LWlucHV0LWdyb3VwLXRpbWVwaWNrZXItYnRuXCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgW2F0dHIuYXJpYS1jb250cm9sc109XCJpc09wZW4gPyB0aW1lcGlja2VySWQgOiBudWxsXCJcbiAgICAgIFthdHRyLmFyaWEtZXhwYW5kZWRdPVwiaXNPcGVuXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3NreXV4X3RpbWVwaWNrZXJfYnV0dG9uX2xhYmVsJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbYXR0ci5pZF09XCJ0cmlnZ2VyQnV0dG9uSWRcIlxuICAgICAgW2F0dHIudGl0bGVdPVwiJ3NreXV4X3RpbWVwaWNrZXJfYnV0dG9uX2xhYmVsJyB8IHNreUxpYlJlc291cmNlc1wiXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgKGNsaWNrKT1cIm9uVHJpZ2dlckJ1dHRvbkNsaWNrKClcIlxuICAgICAgI3RyaWdnZXJCdXR0b25SZWZcbiAgICA+XG4gICAgICA8c2t5LWljb24gKnNreVRoZW1lSWY9XCInZGVmYXVsdCdcIiBpY29uPVwiY2xvY2stb1wiIHNpemU9XCJsZ1wiPjwvc2t5LWljb24+XG4gICAgICA8c2t5LWljb25cbiAgICAgICAgKnNreVRoZW1lSWY9XCInbW9kZXJuJ1wiXG4gICAgICAgIGljb249XCJjbG9ja1wiXG4gICAgICAgIHNpemU9XCJsZ1wiXG4gICAgICAgIGljb25UeXBlPVwic2t5dXhcIlxuICAgICAgPjwvc2t5LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICN0aW1lcGlja2VyVGVtcGxhdGVSZWY+XG4gIDxkaXZcbiAgICBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbnRhaW5lciBza3ktc2hhZG93IHNreS1ib3ggc2t5LWVsZXZhdGlvbi00XCJcbiAgICByb2xlPVwiZGlhbG9nXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwidHJpZ2dlckJ1dHRvbklkXCJcbiAgICBbYXR0ci5pZF09XCJ0aW1lcGlja2VySWRcIlxuICAgIFtjbGFzcy5za3ktdGltZXBpY2tlci1oaWRkZW5dPVwiIWlzVmlzaWJsZVwiXG4gICAgI3RpbWVwaWNrZXJSZWZcbiAgPlxuICAgIDxkaXYgY2xhc3M9XCJza3ktdGltZXBpY2tlci1jb250ZW50XCI+XG4gICAgICA8c2VjdGlvblxuICAgICAgICBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbHVtblwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NreS10aW1lcGlja2VyLTI0aG91cic6IGlzODYwMSB9XCJcbiAgICAgID5cbiAgICAgICAgPG9sPlxuICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaG91ciBvZiBob3Vyc1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBuYW1lPVwiaG91clwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdza3ktYnRuLWFjdGl2ZSc6IHNlbGVjdGVkSG91ciA9PT0gaG91ciB9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFRpbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7IGhvdXIgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgIDwvb2w+XG4gICAgICA8L3NlY3Rpb24+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbHVtblwiPlxuICAgICAgICA8b2w+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBtaW51dGUgb2YgbWludXRlc1wiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBuYW1lPVwibWludXRlXCJcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NreS1idG4tYWN0aXZlJzogc2VsZWN0ZWRNaW51dGUgPT09IG1pbnV0ZSB9XCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNldFRpbWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHt7ICcwMCcuc3Vic3RyaW5nKDAsIDIgLSBtaW51dGUudG9TdHJpbmcoKS5sZW5ndGgpICsgbWludXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L29sPlxuICAgICAgPC9zZWN0aW9uPlxuICAgICAgPHNlY3Rpb24gKm5nSWY9XCIhaXM4NjAxXCIgY2xhc3M9XCJza3ktdGltZXBpY2tlci1jb2x1bW5cIj5cbiAgICAgICAgPG9sPlxuICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgbmFtZT1cIm1lcmlkaWVcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2t5LWJ0bi1hY3RpdmUnOiBzZWxlY3RlZE1lcmlkaWVzID09PSAnQU0nIH1cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2V0VGltZSgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQU1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICBuYW1lPVwibWVyaWRpZVwiXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdza3ktYnRuLWFjdGl2ZSc6IHNlbGVjdGVkTWVyaWRpZXMgPT09ICdQTScgfVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZXRUaW1lKCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBQTVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC9vbD5cbiAgICAgIDwvc2VjdGlvbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwic2t5LXRpbWVwaWNrZXItZm9vdGVyXCI+XG4gICAgICA8c2VjdGlvbiBjbGFzcz1cInNreS10aW1lcGlja2VyLWNvbHVtblwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJza3ktYnRuIHNreS1idG4tcHJpbWFyeVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uQ2xvc2VCdXR0b25DaWNrKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgJ3NreXV4X3RpbWVwaWNrZXJfY2xvc2UnIHwgc2t5TGliUmVzb3VyY2VzIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9zZWN0aW9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=