UNPKG

@ngneat/reactive-forms

Version:

(Angular Reactive) Forms with Benefits

109 lines 18.2 kB
import { UntypedFormControl, } from '@angular/forms'; import { isObservable, Subject } from 'rxjs'; import { distinctUntilChanged } from 'rxjs/operators'; import { controlValueChanges$, controlStatus$, controlDisabledWhile, controlEnabledWhile, disableControl, enableControl, mergeErrors, removeError, hasErrorAnd, controlErrorChanges$, } from './core'; export class FormControl extends UntypedFormControl { constructor(formState, validatorOrOpts, asyncValidator) { super(formState, validatorOrOpts, asyncValidator); 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()); } 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 this.value; } 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); } 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) { return hasErrorAnd('touched', this, error); } hasErrorAndDirty(error) { return hasErrorAnd('dirty', this, error); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9yZWFjdGl2ZS1mb3Jtcy9zcmMvbGliL2Zvcm0tY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEdBR25CLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFlBQVksRUFBYyxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RELE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsY0FBYyxFQUNkLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsV0FBVyxFQUNYLFdBQVcsRUFDWCxvQkFBb0IsR0FDckIsTUFBTSxRQUFRLENBQUM7QUFHaEIsTUFBTSxPQUFPLFdBQWUsU0FBUSxrQkFBa0I7SUF5QnBELFlBQ0UsU0FBeUIsRUFDekIsZUFBcUUsRUFDckUsY0FBb0U7UUFFcEUsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7UUExQjVDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVcsQ0FBQztRQUN0QyxpQkFBWSxHQUFHLElBQUksT0FBTyxFQUFXLENBQUM7UUFDdEMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBMkIsQ0FBQztRQUV0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7YUFDaEMsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVk7YUFDaEMsWUFBWSxFQUFFO2FBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUN2QixXQUFNLEdBQUcsb0JBQW9CLENBQUksSUFBSSxDQUFDLENBQUM7UUFDdkMsY0FBUyxHQUFH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RCxrQkFBa0IsQ0FBQyxLQUFhO1FBQzlCLE9BQU8sV0FBVyxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGdCQUFnQixDQUFDLEtBQWE7UUFDNUIsT0FBTyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBVbnR5cGVkRm9ybUNvbnRyb2wsXG4gIEFic3RyYWN0Q29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgY29udHJvbFZhbHVlQ2hhbmdlcyQsXG4gIGNvbnRyb2xTdGF0dXMkLFxuICBjb250cm9sRGlzYWJsZWRXaGlsZSxcbiAgY29udHJvbEVuYWJsZWRXaGlsZSxcbiAgZGlzYWJsZUNvbnRyb2wsXG4gIGVuYWJsZUNvbnRyb2wsXG4gIG1lcmdlRXJyb3JzLFxuICByZW1vdmVFcnJvcixcbiAgaGFzRXJyb3JBbmQsXG4gIGNvbnRyb2xFcnJvckNoYW5nZXMkLFxufSBmcm9tICcuL2NvcmUnO1xuaW1wb3J0IHsgQm94ZWRWYWx1ZSB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRm9ybUNvbnRyb2w8VD4gZXh0ZW5kcyBVbnR5cGVkRm9ybUNvbnRyb2wge1xuICByZWFkb25seSB2YWx1ZSE6IFQ7XG4gIHJlYWRvbmx5IHZhbHVlQ2hhbmdlcyE6IE9ic2VydmFibGU8VD47XG5cbiAgcHJpdmF0ZSB0b3VjaENoYW5nZXMgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIGRpcnR5Q2hhbmdlcyA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG4gIHByaXZhdGUgZXJyb3JzU3ViamVjdCA9IG5ldyBTdWJqZWN0PFZhbGlkYXRpb25FcnJvcnMgfCBudWxsPigpO1xuXG4gIHJlYWRvbmx5IHRvdWNoJCA9IHRoaXMudG91Y2hDaGFuZ2VzXG4gICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlYWRvbmx5IGRpcnR5JCA9IHRoaXMuZGlydHlDaGFuZ2VzXG4gICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XG4gIHJlYWRvbmx5IHZhbHVlJCA9IGNvbnRyb2xWYWx1ZUNoYW5nZXMkPFQ+KHRoaXMpO1xuICByZWFkb25seSBkaXNhYmxlZCQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnZGlzYWJsZWQnKTtcbiAgcmVhZG9ubHkgZW5hYmxlZCQgPSBjb250cm9sU3RhdHVzJCh0aGlzLCAnZW5hYmxlZCcpO1xuICByZWFkb25seSBpbnZhbGlkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICdpbnZhbGlkJyk7XG4gIHJlYWRvbmx5IHZhbGlkJCA9IGNvbnRyb2xTdGF0dXMkKHRoaXMsICd2YWxpZCcpO1xuICByZWFkb25seSBzdGF0dXMkID0gY29udHJvbFN0YXR1cyQodGhpcywgJ3N0YXR1cycpO1xuICByZWFkb25seSBlcnJvcnMkID0gY29udHJvbEVycm9yQ2hhbmdlcyQoXG4gICAgdGhpcyxcbiAgICB0aGlzLmVycm9yc1N1YmplY3QuYXNPYnNlcnZhYmxlKClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBmb3JtU3RhdGU/OiBCb3hlZFZhbHVlPFQ+LFxuICAgIHZhbGlkYXRvck9yT3B0cz86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVW50eXBlZEZvcm1Db250cm9sPlsxXSxcbiAgICBhc3luY1ZhbGlkYXRvcj86IENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgVW50eXBlZEZvcm1Db250cm9sPlsyXVxuICApIHtcbiAgICBzdXBlcihmb3JtU3RhdGUsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpO1xuICB9XG5cbiAgc2V0VmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IE9ic2VydmFibGU8VD4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRWYWx1ZSddPlsxXVxuICApOiBTdWJzY3JpcHRpb247XG4gIHNldFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBULFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0VmFsdWUnXT5bMV1cbiAgKTogdm9pZDtcbiAgc2V0VmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IGFueSxcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3NldFZhbHVlJ10+WzFdXG4gICk6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZU9yT2JzZXJ2YWJsZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZU9yT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHZhbHVlKSA9PlxuICAgICAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZSBhcyBULCBvcHRpb25zKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBzdXBlci5zZXRWYWx1ZSh2YWx1ZU9yT2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwYXRjaFZhbHVlKFxuICAgIHZhbHVlT3JPYnNlcnZhYmxlOiBPYnNlcnZhYmxlPFQ+LFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsncGF0Y2hWYWx1ZSddPlsxXVxuICApOiBTdWJzY3JpcHRpb247XG4gIHBhdGNoVmFsdWUoXG4gICAgdmFsdWVPck9ic2VydmFibGU6IFQsXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydwYXRjaFZhbHVlJ10+WzFdXG4gICk6IHZvaWQ7XG4gIHBhdGNoVmFsdWUodmFsdWVPck9ic2VydmFibGU6IGFueSwgb3B0aW9ucz86IGFueSk6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZU9yT2JzZXJ2YWJsZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZU9yT2JzZXJ2YWJsZS5zdWJzY3JpYmUoKHZhbHVlKSA9PlxuICAgICAgICBzdXBlci5wYXRjaFZhbHVlKHZhbHVlIGFzIFQsIG9wdGlvbnMpXG4gICAgICApO1xuICAgIH1cblxuICAgIHN1cGVyLnBhdGNoVmFsdWUodmFsdWVPck9ic2VydmFibGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0UmF3VmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gIH1cblxuICBtYXJrQXNUb3VjaGVkKFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydtYXJrQXNUb3VjaGVkJ10+XG4gICk6IFJldHVyblR5cGU8QWJzdHJhY3RDb250cm9sWydtYXJrQXNUb3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNUb3VjaGVkKC4uLm9wdHMpO1xuICAgIHRoaXMudG91Y2hDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gIH1cblxuICBtYXJrQXNVbnRvdWNoZWQoXG4gICAgLi4ub3B0czogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ21hcmtBc1VudG91Y2hlZCddPlxuICApOiBSZXR1cm5UeXBlPEFic3RyYWN0Q29udHJvbFsnbWFya0FzVW50b3VjaGVkJ10+IHtcbiAgICBzdXBlci5tYXJrQXNVbnRvdWNoZWQoLi4ub3B0cyk7XG4gICAgdGhpcy50b3VjaENoYW5nZXMubmV4dChmYWxzZSk7XG4gIH1cblxuICBtYXJrQXNQcmlzdGluZShcbiAgICAuLi5vcHRzOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnbWFya0FzUHJpc3RpbmUnXT5cbiAgKTogUmV0dXJuVHlwZTxBYnN0cmFjdENvbnRyb2xbJ21hcmtBc1ByaXN0aW5lJ10+IHtcbiAgICBzdXBlci5tYXJrQXNQcmlzdGluZSguLi5vcHRzKTtcbiAgICB0aGlzLmRpcnR5Q2hhbmdlcy5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIG1hcmtBc0RpcnR5KFxuICAgIC4uLm9wdHM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydtYXJrQXNEaXJ0eSddPlxuICApOiBSZXR1cm5UeXBlPEFic3RyYWN0Q29udHJvbFsnbWFya0FzRGlydHknXT4ge1xuICAgIHN1cGVyLm1hcmtBc0RpcnR5KC4uLm9wdHMpO1xuICAgIHRoaXMuZGlydHlDaGFuZ2VzLm5leHQodHJ1ZSk7XG4gIH1cblxuICBzZXRFbmFibGUoZW5hYmxlID0gdHJ1ZSwgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydlbmFibGUnXT5bMF0pIHtcbiAgICBlbmFibGVDb250cm9sKHRoaXMsIGVuYWJsZSwgb3B0cyk7XG4gIH1cblxuICBzZXREaXNhYmxlKGRpc2FibGUgPSB0cnVlLCBvcHRzPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ2Rpc2FibGUnXT5bMF0pIHtcbiAgICBkaXNhYmxlQ29udHJvbCh0aGlzLCBkaXNhYmxlLCBvcHRzKTtcbiAgfVxuXG4gIGRpc2FibGVkV2hpbGUoXG4gICAgb2JzZXJ2YWJsZTogT2JzZXJ2YWJsZTxib29sZWFuPixcbiAgICBvcHRpb25zPzogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ2Rpc2FibGUnXT5bMF1cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xEaXNhYmxlZFdoaWxlKHRoaXMsIG9ic2VydmFibGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgZW5hYmxlZFdoaWxlKFxuICAgIG9ic2VydmFibGU6IE9ic2VydmFibGU8Ym9vbGVhbj4sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydlbmFibGUnXT5bMF1cbiAgKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xFbmFibGVkV2hpbGUodGhpcywgb2JzZXJ2YWJsZSwgb3B0aW9ucyk7XG4gIH1cblxuICByZXNldChcbiAgICBmb3JtU3RhdGU/OiBULFxuICAgIG9wdGlvbnM/OiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsncmVzZXQnXT5bMV1cbiAgKTogdm9pZCB7XG4gICAgc3VwZXIucmVzZXQoZm9ybVN0YXRlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHNldFZhbGlkYXRvcnMoXG4gICAgbmV3VmFsaWRhdG9yczogUGFyYW1ldGVyczxBYnN0cmFjdENvbnRyb2xbJ3NldFZhbGlkYXRvcnMnXT5bMF0sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWyd1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5J10+WzBdXG4gICkge1xuICAgIHN1cGVyLnNldFZhbGlkYXRvcnMobmV3VmFsaWRhdG9ycyk7XG4gICAgc3VwZXIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTtcbiAgfVxuXG4gIHNldEFzeW5jVmFsaWRhdG9ycyhcbiAgICBuZXdWYWxpZGF0b3I6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRBc3luY1ZhbGlkYXRvcnMnXT5bMF0sXG4gICAgb3B0aW9ucz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWyd1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5J10+WzBdXG4gICkge1xuICAgIHN1cGVyLnNldEFzeW5jVmFsaWRhdG9ycyhuZXdWYWxpZGF0b3IpO1xuICAgIHN1cGVyLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkob3B0aW9ucyk7XG4gIH1cblxuICBnZXRFcnJvcjxFPiguLi5wYXJhbXM6IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydnZXRFcnJvciddPik6IEUgfCBudWxsIHtcbiAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3IoLi4ucGFyYW1zKTtcbiAgfVxuXG4gIHNldEVycm9ycyguLi5vcHRzOiBQYXJhbWV0ZXJzPEFic3RyYWN0Q29udHJvbFsnc2V0RXJyb3JzJ10+KSB7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uXG4gICAgICogVXNlIGFuIGVsdmlzIG9wZXJhdG9yIHRvIGF2b2lkIGEgdGhyb3cgd2hlbiB0aGUgY29udHJvbCBpcyB1c2VkIHdpdGggYW4gYXN5bmMgdmFsaWRhdG9yXG4gICAgICogV2hpY2ggd2lsbCBiZSBpbnN0YW50bHkgcmVzb2x2ZWQgKGxpa2Ugd2l0aCBgb2YobnVsbClgKVxuICAgICAqIEluIHN1Y2ggY2FzZSwgQW5ndWxhciB3aWxsIGNhbGwgdGhpcyBtZXRob2QgaW5zdGFudGx5IGJlZm9yZSBldmVuIGluc3RhbmNpbmcgdGhlIHByb3BlcnRpZXMgY2F1c2luZyB0aGUgdGhyb3dcbiAgICAgKiBDYW4gYmUgZWFzaWx5IHJlcHJvZHVjZWQgd2l0aCBhIHN0ZXAtYnktc3RlcCBkZWJ1ZyBvbmNlIGNvbXBpbGVkIHdoZW4gY2hlY2tpbmcgdGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBjb25zdHJ1Y3RvclxuICAgICAqXG4gICAgICogSXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9uZ25lYXQvcmVhY3RpdmUtZm9ybXMvaXNzdWVzLzkxXG4gICAgICogUmVwcm9kdWN0aW9uOiBodHRwczovL2NvZGVzYW5kYm94LmlvL2VtYmVkL2dpdGh1Yi9DMFpFTi9uZ25lYXQtcmVhY3RpdmUtZm9ybXMtZXJyb3ItaXNzdWUtY3MvdHJlZS9tYWluLz9hdXRvcmVzaXplPTEmZXhwYW5kZGV2dG9vbHM9MSZmb250c2l6ZT0xNCZoaWRlbmF2aWdhdGlvbj0xJnRoZW1lPWRhcmtcbiAgICAgKi9cbiAgICB0aGlzLmVycm9yc1N1YmplY3Q/Lm5leHQob3B0c1swXSk7XG4gICAgcmV0dXJuIHN1cGVyLnNldEVycm9ycyguLi5vcHRzKTtcbiAgfVxuXG4gIG1lcmdlRXJyb3JzKFxuICAgIGVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwsXG4gICAgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRFcnJvcnMnXT5bMV1cbiAgKSB7XG4gICAgdGhpcy5zZXRFcnJvcnMobWVyZ2VFcnJvcnModGhpcy5lcnJvcnMsIGVycm9ycyksIG9wdHMpO1xuICB9XG5cbiAgcmVtb3ZlRXJyb3IoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgb3B0cz86IFBhcmFtZXRlcnM8QWJzdHJhY3RDb250cm9sWydzZXRFcnJvcnMnXT5bMV1cbiAgKTogdm9pZCB7XG4gICAgdGhpcy5zZXRFcnJvcnMocmVtb3ZlRXJyb3IodGhpcy5lcnJvcnMsIGtleSksIG9wdHMpO1xuICB9XG5cbiAgaGFzRXJyb3JBbmRUb3VjaGVkKGVycm9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzRXJyb3JBbmQoJ3RvdWNoZWQnLCB0aGlzLCBlcnJvcik7XG4gIH1cblxuICBoYXNFcnJvckFuZERpcnR5KGVycm9yOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzRXJyb3JBbmQoJ2RpcnR5JywgdGhpcywgZXJyb3IpO1xuICB9XG59XG4iXX0=