@tanstack/angular-table
Version:
Headless UI for building powerful tables & datagrids for Angular.
173 lines • 22.6 kB
JavaScript
import { ChangeDetectorRef, inject, Injectable, KeyValueDiffers, OutputEmitterRef, ViewContainerRef, } from '@angular/core';
import * as i0 from "@angular/core";
export class FlexRenderComponentFactory {
#viewContainerRef = inject(ViewContainerRef);
createComponent(flexRenderComponent, componentInjector) {
const componentRef = this.#viewContainerRef.createComponent(flexRenderComponent.component, {
injector: componentInjector,
});
const view = new FlexRenderComponentRef(componentRef, flexRenderComponent, componentInjector);
const { inputs, outputs } = flexRenderComponent;
if (inputs)
view.setInputs(inputs);
if (outputs)
view.setOutputs(outputs);
return view;
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FlexRenderComponentFactory, decorators: [{
type: Injectable
}] });
export class FlexRenderComponentRef {
componentRef;
componentInjector;
#keyValueDiffersFactory;
#componentData;
#inputValueDiffer;
#outputRegistry;
constructor(componentRef, componentData, componentInjector) {
this.componentRef = componentRef;
this.componentInjector = componentInjector;
this.#componentData = componentData;
this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers);
this.#outputRegistry = new FlexRenderComponentOutputManager(this.#keyValueDiffersFactory, this.outputs);
this.#inputValueDiffer = this.#keyValueDiffersFactory
.find(this.inputs)
.create();
this.#inputValueDiffer.diff(this.inputs);
this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll());
}
get component() {
return this.#componentData.component;
}
get inputs() {
return this.#componentData.inputs ?? {};
}
get outputs() {
return this.#componentData.outputs ?? {};
}
/**
* Get component input and output diff by the given item
*/
diff(item) {
return {
inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}),
outputDiff: this.#outputRegistry.diff(item.outputs ?? {}),
};
}
/**
*
* @param compare Whether the current ref component instance is the same as the given one
*/
eqType(compare) {
return compare.component === this.component;
}
/**
* Tries to update current component refs input by the new given content component.
*/
update(content) {
const eq = this.eqType(content);
if (!eq)
return;
const { inputDiff, outputDiff } = this.diff(content);
if (inputDiff) {
inputDiff.forEachAddedItem(item => this.setInput(item.key, item.currentValue));
inputDiff.forEachChangedItem(item => this.setInput(item.key, item.currentValue));
inputDiff.forEachRemovedItem(item => this.setInput(item.key, undefined));
}
if (outputDiff) {
outputDiff.forEachAddedItem(item => {
this.setOutput(item.key, item.currentValue);
});
outputDiff.forEachChangedItem(item => {
if (item.currentValue) {
this.#outputRegistry.setListener(item.key, item.currentValue);
}
else {
this.#outputRegistry.unsubscribe(item.key);
}
});
outputDiff.forEachRemovedItem(item => {
this.#outputRegistry.unsubscribe(item.key);
});
}
this.#componentData = content;
}
markAsDirty() {
this.componentRef.injector.get(ChangeDetectorRef).markForCheck();
}
setInputs(inputs) {
for (const prop in inputs) {
this.setInput(prop, inputs[prop]);
}
}
setInput(key, value) {
if (this.#componentData.allowedInputNames.includes(key)) {
this.componentRef.setInput(key, value);
}
}
setOutputs(outputs) {
this.#outputRegistry.unsubscribeAll();
for (const prop in outputs) {
this.setOutput(prop, outputs[prop]);
}
}
setOutput(outputName, emit) {
if (!this.#componentData.allowedOutputNames.includes(outputName))
return;
if (!emit) {
this.#outputRegistry.unsubscribe(outputName);
return;
}
const hasListener = this.#outputRegistry.hasListener(outputName);
this.#outputRegistry.setListener(outputName, emit);
if (hasListener) {
return;
}
const instance = this.componentRef.instance;
const output = instance[outputName];
if (output && output instanceof OutputEmitterRef) {
output.subscribe(value => {
this.#outputRegistry.getListener(outputName)?.(value);
});
}
}
}
class FlexRenderComponentOutputManager {
#outputSubscribers = {};
#outputListeners = {};
#valueDiffer;
constructor(keyValueDiffers, initialOutputs) {
this.#valueDiffer = keyValueDiffers.find(initialOutputs).create();
if (initialOutputs) {
this.#valueDiffer.diff(initialOutputs);
}
}
hasListener(outputName) {
return outputName in this.#outputListeners;
}
setListener(outputName, callback) {
this.#outputListeners[outputName] = callback;
}
getListener(outputName) {
return this.#outputListeners[outputName];
}
unsubscribeAll() {
for (const prop in this.#outputSubscribers) {
this.unsubscribe(prop);
}
}
unsubscribe(outputName) {
if (outputName in this.#outputSubscribers) {
this.#outputSubscribers[outputName]?.unsubscribe();
delete this.#outputSubscribers[outputName];
delete this.#outputListeners[outputName];
}
}
diff(outputs) {
return this.#valueDiffer.diff(outputs ?? {});
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxleC1yZW5kZXItY29tcG9uZW50LXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9mbGV4LXJlbmRlci9mbGV4LXJlbmRlci1jb21wb25lbnQtcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxpQkFBaUIsRUFFakIsTUFBTSxFQUNOLFVBQVUsRUFHVixlQUFlLEVBQ2YsZ0JBQWdCLEVBRWhCLGdCQUFnQixHQUNqQixNQUFNLGVBQWUsQ0FBQTs7QUFJdEIsTUFBTSxPQUFPLDBCQUEwQjtJQUNyQyxpQkFBaUIsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUU1QyxlQUFlLENBQ2IsbUJBQTJDLEVBQzNDLGlCQUEyQjtRQUUzQixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUN6RCxtQkFBbUIsQ0FBQyxTQUFTLEVBQzdCO1lBQ0UsUUFBUSxFQUFFLGlCQUFpQjtTQUM1QixDQUNGLENBQUE7UUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLHNCQUFzQixDQUNyQyxZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLGlCQUFpQixDQUNsQixDQUFBO1FBRUQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxtQkFBbUIsQ0FBQTtRQUUvQyxJQUFJLE1BQU07WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ2xDLElBQUksT0FBTztZQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUE7UUFFckMsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO3dHQXpCVSwwQkFBMEI7NEdBQTFCLDBCQUEwQjs7NEZBQTFCLDBCQUEwQjtrQkFEdEMsVUFBVTs7QUE2QlgsTUFBTSxPQUFPLHNCQUFzQjtJQVF0QjtJQUVBO0lBVEYsdUJBQXVCLENBQWlCO0lBQ2pELGNBQWMsQ0FBd0I7SUFDdEMsaUJBQWlCLENBQWlDO0lB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QUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxPQUFzRTtRQUN6RSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50UmVmLFxuICBpbmplY3QsXG4gIEluamVjdGFibGUsXG4gIEluamVjdG9yLFxuICBLZXlWYWx1ZURpZmZlcixcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBPdXRwdXRFbWl0dGVyUmVmLFxuICBPdXRwdXRSZWZTdWJzY3JpcHRpb24sXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBGbGV4UmVuZGVyQ29tcG9uZW50IH0gZnJvbSAnLi9mbGV4LXJlbmRlci1jb21wb25lbnQnXG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50RmFjdG9yeSB7XG4gICN2aWV3Q29udGFpbmVyUmVmID0gaW5qZWN0KFZpZXdDb250YWluZXJSZWYpXG5cbiAgY3JlYXRlQ29tcG9uZW50PFQ+KFxuICAgIGZsZXhSZW5kZXJDb21wb25lbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4sXG4gICAgY29tcG9uZW50SW5qZWN0b3I6IEluamVjdG9yXG4gICk6IEZsZXhSZW5kZXJDb21wb25lbnRSZWY8VD4ge1xuICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IHRoaXMuI3ZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudC5jb21wb25lbnQsXG4gICAgICB7XG4gICAgICAgIGluamVjdG9yOiBjb21wb25lbnRJbmplY3RvcixcbiAgICAgIH1cbiAgICApXG4gICAgY29uc3QgdmlldyA9IG5ldyBGbGV4UmVuZGVyQ29tcG9uZW50UmVmKFxuICAgICAgY29tcG9uZW50UmVmLFxuICAgICAgZmxleFJlbmRlckNvbXBvbmVudCxcbiAgICAgIGNvbXBvbmVudEluamVjdG9yXG4gICAgKVxuXG4gICAgY29uc3QgeyBpbnB1dHMsIG91dHB1dHMgfSA9IGZsZXhSZW5kZXJDb21wb25lbnRcblxuICAgIGlmIChpbnB1dHMpIHZpZXcuc2V0SW5wdXRzKGlucHV0cylcbiAgICBpZiAob3V0cHV0cykgdmlldy5zZXRPdXRwdXRzKG91dHB1dHMpXG5cbiAgICByZXR1cm4gdmlld1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBGbGV4UmVuZGVyQ29tcG9uZW50UmVmPFQ+IHtcbiAgcmVhZG9ubHkgI2tleVZhbHVlRGlmZmVyc0ZhY3Rvcnk6IEtleVZhbHVlRGlmZmVyc1xuICAjY29tcG9uZW50RGF0YTogRmxleFJlbmRlckNvbXBvbmVudDxUPlxuICAjaW5wdXRWYWx1ZURpZmZlcjogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCB1bmtub3duPlxuXG4gIHJlYWRvbmx5ICNvdXRwdXRSZWdpc3RyeTogRmxleFJlbmRlckNvbXBvbmVudE91dHB1dE1hbmFnZXJcblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBjb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxUPixcbiAgICBjb21wb25lbnREYXRhOiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+LFxuICAgIHJlYWRvbmx5IGNvbXBvbmVudEluamVjdG9yOiBJbmplY3RvclxuICApIHtcbiAgICB0aGlzLiNjb21wb25lbnREYXRhID0gY29tcG9uZW50RGF0YVxuICAgIHRoaXMuI2tleVZhbHVlRGlmZmVyc0ZhY3RvcnkgPSBjb21wb25lbnRJbmplY3Rvci5nZXQoS2V5VmFsdWVEaWZmZXJzKVxuXG4gICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkgPSBuZXcgRmxleFJlbmRlckNvbXBvbmVudE91dHB1dE1hbmFnZXIoXG4gICAgICB0aGlzLiNrZXlWYWx1ZURpZmZlcnNGYWN0b3J5LFxuICAgICAgdGhpcy5vdXRwdXRzXG4gICAgKVxuXG4gICAgdGhpcy4jaW5wdXRWYWx1ZURpZmZlciA9IHRoaXMuI2tleVZhbHVlRGlmZmVyc0ZhY3RvcnlcbiAgICAgIC5maW5kKHRoaXMuaW5wdXRzKVxuICAgICAgLmNyZWF0ZSgpXG4gICAgdGhpcy4jaW5wdXRWYWx1ZURpZmZlci5kaWZmKHRoaXMuaW5wdXRzKVxuXG4gICAgdGhpcy5jb21wb25lbnRSZWYub25EZXN0cm95KCgpID0+IHRoaXMuI291dHB1dFJlZ2lzdHJ5LnVuc3Vic2NyaWJlQWxsKCkpXG4gIH1cblxuICBnZXQgY29tcG9uZW50KCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wb25lbnREYXRhLmNvbXBvbmVudFxuICB9XG5cbiAgZ2V0IGlucHV0cygpIHtcbiAgICByZXR1cm4gdGhpcy4jY29tcG9uZW50RGF0YS5pbnB1dHMgPz8ge31cbiAgfVxuXG4gIGdldCBvdXRwdXRzKCkge1xuICAgIHJldHVybiB0aGlzLiNjb21wb25lbnREYXRhLm91dHB1dHMgPz8ge31cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgY29tcG9uZW50IGlucHV0IGFuZCBvdXRwdXQgZGlmZiBieSB0aGUgZ2l2ZW4gaXRlbVxuICAgKi9cbiAgZGlmZihpdGVtOiBGbGV4UmVuZGVyQ29tcG9uZW50PFQ+KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlucHV0RGlmZjogdGhpcy4jaW5wdXRWYWx1ZURpZmZlci5kaWZmKGl0ZW0uaW5wdXRzID8/IHt9KSxcbiAgICAgIG91dHB1dERpZmY6IHRoaXMuI291dHB1dFJlZ2lzdHJ5LmRpZmYoaXRlbS5vdXRwdXRzID8/IHt9KSxcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBjb21wYXJlIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVmIGNvbXBvbmVudCBpbnN0YW5jZSBpcyB0aGUgc2FtZSBhcyB0aGUgZ2l2ZW4gb25lXG4gICAqL1xuICBlcVR5cGUoY29tcGFyZTogRmxleFJlbmRlckNvbXBvbmVudDxUPik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBjb21wYXJlLmNvbXBvbmVudCA9PT0gdGhpcy5jb21wb25lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmllcyB0byB1cGRhdGUgY3VycmVudCBjb21wb25lbnQgcmVmcyBpbnB1dCBieSB0aGUgbmV3IGdpdmVuIGNvbnRlbnQgY29tcG9uZW50LlxuICAgKi9cbiAgdXBkYXRlKGNvbnRlbnQ6IEZsZXhSZW5kZXJDb21wb25lbnQ8VD4pIHtcbiAgICBjb25zdCBlcSA9IHRoaXMuZXFUeXBlKGNvbnRlbnQpXG4gICAgaWYgKCFlcSkgcmV0dXJuXG4gICAgY29uc3QgeyBpbnB1dERpZmYsIG91dHB1dERpZmYgfSA9IHRoaXMuZGlmZihjb250ZW50KVxuICAgIGlmIChpbnB1dERpZmYpIHtcbiAgICAgIGlucHV0RGlmZi5mb3JFYWNoQWRkZWRJdGVtKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICApXG4gICAgICBpbnB1dERpZmYuZm9yRWFjaENoYW5nZWRJdGVtKGl0ZW0gPT5cbiAgICAgICAgdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICApXG4gICAgICBpbnB1dERpZmYuZm9yRWFjaFJlbW92ZWRJdGVtKGl0ZW0gPT4gdGhpcy5zZXRJbnB1dChpdGVtLmtleSwgdW5kZWZpbmVkKSlcbiAgICB9XG4gICAgaWYgKG91dHB1dERpZmYpIHtcbiAgICAgIG91dHB1dERpZmYuZm9yRWFjaEFkZGVkSXRlbShpdGVtID0+IHtcbiAgICAgICAgdGhpcy5zZXRPdXRwdXQoaXRlbS5rZXksIGl0ZW0uY3VycmVudFZhbHVlKVxuICAgICAgfSlcbiAgICAgIG91dHB1dERpZmYuZm9yRWFjaENoYW5nZWRJdGVtKGl0ZW0gPT4ge1xuICAgICAgICBpZiAoaXRlbS5jdXJyZW50VmFsdWUpIHtcbiAgICAgICAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS5zZXRMaXN0ZW5lcihpdGVtLmtleSwgaXRlbS5jdXJyZW50VmFsdWUpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUoaXRlbS5rZXkpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBvdXRwdXREaWZmLmZvckVhY2hSZW1vdmVkSXRlbShpdGVtID0+IHtcbiAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUoaXRlbS5rZXkpXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuI2NvbXBvbmVudERhdGEgPSBjb250ZW50XG4gIH1cblxuICBtYXJrQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbXBvbmVudFJlZi5pbmplY3Rvci5nZXQoQ2hhbmdlRGV0ZWN0b3JSZWYpLm1hcmtGb3JDaGVjaygpXG4gIH1cblxuICBzZXRJbnB1dHMoaW5wdXRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIGZvciAoY29uc3QgcHJvcCBpbiBpbnB1dHMpIHtcbiAgICAgIHRoaXMuc2V0SW5wdXQocHJvcCwgaW5wdXRzW3Byb3BdKVxuICAgIH1cbiAgfVxuXG4gIHNldElucHV0KGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bikge1xuICAgIGlmICh0aGlzLiNjb21wb25lbnREYXRhLmFsbG93ZWRJbnB1dE5hbWVzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50UmVmLnNldElucHV0KGtleSwgdmFsdWUpXG4gICAgfVxuICB9XG5cbiAgc2V0T3V0cHV0cyhcbiAgICBvdXRwdXRzOiBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J10gfCBudWxsIHwgdW5kZWZpbmVkXG4gICAgPlxuICApIHtcbiAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS51bnN1YnNjcmliZUFsbCgpXG4gICAgZm9yIChjb25zdCBwcm9wIGluIG91dHB1dHMpIHtcbiAgICAgIHRoaXMuc2V0T3V0cHV0KHByb3AsIG91dHB1dHNbcHJvcF0pXG4gICAgfVxuICB9XG5cbiAgc2V0T3V0cHV0KFxuICAgIG91dHB1dE5hbWU6IHN0cmluZyxcbiAgICBlbWl0OiBPdXRwdXRFbWl0dGVyUmVmPHVua25vd24+WydlbWl0J10gfCB1bmRlZmluZWQgfCBudWxsXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jY29tcG9uZW50RGF0YS5hbGxvd2VkT3V0cHV0TmFtZXMuaW5jbHVkZXMob3V0cHV0TmFtZSkpIHJldHVyblxuICAgIGlmICghZW1pdCkge1xuICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkudW5zdWJzY3JpYmUob3V0cHV0TmFtZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGhhc0xpc3RlbmVyID0gdGhpcy4jb3V0cHV0UmVnaXN0cnkuaGFzTGlzdGVuZXIob3V0cHV0TmFtZSlcbiAgICB0aGlzLiNvdXRwdXRSZWdpc3RyeS5zZXRMaXN0ZW5lcihvdXRwdXROYW1lLCBlbWl0KVxuXG4gICAgaWYgKGhhc0xpc3RlbmVyKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuY29tcG9uZW50UmVmLmluc3RhbmNlXG4gICAgY29uc3Qgb3V0cHV0ID0gaW5zdGFuY2Vbb3V0cHV0TmFtZSBhcyBrZXlvZiB0eXBlb2YgaW5zdGFuY2VdXG4gICAgaWYgKG91dHB1dCAmJiBvdXRwdXQgaW5zdGFuY2VvZiBPdXRwdXRFbWl0dGVyUmVmKSB7XG4gICAgICBvdXRwdXQuc3Vic2NyaWJlKHZhbHVlID0+IHtcbiAgICAgICAgdGhpcy4jb3V0cHV0UmVnaXN0cnkuZ2V0TGlzdGVuZXIob3V0cHV0TmFtZSk/Lih2YWx1ZSlcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEZsZXhSZW5kZXJDb21wb25lbnRPdXRwdXRNYW5hZ2VyIHtcbiAgcmVhZG9ubHkgI291dHB1dFN1YnNjcmliZXJzOiBSZWNvcmQ8c3RyaW5nLCBPdXRwdXRSZWZTdWJzY3JpcHRpb24+ID0ge31cbiAgcmVhZG9ubHkgI291dHB1dExpc3RlbmVyczogUmVjb3JkPHN0cmluZywgKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9IHt9XG5cbiAgcmVhZG9ubHkgI3ZhbHVlRGlmZmVyOiBLZXlWYWx1ZURpZmZlcjxcbiAgICBzdHJpbmcsXG4gICAgdW5kZWZpbmVkIHwgbnVsbCB8IE91dHB1dEVtaXR0ZXJSZWY8dW5rbm93bj5bJ2VtaXQnXVxuICA+XG5cbiAgY29uc3RydWN0b3Ioa2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsIGluaXRpYWxPdXRwdXRzOiBhbnkpIHtcbiAgICB0aGlzLiN2YWx1ZURpZmZlciA9IGtleVZhbHVlRGlmZmVycy5maW5kKGluaXRpYWxPdXRwdXRzKS5jcmVhdGUoKVxuICAgIGlmIChpbml0aWFsT3V0cHV0cykge1xuICAgICAgdGhpcy4jdmFsdWVEaWZmZXIuZGlmZihpbml0aWFsT3V0cHV0cylcbiAgICB9XG4gIH1cblxuICBoYXNMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gb3V0cHV0TmFtZSBpbiB0aGlzLiNvdXRwdXRMaXN0ZW5lcnNcbiAgfVxuXG4gIHNldExpc3RlbmVyKG91dHB1dE5hbWU6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXSA9IGNhbGxiYWNrXG4gIH1cblxuICBnZXRMaXN0ZW5lcihvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy4jb3V0cHV0TGlzdGVuZXJzW291dHB1dE5hbWVdXG4gIH1cblxuICB1bnN1YnNjcmliZUFsbCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHByb3AgaW4gdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnMpIHtcbiAgICAgIHRoaXMudW5zdWJzY3JpYmUocHJvcClcbiAgICB9XG4gIH1cblxuICB1bnN1YnNjcmliZShvdXRwdXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAob3V0cHV0TmFtZSBpbiB0aGlzLiNvdXRwdXRTdWJzY3JpYmVycykge1xuICAgICAgdGhpcy4jb3V0cHV0U3Vic2NyaWJlcnNbb3V0cHV0TmFtZV0/LnVuc3Vic2NyaWJlKClcbiAgICAgIGRlbGV0ZSB0aGlzLiNvdXRwdXRTdWJzY3JpYmVyc1tvdXRwdXROYW1lXVxuICAgICAgZGVsZXRlIHRoaXMuI291dHB1dExpc3RlbmVyc1tvdXRwdXROYW1lXVxuICAgIH1cbiAgfVxuXG4gIGRpZmYob3V0cHV0czogUmVjb3JkPHN0cmluZywgT3V0cHV0RW1pdHRlclJlZjx1bmtub3duPlsnZW1pdCddIHwgdW5kZWZpbmVkPikge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZURpZmZlci5kaWZmKG91dHB1dHMgPz8ge30pXG4gIH1cbn1cbiJdfQ==