family-hierarchy
Version:
A small library for **Angular 9+** that implements [vis-network](https://github.com/visjs/vis-network) to generate a hierarchy chart of a family.
198 lines • 26.9 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { Subject, BehaviorSubject } from 'rxjs';
import { DataSet } from 'vis-network/standalone';
import { DEFAULT_CONFIG } from '../config/default';
import { isObject } from 'util';
import * as i0 from "@angular/core";
/* tslint:disable */
let FamilyHierarchyService = class FamilyHierarchyService {
constructor() {
this.currentEdges = new BehaviorSubject(new DataSet());
this._Edges = this.currentEdges.asObservable();
this.currentNodes = new BehaviorSubject(new DataSet());
this._Nodes = this.currentNodes.asObservable();
this.currentFhNodes = new BehaviorSubject([]);
this._fhNodes = this.currentFhNodes.asObservable();
this.currentFhUnions = new BehaviorSubject([]);
this._fhUnions = this.currentFhUnions.asObservable();
this.currentFhLinks = new BehaviorSubject([]);
this._fhLinks = this.currentFhLinks.asObservable();
this.currentConfig = new BehaviorSubject(DEFAULT_CONFIG);
this._config = this.currentConfig.asObservable();
this.init = new Subject();
this._init = this.init.asObservable();
this._clickNode = new Subject();
this.clickNode = this._clickNode.asObservable();
this._clickUnion = new Subject();
this.clickUnion = this._clickUnion.asObservable();
this._clickLink = new Subject();
this.clickLink = this._clickLink.asObservable();
}
get Edges() {
return this._Edges;
}
get Nodes() {
return this._Nodes;
}
setFhNodes(nodes) {
this.currentNodes.next(this.generateNodes(nodes));
this.currentFhNodes.next(nodes);
}
get FhNodes() {
return this._fhNodes;
}
setFhUnions(unions) {
this.generateUnions(unions);
this.currentFhUnions.next(unions);
}
get FhUnions() {
return this._fhUnions;
}
setFhLinks(links) {
this.currentEdges.next(this.generateEdges(links));
this.currentFhLinks.next(links);
}
get FhLinks() {
return this._fhLinks;
}
setConfig(config) {
this.currentConfig.next(this.mergeDeep(this.currentConfig.getValue(), config));
}
get config() {
return this._config;
}
sendClickEvent(e, type) {
if (type === 'node') {
const node = this.currentFhNodes.getValue().find(el => el.id === e.nodes[0]);
if (node) {
this._clickNode.next(node);
}
else {
const id = e.nodes[0].replace('u', '');
const union = this.currentFhUnions.getValue().find(el => el.id == id);
this._clickUnion.next(union);
}
}
else {
const link = this.currentFhLinks.getValue().find(el => el.id == e.edges[0]);
if (link) {
this._clickLink.next(link);
}
else {
const regex = /(?<=l)(.*?)(?=_)/;
const id = e.edges[0].toString().match(regex)[0];
this._clickLink.next(this.currentFhUnions.getValue().find(o => o.id == id));
}
}
}
initialize(data, config) {
this.currentFhLinks.next(data.links);
this.currentFhNodes.next(data.nodes);
this.currentFhUnions.next(data.unions);
this.currentEdges.next(this.generateEdges(data.links)),
this.currentNodes.next(this.generateNodes(data.nodes));
this.generateUnions(data.unions);
if (config) {
this.setConfig(config);
}
this.init.next(true);
}
mergeDeep(target, ...sources) {
if (!sources.length) {
return target;
}
const source = sources.shift();
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) {
Object.assign(target, { [key]: {} });
}
else {
target[key] = Object.assign({}, target[key]);
}
this.mergeDeep(target[key], source[key]);
}
else {
Object.assign(target, { [key]: source[key] });
}
}
}
return this.mergeDeep(target, ...sources);
}
generateNodes(nodes) {
return new DataSet(nodes.map((o) => {
return this.createNode(o);
}));
}
createNode(o) {
return {
id: o.id,
image: o.image ? o.image : this.currentConfig.getValue().nodes.images,
shape: 'image',
size: this.currentConfig.getValue().nodes.size,
level: (o.level * 2) - 1,
label: o.label
};
}
createEdge(o) {
return {
id: o.id,
from: o.nodeId,
to: `u${o.unionId}`,
color: this.currentConfig.getValue().links.childrens.styles
};
}
generateEdges(links) {
return new DataSet(links.map((o) => {
return this.createEdge(o);
}));
}
generateUnions(unions) {
unions.forEach((u) => {
this.createUnion(u);
});
}
createUnion(u) {
let level;
const node = {
id: `u${u.id}`,
image: this.currentConfig.getValue().union.images,
shape: 'image',
size: this.currentConfig.getValue().union.size,
};
u.components.forEach((e) => {
const edge = {
id: `l${u.id}_${node.id}-${e}`,
from: node.id,
to: e,
color: this.currentConfig.getValue().links.parents.styles,
};
level = this.currentFhNodes.getValue().filter(n => n.id === e)[0].level;
this.currentEdges.getValue().add(edge);
});
node.level = (level * 2);
this.currentNodes.getValue().add(node);
}
addNode(node) {
this.currentFhNodes.getValue().push(node);
this.currentNodes.getValue().add(this.createNode(node));
}
addLink(link) {
this.currentFhLinks.getValue().push(link);
this.currentEdges.getValue().add(this.createEdge(link));
}
addUnion(union) {
this.currentFhUnions.getValue().push(union);
this.createUnion(union);
}
};
FamilyHierarchyService.ɵprov = i0.ɵɵdefineInjectable({ factory: function FamilyHierarchyService_Factory() { return new FamilyHierarchyService(); }, token: FamilyHierarchyService, providedIn: "root" });
FamilyHierarchyService = __decorate([
Injectable({
providedIn: 'root'
})
], FamilyHierarchyService);
export { FamilyHierarchyService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFtaWx5LWhpZXJhcmNoeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vZmFtaWx5LWhpZXJhcmNoeS8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2ZhbWlseS1oaWVyYXJjaHkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUU1RCxPQUFPLEVBQUUsT0FBTyxFQUFvQixNQUFNLHdCQUF3QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUVoQyxvQkFBb0I7QUFLcEIsSUFBYSxzQkFBc0IsR0FBbkMsTUFBYSxzQkFBc0I7SUF3RmpDO1FBdkZRLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWdCLElBQUksT0FBTyxFQUFRLENBQUMsQ0FBQztRQUN2RSxXQUFNLEdBQStCLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFNdEUsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBZ0IsSUFBSSxPQUFPLEVBQVEsQ0FBQyxDQUFDO1FBQ3ZFLFdBQU0sR0FBK0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQU10RSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3JELGFBQVEsR0FBMEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQVNwRSxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFhLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELGNBQVMsR0FBMkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQVN2RSxtQkFBYyxHQUFHLElBQUksZUFBZSxDQUFZLEVBQUUsQ0FB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LFFBQVEsQ0FBQyxLQUFjO1FBQzVCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGLENBQUE7O0FBL01ZLHNCQUFzQjtJQUhsQyxVQUFVLENBQUM7UUFDVixVQUFVLEVBQUUsTUFBTTtLQUNuQixDQUFDO0dBQ1csc0JBQXNCLENBK01sQztTQS9NWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBGaE5vZGUsIEZoVW5pb24sIEZoTGluaywgRmhDb25maWcsIEZoRGF0YSB9IGZyb20gJy4uL21vZGVscy9tb2RlbHMnO1xyXG5pbXBvcnQgeyBEYXRhU2V0LCBOb2RlLCBFZGdlLCBEYXRhIH0gZnJvbSAndmlzLW5ldHdvcmsvc3RhbmRhbG9uZSc7XHJcbmltcG9ydCB7IERFRkFVTFRfQ09ORklHIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQnO1xyXG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ3V0aWwnO1xyXG5cclxuLyogdHNsaW50OmRpc2FibGUgKi9cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEZhbWlseUhpZXJhcmNoeVNlcnZpY2Uge1xyXG4gIHByaXZhdGUgY3VycmVudEVkZ2VzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxEYXRhU2V0PEVkZ2U+PihuZXcgRGF0YVNldDxFZGdlPigpKTtcclxuICBwcml2YXRlIF9FZGdlcyA6IE9ic2VydmFibGU8RGF0YVNldDxFZGdlPj4gPSB0aGlzLmN1cnJlbnRFZGdlcy5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHVibGljIGdldCBFZGdlcygpOiBPYnNlcnZhYmxlPERhdGFTZXQ8RWRnZT4+IHtcclxuICAgIHJldHVybiB0aGlzLl9FZGdlcztcclxuICB9XHJcbiAgXHJcbiAgcHJpdmF0ZSBjdXJyZW50Tm9kZXMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGFTZXQ8Tm9kZT4+KG5ldyBEYXRhU2V0PE5vZGU+KCkpO1xyXG4gIHByaXZhdGUgX05vZGVzIDogT2JzZXJ2YWJsZTxEYXRhU2V0PE5vZGU+PiA9IHRoaXMuY3VycmVudE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwdWJsaWMgZ2V0IE5vZGVzKCk6IE9ic2VydmFibGU8RGF0YVNldDxOb2RlPj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX05vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhOb2RlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhOb2RlIFtdPihbXSk7XHJcbiAgcHVibGljIF9maE5vZGVzOiBPYnNlcnZhYmxlPEZoTm9kZSBbXT4gPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaE5vZGVzKG5vZGVzOiBGaE5vZGUgW10pIHtcclxuICAgIHRoaXMuY3VycmVudE5vZGVzLm5leHQodGhpcy5nZW5lcmF0ZU5vZGVzKG5vZGVzKSk7XHJcbiAgICB0aGlzLmN1cnJlbnRGaE5vZGVzLm5leHQobm9kZXMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoTm9kZXMoKTogT2JzZXJ2YWJsZTxGaE5vZGUgW10+IHtcclxuICAgIHJldHVybiB0aGlzLl9maE5vZGVzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhVbmlvbnMgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZoVW5pb24gW10+KFtdKTtcclxuICBwdWJsaWMgX2ZoVW5pb25zOiBPYnNlcnZhYmxlPEZoVW5pb24gW10+ID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldEZoVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSkge1xyXG4gICAgdGhpcy5nZW5lcmF0ZVVuaW9ucyh1bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RmhVbmlvbnMubmV4dCh1bmlvbnMpO1xyXG4gIH1cclxuICBwdWJsaWMgZ2V0IEZoVW5pb25zKCk6IE9ic2VydmFibGU8RmhVbmlvbiBbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZoVW5pb25zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50RmhMaW5rcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhMaW5rIFtdPihbXSk7XHJcbiAgcHVibGljIF9maExpbmtzOiBPYnNlcnZhYmxlPEZoTGluayBbXT4gPSB0aGlzLmN1cnJlbnRGaExpbmtzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBzZXRGaExpbmtzKGxpbmtzOiBGaExpbmsgW10pIHtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLm5leHQodGhpcy5nZW5lcmF0ZUVkZ2VzKGxpbmtzKSlcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChsaW5rcyk7XHJcbiAgfVxyXG4gIGdldCBGaExpbmtzKCk6IE9ic2VydmFibGU8RmhMaW5rIFtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZmhMaW5rcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3VycmVudENvbmZpZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RmhDb25maWc+KERFRkFVTFRfQ09ORklHKTtcclxuICBwdWJsaWMgX2NvbmZpZzogT2JzZXJ2YWJsZTxGaENvbmZpZz4gPSB0aGlzLmN1cnJlbnRDb25maWcuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHVibGljIHNldENvbmZpZyhjb25maWc6IEZoQ29uZmlnKSB7XHJcbiAgICB0aGlzLmN1cnJlbnRDb25maWcubmV4dCh0aGlzLm1lcmdlRGVlcCh0aGlzLmN1cnJlbnRDb25maWcuZ2V0VmFsdWUoKSwgY29uZmlnKSk7XHJcbiAgfVxyXG4gIHB1YmxpYyBnZXQgY29uZmlnKCk6IE9ic2VydmFibGU8RmhDb25maWc+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gIHB1YmxpYyBfaW5pdDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuaW5pdC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBfY2xpY2tOb2RlID0gbmV3IFN1YmplY3Q8YW55PigpO1xyXG4gIHB1YmxpYyBjbGlja05vZGUgPSB0aGlzLl9jbGlja05vZGUuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2NsaWNrVW5pb24gPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrVW5pb24gPSB0aGlzLl9jbGlja1VuaW9uLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIF9jbGlja0xpbmsgPSBuZXcgU3ViamVjdDxhbnk+KCk7XHJcbiAgcHVibGljIGNsaWNrTGluayA9IHRoaXMuX2NsaWNrTGluay5hc09ic2VydmFibGUoKTtcclxuICBcclxuICBwdWJsaWMgc2VuZENsaWNrRXZlbnQoZTogYW55LCB0eXBlPzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ25vZGUnKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmN1cnJlbnRGaE5vZGVzLmdldFZhbHVlKCkuZmluZCggZWwgPT4gZWwuaWQgPT09IGUubm9kZXNbMF0pO1xyXG4gICAgICBpZiAobm9kZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaWNrTm9kZS5uZXh0KG5vZGUpO1xyXG4gICAgICB9IGVsc2UgeyBcclxuICAgICAgICBjb25zdCBpZCA9IGUubm9kZXNbMF0ucmVwbGFjZSgndScsJycpO1xyXG4gICAgICAgIGNvbnN0IHVuaW9uID0gdGhpcy5jdXJyZW50RmhVbmlvbnMuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBpZClcclxuICAgICAgICB0aGlzLl9jbGlja1VuaW9uLm5leHQodW5pb24pO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBsaW5rICA9IHRoaXMuY3VycmVudEZoTGlua3MuZ2V0VmFsdWUoKS5maW5kKCBlbCA9PiBlbC5pZCA9PSBlLmVkZ2VzWzBdKTtcclxuICAgICAgaWYgKGxpbmspIHtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dChsaW5rKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCByZWdleCA9IC8oPzw9bCkoLio/KSg/PV8pLztcclxuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gZS5lZGdlc1swXS50b1N0cmluZygpLm1hdGNoKHJlZ2V4KVswXTtcclxuICAgICAgICB0aGlzLl9jbGlja0xpbmsubmV4dCh0aGlzLmN1cnJlbnRGaFVuaW9ucy5nZXRWYWx1ZSgpLmZpbmQoIG8gPT4gby5pZCA9PSBpZCkgKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBpbml0aWFsaXplKGRhdGE6IEZoRGF0YSwgY29uZmlnPzogRmhDb25maWcpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoTGlua3MubmV4dChkYXRhLmxpbmtzKTtcclxuICAgIHRoaXMuY3VycmVudEZoTm9kZXMubmV4dChkYXRhLm5vZGVzKTtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLm5leHQoZGF0YS51bmlvbnMpO1xyXG4gICAgdGhpcy5jdXJyZW50RWRnZXMubmV4dCh0aGlzLmdlbmVyYXRlRWRnZXMoZGF0YS5saW5rcykpLFxyXG4gICAgdGhpcy5jdXJyZW50Tm9kZXMubmV4dCh0aGlzLmdlbmVyYXRlTm9kZXMoZGF0YS5ub2RlcykpXHJcbiAgICB0aGlzLmdlbmVyYXRlVW5pb25zKGRhdGEudW5pb25zKTtcclxuXHJcbiAgICBpZiAoY29uZmlnKSB7XHJcbiAgICAgIHRoaXMuc2V0Q29uZmlnKGNvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbml0Lm5leHQodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG1lcmdlRGVlcCh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcclxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHsgcmV0dXJuIHRhcmdldDsgfVxyXG4gICAgY29uc3Qgc291cmNlID0gc291cmNlcy5zaGlmdCgpO1xyXG4gICAgaWYgKGlzT2JqZWN0KHRhcmdldCkgJiYgaXNPYmplY3Qoc291cmNlKSkge1xyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzb3VyY2UpIHtcclxuICAgICAgICBpZiAoaXNPYmplY3Qoc291cmNlW2tleV0pKSB7XHJcbiAgICAgICAgICBpZiAoIXRhcmdldFtrZXldKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7IFtrZXldOiB7fSB9KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRhcmdldFtrZXldID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0W2tleV0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5tZXJnZURlZXAodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHsgW2tleV06IHNvdXJjZVtrZXldIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWVyZ2VEZWVwKHRhcmdldCwgLi4uc291cmNlcyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlTm9kZXMobm9kZXM6IEZoTm9kZSBbXSk6IERhdGFTZXQ8Tm9kZT4ge1xyXG4gICAgcmV0dXJuIG5ldyBEYXRhU2V0PE5vZGU+IChcclxuICAgICAgbm9kZXMubWFwKFxyXG4gICAgICAgIChvOiBGaE5vZGUpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vZGUobyk7XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVOb2RlKG86IEZoTm9kZSk6IE5vZGUge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQgOiBvLmlkLFxyXG4gICAgICBpbWFnZSA6IG8uaW1hZ2UgPyBvLmltYWdlIDogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubm9kZXMuaW1hZ2VzLFxyXG4gICAgICBzaGFwZTogJ2ltYWdlJyxcclxuICAgICAgc2l6ZSA6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLm5vZGVzLnNpemUsXHJcbiAgICAgIGxldmVsIDogKG8ubGV2ZWwgKiAyKSAtIDEsXHJcbiAgICAgIGxhYmVsIDogby5sYWJlbFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRWRnZShvOiBGaExpbmspOiBFZGdlIHtcclxuICAgcmV0dXJuIHtcclxuICAgICAgaWQ6IG8uaWQsXHJcbiAgICAgIGZyb206IG8ubm9kZUlkLFxyXG4gICAgICB0bzogYHUke28udW5pb25JZH1gLFxyXG4gICAgICBjb2xvcjogdGhpcy5jdXJyZW50Q29uZmlnLmdldFZhbHVlKCkubGlua3MuY2hpbGRyZW5zLnN0eWxlc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2VuZXJhdGVFZGdlcyhsaW5rczogRmhMaW5rIFtdKTogRGF0YVNldDxFZGdlPiB7XHJcbiAgICByZXR1cm4gbmV3IERhdGFTZXQ8RWRnZT4gKFxyXG4gICAgICBsaW5rcy5tYXAoXHJcbiAgICAgICAgKG86IEZoTGluaykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlRWRnZShvKTtcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlVW5pb25zKHVuaW9uczogRmhVbmlvbiBbXSk6IHZvaWQge1xyXG4gICAgdW5pb25zLmZvckVhY2goKHU6IEZoVW5pb24pID0+IHtcclxuICAgICAgdGhpcy5jcmVhdGVVbmlvbih1KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVVbmlvbih1OiBGaFVuaW9uKTogdm9pZCB7XHJcbiAgICBsZXQgbGV2ZWw7XHJcbiAgICBjb25zdCBub2RlOiBOb2RlID0ge1xyXG4gICAgICBpZDogYHUke3UuaWR9YCxcclxuICAgICAgaW1hZ2U6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLmltYWdlcyxcclxuICAgICAgc2hhcGU6ICdpbWFnZScsXHJcbiAgICAgIHNpemU6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLnVuaW9uLnNpemUsXHJcbiAgICB9O1xyXG4gICAgdS5jb21wb25lbnRzLmZvckVhY2goKGU6bnVtYmVyIHwgc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IGVkZ2U6IEVkZ2UgPSB7XHJcbiAgICAgICAgaWQ6IGBsJHt1LmlkfV8ke25vZGUuaWR9LSR7ZX1gLFxyXG4gICAgICAgIGZyb206IG5vZGUuaWQsXHJcbiAgICAgICAgdG86IGUsXHJcbiAgICAgICAgY29sb3I6IHRoaXMuY3VycmVudENvbmZpZy5nZXRWYWx1ZSgpLmxpbmtzLnBhcmVudHMuc3R5bGVzLFxyXG4gICAgICB9O1xyXG4gICAgICBsZXZlbCA9IHRoaXMuY3VycmVudEZoTm9kZXMuZ2V0VmFsdWUoKS5maWx0ZXIoIG4gPT4gbi5pZCA9PT0gZSlbMF0ubGV2ZWw7XHJcbiAgICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKGVkZ2UpO1xyXG4gICAgfSk7XHJcbiAgICBub2RlLmxldmVsID0gKGxldmVsICogMik7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZChub2RlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGROb2RlKG5vZGU6IEZoTm9kZSk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50RmhOb2Rlcy5nZXRWYWx1ZSgpLnB1c2gobm9kZSk7XHJcbiAgICB0aGlzLmN1cnJlbnROb2Rlcy5nZXRWYWx1ZSgpLmFkZCh0aGlzLmNyZWF0ZU5vZGUobm9kZSkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZExpbmsobGluazogRmhMaW5rKTogdm9pZCB7XHJcbiAgICB0aGlzLmN1cnJlbnRGaExpbmtzLmdldFZhbHVlKCkucHVzaChsaW5rKTtcclxuICAgIHRoaXMuY3VycmVudEVkZ2VzLmdldFZhbHVlKCkuYWRkKHRoaXMuY3JlYXRlRWRnZShsaW5rKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkVW5pb24odW5pb246IEZoVW5pb24pOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudEZoVW5pb25zLmdldFZhbHVlKCkucHVzaCh1bmlvbik7XHJcbiAgICB0aGlzLmNyZWF0ZVVuaW9uKHVuaW9uKTtcclxuICB9XHJcbn1cclxuIl19