UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

198 lines 27.2 kB
import { coerceAttrBoolean } from '@alauda/ui'; import { ChangeDetectorRef, Directive, inject, Input, QueryList, ViewChildren, } from '@angular/core'; import { FormGroupDirective, NgControl, NgForm, } from '@angular/forms'; import { assocPath, identity, mergeDeepRight, path } from 'ramda'; import { ReplaySubject, startWith, switchMap, Subject, takeUntil, debounceTime, merge, combineLatest, filter, map, tap, take, of, } from 'rxjs'; import * as i0 from "@angular/core"; export function createNestedFormControl({ autoEmitChange = false, asyncValidator = false, } = {}) { return class NestedFormControl extends BaseNestedFormControl { constructor() { super(...arguments); this.autoEmitChange = autoEmitChange; this.asyncValidator = asyncValidator; } }; } export class BaseNestedFormControl { get disabled() { return this._disabled; } set disabled(val) { this._disabled = coerceAttrBoolean(val); } constructor() { this._disabled = false; this.model = null; this.submitted = false; this.autoEmitChange = false; this.asyncValidator = false; this.cdr = inject(ChangeDetectorRef); this.destroy$$ = new Subject(); this.hostForm = inject(NgForm, { optional: true }) ?? inject(FormGroupDirective, { optional: true }); if (this.hostForm) { this.hostForm.ngSubmit.pipe(takeUntil(this.destroy$$)).subscribe(() => { this.submitted = this.hostForm.submitted; this.onSubmitted?.(); this.cdr.markForCheck(); }); } } ngAfterViewInit() { this.controls.changes .pipe(startWith(this.controls), switchMap((controls) => controls.length ? merge(...controls.toArray().map(control => control.statusChanges)).pipe(startWith(null)) : of(null)), debounceTime(0)) .subscribe(() => { this.onValidatorChange?.(); }); if (this.autoEmitChange) { this.controls.changes .pipe(startWith(this.controls), switchMap((controls) => merge(...controls.toArray().map(control => control.valueChanges)))) .pipe(debounceTime(0)) .subscribe(() => { this.emitModel(this.model); }); } } ngOnDestroy() { this.destroy$$.next(); this.destroy$$.complete(); } registerOnValidatorChange(fn) { this.onValidatorChange = fn; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; this.cdr.markForCheck(); } writeValue(value) { this.model = this.valueIn(value); this.cdr.markForCheck(); } validate(_control) { const getErrors = () => { const errors = this.controls?.reduce((acc, control) => { if (control.errors) { return mergeDeepRight(acc, control.name ? { [control.name]: control.errors } : control.errors); } return acc; }, {}); return errors && Object.keys(errors).length ? errors : null; }; return this.asyncValidator ? combineLatest((this.controls?.toArray() ?? []).map(control => control.statusChanges.pipe(startWith(control.status)))).pipe(debounceTime(0), filter(statuses => statuses.includes('INVALID') || !statuses.includes('PENDING')), take(1), map(() => getErrors()), tap(() => { this.cdr.markForCheck(); })) : getErrors(); } emitModel(model = this.model) { this.model = model; this.emitValue(this.modelOut(this.model)); } emitValue(value) { if (this.onChange) { this.onChange(value); } } valueIn(value) { return value; } modelOut(model) { return model; } static { this.ɵfac = function BaseNestedFormControl_Factory(t) { return new (t || BaseNestedFormControl)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControl, viewQuery: function BaseNestedFormControl_Query(rf, ctx) { if (rf & 1) { i0.ɵɵviewQuery(NgControl, 5); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.controls = _t); } }, inputs: { disabled: "disabled" } }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControl, [{ type: Directive }], () => [], { controls: [{ type: ViewChildren, args: [NgControl] }], disabled: [{ type: Input }] }); })(); /** * @deprecated use {@link BaseNestedFormControl} instead. */ export class BaseNestedFormControlPure extends BaseNestedFormControl { constructor() { super(); this.model$ = new ReplaySubject(1); this.model$.subscribe(model => { this.model = model; this.cdr.markForCheck(); }); } writeValue(value) { this.model$.next(this.valueIn(value)); } emitValue(value) { if (this.onChange) { this.onChange(value); this.writeValue(value); } } static { this.ɵfac = function BaseNestedFormControlPure_Factory(t) { return new (t || BaseNestedFormControlPure)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: BaseNestedFormControlPure, features: [i0.ɵɵInheritDefinitionFeature] }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(BaseNestedFormControlPure, [{ type: Directive }], () => [], null); })(); function collectPaths(mapper, parent) { return Object.entries(mapper).reduce((acc, [key, value]) => { const path = typeof value === 'string' ? value.split('.') : value; if (Array.isArray(path)) { acc.push([parent.concat(key), path]); return acc; } return acc.concat(collectPaths(path, parent.concat(key))); }, []); } export function dataTransfer(mapper) { const tuples = collectPaths(mapper, []); let _source; let _target = {}; return [ source => { _source = source; return tuples.reduce((acc, [left, right]) => { const newValue = path(right, source); if (path(left, acc) === newValue) { return acc; } return (_target = assocPath(left, newValue, acc)); }, _target); }, target => { _target = target; return tuples.reduce((acc, [left, right]) => { const newValue = path(left, target); if (path(right, acc) === newValue) { return acc; } return (_source = assocPath(right, newValue, acc)); }, _source); }, ]; } function parsePath(path) { return typeof path === 'string' ? path.split('.') : path; } export function copyValue(from, to, mapper = identity) { const fromPath = parsePath(from); const toPath = parsePath(to); return (object) => assocPath(toPath, mapper(path(fromPath, object)), object); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvcmUvYWJzdHJhY3QvYmFzZS1uZXN0ZWQtZm9ybS1jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMvQyxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxNQUFNLEVBQ04sS0FBSyxFQUVMLFNBQVMsRUFDVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUdMLGtCQUFrQixFQUNsQixTQUFTLEVBQ1QsTUFBTSxHQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNsRSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFNBQVMsRUFDVCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLGFBQWEsRUFDYixNQUFNLEVBQ04sR0FBRyxFQUNILEdBQUcsRUFDSCxJQUFJLEVBQ0osRUFBRSxHQUNILE1BQU0sTUFBTSxDQUFDOztBQUVkLE1BQU0sVUFBVSx1QkFBdUIsQ0FBVyxFQUNoRCxjQUFjLEdBQUcsS0FBSyxFQUN0QixjQUFjLEdBQUcsS0FBSyxNQUlwQixFQUFFO0lBRUosT0FBTyxNQUFNLGlCQUFrQixTQUFRLHFCQUEyQjtRQUEzRDs7WUFDYyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztZQUNoQyxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUNyRCxDQUFDO0tBQUEsQ0FBQztBQUNKLENBQUM7QUFHRCxNQUFNLE9BQU8scUJBQXFCO0lBTWhDLElBQ0ksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsR0FBaUI7UUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBb0JEO1FBbEJRLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFPMUIsVUFBSyxHQUFNLElBQUksQ0FBQztRQUNoQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRVIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsUUFBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2hDLGFBQVEsR0FDaEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUcvQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BFLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPO2FBQ2xCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixTQUFTLENBQUMsQ0FBQyxRQUE4QixFQUFFLEVBQUUsQ0FDM0MsUUFBUSxDQUFDLE1BQU07WUFDYixDQUFDLENBQUMsS0FBSyxDQUNILEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FDNUQsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQ2IsRUFDRCxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQ2hCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU87aUJBQ2xCLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUN4QixTQUFTLENBQUMsQ0FBQyxRQUE4QixFQUFFLEVBQUUsQ0FDM0MsS0FBSyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUNsRSxDQUNGO2lCQUNBLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3JCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELHlCQUF5QixDQUFDLEVBQWM7UUFDdEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsRUFBa0I7UUFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEVBQWM7UUFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFRO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxRQUFRLENBQ04sUUFBMEI7UUFFMUIsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFO1lBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxFQUFFO2dCQUNwRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxjQUFjLENBQ25CLEdBQUcsRUFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbkUsQ0FBQztnQkFDSixDQUFDO2dCQUNELE9BQU8sR0FBRyxDQUFDO1lBQ2IsQ0FBQyxFQUFFLEVBQXNCLENBQUMsQ0FBQztZQUUzQixPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDOUQsQ0FBQyxDQUFDO1FBRUYsT0FBTyxJQUFJLENBQUMsY0FBYztZQUN4QixDQUFDLENBQUMsYUFBYSxDQUNYLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDN0MsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUN0RCxDQUNGLENBQUMsSUFBSSxDQUNKLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFDZixNQUFNLENBQ0osUUFBUSxDQUFDLEVBQUUsQ0FDVCxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FDaEUsRUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQ3RCLEdBQUcsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1AsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FDSDtZQUNILENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsU0FBUyxDQUFDLFFBQVcsSUFBSSxDQUFDLEtBQUs7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxTQUFTLENBQUMsS0FBUTtRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRVMsT0FBTyxDQUFDLEtBQVE7UUFDeEIsT0FBTyxLQUFZLENBQUM7SUFDdEIsQ0FBQztJQUVTLFFBQVEsQ0FBQyxLQUFRO1FBQ3pCLE9BQU8sS0FBWSxDQUFDO0lBQ3RCLENBQUM7c0ZBNUpVLHFCQUFxQjtvRUFBckIscUJBQXFCOzJCQUdsQixTQUFTOzs7Ozs7aUZBSFoscUJBQXFCO2NBRGpDLFNBQVM7b0JBS0UsUUFBUTtrQkFEakIsWUFBWTttQkFBQyxTQUFTO1lBSW5CLFFBQVE7a0JBRFgsS0FBSzs7QUF5SlI7O0dBRUc7QUFFSCxNQUFNLE9BQU8seUJBQW9DLFNBQVEscUJBR3hEO0lBR0M7UUFDRSxLQUFLLEVBQUUsQ0FBQztRQUhWLFdBQU0sR0FBRyxJQUFJLGFBQWEsQ0FBSSxDQUFDLENBQUMsQ0FBQztRQUsvQixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVRLFVBQVUsQ0FBQyxLQUFRO1FBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRVEsU0FBUyxDQUFDLEtBQVE7UUFDekIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDOzBGQXhCVSx5QkFBeUI7b0VBQXpCLHlCQUF5Qjs7aUZBQXpCLHlCQUF5QjtjQURyQyxTQUFTOztBQW9DVixTQUFTLFlBQVksQ0FBQyxNQUFjLEVBQUUsTUFBZ0I7SUFDcEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1FBQ3pELE1BQU0sSUFBSSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2xFLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckMsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUQsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ1QsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBSTFCLE1BQVM7SUFDVCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLElBQUksT0FBVSxDQUFDO0lBQ2YsSUFBSSxPQUFPLEdBQU0sRUFBTyxDQUFDO0lBQ3pCLE9BQU87UUFDTCxNQUFNLENBQUMsRUFBRTtZQUNQLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDakIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBVSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBRTlDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDakMsT0FBTyxHQUFHLENBQUM7Z0JBQ2IsQ0FBQztnQkFFRCxPQUFPLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBYSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2QsQ0FBQztRQUNELE1BQU0sQ0FBQyxFQUFFO1lBQ1AsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNqQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFVLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFN0MsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNsQyxPQUFPLEdBQUcsQ0FBQztnQkFDYixDQUFDO2dCQUVELE9BQU8sQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFhLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFVO0lBQzNCLE9BQU8sT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDM0QsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQ3ZCLElBQVUsRUFDVixFQUFRLEVBQ1IsU0FBMEIsUUFBUTtJQUVsQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxNQUFTLEVBQUUsRUFBRSxDQUNuQixTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvZXJjZUF0dHJCb29sZWFuIH0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgRGlyZWN0aXZlLFxuICBpbmplY3QsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIFF1ZXJ5TGlzdCxcbiAgVmlld0NoaWxkcmVuLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFic3RyYWN0Q29udHJvbCxcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEZvcm1Hcm91cERpcmVjdGl2ZSxcbiAgTmdDb250cm9sLFxuICBOZ0Zvcm0sXG4gIFZhbGlkYXRpb25FcnJvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGFzc29jUGF0aCwgaWRlbnRpdHksIG1lcmdlRGVlcFJpZ2h0LCBwYXRoIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHtcbiAgUmVwbGF5U3ViamVjdCxcbiAgc3RhcnRXaXRoLFxuICBzd2l0Y2hNYXAsXG4gIFN1YmplY3QsXG4gIHRha2VVbnRpbCxcbiAgZGVib3VuY2VUaW1lLFxuICBtZXJnZSxcbiAgT2JzZXJ2YWJsZSxcbiAgY29tYmluZUxhdGVzdCxcbiAgZmlsdGVyLFxuICBtYXAsXG4gIHRhcCxcbiAgdGFrZSxcbiAgb2YsXG59IGZyb20gJ3J4anMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTmVzdGVkRm9ybUNvbnRyb2w8ViwgTSA9IFY+KHtcbiAgYXV0b0VtaXRDaGFuZ2UgPSBmYWxzZSxcbiAgYXN5bmNWYWxpZGF0b3IgPSBmYWxzZSxcbn06IHtcbiAgYXV0b0VtaXRDaGFuZ2U/OiBib29sZWFuO1xuICBhc3luY1ZhbGlkYXRvcj86IGJvb2xlYW47XG59ID0ge30pOiAvLyB3b3JrYXJvdW5kOiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMwMzU1XG5uZXcgKCkgPT4gQmFzZU5lc3RlZEZvcm1Db250cm9sPFYsIE0+IHtcbiAgcmV0dXJuIGNsYXNzIE5lc3RlZEZvcm1Db250cm9sIGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sPFYsIE0+IHtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXV0b0VtaXRDaGFuZ2UgPSBhdXRvRW1pdENoYW5nZTtcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmNWYWxpZGF0b3IgPSBhc3luY1ZhbGlkYXRvcjtcbiAgfTtcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgY2xhc3MgQmFzZU5lc3RlZEZvcm1Db250cm9sPFYsIE0gPSBWPlxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3JcbntcbiAgQFZpZXdDaGlsZHJlbihOZ0NvbnRyb2wpXG4gIHByb3RlY3RlZCBjb250cm9sczogUXVlcnlMaXN0PE5nQ29udHJvbD47XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCkge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIHNldCBkaXNhYmxlZCh2YWw6IGJvb2xlYW4gfCAnJykge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQXR0ckJvb2xlYW4odmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG5cbiAgb25WYWxpZGF0b3JDaGFuZ2U6ICgpID0+IHZvaWQ7XG4gIG9uQ2hhbmdlOiAoXzogVikgPT4gdm9pZDtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkO1xuICBvblN1Ym1pdHRlZDogKCkgPT4gdm9pZDtcblxuICBtb2RlbDogTSA9IG51bGw7XG4gIHN1Ym1pdHRlZCA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBhdXRvRW1pdENoYW5nZSA9IGZhbHNlO1xuICBwcm90ZWN0ZWQgYXN5bmNWYWxpZGF0b3IgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCBkZXN0cm95JCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgaG9zdEZvcm0gPVxuICAgIGluamVjdChOZ0Zvcm0sIHsgb3B0aW9uYWw6IHRydWUgfSkgPz9cbiAgICBpbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0aGlzLmhvc3RGb3JtKSB7XG4gICAgICB0aGlzLmhvc3RGb3JtLm5nU3VibWl0LnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQkKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSB0aGlzLmhvc3RGb3JtLnN1Ym1pdHRlZDtcbiAgICAgICAgdGhpcy5vblN1Ym1pdHRlZD8uKCk7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY29udHJvbHMuY2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2xzKSxcbiAgICAgICAgc3dpdGNoTWFwKChjb250cm9sczogUXVlcnlMaXN0PE5nQ29udHJvbD4pID0+XG4gICAgICAgICAgY29udHJvbHMubGVuZ3RoXG4gICAgICAgICAgICA/IG1lcmdlKFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2xzLnRvQXJyYXkoKS5tYXAoY29udHJvbCA9PiBjb250cm9sLnN0YXR1c0NoYW5nZXMpLFxuICAgICAgICAgICAgICApLnBpcGUoc3RhcnRXaXRoKG51bGwpKVxuICAgICAgICAgICAgOiBvZihudWxsKSxcbiAgICAgICAgKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMub25WYWxpZGF0b3JDaGFuZ2U/LigpO1xuICAgICAgfSk7XG5cbiAgICBpZiAodGhpcy5hdXRvRW1pdENoYW5nZSkge1xuICAgICAgdGhpcy5jb250cm9scy5jaGFuZ2VzXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHN0YXJ0V2l0aCh0aGlzLmNvbnRyb2xzKSxcbiAgICAgICAgICBzd2l0Y2hNYXAoKGNvbnRyb2xzOiBRdWVyeUxpc3Q8TmdDb250cm9sPikgPT5cbiAgICAgICAgICAgIG1lcmdlKC4uLmNvbnRyb2xzLnRvQXJyYXkoKS5tYXAoY29udHJvbCA9PiBjb250cm9sLnZhbHVlQ2hhbmdlcykpLFxuICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICAgLnBpcGUoZGVib3VuY2VUaW1lKDApKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXRNb2RlbCh0aGlzLm1vZGVsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95JCQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQkLmNvbXBsZXRlKCk7XG4gIH1cblxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblZhbGlkYXRvckNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IFYpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IFYpIHtcbiAgICB0aGlzLm1vZGVsID0gdGhpcy52YWx1ZUluKHZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHZhbGlkYXRlKFxuICAgIF9jb250cm9sPzogQWJzdHJhY3RDb250cm9sLFxuICApOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB8IE9ic2VydmFibGU8VmFsaWRhdGlvbkVycm9ycyB8IG51bGw+IHtcbiAgICBjb25zdCBnZXRFcnJvcnMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvcnMgPSB0aGlzLmNvbnRyb2xzPy5yZWR1Y2UoKGFjYywgY29udHJvbCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5lcnJvcnMpIHtcbiAgICAgICAgICByZXR1cm4gbWVyZ2VEZWVwUmlnaHQoXG4gICAgICAgICAgICBhY2MsXG4gICAgICAgICAgICBjb250cm9sLm5hbWUgPyB7IFtjb250cm9sLm5hbWVdOiBjb250cm9sLmVycm9ycyB9IDogY29udHJvbC5lcnJvcnMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwge30gYXMgVmFsaWRhdGlvbkVycm9ycyk7XG5cbiAgICAgIHJldHVybiBlcnJvcnMgJiYgT2JqZWN0LmtleXMoZXJyb3JzKS5sZW5ndGggPyBlcnJvcnMgOiBudWxsO1xuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5hc3luY1ZhbGlkYXRvclxuICAgICAgPyBjb21iaW5lTGF0ZXN0KFxuICAgICAgICAgICh0aGlzLmNvbnRyb2xzPy50b0FycmF5KCkgPz8gW10pLm1hcChjb250cm9sID0+XG4gICAgICAgICAgICBjb250cm9sLnN0YXR1c0NoYW5nZXMucGlwZShzdGFydFdpdGgoY29udHJvbC5zdGF0dXMpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIHN0YXR1c2VzID0+XG4gICAgICAgICAgICAgIHN0YXR1c2VzLmluY2x1ZGVzKCdJTlZBTElEJykgfHwgIXN0YXR1c2VzLmluY2x1ZGVzKCdQRU5ESU5HJyksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgIG1hcCgoKSA9PiBnZXRFcnJvcnMoKSksXG4gICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgICA6IGdldEVycm9ycygpO1xuICB9XG5cbiAgZW1pdE1vZGVsKG1vZGVsOiBNID0gdGhpcy5tb2RlbCkge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICB0aGlzLmVtaXRWYWx1ZSh0aGlzLm1vZGVsT3V0KHRoaXMubW9kZWwpKTtcbiAgfVxuXG4gIGVtaXRWYWx1ZSh2YWx1ZTogVikge1xuICAgIGlmICh0aGlzLm9uQ2hhbmdlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgdmFsdWVJbih2YWx1ZTogVik6IE0ge1xuICAgIHJldHVybiB2YWx1ZSBhcyBhbnk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbW9kZWxPdXQobW9kZWw6IE0pOiBWIHtcbiAgICByZXR1cm4gbW9kZWwgYXMgYW55O1xuICB9XG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBCYXNlTmVzdGVkRm9ybUNvbnRyb2x9IGluc3RlYWQuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGNsYXNzIEJhc2VOZXN0ZWRGb3JtQ29udHJvbFB1cmU8ViwgTSA9IFY+IGV4dGVuZHMgQmFzZU5lc3RlZEZvcm1Db250cm9sPFxuICBWLFxuICBNXG4+IHtcbiAgbW9kZWwkID0gbmV3IFJlcGxheVN1YmplY3Q8TT4oMSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMubW9kZWwkLnN1YnNjcmliZShtb2RlbCA9PiB7XG4gICAgICB0aGlzLm1vZGVsID0gbW9kZWw7XG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHdyaXRlVmFsdWUodmFsdWU6IFYpIHtcbiAgICB0aGlzLm1vZGVsJC5uZXh0KHRoaXMudmFsdWVJbih2YWx1ZSkpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZW1pdFZhbHVlKHZhbHVlOiBWKSB7XG4gICAgaWYgKHRoaXMub25DaGFuZ2UpIHtcbiAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH1cbn1cblxudHlwZSBQYXRoID0gc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPjtcblxuaW50ZXJmYWNlIE1hcHBlciB7XG4gIFt4OiBzdHJpbmddOiBNYXBwZXIgfCBQYXRoO1xufVxuXG50eXBlIFBhdGhUdXBsZSA9IFtzdHJpbmdbXSwgc3RyaW5nW11dO1xuXG5mdW5jdGlvbiBjb2xsZWN0UGF0aHMobWFwcGVyOiBNYXBwZXIsIHBhcmVudDogc3RyaW5nW10pOiBQYXRoVHVwbGVbXSB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhtYXBwZXIpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBjb25zdCBwYXRoID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KCcuJykgOiB2YWx1ZTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgICAgYWNjLnB1c2goW3BhcmVudC5jb25jYXQoa2V5KSwgcGF0aF0pO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgcmV0dXJuIGFjYy5jb25jYXQoY29sbGVjdFBhdGhzKHBhdGgsIHBhcmVudC5jb25jYXQoa2V5KSkpO1xuICB9LCBbXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXRhVHJhbnNmZXI8XG4gIFMgZXh0ZW5kcyBvYmplY3QsXG4gIFQgZXh0ZW5kcyBvYmplY3QsXG4gIE0gZXh0ZW5kcyBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4gPSBSZWNvcmQ8a2V5b2YgVCwgUGF0aCB8IE1hcHBlcj4sXG4+KG1hcHBlcjogTSk6IFsoc291cmNlOiBTKSA9PiBULCAodGFyZ2V0OiBUKSA9PiBTXSB7XG4gIGNvbnN0IHR1cGxlcyA9IGNvbGxlY3RQYXRocyhtYXBwZXIsIFtdKTtcbiAgbGV0IF9zb3VyY2U6IFM7XG4gIGxldCBfdGFyZ2V0OiBUID0ge30gYXMgVDtcbiAgcmV0dXJuIFtcbiAgICBzb3VyY2UgPT4ge1xuICAgICAgX3NvdXJjZSA9IHNvdXJjZTtcbiAgICAgIHJldHVybiB0dXBsZXMucmVkdWNlKChhY2MsIFtsZWZ0LCByaWdodF0pID0+IHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBwYXRoPHVua25vd24+KHJpZ2h0LCBzb3VyY2UpO1xuXG4gICAgICAgIGlmIChwYXRoKGxlZnQsIGFjYykgPT09IG5ld1ZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoX3RhcmdldCA9IGFzc29jUGF0aDx1bmtub3duLCBUPihsZWZ0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfdGFyZ2V0KTtcbiAgICB9LFxuICAgIHRhcmdldCA9PiB7XG4gICAgICBfdGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgcmV0dXJuIHR1cGxlcy5yZWR1Y2UoKGFjYywgW2xlZnQsIHJpZ2h0XSkgPT4ge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHBhdGg8dW5rbm93bj4obGVmdCwgdGFyZ2V0KTtcblxuICAgICAgICBpZiAocGF0aChyaWdodCwgYWNjKSA9PT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChfc291cmNlID0gYXNzb2NQYXRoPHVua25vd24sIFM+KHJpZ2h0LCBuZXdWYWx1ZSwgYWNjKSk7XG4gICAgICB9LCBfc291cmNlKTtcbiAgICB9LFxuICBdO1xufVxuXG5mdW5jdGlvbiBwYXJzZVBhdGgocGF0aDogUGF0aCk6IEFycmF5PHN0cmluZyB8IG51bWJlcj4ge1xuICByZXR1cm4gdHlwZW9mIHBhdGggPT09ICdzdHJpbmcnID8gcGF0aC5zcGxpdCgnLicpIDogcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlWYWx1ZTxUIGV4dGVuZHMgb2JqZWN0PihcbiAgZnJvbTogUGF0aCxcbiAgdG86IFBhdGgsXG4gIG1hcHBlcjogKHY6IGFueSkgPT4gYW55ID0gaWRlbnRpdHksXG4pIHtcbiAgY29uc3QgZnJvbVBhdGggPSBwYXJzZVBhdGgoZnJvbSk7XG4gIGNvbnN0IHRvUGF0aCA9IHBhcnNlUGF0aCh0byk7XG4gIHJldHVybiAob2JqZWN0OiBUKSA9PlxuICAgIGFzc29jUGF0aCh0b1BhdGgsIG1hcHBlcihwYXRoKGZyb21QYXRoLCBvYmplY3QpKSwgb2JqZWN0KTtcbn1cbiJdfQ==