UNPKG

@ngneat/reactive-forms

Version:

(Angular Reactive) Forms with Benefits

138 lines 23 kB
import { UntypedFormArray, } from '@angular/forms'; import { isObservable, Subject } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { controlValueChanges$, controlStatus$, controlErrorChanges$, hasErrorAnd, mergeErrors, removeError, controlDisabledWhile, controlEnabledWhile, disableControl, enableControl, markAllDirty, } from './core'; export class FormArray extends UntypedFormArray { constructor(controls, validatorOrOpts, asyncValidator) { super(controls, validatorOrOpts, asyncValidator); this.controls = controls; this.touchChanges = new Subject(); this.dirtyChanges = new Subject(); this.errorsSubject = new Subject(); this.touch$ = this.touchChanges .asObservable() .pipe(distinctUntilChanged()); this.dirty$ = this.dirtyChanges .asObservable() .pipe(distinctUntilChanged()); this.value$ = controlValueChanges$(this); this.disabled$ = controlStatus$(this, 'disabled'); this.enabled$ = controlStatus$(this, 'enabled'); this.invalid$ = controlStatus$(this, 'invalid'); this.valid$ = controlStatus$(this, 'valid'); this.status$ = controlStatus$(this, 'status'); this.errors$ = controlErrorChanges$(this, this.errorsSubject.asObservable()); } select(mapFn) { return this.value$.pipe(map(mapFn), distinctUntilChanged()); } setValue(valueOrObservable, options) { if (isObservable(valueOrObservable)) { return valueOrObservable.subscribe((value) => super.setValue(value, options)); } super.setValue(valueOrObservable, options); } patchValue(valueOrObservable, options) { if (isObservable(valueOrObservable)) { return valueOrObservable.subscribe((value) => super.patchValue(value, options)); } super.patchValue(valueOrObservable, options); } getRawValue() { return super.getRawValue(); } push(control, options) { return super.push(control, options); } insert(index, control, options) { return super.insert(index, control, options); } setControl(index, control, options) { return super.setControl(index, control, options); } at(index) { return super.at(index); } remove(value, options) { this.removeWhen((v) => v.value === value); } removeWhen(predicate, options) { for (let i = this.length - 1; i >= 0; --i) { if (predicate(this.at(i))) { this.removeAt(i, options); } } } markAsTouched(...opts) { super.markAsTouched(...opts); this.touchChanges.next(true); } markAsUntouched(...opts) { super.markAsUntouched(...opts); this.touchChanges.next(false); } markAsPristine(...opts) { super.markAsPristine(...opts); this.dirtyChanges.next(false); } markAsDirty(...opts) { super.markAsDirty(...opts); this.dirtyChanges.next(true); } markAllAsDirty() { markAllDirty(this); } setEnable(enable = true, opts) { enableControl(this, enable, opts); } setDisable(disable = true, opts) { disableControl(this, disable, opts); } disabledWhile(observable, options) { return controlDisabledWhile(this, observable, options); } enabledWhile(observable, options) { return controlEnabledWhile(this, observable, options); } reset(formState, options) { super.reset(formState, options); } setValidators(newValidators, options) { super.setValidators(newValidators); super.updateValueAndValidity(options); } setAsyncValidators(newValidator, options) { super.setAsyncValidators(newValidator); super.updateValueAndValidity(options); } getError(...params) { return super.getError(...params); } setErrors(...opts) { /** * @description * Use an elvis operator to avoid a throw when the control is used with an async validator * Which will be instantly resolved (like with `of(null)`) * In such case, Angular will call this method instantly before even instancing the properties causing the throw * Can be easily reproduced with a step-by-step debug once compiled when checking the stack trace of the constructor * * Issue: https://github.com/ngneat/reactive-forms/issues/91 * Reproduction: https://codesandbox.io/embed/github/C0ZEN/ngneat-reactive-forms-error-issue-cs/tree/main/?autoresize=1&expanddevtools=1&fontsize=14&hidenavigation=1&theme=dark */ this.errorsSubject?.next(opts[0]); return super.setErrors(...opts); } mergeErrors(errors, opts) { this.setErrors(mergeErrors(this.errors, errors), opts); } removeError(key, opts) { this.setErrors(removeError(this.errors, key), opts); } hasErrorAndTouched(error, path) { return hasErrorAnd('touched', this, error, path); } hasErrorAndDirty(error, path) { return hasErrorAnd('dirty', this, error, path); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hcnJheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvcmVhY3RpdmUtZm9ybXMvc3JjL2xpYi9mb3JtLWFycmF5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsR0FFakIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsWUFBWSxFQUFjLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDdkUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsV0FBVyxFQUNYLFdBQVcsRUFDWCxvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGNBQWMsRUFDZCxhQUFhLEVBQ2IsWUFBWSxHQUNiLE1BQU0sUUFBUSxDQUFDO0FBUWhCLE1BQU0sT0FBTyxTQUtYLFNBQVEsZ0JBQWdCO0lBeUJ4QixZQUNTLFFBQXdCLEVBQy9CLGVBQW1FLEVBQ25FLGNBQWtFO1FBRWxFLEtBQUssQ0FBQyxRQUFRLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBSjFDLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBdEJ6QixpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDdEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO1FBQ3RDLGtCQUFhLEdBQUcsSUFBSSxPQUFPLEVBQTJCLENBQUM7UUFFdEQsV0FBTSxHQUFHLElBQUksQ0FBQyxZQUFZO2FBQ2hDLFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDdkIsV0FBTSxHQUFHLElBQUksQ0FBQyxZQUFZO2FBQ2hDLFlBQVksRUFBRTthQUNkLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFDdkIsV0FBTSxHQUFH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Q0FDVCxHQUFXLEVBQ1gsSUFBbUQ7UUFFbkQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsa0JBQWtCLENBQ2hCLEtBQWEsRUFDYixJQUFrRDtRQUVsRCxPQUFPLFdBQVcsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsZ0JBQWdCLENBQ2QsS0FBYSxFQUNiLElBQWtEO1FBRWxELE9BQU8sV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgVW50eXBlZEZvcm1BcnJheSxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0NvbnRyb2xzT2YsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFZhbHVlc09mfSBmcm9tICcuLic7XG5pbXBvcnQge1xuICBjb250cm9sVmFsdWVDaGFuZ2VzJCxcbiAgY29udHJvbFN0YXR1cyQsXG4gIGNvbnRyb2xFcnJvckNoYW5nZXMkLFxuICBoYXNFcnJvckFuZCxcbiAgbWVyZ2VFcnJvcnMsXG4gIHJlbW92ZUVycm9yLFxuICBjb250cm9sRGlzYWJsZWRXaGlsZSxcbiAgY29udHJvbEVuYWJsZWRXaGlsZSxcbiAgZGlzYWJsZUNvbnRyb2wsXG4gIGVuYWJsZUNvbnRyb2wsXG4gIG1hcmtBbGxEaXJ0eSxcbn0gZnJvbSAnLi9jb3JlJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAnLi90eXBlcyc7XG5cbnR5cGUgVmFsdWVPZkNvbnRyb2w8VD4gPSBUIGV4dGVuZHMgRm9ybUNvbnRyb2w8aW5mZXIgQz5cbiAgPyAgQ1xuICA6IFQgZXh0ZW5kcyBGb3JtR3JvdXA8aW5mZXIgQz4gPyBWYWx1ZXNPZjxDPiA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBGb3JtQXJyYXk8XG4gIFQsXG4gIENvbnRyb2wgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2wgPSBUIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55PlxuICAgID8gRm9ybUdyb3VwPENvbnRyb2xzT2Y8VD4+XG4gICAgOiBGb3JtQ29udHJvbDxUPlxuPiBleHRlbmRzIFVudHlwZWRGb3JtQXJyYXkge1xuICByZWFkb25seSB2YWx1ZSE6IFZhbHVlT2ZDb250cm9sPENvbnRyb2w+W107XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlcyE6IE9ic2VydmFibGU8VmFsdWVPZkNvbnRyb2w8Q29udHJvbD5bXT47XG5cbiAgcHJpdmF0ZSB0b3VjaENoYW5nZXMgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIGRpcnR5Q2hhbmdlcyA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgZXJyb3JzU3ViamVjdCA9IG5ldyBTdWJqZWN0PFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPigpO1xuXG4gIHJlYWRvbmx5IHRvdWNoJCA9IHRoaXMudG91Y2hDaGFuZ2VzXG4gICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlYWRvbmx5IGRpcnR5JCA9IHRoaXMuZGlydHlDaGFuZ2VzXG4gICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlYWRvbmx5IHZhbHVlJCA9IGNvbnRyb2xWYWx1ZUNoYW5nZXMkPEFycmF5PFZhbHVlT2ZDb250cm9sPENvbnRyb2w+Pj4odGhpcyk7XG4gIHJlYWRvbmx5IGRpc2FibGVkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICdkaXNhYmxlZCcpO1xuICByZWFkb25seSBlbmFibGVkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICdlbmFibGVkJyk7XG4gIHJlYWRvbmx5IGludmFsaWQkID0gY29udHJvbFN0YXR1cyQodGhpcywgJ2ludmFsaWQnKTtcbiAgcmVhZG9ubHkgdmFsaWQkID0gY29udHJvbFN0YXR1cyQodGhpcywgJ3ZhbGlkJyk7XG4gIHJlYWRvbmx5IHN0YXR1cyQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnc3RhdHVzJyk7XG4gIHJlYWRvbmx5IGVycm9ycyQgPSBjb250cm9sRXJyb3JDaGFuZ2VzJChcbiAgICB0aGlzLFxuICAgIHRoaXMuZXJyb3JzU3ViamVjdC5hc09ic2VydmFibGUoKVxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBjb250cm9sczogQXJyYXk8Q29udHJvbD4sXG4gICAgdmFsaWRhdG9yT3JPcHRzPzogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPHR5cGVvZiBVbnR5cGVkRm9ybUFycmF5PlsxXSxcbiAgICBhc3luY1ZhbGlkYXRvcj86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVW50eXBlZEZvcm1BcnJheT5bMl1cbiAgKSB7XG4gICAgc3VwZXIoY29udHJvbHMsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpO1xuICB9XG5cbiAgc2VsZWN0PFI+KG1hcEZuOiAoc3RhdGU6IFZhbHVlT2ZDb250cm9sPENvbnRyb2w+W10pID0+IFIpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZSQucGlwZShtYXAobWFwRm4pLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTtcbiAgfVxuXG4gIHNldFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFZhbHVlT2ZDb250cm9sPENvbnRyb2w+W10+LFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ3NldFZhbHVlJ10+WzFdXG4gICk6IFN1YnNjcmlwdGlvbjtcbiAgc2V0VmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IFZhbHVlT2ZDb250cm9sPENvbnRyb2w+W10sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsnc2V0VmFsdWUnXT5bMV1cbiAgKTogdm9pZDtcbiAgc2V0VmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IGFueSxcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydzZXRWYWx1ZSddPlsxXVxuICApOiBhbnkge1xuICAgIGlmIChpc09ic2VydmFibGUodmFsdWVPck9ic2VydmFibGUpKSB7XG4gICAgICByZXR1cm4gdmFsdWVPck9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZSkgPT5cbiAgICAgICAgc3VwZXIuc2V0VmFsdWUodmFsdWUgYXMgVFtdLCBvcHRpb25zKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZU9yT2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwYXRjaFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPERlZXBQYXJ0aWFsPFZhbHVlT2ZDb250cm9sPENvbnRyb2w+PltdPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydwYXRjaFZhbHVlJ10+WzFdXG4gICk6IFN1YnNjcmlwdGlvbjtcbiAgcGF0Y2hWYWx1ZShcbiAgICB2YWx1ZU9yT2JzZXJ2YWJsZTogRGVlcFBhcnRpYWw8VmFsdWVPZkNvbnRyb2w8Q29udHJvbD4+W10sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsncGF0Y2hWYWx1ZSddPlsxXVxuICApOiB2b2lkO1xuICBwYXRjaFZhbHVlKHZhbHVlT3JPYnNlcnZhYmxlOiBhbnksIG9wdGlvbnM/OiBhbnkpOiBhbnkge1xuICAgIGlmIChpc09ic2VydmFibGUodmFsdWVPck9ic2VydmFibGUpKSB7XG4gICAgICByZXR1cm4gdmFsdWVPck9ic2VydmFibGUuc3Vic2NyaWJlKCh2YWx1ZSkgPT5cbiAgICAgICAgc3VwZXIucGF0Y2hWYWx1ZSh2YWx1ZSBhcyBUW10sIG9wdGlvbnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN1cGVyLnBhdGNoVmFsdWUodmFsdWVPck9ic2VydmFibGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0UmF3VmFsdWUoKTogVmFsdWVPZkNvbnRyb2w8Q29udHJvbD5bXSB7XG4gICAgcmV0dXJuIHN1cGVyLmdldFJhd1ZhbHVlKCk7XG4gIH1cblxuICBwdXNoKGNvbnRyb2w6IENvbnRyb2wsIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ3B1c2gnXT5bMV0pIHtcbiAgICByZXR1cm4gc3VwZXIucHVzaChjb250cm9sLCBvcHRpb25zKTtcbiAgfVxuXG4gIGluc2VydChpbmRleDogbnVtYmVyLCBjb250cm9sOiBDb250cm9sLCBvcHRpb25zPzogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydpbnNlcnQnXT5bMl0pIHtcbiAgICByZXR1cm4gc3VwZXIuaW5zZXJ0KGluZGV4LCBjb250cm9sLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNldENvbnRyb2woaW5kZXg6IG51bWJlciwgY29udHJvbDogQ29udHJvbCwgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsnc2V0Q29udHJvbCddPlsyXSkge1xuICAgIHJldHVybiBzdXBlci5zZXRDb250cm9sKGluZGV4LCBjb250cm9sLCBvcHRpb25zKTtcbiAgfVxuXG4gIGF0KGluZGV4OiBudW1iZXIpOiBDb250cm9sIHtcbiAgICByZXR1cm4gc3VwZXIuYXQoaW5kZXgpIGFzIENvbnRyb2w7XG4gIH1cblxuICByZW1vdmUodmFsdWU6IFZhbHVlT2ZDb250cm9sPENvbnRyb2w+LCAgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsncmVtb3ZlQXQnXT5bMV0pOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZVdoZW4oKHYpID0+IHYudmFsdWUgPT09IHZhbHVlKTtcbiAgfVxuXG4gIHJlbW92ZVdoZW4ocHJlZGljYXRlOiAoZWxlbWVudDogQ29udHJvbCkgPT4gYm9vbGVhbiwgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsncmVtb3ZlQXQnXT5bMV0pOiB2b2lkIHtcbiAgICBmb3IgKGxldCBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgaWYgKHByZWRpY2F0ZSh0aGlzLmF0KGkpKSkge1xuICAgICAgICB0aGlzLnJlbW92ZUF0KGksIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG1hcmtBc1RvdWNoZWQoXG4gICAgLi4ub3B0czogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydtYXJrQXNUb3VjaGVkJ10+XG4gICk6IFJldHVyblR5cGU8VW50eXBlZEZvcm1BcnJheVsnbWFya0FzVG91Y2hlZCddPiB7XG4gICAgc3VwZXIubWFya0FzVG91Y2hlZCguLi5vcHRzKTtcbiAgICB0aGlzLnRvdWNoQ2hhbmdlcy5uZXh0KHRydWUpO1xuICB9XG5cbiAgbWFya0FzVW50b3VjaGVkKFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsnbWFya0FzVW50b3VjaGVkJ10+XG4gICk6IFJldHVyblR5cGU8VW50eXBlZEZvcm1BcnJheVsnbWFya0FzVW50b3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNVbnRvdWNoZWQoLi4ub3B0cyk7XG4gICAgdGhpcy50b3VjaENoYW5nZXMubmV4dChmYWxzZSk7XG4gIH1cblxuICBtYXJrQXNQcmlzdGluZShcbiAgICAuLi5vcHRzOiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ21hcmtBc1ByaXN0aW5lJ10+XG4gICk6IFJldHVyblR5cGU8VW50eXBlZEZvcm1BcnJheVsnbWFya0FzUHJpc3RpbmUnXT4ge1xuICAgIHN1cGVyLm1hcmtBc1ByaXN0aW5lKC4uLm9wdHMpO1xuICAgIHRoaXMuZGlydHlDaGFuZ2VzLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgbWFya0FzRGlydHkoXG4gICAgLi4ub3B0czogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydtYXJrQXNEaXJ0eSddPlxuICApOiBSZXR1cm5UeXBlPFVudHlwZWRGb3JtQXJyYXlbJ21hcmtBc0RpcnR5J10+IHtcbiAgICBzdXBlci5tYXJrQXNEaXJ0eSguLi5vcHRzKTtcbiAgICB0aGlzLmRpcnR5Q2hhbmdlcy5uZXh0KHRydWUpO1xuICB9XG5cbiAgbWFya0FsbEFzRGlydHkoKTogdm9pZCB7XG4gICAgbWFya0FsbERpcnR5KHRoaXMpO1xuICB9XG5cbiAgc2V0RW5hYmxlKGVuYWJsZSA9IHRydWUsIG9wdHM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ2VuYWJsZSddPlswXSkge1xuICAgIGVuYWJsZUNvbnRyb2wodGhpcywgZW5hYmxlLCBvcHRzKTtcbiAgfVxuXG4gIHNldERpc2FibGUoZGlzYWJsZSA9IHRydWUsIG9wdHM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ2Rpc2FibGUnXT5bMF0pIHtcbiAgICBkaXNhYmxlQ29udHJvbCh0aGlzLCBkaXNhYmxlLCBvcHRzKTtcbiAgfVxuXG4gIGRpc2FibGVkV2hpbGUoXG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydkaXNhYmxlJ10+WzBdXG4gICkge1xuICAgIHJldHVybiBjb250cm9sRGlzYWJsZWRXaGlsZSh0aGlzLCBvYnNlcnZhYmxlLCBvcHRpb25zKTtcbiAgfVxuXG4gIGVuYWJsZWRXaGlsZShcbiAgICBvYnNlcnZhYmxlOiBPYnNlcnZhYmxlPGJvb2xlYW4+LFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ2VuYWJsZSddPlswXVxuICApIHtcbiAgICByZXR1cm4gY29udHJvbEVuYWJsZWRXaGlsZSh0aGlzLCBvYnNlcnZhYmxlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHJlc2V0KFxuICAgIGZvcm1TdGF0ZT86IFZhbHVlT2ZDb250cm9sPENvbnRyb2w+W10sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsncmVzZXQnXT5bMV1cbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVzZXQoZm9ybVN0YXRlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNldFZhbGlkYXRvcnMoXG4gICAgbmV3VmFsaWRhdG9yczogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydzZXRWYWxpZGF0b3JzJ10+WzBdLFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHknXT5bMF1cbiAgKSB7XG4gICAgc3VwZXIuc2V0VmFsaWRhdG9ycyhuZXdWYWxpZGF0b3JzKTtcbiAgICBzdXBlci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0QXN5bmNWYWxpZGF0b3JzKFxuICAgIG5ld1ZhbGlkYXRvcjogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydzZXRBc3luY1ZhbGlkYXRvcnMnXT5bMF0sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsndXBkYXRlVmFsdWVBbmRWYWxpZGl0eSddPlswXVxuICApIHtcbiAgICBzdXBlci5zZXRBc3luY1ZhbGlkYXRvcnMobmV3VmFsaWRhdG9yKTtcbiAgICBzdXBlci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0RXJyb3I8RT4oLi4ucGFyYW1zOiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ2dldEVycm9yJ10+KTogRSB8IG51bGwge1xuICAgIHJldHVybiBzdXBlci5nZXRFcnJvciguLi5wYXJhbXMpO1xuICB9XG5cbiAgc2V0RXJyb3JzKC4uLm9wdHM6IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsnc2V0RXJyb3JzJ10+KSB7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVXNlIGFuIGVsdmlzIG9wZXJhdG9yIHRvIGF2b2lkIGEgdGhyb3cgd2hlbiB0aGUgY29udHJvbCBpcyB1c2VkIHdpdGggYW4gYXN5bmMgdmFsaWRhdG9yXG4gICAgICogV2hpY2ggd2lsbCBiZSBpbnN0YW50bHkgcmVzb2x2ZWQgKGxpa2Ugd2l0aCBgb2YobnVsbClgKVxuICAgICAqIEluIHN1Y2ggY2FzZSwgQW5ndWxhciB3aWxsIGNhbGwgdGhpcyBtZXRob2QgaW5zdGFudGx5IGJlZm9yZSBldmVuIGluc3RhbmNpbmcgdGhlIHByb3BlcnRpZXMgY2F1c2luZyB0aGUgdGhyb3dcbiAgICAgKiBDYW4gYmUgZWFzaWx5IHJlcHJvZHVjZWQgd2l0aCBhIHN0ZXAtYnktc3RlcCBkZWJ1ZyBvbmNlIGNvbXBpbGVkIHdoZW4gY2hlY2tpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogSXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZ25lYXQvcmVhY3RpdmUtZm9ybXMvaXNzdWVzLzkxXG4gICAgICogUmVwcm9kdWN0aW9uOiBodHRwczovL2NvZGVzYW5kYm94LmlvL2VtYmVkL2dpdGh1Yi9DMFpFTi9uZ25lYXQtcmVhY3RpdmUtZm9ybXMtZXJyb3ItaXNzdWUtY3MvdHJlZS9tYWluLz9hdXRvcmVzaXplPTEmZXhwYW5kZGV2dG9vbHM9MSZmb250c2l6ZT0xNCZoaWRlbmF2aWdhdGlvbj0xJnRoZW1lPWRhcmtcbiAgICAgKi9cbiAgICB0aGlzLmVycm9yc1N1YmplY3Q/Lm5leHQob3B0c1swXSk7XG4gICAgcmV0dXJuIHN1cGVyLnNldEVycm9ycyguLi5vcHRzKTtcbiAgfVxuXG4gIG1lcmdlRXJyb3JzKFxuICAgIGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwsXG4gICAgb3B0cz86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsnc2V0RXJyb3JzJ10+WzFdXG4gICkge1xuICAgIHRoaXMuc2V0RXJyb3JzKG1lcmdlRXJyb3JzKHRoaXMuZXJyb3JzLCBlcnJvcnMpLCBvcHRzKTtcbiAgfVxuXG4gIHJlbW92ZUVycm9yKFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9wdHM/OiBQYXJhbWV0ZXJzPFVudHlwZWRGb3JtQXJyYXlbJ3NldEVycm9ycyddPlsxXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLnNldEVycm9ycyhyZW1vdmVFcnJvcih0aGlzLmVycm9ycywga2V5KSwgb3B0cyk7XG4gIH1cblxuICBoYXNFcnJvckFuZFRvdWNoZWQoXG4gICAgZXJyb3I6IHN0cmluZyxcbiAgICBwYXRoPzogUGFyYW1ldGVyczxVbnR5cGVkRm9ybUFycmF5WydoYXNFcnJvciddPlsxXVxuICApOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzRXJyb3JBbmQoJ3RvdWNoZWQnLCB0aGlzLCBlcnJvciwgcGF0aCk7XG4gIH1cblxuICBoYXNFcnJvckFuZERpcnR5KFxuICAgIGVycm9yOiBzdHJpbmcsXG4gICAgcGF0aD86IFBhcmFtZXRlcnM8VW50eXBlZEZvcm1BcnJheVsnaGFzRXJyb3InXT5bMV1cbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGhhc0Vycm9yQW5kKCdkaXJ0eScsIHRoaXMsIGVycm9yLCBwYXRoKTtcbiAgfVxufVxuIl19