@alfresco/adf-content-services
Version:
Alfresco ADF content services
201 lines • 36 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { Component, DestroyRef, inject, ViewEncapsulation } from '@angular/core';
import { ReplaySubject } from 'rxjs';
import { map } from 'rxjs/operators';
import { DateRangeType } from './search-date-range/date-range-type';
import { InLastDateType } from './search-date-range/in-last-date-type';
import { TranslationService } from '@alfresco/adf-core';
import { endOfDay, endOfToday, format, formatISO, parseISO, startOfDay, startOfMonth, startOfWeek, subDays, subMonths, subWeeks } from 'date-fns';
import { CommonModule } from '@angular/common';
import { SearchFilterTabbedComponent } from '../search-filter-tabbed/search-filter-tabbed.component';
import { SearchDateRangeComponent } from './search-date-range/search-date-range.component';
import { SearchFilterTabDirective } from '../search-filter-tabbed/search-filter-tab.directive';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import * as i0 from "@angular/core";
import * as i1 from "@alfresco/adf-core";
import * as i2 from "@angular/common";
const DEFAULT_DATE_DISPLAY_FORMAT = 'dd-MMM-yy';
export class SearchDateRangeTabbedComponent {
constructor(translateService) {
this.translateService = translateService;
this.displayValue$ = new ReplaySubject(1);
this.startValue = {
dateRangeType: DateRangeType.ANY,
inLastValueType: InLastDateType.DAYS,
inLastValue: undefined,
betweenStartDate: undefined,
betweenEndDate: undefined
};
this.preselectedValues = {};
this.tabsValidity = {};
this.value = {};
this.queryMapByField = new Map();
this.displayValueMapByField = new Map();
this.destroyRef = inject(DestroyRef);
}
ngOnInit() {
this.fields = this.settings?.field.split(',').map((field) => field.trim());
this.setDefaultDateFormatSettings();
this.context.populateFilters
.asObservable()
.pipe(map((filtersQueries) => filtersQueries[this.id]), takeUntilDestroyed(this.destroyRef))
.subscribe((filterQuery) => {
if (filterQuery) {
Object.keys(filterQuery).forEach((field) => {
filterQuery[field].betweenStartDate = filterQuery[field].betweenStartDate
? parseISO(filterQuery[field].betweenStartDate)
: undefined;
filterQuery[field].betweenEndDate = filterQuery[field].betweenEndDate
? parseISO(filterQuery[field].betweenEndDate)
: undefined;
this.preselectedValues[field] = filterQuery[field];
this.onDateRangedValueChanged(filterQuery[field], field);
});
this.submitValues(false);
}
else {
this.reset(false);
}
this.context.filterLoaded.next();
});
}
setDefaultDateFormatSettings() {
if (this.settings && !this.settings.dateFormat) {
this.settings.dateFormat = DEFAULT_DATE_DISPLAY_FORMAT;
}
}
getCurrentValue() {
return this.value;
}
hasValidValue() {
return Object.values(this.tabsValidity).every((valid) => valid);
}
reset(updateContext = true) {
this.combinedQuery = '';
this.combinedDisplayValue = '';
this.startValue = {
...this.startValue
};
this.fields.forEach((field) => {
this.context.filterRawParams[field] = undefined;
});
this.context.queryFragments[this.id] = undefined;
this.context.filterRawParams[this.id] = undefined;
this.submitValues(updateContext);
}
setValue(value) {
this.value = value;
}
getTabLabel(field) {
return this.settings?.displayedLabelsByField?.[field] ? this.settings.displayedLabelsByField[field] : field;
}
submitValues(updateContext = true) {
this.context.queryFragments[this.id] = this.combinedQuery;
this.displayValue$.next(this.combinedDisplayValue);
if (this.id && this.context && updateContext) {
this.context.update();
}
}
onDateRangedValueChanged(value, field) {
this.context.filterRawParams[this.id] ||= {};
this.context.filterRawParams[this.id][field] = value;
this.value[field] = value;
this.updateQuery(value, field);
this.updateDisplayValue(value, field);
}
generateQuery(value, field) {
let query = '';
let startDate;
let endDate;
if (value.dateRangeType === DateRangeType.IN_LAST) {
if (value.inLastValue) {
switch (value.inLastValueType) {
case InLastDateType.DAYS:
startDate = startOfDay(subDays(new Date(), parseInt(value.inLastValue, 10)));
break;
case InLastDateType.WEEKS:
startDate = startOfWeek(subWeeks(new Date(), parseInt(value.inLastValue, 10)));
break;
case InLastDateType.MONTHS:
startDate = startOfMonth(subMonths(new Date(), parseInt(value.inLastValue, 10)));
break;
default:
break;
}
}
endDate = endOfToday();
}
else if (value.dateRangeType === DateRangeType.BETWEEN) {
if (value.betweenStartDate && value.betweenEndDate) {
startDate = startOfDay(value.betweenStartDate);
endDate = endOfDay(value.betweenEndDate);
}
}
if (startDate && endDate) {
query = `${field}:['${formatISO(startDate)}' TO '${formatISO(endDate)}']`;
}
return query;
}
generateDisplayValue(value) {
let displayValue = '';
if (value.dateRangeType === DateRangeType.IN_LAST && value.inLastValue) {
displayValue = this.translateService.instant(`SEARCH.DATE_RANGE_ADVANCED.IN_LAST_DISPLAY_LABELS.${value.inLastValueType}`, {
value: value.inLastValue
});
}
else if (value.dateRangeType === DateRangeType.BETWEEN && value.betweenStartDate && value.betweenEndDate) {
displayValue = `${format(startOfDay(value.betweenStartDate), this.settings.dateFormat)} - ${format(endOfDay(value.betweenEndDate), this.settings.dateFormat)}`;
}
return displayValue;
}
updateQuery(value, field) {
this.combinedQuery = '';
this.queryMapByField.set(field, this.generateQuery(value, field));
this.queryMapByField.forEach((query) => {
if (query) {
this.combinedQuery = this.combinedQuery ? `${this.combinedQuery} AND ${query}` : `${query}`;
}
});
}
updateDisplayValue(value, field) {
this.combinedDisplayValue = '';
this.displayValueMapByField.set(field, this.generateDisplayValue(value));
this.displayValueMapByField.forEach((displayValue, fieldForDisplayLabel) => {
if (displayValue) {
const displayLabelForField = `${this.translateService
.instant(this.getDisplayLabelForField(fieldForDisplayLabel))
.toUpperCase()}: ${displayValue}`;
this.combinedDisplayValue = this.combinedDisplayValue
? `${this.combinedDisplayValue} ${displayLabelForField}`
: `${displayLabelForField}`;
}
});
}
getDisplayLabelForField(fieldForDisplayLabel) {
return this.settings?.displayedLabelsByField?.[fieldForDisplayLabel]
? this.settings.displayedLabelsByField[fieldForDisplayLabel]
: fieldForDisplayLabel;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchDateRangeTabbedComponent, deps: [{ token: i1.TranslationService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SearchDateRangeTabbedComponent, isStandalone: true, selector: "adf-search-date-range-tabbed", ngImport: i0, template: "<adf-search-filter-tabbed>\n <ng-container *ngFor=\"let field of fields\">\n <adf-search-date-range\n *adf-search-filter-tab=\"getTabLabel(field)\"\n [dateFormat]=\"settings.dateFormat\"\n [maxDate]=\"settings.maxDate\"\n [field]=\"field\"\n [initialValue]=\"preselectedValues[field]\"\n (changed)=\"onDateRangedValueChanged($event, field)\"\n (valid)=\"tabsValidity[field]=$event\" />\n </ng-container>\n</adf-search-filter-tabbed>\n", styles: ["adf-search-date-range-tabbed .mat-mdc-tab-header{margin-top:-5px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: SearchFilterTabbedComponent, selector: "adf-search-filter-tabbed" }, { kind: "component", type: SearchDateRangeComponent, selector: "adf-search-date-range", inputs: ["dateFormat", "maxDate", "field", "initialValue"], outputs: ["changed", "valid"] }, { kind: "directive", type: SearchFilterTabDirective, selector: "[adf-search-filter-tab]", inputs: ["adf-search-filter-tab"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchDateRangeTabbedComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-search-date-range-tabbed', standalone: true, imports: [CommonModule, SearchFilterTabbedComponent, SearchDateRangeComponent, SearchFilterTabDirective], encapsulation: ViewEncapsulation.None, template: "<adf-search-filter-tabbed>\n <ng-container *ngFor=\"let field of fields\">\n <adf-search-date-range\n *adf-search-filter-tab=\"getTabLabel(field)\"\n [dateFormat]=\"settings.dateFormat\"\n [maxDate]=\"settings.maxDate\"\n [field]=\"field\"\n [initialValue]=\"preselectedValues[field]\"\n (changed)=\"onDateRangedValueChanged($event, field)\"\n (valid)=\"tabsValidity[field]=$event\" />\n </ng-container>\n</adf-search-filter-tabbed>\n", styles: ["adf-search-date-range-tabbed .mat-mdc-tab-header{margin-top:-5px}\n"] }]
}], ctorParameters: () => [{ type: i1.TranslationService }] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWRhdGUtcmFuZ2UtdGFiYmVkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvc2VhcmNoL2NvbXBvbmVudHMvc2VhcmNoLWRhdGUtcmFuZ2UtdGFiYmVkL3NlYXJjaC1kYXRlLXJhbmdlLXRhYmJlZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3NlYXJjaC9jb21wb25lbnRzL3NlYXJjaC1kYXRlLXJhbmdlLXRhYmJlZC9zZWFyY2gtZGF0ZS1yYW5nZS10YWJiZWQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDckMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUtwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDbEosT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSwyQkFB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O1lBQ3BDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyx1QkFBdUIsQ0FBQyxvQkFBNEI7UUFDeEQsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLHNCQUFzQixFQUFFLENBQUMsb0JBQW9CLENBQUM7WUFDaEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsb0JBQW9CLENBQUM7WUFDNUQsQ0FBQyxDQUFDLG9CQUFvQixDQUFDO0lBQy9CLENBQUM7OEdBdExRLDhCQUE4QjtrR0FBOUIsOEJBQThCLHdGQzVDM0MsOGdCQVlBLDRIRDJCYyxZQUFZLDRKQUFFLDJCQUEyQixxRUFBRSx3QkFBd0IsNkpBQUUsd0JBQXdCOzsyRkFLOUYsOEJBQThCO2tCQVIxQyxTQUFTOytCQUNJLDhCQUE4QixjQUM1QixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsMkJBQTJCLEVBQUUsd0JBQXdCLEVBQUUsd0JBQXdCLENBQUMsaUJBR3pGLGlCQUFpQixDQUFDLElBQUkiLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgaW5qZWN0LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VUeXBlIH0gZnJvbSAnLi9zZWFyY2gtZGF0ZS1yYW5nZS9kYXRlLXJhbmdlLXR5cGUnO1xuaW1wb3J0IHsgU2VhcmNoRGF0ZVJhbmdlIH0gZnJvbSAnLi9zZWFyY2gtZGF0ZS1yYW5nZS9zZWFyY2gtZGF0ZS1yYW5nZSc7XG5pbXBvcnQgeyBTZWFyY2hXaWRnZXQgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2VhcmNoLXdpZGdldC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VhcmNoV2lkZ2V0U2V0dGluZ3MgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2VhcmNoLXdpZGdldC1zZXR0aW5ncy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VhcmNoUXVlcnlCdWlsZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3NlYXJjaC1xdWVyeS1idWlsZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgSW5MYXN0RGF0ZVR5cGUgfSBmcm9tICcuL3NlYXJjaC1kYXRlLXJhbmdlL2luLWxhc3QtZGF0ZS10eXBlJztcbmltcG9ydCB7IFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BhbGZyZXNjby9hZGYtY29yZSc7XG5pbXBvcnQgeyBlbmRPZkRheSwgZW5kT2ZUb2RheSwgZm9ybWF0LCBmb3JtYXRJU08sIHBhcnNlSVNPLCBzdGFydE9mRGF5LCBzdGFydE9mTW9udGgsIHN0YXJ0T2ZXZWVrLCBzdWJEYXlzLCBzdWJNb250aHMsIHN1YldlZWtzIH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IFNlYXJjaEZpbHRlclRhYmJlZENvbXBvbmVudCB9IGZyb20gJy4uL3NlYXJjaC1maWx0ZXItdGFiYmVkL3NlYXJjaC1maWx0ZXItdGFiYmVkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hEYXRlUmFuZ2VDb21wb25lbnQgfSBmcm9tICcuL3NlYXJjaC1kYXRlLXJhbmdlL3NlYXJjaC1kYXRlLXJhbmdlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hGaWx0ZXJUYWJEaXJlY3RpdmUgfSBmcm9tICcuLi9zZWFyY2gtZmlsdGVyLXRhYmJlZC9zZWFyY2gtZmlsdGVyLXRhYi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5jb25zdCBERUZBVUxUX0RBVEVfRElTUExBWV9GT1JNQVQgPSAnZGQtTU1NLXl5JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtc2VhcmNoLWRhdGUtcmFuZ2UtdGFiYmVkJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNlYXJjaEZpbHRlclRhYmJlZENvbXBvbmVudCwgU2VhcmNoRGF0ZVJhbmdlQ29tcG9uZW50LCBTZWFyY2hGaWx0ZXJUYWJEaXJlY3RpdmVdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zZWFyY2gtZGF0ZS1yYW5nZS10YWJiZWQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3NlYXJjaC1kYXRlLXJhbmdlLXRhYmJlZC5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoRGF0ZVJhbmdlVGFiYmVkQ29tcG9uZW50IGltcGxlbWVudHMgU2VhcmNoV2lkZ2V0LCBPbkluaXQge1xuICAgIGRpc3BsYXlWYWx1ZSQgPSBuZXcgUmVwbGF5U3ViamVjdDxzdHJpbmc+KDEpO1xuICAgIGlkOiBzdHJpbmc7XG4gICAgc3RhcnRWYWx1ZTogU2VhcmNoRGF0ZVJhbmdlID0ge1xuICAgICAgICBkYXRlUmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlLkFOWSxcbiAgICAgICAgaW5MYXN0VmFsdWVUeXBlOiBJbkxhc3REYXRlVHlwZS5EQVlTLFxuICAgICAgICBpbkxhc3RWYWx1ZTogdW5kZWZpbmVkLFxuICAgICAgICBiZXR3ZWVuU3RhcnREYXRlOiB1bmRlZmluZWQsXG4gICAgICAgIGJldHdlZW5FbmREYXRlOiB1bmRlZmluZWRcbiAgICB9O1xuICAgIHByZXNlbGVjdGVkVmFsdWVzOiB7IFtrZXk6IHN0cmluZ106IFNlYXJjaERhdGVSYW5nZSB9ID0ge307XG4gICAgc2V0dGluZ3M/OiBTZWFyY2hXaWRnZXRTZXR0aW5ncztcbiAgICBjb250ZXh0PzogU2VhcmNoUXVlcnlCdWlsZGVyU2VydmljZTtcbiAgICBmaWVsZHM6IHN0cmluZ1tdO1xuICAgIHRhYnNWYWxpZGl0eTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcbiAgICBjb21iaW5lZFF1ZXJ5OiBzdHJpbmc7XG4gICAgY29tYmluZWREaXNwbGF5VmFsdWU6IHN0cmluZztcblxuICAgIHByaXZhdGUgdmFsdWU6IHsgW2tleTogc3RyaW5nXTogUGFydGlhbDxTZWFyY2hEYXRlUmFuZ2U+IH0gPSB7fTtcbiAgICBwcml2YXRlIHF1ZXJ5TWFwQnlGaWVsZDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgcHJpdmF0ZSBkaXNwbGF5VmFsdWVNYXBCeUZpZWxkOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRpb25TZXJ2aWNlKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZmllbGRzID0gdGhpcy5zZXR0aW5ncz8uZmllbGQuc3BsaXQoJywnKS5tYXAoKGZpZWxkKSA9PiBmaWVsZC50cmltKCkpO1xuICAgICAgICB0aGlzLnNldERlZmF1bHREYXRlRm9ybWF0U2V0dGluZ3MoKTtcbiAgICAgICAgdGhpcy5jb250ZXh0LnBvcHVsYXRlRmlsdGVyc1xuICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBtYXAoKGZpbHRlcnNRdWVyaWVzKSA9PiBmaWx0ZXJzUXVlcmllc1t0aGlzLmlkXSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZpbHRlclF1ZXJ5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbHRlclF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGZpbHRlclF1ZXJ5KS5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyUXVlcnlbZmllbGRdLmJldHdlZW5TdGFydERhdGUgPSBmaWx0ZXJRdWVyeVtmaWVsZF0uYmV0d2VlblN0YXJ0RGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGFyc2VJU08oZmlsdGVyUXVlcnlbZmllbGRdLmJldHdlZW5TdGFydERhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJRdWVyeVtmaWVsZF0uYmV0d2VlbkVuZERhdGUgPSBmaWx0ZXJRdWVyeVtmaWVsZF0uYmV0d2VlbkVuZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSVNPKGZpbHRlclF1ZXJ5W2ZpZWxkXS5iZXR3ZWVuRW5kRGF0ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlc2VsZWN0ZWRWYWx1ZXNbZmllbGRdID0gZmlsdGVyUXVlcnlbZmllbGRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRhdGVSYW5nZWRWYWx1ZUNoYW5nZWQoZmlsdGVyUXVlcnlbZmllbGRdLCBmaWVsZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdFZhbHVlcyhmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC5maWx0ZXJMb2FkZWQubmV4dCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgc2V0RGVmYXVsdERhdGVGb3JtYXRTZXR0aW5ncygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2V0dGluZ3MgJiYgIXRoaXMuc2V0dGluZ3MuZGF0ZUZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5kYXRlRm9ybWF0ID0gREVGQVVMVF9EQVRFX0RJU1BMQVlfRk9STUFUO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Q3VycmVudFZhbHVlKCk6IHsgW2tleTogc3RyaW5nXTogUGFydGlhbDxTZWFyY2hEYXRlUmFuZ2U+IH0ge1xuICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgICB9XG5cbiAgICBoYXNWYWxpZFZhbHVlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLnRhYnNWYWxpZGl0eSkuZXZlcnkoKHZhbGlkKSA9PiB2YWxpZCk7XG4gICAgfVxuXG4gICAgcmVzZXQodXBkYXRlQ29udGV4dCA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5jb21iaW5lZFF1ZXJ5ID0gJyc7XG4gICAgICAgIHRoaXMuY29tYmluZWREaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5zdGFydFZhbHVlID0ge1xuICAgICAgICAgICAgLi4udGhpcy5zdGFydFZhbHVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZmllbGRzLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuZmlsdGVyUmF3UGFyYW1zW2ZpZWxkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29udGV4dC5xdWVyeUZyYWdtZW50c1t0aGlzLmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbHRlclJhd1BhcmFtc1t0aGlzLmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5zdWJtaXRWYWx1ZXModXBkYXRlQ29udGV4dCk7XG4gICAgfVxuXG4gICAgc2V0VmFsdWUodmFsdWU6IHsgW2tleTogc3RyaW5nXTogU2VhcmNoRGF0ZVJhbmdlIH0pIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGdldFRhYkxhYmVsKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXR0aW5ncz8uZGlzcGxheWVkTGFiZWxzQnlGaWVsZD8uW2ZpZWxkXSA/IHRoaXMuc2V0dGluZ3MuZGlzcGxheWVkTGFiZWxzQnlGaWVsZFtmaWVsZF0gOiBmaWVsZDtcbiAgICB9XG5cbiAgICBzdWJtaXRWYWx1ZXModXBkYXRlQ29udGV4dCA9IHRydWUpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0LnF1ZXJ5RnJhZ21lbnRzW3RoaXMuaWRdID0gdGhpcy5jb21iaW5lZFF1ZXJ5O1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSQubmV4dCh0aGlzLmNvbWJpbmVkRGlzcGxheVZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaWQgJiYgdGhpcy5jb250ZXh0ICYmIHVwZGF0ZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC51cGRhdGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBvbkRhdGVSYW5nZWRWYWx1ZUNoYW5nZWQodmFsdWU6IFBhcnRpYWw8U2VhcmNoRGF0ZVJhbmdlPiwgZmllbGQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbnRleHQuZmlsdGVyUmF3UGFyYW1zW3RoaXMuaWRdIHx8PSB7fTtcbiAgICAgICAgdGhpcy5jb250ZXh0LmZpbHRlclJhd1BhcmFtc1t0aGlzLmlkXVtmaWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy52YWx1ZVtmaWVsZF0gPSB2YWx1ZTtcbiAgICAgICAgdGhpcy51cGRhdGVRdWVyeSh2YWx1ZSwgZmllbGQpO1xuICAgICAgICB0aGlzLnVwZGF0ZURpc3BsYXlWYWx1ZSh2YWx1ZSwgZmllbGQpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2VuZXJhdGVRdWVyeSh2YWx1ZTogUGFydGlhbDxTZWFyY2hEYXRlUmFuZ2U+LCBmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHF1ZXJ5ID0gJyc7XG4gICAgICAgIGxldCBzdGFydERhdGU6IERhdGU7XG4gICAgICAgIGxldCBlbmREYXRlOiBEYXRlO1xuICAgICAgICBpZiAodmFsdWUuZGF0ZVJhbmdlVHlwZSA9PT0gRGF0ZVJhbmdlVHlwZS5JTl9MQVNUKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuaW5MYXN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlLmluTGFzdFZhbHVlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIEluTGFzdERhdGVUeXBlLkRBWVM6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBzdGFydE9mRGF5KHN1YkRheXMobmV3IERhdGUoKSwgcGFyc2VJbnQodmFsdWUuaW5MYXN0VmFsdWUsIDEwKSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgSW5MYXN0RGF0ZVR5cGUuV0VFS1M6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBzdGFydE9mV2VlayhzdWJXZWVrcyhuZXcgRGF0ZSgpLCBwYXJzZUludCh2YWx1ZS5pbkxhc3RWYWx1ZSwgMTApKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBJbkxhc3REYXRlVHlwZS5NT05USFM6XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGUgPSBzdGFydE9mTW9udGgoc3ViTW9udGhzKG5ldyBEYXRlKCksIHBhcnNlSW50KHZhbHVlLmluTGFzdFZhbHVlLCAxMCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kRGF0ZSA9IGVuZE9mVG9kYXkoKTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5kYXRlUmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkJFVFdFRU4pIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5iZXR3ZWVuU3RhcnREYXRlICYmIHZhbHVlLmJldHdlZW5FbmREYXRlKSB7XG4gICAgICAgICAgICAgICAgc3RhcnREYXRlID0gc3RhcnRPZkRheSh2YWx1ZS5iZXR3ZWVuU3RhcnREYXRlKTtcbiAgICAgICAgICAgICAgICBlbmREYXRlID0gZW5kT2ZEYXkodmFsdWUuYmV0d2VlbkVuZERhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzdGFydERhdGUgJiYgZW5kRGF0ZSkge1xuICAgICAgICAgICAgcXVlcnkgPSBgJHtmaWVsZH06Wycke2Zvcm1hdElTTyhzdGFydERhdGUpfScgVE8gJyR7Zm9ybWF0SVNPKGVuZERhdGUpfSddYDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW5lcmF0ZURpc3BsYXlWYWx1ZSh2YWx1ZTogUGFydGlhbDxTZWFyY2hEYXRlUmFuZ2U+KTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpc3BsYXlWYWx1ZSA9ICcnO1xuICAgICAgICBpZiAodmFsdWUuZGF0ZVJhbmdlVHlwZSA9PT0gRGF0ZVJhbmdlVHlwZS5JTl9MQVNUICYmIHZhbHVlLmluTGFzdFZhbHVlKSB7XG4gICAgICAgICAgICBkaXNwbGF5VmFsdWUgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChgU0VBUkNILkRBVEVfUkFOR0VfQURWQU5DRUQuSU5fTEFTVF9ESVNQTEFZX0xBQkVMUy4ke3ZhbHVlLmluTGFzdFZhbHVlVHlwZX1gLCB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLmluTGFzdFZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5kYXRlUmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkJFVFdFRU4gJiYgdmFsdWUuYmV0d2VlblN0YXJ0RGF0ZSAmJiB2YWx1ZS5iZXR3ZWVuRW5kRGF0ZSkge1xuICAgICAgICAgICAgZGlzcGxheVZhbHVlID0gYCR7Zm9ybWF0KHN0YXJ0T2ZEYXkodmFsdWUuYmV0d2VlblN0YXJ0RGF0ZSksIHRoaXMuc2V0dGluZ3MuZGF0ZUZvcm1hdCl9IC0gJHtmb3JtYXQoXG4gICAgICAgICAgICAgICAgZW5kT2ZEYXkodmFsdWUuYmV0d2VlbkVuZERhdGUpLFxuICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZGF0ZUZvcm1hdFxuICAgICAgICAgICAgKX1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkaXNwbGF5VmFsdWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVRdWVyeSh2YWx1ZTogUGFydGlhbDxTZWFyY2hEYXRlUmFuZ2U+LCBmaWVsZDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuY29tYmluZWRRdWVyeSA9ICcnO1xuICAgICAgICB0aGlzLnF1ZXJ5TWFwQnlGaWVsZC5zZXQoZmllbGQsIHRoaXMuZ2VuZXJhdGVRdWVyeSh2YWx1ZSwgZmllbGQpKTtcbiAgICAgICAgdGhpcy5xdWVyeU1hcEJ5RmllbGQuZm9yRWFjaCgocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21iaW5lZFF1ZXJ5ID0gdGhpcy5jb21iaW5lZFF1ZXJ5ID8gYCR7dGhpcy5jb21iaW5lZFF1ZXJ5fSBBTkQgJHtxdWVyeX1gIDogYCR7cXVlcnl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVEaXNwbGF5VmFsdWUodmFsdWU6IFBhcnRpYWw8U2VhcmNoRGF0ZVJhbmdlPiwgZmllbGQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbWJpbmVkRGlzcGxheVZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMuZGlzcGxheVZhbHVlTWFwQnlGaWVsZC5zZXQoZmllbGQsIHRoaXMuZ2VuZXJhdGVEaXNwbGF5VmFsdWUodmFsdWUpKTtcbiAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWVNYXBCeUZpZWxkLmZvckVhY2goKGRpc3BsYXlWYWx1ZTogc3RyaW5nLCBmaWVsZEZvckRpc3BsYXlMYWJlbDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGlzcGxheVZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGlzcGxheUxhYmVsRm9yRmllbGQgPSBgJHt0aGlzLnRyYW5zbGF0ZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmluc3RhbnQodGhpcy5nZXREaXNwbGF5TGFiZWxGb3JGaWVsZChmaWVsZEZvckRpc3BsYXlMYWJlbCkpXG4gICAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpfTogJHtkaXNwbGF5VmFsdWV9YDtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbWJpbmVkRGlzcGxheVZhbHVlID0gdGhpcy5jb21iaW5lZERpc3BsYXlWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA/IGAke3RoaXMuY29tYmluZWREaXNwbGF5VmFsdWV9ICR7ZGlzcGxheUxhYmVsRm9yRmllbGR9YFxuICAgICAgICAgICAgICAgICAgICA6IGAke2Rpc3BsYXlMYWJlbEZvckZpZWxkfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGlzcGxheUxhYmVsRm9yRmllbGQoZmllbGRGb3JEaXNwbGF5TGFiZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5kaXNwbGF5ZWRMYWJlbHNCeUZpZWxkPy5bZmllbGRGb3JEaXNwbGF5TGFiZWxdXG4gICAgICAgICAgICA/IHRoaXMuc2V0dGluZ3MuZGlzcGxheWVkTGFiZWxzQnlGaWVsZFtmaWVsZEZvckRpc3BsYXlMYWJlbF1cbiAgICAgICAgICAgIDogZmllbGRGb3JEaXNwbGF5TGFiZWw7XG4gICAgfVxufVxuIiwiPGFkZi1zZWFyY2gtZmlsdGVyLXRhYmJlZD5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBmaWVsZCBvZiBmaWVsZHNcIj5cbiAgICAgICAgPGFkZi1zZWFyY2gtZGF0ZS1yYW5nZVxuICAgICAgICAgICAgKmFkZi1zZWFyY2gtZmlsdGVyLXRhYj1cImdldFRhYkxhYmVsKGZpZWxkKVwiXG4gICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJzZXR0aW5ncy5kYXRlRm9ybWF0XCJcbiAgICAgICAgICAgIFttYXhEYXRlXT1cInNldHRpbmdzLm1heERhdGVcIlxuICAgICAgICAgICAgW2ZpZWxkXT1cImZpZWxkXCJcbiAgICAgICAgICAgIFtpbml0aWFsVmFsdWVdPVwicHJlc2VsZWN0ZWRWYWx1ZXNbZmllbGRdXCJcbiAgICAgICAgICAgIChjaGFuZ2VkKT1cIm9uRGF0ZVJhbmdlZFZhbHVlQ2hhbmdlZCgkZXZlbnQsIGZpZWxkKVwiXG4gICAgICAgICAgICAodmFsaWQpPVwidGFic1ZhbGlkaXR5W2ZpZWxkXT0kZXZlbnRcIiAvPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9hZGYtc2VhcmNoLWZpbHRlci10YWJiZWQ+XG4iXX0=