@senior-agronegocio/angular-components 0.0.70-origination → 0.0.71-origination

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.
@@ -1,3 +1,4 @@
1
+ import { __assign, __values } from "tslib";
1
2
  import { DateComparisonType } from '../enums/date-comparison-type.enum';
2
3
  import { AGRO_REGEX } from '../common/agro-regex.constant';
3
4
  import { NumberComparisonType } from '../enums/number-comparison-type.enum';
@@ -185,13 +186,14 @@ var AgroFormValidator = /** @class */ (function () {
185
186
  AgroFormValidator.checkValueBetween = function (minorFormControl, targetFormControl, majorFormControl) {
186
187
  var checkValue = function (control) {
187
188
  var _a, _b;
188
- var _c, _d, _e, _f;
189
+ var _c, _d, _e;
189
190
  var formGroup = control;
190
191
  var valueA = (_c = formGroup.get(minorFormControl)) === null || _c === void 0 ? void 0 : _c.value;
191
192
  var valueB = (_d = formGroup.get(targetFormControl)) === null || _d === void 0 ? void 0 : _d.value;
192
193
  var valueC = (_e = formGroup.get(majorFormControl)) === null || _e === void 0 ? void 0 : _e.value;
193
194
  var methodName = 'checkValueBetween';
194
- if (valueA && valueB && valueC) {
195
+ var areNumbers = [valueA, valueB, valueC].every(function (v) { return v !== null && v !== undefined; });
196
+ if (areNumbers) {
195
197
  if (valueB < valueA || valueB > valueC) {
196
198
  var targetControl = formGroup.get(targetFormControl);
197
199
  if (targetControl) {
@@ -199,10 +201,12 @@ var AgroFormValidator = /** @class */ (function () {
199
201
  }
200
202
  return _b = {}, _b[methodName] = true, _b;
201
203
  }
202
- else if ((_f = formGroup.get(targetFormControl)) === null || _f === void 0 ? void 0 : _f.hasError(methodName)) {
204
+ else {
203
205
  var targetControl = formGroup.get(targetFormControl);
204
- if (targetControl) {
205
- targetControl.setErrors(null);
206
+ if (targetControl === null || targetControl === void 0 ? void 0 : targetControl.hasError(methodName)) {
207
+ var errors = __assign({}, targetControl.errors);
208
+ delete errors[methodName];
209
+ targetControl.setErrors(Object.keys(errors).length ? errors : null);
206
210
  }
207
211
  }
208
212
  }
@@ -233,7 +237,103 @@ var AgroFormValidator = /** @class */ (function () {
233
237
  };
234
238
  return objectProperty;
235
239
  };
240
+ /**
241
+ * Valida se o campo é um CPF (Cadastro de Pessoa Física) válido.
242
+ */
243
+ AgroFormValidator.CPFValidator = function () {
244
+ var cpfVal = function (control) {
245
+ var cpf = (control.value || '').replace(/[^\d]/g, '');
246
+ if (!cpf) {
247
+ return null; // Não valida campo vazio, use Validators.required junto se quiser obrigatoriedade
248
+ }
249
+ if (cpf.length !== 11) {
250
+ return { cpfValidator: true };
251
+ }
252
+ // Verifica se todos os dígitos são iguais (ex.: 11111111111)
253
+ if (/^(\d)\1{10}$/.test(cpf)) {
254
+ return { cpfValidator: true };
255
+ }
256
+ // Validação dos dígitos verificadores
257
+ var calcCheckDigit = function (cpfSlice, factor) {
258
+ var e_1, _a;
259
+ var total = 0;
260
+ try {
261
+ for (var cpfSlice_1 = __values(cpfSlice), cpfSlice_1_1 = cpfSlice_1.next(); !cpfSlice_1_1.done; cpfSlice_1_1 = cpfSlice_1.next()) {
262
+ var digit = cpfSlice_1_1.value;
263
+ total += parseInt(digit, 10) * factor--;
264
+ }
265
+ }
266
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
267
+ finally {
268
+ try {
269
+ if (cpfSlice_1_1 && !cpfSlice_1_1.done && (_a = cpfSlice_1.return)) _a.call(cpfSlice_1);
270
+ }
271
+ finally { if (e_1) throw e_1.error; }
272
+ }
273
+ var remainder = total % 11;
274
+ return remainder < 2 ? 0 : 11 - remainder;
275
+ };
276
+ var digit1 = calcCheckDigit(cpf.substring(0, 9), 10);
277
+ var digit2 = calcCheckDigit(cpf.substring(0, 9) + digit1, 11);
278
+ var isValid = digit1 === parseInt(cpf.charAt(9), 10) &&
279
+ digit2 === parseInt(cpf.charAt(10), 10);
280
+ return isValid ? null : { cpfValidator: true };
281
+ };
282
+ return cpfVal;
283
+ };
284
+ /**
285
+ * Validator de CNPJ (Cadastro Nacional da Pessoa Jurídica).
286
+ * @returns
287
+ */
288
+ AgroFormValidator.prototype.CNPJValidator = function () {
289
+ return function (control) {
290
+ var _a;
291
+ var value = (_a = control.value) === null || _a === void 0 ? void 0 : _a.replace(/\D/g, '');
292
+ if (!value || value.length !== 14) {
293
+ return { cnpjValidator: true };
294
+ }
295
+ // Verifica CNPJs com todos os dígitos iguais (inválidos)
296
+ if (/^(\d)\1{13}$/.test(value)) {
297
+ return { cnpjValidator: true };
298
+ }
299
+ var validateCheckDigit = function (cnpj, length) {
300
+ var weights = length === 12
301
+ ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
302
+ : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
303
+ var sum = cnpj
304
+ .slice(0, length)
305
+ .split('')
306
+ .reduce(function (acc, digit, index) {
307
+ return acc + parseInt(digit, 10) * weights[index];
308
+ }, 0);
309
+ var remainder = sum % 11;
310
+ return remainder < 2 ? 0 : 11 - remainder;
311
+ };
312
+ var firstCheckDigit = validateCheckDigit(value, 12);
313
+ var secondCheckDigit = validateCheckDigit(value, 13);
314
+ if (firstCheckDigit !== parseInt(value.charAt(12), 10) ||
315
+ secondCheckDigit !== parseInt(value.charAt(13), 10)) {
316
+ return { cnpjValidator: true };
317
+ }
318
+ return null; // válido
319
+ };
320
+ };
321
+ /**
322
+ * Valida se a placa do veículo é válida.
323
+ * @returns
324
+ */
325
+ AgroFormValidator.prototype.licensePlateValidator = function () {
326
+ return function (control) {
327
+ var value = (control.value || '').toUpperCase().trim().replace(/-/g, '');
328
+ if (!value) {
329
+ return null; // Campo vazio não é responsabilidade desse validador
330
+ }
331
+ var isValid = AGRO_REGEX.isMercosulLicensePlate.test(value) ||
332
+ AGRO_REGEX.isOldLicensePlate.test(value);
333
+ return isValid ? null : { licensePlateInvalid: true };
334
+ };
335
+ };
236
336
  return AgroFormValidator;
237
337
  }());
238
338
  export { AgroFormValidator };
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdyby1mb3JtLXZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3ItYWdyb25lZ29jaW8vYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiZm9ybS12YWxpZGF0b3IvYWdyby1mb3JtLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRWhFO0lBQUE7SUF1T0EsQ0FBQztJQXJPRzs7Ozs7Ozs7O09BU0c7SUFDVyxnQ0FBYyxHQUE1QixVQUE2QixPQUF3QjtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDMUQsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUM7U0FDbkM7UUFDRCxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFHRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDVyxzQ0FBb0IsR0FBbEMsVUFBbUMsY0FBa0M7UUFDakUsSUFBTSxXQUFXLEdBQUcsVUFBQyxPQUF3Qjs7WUFDekMsSUFBTSxVQUFVLEdBQUcscUJBQXFCLENBQUM7WUFDekMsSUFBTSxZQUFZLEdBQVMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQU0sV0FBVyxHQUFTLElBQUks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S0FBRztpQkFDakM7cUJBQU0sVUFBSSxTQUFTLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLDBDQUFFLFFBQVEsQ0FBQyxVQUFVLEdBQUc7b0JBQy9ELElBQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQztvQkFDdkQsSUFBSSxhQUFhLEVBQUU7d0JBQ2YsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDakM7aUJBQ0o7YUFDSjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2hCLENBQUMsQ0FBQztRQUNGLE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDVyx5Q0FBdUIsR0FBckMsVUFBc0MsWUFBb0I7UUFDdEQsSUFBTSxjQUFjLEdBQUcsVUFBQyxPQUF3Qjs7WUFDNUMsSUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEMsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxXQUFXLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDbEcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEIsT0FBTyxJQUFJLENBQUM7YUFDZjtZQUNELE9BQU8sQ0FBQyxTQUFTLFdBQUcsR0FBQyxVQUFVLElBQUcsSUFBSSxNQUFHLENBQUM7WUFDMUMsZ0JBQVMsR0FBQyxVQUFVLElBQUcsSUFBSSxLQUFHO1FBQ2xDLENBQUMsQ0FBQztRQUNGLE9BQU8sY0FBYyxDQUFDO0lBQzFCLENBQUM7SUFHTCx3QkFBQztBQUFELENBQUMsQUF2T0QsSUF1T0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVDb21wYXJpc29uVHlwZSB9IGZyb20gJy4uL2VudW1zL2RhdGUtY29tcGFyaXNvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBBR1JPX1JFR0VYIH0gZnJvbSAnLi4vY29tbW9uL2Fncm8tcmVnZXguY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBOdW1iZXJDb21wYXJpc29uVHlwZSB9IGZyb20gJy4uL2VudW1zL251bWJlci1jb21wYXJpc29uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnLi4vY29tbW9uL2Fncm8tb2JqZWN0LXV0aWxzLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBZ3JvRm9ybVZhbGlkYXRvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0b3IgcGFyYSBjaGVjYXIgc2UgbyBjYW1wbyDDqSB1bSBlLW1haWxcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdGhpcy5teUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAqICAgICBFTUFJTF9GSUVMRDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgQWdyb0Zvcm1WYWxpZGF0b3IuZW1haWxWYWxpZGF0b3JdXVxyXG4gICAgICogfSk7XHJcbiAgICAgKiBAcGFyYW0gY29udHJvbFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBlbWFpbFZhbGlkYXRvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgIUFHUk9fUkVHRVguaXNFbWFpbC50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHsgZW1haWxWYWxpZGF0b3I6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGVtYWlsVmFsaWRhdG9yOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwbGlxdWUgZXNzZSB2YWxpZGFkb3IgZW0gdW0gY2FtcG8gZG8gdGlwbyBEYXRlLCBwYXJhIHZlcmlmaWNhciBzZSBhIGRhdGEgc2VsZWNpb25hZGEgw6kgbWFpb3Igb3UgbWVub3IgcXVlIGEgZGF0YSBhdHVhbC5cclxuICAgICAqXHJcbiAgICAgKiBVdGlsaXplIG8gcGFyw6JtZXRybyBjb21wYXJpc29uVHlwZSBwYXJhIGRlZmluaXIgc2UgYSBkYXRhIHNlbGVjaW9uYWRhIGRldmUgc2VyIG1haW9yIG91IG1lbm9yIHF1ZSBhIGRhdGEgYXR1YWwuXHJcbiAgICAgKiBBIHZhbGlkYcOnw6NvIHNlcsOhIGF0cmF2w6lzIGRvIGVudW0gRGF0ZUNvbXBhcmlzb25UeXBlLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICogICAgIE5PTUVfQ0FNUE86IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIEFncm9Gb3JtVmFsaWRhdG9yLmNvbXBhcmVEYXRlV2l0aFRvZGF5KERhdGVDb21wYXJpc29uVHlwZS5ncmVhdGhlclRoYW4pXV1cclxuICAgICAqIH0pO1xyXG4gICAgICogQHBhcmFtIGNvbXBhcmlzb25UeXBlXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmVEYXRlV2l0aFRvZGF5KGNvbXBhcmlzb25UeXBlOiBEYXRlQ29tcGFyaXNvblR5cGUpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZURhdGUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2RhdGVDb21wYXJpc29uVG9kYXknO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZShjb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIFtEYXRlQ29tcGFyaXNvblR5cGUuZ3JlYXRoZXJUaGFuXTogc2VsZWN0ZWREYXRlIDw9IGN1cnJlbnREYXRlLFxyXG4gICAgICAgICAgICAgICAgW0RhdGVDb21wYXJpc29uVHlwZS5sZXNzVGhhbl06IHNlbGVjdGVkRGF0ZSA+PSBjdXJyZW50RGF0ZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbnNbY29tcGFyaXNvblR5cGVdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbbWV0aG9kTmFtZV06IHsgdmFsdWU6IGNvbnRyb2wudmFsdWUgfSB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBjb21wYXJlRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhcmEgZG9pcyBjYW1wb3MgZG8gdGlwbyBEYXRlLCB2ZXJpZmljYW5kbyBzZSBvIGNhbXBvIEEgw6kgbWFpb3IgcXVlIG8gY2FtcG8gQi4gU2UgQSBmb3IgbWFpb3IgcXVlIEIsIGVudMOjb1xyXG4gICAgICogbyBjYW1wbyBBIMOpIGludmFsaWRhZG8uIENhc28gY29udHLDoXJpbywgbyBjYW1wbyBBIMOpIHZhbGlkYWRvLlxyXG4gICAgICpcclxuICAgICAqIEFwbGlxdWUgZXNzZSBjYW1wbyBubyBGb3JtR3JvdXAsIHBhc3NhbmRvIG9zIG5vbWVzIGRvcyBjYW1wb3MgcXVlIGRlc2VqYSBjb21wYXJhci5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBOT01FX0NBTVBPX2RhdGVBOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBOT01FX0NBTVBPX2RhdGVCOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICAgICAgfSwgeyB2YWxpZGF0b3I6IEFncm9Gb3JtVmFsaWRhdG9yLmRhdGVDb21wYXJpc29uVmFsaWRhdG9yKCdOT01FX0NBTVBPX2RhdGVBJywgJ05PTUVfQ0FNUE9fZGF0ZUInKSB9KTtcclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUFcclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZURhdGVXaXRoT3RoZXJEYXRlRmllbGQoY29udHJvbE5hbWVBOiBzdHJpbmcsIGNvbnRyb2xOYW1lQjogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVEYXRlID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gZm9ybUdyb3VwLmdldChjb250cm9sTmFtZUEpPy52YWx1ZTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUIgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQik/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2NvbXBhcmVEYXRlV2l0aE90aGVyRGF0ZUZpZWxkJztcclxuICAgICAgICAgICAgaWYgKGRhdGVBICYmIGRhdGVCKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlQU9iaiA9IG5ldyBEYXRlKGRhdGVBKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVCT2JqID0gbmV3IERhdGUoZGF0ZUIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGVBT2JqIDwgZGF0ZUJPYmopIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQSk/LnNldEVycm9ycyh7IFttZXRob2ROYW1lXTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBbbWV0aG9kTmFtZV06IHRydWUgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybUdyb3VwLmdldChjb250cm9sTmFtZUEpPy5oYXNFcnJvcihtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWVBKT8uc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdG9yIHBhcmEgY2hlY2FyIHNlIG8gY2FtcG8gw6kgdW0gbsO6bWVybyBkZSB0ZWxlZm9uZSBkZSBhY29yZG8gY29tIHVtYSBtw6FzY2FyYSBpbmZvcm1hZGEuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHRoaXMubXlGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgKiAgICAgVEVMRUZPTkVfRklFTEQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIEFncm9Gb3JtVmFsaWRhdG9yLnBob25lVmFsaWRhdG9yKCcoOTkpIDk5OTktOTk5OScpXV1cclxuICAgICAqIH0pO1xyXG4gICAgICogQHBhcmFtIG1hc2tcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcGhvbmVWYWxpZGF0b3IobWFzazogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IHBob25lQ29udHJvbFZhbGlkYXRpb24gPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ3Bob25lVmFsaWRhdG9yJztcclxuICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHttYXNrLnJlcGxhY2UoLzkvZywgJ1xcXFxkJykucmVwbGFjZSgvXFwoL2csICdcXFxcKCcpLnJlcGxhY2UoL1xcKS9nLCAnXFxcXCknKS5yZXBsYWNlKC8tL2csICdcXFxcLScpfSRgKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgIXJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHsgW21ldGhvZE5hbWVdOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW21ldGhvZE5hbWVdOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHBob25lQ29udHJvbFZhbGlkYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0b3IgcGFyYSBjaGVjYXIgc2UgdW0gY2FtcG8gZGUgbsO6bWVyb3Mgw6kgbWFpb3Igb3UgbWVub3IgcXVlIG91dHJvIGNhbXBvLlxyXG4gICAgICpcclxuICAgICAqIEFwbGlxdWUgZXNzZSB2YWxpZGF0b3Igbm8gRm9ybUdyb3VwLCBwYXNzYW5kbyBvcyBub21lcyBkb3MgY2FtcG9zIHF1ZSBkZXNlamEgY29tcGFyYXIuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdGhpcy5teUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAqICAgICBOVU1FUk9fQTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAqICAgICBOVU1FUk9fQjogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxyXG4gICAgICogfSwgeyB2YWxpZGF0b3I6IEFncm9Gb3JtVmFsaWRhdG9yLmNvbXBhcmVOdW1iZXJGaWVsZHMoJ05VTUVST19BJywgJ05VTUVST19CJywgTnVtYmVyQ29tcGFyaXNvblR5cGUuRVFVQUxTKSB9KTtcclxuICAgICAqXHJcbiAgICAgKiBOZXN0ZSBjYXNvLCBhIHZlcmlmaWNhw6fDo28gc2Vyw6Egc2UgbyBOVU1FUk9fQSDDqSBpZ3VhbCBhbyBOVU1FUkJfQi5cclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUFcclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU51bWJlckZpZWxkcyhjb250cm9sTmFtZUE6IHN0cmluZywgY29udHJvbE5hbWVCOiBzdHJpbmcsIGNvbXBhcmlzb25NZXRob2Q6IE51bWJlckNvbXBhcmlzb25UeXBlKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVOdW1iZXIgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICAgICAgY29uc3QgbnVtYmVyQSA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWVBKT8udmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWJlckIgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQik/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2NvbXBhcmVOdW1iZXJGaWVsZHMnO1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyQSAmJiBudW1iZXJCKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvclR5cGUgPSBOdW1iZXJDb21wYXJpc29uVHlwZVtjb21wYXJpc29uTWV0aG9kXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29uZGl0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIFtOdW1iZXJDb21wYXJpc29uVHlwZS5FUVVBTFNdOiBudW1iZXJBICE9PSBudW1iZXJCLFxyXG4gICAgICAgICAgICAgICAgICAgIFtOdW1iZXJDb21wYXJpc29uVHlwZS5HUkVBVEVSX1RIQU5dOiBudW1iZXJBIDw9IG51bWJlckIsXHJcbiAgICAgICAgICAgICAgICAgICAgW051bWJlckNvbXBhcmlzb25UeXBlLkxFU1NfVEhBTl06IG51bWJlckEgPj0gbnVtYmVyQixcclxuICAgICAgICAgICAgICAgICAgICBbTnVtYmVyQ29tcGFyaXNvblR5cGUuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogbnVtYmVyQSA8IG51bWJlckIsXHJcbiAgICAgICAgICAgICAgICAgICAgW051bWJlckNvbXBhcmlzb25UeXBlLkxFU1NfVEhBTl9PUl9FUVVBTF06IG51bWJlckEgPiBudW1iZXJCLFxyXG4gICAgICAgICAgICAgICAgICAgIFtOdW1iZXJDb21wYXJpc29uVHlwZS5OT1RfRVFVQUxTXTogbnVtYmVyQSA9PT0gbnVtYmVyQlxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb25kaXRpb25bY29tcGFyaXNvbk1ldGhvZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sQSA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWVBKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbEEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEEuc2V0RXJyb3JzKHsgW21ldGhvZE5hbWVdOiBjb21wYXJpc29uTWV0aG9kIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBbbWV0aG9kTmFtZV06IGVycm9yVHlwZSB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQSk/Lmhhc0Vycm9yKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbEEgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xBKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xBLnNldEVycm9ycyhudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY29tcGFyZU51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRvciBwYXJhIGNoZWNhciBzZSB1bSB2YWxvciBlc3TDoSBlbnRyZSBvcyBkZW1haXMgdmFsb3JlcyBkZSB0csOqcyBmb3JtQ29udHJvbHMuXHJcbiAgICAgKlxyXG4gICAgICogQXBsaXF1ZSBlc3NlIHZhbGlkYXRvciBubyBGb3JtR3JvdXAsIHBhc3NhbmRvIG9zIG5vbWVzIGRvcyB0csOqcyBmb3JtQ29udHJvbHMgcXVlIGRlc2VqYSBjb21wYXJhci5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICogICAgIG1pbm9yRm9ybUNvbnRyb2w6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgKiAgICAgdGFyZ2V0Rm9ybUNvbnRyb2w6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgKiAgICAgbWFqb3JGb3JtQ29udHJvbDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxyXG4gICAgICogfSwgeyB2YWxpZGF0b3I6IEFncm9Gb3JtVmFsaWRhdG9yLmNoZWNrVmFsdWVCZXR3ZWVuKCdtaW5vckZvcm1Db250cm9sJywgJ3RhcmdldEZvcm1Db250cm9sJywgJ21ham9yRm9ybUNvbnRyb2wnKSB9KTtcclxuICAgICAqXHJcbiAgICAgKiBOZXN0ZSBjYXNvLCBhIHZlcmlmaWNhw6fDo28gc2Vyw6Egc2UgbyB0YXJnZXRGb3JtQ29udHJvbCBlc3TDoSBlbnRyZSBvIG1pbm9yRm9ybUNvbnRyb2wgZSBvIG1ham9yRm9ybUNvbnRyb2wuXHJcbiAgICAgKiBAcGFyYW0gbWlub3JGb3JtQ29udHJvbFxyXG4gICAgICogQHBhcmFtIHRhcmdldEZvcm1Db250cm9sXHJcbiAgICAgKiBAcGFyYW0gbWFqb3JGb3JtQ29udHJvbFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja1ZhbHVlQmV0d2VlbihtaW5vckZvcm1Db250cm9sOiBzdHJpbmcsIHRhcmdldEZvcm1Db250cm9sOiBzdHJpbmcsIG1ham9yRm9ybUNvbnRyb2w6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcclxuICAgICAgICBjb25zdCBjaGVja1ZhbHVlID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQSA9IGZvcm1Hcm91cC5nZXQobWlub3JGb3JtQ29udHJvbCk/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUIgPSBmb3JtR3JvdXAuZ2V0KHRhcmdldEZvcm1Db250cm9sKT8udmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQyA9IGZvcm1Hcm91cC5nZXQobWFqb3JGb3JtQ29udHJvbCk/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2NoZWNrVmFsdWVCZXR3ZWVuJztcclxuICAgICAgICAgICAgaWYgKHZhbHVlQSAmJiB2YWx1ZUIgJiYgdmFsdWVDKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodmFsdWVCIDwgdmFsdWVBIHx8IHZhbHVlQiA+IHZhbHVlQykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KHRhcmdldEZvcm1Db250cm9sKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb250cm9sLnNldEVycm9ycyh7IFttZXRob2ROYW1lXTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgW21ldGhvZE5hbWVdOiB0cnVlIH07XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1Hcm91cC5nZXQodGFyZ2V0Rm9ybUNvbnRyb2wpPy5oYXNFcnJvcihtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldENvbnRyb2wgPSBmb3JtR3JvdXAuZ2V0KHRhcmdldEZvcm1Db250cm9sKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q29udHJvbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRDb250cm9sLnNldEVycm9ycyhudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY2hlY2tWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRvciBwYXJhIGNoZWNhciBzZSBvIGNhbXBvIMOpIHVtIG9iamV0byBlIHNlIHBvc3N1aSB1bWEgcHJvcHJpZWRhZGUgZXNwZWPDrWZpY2EuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHRoaXMubXlGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgKiAgICAgT0JKRVRPX0ZJRUxEOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBBZ3JvRm9ybVZhbGlkYXRvci5vYmplY3RQcm9wZXJ0eVZhbGlkYXRvcigncHJvcHJpZWRhZGUnKV1dXHJcbiAgICAgKiB9KTtcclxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWVcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgb2JqZWN0UHJvcGVydHlWYWxpZGF0b3IocHJvcGVydHlOYW1lOiBzdHJpbmcpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgY29uc3Qgb2JqZWN0UHJvcGVydHkgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ29iamVjdFByb3BlcnR5JztcclxuICAgICAgICAgICAgaWYgKE9iamVjdFV0aWxzLmlzT2JqZWN0KGNvbnRyb2wudmFsdWUpICYmIE9iamVjdFV0aWxzLmNvbnRhaW5zUHJvcGVydHkoY29udHJvbC52YWx1ZSwgcHJvcGVydHlOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb250cm9sLnNldEVycm9ycyh7IFttZXRob2ROYW1lXTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHsgW21ldGhvZE5hbWVdOiB0cnVlIH07XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gb2JqZWN0UHJvcGVydHk7XHJcbiAgICB9XHJcblxyXG5cclxufSJdfQ==
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdyby1mb3JtLXZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BzZW5pb3ItYWdyb25lZ29jaW8vYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiZm9ybS12YWxpZGF0b3IvYWdyby1mb3JtLXZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDeEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUVoRTtJQUFBO0lBMFZBLENBQUM7SUF4Vkc7Ozs7Ozs7OztPQVNHO0lBQ1csZ0NBQWMsR0FBNUIsVUFBNkIsT0FBd0I7UUFDakQsSUFBSSxPQUFPLENBQUMsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzFELE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBR0Q7Ozs7Ozs7Ozs7OztPQVlHO0lBQ1csc0NBQW9CLEdBQWxDLFVBQW1DLGNBQWtDO1FBQ2pFLElBQU0sV0FBVyxHQUFHLFVBQUMsT0FBd0I7O1lBQ3pDLElBQU0sVUFBVSxHQUFHLHFCQUFxQixDQUFDO1lBQ3pDLElBQU0sWUFBWSxHQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRCxJQUFNLFdBQVcsR0FBUyxJQUFJ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LE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFDckQ7Z0JBQ0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsQ0FBQzthQUNsQztZQUVELE9BQU8sSUFBSSxDQUFDLENBQUMsU0FBUztRQUMxQixDQUFDLENBQUM7SUFDTixDQUFDO0lBR0Q7OztPQUdHO0lBQ0gsaURBQXFCLEdBQXJCO1FBQ0ksT0FBTyxVQUFDLE9BQXdCO1lBQzVCLElBQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRTNFLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ1IsT0FBTyxJQUFJLENBQUMsQ0FBQyxxREFBcUQ7YUFDckU7WUFFRCxJQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztnQkFDekQsVUFBVSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUU3QyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLG1CQUFtQixFQUFFLElBQUksRUFBRSxDQUFDO1FBQzFELENBQUMsQ0FBQztJQUNOLENBQUM7SUFJTCx3QkFBQztBQUFELENBQUMsQUExVkQsSUEwVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgVmFsaWRhdGlvbkVycm9ycywgVmFsaWRhdG9yRm4gfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IERhdGVDb21wYXJpc29uVHlwZSB9IGZyb20gJy4uL2VudW1zL2RhdGUtY29tcGFyaXNvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBBR1JPX1JFR0VYIH0gZnJvbSAnLi4vY29tbW9uL2Fncm8tcmVnZXguY29uc3RhbnQnO1xyXG5pbXBvcnQgeyBOdW1iZXJDb21wYXJpc29uVHlwZSB9IGZyb20gJy4uL2VudW1zL251bWJlci1jb21wYXJpc29uLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7IE9iamVjdFV0aWxzIH0gZnJvbSAnLi4vY29tbW9uL2Fncm8tb2JqZWN0LXV0aWxzLmNsYXNzJztcclxuXHJcbmV4cG9ydCBjbGFzcyBBZ3JvRm9ybVZhbGlkYXRvciB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0b3IgcGFyYSBjaGVjYXIgc2UgbyBjYW1wbyDDqSB1bSBlLW1haWxcclxuICAgICAqXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdGhpcy5teUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAqICAgICBFTUFJTF9GSUVMRDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgQWdyb0Zvcm1WYWxpZGF0b3IuZW1haWxWYWxpZGF0b3JdXVxyXG4gICAgICogfSk7XHJcbiAgICAgKiBAcGFyYW0gY29udHJvbFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBlbWFpbFZhbGlkYXRvcihjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgIUFHUk9fUkVHRVguaXNFbWFpbC50ZXN0KGNvbnRyb2wudmFsdWUpKSB7XHJcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHsgZW1haWxWYWxpZGF0b3I6IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IGVtYWlsVmFsaWRhdG9yOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwbGlxdWUgZXNzZSB2YWxpZGFkb3IgZW0gdW0gY2FtcG8gZG8gdGlwbyBEYXRlLCBwYXJhIHZlcmlmaWNhciBzZSBhIGRhdGEgc2VsZWNpb25hZGEgw6kgbWFpb3Igb3UgbWVub3IgcXVlIGEgZGF0YSBhdHVhbC5cclxuICAgICAqXHJcbiAgICAgKiBVdGlsaXplIG8gcGFyw6JtZXRybyBjb21wYXJpc29uVHlwZSBwYXJhIGRlZmluaXIgc2UgYSBkYXRhIHNlbGVjaW9uYWRhIGRldmUgc2VyIG1haW9yIG91IG1lbm9yIHF1ZSBhIGRhdGEgYXR1YWwuXHJcbiAgICAgKiBBIHZhbGlkYcOnw6NvIHNlcsOhIGF0cmF2w6lzIGRvIGVudW0gRGF0ZUNvbXBhcmlzb25UeXBlLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICogICAgIE5PTUVfQ0FNUE86IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIEFncm9Gb3JtVmFsaWRhdG9yLmNvbXBhcmVEYXRlV2l0aFRvZGF5KERhdGVDb21wYXJpc29uVHlwZS5ncmVhdGhlclRoYW4pXV1cclxuICAgICAqIH0pO1xyXG4gICAgICogQHBhcmFtIGNvbXBhcmlzb25UeXBlXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmVEYXRlV2l0aFRvZGF5KGNvbXBhcmlzb25UeXBlOiBEYXRlQ29tcGFyaXNvblR5cGUpOiBWYWxpZGF0b3JGbiB7XHJcbiAgICAgICAgY29uc3QgY29tcGFyZURhdGUgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2RhdGVDb21wYXJpc29uVG9kYXknO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZERhdGU6IERhdGUgPSBuZXcgRGF0ZShjb250cm9sLnZhbHVlKTtcclxuICAgICAgICAgICAgY29uc3QgY3VycmVudERhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IHtcclxuICAgICAgICAgICAgICAgIFtEYXRlQ29tcGFyaXNvblR5cGUuZ3JlYXRoZXJUaGFuXTogc2VsZWN0ZWREYXRlIDw9IGN1cnJlbnREYXRlLFxyXG4gICAgICAgICAgICAgICAgW0RhdGVDb21wYXJpc29uVHlwZS5sZXNzVGhhbl06IHNlbGVjdGVkRGF0ZSA+PSBjdXJyZW50RGF0ZVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbnNbY29tcGFyaXNvblR5cGVdKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBbbWV0aG9kTmFtZV06IHsgdmFsdWU6IGNvbnRyb2wudmFsdWUgfSB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBjb21wYXJlRGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBhcmEgZG9pcyBjYW1wb3MgZG8gdGlwbyBEYXRlLCB2ZXJpZmljYW5kbyBzZSBvIGNhbXBvIEEgw6kgbWFpb3IgcXVlIG8gY2FtcG8gQi4gU2UgQSBmb3IgbWFpb3IgcXVlIEIsIGVudMOjb1xyXG4gICAgICogbyBjYW1wbyBBIMOpIGludmFsaWRhZG8uIENhc28gY29udHLDoXJpbywgbyBjYW1wbyBBIMOpIHZhbGlkYWRvLlxyXG4gICAgICpcclxuICAgICAqIEFwbGlxdWUgZXNzZSBjYW1wbyBubyBGb3JtR3JvdXAsIHBhc3NhbmRvIG9zIG5vbWVzIGRvcyBjYW1wb3MgcXVlIGRlc2VqYSBjb21wYXJhci5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICBOT01FX0NBTVBPX2RhdGVBOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBOT01FX0NBTVBPX2RhdGVCOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXHJcbiAgICAgICAgfSwgeyB2YWxpZGF0b3I6IEFncm9Gb3JtVmFsaWRhdG9yLmRhdGVDb21wYXJpc29uVmFsaWRhdG9yKCdOT01FX0NBTVBPX2RhdGVBJywgJ05PTUVfQ0FNUE9fZGF0ZUInKSB9KTtcclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUFcclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZURhdGVXaXRoT3RoZXJEYXRlRmllbGQoY29udHJvbE5hbWVBOiBzdHJpbmcsIGNvbnRyb2xOYW1lQjogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVEYXRlID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGVBID0gZm9ybUdyb3VwLmdldChjb250cm9sTmFtZUEpPy52YWx1ZTtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUIgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQik/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2NvbXBhcmVEYXRlV2l0aE90aGVyRGF0ZUZpZWxkJztcclxuICAgICAgICAgICAgaWYgKGRhdGVBICYmIGRhdGVCKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRlQU9iaiA9IG5ldyBEYXRlKGRhdGVBKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGVCT2JqID0gbmV3IERhdGUoZGF0ZUIpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRhdGVBT2JqIDwgZGF0ZUJPYmopIHtcclxuICAgICAgICAgICAgICAgICAgICBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQSk/LnNldEVycm9ycyh7IFttZXRob2ROYW1lXTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBbbWV0aG9kTmFtZV06IHRydWUgfTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybUdyb3VwLmdldChjb250cm9sTmFtZUEpPy5oYXNFcnJvcihtZXRob2ROYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWVBKT8uc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdG9yIHBhcmEgY2hlY2FyIHNlIG8gY2FtcG8gw6kgdW0gbsO6bWVybyBkZSB0ZWxlZm9uZSBkZSBhY29yZG8gY29tIHVtYSBtw6FzY2FyYSBpbmZvcm1hZGEuXHJcbiAgICAgKlxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIHRoaXMubXlGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgKiAgICAgVEVMRUZPTkVfRklFTEQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIEFncm9Gb3JtVmFsaWRhdG9yLnBob25lVmFsaWRhdG9yKCcoOTkpIDk5OTktOTk5OScpXV1cclxuICAgICAqIH0pO1xyXG4gICAgICogQHBhcmFtIG1hc2tcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgcGhvbmVWYWxpZGF0b3IobWFzazogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IHBob25lQ29udHJvbFZhbGlkYXRpb24gPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ3Bob25lVmFsaWRhdG9yJztcclxuICAgICAgICAgICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBeJHttYXNrLnJlcGxhY2UoLzkvZywgJ1xcXFxkJykucmVwbGFjZSgvXFwoL2csICdcXFxcKCcpLnJlcGxhY2UoL1xcKS9nLCAnXFxcXCknKS5yZXBsYWNlKC8tL2csICdcXFxcLScpfSRgKTtcclxuICAgICAgICAgICAgaWYgKGNvbnRyb2wudmFsdWUgJiYgIXJlZ2V4LnRlc3QoY29udHJvbC52YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKHsgW21ldGhvZE5hbWVdOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgW21ldGhvZE5hbWVdOiB0cnVlIH07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMobnVsbCk7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIHBob25lQ29udHJvbFZhbGlkYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0b3IgcGFyYSBjaGVjYXIgc2UgdW0gY2FtcG8gZGUgbsO6bWVyb3Mgw6kgbWFpb3Igb3UgbWVub3IgcXVlIG91dHJvIGNhbXBvLlxyXG4gICAgICpcclxuICAgICAqIEFwbGlxdWUgZXNzZSB2YWxpZGF0b3Igbm8gRm9ybUdyb3VwLCBwYXNzYW5kbyBvcyBub21lcyBkb3MgY2FtcG9zIHF1ZSBkZXNlamEgY29tcGFyYXIuXHJcbiAgICAgKiBAZXhhbXBsZVxyXG4gICAgICogdGhpcy5teUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAqICAgICBOVU1FUk9fQTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAqICAgICBOVU1FUk9fQjogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxyXG4gICAgICogfSwgeyB2YWxpZGF0b3I6IEFncm9Gb3JtVmFsaWRhdG9yLmNvbXBhcmVOdW1iZXJGaWVsZHMoJ05VTUVST19BJywgJ05VTUVST19CJywgTnVtYmVyQ29tcGFyaXNvblR5cGUuRVFVQUxTKSB9KTtcclxuICAgICAqXHJcbiAgICAgKiBOZXN0ZSBjYXNvLCBhIHZlcmlmaWNhw6fDo28gc2Vyw6Egc2UgbyBOVU1FUk9fQSDDqSBpZ3VhbCBhbyBOVU1FUkJfQi5cclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUFcclxuICAgICAqIEBwYXJhbSBjb250cm9sTmFtZUJcclxuICAgICAqIEByZXR1cm5zXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU51bWJlckZpZWxkcyhjb250cm9sTmFtZUE6IHN0cmluZywgY29udHJvbE5hbWVCOiBzdHJpbmcsIGNvbXBhcmlzb25NZXRob2Q6IE51bWJlckNvbXBhcmlzb25UeXBlKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IGNvbXBhcmVOdW1iZXIgPSAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtR3JvdXAgPSBjb250cm9sIGFzIEZvcm1Hcm91cDtcclxuICAgICAgICAgICAgY29uc3QgbnVtYmVyQSA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWVBKT8udmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG51bWJlckIgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQik/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2NvbXBhcmVOdW1iZXJGaWVsZHMnO1xyXG4gICAgICAgICAgICBpZiAobnVtYmVyQSAmJiBudW1iZXJCKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvclR5cGUgPSBOdW1iZXJDb21wYXJpc29uVHlwZVtjb21wYXJpc29uTWV0aG9kXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yQ29uZGl0aW9uID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIFtOdW1iZXJDb21wYXJpc29uVHlwZS5FUVVBTFNdOiBudW1iZXJBICE9PSBudW1iZXJCLFxyXG4gICAgICAgICAgICAgICAgICAgIFtOdW1iZXJDb21wYXJpc29uVHlwZS5HUkVBVEVSX1RIQU5dOiBudW1iZXJBIDw9IG51bWJlckIsXHJcbiAgICAgICAgICAgICAgICAgICAgW051bWJlckNvbXBhcmlzb25UeXBlLkxFU1NfVEhBTl06IG51bWJlckEgPj0gbnVtYmVyQixcclxuICAgICAgICAgICAgICAgICAgICBbTnVtYmVyQ29tcGFyaXNvblR5cGUuR1JFQVRFUl9USEFOX09SX0VRVUFMXTogbnVtYmVyQSA8IG51bWJlckIsXHJcbiAgICAgICAgICAgICAgICAgICAgW051bWJlckNvbXBhcmlzb25UeXBlLkxFU1NfVEhBTl9PUl9FUVVBTF06IG51bWJlckEgPiBudW1iZXJCLFxyXG4gICAgICAgICAgICAgICAgICAgIFtOdW1iZXJDb21wYXJpc29uVHlwZS5OT1RfRVFVQUxTXTogbnVtYmVyQSA9PT0gbnVtYmVyQlxyXG4gICAgICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb25kaXRpb25bY29tcGFyaXNvbk1ldGhvZF0pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sQSA9IGZvcm1Hcm91cC5nZXQoY29udHJvbE5hbWVBKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbEEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbEEuc2V0RXJyb3JzKHsgW21ldGhvZE5hbWVdOiBjb21wYXJpc29uTWV0aG9kIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBbbWV0aG9kTmFtZV06IGVycm9yVHlwZSB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQSk/Lmhhc0Vycm9yKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbEEgPSBmb3JtR3JvdXAuZ2V0KGNvbnRyb2xOYW1lQSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xBKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xBLnNldEVycm9ycyhudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY29tcGFyZU51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYXRvciBwYXJhIGNoZWNhciBzZSB1bSB2YWxvciBlc3TDoSBlbnRyZSBvcyBkZW1haXMgdmFsb3JlcyBkZSB0csOqcyBmb3JtQ29udHJvbHMuXHJcbiAgICAgKlxyXG4gICAgICogQXBsaXF1ZSBlc3NlIHZhbGlkYXRvciBubyBGb3JtR3JvdXAsIHBhc3NhbmRvIG9zIG5vbWVzIGRvcyB0csOqcyBmb3JtQ29udHJvbHMgcXVlIGRlc2VqYSBjb21wYXJhci5cclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICogICAgIG1pbm9yRm9ybUNvbnRyb2w6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgKiAgICAgdGFyZ2V0Rm9ybUNvbnRyb2w6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgKiAgICAgbWFqb3JGb3JtQ29udHJvbDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXVxyXG4gICAgICogfSwgeyB2YWxpZGF0b3I6IEFncm9Gb3JtVmFsaWRhdG9yLmNoZWNrVmFsdWVCZXR3ZWVuKCdtaW5vckZvcm1Db250cm9sJywgJ3RhcmdldEZvcm1Db250cm9sJywgJ21ham9yRm9ybUNvbnRyb2wnKSB9KTtcclxuICAgICAqXHJcbiAgICAgKiBOZXN0ZSBjYXNvLCBhIHZlcmlmaWNhw6fDo28gc2Vyw6Egc2UgbyB0YXJnZXRGb3JtQ29udHJvbCBlc3TDoSBlbnRyZSBvIG1pbm9yRm9ybUNvbnRyb2wgZSBvIG1ham9yRm9ybUNvbnRyb2wuXHJcbiAgICAgKiBAcGFyYW0gbWlub3JGb3JtQ29udHJvbFxyXG4gICAgICogQHBhcmFtIHRhcmdldEZvcm1Db250cm9sXHJcbiAgICAgKiBAcGFyYW0gbWFqb3JGb3JtQ29udHJvbFxyXG4gICAgICogQHJldHVybnNcclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBjaGVja1ZhbHVlQmV0d2VlbihtaW5vckZvcm1Db250cm9sOiBzdHJpbmcsIHRhcmdldEZvcm1Db250cm9sOiBzdHJpbmcsIG1ham9yRm9ybUNvbnRyb2w6IHN0cmluZyk6IFZhbGlkYXRvckZuIHtcclxuICAgICAgICBjb25zdCBjaGVja1ZhbHVlID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQSA9IGZvcm1Hcm91cC5nZXQobWlub3JGb3JtQ29udHJvbCk/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZUIgPSBmb3JtR3JvdXAuZ2V0KHRhcmdldEZvcm1Db250cm9sKT8udmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlQyA9IGZvcm1Hcm91cC5nZXQobWFqb3JGb3JtQ29udHJvbCk/LnZhbHVlO1xyXG4gICAgICAgICAgICBjb25zdCBtZXRob2ROYW1lID0gJ2NoZWNrVmFsdWVCZXR3ZWVuJztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFyZU51bWJlcnMgPSBbdmFsdWVBLCB2YWx1ZUIsIHZhbHVlQ10uZXZlcnkodiA9PiB2ICE9PSBudWxsICYmIHYgIT09IHVuZGVmaW5lZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoYXJlTnVtYmVycykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlQiA8IHZhbHVlQSB8fCB2YWx1ZUIgPiB2YWx1ZUMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRDb250cm9sID0gZm9ybUdyb3VwLmdldCh0YXJnZXRGb3JtQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENvbnRyb2wpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29udHJvbC5zZXRFcnJvcnMoeyBbbWV0aG9kTmFtZV06IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IFttZXRob2ROYW1lXTogdHJ1ZSB9O1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRDb250cm9sID0gZm9ybUdyb3VwLmdldCh0YXJnZXRGb3JtQ29udHJvbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldENvbnRyb2w/Lmhhc0Vycm9yKG1ldGhvZE5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IHsgLi4udGFyZ2V0Q29udHJvbC5lcnJvcnMgfTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGVycm9yc1ttZXRob2ROYW1lXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q29udHJvbC5zZXRFcnJvcnMoT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyBlcnJvcnMgOiBudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY2hlY2tWYWx1ZTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBWYWxpZGF0b3IgcGFyYSBjaGVjYXIgc2UgbyBjYW1wbyDDqSB1bSBvYmpldG8gZSBzZSBwb3NzdWkgdW1hIHByb3ByaWVkYWRlIGVzcGVjw61maWNhLlxyXG4gICAgICpcclxuICAgICAqIEBleGFtcGxlXHJcbiAgICAgKiB0aGlzLm15Rm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICogICAgIE9CSkVUT19GSUVMRDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgQWdyb0Zvcm1WYWxpZGF0b3Iub2JqZWN0UHJvcGVydHlWYWxpZGF0b3IoJ3Byb3ByaWVkYWRlJyldXVxyXG4gICAgICogfSk7XHJcbiAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lXHJcbiAgICAgKiBAcmV0dXJuc1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc3RhdGljIG9iamVjdFByb3BlcnR5VmFsaWRhdG9yKHByb3BlcnR5TmFtZTogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IG9iamVjdFByb3BlcnR5ID0gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbWV0aG9kTmFtZSA9ICdvYmplY3RQcm9wZXJ0eSc7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChjb250cm9sLnZhbHVlKSAmJiBPYmplY3RVdGlscy5jb250YWluc1Byb3BlcnR5KGNvbnRyb2wudmFsdWUsIHByb3BlcnR5TmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRyb2wuc2V0RXJyb3JzKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoeyBbbWV0aG9kTmFtZV06IHRydWUgfSk7XHJcbiAgICAgICAgICAgIHJldHVybiB7IFttZXRob2ROYW1lXTogdHJ1ZSB9O1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIG9iamVjdFByb3BlcnR5O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhIHNlIG8gY2FtcG8gw6kgdW0gQ1BGIChDYWRhc3RybyBkZSBQZXNzb2EgRsOtc2ljYSkgdsOhbGlkby5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHN0YXRpYyBDUEZWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIGNvbnN0IGNwZlZhbCA9IChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNwZiA9IChjb250cm9sLnZhbHVlIHx8ICcnKS5yZXBsYWNlKC9bXlxcZF0vZywgJycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjcGYpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBOw6NvIHZhbGlkYSBjYW1wbyB2YXppbywgdXNlIFZhbGlkYXRvcnMucmVxdWlyZWQganVudG8gc2UgcXVpc2VyIG9icmlnYXRvcmllZGFkZVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoY3BmLmxlbmd0aCAhPT0gMTEpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGNwZlZhbGlkYXRvcjogdHJ1ZSB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBWZXJpZmljYSBzZSB0b2RvcyBvcyBkw61naXRvcyBzw6NvIGlndWFpcyAoZXguOiAxMTExMTExMTExMSlcclxuICAgICAgICAgICAgaWYgKC9eKFxcZClcXDF7MTB9JC8udGVzdChjcGYpKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4geyBjcGZWYWxpZGF0b3I6IHRydWUgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmFsaWRhw6fDo28gZG9zIGTDrWdpdG9zIHZlcmlmaWNhZG9yZXNcclxuICAgICAgICAgICAgY29uc3QgY2FsY0NoZWNrRGlnaXQgPSAoY3BmU2xpY2U6IHN0cmluZywgZmFjdG9yOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRpZ2l0IG9mIGNwZlNsaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gcGFyc2VJbnQoZGlnaXQsIDEwKSAqIGZhY3Rvci0tO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVtYWluZGVyID0gdG90YWwgJSAxMTtcclxuICAgICAgICAgICAgICAgIHJldHVybiByZW1haW5kZXIgPCAyID8gMCA6IDExIC0gcmVtYWluZGVyO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZGlnaXQxID0gY2FsY0NoZWNrRGlnaXQoY3BmLnN1YnN0cmluZygwLCA5KSwgMTApO1xyXG4gICAgICAgICAgICBjb25zdCBkaWdpdDIgPSBjYWxjQ2hlY2tEaWdpdChjcGYuc3Vic3RyaW5nKDAsIDkpICsgZGlnaXQxLCAxMSk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gZGlnaXQxID09PSBwYXJzZUludChjcGYuY2hhckF0KDkpLCAxMCkgJiZcclxuICAgICAgICAgICAgICAgIGRpZ2l0MiA9PT0gcGFyc2VJbnQoY3BmLmNoYXJBdCgxMCksIDEwKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkID8gbnVsbCA6IHsgY3BmVmFsaWRhdG9yOiB0cnVlIH07XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gY3BmVmFsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsaWRhdG9yIGRlIENOUEogKENhZGFzdHJvIE5hY2lvbmFsIGRhIFBlc3NvYSBKdXLDrWRpY2EpLlxyXG4gICAgICogQHJldHVybnMgXHJcbiAgICAgKi9cclxuICAgIENOUEpWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU/LnJlcGxhY2UoL1xcRC9nLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCAhPT0gMTQpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGNucGpWYWxpZGF0b3I6IHRydWUgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVmVyaWZpY2EgQ05QSnMgY29tIHRvZG9zIG9zIGTDrWdpdG9zIGlndWFpcyAoaW52w6FsaWRvcylcclxuICAgICAgICAgICAgaWYgKC9eKFxcZClcXDF7MTN9JC8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGNucGpWYWxpZGF0b3I6IHRydWUgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVDaGVja0RpZ2l0ID0gKGNucGo6IHN0cmluZywgbGVuZ3RoOiBudW1iZXIpOiBudW1iZXIgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgd2VpZ2h0cyA9IGxlbmd0aCA9PT0gMTJcclxuICAgICAgICAgICAgICAgICAgICA/IFs1LCA0LCAzLCAyLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyXVxyXG4gICAgICAgICAgICAgICAgICAgIDogWzYsIDUsIDQsIDMsIDIsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDJdO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IGNucGpcclxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgbGVuZ3RoKVxyXG4gICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnJylcclxuICAgICAgICAgICAgICAgICAgICAucmVkdWNlKChhY2MsIGRpZ2l0LCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWNjICsgcGFyc2VJbnQoZGlnaXQsIDEwKSAqIHdlaWdodHNbaW5kZXhdO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHN1bSAlIDExO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmRlciA8IDIgPyAwIDogMTEgLSByZW1haW5kZXI7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaXJzdENoZWNrRGlnaXQgPSB2YWxpZGF0ZUNoZWNrRGlnaXQodmFsdWUsIDEyKTtcclxuICAgICAgICAgICAgY29uc3Qgc2Vjb25kQ2hlY2tEaWdpdCA9IHZhbGlkYXRlQ2hlY2tEaWdpdCh2YWx1ZSwgMTMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgZmlyc3RDaGVja0RpZ2l0ICE9PSBwYXJzZUludCh2YWx1ZS5jaGFyQXQoMTIpLCAxMCkgfHxcclxuICAgICAgICAgICAgICAgIHNlY29uZENoZWNrRGlnaXQgIT09IHBhcnNlSW50KHZhbHVlLmNoYXJBdCgxMyksIDEwKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7IGNucGpWYWxpZGF0b3I6IHRydWUgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHbDoWxpZG9cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbGlkYSBzZSBhIHBsYWNhIGRvIHZlw61jdWxvIMOpIHbDoWxpZGEuXHJcbiAgICAgKiBAcmV0dXJucyBcclxuICAgICAqL1xyXG4gICAgbGljZW5zZVBsYXRlVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICAgICAgICByZXR1cm4gKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCk6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoY29udHJvbC52YWx1ZSB8fCAnJykudG9VcHBlckNhc2UoKS50cmltKCkucmVwbGFjZSgvLS9nLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gQ2FtcG8gdmF6aW8gbsOjbyDDqSByZXNwb25zYWJpbGlkYWRlIGRlc3NlIHZhbGlkYWRvclxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gQUdST19SRUdFWC5pc01lcmNvc3VsTGljZW5zZVBsYXRlLnRlc3QodmFsdWUpIHx8XHJcbiAgICAgICAgICAgICAgICBBR1JPX1JFR0VYLmlzT2xkTGljZW5zZVBsYXRlLnRlc3QodmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBsaWNlbnNlUGxhdGVJbnZhbGlkOiB0cnVlIH07XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcblxyXG5cclxufSJdfQ==
@@ -175,6 +175,16 @@ const AGRO_REGEX = {
175
175
  * Validação se todos os dígitos são iguais
176
176
  */
177
177
  isAllDigitsEqual: /^(.)\1+$/,
178
+ /**
179
+ * Validação de Placa de Veículo do Mercosul
180
+ * Formato: ABC1D23
181
+ */
182
+ isMercosulLicensePlate: /^[A-Z]{3}[0-9]{1}[A-Z]{1}[0-9]{2}$/,
183
+ /**
184
+ * Validação de Placa de Veículo Antiga
185
+ * Formato: AAA-0000
186
+ */
187
+ isOldLicensePlate: /^[A-Z]{3}[0-9]{4}$/
178
188
  };
179
189
 
180
190
  var NumberComparisonType;
@@ -1698,13 +1708,14 @@ class AgroFormValidator {
1698
1708
  */
1699
1709
  static checkValueBetween(minorFormControl, targetFormControl, majorFormControl) {
1700
1710
  const checkValue = (control) => {
1701
- var _a, _b, _c, _d;
1711
+ var _a, _b, _c;
1702
1712
  const formGroup = control;
1703
1713
  const valueA = (_a = formGroup.get(minorFormControl)) === null || _a === void 0 ? void 0 : _a.value;
1704
1714
  const valueB = (_b = formGroup.get(targetFormControl)) === null || _b === void 0 ? void 0 : _b.value;
1705
1715
  const valueC = (_c = formGroup.get(majorFormControl)) === null || _c === void 0 ? void 0 : _c.value;
1706
1716
  const methodName = 'checkValueBetween';
1707
- if (valueA && valueB && valueC) {
1717
+ const areNumbers = [valueA, valueB, valueC].every(v => v !== null && v !== undefined);
1718
+ if (areNumbers) {
1708
1719
  if (valueB < valueA || valueB > valueC) {
1709
1720
  const targetControl = formGroup.get(targetFormControl);
1710
1721
  if (targetControl) {
@@ -1712,10 +1723,12 @@ class AgroFormValidator {
1712
1723
  }
1713
1724
  return { [methodName]: true };
1714
1725
  }
1715
- else if ((_d = formGroup.get(targetFormControl)) === null || _d === void 0 ? void 0 : _d.hasError(methodName)) {
1726
+ else {
1716
1727
  const targetControl = formGroup.get(targetFormControl);
1717
- if (targetControl) {
1718
- targetControl.setErrors(null);
1728
+ if (targetControl === null || targetControl === void 0 ? void 0 : targetControl.hasError(methodName)) {
1729
+ const errors = Object.assign({}, targetControl.errors);
1730
+ delete errors[methodName];
1731
+ targetControl.setErrors(Object.keys(errors).length ? errors : null);
1719
1732
  }
1720
1733
  }
1721
1734
  }
@@ -1745,6 +1758,91 @@ class AgroFormValidator {
1745
1758
  };
1746
1759
  return objectProperty;
1747
1760
  }
1761
+ /**
1762
+ * Valida se o campo é um CPF (Cadastro de Pessoa Física) válido.
1763
+ */
1764
+ static CPFValidator() {
1765
+ const cpfVal = (control) => {
1766
+ const cpf = (control.value || '').replace(/[^\d]/g, '');
1767
+ if (!cpf) {
1768
+ return null; // Não valida campo vazio, use Validators.required junto se quiser obrigatoriedade
1769
+ }
1770
+ if (cpf.length !== 11) {
1771
+ return { cpfValidator: true };
1772
+ }
1773
+ // Verifica se todos os dígitos são iguais (ex.: 11111111111)
1774
+ if (/^(\d)\1{10}$/.test(cpf)) {
1775
+ return { cpfValidator: true };
1776
+ }
1777
+ // Validação dos dígitos verificadores
1778
+ const calcCheckDigit = (cpfSlice, factor) => {
1779
+ let total = 0;
1780
+ for (const digit of cpfSlice) {
1781
+ total += parseInt(digit, 10) * factor--;
1782
+ }
1783
+ const remainder = total % 11;
1784
+ return remainder < 2 ? 0 : 11 - remainder;
1785
+ };
1786
+ const digit1 = calcCheckDigit(cpf.substring(0, 9), 10);
1787
+ const digit2 = calcCheckDigit(cpf.substring(0, 9) + digit1, 11);
1788
+ const isValid = digit1 === parseInt(cpf.charAt(9), 10) &&
1789
+ digit2 === parseInt(cpf.charAt(10), 10);
1790
+ return isValid ? null : { cpfValidator: true };
1791
+ };
1792
+ return cpfVal;
1793
+ }
1794
+ /**
1795
+ * Validator de CNPJ (Cadastro Nacional da Pessoa Jurídica).
1796
+ * @returns
1797
+ */
1798
+ CNPJValidator() {
1799
+ return (control) => {
1800
+ var _a;
1801
+ const value = (_a = control.value) === null || _a === void 0 ? void 0 : _a.replace(/\D/g, '');
1802
+ if (!value || value.length !== 14) {
1803
+ return { cnpjValidator: true };
1804
+ }
1805
+ // Verifica CNPJs com todos os dígitos iguais (inválidos)
1806
+ if (/^(\d)\1{13}$/.test(value)) {
1807
+ return { cnpjValidator: true };
1808
+ }
1809
+ const validateCheckDigit = (cnpj, length) => {
1810
+ const weights = length === 12
1811
+ ? [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
1812
+ : [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
1813
+ const sum = cnpj
1814
+ .slice(0, length)
1815
+ .split('')
1816
+ .reduce((acc, digit, index) => {
1817
+ return acc + parseInt(digit, 10) * weights[index];
1818
+ }, 0);
1819
+ const remainder = sum % 11;
1820
+ return remainder < 2 ? 0 : 11 - remainder;
1821
+ };
1822
+ const firstCheckDigit = validateCheckDigit(value, 12);
1823
+ const secondCheckDigit = validateCheckDigit(value, 13);
1824
+ if (firstCheckDigit !== parseInt(value.charAt(12), 10) ||
1825
+ secondCheckDigit !== parseInt(value.charAt(13), 10)) {
1826
+ return { cnpjValidator: true };
1827
+ }
1828
+ return null; // válido
1829
+ };
1830
+ }
1831
+ /**
1832
+ * Valida se a placa do veículo é válida.
1833
+ * @returns
1834
+ */
1835
+ licensePlateValidator() {
1836
+ return (control) => {
1837
+ const value = (control.value || '').toUpperCase().trim().replace(/-/g, '');
1838
+ if (!value) {
1839
+ return null; // Campo vazio não é responsabilidade desse validador
1840
+ }
1841
+ const isValid = AGRO_REGEX.isMercosulLicensePlate.test(value) ||
1842
+ AGRO_REGEX.isOldLicensePlate.test(value);
1843
+ return isValid ? null : { licensePlateInvalid: true };
1844
+ };
1845
+ }
1748
1846
  }
1749
1847
 
1750
1848
  class AgroCookieUtils {