ngx-suspense
Version:
This library is an experimetnal implementation of React Suspense for Angular.
183 lines • 21.9 kB
JavaScript
import { __decorate, __read, __spread, __values } from "tslib";
import { Component, Input, ContentChildren, } from "@angular/core";
import { NgxSuspenseComponent } from "./ngx-suspense.component";
import { combineLatest, BehaviorSubject, } from "rxjs";
import { filter, skip, pairwise, tap } from "rxjs/operators";
var NgxSuspenseListComponent = /** @class */ (function () {
function NgxSuspenseListComponent() {
this.revealOrder = "*";
this.subs = [];
this.allBroadcasters = [];
this.allListeners = [];
this.hasParentControlSubject = new BehaviorSubject(undefined);
this.parentControl$ = this.hasParentControlSubject.asObservable();
}
NgxSuspenseListComponent_1 = NgxSuspenseListComponent;
NgxSuspenseListComponent.prototype.ngOnInit = function () {
this.parentControl$
.pipe(tap(function (val) {
console.log("release", val);
}))
.subscribe();
};
NgxSuspenseListComponent.prototype.ngAfterContentInit = function () {
var _this = this;
this.allBroadcasters = this.skeletons.map(function (s) { return s.loading$; });
this.allListeners = this.skeletons.map(function (s) { return _this.hideSkeletonListener(s); });
this.revealOrderOperator(this.revealOrder);
};
NgxSuspenseListComponent.prototype.ngOnChanges = function (changes) {
if (changes.revealOrder) {
this.revealOrderOperator(changes.revealOrder.currentValue);
}
};
NgxSuspenseListComponent.prototype.ngOnDestroy = function () {
if (this.subs.length) {
this.subs.forEach(function (sub) { return sub.unsubscribe(); });
this.subs.length = 0;
}
};
NgxSuspenseListComponent.prototype.reload = function (order) {
this.revealOrderOperator(order || this.revealOrder);
};
NgxSuspenseListComponent.prototype.show = function () { };
NgxSuspenseListComponent.prototype.hide = function () { };
NgxSuspenseListComponent.prototype.revealOrderOperator = function (order) {
if (this.allBroadcasters.length === 0 || this.allListeners.length === 0) {
return;
}
if (this.subs.length) {
this.subs.forEach(function (sub) { return sub.unsubscribe(); });
this.subs.length = 0;
}
switch (order) {
case "together": {
var sub = this.togetherOperator(this.allBroadcasters)(this.allListeners);
this.subs.push(sub);
break;
}
case "forwards": {
var subs = this.domOrderOperator(this.allBroadcasters)(this.allListeners);
this.subs = subs;
break;
}
case "backwards": {
var broadcasters = __spread(this.allBroadcasters).reverse();
var listeners = __spread(this.allListeners).reverse();
var subs = this.domOrderOperator(broadcasters)(listeners);
this.subs = subs;
break;
}
default:
// nothing should happen
}
};
NgxSuspenseListComponent.prototype.hideSkeletonListener = function (skeleton) {
return function () {
skeleton.hide();
};
};
NgxSuspenseListComponent.prototype.showSkeletonListener = function (skeleton) {
return function () {
skeleton.show();
};
};
NgxSuspenseListComponent.prototype.togetherOperator = function (broadcasters) {
var _this = this;
this.skeletons.forEach(function (s) { return _this.showSkeletonListener(s)(); });
return function (listeners) {
return combineLatest(__spread(broadcasters))
.pipe(
// skip default
skip(1),
// keep tracking previous value
pairwise(), filter(function (_a) {
var _b = __read(_a, 2), ary1 = _b[0], ary2 = _b[1];
// any loading state is ture
var cond1 = ary1.some(function (b) { return b; });
// all loading state is false
var cond2 = !ary2.some(function (b) { return b; });
// pass only when prev loading state is ture, current is false
return cond1 && cond2;
}))
.subscribe(function () {
listeners.forEach(function (hide) { return hide(); });
});
};
};
NgxSuspenseListComponent.prototype.domOrderOperator = function (broadcasters) {
var _this = this;
this.skeletons.forEach(function (s) { return _this.showSkeletonListener(s)(); });
return function (listeners) {
var subs = [];
var checks = __spread(new Array(broadcasters.length)).fill(null);
broadcasters.forEach(function (boradcaster, index) {
subs.push(boradcaster
.pipe(
// skip default
skip(1),
// keep tracking previous value
pairwise(), filter(function (_a) {
var _b = __read(_a, 2), b1 = _b[0], b2 = _b[1];
// pass only when prev loading state is ture, current is false
return b1 && !b2;
}))
.subscribe(function () {
var e_1, _a;
checks[index] = true;
var indexesToFlush = _this.getFlushIndexes(checks);
try {
for (var indexesToFlush_1 = __values(indexesToFlush), indexesToFlush_1_1 = indexesToFlush_1.next(); !indexesToFlush_1_1.done; indexesToFlush_1_1 = indexesToFlush_1.next()) {
var i = indexesToFlush_1_1.value;
listeners[i]();
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (indexesToFlush_1_1 && !indexesToFlush_1_1.done && (_a = indexesToFlush_1.return)) _a.call(indexesToFlush_1);
}
finally { if (e_1) throw e_1.error; }
}
}));
});
return subs;
};
};
NgxSuspenseListComponent.prototype.getFlushIndexes = function (checks) {
var indexesToFlush = [];
for (var i = 0; i < checks.length; i++) {
if (indexesToFlush.indexOf(i) > -1) {
continue;
}
var check = checks[i];
if (check !== null) {
indexesToFlush.push(i);
}
else {
break;
}
}
return indexesToFlush;
};
var NgxSuspenseListComponent_1;
__decorate([
Input()
], NgxSuspenseListComponent.prototype, "revealOrder", void 0);
__decorate([
ContentChildren(NgxSuspenseComponent)
], NgxSuspenseListComponent.prototype, "skeletons", void 0);
__decorate([
ContentChildren(NgxSuspenseListComponent_1)
], NgxSuspenseListComponent.prototype, "list", void 0);
NgxSuspenseListComponent = NgxSuspenseListComponent_1 = __decorate([
Component({
selector: "SuspenseList",
template: "<ng-content></ng-content>\n",
exportAs: "list"
})
], NgxSuspenseListComponent);
return NgxSuspenseListComponent;
}());
export { NgxSuspenseListComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXN1c3BlbnNlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXN1c3BlbnNlLyIsInNvdXJjZXMiOlsibGliL25neC1zdXNwZW5zZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBRUwsZUFBZSxHQUloQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wsYUFBYSxFQUdiLGVBQWUsR0FFaEIsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFhLE1BQU0sZ0JBQWdCLENBQUM7QUFTeEU7SUFBQTtRQUNXLGdCQUFXLEdBQVcsR0FBRyxDQUFDO1FBUW5DLFNBQUksR0FBd0IsRUFBRSxDQUFDO1FBQy9CLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBRVYsNEJBQXVCLEdBQUcsSUFBSSxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekQsbUJBQWMsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxFQUFFLENBQUM7SUFtS3ZFLENBQUM7aUNBakxZLHdCQUF3QjtJQWdCbkMsMkNBQVEsR0FBUjtRQUNFLElBQUksQ0FBQyxjQUFjO2FBQ2hCLElBQUksQ0FDSCxHQUFHLENBQUMsVUFBQyxHQUFHO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQscURBQWtCLEdBQWxCO1FBQUEsaUJBSUM7UUFIQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLFFBQVEsRUFBVixDQUFVLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsS0FBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxFQUE1QixDQUE0QixDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsOENBQVcsR0FBWCxVQUFZLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFRCw4Q0FBVyxHQUFYO1FBQ0UsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEdBQUcsSUFBSyxPQUFBLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUN0QjtJQUNILENBQUM7SUFFRCx5Q0FBTSxHQUFOLFVBQU8sS0FBSztRQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCx1Q0FBSSxHQUFKLGNBQVEsQ0FBQztJQUVULHVDQUFJLEdBQUosY0FBUSxDQUFDO0lBRUQsc0RBQW1CLEdBQTNCLFVBQTRCLEtBQWE7UUFDdkMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZFLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHLElBQUssT0FBQSxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQWpCLENBQWlCLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxRQUFRLEtBQUssRUFBRTtZQUNiLEtBQUssVUFBVSxDQUFDLENBQUM7Z0JBQ2YsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FDckQsSUFBSSxDQUFDLFlBQVksQ0FDbEIsQ0FBQztnQkFDRixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDcEIsTUFBTTthQUNQO1lBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQztnQkFDZixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUN0RCxJQUFJLENBQUMsWUFBWSxDQUNsQixDQUFDO2dCQUNGLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2dCQUNqQixNQUFNO2FBQ1A7WUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDO2dCQUNoQixJQUFNLFlBQVksR0FBRyxTQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLENBQUM7Z0JBQ3pELElBQU0sU0FBUyxHQUFHLFNBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxPQUFPLEVBQUUsQ0FBQztnQkFDbkQsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDakIsTUFBTTthQUNQO1lBQ0QsUUFBUTtZQUVSLHdCQUF3QjtTQUN6QjtJQUNILENBQUM7SUFFTyx1REFBb0IsR0FBNUIsVUFDRSxRQUF5RDtRQUV6RCxPQUFPO1lBQ0wsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyx1REFBb0IsR0FBNUIsVUFDRSxRQUF5RDtRQUV6RCxPQUFPO1lBQ0wsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2xCLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFTyxtREFBZ0IsR0FBeEIsVUFBeUIsWUFBWTtRQUFyQyxpQkFzQkM7UUFyQkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxLQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBOUIsQ0FBOEIsQ0FBQyxDQUFDO1FBQzlELE9BQU8sVUFBQyxTQUFTO1lBQ2YsT0FBTyxhQUFhLFVBQUssWUFBWSxFQUFFO2lCQUNwQyxJQUFJO1lBQ0gsZUFBZTtZQUNmLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDUCwrQkFBK0I7WUFDL0IsUUFBUSxFQUFFLEVBQ1YsTUFBTSxDQUFDLFVBQUMsRUFBWTtvQkFBWixrQkFBWSxFQUFYLFlBQUksRUFBRSxZQUFJO2dCQUNqQiw0QkFBNEI7Z0JBQzVCLElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLEVBQUQsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLDZCQUE2QjtnQkFDN0IsSUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxFQUFELENBQUMsQ0FBQyxDQUFDO2dCQUNuQyw4REFBOEQ7Z0JBQzlELE9BQU8sS0FBSyxJQUFJLEtBQUssQ0FBQztZQUN4QixDQUFDLENBQUMsQ0FDSDtpQkFDQSxTQUFTLENBQUM7Z0JBQ1QsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFDLElBQVMsSUFBSyxPQUFBLElBQUksRUFBRSxFQUFOLENBQU0sQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVPLG1EQUFnQixHQUF4QixVQUF5QixZQUFZO1FBQXJDLGlCQTZCQztRQTVCQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLEtBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUE5QixDQUE4QixDQUFDLENBQUM7UUFDOUQsT0FBTyxVQUFDLFNBQVM7WUFDZixJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLE1BQU0sR0FBRyxTQUFJLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxVQUFDLFdBQVcsRUFBRSxLQUFLO2dCQUN0QyxJQUFJLENBQUMsSUFBSSxDQUNQLFdBQVc7cUJBQ1IsSUFBSTtnQkFDSCxlQUFlO2dCQUNmLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsK0JBQStCO2dCQUMvQixRQUFRLEVBQUUsRUFDVixNQUFNLENBQUMsVUFBQyxFQUFRO3dCQUFSLGtCQUFRLEVBQVAsVUFBRSxFQUFFLFVBQUU7b0JBQ2IsOERBQThEO29CQUM5RCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDLENBQ0g7cUJBQ0EsU0FBUyxDQUFDOztvQkFDVCxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO29CQUNyQixJQUFNLGNBQWMsR0FBRyxLQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDOzt3QkFDcEQsS0FBYyxJQUFBLG1CQUFBLFNBQUEsY0FBYyxDQUFBLDhDQUFBLDBFQUFFOzRCQUF6QixJQUFJLENBQUMsMkJBQUE7NEJBQ1IsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7eUJBQ2hCOzs7Ozs7Ozs7Z0JBQ0gsQ0FBQyxDQUFDLENBQ0wsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7SUFDSixDQUFDO0lBRU8sa0RBQWUsR0FBdkIsVUFBd0IsTUFBTTtRQUM1QixJQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUNsQyxTQUFTO2FBQ1Y7WUFDRCxJQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDeEIsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFO2dCQUNsQixjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3hCO2lCQUFNO2dCQUNMLE1BQU07YUFDUDtTQUNGO1FBRUQsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQzs7SUEvS1E7UUFBUixLQUFLLEVBQUU7aUVBQTJCO0lBQ0k7UUFBdEMsZUFBZSxDQUFDLG9CQUFvQixDQUFDOytEQUVwQztJQUN5QztRQUExQyxlQUFlLENBQUMsMEJBQXdCLENBQUM7MERBRXhDO0lBUFMsd0JBQXdCO1FBTHBDLFNBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxjQUFjO1lBQ3hCLHVDQUFpRDtZQUNqRCxRQUFRLEVBQUUsTUFBTTtTQUNqQixDQUFDO09BQ1csd0JBQXdCLENBaUxwQztJQUFELCtCQUFDO0NBQUEsQUFqTEQsSUFpTEM7U0FqTFksd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29udGVudENoaWxkcmVuLFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5neFN1c3BlbnNlQ29tcG9uZW50IH0gZnJvbSBcIi4vbmd4LXN1c3BlbnNlLmNvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgY29tYmluZUxhdGVzdCxcbiAgU3Vic2NyaXB0aW9uLFxuICBTdWJqZWN0LFxuICBCZWhhdmlvclN1YmplY3QsXG4gIE9ic2VydmFibGUsXG59IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIHNraXAsIHBhaXJ3aXNlLCB0YXAsIHN0YXJ0V2l0aCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiO1xuXG50eXBlIE9SREVSUyA9IFwiKlwiIHwgXCJ0b2dldGhlclwiIHwgXCJmb3J3YXJkc1wiIHwgXCJiYWNrd2FyZHNcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIlN1c3BlbnNlTGlzdFwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL25neC1zdXNwZW5zZS1saXN0LmNvbXBvbmVudC5odG1sXCIsXG4gIGV4cG9ydEFzOiBcImxpc3RcIixcbn0pXG5leHBvcnQgY2xhc3MgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcmV2ZWFsT3JkZXI6IE9SREVSUyA9IFwiKlwiO1xuICBAQ29udGVudENoaWxkcmVuKE5neFN1c3BlbnNlQ29tcG9uZW50KSBza2VsZXRvbnM6IFF1ZXJ5TGlzdDxcbiAgICBOZ3hTdXNwZW5zZUNvbXBvbmVudFxuICA+O1xuICBAQ29udGVudENoaWxkcmVuKE5neFN1c3BlbnNlTGlzdENvbXBvbmVudCkgbGlzdDogUXVlcnlMaXN0PFxuICAgIE5neFN1c3BlbnNlTGlzdENvbXBvbmVudFxuICA+O1xuICBsb2FkaW5nJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgc3ViczogQXJyYXk8U3Vic2NyaXB0aW9uPiA9IFtdO1xuICBhbGxCcm9hZGNhc3RlcnMgPSBbXTtcbiAgYWxsTGlzdGVuZXJzID0gW107XG5cbiAgcHJpdmF0ZSBoYXNQYXJlbnRDb250cm9sU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcbiAgcHJpdmF0ZSBwYXJlbnRDb250cm9sJCA9IHRoaXMuaGFzUGFyZW50Q29udHJvbFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5wYXJlbnRDb250cm9sJFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgodmFsKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coXCJyZWxlYXNlXCIsIHZhbCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5hbGxCcm9hZGNhc3RlcnMgPSB0aGlzLnNrZWxldG9ucy5tYXAoKHMpID0+IHMubG9hZGluZyQpO1xuICAgIHRoaXMuYWxsTGlzdGVuZXJzID0gdGhpcy5za2VsZXRvbnMubWFwKChzKSA9PiB0aGlzLmhpZGVTa2VsZXRvbkxpc3RlbmVyKHMpKTtcbiAgICB0aGlzLnJldmVhbE9yZGVyT3BlcmF0b3IodGhpcy5yZXZlYWxPcmRlcik7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgaWYgKGNoYW5nZXMucmV2ZWFsT3JkZXIpIHtcbiAgICAgIHRoaXMucmV2ZWFsT3JkZXJPcGVyYXRvcihjaGFuZ2VzLnJldmVhbE9yZGVyLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuc3Vicy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuc3Vicy5mb3JFYWNoKChzdWIpID0+IHN1Yi51bnN1YnNjcmliZSgpKTtcbiAgICAgIHRoaXMuc3Vicy5sZW5ndGggPSAwO1xuICAgIH1cbiAgfVxuXG4gIHJlbG9hZChvcmRlcikge1xuICAgIHRoaXMucmV2ZWFsT3JkZXJPcGVyYXRvcihvcmRlciB8fCB0aGlzLnJldmVhbE9yZGVyKTtcbiAgfVxuXG4gIHNob3coKSB7fVxuXG4gIGhpZGUoKSB7fVxuXG4gIHByaXZhdGUgcmV2ZWFsT3JkZXJPcGVyYXRvcihvcmRlcjogT1JERVJTKSB7XG4gICAgaWYgKHRoaXMuYWxsQnJvYWRjYXN0ZXJzLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmFsbExpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdWJzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zdWJzLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgICAgdGhpcy5zdWJzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIHN3aXRjaCAob3JkZXIpIHtcbiAgICAgIGNhc2UgXCJ0b2dldGhlclwiOiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IHRoaXMudG9nZXRoZXJPcGVyYXRvcih0aGlzLmFsbEJyb2FkY2FzdGVycykoXG4gICAgICAgICAgdGhpcy5hbGxMaXN0ZW5lcnNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zdWJzLnB1c2goc3ViKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFwiZm9yd2FyZHNcIjoge1xuICAgICAgICBjb25zdCBzdWJzID0gdGhpcy5kb21PcmRlck9wZXJhdG9yKHRoaXMuYWxsQnJvYWRjYXN0ZXJzKShcbiAgICAgICAgICB0aGlzLmFsbExpc3RlbmVyc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnN1YnMgPSBzdWJzO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJiYWNrd2FyZHNcIjoge1xuICAgICAgICBjb25zdCBicm9hZGNhc3RlcnMgPSBbLi4udGhpcy5hbGxCcm9hZGNhc3RlcnNdLnJldmVyc2UoKTtcbiAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gWy4uLnRoaXMuYWxsTGlzdGVuZXJzXS5yZXZlcnNlKCk7XG4gICAgICAgIGNvbnN0IHN1YnMgPSB0aGlzLmRvbU9yZGVyT3BlcmF0b3IoYnJvYWRjYXN0ZXJzKShsaXN0ZW5lcnMpO1xuICAgICAgICB0aGlzLnN1YnMgPSBzdWJzO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG5cbiAgICAgIC8vIG5vdGhpbmcgc2hvdWxkIGhhcHBlblxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGlkZVNrZWxldG9uTGlzdGVuZXIoXG4gICAgc2tlbGV0b246IE5neFN1c3BlbnNlQ29tcG9uZW50IHwgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50XG4gICkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBza2VsZXRvbi5oaWRlKCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1NrZWxldG9uTGlzdGVuZXIoXG4gICAgc2tlbGV0b246IE5neFN1c3BlbnNlQ29tcG9uZW50IHwgTmd4U3VzcGVuc2VMaXN0Q29tcG9uZW50XG4gICkge1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBza2VsZXRvbi5zaG93KCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdG9nZXRoZXJPcGVyYXRvcihicm9hZGNhc3RlcnMpIHtcbiAgICB0aGlzLnNrZWxldG9ucy5mb3JFYWNoKChzKSA9PiB0aGlzLnNob3dTa2VsZXRvbkxpc3RlbmVyKHMpKCkpO1xuICAgIHJldHVybiAobGlzdGVuZXJzKSA9PiB7XG4gICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbLi4uYnJvYWRjYXN0ZXJzXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gc2tpcCBkZWZhdWx0XG4gICAgICAgICAgc2tpcCgxKSxcbiAgICAgICAgICAvLyBrZWVwIHRyYWNraW5nIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgcGFpcndpc2UoKSxcbiAgICAgICAgICBmaWx0ZXIoKFthcnkxLCBhcnkyXSkgPT4ge1xuICAgICAgICAgICAgLy8gYW55IGxvYWRpbmcgc3RhdGUgaXMgdHVyZVxuICAgICAgICAgICAgY29uc3QgY29uZDEgPSBhcnkxLnNvbWUoKGIpID0+IGIpO1xuICAgICAgICAgICAgLy8gYWxsIGxvYWRpbmcgc3RhdGUgaXMgZmFsc2VcbiAgICAgICAgICAgIGNvbnN0IGNvbmQyID0gIWFyeTIuc29tZSgoYikgPT4gYik7XG4gICAgICAgICAgICAvLyBwYXNzIG9ubHkgd2hlbiBwcmV2IGxvYWRpbmcgc3RhdGUgaXMgdHVyZSwgY3VycmVudCBpcyBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGNvbmQxICYmIGNvbmQyO1xuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGhpZGU6IGFueSkgPT4gaGlkZSgpKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZG9tT3JkZXJPcGVyYXRvcihicm9hZGNhc3RlcnMpIHtcbiAgICB0aGlzLnNrZWxldG9ucy5mb3JFYWNoKChzKSA9PiB0aGlzLnNob3dTa2VsZXRvbkxpc3RlbmVyKHMpKCkpO1xuICAgIHJldHVybiAobGlzdGVuZXJzKSA9PiB7XG4gICAgICBsZXQgc3VicyA9IFtdO1xuICAgICAgbGV0IGNoZWNrcyA9IFsuLi5uZXcgQXJyYXkoYnJvYWRjYXN0ZXJzLmxlbmd0aCldLmZpbGwobnVsbCk7XG4gICAgICBicm9hZGNhc3RlcnMuZm9yRWFjaCgoYm9yYWRjYXN0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgIHN1YnMucHVzaChcbiAgICAgICAgICBib3JhZGNhc3RlclxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgIC8vIHNraXAgZGVmYXVsdFxuICAgICAgICAgICAgICBza2lwKDEpLFxuICAgICAgICAgICAgICAvLyBrZWVwIHRyYWNraW5nIHByZXZpb3VzIHZhbHVlXG4gICAgICAgICAgICAgIHBhaXJ3aXNlKCksXG4gICAgICAgICAgICAgIGZpbHRlcigoW2IxLCBiMl0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBwYXNzIG9ubHkgd2hlbiBwcmV2IGxvYWRpbmcgc3RhdGUgaXMgdHVyZSwgY3VycmVudCBpcyBmYWxzZVxuICAgICAgICAgICAgICAgIHJldHVybiBiMSAmJiAhYjI7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgY2hlY2tzW2luZGV4XSA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ZXNUb0ZsdXNoID0gdGhpcy5nZXRGbHVzaEluZGV4ZXMoY2hlY2tzKTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgaSBvZiBpbmRleGVzVG9GbHVzaCkge1xuICAgICAgICAgICAgICAgIGxpc3RlbmVyc1tpXSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gc3VicztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGbHVzaEluZGV4ZXMoY2hlY2tzKSB7XG4gICAgY29uc3QgaW5kZXhlc1RvRmx1c2ggPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoZWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGluZGV4ZXNUb0ZsdXNoLmluZGV4T2YoaSkgPiAtMSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrID0gY2hlY2tzW2ldO1xuICAgICAgaWYgKGNoZWNrICE9PSBudWxsKSB7XG4gICAgICAgIGluZGV4ZXNUb0ZsdXNoLnB1c2goaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXhlc1RvRmx1c2g7XG4gIH1cbn1cbiJdfQ==