UNPKG

@firestitch/filter

Version:
439 lines 34.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { isEmpty } from '@firestitch/common'; import { Alias, Model } from 'tsmodels'; import { Subject } from 'rxjs'; import { clone } from 'lodash-es'; import { FsFilterConfigItem } from './filter-item'; import { ItemType } from '../enums/item-type.enum'; /** @type {?} */ export const SORT_BY_FIELD = 'system_sort_by'; /** @type {?} */ export const SORT_DIRECTION_FIELD = 'system_sort_direction'; export class FsFilterConfig extends Model { /** * @param {?=} data */ constructor(data = {}) { super(); this.load = true; this.persist = false; this.inline = false; this.autofocus = false; this.chips = false; this.sortValues = null; this.sort = null; this.sortDirection = null; this.queryParam = false; this.namespace = 'filter'; this.items = []; this.sortByItem = null; this.sortDirectionItem = null; this.keywordFilter = false; this.nonKeywordFilters = false; this._filtersNames = []; this._destroy$ = new Subject(); this._fromJSON(data); } /** * @return {?} */ get destroy$() { return this._destroy$.asObservable(); } /** * @param {?} items * @param {?} route * @param {?} persists * @return {?} */ initItems(items, route, persists) { if (items && Array.isArray(items)) { this.items = items.map((/** * @param {?} item * @param {?} index * @return {?} */ (item, index) => { if (index === 0 && item.type === ItemType.Text) { item.type = ItemType.Keyword; } if (item && item.name && this._filtersNames.indexOf(item.name) === -1) { this._filtersNames.push(item.name); return new FsFilterConfigItem(item, this, route, persists); } else { throw Error('Filter init error. Items name must be unique.'); } })); // After all the items have been created and added to this.items initalize the values // This is important if some item default values are dependent on others this.items.map((/** * @param {?} item * @return {?} */ (item) => { item.initValues(); return item; })); } this.initSorting(route, persists); this.keywordFilter = !!this.items.find((/** * @param {?} e * @return {?} */ e => ItemType.Keyword === e.type)); this.nonKeywordFilters = !!this.items.find((/** * @param {?} e * @return {?} */ e => ItemType.Keyword !== e.type)); } /** * @param {?} name * @return {?} */ getItem(name) { return this.items.find((/** * @param {?} item * @return {?} */ (item) => item.name === name)); } /** * @param {?} route * @param {?} persists * @return {?} */ initSorting(route, persists) { if (this.sortValues) { /** @type {?} */ const sortByItem = { name: SORT_BY_FIELD, type: ItemType.Select, label: 'Sort By', values: this.sortValues }; if (this.sort && this.sort.value) { sortByItem['default'] = this.sort.value; } this.sortByItem = new FsFilterConfigItem(sortByItem, this, route, persists); /** @type {?} */ const sortDirectionItem = { name: SORT_DIRECTION_FIELD, type: ItemType.Select, label: 'Sort Direction', values: [ { name: 'Ascending', value: 'asc' }, { name: 'Descending', value: 'desc' } ] }; if (this.sort && this.sort.direction) { sortDirectionItem['default'] = this.sort.direction; } this.sortDirectionItem = new FsFilterConfigItem(sortDirectionItem, this, route, persists); } } /** * @return {?} */ updateModelValues() { this.items.forEach((/** * @param {?} filter * @return {?} */ (filter) => { filter.model = clone(filter.model); })); if (this.sortByItem) { this.sortByItem.model = clone(this.sortByItem.model); } if (this.sortDirectionItem) { this.sortDirectionItem.model = clone(this.sortDirectionItem.model); } } /** * @param {?=} opts * @return {?} */ sgets(opts = {}) { console.info('FilterConfig.gets() is deprecated'); return []; } /** * @return {?} */ getSort() { /** @type {?} */ let sortBy = this.getSortByValue(); sortBy = sortBy === '__all' ? null : sortBy; /** @type {?} */ let sortDirection = this.getSortDirectionValue(); sortDirection = sortDirection === '__all' ? null : sortDirection; return { value: sortBy, direction: sortDirection, }; } /** * @return {?} */ getSortByValue() { return this.sortByItem ? this.sortByItem.model : null; } /** * @return {?} */ getSortDirectionValue() { return this.sortDirectionItem ? this.sortDirectionItem.model : null; } /** * @param {?} sort * @return {?} */ updateSort(sort) { if (sort.sortBy) { this.sortByItem.model = sort.sortBy; } if (sort.sortDirection) { this.sortDirectionItem.model = sort.sortDirection; } } /** * @return {?} */ getFilledItems() { return this.items.reduce((/** * @param {?} acc * @param {?} filter * @return {?} */ (acc, filter) => { switch (filter.type) { case ItemType.Select: { /** @type {?} */ const multipleIsoldated = filter.multiple && filter.isolate && Array.isArray(filter.model) && filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ const multipleHasSelectedValues = filter.multiple && Array.isArray(filter.model) && filter.model.length && filter.model.indexOf('__all') === -1; /** @type {?} */ const selectedValues = !filter.multiple && filter.model && filter.model !== '__all'; if (multipleIsoldated || multipleHasSelectedValues || selectedValues) { acc.push(filter); } } break; case ItemType.AutoCompleteChips: case ItemType.Chips: { if (Array.isArray(filter.model) && filter.model.length) { acc.push(filter); } } break; case ItemType.Checkbox: { if (filter.model) { acc.push(filter); } } break; case ItemType.Range: { if (filter.model && (filter.model.min || filter.model.max)) { acc.push(filter); } } break; case ItemType.DateRange: case ItemType.DateTimeRange: { if (filter.model && (filter.model.from || filter.model.to)) { acc.push(filter); } } break; case ItemType.Keyword: { } break; default: { if (filter.model && (!isEmpty(filter.model, { zero: true }) || !isEmpty(filter.model.value, { zero: true }))) { acc.push(filter); } } } return acc; }), []); } /** * @return {?} */ filtersClear() { for (const filter of this.items) { filter.clear(); } if (this.sortByItem) { if (this.sort) { this.sortByItem.model = this.sort.value; } else { this.sortByItem.clear(); } } if (this.sortDirectionItem) { if (this.sort) { this.sortDirectionItem.model = this.sort.direction; } else { this.sortDirectionItem.clear(); } } } /** * @return {?} */ loadValuesForPendingItems() { this.items .filter((/** * @param {?} item * @return {?} */ (item) => item.hasPendingValues)) .forEach((/** * @param {?} item * @return {?} */ (item) => item.loadValues(false))); } /** * @return {?} */ destroy() { this._destroy$.next(); this._destroy$.complete(); } } tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "load", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "persist", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "inline", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "autofocus", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "chips", void 0); tslib_1.__decorate([ Alias('sorts'), tslib_1.__metadata("design:type", Array) ], FsFilterConfig.prototype, "sortValues", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sort", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "sortDirection", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "queryParam", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Object) ], FsFilterConfig.prototype, "namespace", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "init", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "change", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "reload", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Function) ], FsFilterConfig.prototype, "sortChange", void 0); tslib_1.__decorate([ Alias(), tslib_1.__metadata("design:type", Boolean) ], FsFilterConfig.prototype, "reloadWhenConfigChanged", void 0); if (false) { /** @type {?} */ FsFilterConfig.prototype.load; /** @type {?} */ FsFilterConfig.prototype.persist; /** @type {?} */ FsFilterConfig.prototype.inline; /** @type {?} */ FsFilterConfig.prototype.autofocus; /** @type {?} */ FsFilterConfig.prototype.chips; /** @type {?} */ FsFilterConfig.prototype.sortValues; /** @type {?} */ FsFilterConfig.prototype.sort; /** @type {?} */ FsFilterConfig.prototype.sortDirection; /** @type {?} */ FsFilterConfig.prototype.queryParam; /** @type {?} */ FsFilterConfig.prototype.namespace; /** @type {?} */ FsFilterConfig.prototype.init; /** @type {?} */ FsFilterConfig.prototype.change; /** @type {?} */ FsFilterConfig.prototype.reload; /** @type {?} */ FsFilterConfig.prototype.sortChange; /** @type {?} */ FsFilterConfig.prototype.reloadWhenConfigChanged; /** @type {?} */ FsFilterConfig.prototype.items; /** @type {?} */ FsFilterConfig.prototype.sortByItem; /** @type {?} */ FsFilterConfig.prototype.sortDirectionItem; /** @type {?} */ FsFilterConfig.prototype.keywordFilter; /** @type {?} */ FsFilterConfig.prototype.nonKeywordFilters; /** * @type {?} * @private */ FsFilterConfig.prototype._filtersNames; /** * @type {?} * @private */ FsFilterConfig.prototype._destroy$; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BmaXJlc3RpdGNoL2ZpbHRlci8iLCJzb3VyY2VzIjpbImFwcC9tb2RlbHMvZmlsdGVyLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQXFCLE1BQU0sb0JBQW9CLENBQUM7QUFFaEUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFeEMsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7O0FBRW5ELE1BQU0sT0FBTyxhQUFhLEdBQUcsZ0JBQWdCOztBQUM3QyxNQUFNLE9BQU8sb0JBQW9CLEdBQUcsdUJBQXVCO0FBRTNELE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSzs7OztJQTJCdkMsWUFBWSxPQUFZLEVBQUU7UUFDeEIsS0FBSyxFQUFFLENBQUM7UUExQk0sU0FBSSxHQUFHLElBQUksQ0FBQztRQUNaLFlBQU8sR0FBUSxLQUFLLENBQUM7UUFDckIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUNQLGVBQVUsR0FBVSxJQUFJLENBQUM7UUFDaEMsU0FBSSxHQUFTLElBQUksQ0FBQztRQUNsQixrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGNBQVMsR0FBRyxRQUFRLENBQUM7UUFPOUIsVUFBSyxHQUF5QixFQUFFLENBQUM7UUFDakMsZUFBVSxHQUF1QixJQUFJLENBQUM7UUFDdEMsc0JBQWlCLEdBQXVCLElBQUksQ0FBQztR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QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQTVQVTtJQUFSLEtBQUssRUFBRTs7NENBQW9CO0FBQ25CO0lBQVIsS0FBSyxFQUFFOzsrQ0FBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7OzhDQUF1QjtBQUN0QjtJQUFSLEtBQUssRUFBRTs7aURBQTBCO0FBQ3pCO0lBQVIsS0FBSyxFQUFFOzs2Q0FBc0I7QUFDZDtJQUFmLEtBQUssQ0FBQyxPQUFPLENBQUM7O2tEQUFpQztBQUN2QztJQUFSLEtBQUssRUFBRTs7NENBQTBCO0FBQ3pCO0lBQVIsS0FBSyxFQUFFOztxREFBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7O2tEQUEyQjtBQUMxQjtJQUFSLEtBQUssRUFBRTs7aURBQTZCO0FBQzVCO0lBQVIsS0FBSyxFQUFFOzs0Q0FBdUI7QUFDdEI7SUFBUixLQUFLLEVBQUU7OzhDQUF5QjtBQUN4QjtJQUFSLEtBQUssRUFBRTs7OENBQXlCO0FBQ3hCO0lBQVIsS0FBSyxFQUFFOztrREFBNkI7QUFDNUI7SUFBUixLQUFLLEVBQUU7OytEQUF5Qzs7O0lBZGpELDhCQUE0Qjs7SUFDNUIsaUNBQXFDOztJQUNyQyxnQ0FBK0I7O0lBQy9CLG1DQUFrQzs7SUFDbEMsK0JBQThCOztJQUM5QixvQ0FBZ0Q7O0lBQ2hELDhCQUFrQzs7SUFDbEMsdUNBQXFDOztJQUNyQyxvQ0FBbUM7O0lBQ25DLG1DQUFxQzs7SUFDckMsOEJBQStCOztJQUMvQixnQ0FBaUM7O0lBQ2pDLGdDQUFpQzs7SUFDakMsb0NBQXFDOztJQUNyQyxpREFBaUQ7O0lBRWpELCtCQUF3Qzs7SUFDeEMsb0NBQTZDOztJQUM3QywyQ0FBb0Q7O0lBQ3BELHVDQUE2Qjs7SUFDN0IsMkNBQWlDOzs7OztJQUVqQyx1Q0FBMkI7Ozs7O0lBQzNCLG1DQUF3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRW1wdHksIGxpc3QgYXMgYXJyYXlMaXN0IH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IHNpbXBsZUZvcm1hdCB9IGZyb20gJ0BmaXJlc3RpdGNoL2RhdGUnO1xuaW1wb3J0IHsgQWxpYXMsIE1vZGVsIH0gZnJvbSAndHNtb2RlbHMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IGNsb25lIH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHsgRnNGaWx0ZXJDb25maWdJdGVtIH0gZnJvbSAnLi9maWx0ZXItaXRlbSc7XG5pbXBvcnQgeyBDaGFuZ2VGbiwgRmlsdGVyU29ydCwgU29ydCB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL2VudW1zL2l0ZW0tdHlwZS5lbnVtJztcblxuZXhwb3J0IGNvbnN0IFNPUlRfQllfRklFTEQgPSAnc3lzdGVtX3NvcnRfYnknO1xuZXhwb3J0IGNvbnN0IFNPUlRfRElSRUNUSU9OX0ZJRUxEID0gJ3N5c3RlbV9zb3J0X2RpcmVjdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBGc0ZpbHRlckNvbmZpZyBleHRlbmRzIE1vZGVsIHtcblxuICBAQWxpYXMoKSBwdWJsaWMgbG9hZCA9IHRydWU7XG4gIEBBbGlhcygpIHB1YmxpYyBwZXJzaXN0OiBhbnkgPSBmYWxzZTtcbiAgQEFsaWFzKCkgcHVibGljIGlubGluZSA9IGZhbHNlO1xuICBAQWxpYXMoKSBwdWJsaWMgYXV0b2ZvY3VzID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBjaGlwcyA9IGZhbHNlO1xuICBAQWxpYXMoJ3NvcnRzJykgcHVibGljIHNvcnRWYWx1ZXM6IGFueVtdID0gbnVsbDtcbiAgQEFsaWFzKCkgcHVibGljIHNvcnQ6IFNvcnQgPSBudWxsO1xuICBAQWxpYXMoKSBwdWJsaWMgc29ydERpcmVjdGlvbiA9IG51bGw7XG4gIEBBbGlhcygpIHB1YmxpYyBxdWVyeVBhcmFtID0gZmFsc2U7XG4gIEBBbGlhcygpIHB1YmxpYyBuYW1lc3BhY2UgPSAnZmlsdGVyJztcbiAgQEFsaWFzKCkgcHVibGljIGluaXQ6IENoYW5nZUZuO1xuICBAQWxpYXMoKSBwdWJsaWMgY2hhbmdlOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIHJlbG9hZDogQ2hhbmdlRm47XG4gIEBBbGlhcygpIHB1YmxpYyBzb3J0Q2hhbmdlOiBDaGFuZ2VGbjtcbiAgQEFsaWFzKCkgcHVibGljIHJlbG9hZFdoZW5Db25maWdDaGFuZ2VkOiBib29sZWFuO1xuXG4gIHB1YmxpYyBpdGVtczogRnNGaWx0ZXJDb25maWdJdGVtW10gPSBbXTtcbiAgcHVibGljIHNvcnRCeUl0ZW06IEZzRmlsdGVyQ29uZmlnSXRlbSA9IG51bGw7XG4gIHB1YmxpYyBzb3J0RGlyZWN0aW9uSXRlbTogRnNGaWx0ZXJDb25maWdJdGVtID0gbnVsbDtcbiAgcHVibGljIGtleXdvcmRGaWx0ZXIgPSBmYWxzZTtcbiAgcHVibGljIG5vbktleXdvcmRGaWx0ZXJzID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBfZmlsdGVyc05hbWVzID0gW107XG4gIHByaXZhdGUgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihkYXRhOiBhbnkgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLl9mcm9tSlNPTihkYXRhKTtcbiAgfVxuXG4gIGdldCBkZXN0cm95JCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEl0ZW1zKGl0ZW1zLCByb3V0ZSwgcGVyc2lzdHMpIHtcblxuICAgIGlmIChpdGVtcyAmJiBBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuXG4gICAgICB0aGlzLml0ZW1zID0gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4ge1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBpdGVtLnR5cGUgPT09IEl0ZW1UeXBlLlRleHQpIHtcbiAgICAgICAgICBpdGVtLnR5cGUgPSBJdGVtVHlwZS5LZXl3b3JkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5uYW1lICYmIHRoaXMuX2ZpbHRlcnNOYW1lcy5pbmRleE9mKGl0ZW0ubmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgdGhpcy5fZmlsdGVyc05hbWVzLnB1c2goaXRlbS5uYW1lKTtcblxuICAgICAgICAgIHJldHVybiBuZXcgRnNGaWx0ZXJDb25maWdJdGVtKGl0ZW0sIHRoaXMsIHJvdXRlLCBwZXJzaXN0cylcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcignRmlsdGVyIGluaXQgZXJyb3IuIEl0ZW1zIG5hbWUgbXVzdCBiZSB1bmlxdWUuJylcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFmdGVyIGFsbCB0aGUgaXRlbXMgaGF2ZSBiZWVuIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoaXMuaXRlbXMgaW5pdGFsaXplIHRoZSB2YWx1ZXNcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGlmIHNvbWUgaXRlbSBkZWZhdWx0IHZhbHVlcyBhcmUgZGVwZW5kZW50IG9uIG90aGVyc1xuICAgICAgdGhpcy5pdGVtcy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgaXRlbS5pbml0VmFsdWVzKCk7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0U29ydGluZyhyb3V0ZSwgcGVyc2lzdHMpO1xuXG4gICAgdGhpcy5rZXl3b3JkRmlsdGVyID0gISF0aGlzLml0ZW1zLmZpbmQoZSA9PiBJdGVtVHlwZS5LZXl3b3JkID09PSBlLnR5cGUpO1xuICAgIHRoaXMubm9uS2V5d29yZEZpbHRlcnMgPSAhIXRoaXMuaXRlbXMuZmluZChlID0+IEl0ZW1UeXBlLktleXdvcmQgIT09IGUudHlwZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0SXRlbShuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5uYW1lID09PSBuYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0U29ydGluZyhyb3V0ZSwgcGVyc2lzdHMpIHtcbiAgICBpZiAodGhpcy5zb3J0VmFsdWVzKSB7XG4gICAgICBjb25zdCBzb3J0QnlJdGVtID0ge1xuICAgICAgICBuYW1lOiBTT1JUX0JZX0ZJRUxELFxuICAgICAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgICAgIGxhYmVsOiAnU29ydCBCeScsXG4gICAgICAgIHZhbHVlczogdGhpcy5zb3J0VmFsdWVzXG4gICAgICB9O1xuXG5cbiAgICAgIGlmICh0aGlzLnNvcnQgJiYgdGhpcy5zb3J0LnZhbHVlKSB7XG4gICAgICAgIHNvcnRCeUl0ZW1bJ2RlZmF1bHQnXSA9IHRoaXMuc29ydC52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zb3J0QnlJdGVtID0gbmV3IEZzRmlsdGVyQ29uZmlnSXRlbShzb3J0QnlJdGVtLCB0aGlzLCByb3V0ZSwgcGVyc2lzdHMpO1xuXG4gICAgICBjb25zdCBzb3J0RGlyZWN0aW9uSXRlbSA9IHtcbiAgICAgICAgbmFtZTogU09SVF9ESVJFQ1RJT05fRklFTEQsXG4gICAgICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICAgICAgbGFiZWw6ICdTb3J0IERpcmVjdGlvbicsXG4gICAgICAgIHZhbHVlczogW1xuICAgICAgICAgIHsgbmFtZTogJ0FzY2VuZGluZycsIHZhbHVlOiAnYXNjJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ0Rlc2NlbmRpbmcnLCB2YWx1ZTogJ2Rlc2MnIH1cbiAgICAgICAgXVxuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc29ydCAmJiB0aGlzLnNvcnQuZGlyZWN0aW9uKSB7XG4gICAgICAgIHNvcnREaXJlY3Rpb25JdGVtWydkZWZhdWx0J10gPSB0aGlzLnNvcnQuZGlyZWN0aW9uO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID0gbmV3IEZzRmlsdGVyQ29uZmlnSXRlbShzb3J0RGlyZWN0aW9uSXRlbSwgdGhpcywgcm91dGUsIHBlcnNpc3RzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlTW9kZWxWYWx1ZXMoKSB7XG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChmaWx0ZXIpID0+IHtcbiAgICAgIGZpbHRlci5tb2RlbCA9IGNsb25lKGZpbHRlci5tb2RlbCk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5zb3J0QnlJdGVtKSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSBjbG9uZSh0aGlzLnNvcnRCeUl0ZW0ubW9kZWwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gY2xvbmUodGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNnZXRzKG9wdHM6IGFueSA9IHt9KSB7XG4gICAgY29uc29sZS5pbmZvKCdGaWx0ZXJDb25maWcuZ2V0cygpIGlzIGRlcHJlY2F0ZWQnKTtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydCgpOiBGaWx0ZXJTb3J0IHwgbnVsbCB7XG4gICAgbGV0IHNvcnRCeSA9IHRoaXMuZ2V0U29ydEJ5VmFsdWUoKTtcbiAgICBzb3J0QnkgPSBzb3J0QnkgPT09ICdfX2FsbCcgPyBudWxsIDogc29ydEJ5O1xuXG4gICAgbGV0IHNvcnREaXJlY3Rpb24gPSB0aGlzLmdldFNvcnREaXJlY3Rpb25WYWx1ZSgpO1xuICAgIHNvcnREaXJlY3Rpb24gPSBzb3J0RGlyZWN0aW9uID09PSAnX19hbGwnID8gbnVsbCA6IHNvcnREaXJlY3Rpb247XG5cbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHNvcnRCeSxcbiAgICAgIGRpcmVjdGlvbjogc29ydERpcmVjdGlvbixcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydEJ5VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc29ydEJ5SXRlbSA/IHRoaXMuc29ydEJ5SXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0U29ydERpcmVjdGlvblZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLnNvcnREaXJlY3Rpb25JdGVtID8gdGhpcy5zb3J0RGlyZWN0aW9uSXRlbS5tb2RlbCA6IG51bGw7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU29ydChzb3J0KSB7XG4gICAgaWYgKHNvcnQuc29ydEJ5KSB7XG4gICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSBzb3J0LnNvcnRCeTtcbiAgICB9XG5cbiAgICBpZiAoc29ydC5zb3J0RGlyZWN0aW9uKSB7XG4gICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLm1vZGVsID0gc29ydC5zb3J0RGlyZWN0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWxsZWRJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5yZWR1Y2UoKGFjYywgZmlsdGVyKSA9PiB7XG5cbiAgICAgIHN3aXRjaCAoZmlsdGVyLnR5cGUpIHtcbiAgICAgICAgY2FzZSBJdGVtVHlwZS5TZWxlY3Q6IHtcbiAgICAgICAgICBjb25zdCBtdWx0aXBsZUlzb2xkYXRlZCA9IGZpbHRlci5tdWx0aXBsZVxuICAgICAgICAgICAgJiYgZmlsdGVyLmlzb2xhdGVcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKVxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmxlbmd0aFxuICAgICAgICAgICAgJiYgZmlsdGVyLm1vZGVsLmluZGV4T2YoJ19fYWxsJykgPT09IC0xO1xuXG4gICAgICAgICAgY29uc3QgbXVsdGlwbGVIYXNTZWxlY3RlZFZhbHVlcyA9IGZpbHRlci5tdWx0aXBsZVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShmaWx0ZXIubW9kZWwpXG4gICAgICAgICAgICAmJiBmaWx0ZXIubW9kZWwubGVuZ3RoXG4gICAgICAgICAgICAmJiBmaWx0ZXIubW9kZWwuaW5kZXhPZignX19hbGwnKSA9PT0gLTE7XG5cbiAgICAgICAgICBjb25zdCBzZWxlY3RlZFZhbHVlcyA9ICFmaWx0ZXIubXVsdGlwbGUgJiYgZmlsdGVyLm1vZGVsICYmIGZpbHRlci5tb2RlbCAhPT0gJ19fYWxsJztcblxuICAgICAgICAgIGlmIChtdWx0aXBsZUlzb2xkYXRlZCB8fCBtdWx0aXBsZUhhc1NlbGVjdGVkVmFsdWVzIHx8IHNlbGVjdGVkVmFsdWVzKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLkF1dG9Db21wbGV0ZUNoaXBzOlxuICAgICAgICBjYXNlIEl0ZW1UeXBlLkNoaXBzOiB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyLm1vZGVsKSAmJiBmaWx0ZXIubW9kZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLkNoZWNrYm94OiB7XG4gICAgICAgICAgaWYgKGZpbHRlci5tb2RlbCkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gYnJlYWs7XG5cbiAgICAgICAgY2FzZSBJdGVtVHlwZS5SYW5nZToge1xuICAgICAgICAgIGlmIChmaWx0ZXIubW9kZWwgJiYgKGZpbHRlci5tb2RlbC5taW4gfHwgZmlsdGVyLm1vZGVsLm1heCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGZpbHRlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGJyZWFrO1xuXG4gICAgICAgIGNhc2UgSXRlbVR5cGUuRGF0ZVJhbmdlOiBjYXNlIEl0ZW1UeXBlLkRhdGVUaW1lUmFuZ2U6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsICYmIChmaWx0ZXIubW9kZWwuZnJvbSB8fCBmaWx0ZXIubW9kZWwudG8pKSB7XG4gICAgICAgICAgICBhY2MucHVzaChmaWx0ZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcblxuICAgICAgICBjYXNlIEl0ZW1UeXBlLktleXdvcmQ6IHt9IGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBpZiAoZmlsdGVyLm1vZGVsICYmXG4gICAgICAgICAgICAoIWlzRW1wdHkoZmlsdGVyLm1vZGVsLCB7IHplcm86IHRydWUgfSkgfHwgIWlzRW1wdHkoZmlsdGVyLm1vZGVsLnZhbHVlLCB7emVybzogdHJ1ZX0pKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgYWNjLnB1c2goZmlsdGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcbiAgfVxuXG4gIHB1YmxpYyBmaWx0ZXJzQ2xlYXIoKSB7XG4gICAgZm9yIChjb25zdCBmaWx0ZXIgb2YgdGhpcy5pdGVtcykge1xuICAgICAgZmlsdGVyLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc29ydEJ5SXRlbSkge1xuICAgICAgaWYgKHRoaXMuc29ydCkge1xuICAgICAgICB0aGlzLnNvcnRCeUl0ZW0ubW9kZWwgPSB0aGlzLnNvcnQudmFsdWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc29ydEJ5SXRlbS5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnREaXJlY3Rpb25JdGVtKSB7XG4gICAgICBpZiAodGhpcy5zb3J0KSB7XG4gICAgICAgIHRoaXMuc29ydERpcmVjdGlvbkl0ZW0ubW9kZWwgPSB0aGlzLnNvcnQuZGlyZWN0aW9uXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNvcnREaXJlY3Rpb25JdGVtLmNsZWFyKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGxvYWRWYWx1ZXNGb3JQZW5kaW5nSXRlbXMoKSB7XG4gICAgdGhpcy5pdGVtc1xuICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5oYXNQZW5kaW5nVmFsdWVzKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IGl0ZW0ubG9hZFZhbHVlcyhmYWxzZSkpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiJdfQ==