UNPKG

frava-sortablejs

Version:
168 lines 23.8 kB
import { Directive, EventEmitter, Inject, Input, Optional, Output, } from "@angular/core"; import Sortable from "sortablejs"; import { GLOBALS } from "./globals"; import { SortablejsBindings } from "./sortablejs-bindings"; import * as i0 from "@angular/core"; import * as i1 from "./sortablejs.service"; const getIndexesFromEvent = (event) => { if (event.hasOwnProperty("newDraggableIndex") && event.hasOwnProperty("oldDraggableIndex")) { return { new: event.newDraggableIndex, old: event.oldDraggableIndex, }; } else { return { new: event.newIndex, old: event.oldIndex, }; } }; export class SortablejsDirective { constructor(globalConfig, service, element, zone, renderer) { this.globalConfig = globalConfig; this.service = service; this.element = element; this.zone = zone; this.renderer = renderer; this.sortablejsInit = new EventEmitter(); } ngOnInit() { if (Sortable && Sortable.create) { // Sortable does not exist in angular universal (SSR) this.zone.runOutsideAngular(() => { this.create(); }); } } ngOnChanges(changes) { const optionsChange = changes.sortablejsOptions; if (optionsChange && !optionsChange.isFirstChange()) { const previousOptions = optionsChange.previousValue; const currentOptions = optionsChange.currentValue; Object.keys(currentOptions).forEach((optionName) => { if (currentOptions[optionName] !== previousOptions[optionName]) { // use low-level option setter this.sortableInstance.option(optionName, this.options[optionName]); } }); } } ngOnDestroy() { if (this.sortableInstance) { this.sortableInstance.destroy(); } } create() { const container = this.sortablejsContainer ? this.element.nativeElement.querySelector(this.sortablejsContainer) : this.element.nativeElement; setTimeout(() => { this.sortableInstance = Sortable.create(container, this.options); this.sortablejsInit.emit(this.sortableInstance); }, 0); } getBindings() { if (!this.sortablejs) { return new SortablejsBindings([]); } else if (this.sortablejs instanceof SortablejsBindings) { return this.sortablejs; } else { return new SortablejsBindings([this.sortablejs]); } } get options() { return { ...this.optionsWithoutEvents, ...this.overridenOptions }; } get optionsWithoutEvents() { return { ...(this.globalConfig || {}), ...(this.sortablejsOptions || {}) }; } proxyEvent(eventName, ...params) { this.zone.run(() => { // re-entering zone, see https://github.com/SortableJS/angular-sortablejs/issues/110#issuecomment-408874600 if (this.optionsWithoutEvents && this.optionsWithoutEvents[eventName]) { this.optionsWithoutEvents[eventName](...params); } }); } get isCloning() { return (this.sortableInstance.options.group.checkPull(this.sortableInstance, this.sortableInstance) === "clone"); } clone(item) { // by default pass the item through, no cloning performed return (this.sortablejsCloneFunction || ((subitem) => subitem))(item); } get overridenOptions() { // always intercept standard events but act only in case items are set (bindingEnabled) // allows to forget about tracking this.items changes return { onAdd: (event) => { this.service.transfer = (items) => { this.getBindings().injectIntoEvery(event.newIndex, items); this.proxyEvent("onAdd", event); }; this.proxyEvent("onAddOriginal", event); }, onRemove: (event) => { const bindings = this.getBindings(); if (bindings.provided) { if (this.isCloning) { this.service.transfer(bindings .getFromEvery(event.oldIndex) .map((item) => this.clone(item))); // great thanks to https://github.com/tauu // event.item is the original item from the source list which is moved to the target list // event.clone is a clone of the original item and will be added to source list // If bindings are provided, adding the item dom element to the target list causes artifacts // as it interferes with the rendering performed by the angular template. // Therefore we remove it immediately and also move the original item back to the source list. // (event handler may be attached to the original item and not its clone, therefore keeping // the original dom node, circumvents side effects ) this.renderer.removeChild(event.item.parentNode, event.item); this.renderer.insertBefore(event.clone.parentNode, event.item, event.clone); this.renderer.removeChild(event.clone.parentNode, event.clone); } else { this.service.transfer(bindings.extractFromEvery(event.oldIndex)); } this.service.transfer = null; } this.proxyEvent("onRemove", event); }, onUpdate: (event) => { const bindings = this.getBindings(); const indexes = getIndexesFromEvent(event); bindings.injectIntoEvery(indexes.new, bindings.extractFromEvery(indexes.old)); this.proxyEvent("onUpdate", event); }, }; } } /** @nocollapse */ /** @nocollapse */ SortablejsDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SortablejsDirective, deps: [{ token: GLOBALS, optional: true }, { token: i1.SortablejsService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ /** @nocollapse */ SortablejsDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.11", type: SortablejsDirective, selector: "[sortablejs]", inputs: { sortablejs: "sortablejs", sortablejsContainer: "sortablejsContainer", sortablejsOptions: "sortablejsOptions", sortablejsCloneFunction: "sortablejsCloneFunction" }, outputs: { sortablejsInit: "sortablejsInit" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: SortablejsDirective, decorators: [{ type: Directive, args: [{ // eslint-disable-next-line @angular-eslint/directive-selector selector: "[sortablejs]", }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [GLOBALS] }] }, { type: i1.SortablejsService }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }]; }, propDecorators: { sortablejs: [{ type: Input }], sortablejsContainer: [{ type: Input }], sortablejsOptions: [{ type: Input }], sortablejsCloneFunction: [{ type: Input }], sortablejsInit: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGFibGVqcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtc29ydGFibGVqcy9zcmMvbGliL3NvcnRhYmxlanMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBS0wsUUFBUSxFQUNSLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFFBQXFCLE1BQU0sWUFBWSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7OztBQUszRCxNQUFNLG1CQUFtQixHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQ25ELElBQ0UsS0FBSyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQztRQUN6QyxLQUFLLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLEVBQ3pDO1FBQ0EsT0FBTztZQUNMLEdBQUcsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1lBQzVCLEdBQUcsRUFBRSxLQUFLLENBQUMsaUJBQWlCO1NBQzdCLENBQUM7S0FDSDtTQUFNO1FBQ0wsT0FBTztZQUNMLEdBQUcsRUFBRSxLQUFLLENBQUMsUUFBUTtZQUNuQixHQUFHLEVBQUUsS0FBSyxDQUFDLFFBQVE7U0FDcEIsQ0FBQztLQUNIO0FBQ0gsQ0FBQyxDQUFDO0FBTUYsTUFBTSxPQUFPLG1CQUFtQjtJQWlCOUIsWUFDdUMsWUFBcUIsRUFDbEQsT0FBMEIsRUFDMUIsT0FBbUIsRUFDbkIsSUFBWSxFQUNaLFFBQW1CO1FBSlUsaUJBQVksR0FBWixZQUFZLENBQVM7UUFDbEQsWUFBTyxHQUFQLE9BQU8sQ0FBbUI7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBWTtRQUNuQixTQUFJLEdBQUosSUFBSSxDQUFRO1FB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LEtBQW9CLEVBQUUsRUFBRTtnQkFDakMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNwQyxNQUFNLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFFM0MsUUFBUSxDQUFDLGVBQWUsQ0FDdEIsT0FBTyxDQUFDLEdBQUcsRUFDWCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUN2QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7dUpBdEtVLG1CQUFtQixrQkFrQlIsT0FBTzsySUFsQmxCLG1CQUFtQjs0RkFBbkIsbUJBQW1CO2tCQUovQixTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCOzswQkFtQkksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxPQUFPO2tKQWhCN0IsVUFBVTtzQkFEVCxLQUFLO2dCQUlOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFJTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBSU4sdUJBQXVCO3NCQUR0QixLQUFLO2dCQUdJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCBTb3J0YWJsZSwgeyBPcHRpb25zIH0gZnJvbSBcInNvcnRhYmxlanNcIjtcbmltcG9ydCB7IEdMT0JBTFMgfSBmcm9tIFwiLi9nbG9iYWxzXCI7XG5pbXBvcnQgeyBTb3J0YWJsZWpzQmluZGluZ3MgfSBmcm9tIFwiLi9zb3J0YWJsZWpzLWJpbmRpbmdzXCI7XG5pbXBvcnQgeyBTb3J0YWJsZWpzU2VydmljZSB9IGZyb20gXCIuL3NvcnRhYmxlanMuc2VydmljZVwiO1xuXG5leHBvcnQgdHlwZSBTb3J0YWJsZURhdGEgPSBhbnkgfCBhbnlbXTtcblxuY29uc3QgZ2V0SW5kZXhlc0Zyb21FdmVudCA9IChldmVudDogU29ydGFibGVFdmVudCkgPT4ge1xuICBpZiAoXG4gICAgZXZlbnQuaGFzT3duUHJvcGVydHkoXCJuZXdEcmFnZ2FibGVJbmRleFwiKSAmJlxuICAgIGV2ZW50Lmhhc093blByb3BlcnR5KFwib2xkRHJhZ2dhYmxlSW5kZXhcIilcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldzogZXZlbnQubmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICBvbGQ6IGV2ZW50Lm9sZERyYWdnYWJsZUluZGV4LFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5ldzogZXZlbnQubmV3SW5kZXgsXG4gICAgICBvbGQ6IGV2ZW50Lm9sZEluZGV4LFxuICAgIH07XG4gIH1cbn07XG5cbkBEaXJlY3RpdmUoe1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogXCJbc29ydGFibGVqc11cIixcbn0pXG5leHBvcnQgY2xhc3MgU29ydGFibGVqc0RpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKVxuICBzb3J0YWJsZWpzOiBTb3J0YWJsZURhdGE7IC8vIGFycmF5IG9yIGEgRm9ybUFycmF5XG5cbiAgQElucHV0KClcbiAgc29ydGFibGVqc0NvbnRhaW5lcjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIHNvcnRhYmxlanNPcHRpb25zOiBPcHRpb25zO1xuXG4gIEBJbnB1dCgpXG4gIHNvcnRhYmxlanNDbG9uZUZ1bmN0aW9uOiAoaXRlbTogYW55KSA9PiBhbnk7XG5cbiAgQE91dHB1dCgpIHNvcnRhYmxlanNJbml0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHByaXZhdGUgc29ydGFibGVJbnN0YW5jZTogYW55O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0xPQkFMUykgcHJpdmF0ZSBnbG9iYWxDb25maWc6IE9wdGlvbnMsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBTb3J0YWJsZWpzU2VydmljZSxcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAoU29ydGFibGUgJiYgU29ydGFibGUuY3JlYXRlKSB7XG4gICAgICAvLyBTb3J0YWJsZSBkb2VzIG5vdCBleGlzdCBpbiBhbmd1bGFyIHVuaXZlcnNhbCAoU1NSKVxuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5jcmVhdGUoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3AgaW4ga2V5b2YgU29ydGFibGVqc0RpcmVjdGl2ZV06IFNpbXBsZUNoYW5nZSB9KSB7XG4gICAgY29uc3Qgb3B0aW9uc0NoYW5nZTogU2ltcGxlQ2hhbmdlID0gY2hhbmdlcy5zb3J0YWJsZWpzT3B0aW9ucztcblxuICAgIGlmIChvcHRpb25zQ2hhbmdlICYmICFvcHRpb25zQ2hhbmdlLmlzRmlyc3RDaGFuZ2UoKSkge1xuICAgICAgY29uc3QgcHJldmlvdXNPcHRpb25zOiBPcHRpb25zID0gb3B0aW9uc0NoYW5nZS5wcmV2aW91c1ZhbHVlO1xuICAgICAgY29uc3QgY3VycmVudE9wdGlvbnM6IE9wdGlvbnMgPSBvcHRpb25zQ2hhbmdlLmN1cnJlbnRWYWx1ZTtcblxuICAgICAgT2JqZWN0LmtleXMoY3VycmVudE9wdGlvbnMpLmZvckVhY2goKG9wdGlvbk5hbWUpID0+IHtcbiAgICAgICAgaWYgKGN1cnJlbnRPcHRpb25zW29wdGlvbk5hbWVdICE9PSBwcmV2aW91c09wdGlvbnNbb3B0aW9uTmFtZV0pIHtcbiAgICAgICAgICAvLyB1c2UgbG93LWxldmVsIG9wdGlvbiBzZXR0ZXJcbiAgICAgICAgICB0aGlzLnNvcnRhYmxlSW5zdGFuY2Uub3B0aW9uKG9wdGlvbk5hbWUsIHRoaXMub3B0aW9uc1tvcHRpb25OYW1lXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNvcnRhYmxlSW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuc29ydGFibGVJbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGUoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5zb3J0YWJsZWpzQ29udGFpbmVyXG4gICAgICA/IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IodGhpcy5zb3J0YWJsZWpzQ29udGFpbmVyKVxuICAgICAgOiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zb3J0YWJsZUluc3RhbmNlID0gU29ydGFibGUuY3JlYXRlKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMuc29ydGFibGVqc0luaXQuZW1pdCh0aGlzLnNvcnRhYmxlSW5zdGFuY2UpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCaW5kaW5ncygpOiBTb3J0YWJsZWpzQmluZGluZ3Mge1xuICAgIGlmICghdGhpcy5zb3J0YWJsZWpzKSB7XG4gICAgICByZXR1cm4gbmV3IFNvcnRhYmxlanNCaW5kaW5ncyhbXSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNvcnRhYmxlanMgaW5zdGFuY2VvZiBTb3J0YWJsZWpzQmluZGluZ3MpIHtcbiAgICAgIHJldHVybiB0aGlzLnNvcnRhYmxlanM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgU29ydGFibGVqc0JpbmRpbmdzKFt0aGlzLnNvcnRhYmxlanNdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBvcHRpb25zKCkge1xuICAgIHJldHVybiB7IC4uLnRoaXMub3B0aW9uc1dpdGhvdXRFdmVudHMsIC4uLnRoaXMub3ZlcnJpZGVuT3B0aW9ucyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgb3B0aW9uc1dpdGhvdXRFdmVudHMoKSB7XG4gICAgcmV0dXJuIHsgLi4uKHRoaXMuZ2xvYmFsQ29uZmlnIHx8IHt9KSwgLi4uKHRoaXMuc29ydGFibGVqc09wdGlvbnMgfHwge30pIH07XG4gIH1cblxuICBwcml2YXRlIHByb3h5RXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pIHtcbiAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIC8vIHJlLWVudGVyaW5nIHpvbmUsIHNlZSBodHRwczovL2dpdGh1Yi5jb20vU29ydGFibGVKUy9hbmd1bGFyLXNvcnRhYmxlanMvaXNzdWVzLzExMCNpc3N1ZWNvbW1lbnQtNDA4ODc0NjAwXG4gICAgICBpZiAodGhpcy5vcHRpb25zV2l0aG91dEV2ZW50cyAmJiB0aGlzLm9wdGlvbnNXaXRob3V0RXZlbnRzW2V2ZW50TmFtZV0pIHtcbiAgICAgICAgdGhpcy5vcHRpb25zV2l0aG91dEV2ZW50c1tldmVudE5hbWVdKC4uLnBhcmFtcyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBpc0Nsb25pbmcoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc29ydGFibGVJbnN0YW5jZS5vcHRpb25zLmdyb3VwLmNoZWNrUHVsbChcbiAgICAgICAgdGhpcy5zb3J0YWJsZUluc3RhbmNlLFxuICAgICAgICB0aGlzLnNvcnRhYmxlSW5zdGFuY2VcbiAgICAgICkgPT09IFwiY2xvbmVcIlxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNsb25lPFQ+KGl0ZW06IFQpOiBUIHtcbiAgICAvLyBieSBkZWZhdWx0IHBhc3MgdGhlIGl0ZW0gdGhyb3VnaCwgbm8gY2xvbmluZyBwZXJmb3JtZWRcbiAgICByZXR1cm4gKHRoaXMuc29ydGFibGVqc0Nsb25lRnVuY3Rpb24gfHwgKChzdWJpdGVtKSA9PiBzdWJpdGVtKSkoaXRlbSk7XG4gIH1cblxuICBwcml2YXRlIGdldCBvdmVycmlkZW5PcHRpb25zKCk6IE9wdGlvbnMge1xuICAgIC8vIGFsd2F5cyBpbnRlcmNlcHQgc3RhbmRhcmQgZXZlbnRzIGJ1dCBhY3Qgb25seSBpbiBjYXNlIGl0ZW1zIGFyZSBzZXQgKGJpbmRpbmdFbmFibGVkKVxuICAgIC8vIGFsbG93cyB0byBmb3JnZXQgYWJvdXQgdHJhY2tpbmcgdGhpcy5pdGVtcyBjaGFuZ2VzXG4gICAgcmV0dXJuIHtcbiAgICAgIG9uQWRkOiAoZXZlbnQ6IFNvcnRhYmxlRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLnRyYW5zZmVyID0gKGl0ZW1zOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHRoaXMuZ2V0QmluZGluZ3MoKS5pbmplY3RJbnRvRXZlcnkoZXZlbnQubmV3SW5kZXgsIGl0ZW1zKTtcbiAgICAgICAgICB0aGlzLnByb3h5RXZlbnQoXCJvbkFkZFwiLCBldmVudCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5wcm94eUV2ZW50KFwib25BZGRPcmlnaW5hbFwiLCBldmVudCk7XG4gICAgICB9LFxuICAgICAgb25SZW1vdmU6IChldmVudDogU29ydGFibGVFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuZ2V0QmluZGluZ3MoKTtcblxuICAgICAgICBpZiAoYmluZGluZ3MucHJvdmlkZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc0Nsb25pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS50cmFuc2ZlcihcbiAgICAgICAgICAgICAgYmluZGluZ3NcbiAgICAgICAgICAgICAgICAuZ2V0RnJvbUV2ZXJ5KGV2ZW50Lm9sZEluZGV4KVxuICAgICAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+IHRoaXMuY2xvbmUoaXRlbSkpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBncmVhdCB0aGFua3MgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RhdXVcbiAgICAgICAgICAgIC8vIGV2ZW50Lml0ZW0gaXMgdGhlIG9yaWdpbmFsIGl0ZW0gZnJvbSB0aGUgc291cmNlIGxpc3Qgd2hpY2ggaXMgbW92ZWQgdG8gdGhlIHRhcmdldCBsaXN0XG4gICAgICAgICAgICAvLyBldmVudC5jbG9uZSBpcyBhIGNsb25lIG9mIHRoZSBvcmlnaW5hbCBpdGVtIGFuZCB3aWxsIGJlIGFkZGVkIHRvIHNvdXJjZSBsaXN0XG4gICAgICAgICAgICAvLyBJZiBiaW5kaW5ncyBhcmUgcHJvdmlkZWQsIGFkZGluZyB0aGUgaXRlbSBkb20gZWxlbWVudCB0byB0aGUgdGFyZ2V0IGxpc3QgY2F1c2VzIGFydGlmYWN0c1xuICAgICAgICAgICAgLy8gYXMgaXQgaW50ZXJmZXJlcyB3aXRoIHRoZSByZW5kZXJpbmcgcGVyZm9ybWVkIGJ5IHRoZSBhbmd1bGFyIHRlbXBsYXRlLlxuICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIHJlbW92ZSBpdCBpbW1lZGlhdGVseSBhbmQgYWxzbyBtb3ZlIHRoZSBvcmlnaW5hbCBpdGVtIGJhY2sgdG8gdGhlIHNvdXJjZSBsaXN0LlxuICAgICAgICAgICAgLy8gKGV2ZW50IGhhbmRsZXIgbWF5IGJlIGF0dGFjaGVkIHRvIHRoZSBvcmlnaW5hbCBpdGVtIGFuZCBub3QgaXRzIGNsb25lLCB0aGVyZWZvcmUga2VlcGluZ1xuICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIGRvbSBub2RlLCBjaXJjdW12ZW50cyBzaWRlIGVmZmVjdHMgKVxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChldmVudC5pdGVtLnBhcmVudE5vZGUsIGV2ZW50Lml0ZW0pO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoXG4gICAgICAgICAgICAgIGV2ZW50LmNsb25lLnBhcmVudE5vZGUsXG4gICAgICAgICAgICAgIGV2ZW50Lml0ZW0sXG4gICAgICAgICAgICAgIGV2ZW50LmNsb25lXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZChldmVudC5jbG9uZS5wYXJlbnROb2RlLCBldmVudC5jbG9uZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS50cmFuc2ZlcihiaW5kaW5ncy5leHRyYWN0RnJvbUV2ZXJ5KGV2ZW50Lm9sZEluZGV4KSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLnRyYW5zZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucHJveHlFdmVudChcIm9uUmVtb3ZlXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZTogKGV2ZW50OiBTb3J0YWJsZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gdGhpcy5nZXRCaW5kaW5ncygpO1xuICAgICAgICBjb25zdCBpbmRleGVzID0gZ2V0SW5kZXhlc0Zyb21FdmVudChldmVudCk7XG5cbiAgICAgICAgYmluZGluZ3MuaW5qZWN0SW50b0V2ZXJ5KFxuICAgICAgICAgIGluZGV4ZXMubmV3LFxuICAgICAgICAgIGJpbmRpbmdzLmV4dHJhY3RGcm9tRXZlcnkoaW5kZXhlcy5vbGQpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMucHJveHlFdmVudChcIm9uVXBkYXRlXCIsIGV2ZW50KTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgU29ydGFibGVFdmVudCB7XG4gIG9sZEluZGV4OiBudW1iZXI7XG4gIG5ld0luZGV4OiBudW1iZXI7XG4gIG9sZERyYWdnYWJsZUluZGV4PzogbnVtYmVyO1xuICBuZXdEcmFnZ2FibGVJbmRleD86IG51bWJlcjtcbiAgaXRlbTogSFRNTEVsZW1lbnQ7XG4gIGNsb25lOiBIVE1MRWxlbWVudDtcbn1cbiJdfQ==