@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,594 +0,0 @@
1
- import { Component, Input, forwardRef, Output, EventEmitter, ViewChild } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@angular/common";
5
- export const INPUTMASK_VALUE_ACCESSOR = {
6
- provide: NG_VALUE_ACCESSOR,
7
- useExisting: forwardRef(() => InputMaskComponent),
8
- multi: true
9
- };
10
- export class InputMaskComponent {
11
- type = 'text';
12
- slotChar = '_';
13
- autoClear = true;
14
- style;
15
- inputId = null;
16
- styleClass = null;
17
- placeholder = null;
18
- size = null;
19
- maxlength = null;
20
- tabindex = null;
21
- ariaLabel = null;
22
- ariaRequired = null;
23
- disabled = null;
24
- readonly = null;
25
- unmask = null;
26
- name = null;
27
- required = null;
28
- characterPattern = '[A-Za-z]';
29
- autoFocus = false;
30
- autocomplete = null;
31
- inputViewChild = null;
32
- // eslint-disable-next-line @angular-eslint/no-output-on-prefix
33
- onComplete = new EventEmitter();
34
- // eslint-disable-next-line @angular-eslint/no-output-on-prefix
35
- onFocus = new EventEmitter();
36
- // eslint-disable-next-line @angular-eslint/no-output-on-prefix
37
- onBlur = new EventEmitter();
38
- // eslint-disable-next-line @angular-eslint/no-output-on-prefix
39
- onInput = new EventEmitter();
40
- value;
41
- _mask = null;
42
- input = null;
43
- filled = false;
44
- defs;
45
- tests = null;
46
- partialPosition;
47
- firstNonMaskPos = null;
48
- lastRequiredNonMaskPos;
49
- len = null;
50
- oldVal = null;
51
- buffer;
52
- defaultBuffer = null;
53
- focusText = null;
54
- caretTimeoutId;
55
- androidChrome = false;
56
- focused = false;
57
- onModelChange = () => { };
58
- onModelTouched = () => { };
59
- constructor() { }
60
- ngOnInit() {
61
- const ua = navigator.userAgent;
62
- this.androidChrome = /chrome/i.test(ua) && /android/i.test(ua);
63
- this.initMask();
64
- }
65
- get mask() {
66
- return this._mask;
67
- }
68
- set mask(val) {
69
- this._mask = val;
70
- this.initMask();
71
- this.writeValue('');
72
- this.onModelChange(this.value);
73
- }
74
- initMask() {
75
- this.tests = [];
76
- this.partialPosition = this.mask.length;
77
- this.len = this.mask.length;
78
- this.firstNonMaskPos = null;
79
- this.defs = {
80
- '9': '[0-9]',
81
- 'a': this.characterPattern,
82
- '*': `${this.characterPattern}|[0-9]`
83
- };
84
- const maskTokens = this.mask.split('');
85
- for (let i = 0; i < maskTokens.length; i++) {
86
- const c = maskTokens[i];
87
- if (c === '?') {
88
- this.len--;
89
- this.partialPosition = i;
90
- }
91
- else if (this.defs[c]) {
92
- this.tests.push(new RegExp(this.defs[c]));
93
- if (this.firstNonMaskPos === null) {
94
- this.firstNonMaskPos = this.tests.length - 1;
95
- }
96
- if (i < this.partialPosition) {
97
- this.lastRequiredNonMaskPos = this.tests.length - 1;
98
- }
99
- }
100
- else {
101
- this.tests.push(null);
102
- }
103
- }
104
- this.buffer = [];
105
- for (let i = 0; i < maskTokens.length; i++) {
106
- const c = maskTokens[i];
107
- if (c !== '?') {
108
- if (this.defs[c]) {
109
- this.buffer.push(this.getPlaceholder(i));
110
- }
111
- else {
112
- this.buffer.push(c);
113
- }
114
- }
115
- }
116
- this.defaultBuffer = this.buffer.join('');
117
- }
118
- writeValue(value) {
119
- this.value = value;
120
- if (this.inputViewChild && this.inputViewChild.nativeElement) {
121
- if (this.value === undefined || this.value == null) {
122
- this.inputViewChild.nativeElement.value = '';
123
- }
124
- else {
125
- this.inputViewChild.nativeElement.value = this.value;
126
- }
127
- this.checkVal();
128
- this.focusText = this.inputViewChild.nativeElement.value;
129
- this.updateFilledState();
130
- }
131
- }
132
- registerOnChange(fn) {
133
- this.onModelChange = fn;
134
- }
135
- registerOnTouched(fn) {
136
- this.onModelTouched = fn;
137
- }
138
- setDisabledState(val) {
139
- this.disabled = val;
140
- }
141
- caret(first, last) {
142
- let range, begin, end;
143
- if (!this.inputViewChild.nativeElement.offsetParent || this.inputViewChild.nativeElement !== document.activeElement) {
144
- return;
145
- }
146
- if (typeof first === 'number') {
147
- begin = first;
148
- end = (typeof last === 'number') ? last : begin;
149
- if (this.inputViewChild.nativeElement.setSelectionRange) {
150
- this.inputViewChild.nativeElement.setSelectionRange(begin, end);
151
- }
152
- else if (this.inputViewChild.nativeElement['createTextRange']) {
153
- range = this.inputViewChild.nativeElement['createTextRange']();
154
- range.collapse(true);
155
- range.moveEnd('character', end);
156
- range.moveStart('character', begin);
157
- range.select();
158
- }
159
- }
160
- else {
161
- if (this.inputViewChild.nativeElement.setSelectionRange) {
162
- begin = this.inputViewChild.nativeElement.selectionStart;
163
- end = this.inputViewChild.nativeElement.selectionEnd;
164
- }
165
- else if (document['selection'] && document['selection'].createRange) {
166
- range = document['selection'].createRange();
167
- begin = 0 - range.duplicate().moveStart('character', -100000);
168
- end = begin + range.text.length;
169
- }
170
- return { begin: begin, end: end };
171
- }
172
- return null;
173
- }
174
- isCompleted() {
175
- for (let i = this.firstNonMaskPos; i <= this.lastRequiredNonMaskPos; i++) {
176
- if (this.tests[i] && this.buffer[i] === this.getPlaceholder(i)) {
177
- return false;
178
- }
179
- }
180
- return true;
181
- }
182
- getPlaceholder(i) {
183
- if (i < this.slotChar.length) {
184
- return this.slotChar.charAt(i);
185
- }
186
- return this.slotChar.charAt(0);
187
- }
188
- seekNext(pos) {
189
- while (++pos < this.len && !this.tests[pos]) { }
190
- return pos;
191
- }
192
- seekPrev(pos) {
193
- while (--pos >= 0 && !this.tests[pos]) { }
194
- return pos;
195
- }
196
- shiftL(begin, end) {
197
- let i, j;
198
- if (begin < 0) {
199
- return;
200
- }
201
- for (i = begin, j = this.seekNext(end); i < this.len; i++) {
202
- if (this.tests[i]) {
203
- if (j < this.len && this.tests[i].test(this.buffer[j])) {
204
- this.buffer[i] = this.buffer[j];
205
- this.buffer[j] = this.getPlaceholder(j);
206
- }
207
- else {
208
- break;
209
- }
210
- j = this.seekNext(j);
211
- }
212
- }
213
- this.writeBuffer();
214
- this.caret(Math.max(this.firstNonMaskPos, begin));
215
- }
216
- shiftR(pos) {
217
- let i, c, j, t;
218
- for (i = pos, c = this.getPlaceholder(pos); i < this.len; i++) {
219
- if (this.tests[i]) {
220
- j = this.seekNext(i);
221
- t = this.buffer[i];
222
- this.buffer[i] = c;
223
- if (j < this.len && this.tests[j].test(t)) {
224
- c = t;
225
- }
226
- else {
227
- break;
228
- }
229
- }
230
- }
231
- }
232
- handleAndroidInput(e) {
233
- const curVal = this.inputViewChild.nativeElement.value;
234
- const pos = this.caret();
235
- if (this.oldVal && this.oldVal.length && this.oldVal.length > curVal.length) {
236
- // a deletion or backspace happened
237
- this.checkVal(true);
238
- while (pos.begin > 0 && !this.tests[pos.begin - 1]) {
239
- pos.begin--;
240
- }
241
- if (pos.begin === 0) {
242
- while (pos.begin < this.firstNonMaskPos && !this.tests[pos.begin]) {
243
- pos.begin++;
244
- }
245
- }
246
- setTimeout(() => {
247
- this.caret(pos.begin, pos.begin);
248
- this.updateModel(e);
249
- if (this.isCompleted()) {
250
- this.onComplete.emit();
251
- }
252
- }, 0);
253
- }
254
- else {
255
- this.checkVal(true);
256
- while (pos.begin < this.len && !this.tests[pos.begin]) {
257
- pos.begin++;
258
- }
259
- setTimeout(() => {
260
- this.caret(pos.begin, pos.begin);
261
- this.updateModel(e);
262
- if (this.isCompleted()) {
263
- this.onComplete.emit();
264
- }
265
- }, 0);
266
- }
267
- }
268
- onInputBlur(e) {
269
- this.focused = false;
270
- this.onModelTouched();
271
- this.checkVal();
272
- this.updateFilledState();
273
- this.onBlur.emit(e);
274
- if (this.inputViewChild.nativeElement.value !== this.focusText || this.inputViewChild.nativeElement.value !== this.value) {
275
- this.updateModel(e);
276
- const event = document.createEvent('HTMLEvents');
277
- event.initEvent('change', true, false);
278
- this.inputViewChild.nativeElement.dispatchEvent(event);
279
- }
280
- }
281
- onKeyDown(e) {
282
- if (this.readonly) {
283
- return;
284
- }
285
- const k = e.which || e.keyCode;
286
- let pos, begin, end;
287
- const iPhone = /iphone/i.test(navigator.userAgent);
288
- this.oldVal = this.inputViewChild.nativeElement.value;
289
- // backspace, delete, and escape get special treatment
290
- if (k === 8 || k === 46 || (iPhone && k === 127)) {
291
- pos = this.caret();
292
- begin = pos.begin;
293
- end = pos.end;
294
- if (end - begin === 0) {
295
- begin = k !== 46 ? this.seekPrev(begin) : (end = this.seekNext(begin - 1));
296
- end = k === 46 ? this.seekNext(end) : end;
297
- }
298
- this.clearBuffer(begin, end);
299
- this.shiftL(begin, end - 1);
300
- this.updateModel(e);
301
- e.preventDefault();
302
- }
303
- else if (k === 13) { // enter
304
- this.onInputBlur(e);
305
- this.updateModel(e);
306
- }
307
- else if (k === 27) { // escape
308
- this.inputViewChild.nativeElement.value = this.focusText;
309
- this.caret(0, this.checkVal());
310
- this.updateModel(e);
311
- e.preventDefault();
312
- }
313
- else if (e.key === 'ArrowLeft') {
314
- const { selectionStart, selectionEnd } = this.inputViewChild.nativeElement;
315
- const checkedVal = this.checkVal(true);
316
- if (selectionStart === selectionEnd && (selectionStart - 1) > checkedVal) {
317
- this.caret(checkedVal, checkedVal);
318
- e.preventDefault();
319
- }
320
- }
321
- else if (e.key === 'ArrowRight') {
322
- const { selectionStart, selectionEnd } = this.inputViewChild.nativeElement;
323
- const checkedVal = this.checkVal(true);
324
- if (selectionStart === selectionEnd && (selectionStart + 1) > checkedVal) {
325
- this.caret(checkedVal, checkedVal);
326
- e.preventDefault();
327
- }
328
- }
329
- }
330
- onKeyPress(e) {
331
- if (this.readonly) {
332
- return;
333
- }
334
- const k = e.which || e.keyCode;
335
- const pos = this.caret();
336
- let next = 0;
337
- let p, c, completed;
338
- if (e.ctrlKey || e.altKey || e.metaKey || k < 32 || (k > 34 && k < 41)) { // Ignore
339
- return;
340
- }
341
- else if (k && k !== 13) {
342
- if (pos.end - pos.begin !== 0) {
343
- this.clearBuffer(pos.begin, pos.end);
344
- this.shiftL(pos.begin, pos.end - 1);
345
- }
346
- p = this.seekNext(pos.begin - 1);
347
- if (p < this.len) {
348
- c = String.fromCharCode(k);
349
- if (this.tests[p].test(c)) {
350
- this.shiftR(p);
351
- this.buffer[p] = c;
352
- this.writeBuffer();
353
- next = this.seekNext(p);
354
- if (/android/i.test(navigator.userAgent)) {
355
- // Path for CSP Violation on FireFox OS 1.1
356
- const proxy = () => {
357
- this.caret(next);
358
- };
359
- setTimeout(proxy, 0);
360
- }
361
- else {
362
- this.caret(next);
363
- }
364
- if (pos.begin <= this.lastRequiredNonMaskPos) {
365
- completed = this.isCompleted();
366
- }
367
- }
368
- }
369
- e.preventDefault();
370
- }
371
- this.updateModel(e);
372
- this.updateFilledState();
373
- if (completed) {
374
- this.onComplete.emit();
375
- }
376
- }
377
- /**
378
- * Adjust cursor position if clicked on empty space ahead of the existing input
379
- */
380
- onClick() {
381
- const { selectionStart, selectionEnd } = this.inputViewChild.nativeElement;
382
- const checkedVal = this.checkVal(true);
383
- if (selectionStart === selectionEnd && selectionStart > checkedVal) {
384
- this.caret(checkedVal, checkedVal);
385
- }
386
- }
387
- clearBuffer(start, end) {
388
- let i;
389
- for (i = start; i < end && i < this.len; i++) {
390
- if (this.tests[i]) {
391
- this.buffer[i] = this.getPlaceholder(i);
392
- }
393
- }
394
- }
395
- writeBuffer() {
396
- this.inputViewChild.nativeElement.value = this.buffer.join('');
397
- }
398
- checkVal(allow) {
399
- // try to place characters where they belong
400
- const test = this.inputViewChild.nativeElement.value;
401
- let lastMatch = -1, i, c, pos;
402
- for (i = 0, pos = 0; i < this.len; i++) {
403
- if (this.tests[i]) {
404
- this.buffer[i] = this.getPlaceholder(i);
405
- while (pos++ < test.length) {
406
- c = test.charAt(pos - 1);
407
- if (this.tests[i].test(c)) {
408
- this.buffer[i] = c;
409
- lastMatch = i;
410
- break;
411
- }
412
- }
413
- if (pos > test.length) {
414
- this.clearBuffer(i + 1, this.len);
415
- break;
416
- }
417
- }
418
- else {
419
- if (this.buffer[i] === test.charAt(pos)) {
420
- pos++;
421
- }
422
- if (i < this.partialPosition) {
423
- lastMatch = i;
424
- }
425
- }
426
- }
427
- if (allow) {
428
- this.writeBuffer();
429
- }
430
- else if (lastMatch + 1 < this.partialPosition) {
431
- if (this.autoClear || this.buffer.join('') === this.defaultBuffer) {
432
- // Invalid value. Remove it and replace it with the
433
- // mask, which is the default behavior.
434
- if (this.inputViewChild.nativeElement.value) {
435
- this.inputViewChild.nativeElement.value = '';
436
- }
437
- this.clearBuffer(0, this.len);
438
- }
439
- else {
440
- // Invalid value, but we opt to show the value to the
441
- // user and allow them to correct their mistake.
442
- this.writeBuffer();
443
- }
444
- }
445
- else {
446
- this.writeBuffer();
447
- this.inputViewChild.nativeElement.value = this.inputViewChild.nativeElement.value.substring(0, lastMatch + 1);
448
- }
449
- return (this.partialPosition ? i : this.firstNonMaskPos);
450
- }
451
- onInputFocus(event) {
452
- if (this.readonly) {
453
- return;
454
- }
455
- this.focused = true;
456
- clearTimeout(this.caretTimeoutId);
457
- let pos;
458
- this.focusText = this.inputViewChild.nativeElement.value;
459
- pos = this.checkVal();
460
- this.caretTimeoutId = setTimeout(() => {
461
- if (this.inputViewChild.nativeElement !== document.activeElement) {
462
- return;
463
- }
464
- this.writeBuffer();
465
- if (pos === this.mask.replace('?', '').length) {
466
- this.caret(0, pos);
467
- }
468
- else {
469
- this.caret(pos);
470
- }
471
- }, 10);
472
- this.onFocus.emit(event);
473
- }
474
- onInputChange(event) {
475
- if (this.androidChrome) {
476
- this.handleAndroidInput(event);
477
- }
478
- else {
479
- this.handleInputChange(event);
480
- }
481
- this.onInput.emit(event);
482
- }
483
- handleInputChange(event) {
484
- if (this.readonly) {
485
- return;
486
- }
487
- setTimeout(() => {
488
- const pos = this.checkVal(true);
489
- this.caret(pos);
490
- this.updateModel(event);
491
- if (this.isCompleted()) {
492
- this.onComplete.emit();
493
- }
494
- }, 0);
495
- }
496
- getUnmaskedValue() {
497
- const unmaskedBuffer = [];
498
- for (let i = 0; i < this.buffer.length; i++) {
499
- const c = this.buffer[i];
500
- if (this.tests[i] && c !== this.getPlaceholder(i)) {
501
- unmaskedBuffer.push(c);
502
- }
503
- }
504
- return unmaskedBuffer.join('');
505
- }
506
- updateModel(e) {
507
- const updatedValue = this.unmask ? this.getUnmaskedValue() : e.target?.value;
508
- if (updatedValue !== null && updatedValue !== undefined) {
509
- this.value = updatedValue;
510
- this.onModelChange(this.value);
511
- }
512
- }
513
- updateFilledState() {
514
- this.filled = this.inputViewChild.nativeElement && this.inputViewChild.nativeElement.value !== '';
515
- }
516
- focus() {
517
- this.inputViewChild.nativeElement.focus();
518
- }
519
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: InputMaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
520
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.1", type: InputMaskComponent, selector: "particle-input-mask", inputs: { type: "type", slotChar: "slotChar", autoClear: "autoClear", style: "style", inputId: "inputId", styleClass: "styleClass", placeholder: "placeholder", size: "size", maxlength: "maxlength", tabindex: "tabindex", ariaLabel: "ariaLabel", ariaRequired: "ariaRequired", disabled: "disabled", readonly: "readonly", unmask: "unmask", name: "name", required: "required", characterPattern: "characterPattern", autoFocus: "autoFocus", autocomplete: "autocomplete", mask: "mask" }, outputs: { onComplete: "onComplete", onFocus: "onFocus", onBlur: "onBlur", onInput: "onInput" }, host: { properties: { "class.ui-inputwrapper-filled": "filled", "class.ui-inputwrapper-focus": "focus" } }, providers: [INPUTMASK_VALUE_ACCESSOR], viewQueries: [{ propertyName: "inputViewChild", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: `<input #input [attr.id]="inputId" [attr.type]="type" [attr.name]="name" [ngStyle]="style" [ngClass]="styleClass" [attr.placeholder]="placeholder"
521
- [attr.size]="size" [attr.autocomplete]="autocomplete" [attr.maxlength]="maxlength" [attr.tabindex]="tabindex" [attr.aria-label]="ariaLabel" [attr.aria-required]="ariaRequired" [disabled]="disabled" [readonly]="readonly" [attr.required]="required"
522
- (focus)="onInputFocus($event)" (blur)="onInputBlur($event)" (keydown)="onKeyDown($event)" (keypress)="onKeyPress($event)" [attr.autofocus]="autoFocus"
523
- (input)="onInputChange($event)" (paste)="handleInputChange($event)" (click)="onClick()">`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
524
- }
525
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.1", ngImport: i0, type: InputMaskComponent, decorators: [{
526
- type: Component,
527
- args: [{
528
- selector: 'particle-input-mask',
529
- template: `<input #input [attr.id]="inputId" [attr.type]="type" [attr.name]="name" [ngStyle]="style" [ngClass]="styleClass" [attr.placeholder]="placeholder"
530
- [attr.size]="size" [attr.autocomplete]="autocomplete" [attr.maxlength]="maxlength" [attr.tabindex]="tabindex" [attr.aria-label]="ariaLabel" [attr.aria-required]="ariaRequired" [disabled]="disabled" [readonly]="readonly" [attr.required]="required"
531
- (focus)="onInputFocus($event)" (blur)="onInputBlur($event)" (keydown)="onKeyDown($event)" (keypress)="onKeyPress($event)" [attr.autofocus]="autoFocus"
532
- (input)="onInputChange($event)" (paste)="handleInputChange($event)" (click)="onClick()">`,
533
- // eslint-disable-next-line @angular-eslint/no-host-metadata-property
534
- host: {
535
- '[class.ui-inputwrapper-filled]': 'filled',
536
- '[class.ui-inputwrapper-focus]': 'focus'
537
- },
538
- providers: [INPUTMASK_VALUE_ACCESSOR]
539
- }]
540
- }], ctorParameters: () => [], propDecorators: { type: [{
541
- type: Input
542
- }], slotChar: [{
543
- type: Input
544
- }], autoClear: [{
545
- type: Input
546
- }], style: [{
547
- type: Input
548
- }], inputId: [{
549
- type: Input
550
- }], styleClass: [{
551
- type: Input
552
- }], placeholder: [{
553
- type: Input
554
- }], size: [{
555
- type: Input
556
- }], maxlength: [{
557
- type: Input
558
- }], tabindex: [{
559
- type: Input
560
- }], ariaLabel: [{
561
- type: Input
562
- }], ariaRequired: [{
563
- type: Input
564
- }], disabled: [{
565
- type: Input
566
- }], readonly: [{
567
- type: Input
568
- }], unmask: [{
569
- type: Input
570
- }], name: [{
571
- type: Input
572
- }], required: [{
573
- type: Input
574
- }], characterPattern: [{
575
- type: Input
576
- }], autoFocus: [{
577
- type: Input
578
- }], autocomplete: [{
579
- type: Input
580
- }], inputViewChild: [{
581
- type: ViewChild,
582
- args: ['input', { static: true }]
583
- }], onComplete: [{
584
- type: Output
585
- }], onFocus: [{
586
- type: Output
587
- }], onBlur: [{
588
- type: Output
589
- }], onInput: [{
590
- type: Output
591
- }], mask: [{
592
- type: Input
593
- }] } });
594
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtbWFzay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL21vZHVsZXMvaW5wdXQtbWFzay9pbnB1dC1tYXNrLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULEtBQUssRUFDTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGlCQUFpQixFQUF1QixNQUFNLGdCQUFnQixDQUFDOzs7QUFDdkUsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQVE7SUFDM0MsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixDQUFDO0lBQ2pELEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQztBQWNGLE1BQU0sT0FBTyxrQkFBa0I7SUFDcEIsSUFBSSxHQUFHLE1BQU0sQ0FBQztJQUNkLFFBQVEsR0FBRyxHQUFHLENBQUM7SUFDZixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLEtBQUssQ0FBTTtJQUNYLE9BQU8sR0FBVyxJQUFXLENBQUM7SUFDOUIsVUFBVSxHQUFXLElBQVcsQ0FBQztJQUNqQyxXQUFXLEdBQVcsSUFBVyxDQUFDO0lBQ2xDLElBQUksR0FBVyxJQUFXLENBQUM7SUFDM0IsU0FBUyxHQUFXLElBQVcsQ0FBQztJQUNoQyxRQUFRLEdBQVcsSUFBVyxDQUFDO0lBQy9CLFNBQVMsR0FBVyxJQUFXLENBQUM7SUFDaEMsWUFBWSxHQUFZLElBQVcsQ0FBQztJQUNwQyxRQUFRLEdBQVksSUFBVyxDQUFDO0lBQ2hDLFFBQVEsR0FBWSxJQUFXLENBQUM7SUFDaEMsTUFBTSxHQUFZLElBQVcsQ0FBQztJQUM5QixJQUFJLEdBQVcsSUFBVyxDQUFDO0lBQzNCLFFBQVEsR0FBWSxJQUFXLENBQUM7SUFDaEMs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c0JBQWhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIE9uSW5pdCxcbiAgSW5wdXQsXG4gIGZvcndhcmRSZWYsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuZXhwb3J0IGNvbnN0IElOUFVUTUFTS19WQUxVRV9BQ0NFU1NPUjogYW55ID0ge1xuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSW5wdXRNYXNrQ29tcG9uZW50KSxcbiAgbXVsdGk6IHRydWVcbn07XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdwYXJ0aWNsZS1pbnB1dC1tYXNrJyxcbiAgdGVtcGxhdGU6IGA8aW5wdXQgI2lucHV0IFthdHRyLmlkXT1cImlucHV0SWRcIiBbYXR0ci50eXBlXT1cInR5cGVcIiBbYXR0ci5uYW1lXT1cIm5hbWVcIiBbbmdTdHlsZV09XCJzdHlsZVwiIFtuZ0NsYXNzXT1cInN0eWxlQ2xhc3NcIiBbYXR0ci5wbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnNpemVdPVwic2l6ZVwiIFthdHRyLmF1dG9jb21wbGV0ZV09XCJhdXRvY29tcGxldGVcIiBbYXR0ci5tYXhsZW5ndGhdPVwibWF4bGVuZ3RoXCIgW2F0dHIudGFiaW5kZXhdPVwidGFiaW5kZXhcIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwiYXJpYVJlcXVpcmVkXCIgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgW2F0dHIucmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgICAoZm9jdXMpPVwib25JbnB1dEZvY3VzKCRldmVudClcIiAoYmx1cik9XCJvbklucHV0Qmx1cigkZXZlbnQpXCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIiAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCIgW2F0dHIuYXV0b2ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvbklucHV0Q2hhbmdlKCRldmVudClcIiAocGFzdGUpPVwiaGFuZGxlSW5wdXRDaGFuZ2UoJGV2ZW50KVwiIChjbGljayk9XCJvbkNsaWNrKClcIj5gLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWhvc3QtbWV0YWRhdGEtcHJvcGVydHlcbiAgaG9zdDoge1xuICAgICdbY2xhc3MudWktaW5wdXR3cmFwcGVyLWZpbGxlZF0nOiAnZmlsbGVkJyxcbiAgICAnW2NsYXNzLnVpLWlucHV0d3JhcHBlci1mb2N1c10nOiAnZm9jdXMnXG4gIH0sXG4gIHByb3ZpZGVyczogW0lOUFVUTUFTS19WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRNYXNrQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgpIHR5cGUgPSAndGV4dCc7XG4gIEBJbnB1dCgpIHNsb3RDaGFyID0gJ18nO1xuICBASW5wdXQoKSBhdXRvQ2xlYXIgPSB0cnVlO1xuICBASW5wdXQoKSBzdHlsZTogYW55O1xuICBASW5wdXQoKSBpbnB1dElkOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcbiAgQElucHV0KCkgc3R5bGVDbGFzczogc3RyaW5nID0gbnVsbCBhcyBhbnk7XG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcbiAgQElucHV0KCkgc2l6ZTogbnVtYmVyID0gbnVsbCBhcyBhbnk7XG4gIEBJbnB1dCgpIG1heGxlbmd0aDogbnVtYmVyID0gbnVsbCBhcyBhbnk7XG4gIEBJbnB1dCgpIHRhYmluZGV4OiBzdHJpbmcgPSBudWxsIGFzIGFueTtcbiAgQElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcbiAgQElucHV0KCkgYXJpYVJlcXVpcmVkOiBib29sZWFuID0gbnVsbCBhcyBhbnk7XG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gbnVsbCBhcyBhbnk7XG4gIEBJbnB1dCgpIHJlYWRvbmx5OiBib29sZWFuID0gbnVsbCBhcyBhbnk7XG4gIEBJbnB1dCgpIHVubWFzazogYm9vbGVhbiA9IG51bGwgYXMgYW55O1xuICBASW5wdXQoKSBuYW1lOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcbiAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBudWxsIGFzIGFueTtcbiAgQElucHV0KCkgY2hhcmFjdGVyUGF0dGVybiA9ICdbQS1aYS16XSc7XG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IGZhbHNlO1xuICBASW5wdXQoKSBhdXRvY29tcGxldGU6IHN0cmluZyA9IG51bGwgYXMgYW55O1xuICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiB0cnVlIH0pIGlucHV0Vmlld0NoaWxkOiBFbGVtZW50UmVmID0gbnVsbCBhcyBhbnk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICBAT3V0cHV0KCkgb25Db21wbGV0ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICBAT3V0cHV0KCkgb25Gb2N1czogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeFxuICBAT3V0cHV0KCkgb25CbHVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtb24tcHJlZml4XG4gIEBPdXRwdXQoKSBvbklucHV0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgdmFsdWU6IGFueTtcbiAgX21hc2s6IHN0cmluZyA9IG51bGwgYXMgYW55O1xuICBpbnB1dDogSFRNTElucHV0RWxlbWVudCA9IG51bGwgYXMgYW55O1xuICBmaWxsZWQgPSBmYWxzZTtcbiAgZGVmczogYW55O1xuICB0ZXN0czogYW55W10gPSBudWxsIGFzIGFueTtcbiAgcGFydGlhbFBvc2l0aW9uOiBhbnk7XG4gIGZpcnN0Tm9uTWFza1BvczogbnVtYmVyID0gbnVsbCBhcyBhbnk7XG4gIGxhc3RSZXF1aXJlZE5vbk1hc2tQb3M6IGFueTtcbiAgbGVuOiBudW1iZXIgPSBudWxsIGFzIGFueTtcbiAgb2xkVmFsOiBzdHJpbmcgPSBudWxsIGFzIGFueTtcbiAgYnVmZmVyOiBhbnk7XG4gIGRlZmF1bHRCdWZmZXI6IHN0cmluZyA9IG51bGwgYXMgYW55O1xuICBmb2N1c1RleHQ6IHN0cmluZyA9IG51bGwgYXMgYW55O1xuICBjYXJldFRpbWVvdXRJZDogYW55O1xuICBhbmRyb2lkQ2hyb21lID0gZmFsc2U7XG4gIGZvY3VzZWQgPSBmYWxzZTtcbiAgb25Nb2RlbENoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7fTtcbiAgb25Nb2RlbFRvdWNoZWQ6IEZ1bmN0aW9uID0gKCkgPT4ge307XG4gIGNvbnN0cnVjdG9yKCkge31cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgdWEgPSBuYXZpZ2F0b3IudXNlckFnZW50O1xuICAgIHRoaXMuYW5kcm9pZENocm9tZSA9IC9jaHJvbWUvaS50ZXN0KHVhKSAmJiAvYW5kcm9pZC9pLnRlc3QodWEpO1xuICAgIHRoaXMuaW5pdE1hc2soKTtcbiAgfVxuICBASW5wdXQoKSBnZXQgbWFzaygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tYXNrO1xuICB9XG4gIHNldCBtYXNrKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy5fbWFzayA9IHZhbDtcbiAgICB0aGlzLmluaXRNYXNrKCk7XG4gICAgdGhpcy53cml0ZVZhbHVlKCcnKTtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cbiAgaW5pdE1hc2soKTogdm9pZCB7XG4gICAgdGhpcy50ZXN0cyA9IFtdO1xuICAgIHRoaXMucGFydGlhbFBvc2l0aW9uID0gdGhpcy5tYXNrLmxlbmd0aDtcbiAgICB0aGlzLmxlbiA9IHRoaXMubWFzay5sZW5ndGg7XG4gICAgdGhpcy5maXJzdE5vbk1hc2tQb3MgPSBudWxsIGFzIGFueTtcbiAgICB0aGlzLmRlZnMgPSB7XG4gICAgICAnOSc6ICdbMC05XScsXG4gICAgICAnYSc6IHRoaXMuY2hhcmFjdGVyUGF0dGVybixcbiAgICAgICcqJzogYCR7dGhpcy5jaGFyYWN0ZXJQYXR0ZXJufXxbMC05XWBcbiAgICB9O1xuICAgIGNvbnN0IG1hc2tUb2tlbnMgPSB0aGlzLm1hc2suc3BsaXQoJycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFza1Rva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgYyA9IG1hc2tUb2tlbnNbaV07XG4gICAgICBpZiAoYyA9PT0gJz8nKSB7XG4gICAgICAgIHRoaXMubGVuLS07XG4gICAgICAgIHRoaXMucGFydGlhbFBvc2l0aW9uID0gaTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kZWZzW2NdKSB7XG4gICAgICAgIHRoaXMudGVzdHMucHVzaChuZXcgUmVnRXhwKHRoaXMuZGVmc1tjXSkpO1xuICAgICAgICBpZiAodGhpcy5maXJzdE5vbk1hc2tQb3MgPT09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmZpcnN0Tm9uTWFza1BvcyA9IHRoaXMudGVzdHMubGVuZ3RoIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IHRoaXMucGFydGlhbFBvc2l0aW9uKSB7XG4gICAgICAgICAgdGhpcy5sYXN0UmVxdWlyZWROb25NYXNrUG9zID0gdGhpcy50ZXN0cy5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRlc3RzLnB1c2gobnVsbCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYnVmZmVyID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXNrVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gbWFza1Rva2Vuc1tpXTtcbiAgICAgIGlmIChjICE9PSAnPycpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmc1tjXSkge1xuICAgICAgICAgIHRoaXMuYnVmZmVyLnB1c2godGhpcy5nZXRQbGFjZWhvbGRlcihpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5idWZmZXIucHVzaChjKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmRlZmF1bHRCdWZmZXIgPSB0aGlzLmJ1ZmZlci5qb2luKCcnKTtcbiAgfVxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgaWYgKHRoaXMuaW5wdXRWaWV3Q2hpbGQgJiYgdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmFsdWUgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRoaXMudmFsdWU7XG4gICAgICB9XG4gICAgICB0aGlzLmNoZWNrVmFsKCk7XG4gICAgICB0aGlzLmZvY3VzVGV4dCA9IHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC52YWx1ZTtcbiAgICAgIHRoaXMudXBkYXRlRmlsbGVkU3RhdGUoKTtcbiAgICB9XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxDaGFuZ2UgPSBmbjtcbiAgfVxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLm9uTW9kZWxUb3VjaGVkID0gZm47XG4gIH1cbiAgc2V0RGlzYWJsZWRTdGF0ZSh2YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gdmFsO1xuICB9XG4gIGNhcmV0KGZpcnN0PzogbnVtYmVyLCBsYXN0PzogbnVtYmVyKTogYW55IHtcbiAgICBsZXQgcmFuZ2UsIGJlZ2luLCBlbmQ7XG4gICAgaWYgKCF0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQub2Zmc2V0UGFyZW50IHx8IHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCAhPT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGZpcnN0ID09PSAnbnVtYmVyJykge1xuICAgICAgYmVnaW4gPSBmaXJzdDtcbiAgICAgIGVuZCA9ICh0eXBlb2YgbGFzdCA9PT0gJ251bWJlcicpID8gbGFzdCA6IGJlZ2luO1xuICAgICAgaWYgKHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UoYmVnaW4sIGVuZCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudFsnY3JlYXRlVGV4dFJhbmdlJ10pIHtcbiAgICAgICAgcmFuZ2UgPSB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnRbJ2NyZWF0ZVRleHRSYW5nZSddKCk7XG4gICAgICAgIHJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICAgICAgICByYW5nZS5tb3ZlRW5kKCdjaGFyYWN0ZXInLCBlbmQpO1xuICAgICAgICByYW5nZS5tb3ZlU3RhcnQoJ2NoYXJhY3RlcicsIGJlZ2luKTtcbiAgICAgICAgcmFuZ2Uuc2VsZWN0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgYmVnaW4gPSB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICAgIGVuZCA9IHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQ7XG4gICAgICB9IGVsc2UgaWYgKChkb2N1bWVudCBhcyBhbnkpWydzZWxlY3Rpb24nXSAmJiAoZG9jdW1lbnQgYXMgYW55KVsnc2VsZWN0aW9uJ10uY3JlYXRlUmFuZ2UpIHtcbiAgICAgICAgcmFuZ2UgPSAoZG9jdW1lbnQgYXMgYW55KVsnc2VsZWN0aW9uJ10uY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgYmVnaW4gPSAwIC0gcmFuZ2UuZHVwbGljYXRlKCkubW92ZVN0YXJ0KCdjaGFyYWN0ZXInLCAtMTAwMDAwKTtcbiAgICAgICAgZW5kID0gYmVnaW4gKyByYW5nZS50ZXh0Lmxlbmd0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7YmVnaW46IGJlZ2luLCBlbmQ6IGVuZH07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlzQ29tcGxldGVkKCk6IGJvb2xlYW4ge1xuICAgIGZvciAobGV0IGkgPSB0aGlzLmZpcnN0Tm9uTWFza1BvczsgaSA8PSB0aGlzLmxhc3RSZXF1aXJlZE5vbk1hc2tQb3M7IGkrKykge1xuICAgICAgaWYgKHRoaXMudGVzdHNbaV0gJiYgdGhpcy5idWZmZXJbaV0gPT09IHRoaXMuZ2V0UGxhY2Vob2xkZXIoaSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBnZXRQbGFjZWhvbGRlcihpOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChpIDwgdGhpcy5zbG90Q2hhci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnNsb3RDaGFyLmNoYXJBdChpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2xvdENoYXIuY2hhckF0KDApO1xuICB9XG4gIHNlZWtOZXh0KHBvczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB3aGlsZSAoKytwb3MgPCB0aGlzLmxlbiAmJiAhdGhpcy50ZXN0c1twb3NdKSB7fVxuICAgIHJldHVybiBwb3M7XG4gIH1cbiAgc2Vla1ByZXYocG9zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHdoaWxlICgtLXBvcyA+PSAwICYmICF0aGlzLnRlc3RzW3Bvc10pIHt9XG4gICAgcmV0dXJuIHBvcztcbiAgfVxuICBzaGlmdEwoYmVnaW46IG51bWJlciwgZW5kOiBudW1iZXIpOiB2b2lkIHtcbiAgICBsZXQgaSwgajtcbiAgICBpZiAoYmVnaW4gPCAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoaSA9IGJlZ2luLCBqID0gdGhpcy5zZWVrTmV4dChlbmQpOyBpIDwgdGhpcy5sZW47IGkrKykge1xuICAgICAgaWYgKHRoaXMudGVzdHNbaV0pIHtcbiAgICAgICAgaWYgKGogPCB0aGlzLmxlbiAmJiB0aGlzLnRlc3RzW2ldLnRlc3QodGhpcy5idWZmZXJbal0pKSB7XG4gICAgICAgICAgdGhpcy5idWZmZXJbaV0gPSB0aGlzLmJ1ZmZlcltqXTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlcltqXSA9IHRoaXMuZ2V0UGxhY2Vob2xkZXIoaik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaiA9IHRoaXMuc2Vla05leHQoaik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMud3JpdGVCdWZmZXIoKTtcbiAgICB0aGlzLmNhcmV0KE1hdGgubWF4KHRoaXMuZmlyc3ROb25NYXNrUG9zLCBiZWdpbikpO1xuICB9XG4gIHNoaWZ0Uihwb3M6IG51bWJlcik6IHZvaWQge1xuICAgIGxldCBpLCBjLCBqLCB0O1xuICAgIGZvciAoaSA9IHBvcywgYyA9IHRoaXMuZ2V0UGxhY2Vob2xkZXIocG9zKTsgaSA8IHRoaXMubGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnRlc3RzW2ldKSB7XG4gICAgICAgIGogPSB0aGlzLnNlZWtOZXh0KGkpO1xuICAgICAgICB0ID0gdGhpcy5idWZmZXJbaV07XG4gICAgICAgIHRoaXMuYnVmZmVyW2ldID0gYztcbiAgICAgICAgaWYgKGogPCB0aGlzLmxlbiAmJiB0aGlzLnRlc3RzW2pdLnRlc3QodCkpIHtcbiAgICAgICAgICBjID0gdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBoYW5kbGVBbmRyb2lkSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJWYWwgPSB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgY29uc3QgcG9zID0gdGhpcy5jYXJldCgpIGFzIGFueTtcbiAgICBpZiAodGhpcy5vbGRWYWwgJiYgdGhpcy5vbGRWYWwubGVuZ3RoICYmIHRoaXMub2xkVmFsLmxlbmd0aCA+IGN1clZhbC5sZW5ndGggKSB7XG4gICAgICAvLyBhIGRlbGV0aW9uIG9yIGJhY2tzcGFjZSBoYXBwZW5lZFxuICAgICAgdGhpcy5jaGVja1ZhbCh0cnVlKTtcbiAgICAgIHdoaWxlIChwb3MuYmVnaW4gPiAwICYmICF0aGlzLnRlc3RzW3Bvcy5iZWdpbiAtIDFdKSB7XG4gICAgICAgIHBvcy5iZWdpbi0tO1xuICAgICAgfVxuICAgICAgaWYgKHBvcy5iZWdpbiA9PT0gMCkge1xuICAgICAgICB3aGlsZSAocG9zLmJlZ2luIDwgdGhpcy5maXJzdE5vbk1hc2tQb3MgJiYgIXRoaXMudGVzdHNbcG9zLmJlZ2luXSkge1xuICAgICAgICAgIHBvcy5iZWdpbisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYXJldChwb3MuYmVnaW4sIHBvcy5iZWdpbik7XG4gICAgICAgIHRoaXMudXBkYXRlTW9kZWwoZSk7XG4gICAgICAgIGlmICh0aGlzLmlzQ29tcGxldGVkKCkpIHtcbiAgICAgICAgICB0aGlzLm9uQ29tcGxldGUuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jaGVja1ZhbCh0cnVlKTtcbiAgICAgIHdoaWxlIChwb3MuYmVnaW4gPCB0aGlzLmxlbiAmJiAhdGhpcy50ZXN0c1twb3MuYmVnaW5dKSB7XG4gICAgICAgIHBvcy5iZWdpbisrO1xuICAgICAgfVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2FyZXQocG9zLmJlZ2luLCBwb3MuYmVnaW4pO1xuICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsKGUpO1xuICAgICAgICBpZiAodGhpcy5pc0NvbXBsZXRlZCgpKSB7XG4gICAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmVtaXQoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIG9uSW5wdXRCbHVyKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5vbk1vZGVsVG91Y2hlZCgpO1xuICAgIHRoaXMuY2hlY2tWYWwoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbGxlZFN0YXRlKCk7XG4gICAgdGhpcy5vbkJsdXIuZW1pdChlKTtcbiAgICBpZiAodGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnZhbHVlICE9PSB0aGlzLmZvY3VzVGV4dCB8fCB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwoZSk7XG4gICAgICBjb25zdCBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdIVE1MRXZlbnRzJyk7XG4gICAgICBldmVudC5pbml0RXZlbnQoJ2NoYW5nZScsIHRydWUsIGZhbHNlKTtcbiAgICAgIHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB9XG4gIH1cbiAgb25LZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrID0gZS53aGljaCB8fCBlLmtleUNvZGU7XG4gICAgbGV0IHBvcyxcbiAgICAgIGJlZ2luLFxuICAgICAgZW5kO1xuICAgIGNvbnN0IGlQaG9uZSA9IC9pcGhvbmUvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xuICAgIHRoaXMub2xkVmFsID0gdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIC8vIGJhY2tzcGFjZSwgZGVsZXRlLCBhbmQgZXNjYXBlIGdldCBzcGVjaWFsIHRyZWF0bWVudFxuICAgIGlmIChrID09PSA4IHx8IGsgPT09IDQ2IHx8IChpUGhvbmUgJiYgayA9PT0gMTI3KSkge1xuICAgICAgcG9zID0gdGhpcy5jYXJldCgpIGFzIGFueTtcbiAgICAgIGJlZ2luID0gcG9zLmJlZ2luO1xuICAgICAgZW5kID0gcG9zLmVuZDtcbiAgICAgIGlmIChlbmQgLSBiZWdpbiA9PT0gMCkge1xuICAgICAgICBiZWdpbiA9IGsgIT09IDQ2ID8gdGhpcy5zZWVrUHJldihiZWdpbikgOiAoZW5kID0gdGhpcy5zZWVrTmV4dChiZWdpbiAtIDEpKTtcbiAgICAgICAgZW5kID0gayA9PT0gNDYgPyB0aGlzLnNlZWtOZXh0KGVuZCkgOiBlbmQ7XG4gICAgICB9XG4gICAgICB0aGlzLmNsZWFyQnVmZmVyKGJlZ2luLCBlbmQpO1xuICAgICAgdGhpcy5zaGlmdEwoYmVnaW4sIGVuZCAtIDEpO1xuICAgICAgdGhpcy51cGRhdGVNb2RlbChlKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9IGVsc2UgaWYgKCBrID09PSAxMyApIHsgLy8gZW50ZXJcbiAgICAgIHRoaXMub25JbnB1dEJsdXIoZSk7XG4gICAgICB0aGlzLnVwZGF0ZU1vZGVsKGUpO1xuICAgIH0gZWxzZSBpZiAoayA9PT0gMjcpIHsgLy8gZXNjYXBlXG4gICAgICB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmZvY3VzVGV4dDtcbiAgICAgIHRoaXMuY2FyZXQoMCwgdGhpcy5jaGVja1ZhbCgpKTtcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwoZSk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ0Fycm93TGVmdCcpIHtcbiAgICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgICBjb25zdCBjaGVja2VkVmFsID0gdGhpcy5jaGVja1ZhbCh0cnVlKTtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kICYmIChzZWxlY3Rpb25TdGFydCBhcyBhbnkgLSAxKSA+IGNoZWNrZWRWYWwpIHtcbiAgICAgICAgdGhpcy5jYXJldChjaGVja2VkVmFsLCBjaGVja2VkVmFsKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdBcnJvd1JpZ2h0Jykge1xuICAgICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgIGNvbnN0IGNoZWNrZWRWYWwgPSB0aGlzLmNoZWNrVmFsKHRydWUpO1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID09PSBzZWxlY3Rpb25FbmQgJiYgKHNlbGVjdGlvblN0YXJ0IGFzIGFueSArIDEpID4gY2hlY2tlZFZhbCkge1xuICAgICAgICB0aGlzLmNhcmV0KGNoZWNrZWRWYWwsIGNoZWNrZWRWYWwpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIG9uS2V5UHJlc3MoZTogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGsgPSBlLndoaWNoIHx8IGUua2V5Q29kZTtcbiAgICBjb25zdCBwb3MgPSB0aGlzLmNhcmV0KCkgYXMgYW55O1xuICAgIGxldCBuZXh0ID0gMDtcbiAgICBsZXQgcCwgYywgY29tcGxldGVkO1xuICAgIGlmIChlLmN0cmxLZXkgfHwgZS5hbHRLZXkgfHwgZS5tZXRhS2V5IHx8IGsgPCAzMiAgfHwgKGsgPiAzNCAmJiBrIDwgNDEpKSB7Ly8gSWdub3JlXG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmICggayAmJiBrICE9PSAxMyApIHtcbiAgICAgIGlmIChwb3MuZW5kIC0gcG9zLmJlZ2luICE9PSAwKSB7XG4gICAgICAgIHRoaXMuY2xlYXJCdWZmZXIocG9zLmJlZ2luLCBwb3MuZW5kKTtcbiAgICAgICAgdGhpcy5zaGlmdEwocG9zLmJlZ2luLCBwb3MuZW5kIC0gMSk7XG4gICAgICB9XG4gICAgICBwID0gdGhpcy5zZWVrTmV4dChwb3MuYmVnaW4gLSAxKTtcbiAgICAgIGlmIChwIDwgdGhpcy5sZW4pIHtcbiAgICAgICAgYyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoayk7XG4gICAgICAgIGlmICh0aGlzLnRlc3RzW3BdLnRlc3QoYykpIHtcbiAgICAgICAgICB0aGlzLnNoaWZ0UihwKTtcbiAgICAgICAgICB0aGlzLmJ1ZmZlcltwXSA9IGM7XG4gICAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcigpO1xuICAgICAgICAgIG5leHQgPSB0aGlzLnNlZWtOZXh0KHApO1xuICAgICAgICAgIGlmICgvYW5kcm9pZC9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgICAgICAgIC8vIFBhdGggZm9yIENTUCBWaW9sYXRpb24gb24gRmlyZUZveCBPUyAxLjFcbiAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmNhcmV0KG5leHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQocHJveHksIDApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNhcmV0KG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocG9zLmJlZ2luIDw9IHRoaXMubGFzdFJlcXVpcmVkTm9uTWFza1Bvcykge1xuICAgICAgICAgICAgY29tcGxldGVkID0gdGhpcy5pc0NvbXBsZXRlZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU1vZGVsKGUpO1xuICAgIHRoaXMudXBkYXRlRmlsbGVkU3RhdGUoKTtcbiAgICBpZiAoY29tcGxldGVkKSB7XG4gICAgICB0aGlzLm9uQ29tcGxldGUuZW1pdCgpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogQWRqdXN0IGN1cnNvciBwb3NpdGlvbiBpZiBjbGlja2VkIG9uIGVtcHR5IHNwYWNlIGFoZWFkIG9mIHRoZSBleGlzdGluZyBpbnB1dFxuICAgKi9cbiAgb25DbGljaygpOiB2b2lkIHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGNoZWNrZWRWYWwgPSB0aGlzLmNoZWNrVmFsKHRydWUpO1xuICAgIGlmIChzZWxlY3Rpb25TdGFydCA9PT0gc2VsZWN0aW9uRW5kICYmIHNlbGVjdGlvblN0YXJ0IGFzIGFueSA+IGNoZWNrZWRWYWwpIHtcbiAgICAgIHRoaXMuY2FyZXQoY2hlY2tlZFZhbCwgY2hlY2tlZFZhbCk7XG4gICAgfVxuICB9XG4gIGNsZWFyQnVmZmVyKHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IGk7XG4gICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQgJiYgaSA8IHRoaXMubGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnRlc3RzW2ldKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyW2ldID0gdGhpcy5nZXRQbGFjZWhvbGRlcihpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd3JpdGVCdWZmZXIoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5idWZmZXIuam9pbignJyk7XG4gIH1cbiAgY2hlY2tWYWwoYWxsb3c/OiBib29sZWFuKTogbnVtYmVyIHtcbiAgICAvLyB0cnkgdG8gcGxhY2UgY2hhcmFjdGVycyB3aGVyZSB0aGV5IGJlbG9uZ1xuICAgIGNvbnN0IHRlc3QgPSB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgbGV0IGxhc3RNYXRjaCA9IC0xLFxuICAgICAgaSxcbiAgICAgIGMsXG4gICAgICBwb3M7XG4gICAgZm9yIChpID0gMCwgcG9zID0gMDsgaSA8IHRoaXMubGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLnRlc3RzW2ldKSB7XG4gICAgICAgIHRoaXMuYnVmZmVyW2ldID0gdGhpcy5nZXRQbGFjZWhvbGRlcihpKTtcbiAgICAgICAgd2hpbGUgKHBvcysrIDwgdGVzdC5sZW5ndGgpIHtcbiAgICAgICAgICBjID0gdGVzdC5jaGFyQXQocG9zIC0gMSk7XG4gICAgICAgICAgaWYgKHRoaXMudGVzdHNbaV0udGVzdChjKSkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXJbaV0gPSBjO1xuICAgICAgICAgICAgbGFzdE1hdGNoID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocG9zID4gdGVzdC5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQnVmZmVyKGkgKyAxLCB0aGlzLmxlbik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcltpXSA9PT0gdGVzdC5jaGFyQXQocG9zKSkge1xuICAgICAgICAgIHBvcysrO1xuICAgICAgICB9XG4gICAgICAgIGlmICggaSA8IHRoaXMucGFydGlhbFBvc2l0aW9uKSB7XG4gICAgICAgICAgbGFzdE1hdGNoID0gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsb3cpIHtcbiAgICAgIHRoaXMud3JpdGVCdWZmZXIoKTtcbiAgICB9IGVsc2UgaWYgKGxhc3RNYXRjaCArIDEgPCB0aGlzLnBhcnRpYWxQb3NpdGlvbikge1xuICAgICAgaWYgKHRoaXMuYXV0b0NsZWFyIHx8IHRoaXMuYnVmZmVyLmpvaW4oJycpID09PSB0aGlzLmRlZmF1bHRCdWZmZXIpIHtcbiAgICAgICAgLy8gSW52YWxpZCB2YWx1ZS4gUmVtb3ZlIGl0IGFuZCByZXBsYWNlIGl0IHdpdGggdGhlXG4gICAgICAgIC8vIG1hc2ssIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yLlxuICAgICAgICBpZiAodGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnZhbHVlKSB7XG4gICAgICAgICAgdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhckJ1ZmZlcigwLCB0aGlzLmxlbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnZhbGlkIHZhbHVlLCBidXQgd2Ugb3B0IHRvIHNob3cgdGhlIHZhbHVlIHRvIHRoZVxuICAgICAgICAvLyB1c2VyIGFuZCBhbGxvdyB0aGVtIHRvIGNvcnJlY3QgdGhlaXIgbWlzdGFrZS5cbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLndyaXRlQnVmZmVyKCk7XG4gICAgICB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB0aGlzLmlucHV0Vmlld0NoaWxkLm5hdGl2ZUVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKDAsIGxhc3RNYXRjaCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMucGFydGlhbFBvc2l0aW9uID8gaSA6IHRoaXMuZmlyc3ROb25NYXNrUG9zKTtcbiAgfVxuICBvbklucHV0Rm9jdXMoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5jYXJldFRpbWVvdXRJZCk7XG4gICAgbGV0IHBvczogbnVtYmVyO1xuICAgIHRoaXMuZm9jdXNUZXh0ID0gdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LnZhbHVlO1xuICAgIHBvcyA9IHRoaXMuY2hlY2tWYWwoKTtcbiAgICB0aGlzLmNhcmV0VGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50ICE9PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMud3JpdGVCdWZmZXIoKTtcbiAgICAgIGlmIChwb3MgPT09IHRoaXMubWFzay5yZXBsYWNlKCc/JywgJycpLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmNhcmV0KDAsIHBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNhcmV0KHBvcyk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICAgIHRoaXMub25Gb2N1cy5lbWl0KGV2ZW50KTtcbiAgfVxuICBvbklucHV0Q2hhbmdlKGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZHJvaWRDaHJvbWUpIHtcbiAgICAgIHRoaXMuaGFuZGxlQW5kcm9pZElucHV0KGV2ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oYW5kbGVJbnB1dENoYW5nZShldmVudCk7XG4gICAgfVxuICAgIHRoaXMub25JbnB1dC5lbWl0KGV2ZW50KTtcbiAgfVxuICBoYW5kbGVJbnB1dENoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IHBvcyA9IHRoaXMuY2hlY2tWYWwodHJ1ZSk7XG4gICAgICB0aGlzLmNhcmV0KHBvcyk7XG4gICAgICB0aGlzLnVwZGF0ZU1vZGVsKGV2ZW50KTtcbiAgICAgIGlmICh0aGlzLmlzQ29tcGxldGVkKCkpIHtcbiAgICAgICAgdGhpcy5vbkNvbXBsZXRlLmVtaXQoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcbiAgfVxuICBnZXRVbm1hc2tlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5tYXNrZWRCdWZmZXIgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYnVmZmVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5idWZmZXJbaV07XG4gICAgICBpZiAodGhpcy50ZXN0c1tpXSAmJiBjICE9PSB0aGlzLmdldFBsYWNlaG9sZGVyKGkpKSB7XG4gICAgICAgIHVubWFza2VkQnVmZmVyLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bm1hc2tlZEJ1ZmZlci5qb2luKCcnKTtcbiAgfVxuICB1cGRhdGVNb2RlbChlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCB1cGRhdGVkVmFsdWUgPSB0aGlzLnVubWFzayA/IHRoaXMuZ2V0VW5tYXNrZWRWYWx1ZSgpIDogZS50YXJnZXQ/LnZhbHVlO1xuICAgIGlmICh1cGRhdGVkVmFsdWUgIT09IG51bGwgJiYgdXBkYXRlZFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB1cGRhdGVkVmFsdWU7XG4gICAgICB0aGlzLm9uTW9kZWxDaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHVwZGF0ZUZpbGxlZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsbGVkID0gdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50ICYmIHRoaXMuaW5wdXRWaWV3Q2hpbGQubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gJyc7XG4gIH1cbiAgZm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dFZpZXdDaGlsZC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cbn1cbiJdfQ==