@orchestrator/core
Version:
> Core package of Orchestrator library.
266 lines • 37.3 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { NgClass } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ComponentFactoryResolver, EventEmitter, Input, Output, Renderer2, } from '@angular/core';
import { isRight } from 'fp-ts/lib/Either';
import { dynamicDirectiveDef, } from 'ng-dynamic-component';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { ComponentLocatorService } from '../component-locator/component-locator.service';
import { OptionFunction } from '../config';
import { ConfigurationService } from '../config/configuration.service';
import { InjectorRegistryService } from '../injectors/injector-registry.service';
import { createLocalInjector } from '../injectors/local-injector';
import { MappedInjectorFactory } from '../injectors/mapped-injector';
import { RenderComponent } from '../render-component';
import { ComponentsRegistryService } from './components-registry.service';
import * as i0 from "@angular/core";
import * as i1 from "../component-locator/component-locator.service";
import * as i2 from "./components-registry.service";
import * as i3 from "../config/configuration.service";
import * as i4 from "../injectors/mapped-injector";
import * as i5 from "../injectors/injector-registry.service";
import * as i6 from "ng-dynamic-component";
class Handler {
}
__decorate([
OptionFunction(),
__metadata("design:type", Object)
], Handler.prototype, "handler", void 0);
export class RenderItemComponent extends RenderComponent {
constructor(cdr, renderer, cfr, componentLocatorService, componentsRegistryService, configurationService, mappedInjectorFactory, injectorRegistryService) {
super();
this.cdr = cdr;
this.renderer = renderer;
this.cfr = cfr;
this.componentLocatorService = componentLocatorService;
this.componentsRegistryService = componentsRegistryService;
this.configurationService = configurationService;
this.mappedInjectorFactory = mappedInjectorFactory;
this.injectorRegistryService = injectorRegistryService;
this.componentCreated = new EventEmitter();
this.childComponentsCreated = new EventEmitter();
this.destroyed$ = new Subject();
this.inputs = {
items: undefined,
config: undefined,
context: undefined,
};
this.directives = [];
this.attributes = null;
this.disposableHandlers = [];
}
get itemsLength() {
return this.item && this.item.items ? this.item.items.length : 0;
}
ngOnInit() {
this.componentsRegistryService.componentsReady$
.pipe(takeUntil(this.destroyed$))
.subscribe((compRefs) => {
this.childComponentsCreated.emit(compRefs);
this.componentsRegistryService.addChildren(compRefs);
});
this.update();
}
ngOnChanges(changes) {
if ('item' in changes && !changes.item.firstChange) {
this.update();
}
else if ('context' in changes && !changes.context.firstChange) {
this.updateContextInput();
}
}
ngOnDestroy() {
this.destroyed$.next();
this.disposeHandlers();
this.compRef = this.compCdr = this.compFactory = this.config = null;
}
onComponentCreated(compRef) {
this.compRef = compRef;
this.compFactory = this.cfr.resolveComponentFactory(this.componentType);
this.componentCreated.emit(compRef);
this.componentsRegistryService.add(compRef);
this.updateHandlers();
}
getInjectorRegistryService() {
return this.injectorRegistryService;
}
markForCheck() {
if (!this.compCdr && this.compRef) {
this.compCdr = this.compRef.injector.get(ChangeDetectorRef);
}
if (this.compCdr) {
this.compCdr.markForCheck();
}
}
addItem(item) {
if (this.inputs.items) {
this.inputs.items = [...this.inputs.items, item];
}
else {
this.inputs.items = [item];
}
this.cdr.markForCheck();
}
removeItem(item) {
const idx = this.inputs.items ? this.inputs.items.indexOf(item) : -1;
if (idx === -1) {
return;
}
this.inputs.items = this.inputs.items.filter((_, i) => i !== idx);
this.cdr.markForCheck();
}
clearItems() {
this.inputs.items = [];
this.cdr.markForCheck();
}
update() {
this.updateComponent();
this.updateConfig();
this.updateInjector();
this.updateInputs();
this.updateContextInput();
this.updateAttributes();
this.updateDirectives();
}
updateComponent() {
// Invalidate late-component-refs immediately
this.compRef = this.compCdr = this.compFactory = null;
if (this.item) {
this.componentType = this.componentLocatorService.resolve(this.item.component);
this.componentsRegistryService.waitFor(this.itemsLength);
}
else {
this.componentType = null;
this.componentsRegistryService.waitFor(0);
}
}
updateConfig() {
if (this.componentType) {
this.config = {
...this.componentLocatorService.getDefaultConfig(this.componentType),
...this.item.config,
};
}
else {
this.config = null;
}
}
updateInjector() {
if (this.componentType) {
this.injector = this.createInjector();
}
else {
this.injector = null;
}
}
updateInputs() {
if (this.componentType) {
this.inputs.items = this.item.items;
this.inputs.config = this.getConfig();
}
else {
this.inputs.items = this.inputs.config = null;
}
}
updateAttributes() {
if (this.componentType) {
this.attributes = this.item.attributes || null;
if (this.item.id) {
this.attributes = { ...this.attributes, id: this.item.id };
}
}
}
updateDirectives() {
if (this.componentType && this.item.classes) {
this.directives = [
dynamicDirectiveDef(NgClass, { ngClass: this.item.classes }),
];
}
else {
this.directives = [];
}
}
getConfig() {
return (this.configurationService.decode(this.componentLocatorService.getConfigType(this.componentType), this.config, this.injector) || {});
}
createInjector() {
return this.mappedInjectorFactory.create(this.createLocalInjector());
}
createLocalInjector() {
return createLocalInjector({
parentInjector: this.injectorRegistryService,
getComponent: () => this.compRef.instance,
getConfig: () => this.inputs.config,
updateConfig: (config) => {
this.markForCheck();
return (this.inputs.config = { ...this.inputs.config, ...config });
},
isConfigValid: () => isRight(this.configurationService.validate(this.componentLocatorService.getConfigType(this.componentType), this.inputs.config)),
getContext: () => this.context,
});
}
updateHandlers() {
this.disposeHandlers();
if (!this.item.handlers || !this.compRef || !this.compFactory) {
return;
}
const { handlers } = this.item;
this.disposableHandlers = Object.keys(handlers)
.map((event) => ({
event,
handler: this.decodeHandler(handlers[event]),
}))
.filter(({ handler }) => handler)
.map(({ event, handler }) => this.attachHandler(event, handler));
}
decodeHandler(handler) {
const fn = this.configurationService.decode(Handler, { handler }, this.injector).handler;
return typeof fn === 'function' ? fn : null;
}
attachHandler(event, handler) {
const outputInfo = this.compFactory.outputs.find((output) => output.templateName === event);
if (outputInfo) {
const output = this.compRef.instance[outputInfo.propName];
const sub = output.subscribe(handler);
return () => sub.unsubscribe();
}
return this.renderer.listen(this.compRef.location.nativeElement, event, handler);
}
disposeHandlers() {
this.disposableHandlers.forEach((disposeHandler) => disposeHandler());
this.disposableHandlers = [];
}
updateContextInput() {
if (this.componentType) {
this.inputs.context = this.context;
}
else {
this.inputs.context = null;
}
}
}
/** @nocollapse */ /** @nocollapse */ RenderItemComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: RenderItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i0.ComponentFactoryResolver }, { token: i1.ComponentLocatorService }, { token: i2.ComponentsRegistryService }, { token: i3.ConfigurationService }, { token: i4.MappedInjectorFactory }, { token: i5.InjectorRegistryService }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ /** @nocollapse */ RenderItemComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.0", type: RenderItemComponent, selector: "orc-render-item", inputs: { item: "item", context: "context" }, outputs: { componentCreated: "componentCreated", childComponentsCreated: "childComponentsCreated" }, providers: [
{ provide: RenderComponent, useExisting: RenderItemComponent },
ComponentsRegistryService,
InjectorRegistryService,
MappedInjectorFactory,
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<ndc-dynamic\n [ndcDynamicComponent]=\"componentType\"\n [ndcDynamicInputs]=\"inputs\"\n [ndcDynamicInjector]=\"injector\"\n [ndcDynamicAttributes]=\"attributes\"\n [ndcDynamicDirectives]=\"directives\"\n (ndcDynamicCreated)=\"onComponentCreated($event)\"\n></ndc-dynamic>\n", components: [{ type: i6.DynamicComponent, selector: "ndc-dynamic", inputs: ["ndcDynamicComponent", "ndcDynamicInjector", "ndcDynamicProviders", "ndcDynamicContent"], outputs: ["ndcDynamicCreated"] }], directives: [{ type: i6.DynamicIoDirective, selector: "[ndcDynamicInputs],[ndcDynamicOutputs],[ngComponentOutletNdcDynamicInputs],[ngComponentOutletNdcDynamicOutputs]", inputs: ["ndcDynamicInputs", "ngComponentOutletNdcDynamicInputs", "ndcDynamicOutputs", "ngComponentOutletNdcDynamicOutputs"] }, { type: i6.DynamicAttributesDirective, selector: "[ndcDynamicAttributes],[ngComponentOutletNdcDynamicAttributes]", inputs: ["ndcDynamicAttributes", "ngComponentOutletNdcDynamicAttributes"], exportAs: ["ndcDynamicAttributes"] }, { type: i6.DynamicDirectivesDirective, selector: "[ndcDynamicDirectives],[ngComponentOutletNdcDynamicDirectives]", inputs: ["ndcDynamicDirectives", "ngComponentOutletNdcDynamicDirectives"], outputs: ["ndcDynamicDirectivesCreated"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: RenderItemComponent, decorators: [{
type: Component,
args: [{ selector: 'orc-render-item', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
{ provide: RenderComponent, useExisting: RenderItemComponent },
ComponentsRegistryService,
InjectorRegistryService,
MappedInjectorFactory,
], template: "<ndc-dynamic\n [ndcDynamicComponent]=\"componentType\"\n [ndcDynamicInputs]=\"inputs\"\n [ndcDynamicInjector]=\"injector\"\n [ndcDynamicAttributes]=\"attributes\"\n [ndcDynamicDirectives]=\"directives\"\n (ndcDynamicCreated)=\"onComponentCreated($event)\"\n></ndc-dynamic>\n" }]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i0.ComponentFactoryResolver }, { type: i1.ComponentLocatorService }, { type: i2.ComponentsRegistryService }, { type: i3.ConfigurationService }, { type: i4.MappedInjectorFactory }, { type: i5.InjectorRegistryService }]; }, propDecorators: { item: [{
type: Input
}], context: [{
type: Input
}], componentCreated: [{
type: Output
}], childComponentsCreated: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyLWl0ZW0vcmVuZGVyLWl0ZW0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvcmVuZGVyLWl0ZW0vcmVuZGVyLWl0ZW0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBRVQsd0JBQXdCLEVBRXhCLFlBQVksRUFFWixLQUFLLEVBSUwsTUFBTSxFQUNOLFNBQVMsR0FFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUdMLG1CQUFtQixHQUNwQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDM0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdkUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDakYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBTXRE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QkFBa0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7U0FDcEM7YUFBTTtZQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztTQUM1QjtJQUNILENBQUM7O3NKQS9SVSxtQkFBbUI7MElBQW5CLG1CQUFtQiw2TEFQbkI7UUFDVCxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFO1FBQzlELHlCQUF5QjtRQUN6Qix1QkFBdUI7UUFDdkIscUJBQXFCO0tBQ3RCLHNFQ3RESCwwUkFRQTsyRkRnRGEsbUJBQW1CO2tCQVgvQixTQUFTOytCQUNFLGlCQUFpQixtQkFFVix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNULEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxXQUFXLHFCQUFxQixFQUFFO3dCQUM5RCx5QkFBeUI7d0JBQ3pCLHVCQUF1Qjt3QkFDdkIscUJBQXFCO3FCQUN0QjtrV0FNUSxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUVJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxzQkFBc0I7c0JBQS9CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRGYWN0b3J5LFxuICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gIENvbXBvbmVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBTaW1wbGVDaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGlzUmlnaHQgfSBmcm9tICdmcC10cy9saWIvRWl0aGVyJztcbmltcG9ydCB7XG4gIEF0dHJpYnV0ZXNNYXAsXG4gIER5bmFtaWNEaXJlY3RpdmVEZWYsXG4gIGR5bmFtaWNEaXJlY3RpdmVEZWYsXG59IGZyb20gJ25nLWR5bmFtaWMtY29tcG9uZW50JztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ29tcG9uZW50TG9jYXRvclNlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnQtbG9jYXRvci9jb21wb25lbnQtbG9jYXRvci5zZXJ2aWNlJztcbmltcG9ydCB7IE9wdGlvbkZ1bmN0aW9uIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vY29uZmlnL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBJbmplY3RvclJlZ2lzdHJ5U2VydmljZSB9IGZyb20gJy4uL2luamVjdG9ycy9pbmplY3Rvci1yZWdpc3RyeS5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZUxvY2FsSW5qZWN0b3IgfSBmcm9tICcuLi9pbmplY3RvcnMvbG9jYWwtaW5qZWN0b3InO1xuaW1wb3J0IHsgTWFwcGVkSW5qZWN0b3JGYWN0b3J5IH0gZnJvbSAnLi4vaW5qZWN0b3JzL21hcHBlZC1pbmplY3Rvcic7XG5pbXBvcnQgeyBSZW5kZXJDb21wb25lbnQgfSBmcm9tICcuLi9yZW5kZXItY29tcG9uZW50JztcbmltcG9ydCB7XG4gIE9yY2hlc3RyYXRvckNvbmZpZ0l0ZW0sXG4gIE9yY2hlc3RyYXRvckR5bmFtaWNDb21wb25lbnRJbnB1dHMsXG4gIE9yY2hlc3RyYXRvckR5bmFtaWNDb21wb25lbnRUeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDb21wb25lbnRzUmVnaXN0cnlTZXJ2aWNlIH0gZnJvbSAnLi9jb21wb25lbnRzLXJlZ2lzdHJ5LnNlcnZpY2UnO1xuXG5jbGFzcyBIYW5kbGVyIHtcbiAgQE9wdGlvbkZ1bmN0aW9uKCkgaGFuZGxlcjogRnVuY3Rpb24gfCBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ29yYy1yZW5kZXItaXRlbScsXG4gIHRlbXBsYXRlVXJsOiAnLi9yZW5kZXItaXRlbS5jb21wb25lbnQuaHRtbCcsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7IHByb3ZpZGU6IFJlbmRlckNvbXBvbmVudCwgdXNlRXhpc3Rpbmc6IFJlbmRlckl0ZW1Db21wb25lbnQgfSxcbiAgICBDb21wb25lbnRzUmVnaXN0cnlTZXJ2aWNlLFxuICAgIEluamVjdG9yUmVnaXN0cnlTZXJ2aWNlLFxuICAgIE1hcHBlZEluamVjdG9yRmFjdG9yeSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUmVuZGVySXRlbUNvbXBvbmVudFxuICBleHRlbmRzIFJlbmRlckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3lcbntcbiAgQElucHV0KCkgaXRlbTogT3JjaGVzdHJhdG9yQ29uZmlnSXRlbTxhbnk+IHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnk7XG5cbiAgQE91dHB1dCgpIGNvbXBvbmVudENyZWF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvbXBvbmVudFJlZjxhbnk+PigpO1xuICBAT3V0cHV0KCkgY2hpbGRDb21wb25lbnRzQ3JlYXRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50UmVmPGFueT5bXT4oKTtcblxuICBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb21wb25lbnRUeXBlOiBPcmNoZXN0cmF0b3JEeW5hbWljQ29tcG9uZW50VHlwZTtcblxuICBpbnB1dHM6IE9yY2hlc3RyYXRvckR5bmFtaWNDb21wb25lbnRJbnB1dHMgPSB7XG4gICAgaXRlbXM6IHVuZGVmaW5lZCxcbiAgICBjb25maWc6IHVuZGVmaW5lZCxcbiAgICBjb250ZXh0OiB1bmRlZmluZWQsXG4gIH07XG5cbiAgZGlyZWN0aXZlczogRHluYW1pY0RpcmVjdGl2ZURlZjxhbnk+W10gPSBbXTtcbiAgYXR0cmlidXRlczogQXR0cmlidXRlc01hcCB8IG51bGwgPSBudWxsO1xuXG4gIGluamVjdG9yOiBJbmplY3RvcjtcblxuICBnZXQgaXRlbXNMZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbSAmJiB0aGlzLml0ZW0uaXRlbXMgPyB0aGlzLml0ZW0uaXRlbXMubGVuZ3RoIDogMDtcbiAgfVxuXG4gIHByaXZhdGUgY29tcFJlZjogQ29tcG9uZW50UmVmPGFueT47XG4gIHByaXZhdGUgY29tcENkcjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG4gIHByaXZhdGUgY29tcEZhY3Rvcnk6IENvbXBvbmVudEZhY3Rvcnk8YW55PjtcbiAgcHJpdmF0ZSBjb25maWc6IGFueTtcbiAgcHJpdmF0ZSBkaXNwb3NhYmxlSGFuZGxlcnM6IEZ1bmN0aW9uW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgY2ZyOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRMb2NhdG9yU2VydmljZTogQ29tcG9uZW50TG9jYXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb21wb25lbnRzUmVnaXN0cnlTZXJ2aWNlOiBDb21wb25lbnRzUmVnaXN0cnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlndXJhdGlvblNlcnZpY2U6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgbWFwcGVkSW5qZWN0b3JGYWN0b3J5OiBNYXBwZWRJbmplY3RvckZhY3RvcnksXG4gICAgcHJpdmF0ZSBpbmplY3RvclJlZ2lzdHJ5U2VydmljZTogSW5qZWN0b3JSZWdpc3RyeVNlcnZpY2UsXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNvbXBvbmVudHNSZWdpc3RyeVNlcnZpY2UuY29tcG9uZW50c1JlYWR5JFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKChjb21wUmVmcykgPT4ge1xuICAgICAgICB0aGlzLmNoaWxkQ29tcG9uZW50c0NyZWF0ZWQuZW1pdChjb21wUmVmcyk7XG4gICAgICAgIHRoaXMuY29tcG9uZW50c1JlZ2lzdHJ5U2VydmljZS5hZGRDaGlsZHJlbihjb21wUmVmcyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKCdpdGVtJyBpbiBjaGFuZ2VzICYmICFjaGFuZ2VzLml0ZW0uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfSBlbHNlIGlmICgnY29udGV4dCcgaW4gY2hhbmdlcyAmJiAhY2hhbmdlcy5jb250ZXh0LmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbnRleHRJbnB1dCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kaXNwb3NlSGFuZGxlcnMoKTtcbiAgICB0aGlzLmNvbXBSZWYgPSB0aGlzLmNvbXBDZHIgPSB0aGlzLmNvbXBGYWN0b3J5ID0gdGhpcy5jb25maWcgPSBudWxsO1xuICB9XG5cbiAgb25Db21wb25lbnRDcmVhdGVkKGNvbXBSZWY6IENvbXBvbmVudFJlZjxhbnk+KSB7XG4gICAgdGhpcy5jb21wUmVmID0gY29tcFJlZjtcbiAgICB0aGlzLmNvbXBGYWN0b3J5ID0gdGhpcy5jZnIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkodGhpcy5jb21wb25lbnRUeXBlKTtcbiAgICB0aGlzLmNvbXBvbmVudENyZWF0ZWQuZW1pdChjb21wUmVmKTtcbiAgICB0aGlzLmNvbXBvbmVudHNSZWdpc3RyeVNlcnZpY2UuYWRkKGNvbXBSZWYpO1xuICAgIHRoaXMudXBkYXRlSGFuZGxlcnMoKTtcbiAgfVxuXG4gIGdldEluamVjdG9yUmVnaXN0cnlTZXJ2aWNlKCkge1xuICAgIHJldHVybiB0aGlzLmluamVjdG9yUmVnaXN0cnlTZXJ2aWNlO1xuICB9XG5cbiAgbWFya0ZvckNoZWNrKCkge1xuICAgIGlmICghdGhpcy5jb21wQ2RyICYmIHRoaXMuY29tcFJlZikge1xuICAgICAgdGhpcy5jb21wQ2RyID0gdGhpcy5jb21wUmVmLmluamVjdG9yLmdldChDaGFuZ2VEZXRlY3RvclJlZik7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29tcENkcikge1xuICAgICAgdGhpcy5jb21wQ2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEl0ZW0oaXRlbTogT3JjaGVzdHJhdG9yQ29uZmlnSXRlbTxhbnk+KSB7XG4gICAgaWYgKHRoaXMuaW5wdXRzLml0ZW1zKSB7XG4gICAgICB0aGlzLmlucHV0cy5pdGVtcyA9IFsuLi50aGlzLmlucHV0cy5pdGVtcywgaXRlbV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRzLml0ZW1zID0gW2l0ZW1dO1xuICAgIH1cblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcmVtb3ZlSXRlbShpdGVtOiBPcmNoZXN0cmF0b3JDb25maWdJdGVtPGFueT4pIHtcbiAgICBjb25zdCBpZHggPSB0aGlzLmlucHV0cy5pdGVtcyA/IHRoaXMuaW5wdXRzLml0ZW1zLmluZGV4T2YoaXRlbSkgOiAtMTtcblxuICAgIGlmIChpZHggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pbnB1dHMuaXRlbXMgPSB0aGlzLmlucHV0cy5pdGVtcy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGlkeCk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGNsZWFySXRlbXMoKSB7XG4gICAgdGhpcy5pbnB1dHMuaXRlbXMgPSBbXTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlKCkge1xuICAgIHRoaXMudXBkYXRlQ29tcG9uZW50KCk7XG4gICAgdGhpcy51cGRhdGVDb25maWcoKTtcbiAgICB0aGlzLnVwZGF0ZUluamVjdG9yKCk7XG4gICAgdGhpcy51cGRhdGVJbnB1dHMoKTtcbiAgICB0aGlzLnVwZGF0ZUNvbnRleHRJbnB1dCgpO1xuICAgIHRoaXMudXBkYXRlQXR0cmlidXRlcygpO1xuICAgIHRoaXMudXBkYXRlRGlyZWN0aXZlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVDb21wb25lbnQoKSB7XG4gICAgLy8gSW52YWxpZGF0ZSBsYXRlLWNvbXBvbmVudC1yZWZzIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5jb21wUmVmID0gdGhpcy5jb21wQ2RyID0gdGhpcy5jb21wRmFjdG9yeSA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5pdGVtKSB7XG4gICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSB0aGlzLmNvbXBvbmVudExvY2F0b3JTZXJ2aWNlLnJlc29sdmUoXG4gICAgICAgIHRoaXMuaXRlbS5jb21wb25lbnQsXG4gICAgICApO1xuICAgICAgdGhpcy5jb21wb25lbnRzUmVnaXN0cnlTZXJ2aWNlLndhaXRGb3IodGhpcy5pdGVtc0xlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IG51bGw7XG4gICAgICB0aGlzLmNvbXBvbmVudHNSZWdpc3RyeVNlcnZpY2Uud2FpdEZvcigwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbmZpZygpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5jb21wb25lbnRMb2NhdG9yU2VydmljZS5nZXREZWZhdWx0Q29uZmlnKHRoaXMuY29tcG9uZW50VHlwZSksXG4gICAgICAgIC4uLnRoaXMuaXRlbS5jb25maWcsXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVJbmplY3RvcigpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlKSB7XG4gICAgICB0aGlzLmluamVjdG9yID0gdGhpcy5jcmVhdGVJbmplY3RvcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluamVjdG9yID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUlucHV0cygpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlKSB7XG4gICAgICB0aGlzLmlucHV0cy5pdGVtcyA9IHRoaXMuaXRlbS5pdGVtcztcbiAgICAgIHRoaXMuaW5wdXRzLmNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRzLml0ZW1zID0gdGhpcy5pbnB1dHMuY29uZmlnID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUF0dHJpYnV0ZXMoKSB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50VHlwZSkge1xuICAgICAgdGhpcy5hdHRyaWJ1dGVzID0gdGhpcy5pdGVtLmF0dHJpYnV0ZXMgfHwgbnVsbDtcblxuICAgICAgaWYgKHRoaXMuaXRlbS5pZCkge1xuICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSB7IC4uLnRoaXMuYXR0cmlidXRlcywgaWQ6IHRoaXMuaXRlbS5pZCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRGlyZWN0aXZlcygpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlICYmIHRoaXMuaXRlbS5jbGFzc2VzKSB7XG4gICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBbXG4gICAgICAgIGR5bmFtaWNEaXJlY3RpdmVEZWYoTmdDbGFzcywgeyBuZ0NsYXNzOiB0aGlzLml0ZW0uY2xhc3NlcyB9KSxcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IFtdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29uZmlnKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmRlY29kZShcbiAgICAgICAgdGhpcy5jb21wb25lbnRMb2NhdG9yU2VydmljZS5nZXRDb25maWdUeXBlKHRoaXMuY29tcG9uZW50VHlwZSksXG4gICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICB0aGlzLmluamVjdG9yLFxuICAgICAgKSB8fCB7fVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUluamVjdG9yKCkge1xuICAgIHJldHVybiB0aGlzLm1hcHBlZEluamVjdG9yRmFjdG9yeS5jcmVhdGUodGhpcy5jcmVhdGVMb2NhbEluamVjdG9yKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVMb2NhbEluamVjdG9yKCkge1xuICAgIHJldHVybiBjcmVhdGVMb2NhbEluamVjdG9yKHtcbiAgICAgIHBhcmVudEluamVjdG9yOiB0aGlzLmluamVjdG9yUmVnaXN0cnlTZXJ2aWNlLFxuICAgICAgZ2V0Q29tcG9uZW50OiAoKSA9PiB0aGlzLmNvbXBSZWYuaW5zdGFuY2UsXG4gICAgICBnZXRDb25maWc6ICgpID0+IHRoaXMuaW5wdXRzLmNvbmZpZyxcbiAgICAgIHVwZGF0ZUNvbmZpZzogKGNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICByZXR1cm4gKHRoaXMuaW5wdXRzLmNvbmZpZyA9IHsgLi4udGhpcy5pbnB1dHMuY29uZmlnLCAuLi5jb25maWcgfSk7XG4gICAgICB9LFxuICAgICAgaXNDb25maWdWYWxpZDogKCkgPT5cbiAgICAgICAgaXNSaWdodChcbiAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnZhbGlkYXRlKFxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRMb2NhdG9yU2VydmljZS5nZXRDb25maWdUeXBlKHRoaXMuY29tcG9uZW50VHlwZSksXG4gICAgICAgICAgICB0aGlzLmlucHV0cy5jb25maWcsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIGdldENvbnRleHQ6ICgpID0+IHRoaXMuY29udGV4dCxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSGFuZGxlcnMoKSB7XG4gICAgdGhpcy5kaXNwb3NlSGFuZGxlcnMoKTtcblxuICAgIGlmICghdGhpcy5pdGVtLmhhbmRsZXJzIHx8ICF0aGlzLmNvbXBSZWYgfHwgIXRoaXMuY29tcEZhY3RvcnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB7IGhhbmRsZXJzIH0gPSB0aGlzLml0ZW07XG5cbiAgICB0aGlzLmRpc3Bvc2FibGVIYW5kbGVycyA9IE9iamVjdC5rZXlzKGhhbmRsZXJzKVxuICAgICAgLm1hcCgoZXZlbnQpID0+ICh7XG4gICAgICAgIGV2ZW50LFxuICAgICAgICBoYW5kbGVyOiB0aGlzLmRlY29kZUhhbmRsZXIoaGFuZGxlcnNbZXZlbnRdKSxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcigoeyBoYW5kbGVyIH0pID0+IGhhbmRsZXIpXG4gICAgICAubWFwKCh7IGV2ZW50LCBoYW5kbGVyIH0pID0+IHRoaXMuYXR0YWNoSGFuZGxlcihldmVudCwgaGFuZGxlcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBkZWNvZGVIYW5kbGVyKGhhbmRsZXI6IEZ1bmN0aW9uIHwgc3RyaW5nKTogRnVuY3Rpb24ge1xuICAgIGNvbnN0IGZuID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5kZWNvZGUoXG4gICAgICBIYW5kbGVyLFxuICAgICAgeyBoYW5kbGVyIH0sXG4gICAgICB0aGlzLmluamVjdG9yLFxuICAgICkuaGFuZGxlcjtcbiAgICByZXR1cm4gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nID8gZm4gOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBhdHRhY2hIYW5kbGVyKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgIGNvbnN0IG91dHB1dEluZm8gPSB0aGlzLmNvbXBGYWN0b3J5Lm91dHB1dHMuZmluZChcbiAgICAgIChvdXRwdXQpID0+IG91dHB1dC50ZW1wbGF0ZU5hbWUgPT09IGV2ZW50LFxuICAgICk7XG5cbiAgICBpZiAob3V0cHV0SW5mbykge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jb21wUmVmLmluc3RhbmNlW1xuICAgICAgICBvdXRwdXRJbmZvLnByb3BOYW1lXG4gICAgICBdIGFzIE9ic2VydmFibGU8YW55PjtcbiAgICAgIGNvbnN0IHN1YiA9IG91dHB1dC5zdWJzY3JpYmUoaGFuZGxlciBhcyBhbnkpO1xuICAgICAgcmV0dXJuICgpID0+IHN1Yi51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmxpc3RlbihcbiAgICAgIHRoaXMuY29tcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LFxuICAgICAgZXZlbnQsXG4gICAgICBoYW5kbGVyIGFzIGFueSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlSGFuZGxlcnMoKSB7XG4gICAgdGhpcy5kaXNwb3NhYmxlSGFuZGxlcnMuZm9yRWFjaCgoZGlzcG9zZUhhbmRsZXIpID0+IGRpc3Bvc2VIYW5kbGVyKCkpO1xuICAgIHRoaXMuZGlzcG9zYWJsZUhhbmRsZXJzID0gW107XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvbnRleHRJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnRUeXBlKSB7XG4gICAgICB0aGlzLmlucHV0cy5jb250ZXh0ID0gdGhpcy5jb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmlucHV0cy5jb250ZXh0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiIsIjxuZGMtZHluYW1pY1xuICBbbmRjRHluYW1pY0NvbXBvbmVudF09XCJjb21wb25lbnRUeXBlXCJcbiAgW25kY0R5bmFtaWNJbnB1dHNdPVwiaW5wdXRzXCJcbiAgW25kY0R5bmFtaWNJbmplY3Rvcl09XCJpbmplY3RvclwiXG4gIFtuZGNEeW5hbWljQXR0cmlidXRlc109XCJhdHRyaWJ1dGVzXCJcbiAgW25kY0R5bmFtaWNEaXJlY3RpdmVzXT1cImRpcmVjdGl2ZXNcIlxuICAobmRjRHluYW1pY0NyZWF0ZWQpPVwib25Db21wb25lbnRDcmVhdGVkKCRldmVudClcIlxuPjwvbmRjLWR5bmFtaWM+XG4iXX0=