@porscheinformatik/clr-addons 18.1.9 → 18.2.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 (29) hide show
  1. package/clr-addons.module.d.ts +2 -1
  2. package/datagrid/datagrid-state-persistence/datagrid-state-persistence-model.interface.d.ts +1 -0
  3. package/datagrid/datagrid-state-persistence/state-persistence-key.directive.d.ts +12 -2
  4. package/datagrid/datagrid-state-persistence/state-persistence-options.interface.d.ts +1 -0
  5. package/esm2022/clr-addons.module.mjs +7 -3
  6. package/esm2022/datagrid/datagrid-state-persistence/datagrid-state-persistence-model.interface.mjs +1 -1
  7. package/esm2022/datagrid/datagrid-state-persistence/state-persistence-key.directive.mjs +67 -8
  8. package/esm2022/datagrid/datagrid-state-persistence/state-persistence-options.interface.mjs +1 -1
  9. package/esm2022/index.mjs +2 -1
  10. package/esm2022/numericfield/numeric-field.mjs +6 -98
  11. package/esm2022/readonly/index.mjs +8 -0
  12. package/esm2022/readonly/readonly.directive.mjs +149 -0
  13. package/esm2022/readonly/readonly.module.mjs +16 -0
  14. package/esm2022/util/index.mjs +2 -1
  15. package/esm2022/util/numeric.format.util.mjs +99 -0
  16. package/fesm2022/clr-addons.mjs +360 -128
  17. package/fesm2022/clr-addons.mjs.map +1 -1
  18. package/index.d.ts +1 -0
  19. package/numericfield/numeric-field.d.ts +0 -3
  20. package/package.json +1 -1
  21. package/readonly/index.d.ts +2 -0
  22. package/readonly/readonly.directive.d.ts +31 -0
  23. package/readonly/readonly.module.d.ts +7 -0
  24. package/styles/clr-addons-phs.css +14 -0
  25. package/styles/clr-addons-phs.css.map +1 -1
  26. package/styles/clr-addons-phs.min.css +1 -1
  27. package/styles/clr-addons-phs.min.css.map +1 -1
  28. package/util/index.d.ts +1 -0
  29. package/util/numeric.format.util.d.ts +2 -0
@@ -1,10 +1,11 @@
1
1
  /*
2
- * Copyright (c) 2018-2022 Porsche Informatik. All Rights Reserved.
2
+ * Copyright (c) 2018-2024 Porsche Informatik. All Rights Reserved.
3
3
  * This software is released under MIT license.
4
4
  * The full license information can be found in LICENSE in the root directory of this project.
5
5
  */
6
6
  import { Directive, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, } from '@angular/core';
7
7
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
8
+ import { formatNumber, strip } from '../util';
8
9
  import * as i0 from "@angular/core";
9
10
  const NEGATIVE = '-';
10
11
  const BACK_KEYCODE = 8;
@@ -137,114 +138,21 @@ export class ClrNumericField {
137
138
  this.injectUnitSymbol();
138
139
  }
139
140
  handleInputChanged() {
140
- this.updateInput(this.formatNumber(this._numericValue.toString().replace(new RegExp('[.]', 'g'), this.decimalSeparator), true), true);
141
+ this.updateInput(formatNumber(this._numericValue.toString().replace(new RegExp('[.]', 'g'), this.decimalSeparator), true, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces, this.autofillDecimals), true);
141
142
  }
142
143
  formatInput(element, finalFormatting) {
143
144
  const cursorPos = element.selectionStart;
144
145
  const length = element.value.length;
145
146
  const setCursor = this.displayValue !== element.value;
146
- this.updateInput(this.formatNumber(element.value, finalFormatting), false);
147
+ this.updateInput(formatNumber(element.value, finalFormatting, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces, this.autofillDecimals), false);
147
148
  if (setCursor) {
148
149
  element.selectionStart = element.selectionEnd = Math.max(cursorPos + element.value.length - length, 0);
149
150
  }
150
151
  }
151
- formatNumber(value, finalFormatting) {
152
- let result = this.strip(value, finalFormatting);
153
- /* add grouping separator */
154
- const decimalIndex = result.indexOf(this.decimalSeparator);
155
- const isNegative = result[0] === NEGATIVE;
156
- let i = decimalIndex > -1 ? decimalIndex : result.length;
157
- while (i > (isNegative ? 4 : 3)) {
158
- i -= 3;
159
- result = result.substring(0, i) + this.groupingSeparator + result.substring(i, result.length);
160
- }
161
- if (finalFormatting) {
162
- if (this.decimalPlaces > 0 && !!result) {
163
- /* autofill decimal places */
164
- let actualDecimalIndex = result.indexOf(this.decimalSeparator);
165
- if (this.autofillDecimals) {
166
- if (actualDecimalIndex === -1) {
167
- actualDecimalIndex = result.length;
168
- result += this.decimalSeparator;
169
- }
170
- result = this.addMissingLeadingZero(result, actualDecimalIndex);
171
- actualDecimalIndex = result.indexOf(this.decimalSeparator);
172
- const actualDecimalPlaces = result.length - actualDecimalIndex - 1;
173
- for (let j = 0; j < this.decimalPlaces - actualDecimalPlaces; j++) {
174
- result += '0';
175
- }
176
- }
177
- else {
178
- result = this.addMissingLeadingZero(result, actualDecimalIndex);
179
- }
180
- }
181
- }
182
- return result;
183
- }
184
- addMissingLeadingZero(result, actualDecimalIndex) {
185
- const isNegative = result[0] === NEGATIVE;
186
- /* autoadd a zero before decimal separator, when it's missing */
187
- if (actualDecimalIndex === 0) {
188
- result = '0' + result;
189
- }
190
- /* autoadd a zero before decimal separator, when it's missing, for negative values */
191
- if (actualDecimalIndex === 1 && isNegative) {
192
- result = result[0] + '0' + result.substring(1, result.length);
193
- }
194
- return result;
195
- }
196
- strip(value, removeLeadingZeros = false) {
197
- let result = '';
198
- let indexDecimalSep = -1;
199
- let j = -1;
200
- let ignoredChars = 0;
201
- for (const char of value) {
202
- j++;
203
- if (this.allowedKeys.has(char)) {
204
- if (char === this.decimalSeparator) {
205
- if (this.decimalPlaces === 0) {
206
- /* dismiss content after a decimal separator, when no places allowed */
207
- break;
208
- }
209
- else if (indexDecimalSep > -1) {
210
- /* ignore subsequent decimal separators */
211
- continue;
212
- }
213
- indexDecimalSep = j;
214
- }
215
- if (char === '0' && removeLeadingZeros) {
216
- /* remove leading zero only if it's not the only zero in the 'value' string */
217
- if ((result.length === 0 && j + 1 !== value.length) || result === NEGATIVE) {
218
- ignoredChars++;
219
- continue;
220
- }
221
- }
222
- if (char === NEGATIVE && j > 0) {
223
- /* dismiss content after a negative sign not on first position */
224
- break;
225
- }
226
- if (indexDecimalSep > -1 && result.length + ignoredChars > indexDecimalSep + this.decimalPlaces) {
227
- /* dismiss content after maximum decimal places reached */
228
- break;
229
- }
230
- result += char;
231
- }
232
- else if (char === this.groupingSeparator) {
233
- if (indexDecimalSep === -1) {
234
- ignoredChars++;
235
- }
236
- }
237
- else {
238
- /* dismiss content after a invalid character */
239
- break;
240
- }
241
- }
242
- return result;
243
- }
244
152
  updateInput(value, updateAsync) {
245
153
  this.displayValue = value;
246
154
  this.inputEl.nativeElement.value = value;
247
- this._numericValue = parseFloat(this.strip(value).replace(this.decimalSeparator, '.'));
155
+ this._numericValue = parseFloat(strip(value, false, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces).replace(this.decimalSeparator, '.'));
248
156
  if (this._numericValue !== this.roundOrTruncate(this.originalValue)) {
249
157
  this.originalValue = this._numericValue;
250
158
  if (updateAsync) {
@@ -369,4 +277,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImpor
369
277
  type: Input,
370
278
  args: ['clrUnit']
371
279
  }] } });
