ngx-mask 12.0.0 → 13.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.
- package/{esm2015/index.js → esm2020/index.mjs} +0 -0
- package/{esm2015/lib/config.js → esm2020/lib/config.mjs} +0 -0
- package/{esm2015/lib/custom-keyboard-event.js → esm2020/lib/custom-keyboard-event.mjs} +0 -0
- package/esm2020/lib/mask-applier.service.mjs +433 -0
- package/esm2020/lib/mask.directive.mjs +569 -0
- package/esm2020/lib/mask.pipe.mjs +30 -0
- package/esm2020/lib/mask.service.mjs +367 -0
- package/esm2020/lib/ngx-mask.module.mjs +51 -0
- package/{esm2015/ngx-mask.js → esm2020/ngx-mask.mjs} +0 -0
- package/fesm2015/{ngx-mask.js → ngx-mask.mjs} +198 -112
- package/fesm2015/ngx-mask.mjs.map +1 -0
- package/fesm2020/ngx-mask.mjs +1524 -0
- package/fesm2020/ngx-mask.mjs.map +1 -0
- package/lib/mask-applier.service.d.ts +4 -1
- package/lib/mask.directive.d.ts +5 -1
- package/lib/mask.pipe.d.ts +4 -1
- package/lib/mask.service.d.ts +3 -0
- package/lib/ngx-mask.module.d.ts +10 -4
- package/ngx-mask.d.ts +1 -0
- package/package.json +22 -8
- package/bundles/ngx-mask.umd.js +0 -1835
- package/bundles/ngx-mask.umd.js.map +0 -1
- package/esm2015/lib/mask-applier.service.js +0 -430
- package/esm2015/lib/mask.directive.js +0 -517
- package/esm2015/lib/mask.pipe.js +0 -29
- package/esm2015/lib/mask.service.js +0 -359
- package/esm2015/lib/ngx-mask.module.js +0 -46
- package/fesm2015/ngx-mask.js.map +0 -1
- package/ngx-mask.metadata.json +0 -1
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-expressions,no-param-reassign */
|
|
2
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
|
+
import { config } from './config';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export class MaskApplierService {
|
|
6
|
+
constructor(_config) {
|
|
7
|
+
this._config = _config;
|
|
8
|
+
this.maskExpression = '';
|
|
9
|
+
this.actualValue = '';
|
|
10
|
+
this.shownMaskExpression = '';
|
|
11
|
+
this._formatWithSeparators = (str, thousandSeparatorChar, decimalChar, precision) => {
|
|
12
|
+
const x = str.split(decimalChar);
|
|
13
|
+
const decimals = x.length > 1 ? `${decimalChar}${x[1]}` : '';
|
|
14
|
+
let res = x[0];
|
|
15
|
+
const separatorLimit = this.separatorLimit.replace(/\s/g, '');
|
|
16
|
+
if (separatorLimit && +separatorLimit) {
|
|
17
|
+
if (res[0] === '-') {
|
|
18
|
+
res = `-${res.slice(1, res.length).slice(0, separatorLimit.length)}`;
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
res = res.slice(0, separatorLimit.length);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const rgx = /(\d+)(\d{3})/;
|
|
25
|
+
while (thousandSeparatorChar && rgx.test(res)) {
|
|
26
|
+
res = res.replace(rgx, '$1' + thousandSeparatorChar + '$2');
|
|
27
|
+
}
|
|
28
|
+
if (precision === undefined) {
|
|
29
|
+
return res + decimals;
|
|
30
|
+
}
|
|
31
|
+
else if (precision === 0) {
|
|
32
|
+
return res;
|
|
33
|
+
}
|
|
34
|
+
return res + decimals.substr(0, precision + 1);
|
|
35
|
+
};
|
|
36
|
+
this.percentage = (str) => {
|
|
37
|
+
return Number(str) >= 0 && Number(str) <= 100;
|
|
38
|
+
};
|
|
39
|
+
this.getPrecision = (maskExpression) => {
|
|
40
|
+
const x = maskExpression.split('.');
|
|
41
|
+
if (x.length > 1) {
|
|
42
|
+
return Number(x[x.length - 1]);
|
|
43
|
+
}
|
|
44
|
+
return Infinity;
|
|
45
|
+
};
|
|
46
|
+
this.checkAndRemoveSuffix = (inputValue) => {
|
|
47
|
+
for (let i = this.suffix?.length - 1; i >= 0; i--) {
|
|
48
|
+
const substr = this.suffix.substr(i, this.suffix?.length);
|
|
49
|
+
if (inputValue.includes(substr) &&
|
|
50
|
+
(i - 1 < 0 || !inputValue.includes(this.suffix.substr(i - 1, this.suffix?.length)))) {
|
|
51
|
+
return inputValue.replace(substr, '');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return inputValue;
|
|
55
|
+
};
|
|
56
|
+
this.checkInputPrecision = (inputValue, precision, decimalMarker) => {
|
|
57
|
+
if (precision < Infinity) {
|
|
58
|
+
const precisionRegEx = new RegExp(this._charToRegExpExpression(decimalMarker) + `\\d{${precision}}.*$`);
|
|
59
|
+
const precisionMatch = inputValue.match(precisionRegEx);
|
|
60
|
+
if (precisionMatch && precisionMatch[0].length - 1 > precision) {
|
|
61
|
+
const diff = precisionMatch[0].length - 1 - precision;
|
|
62
|
+
inputValue = inputValue.substring(0, inputValue.length - diff);
|
|
63
|
+
}
|
|
64
|
+
if (precision === 0 && inputValue.endsWith(decimalMarker)) {
|
|
65
|
+
inputValue = inputValue.substring(0, inputValue.length - 1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return inputValue;
|
|
69
|
+
};
|
|
70
|
+
this._shift = new Set();
|
|
71
|
+
this.clearIfNotMatch = this._config.clearIfNotMatch;
|
|
72
|
+
this.dropSpecialCharacters = this._config.dropSpecialCharacters;
|
|
73
|
+
this.maskSpecialCharacters = this._config.specialCharacters;
|
|
74
|
+
this.maskAvailablePatterns = this._config.patterns;
|
|
75
|
+
this.prefix = this._config.prefix;
|
|
76
|
+
this.suffix = this._config.suffix;
|
|
77
|
+
this.thousandSeparator = this._config.thousandSeparator;
|
|
78
|
+
this.decimalMarker = this._config.decimalMarker;
|
|
79
|
+
this.hiddenInput = this._config.hiddenInput;
|
|
80
|
+
this.showMaskTyped = this._config.showMaskTyped;
|
|
81
|
+
this.placeHolderCharacter = this._config.placeHolderCharacter;
|
|
82
|
+
this.validation = this._config.validation;
|
|
83
|
+
this.separatorLimit = this._config.separatorLimit;
|
|
84
|
+
this.allowNegativeNumbers = this._config.allowNegativeNumbers;
|
|
85
|
+
this.leadZeroDateTime = this._config.leadZeroDateTime;
|
|
86
|
+
}
|
|
87
|
+
applyMaskWithPattern(inputValue, maskAndPattern) {
|
|
88
|
+
const [mask, customPattern] = maskAndPattern;
|
|
89
|
+
this.customPattern = customPattern;
|
|
90
|
+
return this.applyMask(inputValue, mask);
|
|
91
|
+
}
|
|
92
|
+
applyMask(inputValue, maskExpression, position = 0, justPasted = false, backspaced = false, cb = () => { }) {
|
|
93
|
+
if (!maskExpression || typeof inputValue !== 'string') {
|
|
94
|
+
return '';
|
|
95
|
+
}
|
|
96
|
+
let cursor = 0;
|
|
97
|
+
let result = '';
|
|
98
|
+
let multi = false;
|
|
99
|
+
let backspaceShift = false;
|
|
100
|
+
let shift = 1;
|
|
101
|
+
let stepBack = false;
|
|
102
|
+
if (inputValue.slice(0, this.prefix.length) === this.prefix) {
|
|
103
|
+
inputValue = inputValue.slice(this.prefix.length, inputValue.length);
|
|
104
|
+
}
|
|
105
|
+
if (!!this.suffix && inputValue?.length > 0) {
|
|
106
|
+
inputValue = this.checkAndRemoveSuffix(inputValue);
|
|
107
|
+
}
|
|
108
|
+
const inputArray = inputValue.toString().split('');
|
|
109
|
+
if (maskExpression === 'IP') {
|
|
110
|
+
this.ipError = !!(inputArray.filter((i) => i === '.').length < 3 && inputArray.length < 7);
|
|
111
|
+
maskExpression = '099.099.099.099';
|
|
112
|
+
}
|
|
113
|
+
const arr = [];
|
|
114
|
+
for (let i = 0; i < inputValue.length; i++) {
|
|
115
|
+
if (inputValue[i]?.match('\\d')) {
|
|
116
|
+
arr.push(inputValue[i]);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
if (maskExpression === 'CPF_CNPJ') {
|
|
120
|
+
this.cpfCnpjError = !!(arr.length !== 11 && arr.length !== 14);
|
|
121
|
+
if (arr.length > 11) {
|
|
122
|
+
maskExpression = '00.000.000/0000-00';
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
maskExpression = '000.000.000-00';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (maskExpression.startsWith('percent')) {
|
|
129
|
+
if (inputValue.match('[a-z]|[A-Z]') || inputValue.match(/[-!$%^&*()_+|~=`{}\[\]:";'<>?,\/.]/)) {
|
|
130
|
+
inputValue = this._stripToDecimal(inputValue);
|
|
131
|
+
const precision = this.getPrecision(maskExpression);
|
|
132
|
+
inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);
|
|
133
|
+
}
|
|
134
|
+
if (inputValue.indexOf('.') > 0 && !this.percentage(inputValue.substring(0, inputValue.indexOf('.')))) {
|
|
135
|
+
const base = inputValue.substring(0, inputValue.indexOf('.') - 1);
|
|
136
|
+
inputValue = `${base}${inputValue.substring(inputValue.indexOf('.'), inputValue.length)}`;
|
|
137
|
+
}
|
|
138
|
+
if (this.percentage(inputValue)) {
|
|
139
|
+
result = inputValue;
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
result = inputValue.substring(0, inputValue.length - 1);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else if (maskExpression.startsWith('separator')) {
|
|
146
|
+
if (inputValue.match('[wа-яА-Я]') ||
|
|
147
|
+
inputValue.match('[ЁёА-я]') ||
|
|
148
|
+
inputValue.match('[a-z]|[A-Z]') ||
|
|
149
|
+
inputValue.match(/[-@#!$%\\^&*()_£¬'+|~=`{}\[\]:";<>.?\/]/) ||
|
|
150
|
+
inputValue.match('[^A-Za-z0-9,]')) {
|
|
151
|
+
inputValue = this._stripToDecimal(inputValue);
|
|
152
|
+
}
|
|
153
|
+
inputValue =
|
|
154
|
+
inputValue.length > 1 && inputValue[0] === '0' && inputValue[1] !== this.decimalMarker && !backspaced
|
|
155
|
+
? inputValue.slice(1, inputValue.length)
|
|
156
|
+
: inputValue;
|
|
157
|
+
// TODO: we had different rexexps here for the different cases... but tests dont seam to bother - check this
|
|
158
|
+
// separator: no COMMA, dot-sep: no SPACE, COMMA OK, comma-sep: no SPACE, COMMA OK
|
|
159
|
+
const thousandSeperatorCharEscaped = this._charToRegExpExpression(this.thousandSeparator);
|
|
160
|
+
const decimalMarkerEscaped = this._charToRegExpExpression(this.decimalMarker);
|
|
161
|
+
const invalidChars = '@#!$%^&*()_+|~=`{}\\[\\]:\\s,\\.";<>?\\/'
|
|
162
|
+
.replace(thousandSeperatorCharEscaped, '')
|
|
163
|
+
.replace(decimalMarkerEscaped, '');
|
|
164
|
+
const invalidCharRegexp = new RegExp('[' + invalidChars + ']');
|
|
165
|
+
if (inputValue.match(invalidCharRegexp)) {
|
|
166
|
+
inputValue = inputValue.substring(0, inputValue.length - 1);
|
|
167
|
+
}
|
|
168
|
+
const precision = this.getPrecision(maskExpression);
|
|
169
|
+
inputValue = this.checkInputPrecision(inputValue, precision, this.decimalMarker);
|
|
170
|
+
const strForSep = inputValue.replace(new RegExp(thousandSeperatorCharEscaped, 'g'), '');
|
|
171
|
+
result = this._formatWithSeparators(strForSep, this.thousandSeparator, this.decimalMarker, precision);
|
|
172
|
+
const commaShift = result.indexOf(',') - inputValue.indexOf(',');
|
|
173
|
+
const shiftStep = result.length - inputValue.length;
|
|
174
|
+
if (shiftStep > 0 && result[position] !== ',') {
|
|
175
|
+
backspaceShift = true;
|
|
176
|
+
let _shift = 0;
|
|
177
|
+
do {
|
|
178
|
+
this._shift.add(position + _shift);
|
|
179
|
+
_shift++;
|
|
180
|
+
} while (_shift < shiftStep);
|
|
181
|
+
}
|
|
182
|
+
else if ((commaShift !== 0 && position > 0 && !(result.indexOf(',') >= position && position > 3)) ||
|
|
183
|
+
(!(result.indexOf('.') >= position && position > 3) && shiftStep <= 0)) {
|
|
184
|
+
this._shift.clear();
|
|
185
|
+
backspaceShift = true;
|
|
186
|
+
shift = shiftStep;
|
|
187
|
+
position += shiftStep;
|
|
188
|
+
this._shift.add(position);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
this._shift.clear();
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
for (
|
|
196
|
+
// tslint:disable-next-line
|
|
197
|
+
let i = 0, inputSymbol = inputArray[0]; i < inputArray.length; i++, inputSymbol = inputArray[i]) {
|
|
198
|
+
if (cursor === maskExpression.length) {
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
if (this._checkSymbolMask(inputSymbol, maskExpression[cursor]) && maskExpression[cursor + 1] === '?') {
|
|
202
|
+
result += inputSymbol;
|
|
203
|
+
cursor += 2;
|
|
204
|
+
}
|
|
205
|
+
else if (maskExpression[cursor + 1] === '*' &&
|
|
206
|
+
multi &&
|
|
207
|
+
this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2])) {
|
|
208
|
+
result += inputSymbol;
|
|
209
|
+
cursor += 3;
|
|
210
|
+
multi = false;
|
|
211
|
+
}
|
|
212
|
+
else if (this._checkSymbolMask(inputSymbol, maskExpression[cursor]) && maskExpression[cursor + 1] === '*') {
|
|
213
|
+
result += inputSymbol;
|
|
214
|
+
multi = true;
|
|
215
|
+
}
|
|
216
|
+
else if (maskExpression[cursor + 1] === '?' &&
|
|
217
|
+
this._checkSymbolMask(inputSymbol, maskExpression[cursor + 2])) {
|
|
218
|
+
result += inputSymbol;
|
|
219
|
+
cursor += 3;
|
|
220
|
+
}
|
|
221
|
+
else if (this._checkSymbolMask(inputSymbol, maskExpression[cursor])) {
|
|
222
|
+
if (maskExpression[cursor] === 'H') {
|
|
223
|
+
if (Number(inputSymbol) > 2) {
|
|
224
|
+
cursor += 1;
|
|
225
|
+
this._shiftStep(maskExpression, cursor, inputArray.length);
|
|
226
|
+
i--;
|
|
227
|
+
if (this.leadZeroDateTime) {
|
|
228
|
+
result += '0';
|
|
229
|
+
}
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (maskExpression[cursor] === 'h') {
|
|
234
|
+
if (result === '2' && Number(inputSymbol) > 3) {
|
|
235
|
+
cursor += 1;
|
|
236
|
+
i--;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
if (maskExpression[cursor] === 'm') {
|
|
241
|
+
if (Number(inputSymbol) > 5) {
|
|
242
|
+
cursor += 1;
|
|
243
|
+
this._shiftStep(maskExpression, cursor, inputArray.length);
|
|
244
|
+
i--;
|
|
245
|
+
if (this.leadZeroDateTime) {
|
|
246
|
+
result += '0';
|
|
247
|
+
}
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (maskExpression[cursor] === 's') {
|
|
252
|
+
if (Number(inputSymbol) > 5) {
|
|
253
|
+
cursor += 1;
|
|
254
|
+
this._shiftStep(maskExpression, cursor, inputArray.length);
|
|
255
|
+
i--;
|
|
256
|
+
if (this.leadZeroDateTime) {
|
|
257
|
+
result += '0';
|
|
258
|
+
}
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
const daysCount = 31;
|
|
263
|
+
if (maskExpression[cursor] === 'd') {
|
|
264
|
+
if ((Number(inputSymbol) > 3 && this.leadZeroDateTime) ||
|
|
265
|
+
Number(inputValue.slice(cursor, cursor + 2)) > daysCount ||
|
|
266
|
+
inputValue[cursor + 1] === '/') {
|
|
267
|
+
cursor += 1;
|
|
268
|
+
this._shiftStep(maskExpression, cursor, inputArray.length);
|
|
269
|
+
i--;
|
|
270
|
+
if (this.leadZeroDateTime) {
|
|
271
|
+
result += '0';
|
|
272
|
+
}
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
if (maskExpression[cursor] === 'M') {
|
|
277
|
+
const monthsCount = 12;
|
|
278
|
+
// mask without day
|
|
279
|
+
const withoutDays = cursor === 0 &&
|
|
280
|
+
(Number(inputSymbol) > 2 ||
|
|
281
|
+
Number(inputValue.slice(cursor, cursor + 2)) > monthsCount ||
|
|
282
|
+
inputValue[cursor + 1] === '/');
|
|
283
|
+
// day<10 && month<12 for input
|
|
284
|
+
const day1monthInput = inputValue.slice(cursor - 3, cursor - 1).includes('/') &&
|
|
285
|
+
((inputValue[cursor - 2] === '/' &&
|
|
286
|
+
Number(inputValue.slice(cursor - 1, cursor + 1)) > monthsCount &&
|
|
287
|
+
inputValue[cursor] !== '/') ||
|
|
288
|
+
inputValue[cursor] === '/' ||
|
|
289
|
+
(inputValue[cursor - 3] === '/' &&
|
|
290
|
+
Number(inputValue.slice(cursor - 2, cursor)) > monthsCount &&
|
|
291
|
+
inputValue[cursor - 1] !== '/') ||
|
|
292
|
+
inputValue[cursor - 1] === '/');
|
|
293
|
+
// 10<day<31 && month<12 for input
|
|
294
|
+
const day2monthInput = Number(inputValue.slice(cursor - 3, cursor - 1)) <= daysCount &&
|
|
295
|
+
!inputValue.slice(cursor - 3, cursor - 1).includes('/') &&
|
|
296
|
+
inputValue[cursor - 1] === '/' &&
|
|
297
|
+
(Number(inputValue.slice(cursor, cursor + 2)) > monthsCount || inputValue[cursor + 1] === '/');
|
|
298
|
+
// day<10 && month<12 for paste whole data
|
|
299
|
+
const day1monthPaste = Number(inputValue.slice(cursor - 3, cursor - 1)) > daysCount &&
|
|
300
|
+
!inputValue.slice(cursor - 3, cursor - 1).includes('/') &&
|
|
301
|
+
!inputValue.slice(cursor - 2, cursor).includes('/') &&
|
|
302
|
+
Number(inputValue.slice(cursor - 2, cursor)) > monthsCount;
|
|
303
|
+
// 10<day<31 && month<12 for paste whole data
|
|
304
|
+
const day2monthPaste = Number(inputValue.slice(cursor - 3, cursor - 1)) <= daysCount &&
|
|
305
|
+
!inputValue.slice(cursor - 3, cursor - 1).includes('/') &&
|
|
306
|
+
inputValue[cursor - 1] !== '/' &&
|
|
307
|
+
Number(inputValue.slice(cursor - 1, cursor + 1)) > monthsCount;
|
|
308
|
+
if ((Number(inputSymbol) > 1 && this.leadZeroDateTime) ||
|
|
309
|
+
withoutDays ||
|
|
310
|
+
day1monthInput ||
|
|
311
|
+
day2monthInput ||
|
|
312
|
+
day1monthPaste ||
|
|
313
|
+
day2monthPaste) {
|
|
314
|
+
cursor += 1;
|
|
315
|
+
this._shiftStep(maskExpression, cursor, inputArray.length);
|
|
316
|
+
i--;
|
|
317
|
+
if (this.leadZeroDateTime) {
|
|
318
|
+
result += '0';
|
|
319
|
+
}
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
result += inputSymbol;
|
|
324
|
+
cursor++;
|
|
325
|
+
}
|
|
326
|
+
else if (this.maskSpecialCharacters.indexOf(maskExpression[cursor]) !== -1) {
|
|
327
|
+
result += maskExpression[cursor];
|
|
328
|
+
cursor++;
|
|
329
|
+
this._shiftStep(maskExpression, cursor, inputArray.length);
|
|
330
|
+
i--;
|
|
331
|
+
}
|
|
332
|
+
else if (this.maskSpecialCharacters.indexOf(inputSymbol) > -1 &&
|
|
333
|
+
this.maskAvailablePatterns[maskExpression[cursor]] &&
|
|
334
|
+
this.maskAvailablePatterns[maskExpression[cursor]]?.optional) {
|
|
335
|
+
if (!!inputArray[cursor] &&
|
|
336
|
+
maskExpression !== '099.099.099.099' &&
|
|
337
|
+
maskExpression !== '000.000.000-00' &&
|
|
338
|
+
maskExpression !== '00.000.000/0000-00') {
|
|
339
|
+
result += inputArray[cursor];
|
|
340
|
+
}
|
|
341
|
+
cursor++;
|
|
342
|
+
i--;
|
|
343
|
+
}
|
|
344
|
+
else if (this.maskExpression[cursor + 1] === '*' &&
|
|
345
|
+
this._findSpecialChar(this.maskExpression[cursor + 2]) &&
|
|
346
|
+
this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&
|
|
347
|
+
multi) {
|
|
348
|
+
cursor += 3;
|
|
349
|
+
result += inputSymbol;
|
|
350
|
+
}
|
|
351
|
+
else if (this.maskExpression[cursor + 1] === '?' &&
|
|
352
|
+
this._findSpecialChar(this.maskExpression[cursor + 2]) &&
|
|
353
|
+
this._findSpecialChar(inputSymbol) === this.maskExpression[cursor + 2] &&
|
|
354
|
+
multi) {
|
|
355
|
+
cursor += 3;
|
|
356
|
+
result += inputSymbol;
|
|
357
|
+
}
|
|
358
|
+
else if (this.showMaskTyped &&
|
|
359
|
+
this.maskSpecialCharacters.indexOf(inputSymbol) < 0 &&
|
|
360
|
+
inputSymbol !== this.placeHolderCharacter) {
|
|
361
|
+
stepBack = true;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
if (result.length + 1 === maskExpression.length &&
|
|
366
|
+
this.maskSpecialCharacters.indexOf(maskExpression[maskExpression.length - 1]) !== -1) {
|
|
367
|
+
result += maskExpression[maskExpression.length - 1];
|
|
368
|
+
}
|
|
369
|
+
let newPosition = position + 1;
|
|
370
|
+
while (this._shift.has(newPosition)) {
|
|
371
|
+
shift++;
|
|
372
|
+
newPosition++;
|
|
373
|
+
}
|
|
374
|
+
let actualShift = justPasted ? cursor : this._shift.has(position) ? shift : 0;
|
|
375
|
+
if (stepBack) {
|
|
376
|
+
actualShift--;
|
|
377
|
+
}
|
|
378
|
+
cb(actualShift, backspaceShift);
|
|
379
|
+
if (shift < 0) {
|
|
380
|
+
this._shift.clear();
|
|
381
|
+
}
|
|
382
|
+
let onlySpecial = false;
|
|
383
|
+
if (backspaced) {
|
|
384
|
+
onlySpecial = inputArray.every((char) => this.maskSpecialCharacters.includes(char));
|
|
385
|
+
}
|
|
386
|
+
let res = `${this.prefix}${onlySpecial ? '' : result}${this.suffix}`;
|
|
387
|
+
if (result.length === 0) {
|
|
388
|
+
res = `${this.prefix}${result}`;
|
|
389
|
+
}
|
|
390
|
+
return res;
|
|
391
|
+
}
|
|
392
|
+
_findSpecialChar(inputSymbol) {
|
|
393
|
+
return this.maskSpecialCharacters.find((val) => val === inputSymbol);
|
|
394
|
+
}
|
|
395
|
+
_checkSymbolMask(inputSymbol, maskSymbol) {
|
|
396
|
+
this.maskAvailablePatterns = this.customPattern ? this.customPattern : this.maskAvailablePatterns;
|
|
397
|
+
return (this.maskAvailablePatterns[maskSymbol] &&
|
|
398
|
+
this.maskAvailablePatterns[maskSymbol]?.pattern &&
|
|
399
|
+
this.maskAvailablePatterns[maskSymbol]?.pattern?.test(inputSymbol));
|
|
400
|
+
}
|
|
401
|
+
_stripToDecimal(str) {
|
|
402
|
+
return str
|
|
403
|
+
.split('')
|
|
404
|
+
.filter((i, idx) => {
|
|
405
|
+
return (i.match('^-?\\d') ||
|
|
406
|
+
i.match('\\s') ||
|
|
407
|
+
i === '.' ||
|
|
408
|
+
i === ',' ||
|
|
409
|
+
(i === '-' && idx === 0 && this.allowNegativeNumbers));
|
|
410
|
+
})
|
|
411
|
+
.join('');
|
|
412
|
+
}
|
|
413
|
+
_charToRegExpExpression(char) {
|
|
414
|
+
if (char) {
|
|
415
|
+
const charsToEscape = '[\\^$.|?*+()';
|
|
416
|
+
return char === ' ' ? '\\s' : charsToEscape.indexOf(char) >= 0 ? '\\' + char : char;
|
|
417
|
+
}
|
|
418
|
+
return char;
|
|
419
|
+
}
|
|
420
|
+
_shiftStep(maskExpression, cursor, inputLength) {
|
|
421
|
+
const shiftStep = /[*?]/g.test(maskExpression.slice(0, cursor)) ? inputLength : cursor;
|
|
422
|
+
this._shift.add(shiftStep + this.prefix.length || 0);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
MaskApplierService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MaskApplierService, deps: [{ token: config }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
426
|
+
MaskApplierService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MaskApplierService });
|
|
427
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: MaskApplierService, decorators: [{
|
|
428
|
+
type: Injectable
|
|
429
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
430
|
+
type: Inject,
|
|
431
|
+
args: [config]
|
|
432
|
+
}] }]; } });
|
|
433
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFzay1hcHBsaWVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWFzay1saWIvc3JjL2xpYi9tYXNrLWFwcGxpZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrRUFBK0U7QUFDL0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLE1BQU0sRUFBVyxNQUFNLFVBQVUsQ0FBQzs7QUFHM0MsTUFBTSxPQUFPLGtCQUFrQjtJQStDN0IsWUFBNkMsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQXRDdEQsbUJBQWMsR0FBVyxFQUFFLENBQUM7UUFFNUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFFekIsd0JBQW1CLEdBQVcsRUFBRSxDQUFDO1FBMFpoQywwQkFBcUIsR0FBRyxDQUM5QixHQUFXLEVBQ1gscUJBQTZCLEVBQzdCLFdBQW1CLEVBQ25CLFNBQWlCLEVBQ2pCLEVBQUU7WUFDRixNQUFNLENBQUMsR0FBYSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sUUFBUSxHQUFXLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLElBQUksR0FBRyxHQUFXLENBQUMsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUN4QixNQUFNLGNBQWMsR0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEUsSUFBSSxjQUFjLElBQUksQ0FBQyxjQUFjLEVBQUU7Z0JBQ3JDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtvQkFDbEIsR0FBRyxHQUFH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RSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzs0QkFDdkQsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHOzRCQUM5QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzt3QkFDakcsMENBQTBDO3dCQUMxQyxNQUFNLGNBQWMsR0FDbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTOzRCQUM1RCxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzs0QkFDdkQsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzs0QkFDbkQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQzt3QkFDN0QsNkNBQTZDO3dCQUM3QyxNQUFNLGNBQWMsR0FDbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTOzRCQUM3RCxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQzs0QkFDdkQsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsS0FBSyxHQUFHOzRCQUM5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YWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLWV4cHJlc3Npb25zLG5vLXBhcmFtLXJlYXNzaWduICovXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNvbmZpZywgSUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1hc2tBcHBsaWVyU2VydmljZSB7XG4gIHB1YmxpYyBkcm9wU3BlY2lhbENoYXJhY3RlcnM6IElDb25maWdbJ2Ryb3BTcGVjaWFsQ2hhcmFjdGVycyddO1xuXG4gIHB1YmxpYyBoaWRkZW5JbnB1dDogSUNvbmZpZ1snaGlkZGVuSW5wdXQnXTtcblxuICBwdWJsaWMgc2hvd1RlbXBsYXRlITogSUNvbmZpZ1snc2hvd1RlbXBsYXRlJ107XG5cbiAgcHVibGljIGNsZWFySWZOb3RNYXRjaCE6IElDb25maWdbJ2NsZWFySWZOb3RNYXRjaCddO1xuXG4gIHB1YmxpYyBtYXNrRXhwcmVzc2lvbjogc3RyaW5nID0gJyc7XG5cbiAgcHVibGljIGFjdHVhbFZhbHVlOiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgc2hvd25NYXNrRXhwcmVzc2lvbjogc3RyaW5nID0gJyc7XG5cbiAgcHVibGljIG1hc2tTcGVjaWFsQ2hhcmFjdGVycyE6IElDb25maWdbJ3NwZWNpYWxDaGFyYWN0ZXJzJ107XG5cbiAgcHVibGljIG1hc2tBdmFpbGFibGVQYXR0ZXJucyE6IElDb25maWdbJ3BhdHRlcm5zJ107XG5cbiAgcHVibGljIHByZWZpeCE6IElDb25maWdbJ3ByZWZpeCddO1xuXG4gIHB1YmxpYyBzdWZmaXghOiBJQ29uZmlnWydzdWZmaXgnXTtcblxuICBwdWJsaWMgdGhvdXNhbmRTZXBhcmF0b3IhOiBJQ29uZmlnWyd0aG91c2FuZFNlcGFyYXRvciddO1xuXG4gIHB1YmxpYyBkZWNpbWFsTWFya2VyITogSUNvbmZpZ1snZGVjaW1hbE1hcmtlciddO1xuXG4gIHB1YmxpYyBjdXN0b21QYXR0ZXJuITogSUNvbmZpZ1sncGF0dGVybnMnXTtcblxuICBwdWJsaWMgaXBFcnJvcj86IGJvb2xlYW47XG5cbiAgcHVibGljIGNwZkNucGpFcnJvcj86IGJvb2xlYW47XG5cbiAgcHVibGljIHNob3dNYXNrVHlwZWQhOiBJQ29uZmlnWydzaG93TWFza1R5cGVkJ107XG5cbiAgcHVibGljIHBsYWNlSG9sZGVyQ2hhcmFjdGVyITogSUNvbmZpZ1sncGxhY2VIb2xkZXJDaGFyYWN0ZXInXTtcblxuICBwdWJsaWMgdmFsaWRhdGlvbjogSUNvbmZpZ1sndmFsaWRhdGlvbiddO1xuXG4gIHB1YmxpYyBzZXBhcmF0b3JMaW1pdDogSUNvbmZpZ1snc2VwYXJhdG9yTGltaXQnXTtcblxuICBwdWJsaWMgYWxsb3dOZWdhdGl2ZU51bWJlcnM6IElDb25maWdbJ2FsbG93TmVnYXRpdmVOdW1iZXJzJ107XG5cbiAgcHVibGljIGxlYWRaZXJvRGF0ZVRpbWU6IElDb25maWdbJ2xlYWRaZXJvRGF0ZVRpbWUnXTtcblxuICBwcml2YXRlIF9zaGlmdCE6IFNldDxudW1iZXI+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihASW5qZWN0KGNvbmZpZykgcHJvdGVjdGVkIF9jb25maWc6IElDb25maWcpIHtcbiAgICB0aGlzLl9zaGlmdCA9IG5ldyBTZXQoKTtcbiAgICB0aGlzLmNsZWFySWZOb3RNYXRjaCA9IHRoaXMuX2NvbmZpZy5jbGVhcklmTm90TWF0Y2g7XG4gICAgdGhpcy5kcm9wU3BlY2lhbENoYXJhY3RlcnMgPSB0aGlzLl9jb25maWcuZHJvcFNwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMubWFza1NwZWNpYWxDaGFyYWN0ZXJzID0gdGhpcy5fY29uZmlnLnNwZWNpYWxDaGFyYWN0ZXJzO1xuICAgIHRoaXMubWFza0F2YWlsYWJsZVBhdHRlcm5zID0gdGhpcy5fY29uZmlnLnBhdHRlcm5zO1xuICAgIHRoaXMucHJlZml4ID0gdGhpcy5fY29uZmlnLnByZWZpeDtcbiAgICB0aGlzLnN1ZmZpeCA9IHRoaXMuX2NvbmZpZy5zdWZmaXg7XG4gICAgdGhpcy50aG91c2FuZFNlcGFyYXRvciA9IHRoaXMuX2NvbmZpZy50aG91c2FuZFNlcGFyYXRvcjtcbiAgICB0aGlzLmRlY2ltYWxNYXJrZXIgPSB0aGlzLl9jb25maWcuZGVjaW1hbE1hcmtlcjtcbiAgICB0aGlzLmhpZGRlbklucHV0ID0gdGhpcy5fY29uZmlnLmhpZGRlbklucHV0O1xuICAgIHRoaXMuc2hvd01hc2tUeXBlZCA9IHRoaXMuX2NvbmZpZy5zaG93TWFza1R5cGVkO1xuICAgIHRoaXMucGxhY2VIb2xkZXJDaGFyYWN0ZXIgPSB0aGlzLl9jb25maWcucGxhY2VIb2xkZXJDaGFyYWN0ZXI7XG4gICAgdGhpcy52YWxpZGF0aW9uID0gdGhpcy5fY29uZmlnLnZhbGlkYXRpb247XG4gICAgdGhpcy5zZXBhcmF0b3JMaW1pdCA9IHRoaXMuX2NvbmZpZy5zZXBhcmF0b3JMaW1pdDtcbiAgICB0aGlzLmFsbG93TmVnYXRpdmVOdW1iZXJzID0gdGhpcy5fY29uZmlnLmFsbG93TmVnYXRpdmVOdW1iZXJzO1xuICAgIHRoaXMubGVhZFplcm9EYXRlVGltZSA9IHRoaXMuX2NvbmZpZy5sZWFkWmVyb0RhdGVUaW1lO1xuICB9XG5cbiAgcHVibGljIGFwcGx5TWFza1dpdGhQYXR0ZXJuKGlucHV0VmFsdWU6IHN0cmluZywgbWFza0FuZFBhdHRlcm46IFtzdHJpbmcsIElDb25maWdbJ3BhdHRlcm5zJ11dKTogc3RyaW5nIHtcbiAgICBjb25zdCBbbWFzaywgY3VzdG9tUGF0dGVybl0gPSBtYXNrQW5kUGF0dGVybjtcbiAgICB0aGlzLmN1c3RvbVBhdHRlcm4gPSBjdXN0b21QYXR0ZXJuO1xuICAgIHJldHVybiB0aGlzLmFwcGx5TWFzayhpbnB1dFZhbHVlLCBtYXNrKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseU1hc2soXG4gICAgaW5wdXRWYWx1ZTogc3RyaW5nIHwgb2JqZWN0IHwgYm9vbGVhbiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgbWFza0V4cHJlc3Npb246IHN0cmluZyxcbiAgICBwb3NpdGlvbjogbnVtYmVyID0gMCxcbiAgICBqdXN0UGFzdGVkOiBib29sZWFuID0gZmFsc2UsXG4gICAgYmFja3NwYWNlZDogYm9vbGVhbiA9IGZhbHNlLFxuICAgIGNiOiBGdW5jdGlvbiA9ICgpID0+IHt9XG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCFtYXNrRXhwcmVzc2lvbiB8fCB0eXBlb2YgaW5wdXRWYWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgbGV0IGN1cnNvciA9IDA7XG4gICAgbGV0IHJlc3VsdCA9ICcnO1xuICAgIGxldCBtdWx0aSA9IGZhbHNlO1xuICAgIGxldCBiYWNrc3BhY2VTaGlmdCA9IGZhbHNlO1xuICAgIGxldCBzaGlmdCA9IDE7XG4gICAgbGV0IHN0ZXBCYWNrID0gZmFsc2U7XG4gICAgaWYgKGlucHV0VmFsdWUuc2xpY2UoMCwgdGhpcy5wcmVmaXgubGVuZ3RoKSA9PT0gdGhpcy5wcmVmaXgpIHtcbiAgICAgIGlucHV0VmFsdWUgPSBpbnB1dFZhbHVlLnNsaWNlKHRoaXMucHJlZml4Lmxlbmd0aCwgaW5wdXRWYWx1ZS5sZW5ndGgpO1xuICAgIH1cbiAgICBpZiAoISF0aGlzLnN1ZmZpeCAmJiBpbnB1dFZhbHVlPy5sZW5ndGggPiAwKSB7XG4gICAgICBpbnB1dFZhbHVlID0gdGhpcy5jaGVja0FuZFJlbW92ZVN1ZmZpeChpbnB1dFZhbHVlKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRBcnJheTogc3RyaW5nW10gPSBpbnB1dFZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoJycpO1xuICAgIGlmIChtYXNrRXhwcmVzc2lvbiA9PT0gJ0lQJykge1xuICAgICAgdGhpcy5pcEVycm9yID0gISEoaW5wdXRBcnJheS5maWx0ZXIoKGk6IHN0cmluZykgPT4gaSA9PT0gJy4nKS5sZW5ndGggPCAzICYmIGlucHV0QXJyYXkubGVuZ3RoIDwgNyk7XG4gICAgICBtYXNrRXhwcmVzc2lvbiA9ICcwOTkuMDk5LjA5OS4wOTknO1xuICAgIH1cbiAgICBjb25zdCBhcnI6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5wdXRWYWx1ZVtpXT8ubWF0Y2goJ1xcXFxkJykpIHtcbiAgICAgICAgYXJyLnB1c2goaW5wdXRWYWx1ZVtpXSEpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFza0V4cHJlc3Npb24gPT09ICdDUEZfQ05QSicpIHtcbiAgICAgIHRoaXMuY3BmQ25wakVycm9yID0gISEoYXJyLmxlbmd0aCAhPT0gMTEgJiYgYXJyLmxlbmd0aCAhPT0gMTQpO1xuICAgICAgaWYgKGFyci5sZW5ndGggPiAxMSkge1xuICAgICAgICBtYXNrRXhwcmVzc2lvbiA9ICcwMC4wMDAuMDAwLzAwMDAtMDAnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWFza0V4cHJlc3Npb24gPSAnMDAwLjAwMC4wMDAtMDAnO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWFza0V4cHJlc3Npb24uc3RhcnRzV2l0aCgncGVyY2VudCcpKSB7XG4gICAgICBpZiAoaW5wdXRWYWx1ZS5tYXRjaCgnW2Etel18W0EtWl0nKSB8fCBpbnB1dFZhbHVlLm1hdGNoKC9bLSEkJV4mKigpXyt8fj1ge31cXFtcXF06XCI7Jzw+PyxcXC8uXS8pKSB7XG4gICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9zdHJpcFRvRGVjaW1hbChpbnB1dFZhbHVlKTtcbiAgICAgICAgY29uc3QgcHJlY2lzaW9uOiBudW1iZXIgPSB0aGlzLmdldFByZWNpc2lvbihtYXNrRXhwcmVzc2lvbik7XG4gICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLmNoZWNrSW5wdXRQcmVjaXNpb24oaW5wdXRWYWx1ZSwgcHJlY2lzaW9uLCB0aGlzLmRlY2ltYWxNYXJrZXIpO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0VmFsdWUuaW5kZXhPZignLicpID4gMCAmJiAhdGhpcy5wZXJjZW50YWdlKGlucHV0VmFsdWUuc3Vic3RyaW5nKDAsIGlucHV0VmFsdWUuaW5kZXhPZignLicpKSkpIHtcbiAgICAgICAgY29uc3QgYmFzZTogc3RyaW5nID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5pbmRleE9mKCcuJykgLSAxKTtcbiAgICAgICAgaW5wdXRWYWx1ZSA9IGAke2Jhc2V9JHtpbnB1dFZhbHVlLnN1YnN0cmluZyhpbnB1dFZhbHVlLmluZGV4T2YoJy4nKSwgaW5wdXRWYWx1ZS5sZW5ndGgpfWA7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wZXJjZW50YWdlKGlucHV0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCA9IGlucHV0VmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBpbnB1dFZhbHVlLnN1YnN0cmluZygwLCBpbnB1dFZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAobWFza0V4cHJlc3Npb24uc3RhcnRzV2l0aCgnc2VwYXJhdG9yJykpIHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wdXRWYWx1ZS5tYXRjaCgnW3fQsC3Rj9CQLdCvXScpIHx8XG4gICAgICAgIGlucHV0VmFsdWUubWF0Y2goJ1vQgdGR0JAt0Y9dJykgfHxcbiAgICAgICAgaW5wdXRWYWx1ZS5tYXRjaCgnW2Etel18W0EtWl0nKSB8fFxuICAgICAgICBpbnB1dFZhbHVlLm1hdGNoKC9bLUAjISQlXFxcXF4mKigpX8KjwqwnK3x+PWB7fVxcW1xcXTpcIjs8Pi4/XFwvXS8pIHx8XG4gICAgICAgIGlucHV0VmFsdWUubWF0Y2goJ1teQS1aYS16MC05LF0nKVxuICAgICAgKSB7XG4gICAgICAgIGlucHV0VmFsdWUgPSB0aGlzLl9zdHJpcFRvRGVjaW1hbChpbnB1dFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgaW5wdXRWYWx1ZSA9XG4gICAgICAgIGlucHV0VmFsdWUubGVuZ3RoID4gMSAmJiBpbnB1dFZhbHVlWzBdID09PSAnMCcgJiYgaW5wdXRWYWx1ZVsxXSAhPT0gdGhpcy5kZWNpbWFsTWFya2VyICYmICFiYWNrc3BhY2VkXG4gICAgICAgICAgPyBpbnB1dFZhbHVlLnNsaWNlKDEsIGlucHV0VmFsdWUubGVuZ3RoKVxuICAgICAgICAgIDogaW5wdXRWYWx1ZTtcblxuICAgICAgLy8gVE9ETzogd2UgaGFkIGRpZmZlcmVudCByZXhleHBzIGhlcmUgZm9yIHRoZSBkaWZmZXJlbnQgY2FzZXMuLi4gYnV0IHRlc3RzIGRvbnQgc2VhbSB0byBib3RoZXIgLSBjaGVjayB0aGlzXG4gICAgICAvLyAgc2VwYXJhdG9yOiBubyBDT01NQSwgZG90LXNlcDogbm8gU1BBQ0UsIENPTU1BIE9LLCBjb21tYS1zZXA6IG5vIFNQQUNFLCBDT01NQSBPS1xuXG4gICAgICBjb25zdCB0aG91c2FuZFNlcGVyYXRvckNoYXJFc2NhcGVkOiBzdHJpbmcgPSB0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKHRoaXMudGhvdXNhbmRTZXBhcmF0b3IpO1xuICAgICAgY29uc3QgZGVjaW1hbE1hcmtlckVzY2FwZWQ6IHN0cmluZyA9IHRoaXMuX2NoYXJUb1JlZ0V4cEV4cHJlc3Npb24odGhpcy5kZWNpbWFsTWFya2VyKTtcbiAgICAgIGNvbnN0IGludmFsaWRDaGFyczogc3RyaW5nID0gJ0AjISQlXiYqKClfK3x+PWB7fVxcXFxbXFxcXF06XFxcXHMsXFxcXC5cIjs8Pj9cXFxcLydcbiAgICAgICAgLnJlcGxhY2UodGhvdXNhbmRTZXBlcmF0b3JDaGFyRXNjYXBlZCwgJycpXG4gICAgICAgIC5yZXBsYWNlKGRlY2ltYWxNYXJrZXJFc2NhcGVkLCAnJyk7XG5cbiAgICAgIGNvbnN0IGludmFsaWRDaGFyUmVnZXhwOiBSZWdFeHAgPSBuZXcgUmVnRXhwKCdbJyArIGludmFsaWRDaGFycyArICddJyk7XG5cbiAgICAgIGlmIChpbnB1dFZhbHVlLm1hdGNoKGludmFsaWRDaGFyUmVnZXhwKSkge1xuICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcHJlY2lzaW9uOiBudW1iZXIgPSB0aGlzLmdldFByZWNpc2lvbihtYXNrRXhwcmVzc2lvbik7XG4gICAgICBpbnB1dFZhbHVlID0gdGhpcy5jaGVja0lucHV0UHJlY2lzaW9uKGlucHV0VmFsdWUsIHByZWNpc2lvbiwgdGhpcy5kZWNpbWFsTWFya2VyKTtcbiAgICAgIGNvbnN0IHN0ckZvclNlcDogc3RyaW5nID0gaW5wdXRWYWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAodGhvdXNhbmRTZXBlcmF0b3JDaGFyRXNjYXBlZCwgJ2cnKSwgJycpO1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZm9ybWF0V2l0aFNlcGFyYXRvcnMoc3RyRm9yU2VwLCB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLCB0aGlzLmRlY2ltYWxNYXJrZXIsIHByZWNpc2lvbik7XG5cbiAgICAgIGNvbnN0IGNvbW1hU2hpZnQ6IG51bWJlciA9IHJlc3VsdC5pbmRleE9mKCcsJykgLSBpbnB1dFZhbHVlLmluZGV4T2YoJywnKTtcbiAgICAgIGNvbnN0IHNoaWZ0U3RlcDogbnVtYmVyID0gcmVzdWx0Lmxlbmd0aCAtIGlucHV0VmFsdWUubGVuZ3RoO1xuXG4gICAgICBpZiAoc2hpZnRTdGVwID4gMCAmJiByZXN1bHRbcG9zaXRpb25dICE9PSAnLCcpIHtcbiAgICAgICAgYmFja3NwYWNlU2hpZnQgPSB0cnVlO1xuICAgICAgICBsZXQgX3NoaWZ0ID0gMDtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIHRoaXMuX3NoaWZ0LmFkZChwb3NpdGlvbiArIF9zaGlmdCk7XG4gICAgICAgICAgX3NoaWZ0Kys7XG4gICAgICAgIH0gd2hpbGUgKF9zaGlmdCA8IHNoaWZ0U3RlcCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAoY29tbWFTaGlmdCAhPT0gMCAmJiBwb3NpdGlvbiA+IDAgJiYgIShyZXN1bHQuaW5kZXhPZignLCcpID49IHBvc2l0aW9uICYmIHBvc2l0aW9uID4gMykpIHx8XG4gICAgICAgICghKHJlc3VsdC5pbmRleE9mKCcuJykgPj0gcG9zaXRpb24gJiYgcG9zaXRpb24gPiAzKSAmJiBzaGlmdFN0ZXAgPD0gMClcbiAgICAgICkge1xuICAgICAgICB0aGlzLl9zaGlmdC5jbGVhcigpO1xuICAgICAgICBiYWNrc3BhY2VTaGlmdCA9IHRydWU7XG4gICAgICAgIHNoaWZ0ID0gc2hpZnRTdGVwO1xuICAgICAgICBwb3NpdGlvbiArPSBzaGlmdFN0ZXA7XG4gICAgICAgIHRoaXMuX3NoaWZ0LmFkZChwb3NpdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zaGlmdC5jbGVhcigpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgbGV0IGk6IG51bWJlciA9IDAsIGlucHV0U3ltYm9sOiBzdHJpbmcgPSBpbnB1dEFycmF5WzBdITtcbiAgICAgICAgaSA8IGlucHV0QXJyYXkubGVuZ3RoO1xuICAgICAgICBpKyssIGlucHV0U3ltYm9sID0gaW5wdXRBcnJheVtpXSFcbiAgICAgICkge1xuICAgICAgICBpZiAoY3Vyc29yID09PSBtYXNrRXhwcmVzc2lvbi5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sLCBtYXNrRXhwcmVzc2lvbltjdXJzb3JdISkgJiYgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICc/Jykge1xuICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICBjdXJzb3IgKz0gMjtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBtYXNrRXhwcmVzc2lvbltjdXJzb3IgKyAxXSA9PT0gJyonICYmXG4gICAgICAgICAgbXVsdGkgJiZcbiAgICAgICAgICB0aGlzLl9jaGVja1N5bWJvbE1hc2soaW5wdXRTeW1ib2wsIG1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdISlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICAgIGN1cnNvciArPSAzO1xuICAgICAgICAgIG11bHRpID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sLCBtYXNrRXhwcmVzc2lvbltjdXJzb3JdISkgJiYgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICcqJykge1xuICAgICAgICAgIHJlc3VsdCArPSBpbnB1dFN5bWJvbDtcbiAgICAgICAgICBtdWx0aSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICc/JyAmJlxuICAgICAgICAgIHRoaXMuX2NoZWNrU3ltYm9sTWFzayhpbnB1dFN5bWJvbCwgbWFza0V4cHJlc3Npb25bY3Vyc29yICsgMl0hKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sLCBtYXNrRXhwcmVzc2lvbltjdXJzb3JdISkpIHtcbiAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ0gnKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDIpIHtcbiAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnaCcpIHtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09ICcyJyAmJiBOdW1iZXIoaW5wdXRTeW1ib2wpID4gMykge1xuICAgICAgICAgICAgICBjdXJzb3IgKz0gMTtcbiAgICAgICAgICAgICAgaS0tO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1hc2tFeHByZXNzaW9uW2N1cnNvcl0gPT09ICdtJykge1xuICAgICAgICAgICAgaWYgKE51bWJlcihpbnB1dFN5bWJvbCkgPiA1KSB7XG4gICAgICAgICAgICAgIGN1cnNvciArPSAxO1xuICAgICAgICAgICAgICB0aGlzLl9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb24sIGN1cnNvciwgaW5wdXRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgIGlmICh0aGlzLmxlYWRaZXJvRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobWFza0V4cHJlc3Npb25bY3Vyc29yXSA9PT0gJ3MnKSB7XG4gICAgICAgICAgICBpZiAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDUpIHtcbiAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGRheXNDb3VudCA9IDMxO1xuICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnZCcpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgKE51bWJlcihpbnB1dFN5bWJvbCkgPiAzICYmIHRoaXMubGVhZFplcm9EYXRlVGltZSkgfHxcbiAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yLCBjdXJzb3IgKyAyKSkgPiBkYXlzQ291bnQgfHxcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZVtjdXJzb3IgKyAxXSA9PT0gJy8nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgY3Vyc29yICs9IDE7XG4gICAgICAgICAgICAgIHRoaXMuX3NoaWZ0U3RlcChtYXNrRXhwcmVzc2lvbiwgY3Vyc29yLCBpbnB1dEFycmF5Lmxlbmd0aCk7XG4gICAgICAgICAgICAgIGktLTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZFplcm9EYXRlVGltZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtYXNrRXhwcmVzc2lvbltjdXJzb3JdID09PSAnTScpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vbnRoc0NvdW50ID0gMTI7XG4gICAgICAgICAgICAvLyBtYXNrIHdpdGhvdXQgZGF5XG4gICAgICAgICAgICBjb25zdCB3aXRob3V0RGF5czogYm9vbGVhbiA9XG4gICAgICAgICAgICAgIGN1cnNvciA9PT0gMCAmJlxuICAgICAgICAgICAgICAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDIgfHxcbiAgICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IsIGN1cnNvciArIDIpKSA+IG1vbnRoc0NvdW50IHx8XG4gICAgICAgICAgICAgICAgaW5wdXRWYWx1ZVtjdXJzb3IgKyAxXSA9PT0gJy8nKTtcbiAgICAgICAgICAgIC8vIGRheTwxMCAmJiBtb250aDwxMiBmb3IgaW5wdXRcbiAgICAgICAgICAgIGNvbnN0IGRheTFtb250aElucHV0OiBib29sZWFuID1cbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgLSAzLCBjdXJzb3IgLSAxKS5pbmNsdWRlcygnLycpICYmXG4gICAgICAgICAgICAgICgoaW5wdXRWYWx1ZVtjdXJzb3IgLSAyXSA9PT0gJy8nICYmXG4gICAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yIC0gMSwgY3Vyc29yICsgMSkpID4gbW9udGhzQ291bnQgJiZcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlW2N1cnNvcl0gIT09ICcvJykgfHxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlW2N1cnNvcl0gPT09ICcvJyB8fFxuICAgICAgICAgICAgICAgIChpbnB1dFZhbHVlW2N1cnNvciAtIDNdID09PSAnLycgJiZcbiAgICAgICAgICAgICAgICAgIE51bWJlcihpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciAtIDIsIGN1cnNvcikpID4gbW9udGhzQ291bnQgJiZcbiAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWVbY3Vyc29yIC0gMV0gIT09ICcvJykgfHxcbiAgICAgICAgICAgICAgICBpbnB1dFZhbHVlW2N1cnNvciAtIDFdID09PSAnLycpO1xuICAgICAgICAgICAgLy8gMTA8ZGF5PDMxICYmIG1vbnRoPDEyIGZvciBpbnB1dFxuICAgICAgICAgICAgY29uc3QgZGF5Mm1vbnRoSW5wdXQ6IGJvb2xlYW4gPVxuICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgLSAzLCBjdXJzb3IgLSAxKSkgPD0gZGF5c0NvdW50ICYmXG4gICAgICAgICAgICAgICFpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciAtIDMsIGN1cnNvciAtIDEpLmluY2x1ZGVzKCcvJykgJiZcbiAgICAgICAgICAgICAgaW5wdXRWYWx1ZVtjdXJzb3IgLSAxXSA9PT0gJy8nICYmXG4gICAgICAgICAgICAgIChOdW1iZXIoaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IsIGN1cnNvciArIDIpKSA+IG1vbnRoc0NvdW50IHx8IGlucHV0VmFsdWVbY3Vyc29yICsgMV0gPT09ICcvJyk7XG4gICAgICAgICAgICAvLyBkYXk8MTAgJiYgbW9udGg8MTIgZm9yIHBhc3RlIHdob2xlIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IGRheTFtb250aFBhc3RlOiBib29sZWFuID1cbiAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yIC0gMywgY3Vyc29yIC0gMSkpID4gZGF5c0NvdW50ICYmXG4gICAgICAgICAgICAgICFpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciAtIDMsIGN1cnNvciAtIDEpLmluY2x1ZGVzKCcvJykgJiZcbiAgICAgICAgICAgICAgIWlucHV0VmFsdWUuc2xpY2UoY3Vyc29yIC0gMiwgY3Vyc29yKS5pbmNsdWRlcygnLycpICYmXG4gICAgICAgICAgICAgIE51bWJlcihpbnB1dFZhbHVlLnNsaWNlKGN1cnNvciAtIDIsIGN1cnNvcikpID4gbW9udGhzQ291bnQ7XG4gICAgICAgICAgICAvLyAxMDxkYXk8MzEgJiYgbW9udGg8MTIgZm9yIHBhc3RlIHdob2xlIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IGRheTJtb250aFBhc3RlOiBib29sZWFuID1cbiAgICAgICAgICAgICAgTnVtYmVyKGlucHV0VmFsdWUuc2xpY2UoY3Vyc29yIC0gMywgY3Vyc29yIC0gMSkpIDw9IGRheXNDb3VudCAmJlxuICAgICAgICAgICAgICAhaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgLSAzLCBjdXJzb3IgLSAxKS5pbmNsdWRlcygnLycpICYmXG4gICAgICAgICAgICAgIGlucHV0VmFsdWVbY3Vyc29yIC0gMV0gIT09ICcvJyAmJlxuICAgICAgICAgICAgICBOdW1iZXIoaW5wdXRWYWx1ZS5zbGljZShjdXJzb3IgLSAxLCBjdXJzb3IgKyAxKSkgPiBtb250aHNDb3VudDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAoTnVtYmVyKGlucHV0U3ltYm9sKSA+IDEgJiYgdGhpcy5sZWFkWmVyb0RhdGVUaW1lKSB8fFxuICAgICAgICAgICAgICB3aXRob3V0RGF5cyB8fFxuICAgICAgICAgICAgICBkYXkxbW9udGhJbnB1dCB8fFxuICAgICAgICAgICAgICBkYXkybW9udGhJbnB1dCB8fFxuICAgICAgICAgICAgICBkYXkxbW9udGhQYXN0ZSB8fFxuICAgICAgICAgICAgICBkYXkybW9udGhQYXN0ZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGN1cnNvciArPSAxO1xuICAgICAgICAgICAgICB0aGlzLl9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb24sIGN1cnNvciwgaW5wdXRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgICAgICBpLS07XG4gICAgICAgICAgICAgIGlmICh0aGlzLmxlYWRaZXJvRGF0ZVRpbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJzAnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgKz0gaW5wdXRTeW1ib2w7XG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5tYXNrU3BlY2lhbENoYXJhY3RlcnMuaW5kZXhPZihtYXNrRXhwcmVzc2lvbltjdXJzb3JdISkgIT09IC0xKSB7XG4gICAgICAgICAgcmVzdWx0ICs9IG1hc2tFeHByZXNzaW9uW2N1cnNvcl07XG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgdGhpcy5fc2hpZnRTdGVwKG1hc2tFeHByZXNzaW9uLCBjdXJzb3IsIGlucHV0QXJyYXkubGVuZ3RoKTtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgdGhpcy5tYXNrU3BlY2lhbENoYXJhY3RlcnMuaW5kZXhPZihpbnB1dFN5bWJvbCkgPiAtMSAmJlxuICAgICAgICAgIHRoaXMubWFza0F2YWlsYWJsZVBhdHRlcm5zW21hc2tFeHByZXNzaW9uW2N1cnNvcl0hXSAmJlxuICAgICAgICAgIHRoaXMubWFza0F2YWlsYWJsZVBhdHRlcm5zW21hc2tFeHByZXNzaW9uW2N1cnNvcl0hXT8ub3B0aW9uYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgISFpbnB1dEFycmF5W2N1cnNvcl0gJiZcbiAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uICE9PSAnMDk5LjA5OS4wOTkuMDk5JyAmJlxuICAgICAgICAgICAgbWFza0V4cHJlc3Npb24gIT09ICcwMDAuMDAwLjAwMC0wMCcgJiZcbiAgICAgICAgICAgIG1hc2tFeHByZXNzaW9uICE9PSAnMDAuMDAwLjAwMC8wMDAwLTAwJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGlucHV0QXJyYXlbY3Vyc29yXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3Vyc29yKys7XG4gICAgICAgICAgaS0tO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICcqJyAmJlxuICAgICAgICAgIHRoaXMuX2ZpbmRTcGVjaWFsQ2hhcih0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdISkgJiZcbiAgICAgICAgICB0aGlzLl9maW5kU3BlY2lhbENoYXIoaW5wdXRTeW1ib2wpID09PSB0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdICYmXG4gICAgICAgICAgbXVsdGlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMubWFza0V4cHJlc3Npb25bY3Vyc29yICsgMV0gPT09ICc/JyAmJlxuICAgICAgICAgIHRoaXMuX2ZpbmRTcGVjaWFsQ2hhcih0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdISkgJiZcbiAgICAgICAgICB0aGlzLl9maW5kU3BlY2lhbENoYXIoaW5wdXRTeW1ib2wpID09PSB0aGlzLm1hc2tFeHByZXNzaW9uW2N1cnNvciArIDJdICYmXG4gICAgICAgICAgbXVsdGlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3Vyc29yICs9IDM7XG4gICAgICAgICAgcmVzdWx0ICs9IGlucHV0U3ltYm9sO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRoaXMuc2hvd01hc2tUeXBlZCAmJlxuICAgICAgICAgIHRoaXMubWFza1NwZWNpYWxDaGFyYWN0ZXJzLmluZGV4T2YoaW5wdXRTeW1ib2wpIDwgMCAmJlxuICAgICAgICAgIGlucHV0U3ltYm9sICE9PSB0aGlzLnBsYWNlSG9sZGVyQ2hhcmFjdGVyXG4gICAgICAgICkge1xuICAgICAgICAgIHN0ZXBCYWNrID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoXG4gICAgICByZXN1bHQubGVuZ3RoICsgMSA9PT0gbWFza0V4cHJlc3Npb24ubGVuZ3RoICYmXG4gICAgICB0aGlzLm1hc2tTcGVjaWFsQ2hhcmFjdGVycy5pbmRleE9mKG1hc2tFeHByZXNzaW9uW21hc2tFeHByZXNzaW9uLmxlbmd0aCAtIDFdISkgIT09IC0xXG4gICAgKSB7XG4gICAgICByZXN1bHQgKz0gbWFza0V4cHJlc3Npb25bbWFza0V4cHJlc3Npb24ubGVuZ3RoIC0gMV07XG4gICAgfVxuXG4gICAgbGV0IG5ld1Bvc2l0aW9uOiBudW1iZXIgPSBwb3NpdGlvbiArIDE7XG5cbiAgICB3aGlsZSAodGhpcy5fc2hpZnQuaGFzKG5ld1Bvc2l0aW9uKSkge1xuICAgICAgc2hpZnQrKztcbiAgICAgIG5ld1Bvc2l0aW9uKys7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbFNoaWZ0OiBudW1iZXIgPSBqdXN0UGFzdGVkID8gY3Vyc29yIDogdGhpcy5fc2hpZnQuaGFzKHBvc2l0aW9uKSA/IHNoaWZ0IDogMDtcbiAgICBpZiAoc3RlcEJhY2spIHtcbiAgICAgIGFjdHVhbFNoaWZ0LS07XG4gICAgfVxuXG4gICAgY2IoYWN0dWFsU2hpZnQsIGJhY2tzcGFjZVNoaWZ0KTtcbiAgICBpZiAoc2hpZnQgPCAwKSB7XG4gICAgICB0aGlzLl9zaGlmdC5jbGVhcigpO1xuICAgIH1cbiAgICBsZXQgb25seVNwZWNpYWwgPSBmYWxzZTtcbiAgICBpZiAoYmFja3NwYWNlZCkge1xuICAgICAgb25seVNwZWNpYWwgPSBpbnB1dEFycmF5LmV2ZXJ5KChjaGFyKSA9PiB0aGlzLm1hc2tTcGVjaWFsQ2hhcmFjdGVycy5pbmNsdWRlcyhjaGFyKSk7XG4gICAgfVxuICAgIGxldCByZXMgPSBgJHt0aGlzLnByZWZpeH0ke29ubHlTcGVjaWFsID8gJycgOiByZXN1bHR9JHt0aGlzLnN1ZmZpeH1gO1xuICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXMgPSBgJHt0aGlzLnByZWZpeH0ke3Jlc3VsdH1gO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgcHVibGljIF9maW5kU3BlY2lhbENoYXIoaW5wdXRTeW1ib2w6IHN0cmluZyk6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMubWFza1NwZWNpYWxDaGFyYWN0ZXJzLmZpbmQoKHZhbDogc3RyaW5nKSA9PiB2YWwgPT09IGlucHV0U3ltYm9sKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBfY2hlY2tTeW1ib2xNYXNrKGlucHV0U3ltYm9sOiBzdHJpbmcsIG1hc2tTeW1ib2w6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMubWFza0F2YWlsYWJsZVBhdHRlcm5zID0gdGhpcy5jdXN0b21QYXR0ZXJuID8gdGhpcy5jdXN0b21QYXR0ZXJuIDogdGhpcy5tYXNrQXZhaWxhYmxlUGF0dGVybnM7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMubWFza0F2YWlsYWJsZVBhdHRlcm5zW21hc2tTeW1ib2xdISAmJlxuICAgICAgdGhpcy5tYXNrQXZhaWxhYmxlUGF0dGVybnNbbWFza1N5bWJvbF0/LnBhdHRlcm4hICYmXG4gICAgICB0aGlzLm1hc2tBdmFpbGFibGVQYXR0ZXJuc1ttYXNrU3ltYm9sXT8ucGF0dGVybj8udGVzdChpbnB1dFN5bWJvbCkhXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Zvcm1hdFdpdGhTZXBhcmF0b3JzID0gKFxuICAgIHN0cjogc3RyaW5nLFxuICAgIHRob3VzYW5kU2VwYXJhdG9yQ2hhcjogc3RyaW5nLFxuICAgIGRlY2ltYWxDaGFyOiBzdHJpbmcsXG4gICAgcHJlY2lzaW9uOiBudW1iZXJcbiAgKSA9PiB7XG4gICAgY29uc3QgeDogc3RyaW5nW10gPSBzdHIuc3BsaXQoZGVjaW1hbENoYXIpO1xuICAgIGNvbnN0IGRlY2ltYWxzOiBzdHJpbmcgPSB4Lmxlbmd0aCA+IDEgPyBgJHtkZWNpbWFsQ2hhcn0ke3hbMV19YCA6ICcnO1xuICAgIGxldCByZXM6IHN0cmluZyA9IHhbMF0hO1xuICAgIGNvbnN0IHNlcGFyYXRvckxpbWl0OiBzdHJpbmcgPSB0aGlzLnNlcGFyYXRvckxpbWl0LnJlcGxhY2UoL1xccy9nLCAnJyk7XG4gICAgaWYgKHNlcGFyYXRvckxpbWl0ICYmICtzZXBhcmF0b3JMaW1pdCkge1xuICAgICAgaWYgKHJlc1swXSA9PT0gJy0nKSB7XG4gICAgICAgIHJlcyA9IGAtJHtyZXMuc2xpY2UoMSwgcmVzLmxlbmd0aCkuc2xpY2UoMCwgc2VwYXJhdG9yTGltaXQubGVuZ3RoKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIHNlcGFyYXRvckxpbWl0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJneDogUmVnRXhwID0gLyhcXGQrKShcXGR7M30pLztcblxuICAgIHdoaWxlICh0aG91c2FuZFNlcGFyYXRvckNoYXIgJiYgcmd4LnRlc3QocmVzKSkge1xuICAgICAgcmVzID0gcmVzLnJlcGxhY2Uocmd4LCAnJDEnICsgdGhvdXNhbmRTZXBhcmF0b3JDaGFyICsgJyQyJyk7XG4gICAgfVxuXG4gICAgaWYgKHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gcmVzICsgZGVjaW1hbHM7XG4gICAgfSBlbHNlIGlmIChwcmVjaXNpb24gPT09IDApIHtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuICAgIHJldHVybiByZXMgKyBkZWNpbWFscy5zdWJzdHIoMCwgcHJlY2lzaW9uICsgMSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBwZXJjZW50YWdlID0gKHN0cjogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIE51bWJlcihzdHIpID49IDAgJiYgTnVtYmVyKHN0cikgPD0gMTAwO1xuICB9O1xuXG4gIHByaXZhdGUgZ2V0UHJlY2lzaW9uID0gKG1hc2tFeHByZXNzaW9uOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHg6IHN0cmluZ1tdID0gbWFza0V4cHJlc3Npb24uc3BsaXQoJy4nKTtcbiAgICBpZiAoeC5sZW5ndGggPiAxKSB7XG4gICAgICByZXR1cm4gTnVtYmVyKHhbeC5sZW5ndGggLSAxXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEluZmluaXR5O1xuICB9O1xuXG4gIHByaXZhdGUgY2hlY2tBbmRSZW1vdmVTdWZmaXggPSAoaW5wdXRWYWx1ZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5zdWZmaXg/Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBzdWJzdHIgPSB0aGlzLnN1ZmZpeC5zdWJzdHIoaSwgdGhpcy5zdWZmaXg/Lmxlbmd0aCk7XG4gICAgICBpZiAoXG4gICAgICAgIGlucHV0VmFsdWUuaW5jbHVkZXMoc3Vic3RyKSAmJlxuICAgICAgICAoaSAtIDEgPCAwIHx8ICFpbnB1dFZhbHVlLmluY2x1ZGVzKHRoaXMuc3VmZml4LnN1YnN0cihpIC0gMSwgdGhpcy5zdWZmaXg/Lmxlbmd0aCkpKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBpbnB1dFZhbHVlLnJlcGxhY2Uoc3Vic3RyLCAnJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBpbnB1dFZhbHVlO1xuICB9O1xuXG4gIHByaXZhdGUgY2hlY2tJbnB1dFByZWNpc2lvbiA9IChcbiAgICBpbnB1dFZhbHVlOiBzdHJpbmcsXG4gICAgcHJlY2lzaW9uOiBudW1iZXIsXG4gICAgZGVjaW1hbE1hcmtlcjogSUNvbmZpZ1snZGVjaW1hbE1hcmtlciddXG4gICk6IHN0cmluZyA9PiB7XG4gICAgaWYgKHByZWNpc2lvbiA8IEluZmluaXR5KSB7XG4gICAgICBjb25zdCBwcmVjaXNpb25SZWdFeDogUmVnRXhwID0gbmV3IFJlZ0V4cCh0aGlzLl9jaGFyVG9SZWdFeHBFeHByZXNzaW9uKGRlY2ltYWxNYXJrZXIpICsgYFxcXFxkeyR7cHJlY2lzaW9ufX0uKiRgKTtcblxuICAgICAgY29uc3QgcHJlY2lzaW9uTWF0Y2g6IFJlZ0V4cE1hdGNoQXJyYXkgfCBudWxsID0gaW5wdXRWYWx1ZS5tYXRjaChwcmVjaXNpb25SZWdFeCk7XG4gICAgICBpZiAocHJlY2lzaW9uTWF0Y2ggJiYgcHJlY2lzaW9uTWF0Y2hbMF0hLmxlbmd0aCAtIDEgPiBwcmVjaXNpb24pIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IHByZWNpc2lvbk1hdGNoWzBdIS5sZW5ndGggLSAxIC0gcHJlY2lzaW9uO1xuICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSBkaWZmKTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmVjaXNpb24gPT09IDAgJiYgaW5wdXRWYWx1ZS5lbmRzV2l0aChkZWNpbWFsTWFya2VyKSkge1xuICAgICAgICBpbnB1dFZhbHVlID0gaW5wdXRWYWx1ZS5zdWJzdHJpbmcoMCwgaW5wdXRWYWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGlucHV0VmFsdWU7XG4gIH07XG5cbiAgcHJpdmF0ZSBfc3RyaXBUb0RlY2ltYWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBzdHJcbiAgICAgIC5zcGxpdCgnJylcbiAgICAgIC5maWx0ZXIoKGk6IHN0cmluZywgaWR4OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpLm1hdGNoKCdeLT9cXFxcZCcpIHx8XG4gICAgICAgICAgaS5tYXRjaCgnXFxcXHMnKSB8fFxuICAgICAgICAgIGkgPT09ICcuJyB8fFxuICAgICAgICAgIGkgPT09ICcsJyB8fFxuICAgICAgICAgIChpID09PSAnLScgJiYgaWR4ID09PSAwICYmIHRoaXMuYWxsb3dOZWdhdGl2ZU51bWJlcnMpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2hhclRvUmVnRXhwRXhwcmVzc2lvbihjaGFyOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjaGFyKSB7XG4gICAgICBjb25zdCBjaGFyc1RvRXNjYXBlID0gJ1tcXFxcXiQufD8qKygpJztcbiAgICAgIHJldHVybiBjaGFyID09PSAnICcgPyAnXFxcXHMnIDogY2hhcnNUb0VzY2FwZS5pbmRleE9mKGNoYXIpID49IDAgPyAnXFxcXCcgKyBjaGFyIDogY2hhcjtcbiAgICB9XG4gICAgcmV0dXJuIGNoYXI7XG4gIH1cblxuICBwcml2YXRlIF9zaGlmdFN0ZXAobWFza0V4cHJlc3Npb246IHN0cmluZywgY3Vyc29yOiBudW1iZXIsIGlucHV0TGVuZ3RoOiBudW1iZXIpIHtcbiAgICBjb25zdCBzaGlmdFN0ZXA6IG51bWJlciA9IC9bKj9dL2cudGVzdChtYXNrRXhwcmVzc2lvbi5zbGljZSgwLCBjdXJzb3IpKSA/IGlucHV0TGVuZ3RoIDogY3Vyc29yO1xuICAgIHRoaXMuX3NoaWZ0LmFkZChzaGlmdFN0ZXAgKyB0aGlzLnByZWZpeC5sZW5ndGggfHwgMCk7XG4gIH1cbn1cbiJdfQ==
|