design-angular-kit 0.12.0 → 1.0.0-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 (201) hide show
  1. package/README.md +61 -31
  2. package/esm2020/design-angular-kit.mjs +5 -0
  3. package/esm2020/lib/badge/badge.directive.mjs +83 -0
  4. package/esm2020/lib/breadcrumb/breadcrumb-item.component.mjs +66 -0
  5. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +89 -0
  6. package/esm2020/lib/button/button.directive.mjs +185 -0
  7. package/esm2020/lib/button/button.module.mjs +18 -0
  8. package/esm2020/lib/checkbox/checkbox.component.mjs +138 -0
  9. package/esm2020/lib/collapse/collapse-group.component.mjs +57 -0
  10. package/esm2020/lib/collapse/collapse-item.component.mjs +79 -0
  11. package/esm2020/lib/collapse/collapse.config.mjs +12 -0
  12. package/esm2020/lib/collapse/collapse.directive.mjs +55 -0
  13. package/esm2020/lib/collapse/collapse.module.mjs +22 -0
  14. package/esm2020/lib/design-angular-kit.module.mjs +142 -0
  15. package/esm2020/lib/dropdown/dropdown-divider.component.mjs +11 -0
  16. package/esm2020/lib/dropdown/dropdown-item.component.mjs +97 -0
  17. package/esm2020/lib/dropdown/dropdown.component.mjs +143 -0
  18. package/esm2020/lib/dropdown/dropdown.config.mjs +12 -0
  19. package/esm2020/lib/dropdown/dropdown.directive.mjs +156 -0
  20. package/esm2020/lib/dropdown/dropdown.module.mjs +25 -0
  21. package/esm2020/lib/enums/icons.enum.mjs +27 -0
  22. package/esm2020/lib/form-input/form-input-password.utils.mjs +154 -0
  23. package/esm2020/lib/form-input/form-input.component.mjs +495 -0
  24. package/esm2020/lib/form-input/it-prefix.directive.mjs +13 -0
  25. package/esm2020/lib/form-input/it-suffix.directive.mjs +13 -0
  26. package/esm2020/lib/form-input/it-text-prefix.directive.mjs +13 -0
  27. package/esm2020/lib/form-input/it-text-suffix.directive.mjs +13 -0
  28. package/esm2020/lib/form-input/mark-matching-text.pipe.mjs +36 -0
  29. package/esm2020/lib/icon/icon.component.mjs +87 -0
  30. package/esm2020/lib/icon/icon.module.mjs +18 -0
  31. package/esm2020/lib/models/Alignment.mjs +15 -0
  32. package/esm2020/lib/models/ButtonSize.mjs +15 -0
  33. package/esm2020/lib/models/InputType.mjs +44 -0
  34. package/esm2020/lib/models/ThemeColor.mjs +30 -0
  35. package/esm2020/lib/popover/popover.config.mjs +17 -0
  36. package/esm2020/lib/popover/popover.directive.mjs +33 -0
  37. package/esm2020/lib/popover/popover.module.mjs +19 -0
  38. package/esm2020/lib/progress-bar/progress-bar.component.mjs +98 -0
  39. package/esm2020/lib/radio/radio.component.mjs +287 -0
  40. package/esm2020/lib/radio/unique-selection-dispatcher.mjs +55 -0
  41. package/esm2020/lib/tabs/tab-group.component.mjs +177 -0
  42. package/esm2020/lib/tabs/tab.component.mjs +73 -0
  43. package/esm2020/lib/tabs/tabs.module.mjs +20 -0
  44. package/esm2020/lib/toggle/toggle.component.mjs +86 -0
  45. package/esm2020/lib/tooltip/tooltip.config.mjs +17 -0
  46. package/esm2020/lib/tooltip/tooltip.directive.mjs +43 -0
  47. package/esm2020/lib/tooltip/tooltip.module.mjs +19 -0
  48. package/esm2020/lib/util/focus-mouse.directive.mjs +32 -0
  49. package/esm2020/lib/util/util.mjs +12 -0
  50. package/esm2020/lib/util/utils.module.mjs +16 -0
  51. package/esm2020/public_api.mjs +40 -0
  52. package/fesm2015/design-angular-kit.mjs +3181 -0
  53. package/fesm2015/design-angular-kit.mjs.map +1 -0
  54. package/fesm2020/design-angular-kit.mjs +3160 -0
  55. package/fesm2020/design-angular-kit.mjs.map +1 -0
  56. package/index.d.ts +5 -0
  57. package/lib/badge/badge.directive.d.ts +11 -5
  58. package/lib/breadcrumb/breadcrumb-item.component.d.ts +16 -5
  59. package/lib/breadcrumb/breadcrumb.component.d.ts +12 -5
  60. package/lib/button/button.directive.d.ts +72 -0
  61. package/lib/button/button.module.d.ts +8 -0
  62. package/lib/checkbox/checkbox.component.d.ts +25 -5
  63. package/lib/collapse/collapse-group.component.d.ts +16 -0
  64. package/lib/collapse/collapse-item.component.d.ts +46 -0
  65. package/lib/collapse/collapse.config.d.ts +6 -0
  66. package/lib/collapse/collapse.directive.d.ts +25 -0
  67. package/lib/collapse/collapse.module.d.ts +12 -0
  68. package/lib/design-angular-kit.module.d.ts +27 -0
  69. package/lib/dropdown/dropdown-divider.component.d.ts +3 -0
  70. package/lib/dropdown/dropdown-item.component.d.ts +22 -8
  71. package/lib/dropdown/dropdown.component.d.ts +34 -26
  72. package/lib/dropdown/dropdown.config.d.ts +6 -0
  73. package/lib/dropdown/dropdown.directive.d.ts +77 -0
  74. package/lib/dropdown/dropdown.module.d.ts +15 -0
  75. package/lib/enums/icons.enum.d.ts +23 -0
  76. package/lib/form-input/form-input-password.utils.d.ts +45 -0
  77. package/lib/form-input/form-input.component.d.ts +202 -20
  78. package/lib/form-input/it-prefix.directive.d.ts +5 -0
  79. package/lib/form-input/it-suffix.directive.d.ts +5 -0
  80. package/lib/form-input/it-text-prefix.directive.d.ts +5 -0
  81. package/lib/form-input/it-text-suffix.directive.d.ts +5 -0
  82. package/lib/form-input/mark-matching-text.pipe.d.ts +10 -0
  83. package/lib/icon/icon.component.d.ts +34 -0
  84. package/lib/icon/icon.module.d.ts +8 -0
  85. package/lib/models/Alignment.d.ts +12 -0
  86. package/lib/models/ButtonSize.d.ts +1 -1
  87. package/lib/models/InputType.d.ts +22 -1
  88. package/lib/models/ThemeColor.d.ts +1 -1
  89. package/lib/popover/popover.config.d.ts +5 -6
  90. package/lib/popover/popover.directive.d.ts +13 -108
  91. package/lib/popover/popover.module.d.ts +9 -0
  92. package/lib/progress-bar/progress-bar.component.d.ts +25 -19
  93. package/lib/radio/radio.component.d.ts +22 -10
  94. package/lib/radio/unique-selection-dispatcher.d.ts +3 -0
  95. package/lib/tabs/tab-group.component.d.ts +17 -11
  96. package/lib/tabs/tab.component.d.ts +6 -2
  97. package/lib/tabs/tabs.module.d.ts +10 -0
  98. package/lib/toggle/toggle.component.d.ts +9 -4
  99. package/lib/tooltip/tooltip.config.d.ts +7 -7
  100. package/lib/tooltip/tooltip.directive.d.ts +12 -92
  101. package/lib/tooltip/tooltip.module.d.ts +9 -0
  102. package/lib/util/focus-mouse.directive.d.ts +13 -0
  103. package/lib/util/utils.module.d.ts +7 -0
  104. package/package.json +34 -20
  105. package/public_api.d.ts +19 -2
  106. package/bundles/design-angular-kit.umd.js +0 -5829
  107. package/bundles/design-angular-kit.umd.js.map +0 -1
  108. package/bundles/design-angular-kit.umd.min.js +0 -31
  109. package/bundles/design-angular-kit.umd.min.js.map +0 -1
  110. package/design-angular-kit.d.ts +0 -8
  111. package/design-angular-kit.metadata.json +0 -1
  112. package/esm2015/design-angular-kit.js +0 -14
  113. package/esm2015/lib/badge/badge.directive.js +0 -116
  114. package/esm2015/lib/breadcrumb/breadcrumb-item.component.js +0 -117
  115. package/esm2015/lib/breadcrumb/breadcrumb.component.js +0 -128
  116. package/esm2015/lib/button/button.component.js +0 -165
  117. package/esm2015/lib/checkbox/checkbox.component.js +0 -170
  118. package/esm2015/lib/design-angular-kit.module.js +0 -81
  119. package/esm2015/lib/dropdown/dropdown-divider.component.js +0 -18
  120. package/esm2015/lib/dropdown/dropdown-header.component.js +0 -29
  121. package/esm2015/lib/dropdown/dropdown-item.component.js +0 -157
  122. package/esm2015/lib/dropdown/dropdown.component.js +0 -248
  123. package/esm2015/lib/form-input/form-input.component.js +0 -489
  124. package/esm2015/lib/models/ButtonSize.js +0 -25
  125. package/esm2015/lib/models/IconPosition.js +0 -21
  126. package/esm2015/lib/models/InputType.js +0 -33
  127. package/esm2015/lib/models/InteractionTrigger.js +0 -35
  128. package/esm2015/lib/models/ThemeColor.js +0 -45
  129. package/esm2015/lib/popover/popover.component.js +0 -134
  130. package/esm2015/lib/popover/popover.config.js +0 -35
  131. package/esm2015/lib/popover/popover.directive.js +0 -433
  132. package/esm2015/lib/popover/popup.js +0 -105
  133. package/esm2015/lib/popover/positioning.js +0 -349
  134. package/esm2015/lib/popover/triggers.js +0 -99
  135. package/esm2015/lib/progress-bar/progress-bar.component.js +0 -170
  136. package/esm2015/lib/radio/radio.component.js +0 -526
  137. package/esm2015/lib/radio/unique-selection-dispatcher.js +0 -70
  138. package/esm2015/lib/tabs/tab-group.component.js +0 -339
  139. package/esm2015/lib/tabs/tab.component.js +0 -143
  140. package/esm2015/lib/toggle/toggle.component.js +0 -173
  141. package/esm2015/lib/tooltip/popup.js +0 -105
  142. package/esm2015/lib/tooltip/positioning.js +0 -349
  143. package/esm2015/lib/tooltip/tooltip.component.js +0 -77
  144. package/esm2015/lib/tooltip/tooltip.config.js +0 -31
  145. package/esm2015/lib/tooltip/tooltip.directive.js +0 -384
  146. package/esm2015/lib/tooltip/triggers.js +0 -99
  147. package/esm2015/lib/util/util.js +0 -30
  148. package/esm2015/public_api.js +0 -28
  149. package/esm5/design-angular-kit.js +0 -14
  150. package/esm5/lib/badge/badge.directive.js +0 -145
  151. package/esm5/lib/breadcrumb/breadcrumb-item.component.js +0 -135
  152. package/esm5/lib/breadcrumb/breadcrumb.component.js +0 -164
  153. package/esm5/lib/button/button.component.js +0 -221
  154. package/esm5/lib/checkbox/checkbox.component.js +0 -200
  155. package/esm5/lib/design-angular-kit.module.js +0 -85
  156. package/esm5/lib/dropdown/dropdown-divider.component.js +0 -20
  157. package/esm5/lib/dropdown/dropdown-header.component.js +0 -27
  158. package/esm5/lib/dropdown/dropdown-item.component.js +0 -197
  159. package/esm5/lib/dropdown/dropdown.component.js +0 -309
  160. package/esm5/lib/form-input/form-input.component.js +0 -582
  161. package/esm5/lib/models/ButtonSize.js +0 -25
  162. package/esm5/lib/models/IconPosition.js +0 -21
  163. package/esm5/lib/models/InputType.js +0 -33
  164. package/esm5/lib/models/InteractionTrigger.js +0 -35
  165. package/esm5/lib/models/ThemeColor.js +0 -45
  166. package/esm5/lib/popover/popover.component.js +0 -144
  167. package/esm5/lib/popover/popover.config.js +0 -37
  168. package/esm5/lib/popover/popover.directive.js +0 -573
  169. package/esm5/lib/popover/popup.js +0 -116
  170. package/esm5/lib/popover/positioning.js +0 -446
  171. package/esm5/lib/popover/triggers.js +0 -115
  172. package/esm5/lib/progress-bar/progress-bar.component.js +0 -218
  173. package/esm5/lib/radio/radio.component.js +0 -610
  174. package/esm5/lib/radio/unique-selection-dispatcher.js +0 -108
  175. package/esm5/lib/tabs/tab-group.component.js +0 -401
  176. package/esm5/lib/tabs/tab.component.js +0 -156
  177. package/esm5/lib/toggle/toggle.component.js +0 -200
  178. package/esm5/lib/tooltip/popup.js +0 -116
  179. package/esm5/lib/tooltip/positioning.js +0 -446
  180. package/esm5/lib/tooltip/tooltip.component.js +0 -80
  181. package/esm5/lib/tooltip/tooltip.config.js +0 -33
  182. package/esm5/lib/tooltip/tooltip.directive.js +0 -516
  183. package/esm5/lib/tooltip/triggers.js +0 -115
  184. package/esm5/lib/util/util.js +0 -48
  185. package/esm5/public_api.js +0 -28
  186. package/fesm2015/design-angular-kit.js +0 -4751
  187. package/fesm2015/design-angular-kit.js.map +0 -1
  188. package/fesm5/design-angular-kit.js +0 -5867
  189. package/fesm5/design-angular-kit.js.map +0 -1
  190. package/lib/button/button.component.d.ts +0 -50
  191. package/lib/dropdown/dropdown-header.component.d.ts +0 -3
  192. package/lib/models/IconPosition.d.ts +0 -9
  193. package/lib/models/InteractionTrigger.d.ts +0 -19
  194. package/lib/popover/popover.component.d.ts +0 -25
  195. package/lib/popover/popup.d.ts +0 -27
  196. package/lib/popover/positioning.d.ts +0 -32
  197. package/lib/popover/triggers.d.ts +0 -18
  198. package/lib/tooltip/popup.d.ts +0 -27
  199. package/lib/tooltip/positioning.d.ts +0 -32
  200. package/lib/tooltip/tooltip.component.d.ts +0 -20
  201. package/lib/tooltip/triggers.d.ts +0 -18
@@ -0,0 +1,495 @@
1
+ import { Component, Input, ChangeDetectionStrategy, forwardRef, Output, EventEmitter, ViewChild, ContentChildren, HostListener } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { merge } from 'rxjs';
4
+ import { InputType, INPUT_TYPES } from '../models/InputType';
5
+ import { Util } from '../util/util';
6
+ import { FormInputPasswordUtils } from './form-input-password.utils';
7
+ import { ItPrefixDirective } from './it-prefix.directive';
8
+ import { ItSuffixDirective } from './it-suffix.directive';
9
+ import { ItTextPrefixDirective } from './it-text-prefix.directive';
10
+ import { ItTextSuffixDirective } from './it-text-suffix.directive';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/common";
13
+ import * as i2 from "../util/focus-mouse.directive";
14
+ import * as i3 from "../icon/icon.component";
15
+ import * as i4 from "./mark-matching-text.pipe";
16
+ let identifier = 0;
17
+ export class FormInputChange {
18
+ constructor(source, value) {
19
+ this.source = source;
20
+ this.value = value;
21
+ }
22
+ }
23
+ /**
24
+ * Elementi e stili per la creazione di input accessibili e responsivi.
25
+ */
26
+ export class FormInputComponent {
27
+ constructor(_changeDetector) {
28
+ this._changeDetector = _changeDetector;
29
+ this.INPUT_TYPES = INPUT_TYPES;
30
+ this._readonlyPlainText = false;
31
+ this._enablePasswordStrengthMeter = false;
32
+ /**
33
+ * Punteggio di sicurezza calcolato in base alla password immessa se enablePasswordStrengthMeter ha valore true
34
+ */
35
+ this.passwordScore = 0;
36
+ /**
37
+ * Dimensione dell'input di autocomplete. Di default ha dimensione standard.
38
+ */
39
+ this.autocompleteWrapperSize = 'default';
40
+ this._passwordStrengthMeterConfig = FormInputPasswordUtils.DEFAULT_CONFIG;
41
+ this._id = `form-input-${identifier++}`;
42
+ this._type = INPUT_TYPES.TEXT;
43
+ this._labelVisuallyHidden = false;
44
+ this._step = 1;
45
+ this._disabled = false;
46
+ this._currency = false;
47
+ this._percentage = false;
48
+ this._adaptive = false;
49
+ this._readonly = false;
50
+ /**
51
+ * Evento emesso quando il valore dell'input cambia.
52
+ * Gli eventi di change sono emessi soltanto quando il valore cambia a causa dell'interazione dell'utente
53
+ * con il campo d'input.
54
+ */
55
+ this.change = new EventEmitter();
56
+ this._disableCapsLockAlert = false;
57
+ /**
58
+ * Indica se è attivo il CAPS LOCK
59
+ */
60
+ this.isCapsLockActive = false;
61
+ /**
62
+ * La label da mostrare in caso sia attivo il CAPS LOCK
63
+ */
64
+ this.capsLockActiveLabel = 'CAPS LOCK inserito';
65
+ this._isPasswordMode = false;
66
+ this._isPasswordVisible = false;
67
+ this.showAutocompletion = false;
68
+ this._isInitialized = false;
69
+ this._controlValueAccessorChangeFn = () => { };
70
+ this._onTouched = () => { };
71
+ /** Indica se è stato effettuato il focus sul campo di input */
72
+ this.focus = false;
73
+ }
74
+ /**
75
+ * Opzionale. Indica se mostrare gli input readonly nella forma stilizzata come testo normale
76
+ */
77
+ get readonlyPlainText() { return this._readonlyPlainText; }
78
+ set readonlyPlainText(value) { this._readonlyPlainText = Util.coerceBooleanProperty(value); }
79
+ /**
80
+ * Opzionale. Indica se abilitare il controllo sulla sicurezza della password
81
+ */
82
+ get enablePasswordStrengthMeter() { return this._enablePasswordStrengthMeter; }
83
+ set enablePasswordStrengthMeter(value) { this._enablePasswordStrengthMeter = Util.coerceBooleanProperty(value); }
84
+ set passwordStrengthMeterConfig(newConfig) {
85
+ this._passwordStrengthMeterConfig = { ...this._passwordStrengthMeterConfig, ...newConfig };
86
+ }
87
+ get passwordStrengthMeterConfig() {
88
+ return this._passwordStrengthMeterConfig;
89
+ }
90
+ /**
91
+ * Indica l'id dell'elemento HTML
92
+ */
93
+ get id() {
94
+ return this._id;
95
+ }
96
+ set id(value) {
97
+ this._id = value;
98
+ }
99
+ /**
100
+ * Indica l'attributo name del componente HTML
101
+ */
102
+ get name() {
103
+ return this._name;
104
+ }
105
+ set name(value) {
106
+ this._name = value;
107
+ }
108
+ /**
109
+ * Indica il tipo di campo. Puo' assumere i valori text, email, password e number
110
+ */
111
+ get type() {
112
+ return this._type;
113
+ }
114
+ set type(value) {
115
+ if (InputType.is(value)) {
116
+ if (value === INPUT_TYPES.NUMBER) {
117
+ if (isNaN(Number(this.value))) {
118
+ this.value = '';
119
+ this.onChange();
120
+ }
121
+ }
122
+ this._type = value;
123
+ }
124
+ else {
125
+ this._type = INPUT_TYPES.TEXT;
126
+ }
127
+ this._isPasswordMode = this._type === INPUT_TYPES.PASSWORD;
128
+ this._isPasswordVisible = false;
129
+ this.showAutocompletion = false;
130
+ }
131
+ /**
132
+ * Indica il valore della label da visualizzare
133
+ */
134
+ get label() { return this._label; }
135
+ set label(value) { this._label = value; }
136
+ /**
137
+ * Indica se la label dell'input deve essere visualizzata dall'utente o solamente visibile per lo screen reader
138
+ */
139
+ get labelVisuallyHidden() { return this._labelVisuallyHidden; }
140
+ set labelVisuallyHidden(value) { this._labelVisuallyHidden = value; }
141
+ /**
142
+ * Indica il valore che avrà l'attributo HTML "min" per l'input di tipo number
143
+ */
144
+ get min() { return this._min; }
145
+ set min(value) { this._min = Util.coerceNumberProperty(value); }
146
+ /**
147
+ * Indica il valore che avrà l'attributo HTML "max" per l'input di tipo number
148
+ */
149
+ get max() { return this._max; }
150
+ set max(value) { this._max = Util.coerceNumberProperty(value); }
151
+ /**
152
+ * Indica il valore che avrà l'attributo HTML "step" per l'input di tipo number
153
+ */
154
+ get step() { return this._step; }
155
+ set step(value) { this._step = Util.coerceNumberProperty(value); }
156
+ /**
157
+ * Indica il testo di aiuto sotto la input
158
+ */
159
+ get note() { return this._note; }
160
+ set note(value) { this._note = value; }
161
+ /**
162
+ * Indica il testo presente nel campo vuoto. Nel caso sia già presente la label, il placeholder non verrà mostrato
163
+ */
164
+ get placeholder() {
165
+ return this._placeholder || '';
166
+ }
167
+ set placeholder(value) { this._placeholder = value; }
168
+ /**
169
+ * Indica l'icona da visualizzare a sinistra del campo di input
170
+ */
171
+ get icon() { return this._icon; }
172
+ set icon(value) { this._icon = value; }
173
+ /**
174
+ * Opzionale.
175
+ * Indica se il campo in questione è disabilitato.
176
+ * Accetta una espressione booleana o può essere usato come attributo senza valore
177
+ */
178
+ get disabled() { return this._disabled; }
179
+ set disabled(value) { this._disabled = Util.coerceBooleanProperty(value); }
180
+ /**
181
+ * Opzionale.
182
+ * Nel caso di input numerico, indica se il campo è una valuta.
183
+ * Accetta una espressione booleana o può essere usato come attributo senza valore
184
+ */
185
+ get currency() { return this._currency; }
186
+ set currency(value) { this._currency = Util.coerceBooleanProperty(value); }
187
+ /**
188
+ * Opzionale.
189
+ * Nel caso di input numerico, indica se il campo è una percentuale.
190
+ * Accetta una espressione booleana o può essere usato come attributo senza valore
191
+ */
192
+ get percentage() { return this._percentage; }
193
+ set percentage(value) { this._percentage = Util.coerceBooleanProperty(value); }
194
+ /**
195
+ * Opzionale.
196
+ * Nel caso di input numerico, indica se il campo si deve ridimensionare automaticamente a seconda del valore contenuto in esso.
197
+ * Accetta una espressione booleana o può essere usato come attributo senza valore
198
+ */
199
+ get adaptive() { return this._adaptive; }
200
+ set adaptive(value) { this._adaptive = Util.coerceBooleanProperty(value); }
201
+ /**
202
+ * Opzionale.
203
+ * Indica se il campo in questione è di sola lettura.
204
+ * Accetta una espressione booleana o può essere usato come attributo senza valore
205
+ */
206
+ get readonly() { return this._readonly; }
207
+ set readonly(value) { this._readonly = Util.coerceBooleanProperty(value); }
208
+ get value() { return this._inputElement?.nativeElement?.value; }
209
+ set value(value) {
210
+ if (this._inputElement) {
211
+ this._inputElement.nativeElement.value = value;
212
+ }
213
+ }
214
+ /**
215
+ * Opzionale.
216
+ * Disponibile solo se il type è search.
217
+ * Indica la lista di elementi ricercabili su cui basare il sistema di autocompletamento della input
218
+ */
219
+ get autoCompleteData() { return this._autoCompleteData; }
220
+ set autoCompleteData(value) { this._autoCompleteData = value; }
221
+ /**
222
+ * Opzionale.
223
+ * Indica se disabilitare l'avviso di CAPS LOCK attivo
224
+ * Accetta una espressione booleana o può essere usato come attributo senza valore
225
+ */
226
+ get disableCapsLockAlert() { return this._disableCapsLockAlert; }
227
+ set disableCapsLockAlert(value) { this._disableCapsLockAlert = Util.coerceBooleanProperty(value); }
228
+ get isLabelActive() {
229
+ return this._isLabelActive;
230
+ }
231
+ set isLabelActive(value) {
232
+ const newValue = Util.coerceBooleanProperty(value);
233
+ // In alcuni casi la label deve essere sempre posizionata sopra l'input per evitare sovrapposizioni
234
+ // di testo, come in caso di presenza del placeholder o per l'input di tipo "date" o "time"
235
+ if (newValue || (!this.value && !this.placeholder && this.type !== INPUT_TYPES.TIME &&
236
+ this.type !== INPUT_TYPES.DATE && this.type !== INPUT_TYPES.NUMBER)) {
237
+ this._isLabelActive = newValue;
238
+ }
239
+ else {
240
+ this._isLabelActive = true;
241
+ }
242
+ }
243
+ get isPasswordMode() {
244
+ return this._isPasswordMode;
245
+ }
246
+ set isPasswordMode(value) {
247
+ this._isPasswordMode = Util.coerceBooleanProperty(value);
248
+ }
249
+ get isPasswordVisible() {
250
+ return this._isPasswordVisible;
251
+ }
252
+ set isPasswordVisible(value) {
253
+ this._isPasswordVisible = Util.coerceBooleanProperty(value);
254
+ this._type = this._isPasswordVisible ? INPUT_TYPES.TEXT : INPUT_TYPES.PASSWORD;
255
+ }
256
+ _emitChangeEvent() {
257
+ if (this._isInitialized) {
258
+ this.change.emit(new FormInputChange(this, this.value));
259
+ }
260
+ }
261
+ ngOnInit() {
262
+ this.isLabelActive = false;
263
+ this._formInputPasswordUtils = new FormInputPasswordUtils(this.passwordStrengthMeterConfig);
264
+ }
265
+ writeValue(value) {
266
+ this.value = value;
267
+ if (this.value) {
268
+ this.isLabelActive = true;
269
+ }
270
+ this.onChange();
271
+ if (this._isInitialized) {
272
+ this._changeDetector.detectChanges();
273
+ }
274
+ }
275
+ registerOnChange(fn) {
276
+ this._controlValueAccessorChangeFn = fn;
277
+ }
278
+ registerOnTouched(fn) {
279
+ this._onTouched = fn;
280
+ }
281
+ ngAfterContentInit() {
282
+ this._isInitialized = true;
283
+ // Run change detection if the suffix or prefix changes.
284
+ merge(this._prefixChildren.changes, this._suffixChildren.changes, this._textPrefixChildren.changes, this._textSuffixChildren.changes).subscribe(() => {
285
+ this._changeDetector.markForCheck();
286
+ });
287
+ }
288
+ onChange() {
289
+ this._emitChangeEvent();
290
+ this._controlValueAccessorChangeFn(this.value);
291
+ }
292
+ onInput() {
293
+ if (this.isPasswordMode && this._enablePasswordStrengthMeter) {
294
+ this.recalculatePasswordStrength();
295
+ }
296
+ this.showAutocompletion = this._type === INPUT_TYPES.SEARCH && this.isAutocompletable() && this.value;
297
+ this._emitChangeEvent();
298
+ this._controlValueAccessorChangeFn(this.value);
299
+ }
300
+ onFocus() {
301
+ this.focus = true;
302
+ this.isLabelActive = true;
303
+ }
304
+ onBlur() {
305
+ this.focus = false;
306
+ const inputValue = this.value;
307
+ if (!inputValue || inputValue.length === 0) {
308
+ this.isLabelActive = false;
309
+ if (this.type === INPUT_TYPES.NUMBER) {
310
+ this.value = '';
311
+ }
312
+ }
313
+ }
314
+ get noteId() {
315
+ return `${this.id}-note`;
316
+ }
317
+ getRelatedEntries() {
318
+ if (this.value) {
319
+ const lowercaseValue = this.value.toLowerCase();
320
+ const lowercaseData = this._autoCompleteData.filter((item) => item.value).map(item => {
321
+ return { ...item, original: item.value, lowercase: item.value.toLowerCase() };
322
+ });
323
+ const relatedEntries = [];
324
+ lowercaseData.forEach(lowercaseEntry => {
325
+ const matching = (lowercaseEntry.lowercase).includes(lowercaseValue);
326
+ if (matching) {
327
+ relatedEntries.push(lowercaseEntry);
328
+ }
329
+ });
330
+ return relatedEntries;
331
+ }
332
+ else {
333
+ return [];
334
+ }
335
+ }
336
+ isAutocompletable() {
337
+ if (this._autoCompleteData && this._type === INPUT_TYPES.SEARCH) {
338
+ return this._autoCompleteData.length > 0;
339
+ }
340
+ else {
341
+ return false;
342
+ }
343
+ }
344
+ onEntryClick(entry, event) {
345
+ // Se non è stato definito un link associato all'elemento dell'autocomplete, probabilmente il desiderata
346
+ // non è effettuare la navigazione al default '#', pertanto in tal caso meglio annullare la navigazione.
347
+ if (!entry.link) {
348
+ event.preventDefault();
349
+ }
350
+ this.value = entry.value;
351
+ this.showAutocompletion = false;
352
+ this.onChange();
353
+ }
354
+ /**
355
+ * indica se il campo di input è composto da altri elementi accessori come
356
+ * icone o bottoni da posizionare adiacenti al campo di input
357
+ */
358
+ get isInputGroup() {
359
+ return this._textPrefixChildren.length > 0 || this._prefixChildren.length > 0 || !!this.icon
360
+ || this._suffixChildren.length > 0 || this._textSuffixChildren.length > 0;
361
+ }
362
+ /**
363
+ * Ricalcola il punteggio di sicurezza in base al valore corrente
364
+ */
365
+ recalculatePasswordStrength() {
366
+ this.passwordScore = this._formInputPasswordUtils.calculateScore(this.value);
367
+ }
368
+ get passwordScoreText() {
369
+ return this._formInputPasswordUtils.scoreText(this.passwordScore);
370
+ }
371
+ get passwordScoreColor() {
372
+ return this._formInputPasswordUtils.scoreColor(this.passwordScore);
373
+ }
374
+ get valueLength() {
375
+ if (!this.value) {
376
+ return 0;
377
+ }
378
+ return this.value.toString().length;
379
+ }
380
+ onKeyUp(event) {
381
+ this.isCapsLockActive = event.getModifierState && event.getModifierState('CapsLock');
382
+ }
383
+ autocompleteItemTrackByValueFn(index, item) {
384
+ return item.value;
385
+ }
386
+ /**
387
+ * Incrementa il valore dell'input numerico di tanto quanto vale lo step
388
+ */
389
+ incrementNumberValue() {
390
+ if (this.type === INPUT_TYPES.NUMBER) {
391
+ const tempValue = +this.value + this.step;
392
+ if (this.max === undefined || tempValue <= this.max) {
393
+ this.value = tempValue;
394
+ }
395
+ }
396
+ }
397
+ /**
398
+ * Decrementa il valore dell'input numerico di tanto quanto vale lo step
399
+ */
400
+ decrementNumberValue() {
401
+ if (this.type === INPUT_TYPES.NUMBER) {
402
+ const tempValue = +this.value - this.step;
403
+ if (this.min === undefined || tempValue >= this.min) {
404
+ this.value = tempValue;
405
+ }
406
+ }
407
+ }
408
+ }
409
+ FormInputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: FormInputComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
410
+ FormInputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.11", type: FormInputComponent, selector: "it-input", inputs: { readonlyPlainText: "readonlyPlainText", enablePasswordStrengthMeter: "enablePasswordStrengthMeter", autocompleteWrapperSize: "autocompleteWrapperSize", passwordStrengthMeterConfig: "passwordStrengthMeterConfig", id: "id", name: "name", type: "type", label: "label", labelVisuallyHidden: "labelVisuallyHidden", min: "min", max: "max", step: "step", note: "note", placeholder: "placeholder", icon: "icon", disabled: "disabled", currency: "currency", percentage: "percentage", adaptive: "adaptive", readonly: "readonly", autoCompleteData: "autoCompleteData", disableCapsLockAlert: "disableCapsLockAlert", capsLockActiveLabel: "capsLockActiveLabel" }, outputs: { change: "change" }, host: { listeners: { "window:click": "onKeyUp($event)", "window:keydown": "onKeyUp($event)", "window:keyup": "onKeyUp($event)" } }, providers: [{
411
+ provide: NG_VALUE_ACCESSOR,
412
+ useExisting: forwardRef(() => FormInputComponent),
413
+ multi: true
414
+ }], queries: [{ propertyName: "_prefixChildren", predicate: ItPrefixDirective, descendants: true }, { propertyName: "_textPrefixChildren", predicate: ItTextPrefixDirective, descendants: true }, { propertyName: "_suffixChildren", predicate: ItSuffixDirective, descendants: true }, { propertyName: "_textSuffixChildren", predicate: ItTextSuffixDirective, descendants: true }], viewQueries: [{ propertyName: "_inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div class=\"form-group\" [class.autocomplete-wrapper-big]=\"autocompleteWrapperSize === 'big'\">\n <div class=\"input-group\" *ngIf = \"isInputGroup; else formInputWithLabel\">\n <ng-container *ngIf=\"_textPrefixChildren.length || _prefixChildren.length || icon\">\n <div class=\"input-group-prepend\">\n\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itTextPrefix\" -->\n <ng-container *ngIf=\"_textPrefixChildren.length || icon\">\n\n <div class=\"input-group-text\" >\n <ng-container *ngIf=\"icon\">\n <it-icon [icon] = \"icon\" size=\"icon-sm\"></it-icon>\n </ng-container>\n\n <ng-container *ngIf=\"_textPrefixChildren.length\">\n <ng-content select = \"[itTextPrefix]\"></ng-content>\n </ng-container>\n </div>\n </ng-container>\n \n <ng-container *ngIf=\"_prefixChildren.length\">\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itPrefix\" -->\n <ng-content select = \"[itPrefix]\"></ng-content>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"formInputWithLabel\"></ng-container>\n\n <ng-container *ngIf=\"_suffixChildren.length || _textSuffixChildren.length\">\n <div class=\"input-group-append\">\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itTextSuffix\" -->\n <ng-container *ngIf=\"_textSuffixChildren.length\">\n <div class=\"input-group-text\" >\n <ng-content select = \"[itTextSuffix]\"></ng-content>\n </div>\n </ng-container>\n \n <ng-container *ngIf=\"_suffixChildren.length\">\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itSuffix\" -->\n <ng-content select = \"[itSuffix]\"></ng-content>\n </ng-container>\n </div>\n </ng-container>\n \n \n </div>\n\n\n\n <ng-template #formInput>\n <input #inputElement\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"onChange()\"\n (input)=\"onInput()\"\n [type]=\"type\"\n [id]=\"id\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [class.focus--mouse]=\"focus\"\n [class.input-password]=\"isPasswordMode\"\n [attr.name]=\"name\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [placeholder]=\"placeholder\"\n [style.width]=\"adaptive && valueLength ? 'calc(44px + ' + valueLength + 'ch)' : null\"\n [ngClass]=\"{\n 'form-control' : (!readonly || !readonlyPlainText) && type !== INPUT_TYPES.NUMBER,\n 'form-control-plaintext' : readonly && readonlyPlainText,\n 'autocomplete' : isAutocompletable()\n }\"\n [attr.aria-describedby]=\"note ? noteId : undefined\"/> \n </ng-template>\n\n\n\n <ng-template #formInputWithLabel>\n <label [attr.for]=\"id\" *ngIf=\"label\" \n [class.visually-hidden]=\"labelVisuallyHidden\"\n [class.input-number-label]=\"type === INPUT_TYPES.NUMBER\"\n [class.active] = \"isLabelActive && !labelVisuallyHidden\" >\n {{label}}\n </label>\n \n <!-- INIZIO gestione input di tipo NUMBER -->\n\n <ng-container *ngIf=\"type === INPUT_TYPES.NUMBER; else formInput\">\n <span class=\"input-number\" \n [class.input-number-adaptive]=\"adaptive\"\n [class.input-number-currency]=\"currency\" \n [class.input-number-percentage]=\"percentage\">\n\n <ng-container [ngTemplateOutlet]=\"formInput\"></ng-container>\n\n <button class=\"input-number-add\" (click)=\"incrementNumberValue()\" focusMouse>\n <span class=\"visually-hidden\">Aumenta valore di {{step}} Euro</span>\n </button>\n <button class=\"input-number-sub\" (click)=\"decrementNumberValue()\" focusMouse>\n <span class=\"visually-hidden\">Diminuisci valore di {{step}} Euro</span>\n </button>\n </span>\n </ng-container>\n\n <!-- FINE gestione input di tipo NUMBER -->\n\n </ng-template>\n\n <small [id]=\"noteId\" class=\"form-text\" *ngIf=\"note\">\n {{note}}\n </small>\n\n\n <!-- INIZIO gestione input di tipo PASSWORD -->\n\n <ng-container *ngIf=\"isPasswordMode\">\n <!-- Icona dell'occhio per la vedere/nascondere la password -->\n <span \n class = \"password-icon\"\n aria-hidden=\"true\"\n (click)=\"isPasswordVisible = !isPasswordVisible\">\n <it-icon [icon]=\"'it-password-' + (isPasswordVisible ? 'invisible' : 'visible')\" size=\"icon-sm\" color=\"default\"></it-icon>\n </span>\n\n <!-- Indicatore di sicurezza della password -->\n <div class=\"password-strength-meter\" *ngIf=\"isPasswordMode && enablePasswordStrengthMeter\">\n <small class=\"form-text\" \n [ngClass] = \"['text-' + passwordScoreColor]\"\n *ngIf = \"passwordStrengthMeterConfig.showText\">{{ passwordScoreText }}\n </small>\n <div class=\"password-meter progress rounded-0 position-absolute\">\n <div class=\"row position-absolute w-100 m-0\">\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n </div>\n\n <div class=\"progress-bar\" \n [class]=\"['bg-' + passwordScoreColor]\"\n role=\"progressbar\" [attr.aria-valuenow]=\"passwordScore >= 0 ? passwordScore : 0\" aria-valuemin=\"0\" aria-valuemax=\"100\" [style.width.%]=\"passwordScore >= 0 ? passwordScore : 0\">\n </div>\n </div>\n </div>\n\n </ng-container>\n\n <!-- FINE gestione input di tipo PASSWORD -->\n\n\n\n\n <!-- Avviso CAPS LOCK Attivo -->\n <small *ngIf=\"isCapsLockActive && !disableCapsLockAlert && type !== INPUT_TYPES.NUMBER\" class=\"password-caps form-text text-warning position-absolute bg-white w-100\">{{capsLockActiveLabel}}</small>\n\n\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n\n\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\" *ngIf=\"isAutocompletable()\">\n <it-icon icon = \"it-search\" size=\"icon-sm\" color=\"default\"></it-icon>\n </span>\n\n\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" *ngIf=\"isAutocompletable()\" [class.autocomplete-list-show]=\"showAutocompletion\">\n <li *ngFor=\"let entry of getRelatedEntries(); trackBy: autocompleteItemTrackByValueFn\" (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\" >\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [icon]=\"entry.icon\" size=\"icon-sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML] = \"entry.original | markMatchingText: value\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n\n</div>\n\n <!-- FINE gestione AUTOCOMPLETAMENTO -->", styles: ["label{pointer-events:none}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.FocusMouseDirective, selector: "[focusMouse]", exportAs: ["focusMouse"] }, { kind: "component", type: i3.IconComponent, selector: "it-icon", inputs: ["rounded", "roundedColor", "icon", "wai", "size", "color", "bgColor", "padded", "expand", "position", "verticalAlign"] }, { kind: "pipe", type: i4.MarkMatchingTextPipe, name: "markMatchingText" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
415
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: FormInputComponent, decorators: [{
416
+ type: Component,
417
+ args: [{ selector: 'it-input', changeDetection: ChangeDetectionStrategy.OnPush, providers: [{
418
+ provide: NG_VALUE_ACCESSOR,
419
+ useExisting: forwardRef(() => FormInputComponent),
420
+ multi: true
421
+ }], template: "<div class=\"form-group\" [class.autocomplete-wrapper-big]=\"autocompleteWrapperSize === 'big'\">\n <div class=\"input-group\" *ngIf = \"isInputGroup; else formInputWithLabel\">\n <ng-container *ngIf=\"_textPrefixChildren.length || _prefixChildren.length || icon\">\n <div class=\"input-group-prepend\">\n\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itTextPrefix\" -->\n <ng-container *ngIf=\"_textPrefixChildren.length || icon\">\n\n <div class=\"input-group-text\" >\n <ng-container *ngIf=\"icon\">\n <it-icon [icon] = \"icon\" size=\"icon-sm\"></it-icon>\n </ng-container>\n\n <ng-container *ngIf=\"_textPrefixChildren.length\">\n <ng-content select = \"[itTextPrefix]\"></ng-content>\n </ng-container>\n </div>\n </ng-container>\n \n <ng-container *ngIf=\"_prefixChildren.length\">\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itPrefix\" -->\n <ng-content select = \"[itPrefix]\"></ng-content>\n </ng-container>\n </div>\n </ng-container>\n\n <ng-container [ngTemplateOutlet]=\"formInputWithLabel\"></ng-container>\n\n <ng-container *ngIf=\"_suffixChildren.length || _textSuffixChildren.length\">\n <div class=\"input-group-append\">\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itTextSuffix\" -->\n <ng-container *ngIf=\"_textSuffixChildren.length\">\n <div class=\"input-group-text\" >\n <ng-content select = \"[itTextSuffix]\"></ng-content>\n </div>\n </ng-container>\n \n <ng-container *ngIf=\"_suffixChildren.length\">\n <!-- Gli elementi figli di \"it-input\" con la direttiva \"itSuffix\" -->\n <ng-content select = \"[itSuffix]\"></ng-content>\n </ng-container>\n </div>\n </ng-container>\n \n \n </div>\n\n\n\n <ng-template #formInput>\n <input #inputElement\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (change)=\"onChange()\"\n (input)=\"onInput()\"\n [type]=\"type\"\n [id]=\"id\"\n [min]=\"min\"\n [max]=\"max\"\n [step]=\"step\"\n [class.focus--mouse]=\"focus\"\n [class.input-password]=\"isPasswordMode\"\n [attr.name]=\"name\"\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [placeholder]=\"placeholder\"\n [style.width]=\"adaptive && valueLength ? 'calc(44px + ' + valueLength + 'ch)' : null\"\n [ngClass]=\"{\n 'form-control' : (!readonly || !readonlyPlainText) && type !== INPUT_TYPES.NUMBER,\n 'form-control-plaintext' : readonly && readonlyPlainText,\n 'autocomplete' : isAutocompletable()\n }\"\n [attr.aria-describedby]=\"note ? noteId : undefined\"/> \n </ng-template>\n\n\n\n <ng-template #formInputWithLabel>\n <label [attr.for]=\"id\" *ngIf=\"label\" \n [class.visually-hidden]=\"labelVisuallyHidden\"\n [class.input-number-label]=\"type === INPUT_TYPES.NUMBER\"\n [class.active] = \"isLabelActive && !labelVisuallyHidden\" >\n {{label}}\n </label>\n \n <!-- INIZIO gestione input di tipo NUMBER -->\n\n <ng-container *ngIf=\"type === INPUT_TYPES.NUMBER; else formInput\">\n <span class=\"input-number\" \n [class.input-number-adaptive]=\"adaptive\"\n [class.input-number-currency]=\"currency\" \n [class.input-number-percentage]=\"percentage\">\n\n <ng-container [ngTemplateOutlet]=\"formInput\"></ng-container>\n\n <button class=\"input-number-add\" (click)=\"incrementNumberValue()\" focusMouse>\n <span class=\"visually-hidden\">Aumenta valore di {{step}} Euro</span>\n </button>\n <button class=\"input-number-sub\" (click)=\"decrementNumberValue()\" focusMouse>\n <span class=\"visually-hidden\">Diminuisci valore di {{step}} Euro</span>\n </button>\n </span>\n </ng-container>\n\n <!-- FINE gestione input di tipo NUMBER -->\n\n </ng-template>\n\n <small [id]=\"noteId\" class=\"form-text\" *ngIf=\"note\">\n {{note}}\n </small>\n\n\n <!-- INIZIO gestione input di tipo PASSWORD -->\n\n <ng-container *ngIf=\"isPasswordMode\">\n <!-- Icona dell'occhio per la vedere/nascondere la password -->\n <span \n class = \"password-icon\"\n aria-hidden=\"true\"\n (click)=\"isPasswordVisible = !isPasswordVisible\">\n <it-icon [icon]=\"'it-password-' + (isPasswordVisible ? 'invisible' : 'visible')\" size=\"icon-sm\" color=\"default\"></it-icon>\n </span>\n\n <!-- Indicatore di sicurezza della password -->\n <div class=\"password-strength-meter\" *ngIf=\"isPasswordMode && enablePasswordStrengthMeter\">\n <small class=\"form-text\" \n [ngClass] = \"['text-' + passwordScoreColor]\"\n *ngIf = \"passwordStrengthMeterConfig.showText\">{{ passwordScoreText }}\n </small>\n <div class=\"password-meter progress rounded-0 position-absolute\">\n <div class=\"row position-absolute w-100 m-0\">\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n <div class=\"col-3 border-start border-end border-white\"></div>\n </div>\n\n <div class=\"progress-bar\" \n [class]=\"['bg-' + passwordScoreColor]\"\n role=\"progressbar\" [attr.aria-valuenow]=\"passwordScore >= 0 ? passwordScore : 0\" aria-valuemin=\"0\" aria-valuemax=\"100\" [style.width.%]=\"passwordScore >= 0 ? passwordScore : 0\">\n </div>\n </div>\n </div>\n\n </ng-container>\n\n <!-- FINE gestione input di tipo PASSWORD -->\n\n\n\n\n <!-- Avviso CAPS LOCK Attivo -->\n <small *ngIf=\"isCapsLockActive && !disableCapsLockAlert && type !== INPUT_TYPES.NUMBER\" class=\"password-caps form-text text-warning position-absolute bg-white w-100\">{{capsLockActiveLabel}}</small>\n\n\n\n <!-- INIZIO gestione AUTOCOMPLETAMENTO -->\n\n\n <!-- Icona lente per autocompletamento -->\n <span class=\"autocomplete-icon\" aria-hidden=\"true\" *ngIf=\"isAutocompletable()\">\n <it-icon icon = \"it-search\" size=\"icon-sm\" color=\"default\"></it-icon>\n </span>\n\n\n <!-- Lista di autocompletamento -->\n <ul class=\"autocomplete-list\" *ngIf=\"isAutocompletable()\" [class.autocomplete-list-show]=\"showAutocompletion\">\n <li *ngFor=\"let entry of getRelatedEntries(); trackBy: autocompleteItemTrackByValueFn\" (click)=\"onEntryClick(entry, $event)\">\n <a [href]=\"entry.link\" >\n <ng-container *ngTemplateOutlet=\"autocompleteItemTemplate\"></ng-container>\n </a>\n <ng-template #autocompleteItemTemplate>\n <div class=\"avatar size-sm\" *ngIf=\"entry.avatarSrcPath\">\n <img [src]=\"entry.avatarSrcPath\" [alt]=\"entry.avatarAltText\">\n </div>\n <it-icon *ngIf=\"entry.icon\" [icon]=\"entry.icon\" size=\"icon-sm\"></it-icon>\n <span class=\"autocomplete-list-text\">\n <span [innerHTML] = \"entry.original | markMatchingText: value\"></span>\n <em *ngIf=\"entry.label\">{{entry.label}}</em>\n </span>\n </ng-template>\n </li>\n </ul>\n\n</div>\n\n <!-- FINE gestione AUTOCOMPLETAMENTO -->", styles: ["label{pointer-events:none}\n"] }]
422
+ }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { _prefixChildren: [{
423
+ type: ContentChildren,
424
+ args: [ItPrefixDirective, { descendants: true }]
425
+ }], _textPrefixChildren: [{
426
+ type: ContentChildren,
427
+ args: [ItTextPrefixDirective, { descendants: true }]
428
+ }], _suffixChildren: [{
429
+ type: ContentChildren,
430
+ args: [ItSuffixDirective, { descendants: true }]
431
+ }], _textSuffixChildren: [{
432
+ type: ContentChildren,
433
+ args: [ItTextSuffixDirective, { descendants: true }]
434
+ }], _inputElement: [{
435
+ type: ViewChild,
436
+ args: ['inputElement', { static: false }]
437
+ }], readonlyPlainText: [{
438
+ type: Input
439
+ }], enablePasswordStrengthMeter: [{
440
+ type: Input
441
+ }], autocompleteWrapperSize: [{
442
+ type: Input
443
+ }], passwordStrengthMeterConfig: [{
444
+ type: Input
445
+ }], id: [{
446
+ type: Input
447
+ }], name: [{
448
+ type: Input
449
+ }], type: [{
450
+ type: Input
451
+ }], label: [{
452
+ type: Input
453
+ }], labelVisuallyHidden: [{
454
+ type: Input
455
+ }], min: [{
456
+ type: Input
457
+ }], max: [{
458
+ type: Input
459
+ }], step: [{
460
+ type: Input
461
+ }], note: [{
462
+ type: Input
463
+ }], placeholder: [{
464
+ type: Input
465
+ }], icon: [{
466
+ type: Input
467
+ }], disabled: [{
468
+ type: Input
469
+ }], currency: [{
470
+ type: Input
471
+ }], percentage: [{
472
+ type: Input
473
+ }], adaptive: [{
474
+ type: Input
475
+ }], readonly: [{
476
+ type: Input
477
+ }], autoCompleteData: [{
478
+ type: Input
479
+ }], change: [{
480
+ type: Output
481
+ }], disableCapsLockAlert: [{
482
+ type: Input
483
+ }], capsLockActiveLabel: [{
484
+ type: Input
485
+ }], onKeyUp: [{
486
+ type: HostListener,
487
+ args: ['window:click', ['$event']]
488
+ }, {
489
+ type: HostListener,
490
+ args: ['window:keydown', ['$event']]
491
+ }, {
492
+ type: HostListener,
493
+ args: ['window:keyup', ['$event']]
494
+ }] } });
495
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kZXNpZ24tYW5ndWxhci1raXQvc3JjL2xpYi9mb3JtLWlucHV0L2Zvcm0taW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZGVzaWduLWFuZ3VsYXIta2l0L3NyYy9saWIvZm9ybS1pbnB1dC9mb3JtLWlucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLHVCQUF1QixFQUFFLFVBQVUsRUFDbkMsTUFBTSxFQUFFLFlBQVksRUFBcUIsU0FBUyxFQUFjLGVBQWUsRUFBMEMsWUFBWSxFQUN4SixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDckUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbkUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7OztBQUVuRSxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFbkIsTUFBTSxPQUFPLGVBQWU7SUFDMUIsWUFDUyxNQUEwQixFQUMxQixLQUFVO1FBRFYsV0FB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blN0cmF0ZWd5LCBmb3J3YXJkUmVmLFxuICBBZnRlckNvbnRlbnRJbml0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0b3JSZWYsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIEFmdGVyQ29udGVudENoZWNrZWQsIE9uSW5pdCwgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgbWVyZ2UgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElucHV0VHlwZSwgSU5QVVRfVFlQRVMgfSBmcm9tICcuLi9tb2RlbHMvSW5wdXRUeXBlJztcbmltcG9ydCB7IFV0aWwgfSBmcm9tICcuLi91dGlsL3V0aWwnO1xuaW1wb3J0IHsgRm9ybUlucHV0UGFzc3dvcmRVdGlscyB9IGZyb20gJy4vZm9ybS1pbnB1dC1wYXNzd29yZC51dGlscyc7XG5pbXBvcnQgeyBJdFByZWZpeERpcmVjdGl2ZSB9IGZyb20gJy4vaXQtcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJdFN1ZmZpeERpcmVjdGl2ZSB9IGZyb20gJy4vaXQtc3VmZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJdFRleHRQcmVmaXhEaXJlY3RpdmUgfSBmcm9tICcuL2l0LXRleHQtcHJlZml4LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJdFRleHRTdWZmaXhEaXJlY3RpdmUgfSBmcm9tICcuL2l0LXRleHQtc3VmZml4LmRpcmVjdGl2ZSc7XG5cbmxldCBpZGVudGlmaWVyID0gMDtcblxuZXhwb3J0IGNsYXNzIEZvcm1JbnB1dENoYW5nZSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBzb3VyY2U6IEZvcm1JbnB1dENvbXBvbmVudCxcbiAgICBwdWJsaWMgdmFsdWU6IGFueVxuICApIHsgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhc3N3b3JkU3RyZW5ndGhNZXRlckNvbmZpZyB7XG4gIC8qKiBUZXN0byBwZXIgaWwgcHVudGVnZ2lvIGRpIGZvcnphIGRlbGxhIHBhc3N3b3JkIG1pbmltbyAqL1xuICBzaG9ydFBhc3M6IHN0cmluZyxcbiAgLyoqIFRlc3RvIHBlciBwdW50ZWdnaW8gZGkgZm9yemEgZGVsbGEgcGFzc3dvcmQgYmFzc29cdCAqL1xuICBiYWRQYXNzOiBzdHJpbmcsXG4gIC8qKiBUZXN0byBwZXIgcHVudGVnZ2lvIGRpIGZvcnphIGRlbGxhIHBhc3N3b3JkIGJ1b25vXHQgKi9cbiAgZ29vZFBhc3M6IHN0cmluZyxcbiAgLyoqIFRlc3RvIHBlciBpbCBwdW50ZWdnaW8gZGkgZm9yemEgZGVsbGEgcGFzc3dvcmQgbWFzc2ltb1x0ICovXG4gIHN0cm9uZ1Bhc3M6IHN0cmluZyxcbiAgLyoqIFRlc3RvIGRpIGFpdXRvICovXG4gIGVudGVyUGFzczogc3RyaW5nLFxuICAvKiogVGVzdG8gcGVyIGF2dmVydGlyZSBjaGUgaWwgQ0FQUyBMT0NLIMOoIGluc2VyaXRvXHQgKi9cbiAgYWxlcnRDYXBzOiBzdHJpbmcsXG4gIC8qKiBMdW5naGV6emEgbWluaW1hIHBlciBpbCBjYWxjb2xvIGRlbGxhIGZvcnphIGRlbGxhIHBhc3N3b3JkIChzb2dsaWEgcGFzc3dvcmQgbW9sdG8gZGVib2xlKVx0ICovXG4gIHNob3dUZXh0OiBib29sZWFuLFxuICAvKiogQXR0aXZhL2Rpc2F0dGl2YSBsYSB2aXNpYmlsaXTDoCBkZWkgbWVzc2FnZ2kgZGkgZXJyb3JlXHQgKi9cbiAgbWluaW11bUxlbmd0aDogbnVtYmVyLFxufVxuXG5cbi8qKlxuICogRWxlbWVudG8gZGlzcG9uaWJpbGUgcGVyIGwnYXV0b2NvbXBsZXRhbWVudG8gZGVsIGl0LWZvcm0taW5wdXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvQ29tcGxldGVJdGVtIHtcbiAgLyoqIFZhbG9yZSB2b2NlIGRpIGF1dG9jb21wbGV0YW1lbnRvICovXG4gIHZhbHVlOiBzdHJpbmc7XG4gIC8qKiBPcHppb25hbGUuIFBhdGggaW4gY3VpIHJpY2VyY2FyZSBsJ2ltbWFnaW5lIGRlbGwnYXZhdGFyIGRhIHBvc2l6aW9uYXJlIGEgc2luaXN0cmEgZGVsbGEgdm9jZSBkaSBhdXRvY29tcGxldGFtZW50byAqL1xuICBhdmF0YXJTcmNQYXRoPzogc3RyaW5nO1xuICAvKiogT3B6aW9uYWxlLiBUZXN0byBpbiBhbHRlcm5hdGl2YSBkZWxsJ2F2YXRhciBwZXIgYWNjZXNzaWJpbGl0w6AgKi9cbiAgYXZhdGFyQWx0VGV4dD86IHN0cmluZztcbiAgLyoqIE9wemlvbmFsZS4gSWNvbmEgcG9zaXppb25hdGEgYSBzaW5pc3RyYSBkZWxsYSB2b2NlIGRpIGF1dG9jb21wbGV0YW1lbnRvICovXG4gIGljb24/OiBzdHJpbmc7XG4gIC8qKiBPcHppb25hbGUuIExhYmVsIHBvc2l6aW9uYXRhIGEgZGVzdHJhIGRlbGxhIHZvY2UgZGkgYXV0b2NvbXBsZXRhbWVudG8gKi9cbiAgbGFiZWw/OiBzdHJpbmc7XG4gIC8qKiBPcHppb25hbGUuIExpbmsgcmVsYXRpdm8gYWxsJ2VsZW1lbnRvICovXG4gIGxpbms/OiBzdHJpbmdcbn1cblxuLyoqXG4gKiBFbGVtZW50aSBlIHN0aWxpIHBlciBsYSBjcmVhemlvbmUgZGkgaW5wdXQgYWNjZXNzaWJpbGkgZSByZXNwb25zaXZpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpdC1pbnB1dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1pbnB1dC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9ybUlucHV0Q29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyQ29udGVudEluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICBwcml2YXRlIF9mb3JtSW5wdXRQYXNzd29yZFV0aWxzOiBGb3JtSW5wdXRQYXNzd29yZFV0aWxzO1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSXRQcmVmaXhEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9wcmVmaXhDaGlsZHJlbjogUXVlcnlMaXN0PEl0UHJlZml4RGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihJdFRleHRQcmVmaXhEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF90ZXh0UHJlZml4Q2hpbGRyZW46IFF1ZXJ5TGlzdDxJdFRleHRQcmVmaXhEaXJlY3RpdmU+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oSXRTdWZmaXhEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF9zdWZmaXhDaGlsZHJlbjogUXVlcnlMaXN0PEl0U3VmZml4RGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihJdFRleHRTdWZmaXhEaXJlY3RpdmUsIHtkZXNjZW5kYW50czogdHJ1ZX0pIF90ZXh0U3VmZml4Q2hpbGRyZW46IFF1ZXJ5TGlzdDxJdFRleHRTdWZmaXhEaXJlY3RpdmU+O1xuXG4gIElOUFVUX1RZUEVTID0gSU5QVVRfVFlQRVM7XG5cbiAgQFZpZXdDaGlsZCgnaW5wdXRFbGVtZW50JywgeyBzdGF0aWM6IGZhbHNlIH0pXG4gIHByaXZhdGUgX2lucHV0RWxlbWVudDogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogT3B6aW9uYWxlLiBJbmRpY2Egc2UgbW9zdHJhcmUgZ2xpIGlucHV0IHJlYWRvbmx5IG5lbGxhIGZvcm1hIHN0aWxpenphdGEgY29tZSB0ZXN0byBub3JtYWxlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcmVhZG9ubHlQbGFpblRleHQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yZWFkb25seVBsYWluVGV4dDsgfVxuICBzZXQgcmVhZG9ubHlQbGFpblRleHQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fcmVhZG9ubHlQbGFpblRleHQgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cbiAgcHJpdmF0ZSBfcmVhZG9ubHlQbGFpblRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXG4gIC8qKlxuICAgKiBPcHppb25hbGUuIEluZGljYSBzZSBhYmlsaXRhcmUgaWwgY29udHJvbGxvIHN1bGxhIHNpY3VyZXp6YSBkZWxsYSBwYXNzd29yZFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGVuYWJsZVBhc3N3b3JkU3RyZW5ndGhNZXRlcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2VuYWJsZVBhc3N3b3JkU3RyZW5ndGhNZXRlcjsgfVxuICBzZXQgZW5hYmxlUGFzc3dvcmRTdHJlbmd0aE1ldGVyKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX2VuYWJsZVBhc3N3b3JkU3RyZW5ndGhNZXRlciA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfVxuICBwcml2YXRlIF9lbmFibGVQYXNzd29yZFN0cmVuZ3RoTWV0ZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUHVudGVnZ2lvIGRpIHNpY3VyZXp6YSBjYWxjb2xhdG8gaW4gYmFzZSBhbGxhIHBhc3N3b3JkIGltbWVzc2Egc2UgZW5hYmxlUGFzc3dvcmRTdHJlbmd0aE1ldGVyIGhhIHZhbG9yZSB0cnVlXG4gICAqL1xuICBwYXNzd29yZFNjb3JlOiBudW1iZXIgPSAwO1xuXG4gIC8qKlxuICAgKiBEaW1lbnNpb25lIGRlbGwnaW5wdXQgZGkgYXV0b2NvbXBsZXRlLiBEaSBkZWZhdWx0IGhhIGRpbWVuc2lvbmUgc3RhbmRhcmQuXG4gICAqL1xuICBASW5wdXQoKSBhdXRvY29tcGxldGVXcmFwcGVyU2l6ZTogJ2JpZycgfCAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XG5cbiAgcHJpdmF0ZSBfcGFzc3dvcmRTdHJlbmd0aE1ldGVyQ29uZmlnOiBQYXNzd29yZFN0cmVuZ3RoTWV0ZXJDb25maWcgPSBGb3JtSW5wdXRQYXNzd29yZFV0aWxzLkRFRkFVTFRfQ09ORklHO1xuXG4gIEBJbnB1dCgpIHNldCBwYXNzd29yZFN0cmVuZ3RoTWV0ZXJDb25maWcobmV3Q29uZmlnOiBQYXNzd29yZFN0cmVuZ3RoTWV0ZXJDb25maWcpIHtcbiAgICB0aGlzLl9wYXNzd29yZFN0cmVuZ3RoTWV0ZXJDb25maWcgPSB7Li4udGhpcy5fcGFzc3dvcmRTdHJlbmd0aE1ldGVyQ29uZmlnLCAuLi5uZXdDb25maWd9O1xuICB9XG5cbiAgZ2V0IHBhc3N3b3JkU3RyZW5ndGhNZXRlckNvbmZpZygpOiBQYXNzd29yZFN0cmVuZ3RoTWV0ZXJDb25maWcge1xuICAgIHJldHVybiB0aGlzLl9wYXNzd29yZFN0cmVuZ3RoTWV0ZXJDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhIGwnaWQgZGVsbCdlbGVtZW50byBIVE1MXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5faWQ7XG4gIH1cbiAgc2V0IGlkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pZCA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX2lkID0gYGZvcm0taW5wdXQtJHtpZGVudGlmaWVyKyt9YDtcblxuICAvKipcbiAgICogSW5kaWNhIGwnYXR0cmlidXRvIG5hbWUgZGVsIGNvbXBvbmVudGUgSFRNTFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuICBzZXQgbmFtZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHZhbHVlO1xuICB9XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhIGlsIHRpcG8gZGkgY2FtcG8uIFB1bycgYXNzdW1lcmUgaSB2YWxvcmkgdGV4dCwgZW1haWwsIHBhc3N3b3JkIGUgbnVtYmVyXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eXBlO1xuICB9XG4gIHNldCB0eXBlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoSW5wdXRUeXBlLmlzKHZhbHVlKSkge1xuICAgICAgaWYgKHZhbHVlID09PSBJTlBVVF9UWVBFUy5OVU1CRVIpIHtcbiAgICAgICAgaWYgKGlzTmFOKE51bWJlcih0aGlzLnZhbHVlKSkpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gJyc7XG4gICAgICAgICAgdGhpcy5vbkNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLl90eXBlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3R5cGUgPSBJTlBVVF9UWVBFUy5URVhUO1xuICAgIH1cblxuICAgIHRoaXMuX2lzUGFzc3dvcmRNb2RlID0gdGhpcy5fdHlwZSA9PT0gSU5QVVRfVFlQRVMuUEFTU1dPUkQ7XG4gICAgdGhpcy5faXNQYXNzd29yZFZpc2libGUgPSBmYWxzZTtcbiAgICB0aGlzLnNob3dBdXRvY29tcGxldGlvbiA9IGZhbHNlO1xuICB9XG4gIHByaXZhdGUgX3R5cGUgPSBJTlBVVF9UWVBFUy5URVhUO1xuXG4gIC8qKlxuICAgKiBJbmRpY2EgaWwgdmFsb3JlIGRlbGxhIGxhYmVsIGRhIHZpc3VhbGl6emFyZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGxhYmVsKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9sYWJlbDsgfVxuICBzZXQgbGFiZWwodmFsdWU6IHN0cmluZykgeyB0aGlzLl9sYWJlbCA9IHZhbHVlOyB9XG4gIHByaXZhdGUgX2xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYSBzZSBsYSBsYWJlbCBkZWxsJ2lucHV0IGRldmUgZXNzZXJlIHZpc3VhbGl6emF0YSBkYWxsJ3V0ZW50ZSBvIHNvbGFtZW50ZSB2aXNpYmlsZSBwZXIgbG8gc2NyZWVuIHJlYWRlclxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGxhYmVsVmlzdWFsbHlIaWRkZW4oKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9sYWJlbFZpc3VhbGx5SGlkZGVuOyB9XG4gIHNldCBsYWJlbFZpc3VhbGx5SGlkZGVuKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX2xhYmVsVmlzdWFsbHlIaWRkZW4gPSB2YWx1ZTsgfVxuICBwcml2YXRlIF9sYWJlbFZpc3VhbGx5SGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG5cblxuICAvKipcbiAgICogSW5kaWNhIGlsIHZhbG9yZSBjaGUgYXZyw6AgbCdhdHRyaWJ1dG8gSFRNTCBcIm1pblwiIHBlciBsJ2lucHV0IGRpIHRpcG8gbnVtYmVyXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbWluKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9taW47IH1cbiAgc2V0IG1pbih2YWx1ZTogbnVtYmVyKSB7IHRoaXMuX21pbiA9IFV0aWwuY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpOyB9XG4gIHByaXZhdGUgX21pbjogbnVtYmVyO1xuICAgXG4gIC8qKlxuICAgKiBJbmRpY2EgaWwgdmFsb3JlIGNoZSBhdnLDoCBsJ2F0dHJpYnV0byBIVE1MIFwibWF4XCIgcGVyIGwnaW5wdXQgZGkgdGlwbyBudW1iZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBtYXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX21heDsgfVxuICBzZXQgbWF4KHZhbHVlOiBudW1iZXIpIHsgdGhpcy5fbWF4ID0gVXRpbC5jb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7IH1cbiAgcHJpdmF0ZSBfbWF4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYSBpbCB2YWxvcmUgY2hlIGF2csOgIGwnYXR0cmlidXRvIEhUTUwgXCJzdGVwXCIgcGVyIGwnaW5wdXQgZGkgdGlwbyBudW1iZXJcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBzdGVwKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9zdGVwOyB9XG4gIHNldCBzdGVwKHZhbHVlOiBudW1iZXIpIHsgdGhpcy5fc3RlcCA9IFV0aWwuY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpOyB9XG4gIHByaXZhdGUgX3N0ZXA6IG51bWJlciA9IDE7XG5cblxuICAvKipcbiAgICogSW5kaWNhIGlsIHRlc3RvIGRpIGFpdXRvIHNvdHRvIGxhIGlucHV0XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbm90ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbm90ZTsgfVxuICBzZXQgbm90ZSh2YWx1ZTogc3RyaW5nKSB7IHRoaXMuX25vdGUgPSB2YWx1ZTsgfVxuICBwcml2YXRlIF9ub3RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYSBpbCB0ZXN0byBwcmVzZW50ZSBuZWwgY2FtcG8gdnVvdG8uIE5lbCBjYXNvIHNpYSBnacOgIHByZXNlbnRlIGxhIGxhYmVsLCBpbCBwbGFjZWhvbGRlciBub24gdmVycsOgIG1vc3RyYXRvXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGxhY2Vob2xkZXIgfHwgJyc7XG4gIH1cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5fcGxhY2Vob2xkZXIgPSB2YWx1ZTsgfVxuICBwcml2YXRlIF9wbGFjZWhvbGRlcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2EgbCdpY29uYSBkYSB2aXN1YWxpenphcmUgYSBzaW5pc3RyYSBkZWwgY2FtcG8gZGkgaW5wdXRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpY29uKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9pY29uOyB9XG4gIHNldCBpY29uKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5faWNvbiA9IHZhbHVlOyB9XG4gIHByaXZhdGUgX2ljb246IHN0cmluZztcblxuICAvKipcbiAgICogT3B6aW9uYWxlLlxuICAgKiBJbmRpY2Egc2UgaWwgY2FtcG8gaW4gcXVlc3Rpb25lIMOoIGRpc2FiaWxpdGF0by5cbiAgICogQWNjZXR0YSB1bmEgZXNwcmVzc2lvbmUgYm9vbGVhbmEgbyBwdcOyIGVzc2VyZSB1c2F0byBjb21lIGF0dHJpYnV0byBzZW56YSB2YWxvcmVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLl9kaXNhYmxlZCA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfVxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAvKipcbiAgICogT3B6aW9uYWxlLlxuICAgKiBOZWwgY2FzbyBkaSBpbnB1dCBudW1lcmljbywgaW5kaWNhIHNlIGlsIGNhbXBvIMOoIHVuYSB2YWx1dGEuXG4gICAqIEFjY2V0dGEgdW5hIGVzcHJlc3Npb25lIGJvb2xlYW5hIG8gcHXDsiBlc3NlcmUgdXNhdG8gY29tZSBhdHRyaWJ1dG8gc2VuemEgdmFsb3JlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY3VycmVuY3koKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9jdXJyZW5jeTsgfVxuICBzZXQgY3VycmVuY3kodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fY3VycmVuY3kgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cbiAgcHJpdmF0ZSBfY3VycmVuY3kgPSBmYWxzZTtcblxuICAgLyoqXG4gICAqIE9wemlvbmFsZS5cbiAgICogTmVsIGNhc28gZGkgaW5wdXQgbnVtZXJpY28sIGluZGljYSBzZSBpbCBjYW1wbyDDqCB1bmEgcGVyY2VudHVhbGUuXG4gICAqIEFjY2V0dGEgdW5hIGVzcHJlc3Npb25lIGJvb2xlYW5hIG8gcHXDsiBlc3NlcmUgdXNhdG8gY29tZSBhdHRyaWJ1dG8gc2VuemEgdmFsb3JlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcGVyY2VudGFnZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3BlcmNlbnRhZ2U7IH1cbiAgc2V0IHBlcmNlbnRhZ2UodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fcGVyY2VudGFnZSA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfVxuICBwcml2YXRlIF9wZXJjZW50YWdlID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIE9wemlvbmFsZS5cbiAgICogTmVsIGNhc28gZGkgaW5wdXQgbnVtZXJpY28sIGluZGljYSBzZSBpbCBjYW1wbyBzaSBkZXZlIHJpZGltZW5zaW9uYXJlIGF1dG9tYXRpY2FtZW50ZSBhIHNlY29uZGEgZGVsIHZhbG9yZSBjb250ZW51dG8gaW4gZXNzby5cbiAgICogQWNjZXR0YSB1bmEgZXNwcmVzc2lvbmUgYm9vbGVhbmEgbyBwdcOyIGVzc2VyZSB1c2F0byBjb21lIGF0dHJpYnV0byBzZW56YSB2YWxvcmVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBhZGFwdGl2ZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2FkYXB0aXZlOyB9XG4gIHNldCBhZGFwdGl2ZSh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLl9hZGFwdGl2ZSA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfVxuICBwcml2YXRlIF9hZGFwdGl2ZSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBPcHppb25hbGUuXG4gICAqIEluZGljYSBzZSBpbCBjYW1wbyBpbiBxdWVzdGlvbmUgw6ggZGkgc29sYSBsZXR0dXJhLlxuICAgKiBBY2NldHRhIHVuYSBlc3ByZXNzaW9uZSBib29sZWFuYSBvIHB1w7IgZXNzZXJlIHVzYXRvIGNvbWUgYXR0cmlidXRvIHNlbnphIHZhbG9yZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH1cbiAgc2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX3JlYWRvbmx5ID0gVXRpbC5jb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9XG4gIHByaXZhdGUgX3JlYWRvbmx5ID0gZmFsc2U7XG5cbiAgZ2V0IHZhbHVlKCk6IGFueSB7IHJldHVybiB0aGlzLl9pbnB1dEVsZW1lbnQ/Lm5hdGl2ZUVsZW1lbnQ/LnZhbHVlOyB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogYW55KSB7IFxuICAgIGlmKHRoaXMuX2lucHV0RWxlbWVudCkge1xuICAgICAgdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICB9IFxuICB9XG5cbiAgLyoqXG4gICAqIE9wemlvbmFsZS5cbiAgICogRGlzcG9uaWJpbGUgc29sbyBzZSBpbCB0eXBlIMOoIHNlYXJjaC5cbiAgICogSW5kaWNhIGxhIGxpc3RhIGRpIGVsZW1lbnRpIHJpY2VyY2FiaWxpIHN1IGN1aSBiYXNhcmUgaWwgc2lzdGVtYSBkaSBhdXRvY29tcGxldGFtZW50byBkZWxsYSBpbnB1dFxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGF1dG9Db21wbGV0ZURhdGEoKTogQXJyYXk8QXV0b0NvbXBsZXRlSXRlbT4geyByZXR1cm4gdGhpcy5fYXV0b0NvbXBsZXRlRGF0YTsgfVxuICBzZXQgYXV0b0NvbXBsZXRlRGF0YSh2YWx1ZTogQXJyYXk8QXV0b0NvbXBsZXRlSXRlbT4pIHsgdGhpcy5fYXV0b0NvbXBsZXRlRGF0YSA9IHZhbHVlOyB9XG4gIHByaXZhdGUgX2F1dG9Db21wbGV0ZURhdGE6IEFycmF5PEF1dG9Db21wbGV0ZUl0ZW0+O1xuXG4gIC8qKlxuICAgKiBFdmVudG8gZW1lc3NvIHF1YW5kbyBpbCB2YWxvcmUgZGVsbCdpbnB1dCBjYW1iaWEuXG4gICAqIEdsaSBldmVudGkgZGkgY2hhbmdlIHNvbm8gZW1lc3NpIHNvbHRhbnRvIHF1YW5kbyBpbCB2YWxvcmUgY2FtYmlhIGEgY2F1c2EgZGVsbCdpbnRlcmF6aW9uZSBkZWxsJ3V0ZW50ZVxuICAgKiBjb24gaWwgY2FtcG8gZCdpbnB1dC5cbiAgICovXG4gIEBPdXRwdXQoKVxuICByZWFkb25seSBjaGFuZ2U6IEV2ZW50RW1pdHRlcjxGb3JtSW5wdXRDaGFuZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxGb3JtSW5wdXRDaGFuZ2U+KCk7XG5cbiAgLyoqXG4gICAqIE9wemlvbmFsZS5cbiAgICogSW5kaWNhIHNlIGRpc2FiaWxpdGFyZSBsJ2F2dmlzbyBkaSBDQVBTIExPQ0sgYXR0aXZvXG4gICAqIEFjY2V0dGEgdW5hIGVzcHJlc3Npb25lIGJvb2xlYW5hIG8gcHXDsiBlc3NlcmUgdXNhdG8gY29tZSBhdHRyaWJ1dG8gc2VuemEgdmFsb3JlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZUNhcHNMb2NrQWxlcnQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9kaXNhYmxlQ2Fwc0xvY2tBbGVydDsgfVxuICBzZXQgZGlzYWJsZUNhcHNMb2NrQWxlcnQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fZGlzYWJsZUNhcHNMb2NrQWxlcnQgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH1cbiAgcHJpdmF0ZSBfZGlzYWJsZUNhcHNMb2NrQWxlcnQgPSBmYWxzZTtcblxuICAvKipcbiAgICogSW5kaWNhIHNlIMOoIGF0dGl2byBpbCBDQVBTIExPQ0tcbiAgICovXG4gIGlzQ2Fwc0xvY2tBY3RpdmUgPSBmYWxzZTtcblxuICAvKipcbiAgICogTGEgbGFiZWwgZGEgbW9zdHJhcmUgaW4gY2FzbyBzaWEgYXR0aXZvIGlsIENBUFMgTE9DS1xuICAgKi9cbiAgQElucHV0KCkgY2Fwc0xvY2tBY3RpdmVMYWJlbCA9ICdDQVBTIExPQ0sgaW5zZXJpdG8nO1xuXG4gIGdldCBpc0xhYmVsQWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0xhYmVsQWN0aXZlO1xuICB9XG4gIHNldCBpc0xhYmVsQWN0aXZlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgY29uc3QgbmV3VmFsdWUgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICBcbiAgICAvLyBJbiBhbGN1bmkgY2FzaSBsYSBsYWJlbCBkZXZlIGVzc2VyZSBzZW1wcmUgcG9zaXppb25hdGEgc29wcmEgbCdpbnB1dCBwZXIgZXZpdGFyZSBzb3ZyYXBwb3NpemlvbmkgXG4gICAgLy8gZGkgdGVzdG8sIGNvbWUgaW4gY2FzbyBkaSBwcmVzZW56YSBkZWwgcGxhY2Vob2xkZXIgbyBwZXIgbCdpbnB1dCBkaSB0aXBvIFwiZGF0ZVwiIG8gXCJ0aW1lXCJcbiAgICBpZihuZXdWYWx1ZSB8fCAoIXRoaXMudmFsdWUgJiYgIXRoaXMucGxhY2Vob2xkZXIgJiYgdGhpcy50eXBlICE9PSBJTlBVVF9UWVBFUy5USU1FICYmIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgIT09IElOUFVUX1RZUEVTLkRBVEUgJiYgdGhpcy50eXBlICE9PSBJTlBVVF9UWVBFUy5OVU1CRVIpKSB7XG4gICAgICB0aGlzLl9pc0xhYmVsQWN0aXZlID0gbmV3VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2lzTGFiZWxBY3RpdmUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9pc0xhYmVsQWN0aXZlOiBib29sZWFuO1xuXG5cbiAgZ2V0IGlzUGFzc3dvcmRNb2RlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc1Bhc3N3b3JkTW9kZTtcbiAgfVxuICBzZXQgaXNQYXNzd29yZE1vZGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc1Bhc3N3b3JkTW9kZSA9IFV0aWwuY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBwcml2YXRlIF9pc1Bhc3N3b3JkTW9kZSA9IGZhbHNlO1xuXG4gIGdldCBpc1Bhc3N3b3JkVmlzaWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNQYXNzd29yZFZpc2libGU7XG4gIH1cbiAgc2V0IGlzUGFzc3dvcmRWaXNpYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNQYXNzd29yZFZpc2libGUgPSBVdGlsLmNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5fdHlwZSA9IHRoaXMuX2lzUGFzc3dvcmRWaXNpYmxlID8gSU5QVVRfVFlQRVMuVEVYVCA6IElOUFVUX1RZUEVTLlBBU1NXT1JEO1xuICB9XG4gIHByaXZhdGUgX2lzUGFzc3dvcmRWaXNpYmxlID0gZmFsc2U7XG5cbiAgc2hvd0F1dG9jb21wbGV0aW9uID0gZmFsc2U7XG4gIHByaXZhdGUgX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbjogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XG4gIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuXG4gIC8qKiBJbmRpY2Egc2Ugw6ggc3RhdG8gZWZmZXR0dWF0byBpbCBmb2N1cyBzdWwgY2FtcG8gZGkgaW5wdXQgKi9cbiAgZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9lbWl0Q2hhbmdlRXZlbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIHRoaXMuY2hhbmdlLmVtaXQobmV3IEZvcm1JbnB1dENoYW5nZSh0aGlzLCB0aGlzLnZhbHVlKSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xhYmVsQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5fZm9ybUlucHV0UGFzc3dvcmRVdGlscyA9IG5ldyBGb3JtSW5wdXRQYXNzd29yZFV0aWxzKHRoaXMucGFzc3dvcmRTdHJlbmd0aE1ldGVyQ29uZmlnKTtcbiAgfVxuXG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmlzTGFiZWxBY3RpdmUgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UoKTtcbiAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCkge1xuICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogYW55KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKSB7IH1cblxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIC8vIFJ1biBjaGFuZ2UgZGV0ZWN0aW9uIGlmIHRoZSBzdWZmaXggb3IgcHJlZml4IGNoYW5nZXMuXG4gICAgbWVyZ2UodGhpcy5fcHJlZml4Q2hpbGRyZW4uY2hhbmdlcywgdGhpcy5fc3VmZml4Q2hpbGRyZW4uY2hhbmdlcyxcbiAgICAgICAgICB0aGlzLl90ZXh0UHJlZml4Q2hpbGRyZW4uY2hhbmdlcywgdGhpcy5fdGV4dFN1ZmZpeENoaWxkcmVuLmNoYW5nZXNcbiAgICApLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgICBcbiAgfVxuXG4gIG9uQ2hhbmdlKCkge1xuICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpO1xuICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4odGhpcy52YWx1ZSk7XG4gIH1cblxuICBvbklucHV0KCkge1xuICAgIGlmKHRoaXMuaXNQYXNzd29yZE1vZGUgJiYgdGhpcy5fZW5hYmxlUGFzc3dvcmRTdHJlbmd0aE1ldGVyKSB7XG4gICAgICB0aGlzLnJlY2FsY3VsYXRlUGFzc3dvcmRTdHJlbmd0aCgpO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0F1dG9jb21wbGV0aW9uID0gdGhpcy5fdHlwZSA9PT0gSU5QVVRfVFlQRVMuU0VBUkNIICYmIHRoaXMuaXNBdXRvY29tcGxldGFibGUoKSAmJiB0aGlzLnZhbHVlO1xuICAgXG4gICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7XG4gICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIG9uRm9jdXMoKSB7XG4gICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5pc0xhYmVsQWN0aXZlID0gdHJ1ZTtcbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLmZvY3VzID0gZmFsc2U7XG4gICAgY29uc3QgaW5wdXRWYWx1ZTogc3RyaW5nID0gdGhpcy52YWx1ZTtcbiAgICBpZiAoIWlucHV0VmFsdWUgfHwgaW5wdXRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgXG4gICAgICB0aGlzLmlzTGFiZWxBY3RpdmUgPSBmYWxzZTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMudHlwZSA9PT0gSU5QVVRfVFlQRVMuTlVNQkVSKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgbm90ZUlkKCkge1xuICAgIHJldHVybiBgJHt0aGlzLmlkfS1ub3RlYDtcbiAgfVxuXG4gIGdldFJlbGF0ZWRFbnRyaWVzKCkge1xuICAgIGlmICh0aGlzLnZhbHVlKSB7XG4gICAgICBjb25zdCBsb3dlcmNhc2VWYWx1ZSA9IHRoaXMudmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgIGNvbnN0IGxvd2VyY2FzZURhdGEgPSB0aGlzLl9hdXRvQ29tcGxldGVEYXRhLmZpbHRlcigoaXRlbSkgPT4gaXRlbS52YWx1ZSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBvcmlnaW5hbCA6IGl0ZW0udmFsdWUsIGxvd2VyY2FzZSA6IGl0ZW0udmFsdWUudG9Mb3dlckNhc2UoKSB9O1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlbGF0ZWRFbnRyaWVzID0gW107XG4gICAgICBsb3dlcmNhc2VEYXRhLmZvckVhY2gobG93ZXJjYXNlRW50cnkgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGluZyA9IChsb3dlcmNhc2VFbnRyeS5sb3dlcmNhc2UpLmluY2x1ZGVzKGxvd2VyY2FzZVZhbHVlKTtcbiAgICAgICAgaWYgKG1hdGNoaW5nKSB7XG4gICAgICAgICAgcmVsYXRlZEVudHJpZXMucHVzaChsb3dlcmNhc2VFbnRyeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVsYXRlZEVudHJpZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBpc0F1dG9jb21wbGV0YWJsZSgpIHtcbiAgICBpZiAodGhpcy5fYXV0b0NvbXBsZXRlRGF0YSAmJiB0aGlzLl90eXBlID09PSBJTlBVVF9UWVBFUy5TRUFSQ0gpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hdXRvQ29tcGxldGVEYXRhLmxlbmd0aCA+IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBvbkVudHJ5Q2xpY2soZW50cnk6IEF1dG9Db21wbGV0ZUl0ZW0sIGV2ZW50OiBFdmVudCkge1xuICAgIC8vIFNlIG5vbiDDqCBzdGF0byBkZWZpbml0byB1biBsaW5rIGFzc29jaWF0byBhbGwnZWxlbWVudG8gZGVsbCdhdXRvY29tcGxldGUsIHByb2JhYmlsbWVudGUgaWwgZGVzaWRlcmF0YSBcbiAgICAvLyBub24gw6ggZWZmZXR0dWFyZSBsYSBuYXZpZ2F6aW9uZSBhbCBkZWZhdWx0ICcjJywgcGVydGFudG8gaW4gdGFsIGNhc28gbWVnbGlvIGFubnVsbGFyZSBsYSBuYXZpZ2F6aW9uZS5cbiAgICBpZighZW50cnkubGluaykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IGVudHJ5LnZhbHVlO1xuICAgIHRoaXMuc2hvd0F1dG9jb21wbGV0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5vbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIGluZGljYSBzZSBpbCBjYW1wbyBkaSBpbnB1dCDDqCBjb21wb3N0byBkYSBhbHRyaSBlbGVtZW50aSBhY2Nlc3NvcmkgY29tZSBcbiAgICogaWNvbmUgbyBib3R0b25pIGRhIHBvc2l6aW9uYXJlIGFkaWFjZW50aSBhbCBjYW1wbyBkaSBpbnB1dFxuICAgKi9cbiAgZ2V0IGlzSW5wdXRHcm91cCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIHRoaXMuX3RleHRQcmVmaXhDaGlsZHJlbi5sZW5ndGggPiAwIHx8IHRoaXMuX3ByZWZpeENoaWxkcmVuLmxlbmd0aCA+IDAgfHwgISF0aGlzLmljb24gXG4gICAgICAgICAgICB8fCB0aGlzLl9zdWZmaXhDaGlsZHJlbi5sZW5ndGggPiAwIHx8IHRoaXMuX3RleHRTdWZmaXhDaGlsZHJlbi5sZW5ndGggPiAwO1xuICB9XG5cblxuICAvKipcbiAgICogUmljYWxjb2xhIGlsIHB1bnRlZ2dpbyBkaSBzaWN1cmV6emEgaW4gYmFzZSBhbCB2YWxvcmUgY29ycmVudGVcbiAgICovXG4gIHJlY2FsY3VsYXRlUGFzc3dvcmRTdHJlbmd0aCgpOiB2b2lkIHtcbiAgICB0aGlzLnBhc3N3b3JkU2NvcmUgPSB0aGlzLl9mb3JtSW5wdXRQYXNzd29yZFV0aWxzLmNhbGN1bGF0ZVNjb3JlKHRoaXMudmFsdWUpO1xuICB9XG4gIFxuXG4gIGdldCBwYXNzd29yZFNjb3JlVGV4dCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtSW5wdXRQYXNzd29yZFV0aWxzLnNjb3JlVGV4dCh0aGlzLnBhc3N3b3JkU2NvcmUpO1xuICB9XG5cbiAgZ2V0IHBhc3N3b3JkU2NvcmVDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtSW5wdXRQYXNzd29yZFV0aWxzLnNjb3JlQ29sb3IodGhpcy5wYXNzd29yZFNjb3JlKTtcbiAgfVxuXG4gIGdldCB2YWx1ZUxlbmd0aCgpOiBudW1iZXIge1xuICAgIGlmKCF0aGlzLnZhbHVlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlcikudG9TdHJpbmcoKS5sZW5ndGg7XG4gIH1cbiBcblxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6Y2xpY2snLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzprZXl1cCcsIFsnJGV2ZW50J10pXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2Fwc0xvY2tBY3RpdmUgPSBldmVudC5nZXRNb2RpZmllclN0YXRlICYmIGV2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ0NhcHNMb2NrJyk7XG4gIH1cblxuXG4gIGF1dG9jb21wbGV0ZUl0ZW1UcmFja0J5VmFsdWVGbihpbmRleDogbnVtYmVyLCBpdGVtOiBBdXRvQ29tcGxldGVJdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJbmNyZW1lbnRhIGlsIHZhbG9yZSBkZWxsJ2lucHV0IG51bWVyaWNvIGRpIHRhbnRvIHF1YW50byB2YWxlIGxvIHN0ZXBcbiAgICovXG4gIGluY3JlbWVudE51bWJlclZhbHVlKCk6IHZvaWQge1xuICAgIGlmKHRoaXMudHlwZSA9PT0gSU5QVVRfVFlQRVMuTlVNQkVSKSB7XG4gICAgICBjb25zdCB0ZW1wVmFsdWUgPSArdGhpcy52YWx1ZSArIHRoaXMuc3RlcDtcbiAgICAgIGlmKHRoaXMubWF4ID09PSB1bmRlZmluZWQgfHwgdGVtcFZhbHVlIDw9IHRoaXMubWF4KSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0ZW1wVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY3JlbWVudGEgaWwgdmFsb3JlIGRlbGwnaW5wdXQgbnVtZXJpY28gZGkgdGFudG8gcXVhbnRvIHZhbGUgbG8gc3RlcFxuICAgKi9cbiAgZGVjcmVtZW50TnVtYmVyVmFsdWUoKTogdm9pZCB7XG4gICAgaWYodGhpcy50eXBlID09PSBJTlBVVF9UWVBFUy5OVU1CRVIgKSB7XG4gICAgICBjb25zdCB0ZW1wVmFsdWUgPSArdGhpcy52YWx1ZSAtIHRoaXMuc3RlcDtcbiAgICAgIGlmKHRoaXMubWluID09PSB1bmRlZmluZWQgfHwgdGVtcFZhbHVlID49IHRoaXMubWluKSB7XG4gICAgICAgIHRoaXMudmFsdWUgPSB0ZW1wVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgW2NsYXNzLmF1dG9jb21wbGV0ZS13cmFwcGVyLWJpZ109XCJhdXRvY29tcGxldGVXcmFwcGVyU2l6ZSA9PT0gJ2JpZydcIj5cbiAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwXCIgKm5nSWYgPSBcImlzSW5wdXRHcm91cDsgZWxzZSBmb3JtSW5wdXRXaXRoTGFiZWxcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfdGV4dFByZWZpeENoaWxkcmVuLmxlbmd0aCB8fCBfcHJlZml4Q2hpbGRyZW4ubGVuZ3RoIHx8IGljb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLXByZXBlbmRcIj5cblxuICAgICAgICAgIDwhLS0gR2xpIGVsZW1lbnRpIGZpZ2xpIGRpIFwiaXQtaW5wdXRcIiBjb24gbGEgZGlyZXR0aXZhIFwiaXRUZXh0UHJlZml4XCIgIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfdGV4dFByZWZpeENoaWxkcmVuLmxlbmd0aCB8fCBpY29uXCI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC10ZXh0XCIgPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaWNvblwiPlxuICAgICAgICAgICAgICAgIDxpdC1pY29uIFtpY29uXSA9IFwiaWNvblwiIHNpemU9XCJpY29uLXNtXCI+PC9pdC1pY29uPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiX3RleHRQcmVmaXhDaGlsZHJlbi5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3QgPSBcIltpdFRleHRQcmVmaXhdXCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9wcmVmaXhDaGlsZHJlbi5sZW5ndGhcIj5cbiAgICAgICAgICAgIDwhLS0gR2xpIGVsZW1lbnRpIGZpZ2xpIGRpIFwiaXQtaW5wdXRcIiBjb24gbGEgZGlyZXR0aXZhIFwiaXRQcmVmaXhcIiAgLS0+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3QgPSBcIltpdFByZWZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZm9ybUlucHV0V2l0aExhYmVsXCI+PC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJfc3VmZml4Q2hpbGRyZW4ubGVuZ3RoIHx8IF90ZXh0U3VmZml4Q2hpbGRyZW4ubGVuZ3RoXCI+XG4gICAgICAgIDxkaXYgIGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XG4gICAgICAgICAgPCEtLSBHbGkgZWxlbWVudGkgZmlnbGkgZGkgXCJpdC1pbnB1dFwiIGNvbiBsYSBkaXJldHRpdmEgXCJpdFRleHRTdWZmaXhcIiAgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl90ZXh0U3VmZml4Q2hpbGRyZW4ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtdGV4dFwiID5cbiAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0ID0gXCJbaXRUZXh0U3VmZml4XVwiPjwvbmctY29udGVudD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9zdWZmaXhDaGlsZHJlbi5sZW5ndGhcIj5cbiAgICAgICAgICAgIDwhLS0gR2xpIGVsZW1lbnRpIGZpZ2xpIGRpIFwiaXQtaW5wdXRcIiBjb24gbGEgZGlyZXR0aXZhIFwiaXRTdWZmaXhcIiAgLS0+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3QgPSBcIltpdFN1ZmZpeF1cIj48L25nLWNvbnRlbnQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICBcbiAgICBcbiAgPC9kaXY+XG5cblxuXG4gIDxuZy10ZW1wbGF0ZSAjZm9ybUlucHV0PlxuICAgICAgPGlucHV0ICNpbnB1dEVsZW1lbnRcbiAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcbiAgICAgICAgKGNoYW5nZSk9XCJvbkNoYW5nZSgpXCJcbiAgICAgICAgKGlucHV0KT1cIm9uSW5wdXQoKVwiXG4gICAgICAgIFt0eXBlXT1cInR5cGVcIlxuICAgICAgICBbaWRdPVwiaWRcIlxuICAgICAgICBbbWluXT1cIm1pblwiXG4gICAgICAgIFttYXhdPVwibWF4XCJcbiAgICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICAgIFtjbGFzcy5mb2N1cy0tbW91c2VdPVwiZm9jdXNcIlxuICAgICAgICBbY2xhc3MuaW5wdXQtcGFzc3dvcmRdPVwiaXNQYXNzd29yZE1vZGVcIlxuICAgICAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICBbc3R5bGUud2lkdGhdPVwiYWRhcHRpdmUgJiYgdmFsdWVMZW5ndGggPyAnY2FsYyg0NHB4ICsgJyArIHZhbHVlTGVuZ3RoICsgJ2NoKScgOiBudWxsXCJcbiAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICdmb3JtLWNvbnRyb2wnIDogKCFyZWFkb25seSB8fCAhcmVhZG9ubHlQbGFpblRleHQpICYmIHR5cGUgIT09IElOUFVUX1RZUEVTLk5VTUJFUixcbiAgICAgICAgICAnZm9ybS1jb250cm9sLXBsYWludGV4dCcgOiByZWFkb25seSAmJiByZWFkb25seVBsYWluVGV4dCxcbiAgICAgICAgICAnYXV0b2NvbXBsZXRlJyA6IGlzQXV0b2NvbXBsZXRhYmxlKClcbiAgICAgICAgfVwiXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cIm5vdGUgPyBub3RlSWQgOiB1bmRlZmluZWRcIi8+ICBcbiAgPC9uZy10ZW1wbGF0ZT5cblxuXG5cbiAgPG5nLXRlbXBsYXRlICNmb3JtSW5wdXRXaXRoTGFiZWw+XG4gICAgICA8bGFiZWwgIFthdHRyLmZvcl09XCJpZFwiICpuZ0lmPVwibGFiZWxcIiBcbiAgICAgICAgICAgICAgW2NsYXNzLnZpc3VhbGx5LWhpZGRlbl09XCJsYWJlbFZpc3VhbGx5SGlkZGVuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmlucHV0LW51bWJlci1sYWJlbF09XCJ0eXBlID09PSBJTlBVVF9UWVBFUy5OVU1CRVJcIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXSA9IFwiaXNMYWJlbEFjdGl2ZSAmJiAhbGFiZWxWaXN1YWxseUhpZGRlblwiID5cbiAgICAgICAge3tsYWJlbH19XG4gICAgICA8L2xhYmVsPlxuICAgIFxuICAgICAgPCEtLSBJTklaSU8gZ2VzdGlvbmUgaW5wdXQgZGkgdGlwbyBOVU1CRVIgLS0+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0eXBlID09PSBJTlBVVF9UWVBFUy5OVU1CRVI7IGVsc2UgZm9ybUlucHV0XCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtbnVtYmVyXCIgXG4gICAgICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItYWRhcHRpdmVdPVwiYWRhcHRpdmVcIlxuICAgICAgICAgICAgICBbY2xhc3MuaW5wdXQtbnVtYmVyLWN1cnJlbmN5XT1cImN1cnJlbmN5XCIgXG4gICAgICAgICAgICAgIFtjbGFzcy5pbnB1dC1udW1iZXItcGVyY2VudGFnZV09XCJwZXJjZW50YWdlXCI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImZvcm1JbnB1dFwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LW51bWJlci1hZGRcIiAoY2xpY2spPVwiaW5jcmVtZW50TnVtYmVyVmFsdWUoKVwiIGZvY3VzTW91c2U+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkF1bWVudGEgdmFsb3JlIGRpIHt7c3RlcH19IEV1cm88L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImlucHV0LW51bWJlci1zdWJcIiAoY2xpY2spPVwiZGVjcmVtZW50TnVtYmVyVmFsdWUoKVwiIGZvY3VzTW91c2U+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkRpbWludWlzY2kgdmFsb3JlIGRpIHt7c3RlcH19IEV1cm88L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBGSU5FIGdlc3Rpb25lIGlucHV0IGRpIHRpcG8gTlVNQkVSIC0tPlxuXG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPHNtYWxsIFtpZF09XCJub3RlSWRcIiBjbGFzcz1cImZvcm0tdGV4dFwiICpuZ0lmPVwibm90ZVwiPlxuICAgIHt7bm90ZX19XG4gIDwvc21hbGw+XG5cblxuICA8IS0tIElOSVpJTyBnZXN0aW9uZSBpbnB1dCBkaSB0aXBvIFBBU1NXT1JEIC0tPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc1Bhc3N3b3JkTW9kZVwiPlxuICAgIDwhLS0gSWNvbmEgZGVsbCdvY2NoaW8gcGVyIGxhIHZlZGVyZS9uYXNjb25kZXJlIGxhIHBhc3N3b3JkIC0tPlxuICAgIDxzcGFuIFxuICAgICAgY2xhc3MgPSBcInBhc3N3b3JkLWljb25cIlxuICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgIChjbGljayk9XCJpc1Bhc3N3b3JkVmlzaWJsZSA9ICFpc1Bhc3N3b3JkVmlzaWJsZVwiPlxuICAgICAgPGl0LWljb24gW2ljb25dPVwiJ2l0LXBhc3N3b3JkLScgKyAoaXNQYXNzd29yZFZpc2libGUgPyAnaW52aXNpYmxlJyA6ICd2aXNpYmxlJylcIiBzaXplPVwiaWNvbi1zbVwiIGNvbG9yPVwiZGVmYXVsdFwiPjwvaXQtaWNvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8IS0tIEluZGljYXRvcmUgZGkgc2ljdXJlenphIGRlbGxhIHBhc3N3b3JkIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJwYXNzd29yZC1zdHJlbmd0aC1tZXRlclwiICpuZ0lmPVwiaXNQYXNzd29yZE1vZGUgJiYgZW5hYmxlUGFzc3dvcmRTdHJlbmd0aE1ldGVyXCI+XG4gICAgICA8c21hbGwgY2xhc3M9XCJmb3JtLXRleHRcIiBcbiAgICAgICAgW25nQ2xhc3NdID0gXCJbJ3RleHQtJyArIHBhc3N3b3JkU2NvcmVDb2xvcl1cIlxuICAgICAgICAqbmdJZiA9IFwicGFzc3dvcmRTdHJlbmd0aE1ldGVyQ29uZmlnLnNob3dUZXh0XCI+e3sgcGFzc3dvcmRTY29yZVRleHQgfX1cbiAgICAgIDwvc21hbGw+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFzc3dvcmQtbWV0ZXIgcHJvZ3Jlc3Mgcm91bmRlZC0wIHBvc2l0aW9uLWFic29sdXRlXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcG9zaXRpb24tYWJzb2x1dGUgdy0xMDAgbS0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIGJvcmRlci1zdGFydCBib3JkZXItZW5kIGJvcmRlci13aGl0ZVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMyBib3JkZXItc3RhcnQgYm9yZGVyLWVuZCBib3JkZXItd2hpdGVcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTMgYm9yZGVyLXN0YXJ0IGJvcmRlci1lbmQgYm9yZGVyLXdoaXRlXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0zIGJvcmRlci1zdGFydCBib3JkZXItZW5kIGJvcmRlci13aGl0ZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCIgXG4gICAgICAgICAgW2NsYXNzXT1cIlsnYmctJyArIHBhc3N3b3JkU2NvcmVDb2xvcl1cIlxuICAgICAgICAgIHJvbGU9XCJwcm9ncmVzc2JhclwiIFthdHRyLmFyaWEtdmFsdWVub3ddPVwicGFzc3dvcmRTY29yZSA+PSAwID8gcGFzc3dvcmRTY29yZSA6IDBcIiBhcmlhLXZhbHVlbWluPVwiMFwiIGFyaWEtdmFsdWVtYXg9XCIxMDBcIiBbc3R5bGUud2lkdGguJV09XCJwYXNzd29yZFNjb3JlID49IDAgPyBwYXNzd29yZFNjb3JlIDogMFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gIDwvbmctY29udGFpbmVyPlxuXG4gPCEtLSBGSU5FIGdlc3Rpb25lIGlucHV0IGRpIHRpcG8gUEFTU1dPUkQgLS0+XG5cblxuXG5cbiAgPCEtLSBBdnZpc28gQ0FQUyBMT0NLIEF0dGl2byAtLT5cbiAgPHNtYWxsICpuZ0lmPVwiaXNDYXBzTG9ja0FjdGl2ZSAmJiAhZGlzYWJsZUNhcHNMb2NrQWxlcnQgJiYgdHlwZSAhPT0gSU5QVVRfVFlQRVMuTlVNQkVSXCIgY2xhc3M9XCJwYXNzd29yZC1jYXBzIGZvcm0tdGV4dCB0ZXh0LXdhcm5pbmcgcG9zaXRpb24tYWJzb2x1dGUgYmctd2hpdGUgdy0xMDBcIj57e2NhcHNMb2NrQWN0aXZlTGFiZWx9fTwvc21hbGw+XG5cblxuXG4gIDwhLS0gSU5JWklPIGdlc3Rpb25lIEFVVE9DT01QTEVUQU1FTlRPIC0tPlxuXG5cbiAgPCEtLSBJY29uYSBsZW50ZSBwZXIgYXV0b2NvbXBsZXRhbWVudG8gLS0+XG4gIDxzcGFuIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIiAqbmdJZj1cImlzQXV0b2NvbXBsZXRhYmxlKClcIj5cbiAgICA8aXQtaWNvbiBpY29uID0gXCJpdC1zZWFyY2hcIiBzaXplPVwiaWNvbi1zbVwiIGNvbG9yPVwiZGVmYXVsdFwiPjwvaXQtaWNvbj5cbiAgPC9zcGFuPlxuXG5cbiAgPCEtLSBMaXN0YSBkaSBhdXRvY29tcGxldGFtZW50byAtLT5cbiAgPHVsIGNsYXNzPVwiYXV0b2NvbXBsZXRlLWxpc3RcIiAqbmdJZj1cImlzQXV0b2NvbXBsZXRhYmxlKClcIiAgW2NsYXNzLmF1dG9jb21wbGV0ZS1saXN0LXNob3ddPVwic2hvd0F1dG9jb21wbGV0aW9uXCI+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBlbnRyeSBvZiBnZXRSZWxhdGVkRW50cmllcygpOyB0cmFja0J5OiBhdXRvY29tcGxldGVJdGVtVHJhY2tCeVZhbHVlRm5cIiAoY2xpY2spPVwib25FbnRyeUNsaWNrKGVudHJ5LCAkZXZlbnQpXCI+XG4gICAgICA8YSBbaHJlZl09XCJlbnRyeS5saW5rXCIgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiYXV0b2NvbXBsZXRlSXRlbVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2E+XG4gICAgICA8bmctdGVtcGxhdGUgI2F1dG9jb21wbGV0ZUl0ZW1UZW1wbGF0ZT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImF2YXRhciBzaXplLXNtXCIgKm5nSWY9XCJlbnRyeS5hdmF0YXJTcmNQYXRoXCI+XG4gICAgICAgICAgPGltZyBbc3JjXT1cImVudHJ5LmF2YXRhclNyY1BhdGhcIiBbYWx0XT1cImVudHJ5LmF2YXRhckFsdFRleHRcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxpdC1pY29uICpuZ0lmPVwiZW50cnkuaWNvblwiIFtpY29uXT1cImVudHJ5Lmljb25cIiBzaXplPVwiaWNvbi1zbVwiPjwvaXQtaWNvbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJhdXRvY29tcGxldGUtbGlzdC10ZXh0XCI+XG4gICAgICAgICAgPHNwYW4gW2lubmVySFRNTF0gPSBcImVudHJ5Lm9yaWdpbmFsIHwgbWFya01hdGNoaW5nVGV4dDogdmFsdWVcIj48L3NwYW4+XG4gICAgICAgICAgPGVtICpuZ0lmPVwiZW50cnkubGFiZWxcIj57e2VudHJ5LmxhYmVsfX08L2VtPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbGk+XG4gIDwvdWw+XG5cbjwvZGl2PlxuXG4gIDwhLS0gRklORSBnZXN0aW9uZSBBVVRPQ09NUExFVEFNRU5UTyAtLT4iXX0=