372
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL251bWVyaWNmaWVsZC9udW1lcmljLWZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFFekUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFDekMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFrQjVFLE1BQU0sT0FBTyxlQUFlO0lBa0IxQixJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUss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RUFBRSxhQUFhO3FCQUN4QjtvQkFDRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGO3VHQUV3QixTQUFTO3NCQUEvQixLQUFLO3VCQUFDLGNBQWM7Z0JBQ00sYUFBYTtzQkFBdkMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBQ00sVUFBVTtzQkFBeEMsS0FBSzt1QkFBQyxzQkFBc0I7Z0JBQ0MsZ0JBQWdCO3NCQUE3QyxLQUFLO3VCQUFDLHFCQUFxQjtnQkFDSixnQkFBZ0I7c0JBQXZDLEtBQUs7dUJBQUMsZUFBZTtnQkFDRyxpQkFBaUI7c0JBQXpDLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQUNHLFlBQVk7c0JBQXJDLEtBQUs7dUJBQUMsaUJBQWlCO2dCQUNTLG1CQUFtQjtzQkFBbkQsTUFBTTt1QkFBQyx1QkFBdUI7Z0JBVzNCLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxpQkFBaUI7Z0JBVXBCLElBQUk7c0JBRFAsS0FBSzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIyIFBvcnNjaGUgSW5mb3JtYXRpay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgRGlyZWN0aXZlLFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5jb25zdCBORUdBVElWRSA9ICctJztcbmNvbnN0IEJBQ0tfS0VZQ09ERSA9IDg7XG5jb25zdCBERUxfS0VZQ09ERSA9IDQ2O1xuY29uc3QgQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgPSA0NjtcbmNvbnN0IE9USEVSX0NPTlRST0xfS0VZUyA9IG5ldyBTZXQoWzIyNCwgOTEsIDkzXSk7XG5jb25zdCBOVU1CRVJTID0gbmV3IFNldChbJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknXSk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tjbHJOdW1lcmljXScsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLnRleHQtcmlnaHRdJzogJ3RleHRBbGlnbiA9PT0gXCJyaWdodFwiJyxcbiAgICAnKGNoYW5nZSknOiAnb25DaGFuZ2UoZ2V0VmFsdWVGb3JGb3JtQ29udHJvbCgpKScsXG4gICAgJyhpbnB1dCknOiAnb25DaGFuZ2UoZ2V0VmFsdWVGb3JGb3JtQ29udHJvbCgpKScsXG4gICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKScsXG4gIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ2xyTnVtZXJpY0ZpZWxkKSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIENsck51bWVyaWNGaWVsZCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlclZpZXdDaGVja2VkLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG4gIEBJbnB1dCgnY2xyVGV4dEFsaWduJykgdGV4dEFsaWduID0gJ3JpZ2h0JztcbiAgQElucHV0KCdjbHJEZWNpbWFsUGxhY2VzJykgZGVjaW1hbFBsYWNlcyA9IDI7XG4gIEBJbnB1dCgnY2xyUm91bmREaXNwbGF5VmFsdWUnKSByb3VuZFZhbHVlID0gZmFsc2U7XG4gIEBJbnB1dCgnY2xyQXV0b2ZpbGxEZWNpbWFscycpIGF1dG9maWxsRGVjaW1hbHMgPSBmYWxzZTtcbiAgQElucHV0KCdjbHJEZWNpbWFsU2VwJykgZGVjaW1hbFNlcGFyYXRvciA9ICcsJztcbiAgQElucHV0KCdjbHJHcm91cGluZ1NlcCcpIGdyb3VwaW5nU2VwYXJhdG9yID0gJy4nO1xuICBASW5wdXQoJ2NsclVuaXRQb3NpdGlvbicpIHVuaXRQb3NpdGlvbiA9ICdyaWdodCc7XG4gIEBPdXRwdXQoJ2Nsck51bWVyaWNWYWx1ZUNoYW5nZScpIG51bWVyaWNWYWx1ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBwcml2YXRlIGRpc3BsYXlWYWx1ZSA9ICcnO1xuICBwcml2YXRlIG9yaWdpbmFsVmFsdWUgPSBOYU47XG4gIHByaXZhdGUgX251bWVyaWNWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIF91bml0OiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIGlucHV0Q2hhbmdlTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUga2V5dXBMaXN0ZW5lcjogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBrZXlkb3duTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG5cbiAgQElucHV0KCdjbHJOdW1lcmljVmFsdWUnKVxuICBzZXQgbnVtZXJpY1ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5fbnVtZXJpY1ZhbHVlICE9PSB2YWx1ZSAmJiAhKGlzTmFOKHRoaXMuX251bWVyaWNWYWx1ZSkgJiYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gbnVsbCkpKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRoaXMuX251bWVyaWNWYWx1ZSA9IHRoaXMucm91bmRPclRydW5jYXRlKHZhbHVlKTtcbiAgICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCdjbHJVbml0JylcbiAgc2V0IHVuaXQodmFsdWU6IHN0cmluZykge1xuICAgIGlmICh2YWx1ZSAhPSB0aGlzLl91bml0KSB7XG4gICAgICB0aGlzLl91bml0ID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy51bml0U3BhbiAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudW5pdFNwYW4uaW5uZXJIVE1MID0gJyc7XG4gICAgICAgIGNvbnN0IG5ld1VuaXRUZXh0ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHZhbHVlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLnVuaXRTcGFuLCBuZXdVbml0VGV4dCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1bml0U3BhbjogSFRNTFNwYW5FbGVtZW50O1xuICBwcml2YXRlIGFsbG93ZWRLZXlzID0gbmV3IFNldChOVU1CRVJTKTtcblxuICAvKiBDb250cm9sIFZhbHVlcyBBY2Nlc3NvciBTdHVmZiBiZWxvdyAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uQ2hhbmdlID0gKF86IG51bWJlcik6IHZvaWQgPT4ge307XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5udW1lcmljVmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMiwgcHJpdmF0ZSBpbnB1dEVsOiBFbGVtZW50UmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8qIG5lZWRzIHRvIGJlIHBhcnNlZCBhcyBudW1iZXIgZXhwbGljaXRseSBhcyBpdCBjb21lcyBhcyBzdHJpbmcgZnJvbSB1c2VyIGlucHV0ICovXG4gICAgdGhpcy5kZWNpbWFsUGxhY2VzID0gTnVtYmVyLnBhcnNlSW50KHRoaXMuZGVjaW1hbFBsYWNlcy50b1N0cmluZygpLCAxMCk7XG4gICAgdGhpcy5hbGxvd2VkS2V5cy5hZGQoTkVHQVRJVkUpO1xuICAgIHRoaXMuYWxsb3dlZEtleXMuYWRkKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgICB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgJ2JsdXInLCBldmVudCA9PiB7XG4gICAgICB0aGlzLmZvcm1hdElucHV0KGV2ZW50LnRhcmdldCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmtleXVwTGlzdGVuZXIgPSB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgJ2tleXVwJywgZXZlbnQgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBldmVudC5rZXlDb2RlID09PSBCQUNLX0tFWUNPREUgfHxcbiAgICAgICAgKGV2ZW50LmtleUNvZGUgPj0gQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgJiYgIU9USEVSX0NPTlRST0xfS0VZUy5oYXMoZXZlbnQua2V5Q29kZSkpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5mb3JtYXRJbnB1dChldmVudC50YXJnZXQsIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMua2V5ZG93bkxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgZXZlbnQgPT4ge1xuICAgICAgY29uc3QgdmFsdWU6IHN0cmluZyA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5hbGxvd2VkS2V5cy5oYXMoZXZlbnQua2V5KSB8fFxuICAgICAgICAoZXZlbnQua2V5Q29kZSA8PSBDT05UUk9MX0tFWUNPREVTX1VQUEVSX0JPUkRFUiAmJiBldmVudC5rZXlDb2RlID4gMCkgfHxcbiAgICAgICAgZXZlbnQubWV0YUtleSB8fFxuICAgICAgICBldmVudC5jdHJsS2V5IHx8XG4gICAgICAgIGV2ZW50LmFsdEtleVxuICAgICAgKSB7XG4gICAgICAgIC8qIGFsbG93IG5lZ2F0aXZlIHNpZ24gb25seSBhcyBmaXJzdCBjaGFyYWN0ZXIgYW5kIG5vbmUgZXhpc3RzIG91dHNpZGUgb2YgdGV4dCBzZWxlY3Rpb24gKi9cbiAgICAgICAgY29uc3QgaW5kZXhOZWdhdGl2ZVNpZ24gPSB2YWx1ZS5pbmRleE9mKE5FR0FUSVZFKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gTkVHQVRJVkUgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID4gMCB8fCBpbmRleE5lZ2F0aXZlU2lnbiA+IC0xKSAmJlxuICAgICAgICAgIChldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPT09IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgfHxcbiAgICAgICAgICAgICEoaW5kZXhOZWdhdGl2ZVNpZ24gPj0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ICYmIGluZGV4TmVnYXRpdmVTaWduIDw9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBubyBkdXBsaWNhdGUgZGVjaW1hbCBzZXBhcmF0b3JzICovXG4gICAgICAgIGNvbnN0IGluZGV4RGVjaW1hbFNlcCA9IHZhbHVlLmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGV2ZW50LmtleSA9PT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yICYmXG4gICAgICAgICAgKGluZGV4RGVjaW1hbFNlcCA+IC0xIHx8IHRoaXMuZGVjaW1hbFBsYWNlcyA9PT0gMCkgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kIHx8XG4gICAgICAgICAgICAhKGluZGV4RGVjaW1hbFNlcCA+PSBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgJiYgaW5kZXhEZWNpbWFsU2VwIDw9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBwcmV2ZW50IHRvbyBtYW55IGRlY2ltYWwgcGxhY2VzICovXG4gICAgICAgIGlmIChcbiAgICAgICAgICBOVU1CRVJTLmhhcyhldmVudC5rZXkpICYmXG4gICAgICAgICAgaW5kZXhEZWNpbWFsU2VwID4gLTEgJiZcbiAgICAgICAgICBpbmRleERlY2ltYWxTZXAgPCBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgJiZcbiAgICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPT09IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgICB2YWx1ZS5sZW5ndGggPiBpbmRleERlY2ltYWxTZXAgKyB0aGlzLmRlY2ltYWxQbGFjZXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogd2hlbiBkZWxldGluZyB0aG91c2FuZCBzZXBhcmF0b3IsIHJlbW92ZSB0aGUgZGlnaXQgYmVmb3JlIG9yIGFmdGVyIGl0ICovXG4gICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0O1xuXG4gICAgICAgIGlmIChjdXJzb3JTdGFydCA9PT0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCkge1xuICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBCQUNLX0tFWUNPREUgJiYgdmFsdWUuc3Vic3RyKGN1cnNvclN0YXJ0IC0gMSwgMSkgPT09IHRoaXMuZ3JvdXBpbmdTZXBhcmF0b3IpIHtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCBjdXJzb3JTdGFydCAtIDIpICsgdmFsdWUuc3Vic3RyaW5nKGN1cnNvclN0YXJ0IC0gMSwgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICAgIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQgPSBjdXJzb3JTdGFydCAtIDE7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChldmVudC5rZXlDb2RlID09PSBERUxfS0VZQ09ERSAmJiB2YWx1ZS5zdWJzdHIoY3Vyc29yU3RhcnQsIDEpID09PSB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgY3Vyc29yU3RhcnQgKyAxKSArIHZhbHVlLnN1YnN0cmluZyhjdXJzb3JTdGFydCArIDIsIHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kID0gY3Vyc29yU3RhcnQgKyAxO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yaWdpbmFsVmFsdWUgPSBOYU47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoTGlzdGVuZXIoKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0aGlzLmluamVjdFVuaXRTeW1ib2woKTtcbiAgfVxuXG4gIGhhbmRsZUlucHV0Q2hhbmdlZCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUlucHV0KFxuICAgICAgdGhpcy5mb3JtYXROdW1iZXIodGhpcy5fbnVtZXJpY1ZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZShuZXcgUmVnRXhwKCdbLl0nLCAnZycpLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLCB0cnVlKSxcbiAgICAgIHRydWVcbiAgICApO1xuICB9XG5cbiAgZm9ybWF0SW5wdXQoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCwgZmluYWxGb3JtYXR0aW5nOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgY3Vyc29yUG9zID0gZWxlbWVudC5zZWxlY3Rpb25TdGFydDtcbiAgICBjb25zdCBsZW5ndGggPSBlbGVtZW50LnZhbHVlLmxlbmd0aDtcbiAgICBjb25zdCBzZXRDdXJzb3IgPSB0aGlzLmRpc3BsYXlWYWx1ZSAhPT0gZWxlbWVudC52YWx1ZTtcbiAgICB0aGlzLnVwZGF0ZUlucHV0KHRoaXMuZm9ybWF0TnVtYmVyKGVsZW1lbnQudmFsdWUsIGZpbmFsRm9ybWF0dGluZyksIGZhbHNlKTtcbiAgICBpZiAoc2V0Q3Vyc29yKSB7XG4gICAgICBlbGVtZW50LnNlbGVjdGlvblN0YXJ0ID0gZWxlbWVudC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChjdXJzb3JQb3MgKyBlbGVtZW50LnZhbHVlLmxlbmd0aCAtIGxlbmd0aCwgMCk7XG4gICAgfVxuICB9XG5cbiAgZm9ybWF0TnVtYmVyKHZhbHVlOiBzdHJpbmcsIGZpbmFsRm9ybWF0dGluZzogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuc3RyaXAodmFsdWUsIGZpbmFsRm9ybWF0dGluZyk7XG5cbiAgICAvKiBhZGQgZ3JvdXBpbmcgc2VwYXJhdG9yICovXG4gICAgY29uc3QgZGVjaW1hbEluZGV4ID0gcmVzdWx0LmluZGV4T2YodGhpcy5kZWNpbWFsU2VwYXJhdG9yKTtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gcmVzdWx0WzBdID09PSBORUdBVElWRTtcbiAgICBsZXQgaSA9IGRlY2ltYWxJbmRleCA+IC0xID8gZGVjaW1hbEluZGV4IDogcmVzdWx0Lmxlbmd0aDtcbiAgICB3aGlsZSAoaSA+IChpc05lZ2F0aXZlID8gNCA6IDMpKSB7XG4gICAgICBpIC09IDM7XG4gICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIGkpICsgdGhpcy5ncm91cGluZ1NlcGFyYXRvciArIHJlc3VsdC5zdWJzdHJpbmcoaSwgcmVzdWx0Lmxlbmd0aCk7XG4gICAgfVxuXG4gICAgaWYgKGZpbmFsRm9ybWF0dGluZykge1xuICAgICAgaWYgKHRoaXMuZGVjaW1hbFBsYWNlcyA+IDAgJiYgISFyZXN1bHQpIHtcbiAgICAgICAgLyogYXV0b2ZpbGwgZGVjaW1hbCBwbGFjZXMgKi9cbiAgICAgICAgbGV0IGFjdHVhbERlY2ltYWxJbmRleCA9IHJlc3VsdC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmICh0aGlzLmF1dG9maWxsRGVjaW1hbHMpIHtcbiAgICAgICAgICBpZiAoYWN0dWFsRGVjaW1hbEluZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgYWN0dWFsRGVjaW1hbEluZGV4ID0gcmVzdWx0Lmxlbmd0aDtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmRlY2ltYWxTZXBhcmF0b3I7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5hZGRNaXNzaW5nTGVhZGluZ1plcm8ocmVzdWx0LCBhY3R1YWxEZWNpbWFsSW5kZXgpO1xuICAgICAgICAgIGFjdHVhbERlY2ltYWxJbmRleCA9IHJlc3VsdC5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgICAgICAgICBjb25zdCBhY3R1YWxEZWNpbWFsUGxhY2VzID0gcmVzdWx0Lmxlbmd0aCAtIGFjdHVhbERlY2ltYWxJbmRleCAtIDE7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmRlY2ltYWxQbGFjZXMgLSBhY3R1YWxEZWNpbWFsUGxhY2VzOyBqKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWRkTWlzc2luZ0xlYWRpbmdaZXJvKHJlc3VsdCwgYWN0dWFsRGVjaW1hbEluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhZGRNaXNzaW5nTGVhZGluZ1plcm8ocmVzdWx0OiBzdHJpbmcsIGFjdHVhbERlY2ltYWxJbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBpc05lZ2F0aXZlID0gcmVzdWx0WzBdID09PSBORUdBVElWRTtcbiAgICAvKiBhdXRvYWRkIGEgemVybyBiZWZvcmUgZGVjaW1hbCBzZXBhcmF0b3IsIHdoZW4gaXQncyBtaXNzaW5nICovXG4gICAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gMCkge1xuICAgICAgcmVzdWx0ID0gJzAnICsgcmVzdWx0O1xuICAgIH1cbiAgICAvKiBhdXRvYWRkIGEgemVybyBiZWZvcmUgZGVjaW1hbCBzZXBhcmF0b3IsIHdoZW4gaXQncyBtaXNzaW5nLCBmb3IgbmVnYXRpdmUgdmFsdWVzICovXG4gICAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gMSAmJiBpc05lZ2F0aXZlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHRbMF0gKyAnMCcgKyByZXN1bHQuc3Vic3RyaW5nKDEsIHJlc3VsdC5sZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RyaXAodmFsdWU6IHN0cmluZywgcmVtb3ZlTGVhZGluZ1plcm9zID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSAnJztcbiAgICBsZXQgaW5kZXhEZWNpbWFsU2VwID0gLTE7XG4gICAgbGV0IGogPSAtMTtcbiAgICBsZXQgaWdub3JlZENoYXJzID0gMDtcbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICAgIGorKztcbiAgICAgIGlmICh0aGlzLmFsbG93ZWRLZXlzLmhhcyhjaGFyKSkge1xuICAgICAgICBpZiAoY2hhciA9PT0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZGVjaW1hbFBsYWNlcyA9PT0gMCkge1xuICAgICAgICAgICAgLyogZGlzbWlzcyBjb250ZW50IGFmdGVyIGEgZGVjaW1hbCBzZXBhcmF0b3IsIHdoZW4gbm8gcGxhY2VzIGFsbG93ZWQgKi9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaW5kZXhEZWNpbWFsU2VwID4gLTEpIHtcbiAgICAgICAgICAgIC8qIGlnbm9yZSBzdWJzZXF1ZW50IGRlY2ltYWwgc2VwYXJhdG9ycyAqL1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4RGVjaW1hbFNlcCA9IGo7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09ICcwJyAmJiByZW1vdmVMZWFkaW5nWmVyb3MpIHtcbiAgICAgICAgICAvKiByZW1vdmUgbGVhZGluZyB6ZXJvIG9ubHkgaWYgaXQncyBub3QgdGhlIG9ubHkgemVybyBpbiB0aGUgJ3ZhbHVlJyBzdHJpbmcgKi9cbiAgICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGggPT09IDAgJiYgaiArIDEgIT09IHZhbHVlLmxlbmd0aCkgfHwgcmVzdWx0ID09PSBORUdBVElWRSkge1xuICAgICAgICAgICAgaWdub3JlZENoYXJzKys7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXIgPT09IE5FR0FUSVZFICYmIGogPiAwKSB7XG4gICAgICAgICAgLyogZGlzbWlzcyBjb250ZW50IGFmdGVyIGEgbmVnYXRpdmUgc2lnbiBub3Qgb24gZmlyc3QgcG9zaXRpb24gKi9cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhEZWNpbWFsU2VwID4gLTEgJiYgcmVzdWx0Lmxlbmd0aCArIGlnbm9yZWRDaGFycyA+IGluZGV4RGVjaW1hbFNlcCArIHRoaXMuZGVjaW1hbFBsYWNlcykge1xuICAgICAgICAgIC8qIGRpc21pc3MgY29udGVudCBhZnRlciBtYXhpbXVtIGRlY2ltYWwgcGxhY2VzIHJlYWNoZWQgKi9cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgKz0gY2hhcjtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gdGhpcy5ncm91cGluZ1NlcGFyYXRvcikge1xuICAgICAgICBpZiAoaW5kZXhEZWNpbWFsU2VwID09PSAtMSkge1xuICAgICAgICAgIGlnbm9yZWRDaGFycysrO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgYSBpbnZhbGlkIGNoYXJhY3RlciAqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgdXBkYXRlSW5wdXQodmFsdWU6IHN0cmluZywgdXBkYXRlQXN5bmM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdCh0aGlzLnN0cmlwKHZhbHVlKS5yZXBsYWNlKHRoaXMuZGVjaW1hbFNlcGFyYXRvciwgJy4nKSk7XG4gICAgaWYgKHRoaXMuX251bWVyaWNWYWx1ZSAhPT0gdGhpcy5yb3VuZE9yVHJ1bmNhdGUodGhpcy5vcmlnaW5hbFZhbHVlKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gdGhpcy5fbnVtZXJpY1ZhbHVlO1xuICAgICAgaWYgKHVwZGF0ZUFzeW5jKSB7XG4gICAgICAgIC8vIENhbGwgaW4gc2V0VGltZW91dCB0byBhdm9pZCBFeHByZXNzaW9uIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IGhhcyBiZWVuIGNoZWNrZWQgZXJyb3IuXG4gICAgICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSBpZiB0aGUgaW5pdGlhbCBpbnB1dCBoYXMgbW9yZSBkZWNpbWFsIHBsYWNlcyB0aGFuIGFsbG93ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLm51bWVyaWNWYWx1ZUNoYW5nZWQuZW1pdCh0aGlzLl9udW1lcmljVmFsdWUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubnVtZXJpY1ZhbHVlQ2hhbmdlZC5lbWl0KHRoaXMuX251bWVyaWNWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldFZhbHVlRm9yRm9ybUNvbnRyb2woKTogbnVtYmVyIHtcbiAgICB0aGlzLmZvcm1hdElucHV0KHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCBmYWxzZSk7XG4gICAgaWYgKGlzTmFOKHRoaXMuX251bWVyaWNWYWx1ZSkpIHtcbiAgICAgIC8vIFJldHVybiB1bmRlZmluZWQgaW5zdGVhZCBvZiBOYU4gdG8gc3VwcG9ydCB0aGUgZGVmYXVsdCByZXF1aXJlZCB2YWxpZGF0b3IuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbnVtZXJpY1ZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmplY3RVbml0U3ltYm9sKCk6IHZvaWQge1xuICAgIC8vIE5lZWQgdG8gaW5qZWN0IHRoZSB1bml0IHN5bWJvbCB3aGVuIHRoZSBpbnB1dCBlbGVtZW50IHdpZHRoIGlzIHNldCB0byBpdHMgYWN0dWFsIHZhbHVlLFxuICAgIC8vIG90aGVyd2lzZSB0aGUgaWNvbiB3b250IHNob3cgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb25cbiAgICBpZiAoISF0aGlzLl91bml0ICYmICF0aGlzLnVuaXRTcGFuICYmIHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICE9PSAwKSB7XG4gICAgICAvLyBHZXQgdGhlIGlucHV0IHdyYXBwZXIgYW5kIGFwcGx5IG5lY2Vzc2FyeSBzdHlsZXNcbiAgICAgIGNvbnN0IGlucHV0V3JhcHBlciA9IHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LnBhcmVudE5vZGU7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGlucHV0V3JhcHBlciwgJ251bWVyaWMtaW5wdXQtd3JhcHBlcicpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHNwYW4gd2l0aCB1bml0IHN5bWJvbCBhbmQgYXBwbHkgbmVjZXNzYXJ5IHN0eWxlc1xuICAgICAgaWYgKCF0aGlzLnVuaXRTcGFuKSB7XG4gICAgICAgIHRoaXMudW5pdFNwYW4gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnVuaXRTcGFuLCAndW5pdCcpO1xuICAgICAgICBjb25zdCB1bml0U3ltYm9sID0gdGhpcy5yZW5kZXJlci5jcmVhdGVUZXh0KHRoaXMuX3VuaXQpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMudW5pdFNwYW4sIHVuaXRTeW1ib2wpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKGlucHV0V3JhcHBlciwgdGhpcy51bml0U3Bhbik7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCBwYWRkaW5nIHRvIHRoZSBpbnB1dCBlbGVtZW50LCBkZXBlbmRpbmcgb24gdGhlIHdpZHRoIG9mIHRoZSB1bml0IHN5bWJvbCArIDEycHhcbiAgICAgIGNvbnN0IHBhZGRpbmdPbklucHV0ID0gdGhpcy51bml0U3Bhbi5vZmZzZXRXaWR0aCArIDEyO1xuICAgICAgaWYgKHRoaXMudW5pdFBvc2l0aW9uID09PSAnbGVmdCcpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnVuaXRTcGFuLCAndW5pdC1sZWZ0Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLWxlZnQnLCBwYWRkaW5nT25JbnB1dCArICdweCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLnVuaXRTcGFuLCAndW5pdC1yaWdodCcpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCAncGFkZGluZy1yaWdodCcsIHBhZGRpbmdPbklucHV0ICsgJ3B4Jyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXRhY2hMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbnB1dENoYW5nZUxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXI7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWRvd25MaXN0ZW5lcikge1xuICAgICAgdGhpcy5rZXlkb3duTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmtleWRvd25MaXN0ZW5lcjtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5dXBMaXN0ZW5lcikge1xuICAgICAgdGhpcy5rZXl1cExpc3RlbmVyKCk7XG4gICAgICBkZWxldGUgdGhpcy5rZXl1cExpc3RlbmVyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcm91bmRPclRydW5jYXRlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG1ldGhvZCA9IHRoaXMucm91bmRWYWx1ZSA/ICdyb3VuZCcgOiB2YWx1ZSA8IDAgPyAnY2VpbCcgOiAnZmxvb3InO1xuICAgIC8vIDE2IGlzIHRoZSBoaWdoZXN0IHByZWNpc2lvbiBiZWZvcmUgbnVtYmVycyBoYXZlIHdlaXJkIGJlaGF2aW91ci4gc2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yMTQ3MjgyOC8xNTEyMDk0MlxuICAgIHJldHVybiBNYXRoW21ldGhvZF0oKyh2YWx1ZSAqIE1hdGgucG93KDEwLCB0aGlzLmRlY2ltYWxQbGFjZXMpKS50b1ByZWNpc2lvbigxNSkpIC8gTWF0aC5wb3coMTAsIHRoaXMuZGVjaW1hbFBsYWNlcyk7XG4gIH1cbn1cbiJdfQ==
280
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy1maWVsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL251bWVyaWNmaWVsZC9udW1lcmljLWZpZWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBRUwsU0FBUyxFQUNULFVBQVUsRUFDVixZQUFZLEVBQ1osVUFBVSxFQUNWLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQzs7QUFFOUMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ3JCLE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUM7QUFDdkIsTUFBTSw2QkFBNkIsR0FBRyxFQUFFLENBQUM7QUFDekMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNsRCxNQUFNLE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFrQjVFLE1BQU0sT0FBTyxlQUFlO0lBa0IxQixJQUNJLFlBQVksQ0FBQyxLQUFhO1FBQzVCLElBQUksSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLElBQUks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QUM5QyxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjt1R0FFd0IsU0FBUztzQkFBL0IsS0FBSzt1QkFBQyxjQUFjO2dCQUNNLGFBQWE7c0JBQXZDLEtBQUs7dUJBQUMsa0JBQWtCO2dCQUNNLFVBQVU7c0JBQXhDLEtBQUs7dUJBQUMsc0JBQXNCO2dCQUNDLGdCQUFnQjtzQkFBN0MsS0FBSzt1QkFBQyxxQkFBcUI7Z0JBQ0osZ0JBQWdCO3NCQUF2QyxLQUFLO3VCQUFDLGVBQWU7Z0JBQ0csaUJBQWlCO3NCQUF6QyxLQUFLO3VCQUFDLGdCQUFnQjtnQkFDRyxZQUFZO3NCQUFyQyxLQUFLO3VCQUFDLGlCQUFpQjtnQkFDUyxtQkFBbUI7c0JBQW5ELE1BQU07dUJBQUMsdUJBQXVCO2dCQVczQixZQUFZO3NCQURmLEtBQUs7dUJBQUMsaUJBQWlCO2dCQVVwQixJQUFJO3NCQURQLEtBQUs7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBQb3JzY2hlIEluZm9ybWF0aWsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgc3RyaXAgfSBmcm9tICcuLi91dGlsJztcblxuY29uc3QgTkVHQVRJVkUgPSAnLSc7XG5jb25zdCBCQUNLX0tFWUNPREUgPSA4O1xuY29uc3QgREVMX0tFWUNPREUgPSA0NjtcbmNvbnN0IENPTlRST0xfS0VZQ09ERVNfVVBQRVJfQk9SREVSID0gNDY7XG5jb25zdCBPVEhFUl9DT05UUk9MX0tFWVMgPSBuZXcgU2V0KFsyMjQsIDkxLCA5M10pO1xuY29uc3QgTlVNQkVSUyA9IG5ldyBTZXQoWycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5J10pO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2xyTnVtZXJpY10nLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy50ZXh0LXJpZ2h0XSc6ICd0ZXh0QWxpZ24gPT09IFwicmlnaHRcIicsXG4gICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKGdldFZhbHVlRm9yRm9ybUNvbnRyb2woKSknLFxuICAgICcoaW5wdXQpJzogJ29uQ2hhbmdlKGdldFZhbHVlRm9yRm9ybUNvbnRyb2woKSknLFxuICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknLFxuICB9LFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENsck51bWVyaWNGaWVsZCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJOdW1lcmljRmllbGQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoJ2NsclRleHRBbGlnbicpIHRleHRBbGlnbiA9ICdyaWdodCc7XG4gIEBJbnB1dCgnY2xyRGVjaW1hbFBsYWNlcycpIGRlY2ltYWxQbGFjZXMgPSAyO1xuICBASW5wdXQoJ2NsclJvdW5kRGlzcGxheVZhbHVlJykgcm91bmRWYWx1ZSA9IGZhbHNlO1xuICBASW5wdXQoJ2NsckF1dG9maWxsRGVjaW1hbHMnKSBhdXRvZmlsbERlY2ltYWxzID0gZmFsc2U7XG4gIEBJbnB1dCgnY2xyRGVjaW1hbFNlcCcpIGRlY2ltYWxTZXBhcmF0b3IgPSAnLCc7XG4gIEBJbnB1dCgnY2xyR3JvdXBpbmdTZXAnKSBncm91cGluZ1NlcGFyYXRvciA9ICcuJztcbiAgQElucHV0KCdjbHJVbml0UG9zaXRpb24nKSB1bml0UG9zaXRpb24gPSAncmlnaHQnO1xuICBAT3V0cHV0KCdjbHJOdW1lcmljVmFsdWVDaGFuZ2UnKSBudW1lcmljVmFsdWVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgcHJpdmF0ZSBkaXNwbGF5VmFsdWUgPSAnJztcbiAgcHJpdmF0ZSBvcmlnaW5hbFZhbHVlID0gTmFOO1xuICBwcml2YXRlIF9udW1lcmljVmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBfdW5pdDogc3RyaW5nID0gbnVsbDtcbiAgcHJpdmF0ZSBpbnB1dENoYW5nZUxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIGtleXVwTGlzdGVuZXI6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUga2V5ZG93bkxpc3RlbmVyOiAoKSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgnY2xyTnVtZXJpY1ZhbHVlJylcbiAgc2V0IG51bWVyaWNWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuX251bWVyaWNWYWx1ZSAhPT0gdmFsdWUgJiYgIShpc05hTih0aGlzLl9udW1lcmljVmFsdWUpICYmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IG51bGwpKSkge1xuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLl9udW1lcmljVmFsdWUgPSB0aGlzLnJvdW5kT3JUcnVuY2F0ZSh2YWx1ZSk7XG4gICAgICB0aGlzLmhhbmRsZUlucHV0Q2hhbmdlZCgpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgnY2xyVW5pdCcpXG4gIHNldCB1bml0KHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgIT0gdGhpcy5fdW5pdCkge1xuICAgICAgdGhpcy5fdW5pdCA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMudW5pdFNwYW4gIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnVuaXRTcGFuLmlubmVySFRNTCA9ICcnO1xuICAgICAgICBjb25zdCBuZXdVbml0VGV4dCA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dCh2YWx1ZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy51bml0U3BhbiwgbmV3VW5pdFRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5pdFNwYW46IEhUTUxTcGFuRWxlbWVudDtcbiAgcHJpdmF0ZSBhbGxvd2VkS2V5cyA9IG5ldyBTZXQoTlVNQkVSUyk7XG5cbiAgLyogQ29udHJvbCBWYWx1ZXMgQWNjZXNzb3IgU3R1ZmYgYmVsb3cgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICBvbkNoYW5nZSA9IChfOiBudW1iZXIpOiB2b2lkID0+IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IChfOiBudW1iZXIpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMubnVtZXJpY1ZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgaW5wdXRFbDogRWxlbWVudFJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvKiBuZWVkcyB0byBiZSBwYXJzZWQgYXMgbnVtYmVyIGV4cGxpY2l0bHkgYXMgaXQgY29tZXMgYXMgc3RyaW5nIGZyb20gdXNlciBpbnB1dCAqL1xuICAgIHRoaXMuZGVjaW1hbFBsYWNlcyA9IE51bWJlci5wYXJzZUludCh0aGlzLmRlY2ltYWxQbGFjZXMudG9TdHJpbmcoKSwgMTApO1xuICAgIHRoaXMuYWxsb3dlZEtleXMuYWRkKE5FR0FUSVZFKTtcbiAgICB0aGlzLmFsbG93ZWRLZXlzLmFkZCh0aGlzLmRlY2ltYWxTZXBhcmF0b3IpO1xuXG4gICAgdGhpcy5pbnB1dENoYW5nZUxpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdibHVyJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5mb3JtYXRJbnB1dChldmVudC50YXJnZXQsIHRydWUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5rZXl1cExpc3RlbmVyID0gdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdrZXl1cCcsIGV2ZW50ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnQua2V5Q29kZSA9PT0gQkFDS19LRVlDT0RFIHx8XG4gICAgICAgIChldmVudC5rZXlDb2RlID49IENPTlRST0xfS0VZQ09ERVNfVVBQRVJfQk9SREVSICYmICFPVEhFUl9DT05UUk9MX0tFWVMuaGFzKGV2ZW50LmtleUNvZGUpKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZm9ybWF0SW5wdXQoZXZlbnQudGFyZ2V0LCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmtleWRvd25MaXN0ZW5lciA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCAna2V5ZG93bicsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlOiBzdHJpbmcgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMuYWxsb3dlZEtleXMuaGFzKGV2ZW50LmtleSkgfHxcbiAgICAgICAgKGV2ZW50LmtleUNvZGUgPD0gQ09OVFJPTF9LRVlDT0RFU19VUFBFUl9CT1JERVIgJiYgZXZlbnQua2V5Q29kZSA+IDApIHx8XG4gICAgICAgIGV2ZW50Lm1ldGFLZXkgfHxcbiAgICAgICAgZXZlbnQuY3RybEtleSB8fFxuICAgICAgICBldmVudC5hbHRLZXlcbiAgICAgICkge1xuICAgICAgICAvKiBhbGxvdyBuZWdhdGl2ZSBzaWduIG9ubHkgYXMgZmlyc3QgY2hhcmFjdGVyIGFuZCBub25lIGV4aXN0cyBvdXRzaWRlIG9mIHRleHQgc2VsZWN0aW9uICovXG4gICAgICAgIGNvbnN0IGluZGV4TmVnYXRpdmVTaWduID0gdmFsdWUuaW5kZXhPZihORUdBVElWRSk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudC5rZXkgPT09IE5FR0FUSVZFICYmXG4gICAgICAgICAgKGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA+IDAgfHwgaW5kZXhOZWdhdGl2ZVNpZ24gPiAtMSkgJiZcbiAgICAgICAgICAoZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kIHx8XG4gICAgICAgICAgICAhKGluZGV4TmVnYXRpdmVTaWduID49IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCAmJiBpbmRleE5lZ2F0aXZlU2lnbiA8PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogbm8gZHVwbGljYXRlIGRlY2ltYWwgc2VwYXJhdG9ycyAqL1xuICAgICAgICBjb25zdCBpbmRleERlY2ltYWxTZXAgPSB2YWx1ZS5pbmRleE9mKHRoaXMuZGVjaW1hbFNlcGFyYXRvcik7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBldmVudC5rZXkgPT09IHRoaXMuZGVjaW1hbFNlcGFyYXRvciAmJlxuICAgICAgICAgIChpbmRleERlY2ltYWxTZXAgPiAtMSB8fCB0aGlzLmRlY2ltYWxQbGFjZXMgPT09IDApICYmXG4gICAgICAgICAgKGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCA9PT0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCB8fFxuICAgICAgICAgICAgIShpbmRleERlY2ltYWxTZXAgPj0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ICYmIGluZGV4RGVjaW1hbFNlcCA8PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogcHJldmVudCB0b28gbWFueSBkZWNpbWFsIHBsYWNlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgTlVNQkVSUy5oYXMoZXZlbnQua2V5KSAmJlxuICAgICAgICAgIGluZGV4RGVjaW1hbFNlcCA+IC0xICYmXG4gICAgICAgICAgaW5kZXhEZWNpbWFsU2VwIDwgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ICYmXG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID09PSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kICYmXG4gICAgICAgICAgdmFsdWUubGVuZ3RoID4gaW5kZXhEZWNpbWFsU2VwICsgdGhpcy5kZWNpbWFsUGxhY2VzXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIHdoZW4gZGVsZXRpbmcgdGhvdXNhbmQgc2VwYXJhdG9yLCByZW1vdmUgdGhlIGRpZ2l0IGJlZm9yZSBvciBhZnRlciBpdCAqL1xuICAgICAgICBjb25zdCBjdXJzb3JTdGFydCA9IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydDtcblxuICAgICAgICBpZiAoY3Vyc29yU3RhcnQgPT09IGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gQkFDS19LRVlDT0RFICYmIHZhbHVlLnN1YnN0cihjdXJzb3JTdGFydCAtIDEsIDEpID09PSB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yKSB7XG4gICAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgY3Vyc29yU3RhcnQgLSAyKSArIHZhbHVlLnN1YnN0cmluZyhjdXJzb3JTdGFydCAtIDEsIHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICBldmVudC50YXJnZXQuc2VsZWN0aW9uU3RhcnQgPSBldmVudC50YXJnZXQuc2VsZWN0aW9uRW5kID0gY3Vyc29yU3RhcnQgLSAxO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gREVMX0tFWUNPREUgJiYgdmFsdWUuc3Vic3RyKGN1cnNvclN0YXJ0LCAxKSA9PT0gdGhpcy5ncm91cGluZ1NlcGFyYXRvcikge1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDAsIGN1cnNvclN0YXJ0ICsgMSkgKyB2YWx1ZS5zdWJzdHJpbmcoY3Vyc29yU3RhcnQgKyAyLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgICAgZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0ID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCA9IGN1cnNvclN0YXJ0ICsgMTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlID0gTmFOO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaExpc3RlbmVyKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5pbmplY3RVbml0U3ltYm9sKCk7XG4gIH1cblxuICBoYW5kbGVJbnB1dENoYW5nZWQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVJbnB1dChcbiAgICAgIGZvcm1hdE51bWJlcihcbiAgICAgICAgdGhpcy5fbnVtZXJpY1ZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZShuZXcgUmVnRXhwKCdbLl0nLCAnZycpLCB0aGlzLmRlY2ltYWxTZXBhcmF0b3IpLFxuICAgICAgICB0cnVlLFxuICAgICAgICB0aGlzLmRlY2ltYWxTZXBhcmF0b3IsXG4gICAgICAgIHRoaXMuZ3JvdXBpbmdTZXBhcmF0b3IsXG4gICAgICAgIHRoaXMuZGVjaW1hbFBsYWNlcyxcbiAgICAgICAgdGhpcy5hdXRvZmlsbERlY2ltYWxzXG4gICAgICApLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBmb3JtYXRJbnB1dChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50LCBmaW5hbEZvcm1hdHRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBjdXJzb3JQb3MgPSBlbGVtZW50LnNlbGVjdGlvblN0YXJ0O1xuICAgIGNvbnN0IGxlbmd0aCA9IGVsZW1lbnQudmFsdWUubGVuZ3RoO1xuICAgIGNvbnN0IHNldEN1cnNvciA9IHRoaXMuZGlzcGxheVZhbHVlICE9PSBlbGVtZW50LnZhbHVlO1xuICAgIHRoaXMudXBkYXRlSW5wdXQoXG4gICAgICBmb3JtYXROdW1iZXIoXG4gICAgICAgIGVsZW1lbnQudmFsdWUsXG4gICAgICAgIGZpbmFsRm9ybWF0dGluZyxcbiAgICAgICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yLFxuICAgICAgICB0aGlzLmRlY2ltYWxQbGFjZXMsXG4gICAgICAgIHRoaXMuYXV0b2ZpbGxEZWNpbWFsc1xuICAgICAgKSxcbiAgICAgIGZhbHNlXG4gICAgKTtcbiAgICBpZiAoc2V0Q3Vyc29yKSB7XG4gICAgICBlbGVtZW50LnNlbGVjdGlvblN0YXJ0ID0gZWxlbWVudC5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChjdXJzb3JQb3MgKyBlbGVtZW50LnZhbHVlLmxlbmd0aCAtIGxlbmd0aCwgMCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlSW5wdXQodmFsdWU6IHN0cmluZywgdXBkYXRlQXN5bmM6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5fbnVtZXJpY1ZhbHVlID0gcGFyc2VGbG9hdChcbiAgICAgIHN0cmlwKHZhbHVlLCBmYWxzZSwgdGhpcy5kZWNpbWFsU2VwYXJhdG9yLCB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yLCB0aGlzLmRlY2ltYWxQbGFjZXMpLnJlcGxhY2UoXG4gICAgICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvcixcbiAgICAgICAgJy4nXG4gICAgICApXG4gICAgKTtcbiAgICBpZiAodGhpcy5fbnVtZXJpY1ZhbHVlICE9PSB0aGlzLnJvdW5kT3JUcnVuY2F0ZSh0aGlzLm9yaWdpbmFsVmFsdWUpKSB7XG4gICAgICB0aGlzLm9yaWdpbmFsVmFsdWUgPSB0aGlzLl9udW1lcmljVmFsdWU7XG4gICAgICBpZiAodXBkYXRlQXN5bmMpIHtcbiAgICAgICAgLy8gQ2FsbCBpbiBzZXRUaW1lb3V0IHRvIGF2b2lkIEV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgaGFzIGJlZW4gY2hlY2tlZCBlcnJvci5cbiAgICAgICAgLy8gVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIGlmIHRoZSBpbml0aWFsIGlucHV0IGhhcyBtb3JlIGRlY2ltYWwgcGxhY2VzIHRoYW4gYWxsb3dlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMubnVtZXJpY1ZhbHVlQ2hhbmdlZC5lbWl0KHRoaXMuX251bWVyaWNWYWx1ZSkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5udW1lcmljVmFsdWVDaGFuZ2VkLmVtaXQodGhpcy5fbnVtZXJpY1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VmFsdWVGb3JGb3JtQ29udHJvbCgpOiBudW1iZXIge1xuICAgIHRoaXMuZm9ybWF0SW5wdXQodGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsIGZhbHNlKTtcbiAgICBpZiAoaXNOYU4odGhpcy5fbnVtZXJpY1ZhbHVlKSkge1xuICAgICAgLy8gUmV0dXJuIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIE5hTiB0byBzdXBwb3J0IHRoZSBkZWZhdWx0IHJlcXVpcmVkIHZhbGlkYXRvci5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9udW1lcmljVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIGluamVjdFVuaXRTeW1ib2woKTogdm9pZCB7XG4gICAgLy8gTmVlZCB0byBpbmplY3QgdGhlIHVuaXQgc3ltYm9sIHdoZW4gdGhlIGlucHV0IGVsZW1lbnQgd2lkdGggaXMgc2V0IHRvIGl0cyBhY3R1YWwgdmFsdWUsXG4gICAgLy8gb3RoZXJ3aXNlIHRoZSBpY29uIHdvbnQgc2hvdyBpbiB0aGUgY29ycmVjdCBwb3NpdGlvblxuICAgIGlmICghIXRoaXMuX3VuaXQgJiYgIXRoaXMudW5pdFNwYW4gJiYgdGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggIT09IDApIHtcbiAgICAgIC8vIEdldCB0aGUgaW5wdXQgd3JhcHBlciBhbmQgYXBwbHkgbmVjZXNzYXJ5IHN0eWxlc1xuICAgICAgY29uc3QgaW5wdXRXcmFwcGVyID0gdGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3MoaW5wdXRXcmFwcGVyLCAnbnVtZXJpYy1pbnB1dC13cmFwcGVyJyk7XG5cbiAgICAgIC8vIENyZWF0ZSB0aGUgc3BhbiB3aXRoIHVuaXQgc3ltYm9sIGFuZCBhcHBseSBuZWNlc3Nhcnkgc3R5bGVzXG4gICAgICBpZiAoIXRoaXMudW5pdFNwYW4pIHtcbiAgICAgICAgdGhpcy51bml0U3BhbiA9IHRoaXMucmVuZGVyZXIuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMudW5pdFNwYW4sICd1bml0Jyk7XG4gICAgICAgIGNvbnN0IHVuaXRTeW1ib2wgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQodGhpcy5fdW5pdCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQodGhpcy51bml0U3BhbiwgdW5pdFN5bWJvbCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoaW5wdXRXcmFwcGVyLCB0aGlzLnVuaXRTcGFuKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIHBhZGRpbmcgdG8gdGhlIGlucHV0IGVsZW1lbnQsIGRlcGVuZGluZyBvbiB0aGUgd2lkdGggb2YgdGhlIHVuaXQgc3ltYm9sICsgMTJweFxuICAgICAgY29uc3QgcGFkZGluZ09uSW5wdXQgPSB0aGlzLnVuaXRTcGFuLm9mZnNldFdpZHRoICsgMTI7XG4gICAgICBpZiAodGhpcy51bml0UG9zaXRpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMudW5pdFNwYW4sICd1bml0LWxlZnQnKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgJ3BhZGRpbmctbGVmdCcsIHBhZGRpbmdPbklucHV0ICsgJ3B4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMudW5pdFNwYW4sICd1bml0LXJpZ2h0Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5pbnB1dEVsLm5hdGl2ZUVsZW1lbnQsICdwYWRkaW5nLXJpZ2h0JywgcGFkZGluZ09uSW5wdXQgKyAncHgnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRldGFjaExpc3RlbmVyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlucHV0Q2hhbmdlTGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuaW5wdXRDaGFuZ2VMaXN0ZW5lcigpO1xuICAgICAgZGVsZXRlIHRoaXMuaW5wdXRDaGFuZ2VMaXN0ZW5lcjtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5ZG93bkxpc3RlbmVyKSB7XG4gICAgICB0aGlzLmtleWRvd25MaXN0ZW5lcigpO1xuICAgICAgZGVsZXRlIHRoaXMua2V5ZG93bkxpc3RlbmVyO1xuICAgIH1cbiAgICBpZiAodGhpcy5rZXl1cExpc3RlbmVyKSB7XG4gICAgICB0aGlzLmtleXVwTGlzdGVuZXIoKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmtleXVwTGlzdGVuZXI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByb3VuZE9yVHJ1bmNhdGUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgbWV0aG9kID0gdGhpcy5yb3VuZFZhbHVlID8gJ3JvdW5kJyA6IHZhbHVlIDwgMCA/ICdjZWlsJyA6ICdmbG9vcic7XG4gICAgLy8gMTYgaXMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGJlZm9yZSBudW1iZXJzIGhhdmUgd2VpcmQgYmVoYXZpb3VyLiBzZWUgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzIxNDcyODI4LzE1MTIwOTQyXG4gICAgcmV0dXJuIE1hdGhbbWV0aG9kXSgrKHZhbHVlICogTWF0aC5wb3coMTAsIHRoaXMuZGVjaW1hbFBsYWNlcykpLnRvUHJlY2lzaW9uKDE1KSkgLyBNYXRoLnBvdygxMCwgdGhpcy5kZWNpbWFsUGxhY2VzKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,8 @@
1
+ /*
2
+ * Copyright (c) 2018-2024 Porsche Informatik. All Rights Reserved.
3
+ * This software is released under MIT license.
4
+ * The full license information can be found in LICENSE in the root directory of this project.
5
+ */
6
+ export * from './readonly.module';
7
+ export * from './readonly.directive';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xyLWFkZG9ucy9yZWFkb25seS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDI0IFBvcnNjaGUgSW5mb3JtYXRpay4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIFRoaXMgc29mdHdhcmUgaXMgcmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UuXG4gKiBUaGUgZnVsbCBsaWNlbnNlIGluZm9ybWF0aW9uIGNhbiBiZSBmb3VuZCBpbiBMSUNFTlNFIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHByb2plY3QuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9yZWFkb25seS5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9yZWFkb25seS5kaXJlY3RpdmUnO1xuIl19
@@ -0,0 +1,149 @@
1
+ import { Directive, ElementRef, Injector, Input, Renderer2 } from '@angular/core';
2
+ import { NgControl, NgModel } from '@angular/forms';
3
+ import { formatNumber } from '../util';
4
+ import * as i0 from "@angular/core";
5
+ export class ClrReadonlyDirective {
6
+ constructor(elementRef, renderer, injector) {
7
+ this.elementRef = elementRef;
8
+ this.renderer = renderer;
9
+ this.injector = injector;
10
+ this.isMultiSelect = false;
11
+ this.unitPosition = 'right';
12
+ this.property = null;
13
+ this.clrReadOnly = true;
14
+ this.unit = '';
15
+ this.decimalPlaces = 2;
16
+ this.roundValue = false;
17
+ this.autofillDecimals = false;
18
+ this.decimalSeparator = ',';
19
+ this.groupingSeparator = '.';
20
+ this.isInitialized = false;
21
+ }
22
+ ngOnInit() {
23
+ const ngControl = this.injector.get(NgControl, null);
24
+ if (this.clrReadOnly) {
25
+ this.renderAsSpan(ngControl);
26
+ }
27
+ }
28
+ ngOnChanges() {
29
+ if (this.isInitialized) {
30
+ const ngControl = this.injector.get(NgControl, null);
31
+ if (this.clrReadOnly) {
32
+ this.renderAsSpan(ngControl);
33
+ }
34
+ else {
35
+ this.resetReadonly();
36
+ }
37
+ }
38
+ }
39
+ ngAfterViewInit() {
40
+ this.isInitialized = true;
41
+ }
42
+ resetReadonly() {
43
+ const parentElement = this.elementRef.nativeElement.parentElement;
44
+ this.renderer.removeClass(parentElement, 'clr-readonly-parent');
45
+ const spanElement = this.elementRef.nativeElement.parentElement.querySelector('span.clr-readonly');
46
+ if (spanElement != null) {
47
+ this.renderer.removeChild(parentElement, spanElement);
48
+ }
49
+ }
50
+ renderAsSpan(ngControl) {
51
+ const parentElement = this.elementRef.nativeElement.parentElement;
52
+ if (!parentElement) {
53
+ return;
54
+ }
55
+ // Create a new span element to display the readonly value.
56
+ const span = this.renderer.createElement('span');
57
+ const formattedValue = this.formatControlValue(ngControl);
58
+ const textNode = this.renderer.createText(formattedValue);
59
+ // Add text and classes to the span element.
60
+ this.renderer.appendChild(span, textNode);
61
+ this.renderer.setAttribute(span, 'class', 'clr-readonly');
62
+ this.renderer.addClass(parentElement, 'clr-readonly-parent');
63
+ this.renderer.appendChild(parentElement, span);
64
+ }
65
+ determineControlType() {
66
+ if (this.elementRef.nativeElement.attributes['clrnumeric']) {
67
+ return 'numeric';
68
+ }
69
+ else if (this.elementRef.nativeElement.tagName.toLowerCase() === 'select') {
70
+ return 'select';
71
+ }
72
+ else {
73
+ return '';
74
+ }
75
+ }
76
+ formatControlValue(ngControl) {
77
+ const controlType = this.determineControlType();
78
+ const controlValue = ngControl instanceof NgModel ? ngControl.model : ngControl.control?.value;
79
+ if (controlValue == null || controlValue === '') {
80
+ return '';
81
+ }
82
+ if (controlType === 'numeric') {
83
+ return this.formatNumericValue(controlValue);
84
+ }
85
+ else if (this.isMultiSelect) {
86
+ return this.formatMultiSelectValue(controlValue);
87
+ }
88
+ else if (controlType === 'select') {
89
+ return this.formatListValue(controlValue);
90
+ }
91
+ return controlValue ?? '';
92
+ }
93
+ formatNumericValue(controlValue) {
94
+ const result = formatNumber(controlValue + '', true, this.decimalSeparator, this.groupingSeparator, this.decimalPlaces, this.autofillDecimals);
95
+ return this.unitPosition === 'left' ? `${this.unit} ${result}` : `${result} ${this.unit}`;
96
+ }
97
+ formatMultiSelectValue(controlValue) {
98
+ return controlValue.map((item) => item[this.property]).join(', ');
99
+ }
100
+ formatListValue(controlValue) {
101
+ const options = this.elementRef.nativeElement.querySelectorAll('option');
102
+ const matchingOption = Array.from(options).find(option => option.value === controlValue);
103
+ if (matchingOption) {
104
+ return matchingOption.innerHTML;
105
+ }
106
+ else {
107
+ return '';
108
+ }
109
+ }
110
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive }); }
111
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: ClrReadonlyDirective, selector: "[clrReadonly]", inputs: { isMultiSelect: ["clrMulti", "isMultiSelect"], unitPosition: ["clrUnitPosition", "unitPosition"], property: ["clrReadOnlyProperty", "property"], clrReadOnly: ["clrReadonly", "clrReadOnly"], unit: ["clrUnit", "unit"], decimalPlaces: ["clrDecimalPlaces", "decimalPlaces"], roundValue: ["clrRoundDisplayValue", "roundValue"], autofillDecimals: ["clrAutofillDecimals", "autofillDecimals"], decimalSeparator: ["clrDecimalSep", "decimalSeparator"], groupingSeparator: ["clrGroupingSep", "groupingSeparator"] }, usesOnChanges: true, ngImport: i0 }); }
112
+ }
113
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirective, decorators: [{
114
+ type: Directive,
115
+ args: [{
116
+ selector: '[clrReadonly]',
117
+ }]
118
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.Injector }], propDecorators: { isMultiSelect: [{
119
+ type: Input,
120
+ args: ['clrMulti']
121
+ }], unitPosition: [{
122
+ type: Input,
123
+ args: ['clrUnitPosition']
124
+ }], property: [{
125
+ type: Input,
126
+ args: ['clrReadOnlyProperty']
127
+ }], clrReadOnly: [{
128
+ type: Input,
129
+ args: ['clrReadonly']
130
+ }], unit: [{
131
+ type: Input,
132
+ args: ['clrUnit']
133
+ }], decimalPlaces: [{
134
+ type: Input,
135
+ args: ['clrDecimalPlaces']
136
+ }], roundValue: [{
137
+ type: Input,
138
+ args: ['clrRoundDisplayValue']
139
+ }], autofillDecimals: [{
140
+ type: Input,
141
+ args: ['clrAutofillDecimals']
142
+ }], decimalSeparator: [{
143
+ type: Input,
144
+ args: ['clrDecimalSep']
145
+ }], groupingSeparator: [{
146
+ type: Input,
147
+ args: ['clrGroupingSep']
148
+ }] } });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2Nsci1hZGRvbnMvcmVhZG9ubHkvcmVhZG9ubHkuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFxQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEgsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDOztBQUt2QyxNQUFNLE9BQU8sb0JBQW9CO0lBYS9CLFlBQ1UsVUFBc0IsRUFDYixRQUFtQixFQUNuQixRQUFrQjtRQUYzQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ2IsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBZmxCLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBQ3hCLGlCQUFZLEdBQUcsT0FBTyxDQUFDO1FBQ25CLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQ3ZDLGdCQUFXLEdBQVksSUFBSSxDQUFDO1FBQ2hDLFNBQUksR0FBVyxFQUFFLENBQUM7UUFFVCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUNkLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDcEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQy9CLHFCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUN0QixzQkFBaUIsR0FBRyxHQUFHLENBQUM7UUFRekMsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFGM0IsQ0FBQztJQUlKLFFBQVE7UUFDTixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7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O0lBQzFGLENBQUM7SUFFTyxlQUFlLENBQUMsWUFBaUI7UUFDdkMsTUFBTSxPQUFPLEdBQXdCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlGLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssS0FBSyxZQUFZLENBQUMsQ0FBQztRQUN6RixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLE9BQU8sY0FBYyxDQUFDLFNBQVMsQ0FBQztRQUNsQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7OEdBNUhVLG9CQUFvQjtrR0FBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQUhoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxlQUFlO2lCQUMxQjs4SEFFb0IsYUFBYTtzQkFBL0IsS0FBSzt1QkFBQyxVQUFVO2dCQUNTLFlBQVk7c0JBQXJDLEtBQUs7dUJBQUMsaUJBQWlCO2dCQUNNLFFBQVE7c0JBQXJDLEtBQUs7dUJBQUMscUJBQXFCO2dCQUNOLFdBQVc7c0JBQWhDLEtBQUs7dUJBQUMsYUFBYTtnQkFDRixJQUFJO3NCQUFyQixLQUFLO3VCQUFDLFNBQVM7Z0JBRVcsYUFBYTtzQkFBdkMsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBQ00sVUFBVTtzQkFBeEMsS0FBSzt1QkFBQyxzQkFBc0I7Z0JBQ0MsZ0JBQWdCO3NCQUE3QyxLQUFLO3VCQUFDLHFCQUFxQjtnQkFDSixnQkFBZ0I7c0JBQXZDLEtBQUs7dUJBQUMsZUFBZTtnQkFDRyxpQkFBaUI7c0JBQXpDLEtBQUs7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbmplY3RvciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCwgTmdNb2RlbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciB9IGZyb20gJy4uL3V0aWwnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbY2xyUmVhZG9ubHldJyxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyUmVhZG9ubHlEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgnY2xyTXVsdGknKSBpc011bHRpU2VsZWN0OiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgnY2xyVW5pdFBvc2l0aW9uJykgdW5pdFBvc2l0aW9uID0gJ3JpZ2h0JztcbiAgQElucHV0KCdjbHJSZWFkT25seVByb3BlcnR5JykgcHJvcGVydHk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoJ2NsclJlYWRvbmx5JykgY2xyUmVhZE9ubHk6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoJ2NsclVuaXQnKSB1bml0OiBzdHJpbmcgPSAnJztcblxuICBASW5wdXQoJ2NsckRlY2ltYWxQbGFjZXMnKSBkZWNpbWFsUGxhY2VzID0gMjtcbiAgQElucHV0KCdjbHJSb3VuZERpc3BsYXlWYWx1ZScpIHJvdW5kVmFsdWUgPSBmYWxzZTtcbiAgQElucHV0KCdjbHJBdXRvZmlsbERlY2ltYWxzJykgYXV0b2ZpbGxEZWNpbWFscyA9IGZhbHNlO1xuICBASW5wdXQoJ2NsckRlY2ltYWxTZXAnKSBkZWNpbWFsU2VwYXJhdG9yID0gJywnO1xuICBASW5wdXQoJ2Nsckdyb3VwaW5nU2VwJykgZ3JvdXBpbmdTZXBhcmF0b3IgPSAnLic7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvclxuICApIHt9XG5cbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgY29uc3QgbmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoTmdDb250cm9sLCBudWxsKTtcbiAgICBpZiAodGhpcy5jbHJSZWFkT25seSkge1xuICAgICAgdGhpcy5yZW5kZXJBc1NwYW4obmdDb250cm9sKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICBjb25zdCBuZ0NvbnRyb2wgPSB0aGlzLmluamVjdG9yLmdldChOZ0NvbnRyb2wsIG51bGwpO1xuICAgICAgaWYgKHRoaXMuY2xyUmVhZE9ubHkpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJBc1NwYW4obmdDb250cm9sKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVzZXRSZWFkb25seSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldFJlYWRvbmx5KCkge1xuICAgIGNvbnN0IHBhcmVudEVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MocGFyZW50RWxlbWVudCwgJ2Nsci1yZWFkb25seS1wYXJlbnQnKTtcbiAgICBjb25zdCBzcGFuRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucXVlcnlTZWxlY3Rvcignc3Bhbi5jbHItcmVhZG9ubHknKTtcbiAgICBpZiAoc3BhbkVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChwYXJlbnRFbGVtZW50LCBzcGFuRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJBc1NwYW4obmdDb250cm9sOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICBpZiAoIXBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3BhbiBlbGVtZW50IHRvIGRpc3BsYXkgdGhlIHJlYWRvbmx5IHZhbHVlLlxuICAgIGNvbnN0IHNwYW4gPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIGNvbnN0IGZvcm1hdHRlZFZhbHVlID0gdGhpcy5mb3JtYXRDb250cm9sVmFsdWUobmdDb250cm9sKTtcbiAgICBjb25zdCB0ZXh0Tm9kZSA9IHRoaXMucmVuZGVyZXIuY3JlYXRlVGV4dChmb3JtYXR0ZWRWYWx1ZSk7XG5cbiAgICAvLyBBZGQgdGV4dCBhbmQgY2xhc3NlcyB0byB0aGUgc3BhbiBlbGVtZW50LlxuICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQoc3BhbiwgdGV4dE5vZGUpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0QXR0cmlidXRlKHNwYW4sICdjbGFzcycsICdjbHItcmVhZG9ubHknKTtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHBhcmVudEVsZW1lbnQsICdjbHItcmVhZG9ubHktcGFyZW50Jyk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnRFbGVtZW50LCBzcGFuKTtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZXJtaW5lQ29udHJvbFR5cGUoKSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmF0dHJpYnV0ZXNbJ2Nscm51bWVyaWMnXSkge1xuICAgICAgcmV0dXJuICdudW1lcmljJztcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgIHJldHVybiAnc2VsZWN0JztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0Q29udHJvbFZhbHVlKG5nQ29udHJvbDogTmdDb250cm9sKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb250cm9sVHlwZSA9IHRoaXMuZGV0ZXJtaW5lQ29udHJvbFR5cGUoKTtcbiAgICBjb25zdCBjb250cm9sVmFsdWUgPSBuZ0NvbnRyb2wgaW5zdGFuY2VvZiBOZ01vZGVsID8gbmdDb250cm9sLm1vZGVsIDogbmdDb250cm9sLmNvbnRyb2w/LnZhbHVlO1xuXG4gICAgaWYgKGNvbnRyb2xWYWx1ZSA9PSBudWxsIHx8IGNvbnRyb2xWYWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBpZiAoY29udHJvbFR5cGUgPT09ICdudW1lcmljJykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0TnVtZXJpY1ZhbHVlKGNvbnRyb2xWYWx1ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzTXVsdGlTZWxlY3QpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvcm1hdE11bHRpU2VsZWN0VmFsdWUoY29udHJvbFZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNvbnRyb2xUeXBlID09PSAnc2VsZWN0Jykge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0TGlzdFZhbHVlKGNvbnRyb2xWYWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyb2xWYWx1ZSA/PyAnJztcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TnVtZXJpY1ZhbHVlKGNvbnRyb2xWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCByZXN1bHQgPSBmb3JtYXROdW1iZXIoXG4gICAgICBjb250cm9sVmFsdWUgKyAnJyxcbiAgICAgIHRydWUsXG4gICAgICB0aGlzLmRlY2ltYWxTZXBhcmF0b3IsXG4gICAgICB0aGlzLmdyb3VwaW5nU2VwYXJhdG9yLFxuICAgICAgdGhpcy5kZWNpbWFsUGxhY2VzLFxuICAgICAgdGhpcy5hdXRvZmlsbERlY2ltYWxzXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy51bml0UG9zaXRpb24gPT09ICdsZWZ0JyA/IGAke3RoaXMudW5pdH0gJHtyZXN1bHR9YCA6IGAke3Jlc3VsdH0gJHt0aGlzLnVuaXR9YDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0TXVsdGlTZWxlY3RWYWx1ZShjb250cm9sVmFsdWU6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnRyb2xWYWx1ZS5tYXAoKGl0ZW06IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IGl0ZW1bdGhpcy5wcm9wZXJ0eSFdKS5qb2luKCcsICcpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRMaXN0VmFsdWUoY29udHJvbFZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBvcHRpb25zOiBIVE1MT3B0aW9uRWxlbWVudFtdID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJyk7XG4gICAgY29uc3QgbWF0Y2hpbmdPcHRpb24gPSBBcnJheS5mcm9tKG9wdGlvbnMpLmZpbmQob3B0aW9uID0+IG9wdGlvbi52YWx1ZSA9PT0gY29udHJvbFZhbHVlKTtcbiAgICBpZiAobWF0Y2hpbmdPcHRpb24pIHtcbiAgICAgIHJldHVybiBtYXRjaGluZ09wdGlvbi5pbm5lckhUTUw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,16 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { ClrReadonlyDirective } from './readonly.directive';
3
+ import * as i0 from "@angular/core";
4
+ export class ClrReadonlyDirectiveModule {
5
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
6
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule, declarations: [ClrReadonlyDirective], exports: [ClrReadonlyDirective] }); }
7
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule }); }
8
+ }
9
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ClrReadonlyDirectiveModule, decorators: [{
10
+ type: NgModule,
11
+ args: [{
12
+ declarations: [ClrReadonlyDirective],
13
+ exports: [ClrReadonlyDirective],
14
+ }]
15
+ }] });
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHkubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2Nsci1hZGRvbnMvcmVhZG9ubHkvcmVhZG9ubHkubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBTTVELE1BQU0sT0FBTywwQkFBMEI7OEdBQTFCLDBCQUEwQjsrR0FBMUIsMEJBQTBCLGlCQUh0QixvQkFBb0IsYUFDekIsb0JBQW9COytHQUVuQiwwQkFBMEI7OzJGQUExQiwwQkFBMEI7a0JBSnRDLFFBQVE7bUJBQUM7b0JBQ1IsWUFBWSxFQUFFLENBQUMsb0JBQW9CLENBQUM7b0JBQ3BDLE9BQU8sRUFBRSxDQUFDLG9CQUFvQixDQUFDO2lCQUNoQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDbHJSZWFkb25seURpcmVjdGl2ZSB9IGZyb20gJy4vcmVhZG9ubHkuZGlyZWN0aXZlJztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbQ2xyUmVhZG9ubHlEaXJlY3RpdmVdLFxuICBleHBvcnRzOiBbQ2xyUmVhZG9ubHlEaXJlY3RpdmVdLFxufSlcbmV4cG9ydCBjbGFzcyBDbHJSZWFkb25seURpcmVjdGl2ZU1vZHVsZSB7fVxuIl19
@@ -4,4 +4,5 @@
4
4
  * The full license information can be found in LICENSE in the root directory of this project.
