UNPKG

pretur.navigation

Version:
453 lines 71.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var lodash_1 = require("lodash"); var persist_1 = require("./persist"); var actions_1 = require("./actions"); function orderedPages(instances) { return instances.pageOrder.map(function (path) { return instances.pages[path]; }); } function cloneInstances(oldInstances) { return { pageOrder: oldInstances.pageOrder.slice(), pages: tslib_1.__assign({}, oldInstances.pages), }; } function openPage(instances, options, pages) { var newInstances = cloneInstances(instances); var insertAfterMutex = options.insertAfterMutex, occurrence = tslib_1.__rest(options, ["insertAfterMutex"]); var insertAfterIndex = insertAfterMutex ? newInstances.pageOrder.indexOf(insertAfterMutex) : -1; if (occurrence.parent) { if (occurrence.parent === occurrence.mutex) { throw new Error(occurrence.mutex + " cannot be child of itself."); } if (!instances.pages[occurrence.parent]) { throw new Error("Parent of " + occurrence.mutex + " is invalid."); } if (insertAfterIndex !== -1 && insertAfterIndex < instances.pageOrder.indexOf(occurrence.parent)) { throw new Error("Cannot open " + occurrence.mutex + ". Cannot be inserted before the parent."); } if (instances.pages[occurrence.parent].parent) { throw new Error("Cannot open " + occurrence.mutex + ". Nesting more than one level is forbidden."); } } var newPage = pages.buildInstance(occurrence); if (insertAfterIndex !== -1) { newInstances.pageOrder.splice(insertAfterIndex + 1, 0, occurrence.mutex); } else { newInstances.pageOrder.push(occurrence.mutex); } newInstances.pages[occurrence.mutex] = newPage; return newInstances; } function closePage(instances, toRemoveMutex) { var newPages = orderedPages(instances).filter(function (page) { if (page.mutex === toRemoveMutex) { return false; } return page.parent !== toRemoveMutex; }); return { pageOrder: newPages.map(function (page) { return page.mutex; }), pages: lodash_1.keyBy(newPages, function (page) { return page.mutex; }), }; } function findClosePageTarget(instances, toRemoveMutex, override) { if (instances.pageOrder.length < 2) { return; } if (override && override !== toRemoveMutex && instances.pages[override]) { return override; } var toRemove = instances.pages[toRemoveMutex]; if (!toRemove.parent) { var roots = orderedPages(instances).filter(function (page) { return !page.parent; }).map(function (page) { return page.mutex; }); var toRemoveRootIndex = roots.indexOf(toRemoveMutex); return toRemoveRootIndex === 0 ? roots[1] : roots[toRemoveRootIndex - 1]; } var parentChildren = orderedPages(instances) .filter(function (page) { return page.parent === toRemove.parent; }) .map(function (page) { return page.mutex; }); if (parentChildren.length === 1) { return toRemove.parent; } var toRemoveIndex = parentChildren.indexOf(toRemoveMutex); return toRemoveIndex === 0 ? parentChildren[1] : parentChildren[toRemoveIndex - 1]; } function replacePage(instances, options, pages) { var toRemoveMutex = options.toRemoveMutex, occurrence = tslib_1.__rest(options, ["toRemoveMutex"]); var toInsertIndex = instances.pageOrder.indexOf(toRemoveMutex); if (toInsertIndex === -1) { return openPage(instances, occurrence, pages); } if (occurrence.parent !== instances.pages[toRemoveMutex].parent) { throw new Error("Cannot open " + occurrence.mutex + ". " + 'The new page and the page to be removed must have the same parent.'); } var newPage = pages.buildInstance(occurrence); var newInstances = closePage(instances, toRemoveMutex); newInstances.pageOrder.splice(toInsertIndex, 0, occurrence.mutex); newInstances.pages[occurrence.mutex] = newPage; return newInstances; } function cloneActiveChildren(instances, currentActives) { var newActives = {}; var roots = orderedPages(instances).filter(function (page) { return !page.parent; }).map(function (page) { return page.mutex; }); for (var _i = 0, roots_1 = roots; _i < roots_1.length; _i++) { var root = roots_1[_i]; if (currentActives[root] && instances.pages[currentActives[root]]) { newActives[root] = currentActives[root]; } } return newActives; } function updateActiveChildren(instances, actives, target) { var newActives = cloneActiveChildren(instances, actives); if (!target) { return newActives; } var targetPage = instances.pages[target]; // target is root if (targetPage && !targetPage.parent) { if (!newActives[target]) { return newActives; } delete newActives[target]; return newActives; } var root = targetPage && targetPage.parent; if (!root) { return newActives; } return tslib_1.__assign({}, newActives, (_a = {}, _a[root] = target, _a)); var _a; } function getTransitionTarget(instances, actives, currentActive, desiredTarget) { var desiredTargetPage = instances.pages[desiredTarget]; var currentPage = currentActive && instances.pages[currentActive]; // non-root if (desiredTargetPage && desiredTargetPage.parent) { return desiredTarget; } // transiting to own root if (currentPage && desiredTarget === currentPage.parent) { return desiredTarget; } if (actives[desiredTarget] && instances.pages[actives[desiredTarget]]) { return actives[desiredTarget]; } return desiredTarget; } var Navigator = /** @class */ (function () { function Navigator(pages, identifier) { this.instances = { pageOrder: [], pages: {} }; this.activeChildren = {}; this.pages = pages; this.identifier = typeof identifier === 'symbol' ? identifier : Symbol(); } Object.defineProperty(Navigator.prototype, "all", { get: function () { return orderedPages(this.instances); }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "roots", { get: function () { return this.all.filter(function (page) { return !page.parent; }); }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "active", { get: function () { if (!this.activePageMutex) { return; } return this.instances.pages[this.activePageMutex]; }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "activeMutex", { get: function () { return this.activePageMutex; }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "activeRootMutex", { get: function () { if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) { return; } if (this.instances.pages[this.activePageMutex].parent) { return this.instances.pages[this.activePageMutex].parent; } return this.activePageMutex; }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "activeRoot", { get: function () { var mutex = this.activeRootMutex; if (!mutex) { return; } return this.instances.pages[mutex]; }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "activeRootIndex", { get: function () { if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) { return -1; } var parentMutex = this.instances.pages[this.activePageMutex].parent; if (!parentMutex) { return this.roots.map(function (page) { return page.mutex; }).indexOf(this.activePageMutex); } return this.roots.map(function (page) { return page.mutex; }).indexOf(parentMutex); }, enumerable: true, configurable: true }); Object.defineProperty(Navigator.prototype, "indexAsChildOfActiveRoot", { get: function () { if (!this.activePageMutex || !this.instances.pages[this.activePageMutex]) { return -1; } var parentMutex = this.instances.pages[this.activePageMutex].parent; if (!parentMutex) { return -1; } return this.childrenOf(parentMutex).map(function (page) { return page.mutex; }).indexOf(this.activePageMutex); }, enumerable: true, configurable: true }); Navigator.prototype.hasChildren = function (mutex) { return this.all.some(function (page) { return page.parent === mutex; }); }; Navigator.prototype.childrenOf = function (mutex) { return this.all.filter(function (page) { return page.parent === mutex; }); }; Navigator.prototype.pageFromMutex = function (mutex) { return typeof mutex === 'string' ? this.instances.pages[mutex] : undefined; }; Navigator.prototype.getActiveChild = function (mutex) { return mutex ? this.activeChildren[mutex] : undefined; }; Navigator.prototype.persistInstances = function (instances) { var toSave = []; for (var _i = 0, _a = orderedPages(instances); _i < _a.length; _i++) { var instance = _a[_i]; if (instance.page.persistent !== false) { if (instance.parent) { if (instances.pages[instance.parent].page.persistent !== false) { toSave.push(instance.occurrence); } } else { toSave.push(instance.occurrence); } } } persist_1.save(this.pages.prefix, toSave); }; Navigator.prototype.persistActivePage = function (instances, mutex) { if (!mutex) { persist_1.saveActivePage(this.pages.prefix, undefined); return; } if (instances.pages[mutex].page.persistent !== false) { var parentMutex = instances.pages[mutex].parent; if (parentMutex) { var parent_1 = instances.pages[parentMutex]; if (parent_1.page.persistent !== false) { persist_1.saveActivePage(this.pages.prefix, mutex); } } else { persist_1.saveActivePage(this.pages.prefix, mutex); } } }; Navigator.prototype.reduce = function (action) { if (actions_1.NAVIGATION_TRANSIT_TO_PAGE.is(this.identifier, action)) { if (action.payload === this.activePageMutex) { return this; } if (!action.payload) { this.persistActivePage(this.instances, undefined); var newNavWithoutActive = new Navigator(this.pages, this.identifier); newNavWithoutActive.instances = this.instances; newNavWithoutActive.activeChildren = this.activeChildren; return newNavWithoutActive; } if (!this.instances.pages[action.payload]) { return this; } var transitionTarget = getTransitionTarget(this.instances, this.activeChildren, this.activePageMutex, action.payload); this.persistActivePage(this.instances, transitionTarget); var newNav = new Navigator(this.pages, this.identifier); newNav.instances = this.instances; newNav.activePageMutex = transitionTarget; newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, transitionTarget); return newNav; } if (actions_1.NAVIGATION_OPEN_PAGE.is(this.identifier, action)) { if (!action.payload || action.payload.mutex === this.activePageMutex) { return this; } var _a = action.payload, mutex = _a.mutex, path = _a.path; if (this.instances.pages[mutex]) { this.persistActivePage(this.instances, mutex); var newNav = new Navigator(this.pages, this.identifier); newNav.instances = this.instances; newNav.activePageMutex = mutex; newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, mutex); return newNav; } if (this.pages.hasPage(path)) { var newInstances = openPage(this.instances, action.payload, this.pages); this.persistInstances(newInstances); this.persistActivePage(newInstances, mutex); var newNav = new Navigator(this.pages, this.identifier); newNav.instances = newInstances; newNav.activePageMutex = mutex; newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, mutex); return newNav; } return this; } if (actions_1.NAVIGATION_REPLACE_PAGE.is(this.identifier, action)) { if (!action.payload) { return this; } var _b = action.payload, mutex = _b.mutex, path = _b.path; if (this.instances.pages[mutex]) { this.persistActivePage(this.instances, mutex); var newNav = new Navigator(this.pages, this.identifier); newNav.instances = this.instances; newNav.activePageMutex = mutex; newNav.activeChildren = updateActiveChildren(this.instances, this.activeChildren, mutex); return newNav; } if (this.pages.hasPage(path)) { var newInstances = replacePage(this.instances, action.payload, this.pages); this.persistInstances(newInstances); this.persistActivePage(newInstances, mutex); var newNav = new Navigator(this.pages, this.identifier); newNav.instances = newInstances; newNav.activePageMutex = mutex; newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, mutex); return newNav; } return this; } if (actions_1.NAVIGATION_CLOSE_PAGE.is(this.identifier, action)) { if (!action.payload) { return this; } var _c = action.payload, mutex = _c.mutex, goto = _c.goto; if (!this.instances.pages[mutex]) { return this; } var newNav = new Navigator(this.pages, this.identifier); newNav.activePageMutex = this.activePageMutex; var newInstances = closePage(this.instances, mutex); var isParentOfActive = this.activePageMutex && this.instances.pages[this.activePageMutex].parent === mutex; if (this.activePageMutex === mutex || isParentOfActive) { var targetMutex = findClosePageTarget(this.instances, isParentOfActive ? this.instances.pages[this.activePageMutex].parent : mutex, goto); var transitionTarget = targetMutex && getTransitionTarget(newInstances, this.activeChildren, this.activePageMutex, targetMutex); this.persistActivePage(this.instances, undefined); this.persistActivePage(this.instances, transitionTarget); newNav.activePageMutex = transitionTarget; } this.persistInstances(newInstances); newNav.instances = newInstances; newNav.activeChildren = updateActiveChildren(newInstances, this.activeChildren, newNav.activePageMutex); return newNav; } if (actions_1.NAVIGATION_LOAD_PAGES.is(this.identifier, action)) { var occurrence = persist_1.load(this.pages.prefix); var loadedActivePageMutex = persist_1.loadActivePage(this.pages.prefix); var instances = undefined; var activePageMutex = undefined; if (occurrence && occurrence.length > 0) { instances = { pageOrder: [], pages: {} }; for (var _i = 0, occurrence_1 = occurrence; _i < occurrence_1.length; _i++) { var instanceData = occurrence_1[_i]; if (this.pages.hasPage(instanceData.path)) { var pageInstance = this.pages.buildInstance(instanceData); if (pageInstance.mutex === loadedActivePageMutex) { activePageMutex = loadedActivePageMutex; } instances.pageOrder.push(pageInstance.mutex); instances.pages[pageInstance.mutex] = pageInstance; } } } if (instances && instances.pageOrder.length > 0) { var newNav = new Navigator(this.pages, this.identifier); newNav.instances = instances; newNav.activePageMutex = activePageMutex; newNav.activeChildren = updateActiveChildren(instances, this.activeChildren, activePageMutex); return newNav; } return this; } if (actions_1.NAVIGATION_CLEAR_PAGES.is(this.identifier, action)) { persist_1.clear(this.pages.prefix); return new Navigator(this.pages, this.identifier); } var nextInstances = { pageOrder: this.instances.pageOrder, pages: {} }; var modified = false; for (var _d = 0, _e = orderedPages(this.instances); _d < _e.length; _d++) { var instance = _e[_d]; var newInstance = instance.reduce(action); if (newInstance !== instance) { modified = true; } nextInstances.pages[instance.mutex] = newInstance; } if (modified) { var newNav = new Navigator(this.pages, this.identifier); newNav.activePageMutex = this.activePageMutex; newNav.instances = nextInstances; newNav.activeChildren = this.activeChildren; return newNav; } return this; }; Navigator.prototype.transit = function (dispatch, mutex) { dispatch(actions_1.NAVIGATION_TRANSIT_TO_PAGE.create.unicast(this.identifier, mutex)); }; Navigator.prototype.open = function (dispatch, occurrence) { dispatch(actions_1.NAVIGATION_OPEN_PAGE.create.unicast(this.identifier, occurrence)); }; Navigator.prototype.replace = function (dispatch, toRemoveMutex, occurrence) { dispatch(actions_1.NAVIGATION_REPLACE_PAGE.create.unicast(this.identifier, tslib_1.__assign({ toRemoveMutex: toRemoveMutex }, occurrence))); }; Navigator.prototype.close = function (dispatch, mutex, goto) { dispatch(actions_1.NAVIGATION_CLOSE_PAGE.create.unicast(this.identifier, { mutex: mutex, goto: goto })); }; Navigator.prototype.load = function (dispatch) { dispatch(actions_1.NAVIGATION_LOAD_PAGES.create.unicast(this.identifier)); }; Navigator.prototype.clear = function (dispatch) { dispatch(actions_1.NAVIGATION_CLEAR_PAGES.create.unicast(this.identifier)); }; return Navigator; }()); exports.Navigator = Navigator; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25hdmlnYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxpQ0FBK0I7QUFHL0IscUNBQThFO0FBQzlFLHFDQU9tQjtBQTRCbkIsc0JBQXNCLFNBQW9CO0lBQ3hDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFBLElBQUksSUFBSSxPQUFBLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQXJCLENBQXFCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsd0JBQXdCLFlBQXVCO0lBQzdDLE1BQU0sQ0FBQztRQUNMLFNBQVMsRUFBTSxZQUFZLENBQUMsU0FBUyxRQUFDO1FBQ3RDLEtBQUssdUJBQU8sWUFBWSxDQUFDLEtBQUssQ0FBRTtLQUNqQyxDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUFrQixTQUFvQixFQUFFLE9BQXdCLEVBQUUsS0FBWTtJQUM1RSxJQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDdkMsSUFBQSwyQ0FBZ0IsRUFBRSwwREFBYSxDQUFhO0lBQ3BELElBQU0sZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWxHLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FBSSxVQUFVLENBQUMsS0FBSyxnQ0FBNkIsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFB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QUksQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sd0JBQUksR0FBWCxVQUFZLFFBQWtCLEVBQUUsVUFBMkI7UUFDekQsUUFBUSxDQUFDLDhCQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFTSwyQkFBTyxHQUFkLFVBQ0UsUUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsVUFBK0I7UUFFL0IsUUFBUSxDQUFDLGlDQUF1QixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQzdDLElBQUksQ0FBQyxVQUFVLHFCQUNiLGFBQWEsZUFBQSxJQUFLLFVBQVUsRUFDL0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHlCQUFLLEdBQVosVUFBYSxRQUFrQixFQUFFLEtBQWEsRUFBRSxJQUFhO1FBQzNELFFBQVEsQ0FBQywrQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLE9BQUEsRUFBRSxJQUFJLE1BQUEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRixDQUFDO0lBRU0sd0JBQUksR0FBWCxVQUFZLFFBQWtCO1FBQzVCLFFBQVEsQ0FBQywrQkFBcUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSx5QkFBSyxHQUFaLFVBQWEsUUFBa0I7UUFDN0IsUUFBUSxDQUFDLGdDQUFzQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQXZYRCxJQXVYQztBQXZYWSw4QkFBUyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlZHVjaWJsZSwgQWN0aW9uLCBEaXNwYXRjaCB9IGZyb20gJ3JlZHVjaWJsZS1ub2RlJztcclxuaW1wb3J0IHsga2V5QnkgfSBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBQYWdlSW5zdGFuY2UgfSBmcm9tICcuL3BhZ2VJbnN0YW5jZSc7XHJcbmltcG9ydCB7IFBhZ2VzLCBQYWdlT2NjdXJyZW5jZSB9IGZyb20gJy4vcGFnZXMnO1xyXG5pbXBvcnQgeyBsb2FkLCBjbGVhciwgbG9hZEFjdGl2ZVBhZ2UsIHNhdmUsIHNhdmVBY3RpdmVQYWdlIH0gZnJvbSAnLi9wZXJzaXN0JztcclxuaW1wb3J0IHtcclxuICBOQVZJR0FUSU9OX1RSQU5TSVRfVE9fUEFHRSxcclxuICBOQVZJR0FUSU9OX09QRU5fUEFHRSxcclxuICBOQVZJR0FUSU9OX1JFUExBQ0VfUEFHRSxcclxuICBOQVZJR0FUSU9OX0NMT1NFX1BBR0UsXHJcbiAgTkFWSUdBVElPTl9MT0FEX1BBR0VTLFxyXG4gIE5BVklHQVRJT05fQ0xFQVJfUEFHRVMsXHJcbn0gZnJvbSAnLi9hY3Rpb25zJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZVJlcGxhY2VPcHRpb25zIGV4dGVuZHMgUGFnZU9jY3VycmVuY2U8YW55PiB7XHJcbiAgdG9SZW1vdmVNdXRleDogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VPcGVuT3B0aW9ucyBleHRlbmRzIFBhZ2VPY2N1cnJlbmNlPGFueT4ge1xyXG4gIGluc2VydEFmdGVyTXV0ZXg/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUNsb3NlT3B0aW9ucyB7XHJcbiAgbXV0ZXg6IHN0cmluZztcclxuICBnb3RvPzogc3RyaW5nO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSW5zdGFuY2VNYXAge1xyXG4gIFtwcm9wOiBzdHJpbmddOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSW5zdGFuY2VzIHtcclxuICBwYWdlT3JkZXI6IHN0cmluZ1tdO1xyXG4gIHBhZ2VzOiBJbnN0YW5jZU1hcDtcclxufVxyXG5cclxuaW50ZXJmYWNlIEFjdGl2ZUNoaWxkcmVuIHtcclxuICBbcm9vdDogc3RyaW5nXTogc3RyaW5nO1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcmRlcmVkUGFnZXMoaW5zdGFuY2VzOiBJbnN0YW5jZXMpOiBQYWdlSW5zdGFuY2U8YW55LCBhbnk+W10ge1xyXG4gIHJldHVybiBpbnN0YW5jZXMucGFnZU9yZGVyLm1hcChwYXRoID0+IGluc3RhbmNlcy5wYWdlc1twYXRoXSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb25lSW5zdGFuY2VzKG9sZEluc3RhbmNlczogSW5zdGFuY2VzKTogSW5zdGFuY2VzIHtcclxuICByZXR1cm4ge1xyXG4gICAgcGFnZU9yZGVyOiBbLi4ub2xkSW5zdGFuY2VzLnBhZ2VPcmRlcl0sXHJcbiAgICBwYWdlczogeyAuLi5vbGRJbnN0YW5jZXMucGFnZXMgfSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBvcGVuUGFnZShpbnN0YW5jZXM6IEluc3RhbmNlcywgb3B0aW9uczogUGFnZU9wZW5PcHRpb25zLCBwYWdlczogUGFnZXMpOiBJbnN0YW5jZXMge1xyXG4gIGNvbnN0IG5ld0luc3RhbmNlcyA9IGNsb25lSW5zdGFuY2VzKGluc3RhbmNlcyk7XHJcbiAgY29uc3QgeyBpbnNlcnRBZnRlck11dGV4LCAuLi5vY2N1cnJlbmNlIH0gPSBvcHRpb25zO1xyXG4gIGNvbnN0IGluc2VydEFmdGVySW5kZXggPSBpbnNlcnRBZnRlck11dGV4ID8gbmV3SW5zdGFuY2VzLnBhZ2VPcmRlci5pbmRleE9mKGluc2VydEFmdGVyTXV0ZXgpIDogLTE7XHJcblxyXG4gIGlmIChvY2N1cnJlbmNlLnBhcmVudCkge1xyXG4gICAgaWYgKG9jY3VycmVuY2UucGFyZW50ID09PSBvY2N1cnJlbmNlLm11dGV4KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtvY2N1cnJlbmNlLm11dGV4fSBjYW5ub3QgYmUgY2hpbGQgb2YgaXRzZWxmLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghaW5zdGFuY2VzLnBhZ2VzW29jY3VycmVuY2UucGFyZW50XSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhcmVudCBvZiAke29jY3VycmVuY2UubXV0ZXh9IGlzIGludmFsaWQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICBpbnNlcnRBZnRlckluZGV4ICE9PSAtMSAmJlxyXG4gICAgICBpbnNlcnRBZnRlckluZGV4IDwgaW5zdGFuY2VzLnBhZ2VPcmRlci5pbmRleE9mKG9jY3VycmVuY2UucGFyZW50KVxyXG4gICAgKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgQ2Fubm90IG9wZW4gJHtvY2N1cnJlbmNlLm11dGV4fS4gQ2Fubm90IGJlIGluc2VydGVkIGJlZm9yZSB0aGUgcGFyZW50LmAsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGluc3RhbmNlcy5wYWdlc1tvY2N1cnJlbmNlLnBhcmVudF0ucGFyZW50KSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcclxuICAgICAgICBgQ2Fubm90IG9wZW4gJHtvY2N1cnJlbmNlLm11dGV4fS4gTmVzdGluZyBtb3JlIHRoYW4gb25lIGxldmVsIGlzIGZvcmJpZGRlbi5gLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbmV3UGFnZSA9IHBhZ2VzLmJ1aWxkSW5zdGFuY2Uob2NjdXJyZW5jZSk7XHJcblxyXG4gIGlmIChpbnNlcnRBZnRlckluZGV4ICE9PSAtMSkge1xyXG4gICAgbmV3SW5zdGFuY2VzLnBhZ2VPcmRlci5zcGxpY2UoaW5zZXJ0QWZ0ZXJJbmRleCArIDEsIDAsIG9jY3VycmVuY2UubXV0ZXgpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBuZXdJbnN0YW5jZXMucGFnZU9yZGVyLnB1c2gob2NjdXJyZW5jZS5tdXRleCk7XHJcbiAgfVxyXG5cclxuICBuZXdJbnN0YW5jZXMucGFnZXNbb2NjdXJyZW5jZS5tdXRleF0gPSBuZXdQYWdlO1xyXG5cclxuICByZXR1cm4gbmV3SW5zdGFuY2VzO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjbG9zZVBhZ2UoaW5zdGFuY2VzOiBJbnN0YW5jZXMsIHRvUmVtb3ZlTXV0ZXg6IHN0cmluZyk6IEluc3RhbmNlcyB7XHJcbiAgY29uc3QgbmV3UGFnZXMgPSBvcmRlcmVkUGFnZXMoaW5zdGFuY2VzKS5maWx0ZXIocGFnZSA9PiB7XHJcbiAgICBpZiAocGFnZS5tdXRleCA9PT0gdG9SZW1vdmVNdXRleCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHBhZ2UucGFyZW50ICE9PSB0b1JlbW92ZU11dGV4O1xyXG4gIH0pO1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAgcGFnZU9yZGVyOiBuZXdQYWdlcy5tYXAocGFnZSA9PiBwYWdlLm11dGV4KSxcclxuICAgIHBhZ2VzOiBrZXlCeShuZXdQYWdlcywgcGFnZSA9PiBwYWdlLm11dGV4KSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBmaW5kQ2xvc2VQYWdlVGFyZ2V0KFxyXG4gIGluc3RhbmNlczogSW5zdGFuY2VzLFxyXG4gIHRvUmVtb3ZlTXV0ZXg6IHN0cmluZyxcclxuICBvdmVycmlkZT86IHN0cmluZyxcclxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICBpZiAoaW5zdGFuY2VzLnBhZ2VPcmRlci5sZW5ndGggPCAyKSB7XHJcbiAgICByZXR1cm47XHJcbiAgfVxyXG5cclxuICBpZiAob3ZlcnJpZGUgJiYgb3ZlcnJpZGUgIT09IHRvUmVtb3ZlTXV0ZXggJiYgaW5zdGFuY2VzLnBhZ2VzW292ZXJyaWRlXSkge1xyXG4gICAgcmV0dXJuIG92ZXJyaWRlO1xyXG4gIH1cclxuXHJcbiAgY29uc3QgdG9SZW1vdmUgPSBpbnN0YW5jZXMucGFnZXNbdG9SZW1vdmVNdXRleF07XHJcblxyXG4gIGlmICghdG9SZW1vdmUucGFyZW50KSB7XHJcbiAgICBjb25zdCByb290cyA9IG9yZGVyZWRQYWdlcyhpbnN0YW5jZXMpLmZp