5
5
  */
6
6
  export * from './escape.util';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xyLWFkZG9ucy91dGlsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxjQUFjLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTggUG9yc2NoZSBJbmZvcm1hdGlrLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2VzY2FwZS51dGlsJztcbiJdfQ==
7
+ export * from './numeric.format.util';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY2xyLWFkZG9ucy91dGlsL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHVCQUF1QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOCBQb3JzY2hlIEluZm9ybWF0aWsuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBUaGlzIHNvZnR3YXJlIGlzIHJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLlxuICogVGhlIGZ1bGwgbGljZW5zZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gTElDRU5TRSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBwcm9qZWN0LlxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vZXNjYXBlLnV0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9udW1lcmljLmZvcm1hdC51dGlsJztcbiJdfQ==
@@ -0,0 +1,99 @@
1
+ const NEGATIVE = '-';
2
+ const NUMBERS = new Set(['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']);
3
+ export function formatNumber(value, finalFormatting, decimalSeparator, groupingSeparator, decimalPlaces, autofillDecimals) {
4
+ let result = strip(value, finalFormatting, decimalSeparator, groupingSeparator, decimalPlaces);
5
+ /* add grouping separator */
6
+ const decimalIndex = result.indexOf(decimalSeparator);
7
+ const isNegative = result[0] === NEGATIVE;
8
+ let i = decimalIndex > -1 ? decimalIndex : result.length;
9
+ while (i > (isNegative ? 4 : 3)) {
10
+ i -= 3;
11
+ result = result.substring(0, i) + groupingSeparator + result.substring(i, result.length);
12
+ }
13
+ if (finalFormatting) {
14
+ if (decimalPlaces > 0 && !!result) {
15
+ /* autofill decimal places */
16
+ let actualDecimalIndex = result.indexOf(decimalSeparator);
17
+ if (autofillDecimals) {
18
+ if (actualDecimalIndex === -1) {
19
+ actualDecimalIndex = result.length;
20
+ result += decimalSeparator;
21
+ }
22
+ result = addMissingLeadingZero(result, actualDecimalIndex);
23
+ actualDecimalIndex = result.indexOf(decimalSeparator);
24
+ const actualDecimalPlaces = result.length - actualDecimalIndex - 1;
25
+ for (let j = 0; j < decimalPlaces - actualDecimalPlaces; j++) {
26
+ result += '0';
27
+ }
28
+ }
29
+ else {
30
+ result = addMissingLeadingZero(result, actualDecimalIndex);
31
+ }
32
+ }
33
+ }
34
+ return result;
35
+ }
36
+ function addMissingLeadingZero(result, actualDecimalIndex) {
37
+ const isNegative = result[0] === NEGATIVE;
38
+ /* autoadd a zero before decimal separator, when it's missing */
39
+ if (actualDecimalIndex === 0) {
40
+ result = '0' + result;
41
+ }
42
+ /* autoadd a zero before decimal separator, when it's missing, for negative values */
43
+ if (actualDecimalIndex === 1 && isNegative) {
44
+ result = result[0] + '0' + result.substring(1, result.length);
45
+ }
46
+ return result;
47
+ }
48
+ export function strip(value, removeLeadingZeros = false, decimalSeparator, groupingSeparator, decimalPlaces) {
49
+ const allowedKeys = new Set(NUMBERS);
50
+ allowedKeys.add(NEGATIVE);
51
+ allowedKeys.add(decimalSeparator);
52
+ let result = '';
53
+ let indexDecimalSep = -1;
54
+ let j = -1;
55
+ let ignoredChars = 0;
56
+ for (const char of value) {
57
+ j++;
58
+ if (allowedKeys.has(char)) {
59
+ if (char === decimalSeparator) {
60
+ if (decimalPlaces === 0) {
61
+ /* dismiss content after a decimal separator, when no places allowed */
62
+ break;
63
+ }
64
+ else if (indexDecimalSep > -1) {
65
+ /* ignore subsequent decimal separators */
66
+ continue;
67
+ }
68
+ indexDecimalSep = j;
69
+ }
70
+ if (char === '0' && removeLeadingZeros) {
71
+ /* remove leading zero only if it's not the only zero in the 'value' string */
72
+ if ((result.length === 0 && j + 1 !== value.length) || result === NEGATIVE) {
73
+ ignoredChars++;
74
+ continue;
75
+ }
76
+ }
77
+ if (char === NEGATIVE && j > 0) {
78
+ /* dismiss content after a negative sign not on first position */
79
+ break;
80
+ }
81
+ if (indexDecimalSep > -1 && result.length + ignoredChars > indexDecimalSep + decimalPlaces) {
82
+ /* dismiss content after maximum decimal places reached */
83
+ break;
84
+ }
85
+ result += char;
86
+ }
87
+ else if (char === groupingSeparator) {
88
+ if (indexDecimalSep === -1) {
89
+ ignoredChars++;
90
+ }
91
+ }
92
+ else {
93
+ /* dismiss content after a invalid character */
94
+ break;
95
+ }
96
+ }
97
+ return result;
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtZXJpYy5mb3JtYXQudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbHItYWRkb25zL3V0aWwvbnVtZXJpYy5mb3JtYXQudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7QUFDckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRTVFLE1BQU0sVUFBVSxZQUFZLENBQzFCLEtBQWEsRUFDYixlQUF3QixFQUN4QixnQkFBd0IsRUFDeEIsaUJBQXlCLEVBQ3pCLGFBQXFCLEVBQ3JCLGdCQUF5QjtJQUV6QixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUUvRiw0QkFBNEI7SUFDNUIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUM7SUFDMUMsSUFBSSxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDekQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1AsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENB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LCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknXSk7XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXROdW1iZXIoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIGZpbmFsRm9ybWF0dGluZzogYm9vbGVhbixcbiAgZGVjaW1hbFNlcGFyYXRvcjogc3RyaW5nLFxuICBncm91cGluZ1NlcGFyYXRvcjogc3RyaW5nLFxuICBkZWNpbWFsUGxhY2VzOiBudW1iZXIsXG4gIGF1dG9maWxsRGVjaW1hbHM6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGxldCByZXN1bHQgPSBzdHJpcCh2YWx1ZSwgZmluYWxGb3JtYXR0aW5nLCBkZWNpbWFsU2VwYXJhdG9yLCBncm91cGluZ1NlcGFyYXRvciwgZGVjaW1hbFBsYWNlcyk7XG5cbiAgLyogYWRkIGdyb3VwaW5nIHNlcGFyYXRvciAqL1xuICBjb25zdCBkZWNpbWFsSW5kZXggPSByZXN1bHQuaW5kZXhPZihkZWNpbWFsU2VwYXJhdG9yKTtcbiAgY29uc3QgaXNOZWdhdGl2ZSA9IHJlc3VsdFswXSA9PT0gTkVHQVRJVkU7XG4gIGxldCBpID0gZGVjaW1hbEluZGV4ID4gLTEgPyBkZWNpbWFsSW5kZXggOiByZXN1bHQubGVuZ3RoO1xuICB3aGlsZSAoaSA+IChpc05lZ2F0aXZlID8gNCA6IDMpKSB7XG4gICAgaSAtPSAzO1xuICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMCwgaSkgKyBncm91cGluZ1NlcGFyYXRvciArIHJlc3VsdC5zdWJzdHJpbmcoaSwgcmVzdWx0Lmxlbmd0aCk7XG4gIH1cblxuICBpZiAoZmluYWxGb3JtYXR0aW5nKSB7XG4gICAgaWYgKGRlY2ltYWxQbGFjZXMgPiAwICYmICEhcmVzdWx0KSB7XG4gICAgICAvKiBhdXRvZmlsbCBkZWNpbWFsIHBsYWNlcyAqL1xuICAgICAgbGV0IGFjdHVhbERlY2ltYWxJbmRleCA9IHJlc3VsdC5pbmRleE9mKGRlY2ltYWxTZXBhcmF0b3IpO1xuICAgICAgaWYgKGF1dG9maWxsRGVjaW1hbHMpIHtcbiAgICAgICAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICBhY3R1YWxEZWNpbWFsSW5kZXggPSByZXN1bHQubGVuZ3RoO1xuICAgICAgICAgIHJlc3VsdCArPSBkZWNpbWFsU2VwYXJhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0ID0gYWRkTWlzc2luZ0xlYWRpbmdaZXJvKHJlc3VsdCwgYWN0dWFsRGVjaW1hbEluZGV4KTtcbiAgICAgICAgYWN0dWFsRGVjaW1hbEluZGV4ID0gcmVzdWx0LmluZGV4T2YoZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgICAgICAgY29uc3QgYWN0dWFsRGVjaW1hbFBsYWNlcyA9IHJlc3VsdC5sZW5ndGggLSBhY3R1YWxEZWNpbWFsSW5kZXggLSAxO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRlY2ltYWxQbGFjZXMgLSBhY3R1YWxEZWNpbWFsUGxhY2VzOyBqKyspIHtcbiAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBhZGRNaXNzaW5nTGVhZGluZ1plcm8ocmVzdWx0LCBhY3R1YWxEZWNpbWFsSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFkZE1pc3NpbmdMZWFkaW5nWmVybyhyZXN1bHQ6IHN0cmluZywgYWN0dWFsRGVjaW1hbEluZGV4OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBpc05lZ2F0aXZlID0gcmVzdWx0WzBdID09PSBORUdBVElWRTtcbiAgLyogYXV0b2FkZCBhIHplcm8gYmVmb3JlIGRlY2ltYWwgc2VwYXJhdG9yLCB3aGVuIGl0J3MgbWlzc2luZyAqL1xuICBpZiAoYWN0dWFsRGVjaW1hbEluZGV4ID09PSAwKSB7XG4gICAgcmVzdWx0ID0gJzAnICsgcmVzdWx0O1xuICB9XG4gIC8qIGF1dG9hZGQgYSB6ZXJvIGJlZm9yZSBkZWNpbWFsIHNlcGFyYXRvciwgd2hlbiBpdCdzIG1pc3NpbmcsIGZvciBuZWdhdGl2ZSB2YWx1ZXMgKi9cbiAgaWYgKGFjdHVhbERlY2ltYWxJbmRleCA9PT0gMSAmJiBpc05lZ2F0aXZlKSB7XG4gICAgcmVzdWx0ID0gcmVzdWx0WzBdICsgJzAnICsgcmVzdWx0LnN1YnN0cmluZygxLCByZXN1bHQubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaXAoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHJlbW92ZUxlYWRpbmdaZXJvcyA9IGZhbHNlLFxuICBkZWNpbWFsU2VwYXJhdG9yOiBzdHJpbmcsXG4gIGdyb3VwaW5nU2VwYXJhdG9yOiBzdHJpbmcsXG4gIGRlY2ltYWxQbGFjZXM6IG51bWJlclxuKTogc3RyaW5nIHtcbiAgY29uc3QgYWxsb3dlZEtleXMgPSBuZXcgU2V0KE5VTUJFUlMpO1xuICBhbGxvd2VkS2V5cy5hZGQoTkVHQVRJVkUpO1xuICBhbGxvd2VkS2V5cy5hZGQoZGVjaW1hbFNlcGFyYXRvcik7XG5cbiAgbGV0IHJlc3VsdCA9ICcnO1xuICBsZXQgaW5kZXhEZWNpbWFsU2VwID0gLTE7XG4gIGxldCBqID0gLTE7XG4gIGxldCBpZ25vcmVkQ2hhcnMgPSAwO1xuICBmb3IgKGNvbnN0IGNoYXIgb2YgdmFsdWUpIHtcbiAgICBqKys7XG4gICAgaWYgKGFsbG93ZWRLZXlzLmhhcyhjaGFyKSkge1xuICAgICAgaWYgKGNoYXIgPT09IGRlY2ltYWxTZXBhcmF0b3IpIHtcbiAgICAgICAgaWYgKGRlY2ltYWxQbGFjZXMgPT09IDApIHtcbiAgICAgICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgYSBkZWNpbWFsIHNlcGFyYXRvciwgd2hlbiBubyBwbGFjZXMgYWxsb3dlZCAqL1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKGluZGV4RGVjaW1hbFNlcCA+IC0xKSB7XG4gICAgICAgICAgLyogaWdub3JlIHN1YnNlcXVlbnQgZGVjaW1hbCBzZXBhcmF0b3JzICovXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhEZWNpbWFsU2VwID0gajtcbiAgICAgIH1cbiAgICAgIGlmIChjaGFyID09PSAnMCcgJiYgcmVtb3ZlTGVhZGluZ1plcm9zKSB7XG4gICAgICAgIC8qIHJlbW92ZSBsZWFkaW5nIHplcm8gb25seSBpZiBpdCdzIG5vdCB0aGUgb25seSB6ZXJvIGluIHRoZSAndmFsdWUnIHN0cmluZyAqL1xuICAgICAgICBpZiAoKHJlc3VsdC5sZW5ndGggPT09IDAgJiYgaiArIDEgIT09IHZhbHVlLmxlbmd0aCkgfHwgcmVzdWx0ID09PSBORUdBVElWRSkge1xuICAgICAgICAgIGlnbm9yZWRDaGFycysrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2hhciA9PT0gTkVHQVRJVkUgJiYgaiA+IDApIHtcbiAgICAgICAgLyogZGlzbWlzcyBjb250ZW50IGFmdGVyIGEgbmVnYXRpdmUgc2lnbiBub3Qgb24gZmlyc3QgcG9zaXRpb24gKi9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhEZWNpbWFsU2VwID4gLTEgJiYgcmVzdWx0Lmxlbmd0aCArIGlnbm9yZWRDaGFycyA+IGluZGV4RGVjaW1hbFNlcCArIGRlY2ltYWxQbGFjZXMpIHtcbiAgICAgICAgLyogZGlzbWlzcyBjb250ZW50IGFmdGVyIG1heGltdW0gZGVjaW1hbCBwbGFjZXMgcmVhY2hlZCAqL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBjaGFyO1xuICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gZ3JvdXBpbmdTZXBhcmF0b3IpIHtcbiAgICAgIGlmIChpbmRleERlY2ltYWxTZXAgPT09IC0xKSB7XG4gICAgICAgIGlnbm9yZWRDaGFycysrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBkaXNtaXNzIGNvbnRlbnQgYWZ0ZXIgYSBpbnZhbGlkIGNoYXJhY3RlciAqL1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==