@seniorsistemas/platform-components 5.3.3 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/modules/advanced-filter/advanced-filter.module.mjs +75 -0
- package/esm2022/modules/advanced-filter/components/advanced-filter/advanced-filter.component.mjs +128 -0
- package/esm2022/modules/advanced-filter/components/form-filter/form-filter.component.mjs +651 -0
- package/esm2022/modules/advanced-filter/index.mjs +6 -0
- package/esm2022/modules/advanced-filter/locale/fallback.mjs +73 -0
- package/esm2022/modules/advanced-filter/models/context.mjs +2 -0
- package/esm2022/modules/advanced-filter/models/depends-on.mjs +2 -0
- package/esm2022/modules/advanced-filter/models/enum-item.mjs +2 -0
- package/esm2022/modules/advanced-filter/models/filter-type.mjs +14 -0
- package/esm2022/modules/advanced-filter/models/filter-value.mjs +2 -0
- package/esm2022/modules/advanced-filter/models/filter.mjs +41 -0
- package/esm2022/modules/advanced-filter/models/form-filter.mjs +28 -0
- package/esm2022/modules/advanced-filter/models/index.mjs +11 -0
- package/esm2022/modules/advanced-filter/models/scope.mjs +6 -0
- package/esm2022/modules/advanced-filter/models/search.mjs +2 -0
- package/esm2022/modules/advanced-filter/models/tab-view.mjs +18 -0
- package/esm2022/modules/advanced-filter/models/ticked-filter.mjs +2 -0
- package/esm2022/modules/advanced-filter/pipes/map-values.pipe.mjs +14 -0
- package/esm2022/modules/advanced-filter/pipes/translate.pipe.mjs +19 -0
- package/esm2022/modules/advanced-filter/services/advanced-filter.service.mjs +146 -0
- package/esm2022/modules/advanced-filter/services/calendar-options.service.mjs +77 -0
- package/esm2022/modules/advanced-filter/services/constants.mjs +6 -0
- package/esm2022/modules/advanced-filter/shared/constants.mjs +3 -0
- package/esm2022/modules/advanced-filter/utils/comparator.mjs +53 -0
- package/esm2022/modules/advanced-filter/utils/filter-id/index.mjs +8 -0
- package/esm2022/modules/advanced-filter/utils/filter-value/index.mjs +26 -0
- package/esm2022/modules/advanced-filter/utils/filterOperators.mjs +9 -0
- package/esm2022/modules/advanced-filter/utils/form-field/index.mjs +52 -0
- package/esm2022/modules/advanced-filter/utils/index.mjs +57 -0
- package/esm2022/modules/advanced-filter/utils/json-path.mjs +13 -0
- package/esm2022/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.mjs +14 -0
- package/esm2022/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.mjs +29 -0
- package/esm2022/modules/cyclic-json-interceptor/index.mjs +2 -0
- package/esm2022/modules/feature-toggle/constants/endpoint.constant.mjs +26 -0
- package/esm2022/modules/feature-toggle/feature-toggle.module.mjs +15 -0
- package/esm2022/modules/feature-toggle/feature-toggle.service.mjs +42 -0
- package/esm2022/modules/feature-toggle/index.mjs +4 -0
- package/esm2022/modules/feature-toggle/models/feature.mjs +2 -0
- package/esm2022/modules/http-interceptor/http-interceptor.module.mjs +16 -0
- package/esm2022/modules/http-interceptor/http-interceptor.service.mjs +42 -0
- package/esm2022/modules/http-interceptor/index.mjs +4 -0
- package/esm2022/modules/http-interceptor/rest-url.service.mjs +15 -0
- package/esm2022/modules/http-interceptor/x-services-url.service.mjs +18 -0
- package/esm2022/modules/permissions/permissions.config.mjs +17 -0
- package/esm2022/modules/permissions/permissions.module.mjs +43 -0
- package/esm2022/modules/permissions/permissions.service.mjs +169 -0
- package/esm2022/modules/spotlight/component/spotlight.component.mjs +274 -0
- package/esm2022/modules/spotlight/index.mjs +3 -0
- package/esm2022/modules/spotlight/locale/fallback.mjs +5 -0
- package/esm2022/modules/spotlight/models/display-type.enum.mjs +6 -0
- package/esm2022/modules/spotlight/models/index.mjs +10 -0
- package/esm2022/modules/spotlight/models/spotlight-control-list.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/spotlight-control.interface.mjs +11 -0
- package/esm2022/modules/spotlight/models/spotlight-notification.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/spotlight-screen-list.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/spotlight-screen.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/spotlight-status.enum.mjs +8 -0
- package/esm2022/modules/spotlight/models/spotlight-user.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/spotlight-users-list.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/spotlight.interface.mjs +2 -0
- package/esm2022/modules/spotlight/models/user-action.enum.mjs +7 -0
- package/esm2022/modules/spotlight/pipes/translate.pipe.mjs +19 -0
- package/esm2022/modules/spotlight/service/spotlight.service.mjs +34 -0
- package/esm2022/modules/spotlight/spotlight.module.mjs +53 -0
- package/esm2022/modules/translations/translations.module.mjs +192 -0
- package/esm2022/public-api.mjs +10 -0
- package/esm2022/seniorsistemas-platform-components.mjs +5 -0
- package/fesm2022/seniorsistemas-platform-components.mjs +2432 -0
- package/fesm2022/seniorsistemas-platform-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/modules/advanced-filter/advanced-filter.module.d.ts +19 -0
- package/modules/advanced-filter/components/advanced-filter/advanced-filter.component.d.ts +4 -3
- package/modules/advanced-filter/components/form-filter/form-filter.component.d.ts +15 -12
- package/modules/advanced-filter/index.d.ts +1 -0
- package/modules/advanced-filter/models/tab-view.d.ts +1 -1
- package/modules/advanced-filter/pipes/map-values.pipe.d.ts +3 -0
- package/modules/advanced-filter/pipes/translate.pipe.d.ts +4 -3
- package/modules/advanced-filter/services/advanced-filter.service.d.ts +7 -3
- package/modules/advanced-filter/services/calendar-options.service.d.ts +4 -3
- package/modules/advanced-filter/services/constants.d.ts +4 -4
- package/modules/advanced-filter/utils/comparator.d.ts +1 -1
- package/modules/advanced-filter/utils/form-field/index.d.ts +1 -1
- package/modules/advanced-filter/utils/json-path.d.ts +1 -1
- package/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.d.ts +4 -0
- package/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.d.ts +3 -0
- package/modules/feature-toggle/feature-toggle.module.d.ts +5 -0
- package/modules/feature-toggle/feature-toggle.service.d.ts +4 -3
- package/modules/http-interceptor/http-interceptor.module.d.ts +4 -0
- package/modules/http-interceptor/http-interceptor.service.d.ts +3 -3
- package/modules/http-interceptor/rest-url.service.d.ts +3 -0
- package/modules/http-interceptor/x-services-url.service.d.ts +3 -0
- package/modules/permissions/permissions.config.d.ts +7 -1
- package/modules/permissions/permissions.module.d.ts +4 -0
- package/modules/permissions/permissions.service.d.ts +6 -12
- package/modules/spotlight/component/spotlight.component.d.ts +6 -7
- package/modules/spotlight/pipes/translate.pipe.d.ts +4 -3
- package/modules/spotlight/service/spotlight.service.d.ts +4 -3
- package/modules/spotlight/spotlight.module.d.ts +11 -0
- package/modules/translations/translations.module.d.ts +8 -3
- package/package.json +22 -19
- package/public-api.d.ts +1 -0
- package/bundles/seniorsistemas-platform-components.umd.js +0 -2745
- package/bundles/seniorsistemas-platform-components.umd.js.map +0 -1
- package/bundles/seniorsistemas-platform-components.umd.min.js +0 -17
- package/bundles/seniorsistemas-platform-components.umd.min.js.map +0 -1
- package/esm2015/modules/advanced-filter/advanced-filter.module.js +0 -47
- package/esm2015/modules/advanced-filter/components/advanced-filter/advanced-filter.component.js +0 -136
- package/esm2015/modules/advanced-filter/components/form-filter/form-filter.component.js +0 -578
- package/esm2015/modules/advanced-filter/index.js +0 -5
- package/esm2015/modules/advanced-filter/locale/fallback.js +0 -73
- package/esm2015/modules/advanced-filter/models/context.js +0 -1
- package/esm2015/modules/advanced-filter/models/depends-on.js +0 -1
- package/esm2015/modules/advanced-filter/models/enum-item.js +0 -1
- package/esm2015/modules/advanced-filter/models/filter-type.js +0 -14
- package/esm2015/modules/advanced-filter/models/filter-value.js +0 -1
- package/esm2015/modules/advanced-filter/models/filter.js +0 -23
- package/esm2015/modules/advanced-filter/models/form-filter.js +0 -19
- package/esm2015/modules/advanced-filter/models/index.js +0 -5
- package/esm2015/modules/advanced-filter/models/scope.js +0 -6
- package/esm2015/modules/advanced-filter/models/search.js +0 -1
- package/esm2015/modules/advanced-filter/models/tab-view.js +0 -18
- package/esm2015/modules/advanced-filter/models/ticked-filter.js +0 -1
- package/esm2015/modules/advanced-filter/pipes/map-values.pipe.js +0 -12
- package/esm2015/modules/advanced-filter/pipes/translate.pipe.js +0 -22
- package/esm2015/modules/advanced-filter/services/advanced-filter.service.js +0 -140
- package/esm2015/modules/advanced-filter/services/calendar-options.service.js +0 -81
- package/esm2015/modules/advanced-filter/services/constants.js +0 -6
- package/esm2015/modules/advanced-filter/shared/constants.js +0 -3
- package/esm2015/modules/advanced-filter/utils/comparator.js +0 -55
- package/esm2015/modules/advanced-filter/utils/filter-id/index.js +0 -8
- package/esm2015/modules/advanced-filter/utils/filter-value/index.js +0 -24
- package/esm2015/modules/advanced-filter/utils/filterOperators.js +0 -11
- package/esm2015/modules/advanced-filter/utils/form-field/index.js +0 -50
- package/esm2015/modules/advanced-filter/utils/index.js +0 -57
- package/esm2015/modules/advanced-filter/utils/json-path.js +0 -12
- package/esm2015/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.js +0 -14
- package/esm2015/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.js +0 -27
- package/esm2015/modules/cyclic-json-interceptor/index.js +0 -2
- package/esm2015/modules/feature-toggle/constants/endpoint.constant.js +0 -26
- package/esm2015/modules/feature-toggle/feature-toggle.module.js +0 -15
- package/esm2015/modules/feature-toggle/feature-toggle.service.js +0 -48
- package/esm2015/modules/feature-toggle/index.js +0 -3
- package/esm2015/modules/feature-toggle/models/feature.js +0 -1
- package/esm2015/modules/http-interceptor/http-interceptor.module.js +0 -16
- package/esm2015/modules/http-interceptor/http-interceptor.service.js +0 -47
- package/esm2015/modules/http-interceptor/index.js +0 -4
- package/esm2015/modules/http-interceptor/rest-url.service.js +0 -14
- package/esm2015/modules/http-interceptor/x-services-url.service.js +0 -17
- package/esm2015/modules/permissions/permissions.config.js +0 -11
- package/esm2015/modules/permissions/permissions.module.js +0 -42
- package/esm2015/modules/permissions/permissions.service.js +0 -196
- package/esm2015/modules/spotlight/component/spotlight.component.js +0 -274
- package/esm2015/modules/spotlight/index.js +0 -3
- package/esm2015/modules/spotlight/locale/fallback.js +0 -5
- package/esm2015/modules/spotlight/models/display-type.enum.js +0 -6
- package/esm2015/modules/spotlight/models/index.js +0 -4
- package/esm2015/modules/spotlight/models/spotlight-control-list.interface.js +0 -1
- package/esm2015/modules/spotlight/models/spotlight-control.interface.js +0 -3
- package/esm2015/modules/spotlight/models/spotlight-notification.interface.js +0 -1
- package/esm2015/modules/spotlight/models/spotlight-screen-list.interface.js +0 -1
- package/esm2015/modules/spotlight/models/spotlight-screen.interface.js +0 -1
- package/esm2015/modules/spotlight/models/spotlight-status.enum.js +0 -8
- package/esm2015/modules/spotlight/models/spotlight-user.interface.js +0 -1
- package/esm2015/modules/spotlight/models/spotlight-users-list.interface.js +0 -1
- package/esm2015/modules/spotlight/models/spotlight.interface.js +0 -1
- package/esm2015/modules/spotlight/models/user-action.enum.js +0 -7
- package/esm2015/modules/spotlight/pipes/translate.pipe.js +0 -22
- package/esm2015/modules/spotlight/service/spotlight.service.js +0 -38
- package/esm2015/modules/spotlight/spotlight.module.js +0 -37
- package/esm2015/modules/translations/translations.module.js +0 -182
- package/esm2015/public-api.js +0 -9
- package/esm2015/seniorsistemas-platform-components.js +0 -16
- package/esm5/modules/advanced-filter/advanced-filter.module.js +0 -54
- package/esm5/modules/advanced-filter/components/advanced-filter/advanced-filter.component.js +0 -144
- package/esm5/modules/advanced-filter/components/form-filter/form-filter.component.js +0 -626
- package/esm5/modules/advanced-filter/index.js +0 -5
- package/esm5/modules/advanced-filter/locale/fallback.js +0 -73
- package/esm5/modules/advanced-filter/models/context.js +0 -1
- package/esm5/modules/advanced-filter/models/depends-on.js +0 -1
- package/esm5/modules/advanced-filter/models/enum-item.js +0 -1
- package/esm5/modules/advanced-filter/models/filter-type.js +0 -14
- package/esm5/modules/advanced-filter/models/filter-value.js +0 -1
- package/esm5/modules/advanced-filter/models/filter.js +0 -25
- package/esm5/modules/advanced-filter/models/form-filter.js +0 -25
- package/esm5/modules/advanced-filter/models/index.js +0 -5
- package/esm5/modules/advanced-filter/models/scope.js +0 -6
- package/esm5/modules/advanced-filter/models/search.js +0 -1
- package/esm5/modules/advanced-filter/models/tab-view.js +0 -29
- package/esm5/modules/advanced-filter/models/ticked-filter.js +0 -1
- package/esm5/modules/advanced-filter/pipes/map-values.pipe.js +0 -16
- package/esm5/modules/advanced-filter/pipes/translate.pipe.js +0 -23
- package/esm5/modules/advanced-filter/services/advanced-filter.service.js +0 -151
- package/esm5/modules/advanced-filter/services/calendar-options.service.js +0 -82
- package/esm5/modules/advanced-filter/services/constants.js +0 -6
- package/esm5/modules/advanced-filter/shared/constants.js +0 -3
- package/esm5/modules/advanced-filter/utils/comparator.js +0 -55
- package/esm5/modules/advanced-filter/utils/filter-id/index.js +0 -8
- package/esm5/modules/advanced-filter/utils/filter-value/index.js +0 -25
- package/esm5/modules/advanced-filter/utils/filterOperators.js +0 -11
- package/esm5/modules/advanced-filter/utils/form-field/index.js +0 -52
- package/esm5/modules/advanced-filter/utils/index.js +0 -57
- package/esm5/modules/advanced-filter/utils/json-path.js +0 -12
- package/esm5/modules/cyclic-json-interceptor/cyclic-json-interceptor.module.js +0 -17
- package/esm5/modules/cyclic-json-interceptor/cyclic-json-interceptor.service.js +0 -30
- package/esm5/modules/cyclic-json-interceptor/index.js +0 -2
- package/esm5/modules/feature-toggle/constants/endpoint.constant.js +0 -27
- package/esm5/modules/feature-toggle/feature-toggle.module.js +0 -18
- package/esm5/modules/feature-toggle/feature-toggle.service.js +0 -51
- package/esm5/modules/feature-toggle/index.js +0 -3
- package/esm5/modules/feature-toggle/models/feature.js +0 -1
- package/esm5/modules/http-interceptor/http-interceptor.module.js +0 -19
- package/esm5/modules/http-interceptor/http-interceptor.service.js +0 -49
- package/esm5/modules/http-interceptor/index.js +0 -4
- package/esm5/modules/http-interceptor/rest-url.service.js +0 -17
- package/esm5/modules/http-interceptor/x-services-url.service.js +0 -20
- package/esm5/modules/permissions/permissions.config.js +0 -17
- package/esm5/modules/permissions/permissions.module.js +0 -46
- package/esm5/modules/permissions/permissions.service.js +0 -212
- package/esm5/modules/spotlight/component/spotlight.component.js +0 -300
- package/esm5/modules/spotlight/index.js +0 -3
- package/esm5/modules/spotlight/locale/fallback.js +0 -5
- package/esm5/modules/spotlight/models/display-type.enum.js +0 -6
- package/esm5/modules/spotlight/models/index.js +0 -4
- package/esm5/modules/spotlight/models/spotlight-control-list.interface.js +0 -1
- package/esm5/modules/spotlight/models/spotlight-control.interface.js +0 -7
- package/esm5/modules/spotlight/models/spotlight-notification.interface.js +0 -1
- package/esm5/modules/spotlight/models/spotlight-screen-list.interface.js +0 -1
- package/esm5/modules/spotlight/models/spotlight-screen.interface.js +0 -1
- package/esm5/modules/spotlight/models/spotlight-status.enum.js +0 -8
- package/esm5/modules/spotlight/models/spotlight-user.interface.js +0 -1
- package/esm5/modules/spotlight/models/spotlight-users-list.interface.js +0 -1
- package/esm5/modules/spotlight/models/spotlight.interface.js +0 -1
- package/esm5/modules/spotlight/models/user-action.enum.js +0 -7
- package/esm5/modules/spotlight/pipes/translate.pipe.js +0 -23
- package/esm5/modules/spotlight/service/spotlight.service.js +0 -39
- package/esm5/modules/spotlight/spotlight.module.js +0 -40
- package/esm5/modules/translations/translations.module.js +0 -226
- package/esm5/public-api.js +0 -9
- package/esm5/seniorsistemas-platform-components.js +0 -16
- package/fesm2015/seniorsistemas-platform-components.js +0 -2283
- package/fesm2015/seniorsistemas-platform-components.js.map +0 -1
- package/fesm5/seniorsistemas-platform-components.js +0 -2506
- package/fesm5/seniorsistemas-platform-components.js.map +0 -1
- package/seniorsistemas-platform-components.d.ts +0 -15
- package/seniorsistemas-platform-components.metadata.json +0 -1
|
@@ -1,626 +0,0 @@
|
|
|
1
|
-
import { __assign, __decorate, __read, __spread } from "tslib";
|
|
2
|
-
import { MessageService } from "primeng/api";
|
|
3
|
-
import { ChangeDetectorRef, Component, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output } from '@angular/core';
|
|
4
|
-
import { BehaviorSubject, from, Subject } from 'rxjs';
|
|
5
|
-
import { filter as rxFilter, map, mergeMap, takeUntil, tap } from 'rxjs/operators';
|
|
6
|
-
import { FilterType, Scope } from '../../models';
|
|
7
|
-
import { ContextTab, TabView } from '../../models/tab-view';
|
|
8
|
-
import { AdvancedFilterService } from '../../services/advanced-filter.service';
|
|
9
|
-
import { FormFilter } from '../../models/form-filter';
|
|
10
|
-
import { filterOperators, fromJson, getFilterId, getSearchType, getTabId, jsonPath, parseFilterValue, toFilterFormat, toUserFormat } from '../../utils/index';
|
|
11
|
-
import { createFormControl } from '../../utils/form-field';
|
|
12
|
-
import { clone, equals } from 'ramda';
|
|
13
|
-
import { compare, isSupportedType, isValidOperator } from '../../utils/comparator';
|
|
14
|
-
import { AutocompleteField, CalendarField, RadioButtonField, CurrencyField, FieldType, NumberField, SelectField, TextField } from '@seniorsistemas/angular-components';
|
|
15
|
-
import { searchDisplayName, searchKeyName } from '../../shared/constants';
|
|
16
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
17
|
-
import { CalendarOptionsService } from '../../services/calendar-options.service';
|
|
18
|
-
var TRANSLATE_PREFIX = 'platform.filter_service';
|
|
19
|
-
var TOAST_LIFE = 5000;
|
|
20
|
-
var FormFilterComponent = /** @class */ (function () {
|
|
21
|
-
function FormFilterComponent(filterService, translate, messageService, calendarOptionsService, changeDetectorRef) {
|
|
22
|
-
this.filterService = filterService;
|
|
23
|
-
this.translate = translate;
|
|
24
|
-
this.messageService = messageService;
|
|
25
|
-
this.calendarOptionsService = calendarOptionsService;
|
|
26
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
27
|
-
this.destroy$ = new Subject();
|
|
28
|
-
this.contexts = [];
|
|
29
|
-
this.formFilters = [];
|
|
30
|
-
this.oldFormFilters = [];
|
|
31
|
-
this.actualFormFilters = [];
|
|
32
|
-
this.general = new TabView({ name: 'Geral' });
|
|
33
|
-
this.totalFiltersActive = 0;
|
|
34
|
-
this.isMobile = false;
|
|
35
|
-
this.tabViewOrientation = 'left';
|
|
36
|
-
this.error = false;
|
|
37
|
-
this.errorMessages = {
|
|
38
|
-
min: this.translate.instant(TRANSLATE_PREFIX + ".error_min_value"),
|
|
39
|
-
max: this.translate.instant(TRANSLATE_PREFIX + ".error_max_value"),
|
|
40
|
-
pattern: this.translate.instant(TRANSLATE_PREFIX + ".invalid_pattern")
|
|
41
|
-
};
|
|
42
|
-
this.showMessages = true;
|
|
43
|
-
this.isModal = false;
|
|
44
|
-
this.contextId = '';
|
|
45
|
-
this.totalFiltersActiveOutput = new EventEmitter();
|
|
46
|
-
this.errorOutput = new EventEmitter();
|
|
47
|
-
this.showDialogOutput = new EventEmitter();
|
|
48
|
-
this.closeModalOutput = new EventEmitter();
|
|
49
|
-
}
|
|
50
|
-
FormFilterComponent.prototype.onResizeWindow = function (event) {
|
|
51
|
-
var innerWidth = event.target.innerWidth;
|
|
52
|
-
this.isMobile = innerWidth <= 640;
|
|
53
|
-
this.tabViewOrientation = this.isMobile ? 'top' : 'left';
|
|
54
|
-
};
|
|
55
|
-
FormFilterComponent.prototype.ngOnInit = function () {
|
|
56
|
-
var _this = this;
|
|
57
|
-
this.isMobile = innerWidth <= 640;
|
|
58
|
-
this.tabViewOrientation = this.isMobile ? 'top' : 'left';
|
|
59
|
-
this.subscribeContextsObservable();
|
|
60
|
-
this.subscribeFiltersObservable();
|
|
61
|
-
window.addEventListener('message', function (event) {
|
|
62
|
-
var _a;
|
|
63
|
-
var data = event.data;
|
|
64
|
-
var message = data.message && data.message.split(':')[1];
|
|
65
|
-
if (message === 'addContext') {
|
|
66
|
-
(_a = _this.filterService).addContexts.apply(_a, __spread(data.payload));
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
FormFilterComponent.prototype.ngOnDestroy = function () {
|
|
71
|
-
this.destroy$.next(true);
|
|
72
|
-
};
|
|
73
|
-
FormFilterComponent.prototype.hasChanges = function () {
|
|
74
|
-
var _this = this;
|
|
75
|
-
var keys = Object.keys(this.formFilters);
|
|
76
|
-
var oldKeys = Object.keys(this.oldFormFilters);
|
|
77
|
-
if (!oldKeys.length) {
|
|
78
|
-
return true;
|
|
79
|
-
}
|
|
80
|
-
var filtered = keys.filter(function (key) {
|
|
81
|
-
var currentValue = _this.formFilters[key].value;
|
|
82
|
-
var oldValue = _this.oldFormFilters[key] && _this.oldFormFilters[key].value;
|
|
83
|
-
return !equals(currentValue, oldValue);
|
|
84
|
-
});
|
|
85
|
-
return filtered.length > 0;
|
|
86
|
-
};
|
|
87
|
-
FormFilterComponent.prototype.onApplyFilters = function () {
|
|
88
|
-
this.hasChanges() && this.closeModalOutput.emit();
|
|
89
|
-
};
|
|
90
|
-
FormFilterComponent.prototype.getFilters = function () {
|
|
91
|
-
this.hasChanges() && this.filterService.tryAgain(this.contexts);
|
|
92
|
-
};
|
|
93
|
-
FormFilterComponent.prototype.applyFilters = function (showToast) {
|
|
94
|
-
if (showToast === void 0) { showToast = false; }
|
|
95
|
-
if (this.hasChanges()) {
|
|
96
|
-
this.showDialogOutput.emit(false);
|
|
97
|
-
this.counterUpdate();
|
|
98
|
-
var filters = this.getFiltersValues(this.formFilters);
|
|
99
|
-
this.filterService.saveTickedFilters(filters);
|
|
100
|
-
}
|
|
101
|
-
else if (showToast) {
|
|
102
|
-
var message = {
|
|
103
|
-
key: 'filterServiceToastKey',
|
|
104
|
-
severity: 'info',
|
|
105
|
-
life: TOAST_LIFE,
|
|
106
|
-
detail: this.translate.instant(TRANSLATE_PREFIX + ".applied_filter_nochange", { activeFilters: this.totalFiltersActive })
|
|
107
|
-
};
|
|
108
|
-
this.sendMessage(message);
|
|
109
|
-
}
|
|
110
|
-
this.oldFormFilters = clone(this.formFilters);
|
|
111
|
-
};
|
|
112
|
-
FormFilterComponent.prototype.getDefaultValue = function (defaultValue, isMultiple) {
|
|
113
|
-
if (defaultValue === undefined || (isMultiple && defaultValue[0] === '')) {
|
|
114
|
-
return [];
|
|
115
|
-
}
|
|
116
|
-
return defaultValue;
|
|
117
|
-
};
|
|
118
|
-
FormFilterComponent.prototype.clearFilters = function () {
|
|
119
|
-
var _this = this;
|
|
120
|
-
var keys = Object.keys(this.formFilters);
|
|
121
|
-
keys.forEach(function (key) { return _this.cleanFieldAndSetDefaultValue(key); });
|
|
122
|
-
};
|
|
123
|
-
FormFilterComponent.prototype.sendCloseMessage = function () {
|
|
124
|
-
window.parent.postMessage({
|
|
125
|
-
message: 'dashboard:close-modal',
|
|
126
|
-
payload: {
|
|
127
|
-
modalName: 'advanced-filter-1'
|
|
128
|
-
}
|
|
129
|
-
}, '*');
|
|
130
|
-
};
|
|
131
|
-
FormFilterComponent.prototype.sendMessage = function (message) {
|
|
132
|
-
if (this.showMessages) {
|
|
133
|
-
this.messageService.add(message);
|
|
134
|
-
}
|
|
135
|
-
else {
|
|
136
|
-
window.parent.postMessage({
|
|
137
|
-
message: 'dashboard:toastr',
|
|
138
|
-
payload: {
|
|
139
|
-
type: 'success',
|
|
140
|
-
message: message.detail
|
|
141
|
-
}
|
|
142
|
-
}, '*');
|
|
143
|
-
}
|
|
144
|
-
};
|
|
145
|
-
FormFilterComponent.prototype.saveFilters = function (forceSave) {
|
|
146
|
-
var _this = this;
|
|
147
|
-
if (forceSave === void 0) { forceSave = false; }
|
|
148
|
-
var filters = this.parseToUserFilters(this.formFilters);
|
|
149
|
-
var savedFilterSuccess = function () {
|
|
150
|
-
if (!forceSave) {
|
|
151
|
-
var message = {
|
|
152
|
-
key: 'filterServiceToastKey',
|
|
153
|
-
severity: 'info',
|
|
154
|
-
life: TOAST_LIFE,
|
|
155
|
-
detail: _this.translate.instant(TRANSLATE_PREFIX + ".saved_filters_success", { activeFilters: _this.totalFiltersActive })
|
|
156
|
-
};
|
|
157
|
-
_this.sendMessage(message);
|
|
158
|
-
}
|
|
159
|
-
_this.counterUpdate();
|
|
160
|
-
};
|
|
161
|
-
var savedFiltersError = function () {
|
|
162
|
-
var message = {
|
|
163
|
-
key: 'filterServiceToastKey',
|
|
164
|
-
severity: 'error',
|
|
165
|
-
life: TOAST_LIFE,
|
|
166
|
-
detail: _this.translate.instant(TRANSLATE_PREFIX + ".saved_filters_error", { activeFilters: _this.totalFiltersActive })
|
|
167
|
-
};
|
|
168
|
-
_this.sendMessage(message);
|
|
169
|
-
};
|
|
170
|
-
this.filterService
|
|
171
|
-
.saveFilters(filters)
|
|
172
|
-
.subscribe(savedFilterSuccess, savedFiltersError);
|
|
173
|
-
};
|
|
174
|
-
FormFilterComponent.prototype.saveFiltersWithCallbackFunction = function (callbackFunction) {
|
|
175
|
-
var filters = this.parseToUserFilters(this.formFilters);
|
|
176
|
-
this.filterService
|
|
177
|
-
.saveFilters(filters)
|
|
178
|
-
.subscribe(callbackFunction);
|
|
179
|
-
};
|
|
180
|
-
FormFilterComponent.prototype.counterUpdate = function () {
|
|
181
|
-
this.totalFiltersActive = this.countActiveFilters(this.tabs);
|
|
182
|
-
this.totalFiltersActiveOutput.emit(this.totalFiltersActive);
|
|
183
|
-
};
|
|
184
|
-
FormFilterComponent.prototype.countActiveFilters = function (tabs) {
|
|
185
|
-
var totalFiltersActive = 0;
|
|
186
|
-
tabs.forEach(function (tabView) {
|
|
187
|
-
var value = tabView.form.value;
|
|
188
|
-
tabView.activeFilters = Object.keys(value).reduce(function (appliedFilters, key) {
|
|
189
|
-
var filterValue = value[key];
|
|
190
|
-
var isArray = Array.isArray(filterValue);
|
|
191
|
-
var isValidArray = isArray && filterValue.length > 0;
|
|
192
|
-
if (isValidArray || (!isArray && filterValue)) {
|
|
193
|
-
appliedFilters++;
|
|
194
|
-
}
|
|
195
|
-
return appliedFilters;
|
|
196
|
-
}, 0);
|
|
197
|
-
totalFiltersActive += tabView.activeFilters;
|
|
198
|
-
});
|
|
199
|
-
return totalFiltersActive;
|
|
200
|
-
};
|
|
201
|
-
FormFilterComponent.prototype.parseToUserFilters = function (filters) {
|
|
202
|
-
var ids = Object.keys(filters);
|
|
203
|
-
return ids.reduce(function (all, filterId) {
|
|
204
|
-
var _a = filters[filterId], type = _a.type, services = _a.services, name = _a.name, value = _a.value, domain = _a.domain, contexts = _a.contexts;
|
|
205
|
-
var filterValue = toUserFormat(value, type);
|
|
206
|
-
var values = services.map(function (service) { return ({ name: name, service: service, value: filterValue, domain: domain, contexts: contexts }); });
|
|
207
|
-
return __spread(all, values);
|
|
208
|
-
}, []);
|
|
209
|
-
};
|
|
210
|
-
FormFilterComponent.prototype.getFiltersValues = function (filters) {
|
|
211
|
-
var ids = Object.keys(filters);
|
|
212
|
-
return ids.reduce(function (all, filterId) {
|
|
213
|
-
var _a = filters[filterId], type = _a.type, services = _a.services, name = _a.name, value = _a.value, domain = _a.domain;
|
|
214
|
-
var filterValue = toFilterFormat(value, type);
|
|
215
|
-
var values = services.map(function (service) { return ({ name: name, service: service, value: filterValue, domain: domain }); });
|
|
216
|
-
return __spread(all, values);
|
|
217
|
-
}, []);
|
|
218
|
-
};
|
|
219
|
-
FormFilterComponent.prototype.subscribeContextsObservable = function () {
|
|
220
|
-
var _this = this;
|
|
221
|
-
var contextsObserver = this.filterService.contextsObserver;
|
|
222
|
-
contextsObserver.pipe(takeUntil(this.destroy$)).subscribe(function (contexts) { return (_this.contexts = contexts); });
|
|
223
|
-
};
|
|
224
|
-
FormFilterComponent.prototype.errorStateAction = function () {
|
|
225
|
-
this.filterService.tryAgain(this.contexts);
|
|
226
|
-
};
|
|
227
|
-
FormFilterComponent.prototype.subscribeFiltersObservable = function () {
|
|
228
|
-
var _this = this;
|
|
229
|
-
var filtersObserver = this.filterService.filtersObserver;
|
|
230
|
-
filtersObserver
|
|
231
|
-
.pipe(takeUntil(this.destroy$))
|
|
232
|
-
.subscribe(function (_a) {
|
|
233
|
-
var filters = _a.filters, applyFilter = _a.applyFilter, error = _a.error, message = _a.message;
|
|
234
|
-
_this.errorOutput.emit(error);
|
|
235
|
-
_this.error = error;
|
|
236
|
-
_this.errorState = message;
|
|
237
|
-
if (!error) {
|
|
238
|
-
_this.createForm(filters, applyFilter);
|
|
239
|
-
}
|
|
240
|
-
});
|
|
241
|
-
};
|
|
242
|
-
FormFilterComponent.prototype.createForm = function (filters, applyFilter) {
|
|
243
|
-
this.tabs = this.createTabs(filters);
|
|
244
|
-
this.counterUpdate();
|
|
245
|
-
this.setDependencies(this.formFilters);
|
|
246
|
-
this.createChildArray();
|
|
247
|
-
if (filters.length > 0 && applyFilter) {
|
|
248
|
-
this.applyFilters();
|
|
249
|
-
}
|
|
250
|
-
};
|
|
251
|
-
FormFilterComponent.prototype.setDependencies = function (filters) {
|
|
252
|
-
var _this = this;
|
|
253
|
-
var names = Object.keys(filters);
|
|
254
|
-
var dependencies = from(names).pipe(map(function (key) { return filters[key]; }), rxFilter(function (_a) {
|
|
255
|
-
var dependsOn = _a.dependsOn;
|
|
256
|
-
return dependsOn && dependsOn.length > 0;
|
|
257
|
-
}), tap(function (_a) {
|
|
258
|
-
var dependsOn = _a.dependsOn, domain = _a.domain, filterControl = _a.filterControl;
|
|
259
|
-
var invalidFilters = dependsOn
|
|
260
|
-
.filter(function (dep) { return dep.required; })
|
|
261
|
-
.filter(function (dep) {
|
|
262
|
-
var id = getFilterId(domain, dep.filterName);
|
|
263
|
-
var formFilter = filters[id];
|
|
264
|
-
var value = formFilter.value, type = formFilter.type;
|
|
265
|
-
var comparator = dep.comparator;
|
|
266
|
-
if (comparator && isValidOperator(comparator.operator) && isSupportedType(type)) {
|
|
267
|
-
var fieldValue = parseFilterValue(value, type);
|
|
268
|
-
return !compare(comparator.operator, comparator.value, fieldValue);
|
|
269
|
-
}
|
|
270
|
-
return dep.required ? !formFilter.value : formFilter.value;
|
|
271
|
-
});
|
|
272
|
-
if (invalidFilters.length > 0) {
|
|
273
|
-
filterControl.disable();
|
|
274
|
-
}
|
|
275
|
-
}), map(function (_a) {
|
|
276
|
-
var domain = _a.domain, dependsOn = _a.dependsOn, filterControl = _a.filterControl;
|
|
277
|
-
return ({ domain: domain, dependsOn: dependsOn, filterControl: filterControl });
|
|
278
|
-
}));
|
|
279
|
-
dependencies.subscribe(function (_a) {
|
|
280
|
-
var dependsOn = _a.dependsOn, domain = _a.domain, filterControl = _a.filterControl;
|
|
281
|
-
return from(dependsOn)
|
|
282
|
-
.pipe(rxFilter(function (dep) { return dep.required; }), map(function (_a) {
|
|
283
|
-
var filterName = _a.filterName;
|
|
284
|
-
return getFilterId(domain, filterName);
|
|
285
|
-
}), map(function (filterId) { return filters[filterId]; }), mergeMap(function (formFilter) { return from(formFilter.valueChanges); }), map(function (val) {
|
|
286
|
-
var comparation = dependsOn.every(function (dep) {
|
|
287
|
-
var filterId = getFilterId(domain, dep.filterName);
|
|
288
|
-
if (_this.formFilters[filterId]) {
|
|
289
|
-
var type = _this.formFilters[filterId].type;
|
|
290
|
-
var comparator = dep.comparator;
|
|
291
|
-
if (comparator && isValidOperator(comparator.operator) && isSupportedType(type)) {
|
|
292
|
-
var value = parseFilterValue(val, type);
|
|
293
|
-
return compare(comparator.operator, comparator.value, value);
|
|
294
|
-
}
|
|
295
|
-
return true;
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
return !_this.IsEmpty(val) && comparation ? 'enable' : 'disable';
|
|
299
|
-
}))
|
|
300
|
-
.subscribe(function (status) { return filterControl[status](); });
|
|
301
|
-
});
|
|
302
|
-
};
|
|
303
|
-
FormFilterComponent.prototype.addGeneralField = function (filter) {
|
|
304
|
-
var _this = this;
|
|
305
|
-
var name = filter.name, domain = filter.domain, type = filter.type;
|
|
306
|
-
var controlName = getFilterId(domain, name);
|
|
307
|
-
var fieldControl = createFormControl(filter);
|
|
308
|
-
fieldControl.valueChanges
|
|
309
|
-
.pipe(takeUntil(this.destroy$), map(function (v) { return parseFilterValue(v, type); }), tap(function (value) { return (_this.formFilters[controlName].value = value); }))
|
|
310
|
-
.subscribe(function (val) {
|
|
311
|
-
return _this.tabs.forEach(function (tab) {
|
|
312
|
-
var control = tab.form.controls[name];
|
|
313
|
-
if (control && tab.domain === domain) {
|
|
314
|
-
control.setValue(val, { emitEvent: false });
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
});
|
|
318
|
-
var newFilter = __assign(__assign({}, filter), { name: controlName });
|
|
319
|
-
var newField = this.createField(newFilter);
|
|
320
|
-
this.general.form.addControl(controlName, fieldControl);
|
|
321
|
-
this.general.fields.push(newField);
|
|
322
|
-
};
|
|
323
|
-
/*
|
|
324
|
-
* Verifica os contextos de cada filtro, caso todos os contextos foram informados:
|
|
325
|
-
* @return true
|
|
326
|
-
* Caso não tenha nenhum contexto, considera-se por padrão que é todos:
|
|
327
|
-
* @return true
|
|
328
|
-
*/
|
|
329
|
-
FormFilterComponent.prototype.containsAllContexts = function (myContexts) {
|
|
330
|
-
if (!myContexts.length) {
|
|
331
|
-
return true;
|
|
332
|
-
}
|
|
333
|
-
var allContexts = this.contexts.map(function (data) { return data.contextId; });
|
|
334
|
-
return equals(myContexts.sort(), allContexts.sort());
|
|
335
|
-
};
|
|
336
|
-
/**
|
|
337
|
-
*
|
|
338
|
-
* @todo Refatorar. O método possui muitas responsabilidades
|
|
339
|
-
*
|
|
340
|
-
*/
|
|
341
|
-
FormFilterComponent.prototype.createTabs = function (filters) {
|
|
342
|
-
var _this = this;
|
|
343
|
-
return filters.reduce(function (tabs, filter) {
|
|
344
|
-
var domain = filter.domain, services = filter.services, name = filter.name, type = filter.type, scope = filter.scope, contexts = filter.contexts, dependsOn = filter.dependsOn, value = filter.value, search = filter.search, defaultValue = filter.defaultValue;
|
|
345
|
-
var isNotMultiple = search && getSearchType(search).output.maxSelectedItems === 1;
|
|
346
|
-
var field = _this.createField(filter);
|
|
347
|
-
var filterId = getFilterId(domain, name);
|
|
348
|
-
var filterConfig = {
|
|
349
|
-
domain: domain,
|
|
350
|
-
contexts: contexts,
|
|
351
|
-
services: services,
|
|
352
|
-
name: name,
|
|
353
|
-
dependsOn: dependsOn,
|
|
354
|
-
value: fromJson(value, type, isNotMultiple),
|
|
355
|
-
type: type,
|
|
356
|
-
isMultiple: !isNotMultiple,
|
|
357
|
-
defaultValue: fromJson(defaultValue, type, isNotMultiple)
|
|
358
|
-
};
|
|
359
|
-
_this.formFilters[filterId] = new FormFilter(filterConfig);
|
|
360
|
-
var formFilter = _this.formFilters[filterId];
|
|
361
|
-
if (scope === Scope.DOMAIN && _this.containsAllContexts(contexts)) {
|
|
362
|
-
_this.addGeneralField(filter);
|
|
363
|
-
}
|
|
364
|
-
contexts.forEach(function (contextId) {
|
|
365
|
-
if ((contextId === _this.contextId) || (_this.contextId === '')) {
|
|
366
|
-
var tabId_1 = getTabId(domain, contextId);
|
|
367
|
-
var fieldControl = createFormControl(filter);
|
|
368
|
-
if (!tabs.has(tabId_1)) {
|
|
369
|
-
var contextLabel = _this.contexts.find(function (context) { return context.contextId === contextId; }).contextLabel;
|
|
370
|
-
var tab = new ContextTab({ domain: domain, name: contextLabel });
|
|
371
|
-
tabs.set(tabId_1, tab);
|
|
372
|
-
}
|
|
373
|
-
fieldControl.valueChanges
|
|
374
|
-
.pipe(takeUntil(_this.destroy$))
|
|
375
|
-
.subscribe(function (val) { return _this.updateFilterValue(tabId_1, name, val, domain, type); });
|
|
376
|
-
var contextTab = tabs.get(tabId_1);
|
|
377
|
-
contextTab.fields.push(field);
|
|
378
|
-
contextTab.form.addControl(filter.name, fieldControl);
|
|
379
|
-
if (!formFilter.filterControl) {
|
|
380
|
-
formFilter.filterControl = fieldControl;
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
return tabs;
|
|
385
|
-
}, new Map());
|
|
386
|
-
};
|
|
387
|
-
FormFilterComponent.prototype.updateFilterValue = function (tabId, filterName, value, domain, type) {
|
|
388
|
-
var _this = this;
|
|
389
|
-
var controlOpts = { emitEvent: false };
|
|
390
|
-
var fieldValue = parseFilterValue(value, type);
|
|
391
|
-
var filterId = getFilterId(domain, filterName);
|
|
392
|
-
var generalFieldControl = this.general.form.controls[filterId];
|
|
393
|
-
this.tabs.forEach(function (_a, key) {
|
|
394
|
-
var form = _a.form;
|
|
395
|
-
var control = form.controls[filterName];
|
|
396
|
-
if (tabId !== key && control) {
|
|
397
|
-
control.setValue(value, controlOpts);
|
|
398
|
-
}
|
|
399
|
-
});
|
|
400
|
-
var childs = this.formFilters[filterId].childs;
|
|
401
|
-
childs && childs.forEach(function (child) { return _this.cleanFieldAndSetDefaultValue(child.filter.key); });
|
|
402
|
-
generalFieldControl && generalFieldControl.setValue(value, controlOpts);
|
|
403
|
-
this.formFilters[filterId].value = fieldValue;
|
|
404
|
-
};
|
|
405
|
-
FormFilterComponent.prototype.cleanFieldAndSetDefaultValue = function (key) {
|
|
406
|
-
var _a = this.formFilters[key], isMultiple = _a.isMultiple, defaultValue = _a.defaultValue, filterControl = _a.filterControl, type = _a.type;
|
|
407
|
-
var finalValue = this.getDefaultValue(defaultValue, isMultiple);
|
|
408
|
-
if (filterControl) {
|
|
409
|
-
if (type === 'DATE' || (type === 'SEARCH' && isMultiple)) {
|
|
410
|
-
filterControl.setValue(finalValue);
|
|
411
|
-
}
|
|
412
|
-
if (type === 'INTEGER' || type === 'DOUBLE' || type === 'MONEY') {
|
|
413
|
-
finalValue === '' ? filterControl.setValue(null) : filterControl.setValue(finalValue);
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
filterControl.setValue(finalValue, { onlySelf: true });
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
};
|
|
420
|
-
FormFilterComponent.prototype.createChildArray = function () {
|
|
421
|
-
var _this = this;
|
|
422
|
-
var keys = Object.keys(this.formFilters);
|
|
423
|
-
keys.forEach(function (key) {
|
|
424
|
-
var _a = _this.formFilters[key], dependsOn = _a.dependsOn, domain = _a.domain;
|
|
425
|
-
dependsOn.forEach(function (field) {
|
|
426
|
-
var filterId = getFilterId(domain, field.filterName);
|
|
427
|
-
if (_this.formFilters[filterId]) {
|
|
428
|
-
if (!_this.formFilters[filterId].childs) {
|
|
429
|
-
_this.formFilters[filterId].childs = [];
|
|
430
|
-
}
|
|
431
|
-
_this.formFilters[filterId].childs.push({ filter: { key: key, required: field.required } });
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
});
|
|
435
|
-
};
|
|
436
|
-
FormFilterComponent.prototype.createField = function (filter) {
|
|
437
|
-
var _a;
|
|
438
|
-
var _this = this;
|
|
439
|
-
var name = filter.name, label = filter.label, enumItems = filter.enumItems, type = filter.type, mask = filter.mask;
|
|
440
|
-
var translatedEnumItems = enumItems && enumItems.map(function (item) { return ({ label: _this.translate.instant(item.label), value: item.value }); });
|
|
441
|
-
var field = { name: name, label: this.translate.instant(label), placeholder: '' };
|
|
442
|
-
var creators = (_a = {},
|
|
443
|
-
_a[FilterType.STRING] = function () { return new TextField(__assign(__assign({}, field), { mask: mask ? function () { return mask; } : null, type: FieldType.String })); },
|
|
444
|
-
_a[FilterType.MONEY] = function () { return new CurrencyField(__assign(__assign({}, field), { type: FieldType.Money })); },
|
|
445
|
-
_a[FilterType.BOOLEAN] = function () { return _this.createRadioButton(__assign({}, field)); },
|
|
446
|
-
_a[FilterType.DATE] = function () { return _this.createCalendar(__assign(__assign({}, field), { type: FieldType.Date })); },
|
|
447
|
-
_a[FilterType.DATETIME] = function () { return _this.createCalendar(__assign(__assign({}, field), { type: FieldType.DateTime })); },
|
|
448
|
-
_a[FilterType.TIME] = function () { return _this.createCalendar(__assign(__assign({}, field), { type: FieldType.Time })); },
|
|
449
|
-
_a[FilterType.ENUMERATION] = function () {
|
|
450
|
-
return new SelectField(__assign(__assign({}, field), { placeholder: _this.translate.instant('platform.filter_service.select'), options: __spread(translatedEnumItems), type: FieldType.Enum }));
|
|
451
|
-
},
|
|
452
|
-
_a[FilterType.INTEGER] = function () {
|
|
453
|
-
return new NumberField(__assign(__assign({}, field), { numberLocaleOptions: _this.optionsInteger(), mask: mask ? function () { return mask; } : null, type: FieldType.Integer }));
|
|
454
|
-
},
|
|
455
|
-
_a[FilterType.DOUBLE] = function () { return new CurrencyField(__assign(__assign({}, field), { type: FieldType.Double })); },
|
|
456
|
-
_a[FilterType.SEARCH] = function () { return _this.createAutocompleteField(field, filter); },
|
|
457
|
-
_a);
|
|
458
|
-
return creators[type]();
|
|
459
|
-
};
|
|
460
|
-
FormFilterComponent.prototype.createRadioButton = function (field) {
|
|
461
|
-
var options = [
|
|
462
|
-
{ label: this.translate.instant(TRANSLATE_PREFIX + ".yes"), value: true },
|
|
463
|
-
{ label: this.translate.instant(TRANSLATE_PREFIX + ".no"), value: false }
|
|
464
|
-
];
|
|
465
|
-
return new RadioButtonField(__assign(__assign({}, field), { type: FieldType.Radio, options: options }));
|
|
466
|
-
};
|
|
467
|
-
FormFilterComponent.prototype.createCalendar = function (config) {
|
|
468
|
-
var calendar = new CalendarField(config);
|
|
469
|
-
calendar.calendarLocaleOptions = this.calendarOptionsService.getOptions();
|
|
470
|
-
if (!this.isModal)
|
|
471
|
-
calendar.appendTo = 'body';
|
|
472
|
-
return calendar;
|
|
473
|
-
};
|
|
474
|
-
FormFilterComponent.prototype.createAutocompleteField = function (field, _a) {
|
|
475
|
-
var _this = this;
|
|
476
|
-
var dependsOn = _a.dependsOn, search = _a.search, domain = _a.domain, name = _a.name;
|
|
477
|
-
var suggestionsObservable = new BehaviorSubject([]);
|
|
478
|
-
var queryParam = getSearchType(search).input.queryParam;
|
|
479
|
-
var _b = getSearchType(search).output, displayFields = _b.displayFields, keyFields = _b.keyFields, resultDataJsonPath = _b.resultDataJsonPath, displayFieldConcatToken = _b.displayFieldConcatToken, maxSelectedItems = _b.maxSelectedItems;
|
|
480
|
-
var filterId = getFilterId(domain, name);
|
|
481
|
-
var suggestionsError = function (messageError) {
|
|
482
|
-
var messageDetail = messageError ? messageError : _this.translate.instant(TRANSLATE_PREFIX + ".find_suggestions_error", { activeFilters: _this.totalFiltersActive });
|
|
483
|
-
var message = {
|
|
484
|
-
key: 'filterServiceToastKey',
|
|
485
|
-
severity: 'error',
|
|
486
|
-
life: TOAST_LIFE,
|
|
487
|
-
detail: messageDetail
|
|
488
|
-
};
|
|
489
|
-
_this.sendMessage(message);
|
|
490
|
-
};
|
|
491
|
-
var onSearch = function (val) {
|
|
492
|
-
var _a;
|
|
493
|
-
var params = (_a = {}, _a[queryParam] = val, _a);
|
|
494
|
-
dependsOn && Object.assign(params, _this.getDependenciesValues(dependsOn, domain));
|
|
495
|
-
var searchUrl = search && search.type === 'ENTITY'
|
|
496
|
-
? _this.getEntitySearchUrl(search.entitySearch.input, val, dependsOn)
|
|
497
|
-
: getSearchType(search).input.url;
|
|
498
|
-
_this.filterService
|
|
499
|
-
.searchFieldSuggestions(searchUrl, params, search.type)
|
|
500
|
-
.pipe(map(function (response) { return jsonPath(response, resultDataJsonPath); }), map(function (suggestions) { return _this.addSuggestionFields(suggestions, displayFields, keyFields, displayFieldConcatToken, filterId); }))
|
|
501
|
-
.subscribe(function (result) {
|
|
502
|
-
suggestionsObservable.next(result);
|
|
503
|
-
_this.changeDetectorRef.detectChanges();
|
|
504
|
-
}, function (error) {
|
|
505
|
-
var messageError = undefined;
|
|
506
|
-
if (error && error.error.message)
|
|
507
|
-
messageError = error.error.message;
|
|
508
|
-
suggestionsError(messageError);
|
|
509
|
-
});
|
|
510
|
-
};
|
|
511
|
-
return new AutocompleteField(__assign(__assign({}, field), { onSearch: onSearch, appendTo: 'body', suggestionsObservable: suggestionsObservable, displayField: searchDisplayName, dataKey: searchKeyName, multiple: maxSelectedItems > 1, size: { lg: 12, md: 12, xl: 12 }, emptyMessage: this.translate.instant(TRANSLATE_PREFIX + ".search_empty_message") }));
|
|
512
|
-
};
|
|
513
|
-
FormFilterComponent.prototype.getEntitySearchUrl = function (search, value, dependsOn) {
|
|
514
|
-
var _this = this;
|
|
515
|
-
var attributes = search.attributes, domainName = search.domainName, entityName = search.entityName, serviceName = search.serviceName;
|
|
516
|
-
var url = domainName + "/" + serviceName + "/entities/" + entityName + "/?filter=";
|
|
517
|
-
var filters = attributes.map(function (attr) { return filterOperators[attr.comparator](attr.name, value); });
|
|
518
|
-
dependsOn &&
|
|
519
|
-
dependsOn.forEach(function (obj) {
|
|
520
|
-
var filterId = getFilterId(domainName, obj.filterName);
|
|
521
|
-
var fieldValue = _this.formFilters[filterId].value[searchKeyName];
|
|
522
|
-
filters.push(obj.entityAttribute + " eq '" + fieldValue + "'");
|
|
523
|
-
});
|
|
524
|
-
// O regex apenas seleciona as virgulas ignorando as que estiverem dentro do ()
|
|
525
|
-
return url.concat(filters).replace(/[,]+(?![^(]*[)])/g, " " + search.operator + " ");
|
|
526
|
-
};
|
|
527
|
-
FormFilterComponent.prototype.addSuggestionFields = function (suggestions, displayFields, keyFields, separator, filterId) {
|
|
528
|
-
var _this = this;
|
|
529
|
-
var addValue = function (acc, value, token) { return (acc ? "" + acc + token + value : value); };
|
|
530
|
-
var result = suggestions.map(function (suggestion) {
|
|
531
|
-
var _a;
|
|
532
|
-
return (__assign(__assign({}, suggestion), (_a = {}, _a[searchDisplayName] = displayFields.reduce(function (value, display) {
|
|
533
|
-
return addValue(value, _this.translate.instant(suggestion[display]), separator);
|
|
534
|
-
}, ''), _a[searchKeyName] = keyFields.reduce(function (value, key) { return addValue(value, suggestion[key], ', '); }, ''), _a)));
|
|
535
|
-
});
|
|
536
|
-
this.formFilters[filterId].invalidValue = result.length === 0;
|
|
537
|
-
return result.filter(function (item) {
|
|
538
|
-
var value = _this.formFilters[filterId].value;
|
|
539
|
-
if (Array.isArray(value)) {
|
|
540
|
-
var index = value.findIndex(function (i) { return i.$$__keyValue__ === item.$$__keyValue__; });
|
|
541
|
-
if (index === -1) {
|
|
542
|
-
return item;
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
else {
|
|
546
|
-
return item;
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
};
|
|
550
|
-
FormFilterComponent.prototype.getDependenciesValues = function (dependencies, domain) {
|
|
551
|
-
var _this = this;
|
|
552
|
-
return dependencies.reduce(function (params, _a) {
|
|
553
|
-
var filterName = _a.filterName;
|
|
554
|
-
var filterId = getFilterId(domain, filterName);
|
|
555
|
-
if (_this.formFilters[filterId]) {
|
|
556
|
-
var _b = _this.formFilters[filterId], value = _b.value, type = _b.type;
|
|
557
|
-
if (type === 'ENUMERATION') {
|
|
558
|
-
params[filterName] = value;
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
if (Array.isArray(value)) {
|
|
562
|
-
params[filterName] = value.map(function (arr) { return arr[searchKeyName]; });
|
|
563
|
-
}
|
|
564
|
-
else {
|
|
565
|
-
params[filterName] = value ? value[searchKeyName] : [''];
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
_this.IsEmpty(params[filterName]) && delete params[filterName];
|
|
569
|
-
return params;
|
|
570
|
-
}
|
|
571
|
-
}, {});
|
|
572
|
-
};
|
|
573
|
-
/*
|
|
574
|
-
* Verifica se o valor informado é falso, em arrays, é verificado cada item
|
|
575
|
-
*/
|
|
576
|
-
FormFilterComponent.prototype.IsEmpty = function (value) {
|
|
577
|
-
return Array.isArray(value) ? value.every(function (data) { return !data; }) : !value;
|
|
578
|
-
};
|
|
579
|
-
/**
|
|
580
|
-
* Return format to specify for integer type field
|
|
581
|
-
*/
|
|
582
|
-
FormFilterComponent.prototype.optionsInteger = function () {
|
|
583
|
-
return { currencySymbol: '', decimalSeparator: '', thousandsSeparator: '' };
|
|
584
|
-
};
|
|
585
|
-
FormFilterComponent.ctorParameters = function () { return [
|
|
586
|
-
{ type: AdvancedFilterService },
|
|
587
|
-
{ type: TranslateService },
|
|
588
|
-
{ type: MessageService },
|
|
589
|
-
{ type: CalendarOptionsService },
|
|
590
|
-
{ type: ChangeDetectorRef }
|
|
591
|
-
]; };
|
|
592
|
-
__decorate([
|
|
593
|
-
Input()
|
|
594
|
-
], FormFilterComponent.prototype, "showMessages", void 0);
|
|
595
|
-
__decorate([
|
|
596
|
-
Input()
|
|
597
|
-
], FormFilterComponent.prototype, "isModal", void 0);
|
|
598
|
-
__decorate([
|
|
599
|
-
Input()
|
|
600
|
-
], FormFilterComponent.prototype, "contextId", void 0);
|
|
601
|
-
__decorate([
|
|
602
|
-
Output()
|
|
603
|
-
], FormFilterComponent.prototype, "totalFiltersActiveOutput", void 0);
|
|
604
|
-
__decorate([
|
|
605
|
-
Output()
|
|
606
|
-
], FormFilterComponent.prototype, "errorOutput", void 0);
|
|
607
|
-
__decorate([
|
|
608
|
-
Output()
|
|
609
|
-
], FormFilterComponent.prototype, "showDialogOutput", void 0);
|
|
610
|
-
__decorate([
|
|
611
|
-
Output()
|
|
612
|
-
], FormFilterComponent.prototype, "closeModalOutput", void 0);
|
|
613
|
-
__decorate([
|
|
614
|
-
HostListener('window:resize', ['$event'])
|
|
615
|
-
], FormFilterComponent.prototype, "onResizeWindow", null);
|
|
616
|
-
FormFilterComponent = __decorate([
|
|
617
|
-
Component({
|
|
618
|
-
selector: 's-app-form-filter',
|
|
619
|
-
template: "<s-empty-state\n *ngIf=\"error\"\n iconClass=\"fa fa-exclamation-triangle\"\n title=\"{{ errorState?.status }} - {{ errorState?.statusText }}\"\n (primaryAction)=\"errorStateAction()\"\n [primaryActionLabel]=\"translate.instant('platform.filter_service.try')\"\n [description]=\"translate.instant('platform.filter_service.error_state')\"\n></s-empty-state>\n\n<div *ngIf=\"!error\">\n <p-tabView *ngIf=\"tabs && tabs.size > 1\" [orientation]=\"tabViewOrientation\" selected=\"false\">\n <p-tabPanel *ngIf=\"general.fields.length\" [selected]=\"false\" [header]=\"general.name\">\n <s-dynamic-form [errorMessages]=\"errorMessages\" [fields]=\"general.fields\" [form]=\"general.form\"></s-dynamic-form>\n </p-tabPanel>\n\n <p-tabPanel *ngFor=\"let tab of (tabs | mapValues); let i = index\" [selected]=\"i === 0\" [header]=\"tab.label\">\n <s-dynamic-form [errorMessages]=\"errorMessages\" [fields]=\"tab.fields\" [form]=\"tab.form\"></s-dynamic-form>\n </p-tabPanel>\n </p-tabView>\n\n <div *ngIf=\"tabs && tabs.size === 1\">\n <s-dynamic-form\n *ngFor=\"let tab of (tabs | mapValues)\"\n [errorMessages]=\"errorMessages\"\n [fields]=\"tab.fields\"\n [form]=\"tab.form\"\n ></s-dynamic-form>\n </div>\n</div>\n",
|
|
620
|
-
styles: [".filter-dialog{width:800px;top:100px}.filter-dialog>.ui-dialog-content{height:300px;padding:10px!important}@media (min-width:641px) and (max-width:1024px){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:300px}}@media only screen and (min-device-width:481px) and (max-device-width:1024px) and (orientation:portrait){.filter-dialog{width:75%}.filter-dialog>.ui-dialog-content{height:90%}}@media (min-width:320px) and (max-width:640px){.filter-dialog{width:95%;left:0;top:0;opacity:1;margin:auto;height:93%}.filter-dialog>.ui-dialog-content{height:85%}}@media (min-width:320px) and (max-width:640px) and (max-width:360px){.filter-dialog button{padding:0!important}.filter-dialog>.ui-dialog-content{height:81%}}"]
|
|
621
|
-
})
|
|
622
|
-
], FormFilterComponent);
|
|
623
|
-
return FormFilterComponent;
|
|
624
|
-
}());
|
|
625
|
-
export { FormFilterComponent };
|
|
626
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1maWx0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvcnNpc3RlbWFzL3BsYXRmb3JtLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJtb2R1bGVzL2FkdmFuY2VkLWZpbHRlci9jb21wb25lbnRzL2Zvcm0tZmlsdGVyL2Zvcm0tZmlsdGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0EsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNILE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RCxPQUFPLEVBQUUsTUFBTSxJQUFJLFFBQVEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuRixPQUFPLEVBQTJELFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDMUcsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMvRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGVBQWUsRUFDZixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixRQUFRLEVBQ1IsUUFBUSxFQUNSLGdCQUFnQixFQUNoQixjQUFjLEVBQ2QsWUFBWSxFQUNiLE1BQU0sbUJBQW1CLENBQUM7QUFDM0IsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDM0QsT0FBTyxFQUFF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fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gXCJwcmltZW5nL2FwaVwiO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZyb20sIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciBhcyByeEZpbHRlciwgbWFwLCBtZXJnZU1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IENvbnRleHQsIERlcGVuZHNPbiwgRW50aXR5U2VhcmNoSW5wdXQsIEVudW1JdGVtLCBGaWx0ZXIsIEZpbHRlclR5cGUsIFNjb3BlIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbnRleHRUYWIsIFRhYlZpZXcgfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFiLXZpZXcnO1xuaW1wb3J0IHsgQWR2YW5jZWRGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWR2YW5jZWQtZmlsdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUZpbHRlciB9IGZyb20gJy4uLy4uL21vZGVscy9mb3JtLWZpbHRlcic7XG5pbXBvcnQge1xuICBmaWx0ZXJPcGVyYXRvcnMsXG4gIGZyb21Kc29uLFxuICBnZXRGaWx0ZXJJZCxcbiAgZ2V0U2VhcmNoVHlwZSxcbiAgZ2V0VGFiSWQsXG4gIGpzb25QYXRoLFxuICBwYXJzZUZpbHRlclZhbHVlLFxuICB0b0ZpbHRlckZvcm1hdCxcbiAgdG9Vc2VyRm9ybWF0XG59IGZyb20gJy4uLy4uL3V0aWxzL2luZGV4JztcbmltcG9ydCB7IGNyZWF0ZUZvcm1Db250cm9sIH0gZnJvbSAnLi4vLi4vdXRpbHMvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBjbG9uZSwgZXF1YWxzIH0gZnJvbSAncmFtZGEnO1xuaW1wb3J0IHsgY29tcGFyZSwgaXNTdXBwb3J0ZWRUeXBlLCBpc1ZhbGlkT3BlcmF0b3IgfSBmcm9tICcuLi8uLi91dGlscy9jb21wYXJhdG9yJztcblxuaW1wb3J0IHtcbiAgQXV0b2NvbXBsZXRlRmllbGQsXG4gIENhbGVuZGFyRmllbGQsXG4gIFJhZGlvQnV0dG9uRmllbGQsXG4gIEN1cnJlbmN5RmllbGQsXG4gIEZpZWxkLFxuICBGaWVsZENvbmZpZyxcbiAgRmllbGRUeXBlLFxuICBOdW1iZXJGaWVsZCxcbiAgU2VsZWN0RmllbGQsXG4gIFRleHRGaWVsZCxcbiAgUmF0aW9uQnV0dG9uT3B0aW9uLFxuICBDYWxlbmRhckZpZWxkQ29uZmlnXG59IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMnO1xuXG5pbXBvcnQgeyBzZWFyY2hEaXNwbGF5TmFtZSwgc2VhcmNoS2V5TmFtZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IENhbGVuZGFyT3B0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jYWxlbmRhci1vcHRpb25zLnNlcnZpY2UnO1xuXG5jb25zdCBUUkFOU0xBVEVfUFJFRklYID0gJ3BsYXRmb3JtLmZpbHRlcl9zZXJ2aWNlJztcbmNvbnN0IFRPQVNUX0xJRkUgPSA1MDAwO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzLWFwcC1mb3JtLWZpbHRlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Zvcm0tZmlsdGVyLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRm9ybUZpbHRlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xuICBlcnJvclN0YXRlOiBIdHRwRXJyb3JSZXNwb25zZTtcbiAgdGFiczogTWFwPHN0cmluZywgQ29udGV4dFRhYj47XG4gIGNvbnRleHRzOiBDb250ZXh0W10gPSBbXTtcbiAgZm9ybUZpbHRlcnM6IEZvcm1GaWx0ZXJbXSA9IFtdO1xuICBvbGRGb3JtRmlsdGVyczogYW55W10gPSBbXTtcbiAgYWN0dWFsRm9ybUZpbHRlcnM6IGFueVtdID0gW107XG4gIGdlbmVyYWwgPSBuZXcgVGFiVmlldyh7IG5hbWU6ICdHZXJhbCcgfSk7XG4gIHRvdGFsRmlsdGVyc0FjdGl2ZSA9IDA7XG4gIGlzTW9iaWxlID0gZmFsc2U7XG4gIHRhYlZpZXdPcmllbnRhdGlvbiA9ICdsZWZ0JztcbiAgZXJyb3IgPSBmYWxzZTtcblxuICBlcnJvck1lc3NhZ2VzID0ge1xuICAgIG1pbjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5lcnJvcl9taW5fdmFsdWVgKSxcbiAgICBtYXg6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uZXJyb3JfbWF4X3ZhbHVlYCksXG4gICAgcGF0dGVybjogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5pbnZhbGlkX3BhdHRlcm5gKVxuICB9O1xuXG4gIEBJbnB1dCgpIHNob3dNZXNzYWdlcyA9IHRydWU7XG4gIEBJbnB1dCgpIGlzTW9kYWwgPSBmYWxzZTtcbiAgQElucHV0KCkgY29udGV4dElkID0gJyc7XG5cblxuICBAT3V0cHV0KCkgdG90YWxGaWx0ZXJzQWN0aXZlT3V0cHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIEBPdXRwdXQoKSBlcnJvck91dHB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIHNob3dEaWFsb2dPdXRwdXQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIEBPdXRwdXQoKSBjbG9zZU1vZGFsT3V0cHV0ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogQWR2YW5jZWRGaWx0ZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWxlbmRhck9wdGlvbnNTZXJ2aWNlOiBDYWxlbmRhck9wdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gIG9uUmVzaXplV2luZG93KGV2ZW50OiBhbnkpIHtcbiAgICBjb25zdCB7IGlubmVyV2lkdGggfSA9IGV2ZW50LnRhcmdldDtcbiAgICB0aGlzLmlzTW9iaWxlID0gaW5uZXJXaWR0aCA8PSA2NDA7XG4gICAgdGhpcy50YWJWaWV3T3JpZW50YXRpb24gPSB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAnbGVmdCc7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmlzTW9iaWxlID0gaW5uZXJXaWR0aCA8PSA2NDA7XG4gICAgdGhpcy50YWJWaWV3T3JpZW50YXRpb24gPSB0aGlzLmlzTW9iaWxlID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgdGhpcy5zdWJzY3JpYmVDb250ZXh0c09ic2VydmFibGUoKTtcbiAgICB0aGlzLnN1YnNjcmliZUZpbHRlcnNPYnNlcnZhYmxlKCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBldmVudC5kYXRhO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGRhdGEubWVzc2FnZSAmJiBkYXRhLm1lc3NhZ2Uuc3BsaXQoJzonKVsxXTtcbiAgICAgIGlmIChtZXNzYWdlID09PSAnYWRkQ29udGV4dCcpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLmFkZENvbnRleHRzKC4uLmRhdGEucGF5bG9hZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBoYXNDaGFuZ2VzKCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICBjb25zdCBvbGRLZXlzID0gT2JqZWN0LmtleXModGhpcy5vbGRGb3JtRmlsdGVycyk7XG4gICAgaWYgKCFvbGRLZXlzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlcmVkID0ga2V5cy5maWx0ZXIoa2V5ID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMuZm9ybUZpbHRlcnNba2V5XS52YWx1ZTtcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5vbGRGb3JtRmlsdGVyc1trZXldICYmIHRoaXMub2xkRm9ybUZpbHRlcnNba2V5XS52YWx1ZTtcbiAgICAgIHJldHVybiAhZXF1YWxzKGN1cnJlbnRWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH0pO1xuICAgIHJldHVybiBmaWx0ZXJlZC5sZW5ndGggPiAwO1xuICB9XG5cbiAgb25BcHBseUZpbHRlcnMoKSB7XG4gICAgdGhpcy5oYXNDaGFuZ2VzKCkgJiYgdGhpcy5jbG9zZU1vZGFsT3V0cHV0LmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzKCkge1xuICAgIHRoaXMuaGFzQ2hhbmdlcygpICYmIHRoaXMuZmlsdGVyU2VydmljZS50cnlBZ2Fpbih0aGlzLmNvbnRleHRzKTtcbiAgfVxuXG4gIGFwcGx5RmlsdGVycyhzaG93VG9hc3QgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmhhc0NoYW5nZXMoKSkge1xuICAgICAgdGhpcy5zaG93RGlhbG9nT3V0cHV0LmVtaXQoZmFsc2UpO1xuICAgICAgdGhpcy5jb3VudGVyVXBkYXRlKCk7XG4gICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzVmFsdWVzKHRoaXMuZm9ybUZpbHRlcnMpO1xuICAgICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnNhdmVUaWNrZWRGaWx0ZXJzKGZpbHRlcnMpO1xuICAgIH0gZWxzZSBpZiAoc2hvd1RvYXN0KSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICBrZXk6ICdmaWx0ZXJTZXJ2aWNlVG9hc3RLZXknLFxuICAgICAgICBzZXZlcml0eTogJ2luZm8nLFxuICAgICAgICBsaWZlOiBUT0FTVF9MSUZFLFxuICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uYXBwbGllZF9maWx0ZXJfbm9jaGFuZ2VgLCB7IGFjdGl2ZUZpbHRlcnM6IHRoaXMudG90YWxGaWx0ZXJzQWN0aXZlIH0pXG4gICAgICB9O1xuICAgICAgdGhpcy5zZW5kTWVzc2FnZShtZXNzYWdlKTtcbiAgICB9XG4gICAgdGhpcy5vbGRGb3JtRmlsdGVycyA9IGNsb25lKHRoaXMuZm9ybUZpbHRlcnMpO1xuICB9XG5cbiAgZ2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRWYWx1ZTogYW55LCBpc011bHRpcGxlOiBib29sZWFuKSB7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IChpc011bHRpcGxlICYmIGRlZmF1bHRWYWx1ZVswXSA9PT0gJycpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIGNsZWFyRmlsdGVycygpIHtcbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5mb3JtRmlsdGVycyk7XG4gICAga2V5cy5mb3JFYWNoKGtleSA9PiB0aGlzLmNsZWFuRmllbGRBbmRTZXREZWZhdWx0VmFsdWUoa2V5KSk7XG4gIH1cblxuICBzZW5kQ2xvc2VNZXNzYWdlKCkge1xuICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICB7XG4gICAgICAgIG1lc3NhZ2U6ICdkYXNoYm9hcmQ6Y2xvc2UtbW9kYWwnLFxuICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgbW9kYWxOYW1lOiAnYWR2YW5jZWQtZmlsdGVyLTEnXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAnKidcbiAgICApO1xuICB9XG5cbiAgc2VuZE1lc3NhZ2UobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIGlmICh0aGlzLnNob3dNZXNzYWdlcykge1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiAnZGFzaGJvYXJkOnRvYXN0cicsXG4gICAgICAgICAgcGF5bG9hZDoge1xuICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZS5kZXRhaWxcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICcqJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzYXZlRmlsdGVycyhmb3JjZVNhdmUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLnBhcnNlVG9Vc2VyRmlsdGVycyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICBjb25zdCBzYXZlZEZpbHRlclN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICBpZiAoIWZvcmNlU2F2ZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgIGtleTogJ2ZpbHRlclNlcnZpY2VUb2FzdEtleScsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdpbmZvJyxcbiAgICAgICAgICBsaWZlOiBUT0FTVF9MSUZFLFxuICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5zYXZlZF9maWx0ZXJzX3N1Y2Nlc3NgLCB7IGFjdGl2ZUZpbHRlcnM6IHRoaXMudG90YWxGaWx0ZXJzQWN0aXZlIH0pXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuY291bnRlclVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBzYXZlZEZpbHRlcnNFcnJvciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGtleTogJ2ZpbHRlclNlcnZpY2VUb2FzdEtleScsXG4gICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICBsaWZlOiBUT0FTVF9MSUZFLFxuICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoYCR7VFJBTlNMQVRFX1BSRUZJWH0uc2F2ZWRfZmlsdGVyc19lcnJvcmAsIHsgYWN0aXZlRmlsdGVyczogdGhpcy50b3RhbEZpbHRlcnNBY3RpdmUgfSlcbiAgICAgIH07XG5cbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfTtcblxuICAgIHRoaXMuZmlsdGVyU2VydmljZVxuICAgICAgLnNhdmVGaWx0ZXJzKGZpbHRlcnMpXG4gICAgICAuc3Vic2NyaWJlKHNhdmVkRmlsdGVyU3VjY2Vzcywgc2F2ZWRGaWx0ZXJzRXJyb3IpO1xuICB9XG5cbiAgc2F2ZUZpbHRlcnNXaXRoQ2FsbGJhY2tGdW5jdGlvbihjYWxsYmFja0Z1bmN0aW9uOiBhbnkpIHtcbiAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5wYXJzZVRvVXNlckZpbHRlcnModGhpcy5mb3JtRmlsdGVycyk7XG5cbiAgICB0aGlzLmZpbHRlclNlcnZpY2VcbiAgICAgIC5zYXZlRmlsdGVycyhmaWx0ZXJzKVxuICAgICAgLnN1YnNjcmliZShjYWxsYmFja0Z1bmN0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgY291bnRlclVwZGF0ZSgpIHtcbiAgICB0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSA9IHRoaXMuY291bnRBY3RpdmVGaWx0ZXJzKHRoaXMudGFicyk7XG4gICAgdGhpcy50b3RhbEZpbHRlcnNBY3RpdmVPdXRwdXQuZW1pdCh0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSk7XG4gIH1cblxuICBwcml2YXRlIGNvdW50QWN0aXZlRmlsdGVycyh0YWJzOiBNYXA8c3RyaW5nLCBDb250ZXh0VGFiPikge1xuICAgIGxldCB0b3RhbEZpbHRlcnNBY3RpdmUgPSAwO1xuXG4gICAgdGFicy5mb3JFYWNoKHRhYlZpZXcgPT4ge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gdGFiVmlldy5mb3JtO1xuICAgICAgdGFiVmlldy5hY3RpdmVGaWx0ZXJzID0gT2JqZWN0LmtleXModmFsdWUpLnJlZHVjZSgoYXBwbGllZEZpbHRlcnMsIGtleSkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IHZhbHVlW2tleV07XG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGZpbHRlclZhbHVlKTtcbiAgICAgICAgY29uc3QgaXNWYWxpZEFycmF5ID0gaXNBcnJheSAmJiBmaWx0ZXJWYWx1ZS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmIChpc1ZhbGlkQXJyYXkgfHwgKCFpc0FycmF5ICYmIGZpbHRlclZhbHVlKSkge1xuICAgICAgICAgIGFwcGxpZWRGaWx0ZXJzKys7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbGllZEZpbHRlcnM7XG4gICAgICB9LCAwKTtcbiAgICAgIHRvdGFsRmlsdGVyc0FjdGl2ZSArPSB0YWJWaWV3LmFjdGl2ZUZpbHRlcnM7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdG90YWxGaWx0ZXJzQWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZVRvVXNlckZpbHRlcnMoZmlsdGVyczogRm9ybUZpbHRlcltdKSB7XG4gICAgY29uc3QgaWRzID0gT2JqZWN0LmtleXMoZmlsdGVycyk7XG5cbiAgICByZXR1cm4gaWRzLnJlZHVjZSgoYWxsLCBmaWx0ZXJJZCkgPT4ge1xuICAgICAgY29uc3QgeyB0eXBlLCBzZXJ2aWNlcywgbmFtZSwgdmFsdWUsIGRvbWFpbiwgY29udGV4dHMgfSA9IGZpbHRlcnNbZmlsdGVySWRdIGFzIEZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdG9Vc2VyRm9ybWF0KHZhbHVlLCB0eXBlKTtcblxuICAgICAgY29uc3QgdmFsdWVzID0gc2VydmljZXMubWFwKHNlcnZpY2UgPT4gKHsgbmFtZSwgc2VydmljZSwgdmFsdWU6IGZpbHRlclZhbHVlLCBkb21haW4sIGNvbnRleHRzIH0pKTtcblxuICAgICAgcmV0dXJuIFsuLi5hbGwsIC4uLnZhbHVlc107XG4gICAgfSwgW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaWx0ZXJzVmFsdWVzKGZpbHRlcnM6IEZvcm1GaWx0ZXJbXSkge1xuICAgIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGZpbHRlcnMpO1xuXG4gICAgcmV0dXJuIGlkcy5yZWR1Y2UoKGFsbCwgZmlsdGVySWQpID0+IHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgc2VydmljZXMsIG5hbWUsIHZhbHVlLCBkb21haW4gfSA9IGZpbHRlcnNbZmlsdGVySWRdIGFzIEZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlclZhbHVlID0gdG9GaWx0ZXJGb3JtYXQodmFsdWUsIHR5cGUpO1xuICAgICAgY29uc3QgdmFsdWVzID0gc2VydmljZXMubWFwKHNlcnZpY2UgPT4gKHsgbmFtZSwgc2VydmljZSwgdmFsdWU6IGZpbHRlclZhbHVlLCBkb21haW4gfSkpO1xuXG4gICAgICByZXR1cm4gWy4uLmFsbCwgLi4udmFsdWVzXTtcbiAgICB9LCBbXSk7XG4gIH1cblxuICBwcml2YXRlIHN1YnNjcmliZUNvbnRleHRzT2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCB7IGNvbnRleHRzT2JzZXJ2ZXIgfSA9IHRoaXMuZmlsdGVyU2VydmljZTtcbiAgICBjb250ZXh0c09ic2VydmVyLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKGNvbnRleHRzOiBDb250ZXh0W10pID0+ICh0aGlzLmNvbnRleHRzID0gY29udGV4dHMpKTtcbiAgfVxuXG4gIGVycm9yU3RhdGVBY3Rpb24oKSB7XG4gICAgdGhpcy5maWx0ZXJTZXJ2aWNlLnRyeUFnYWluKHRoaXMuY29udGV4dHMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdWJzY3JpYmVGaWx0ZXJzT2JzZXJ2YWJsZSgpIHtcbiAgICBjb25zdCB7IGZpbHRlcnNPYnNlcnZlciB9ID0gdGhpcy5maWx0ZXJTZXJ2aWNlO1xuXG4gICAgZmlsdGVyc09ic2VydmVyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCh7IGZpbHRlcnMsIGFwcGx5RmlsdGVyLCBlcnJvciwgbWVzc2FnZSB9KSA9PiB7XG4gICAgICAgIHRoaXMuZXJyb3JPdXRwdXQuZW1pdChlcnJvcik7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBlcnJvcjtcbiAgICAgICAgdGhpcy5lcnJvclN0YXRlID0gbWVzc2FnZTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHRoaXMuY3JlYXRlRm9ybShmaWx0ZXJzLCBhcHBseUZpbHRlcilcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUZvcm0oZmlsdGVyczogYW55LCBhcHBseUZpbHRlcjogYW55KSB7XG4gICAgdGhpcy50YWJzID0gdGhpcy5jcmVhdGVUYWJzKGZpbHRlcnMpO1xuICAgIHRoaXMuY291bnRlclVwZGF0ZSgpO1xuICAgIHRoaXMuc2V0RGVwZW5kZW5jaWVzKHRoaXMuZm9ybUZpbHRlcnMpO1xuICAgIHRoaXMuY3JlYXRlQ2hpbGRBcnJheSgpO1xuICAgIGlmIChmaWx0ZXJzLmxlbmd0aCA+IDAgJiYgYXBwbHlGaWx0ZXIpIHtcbiAgICAgIHRoaXMuYXBwbHlGaWx0ZXJzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXREZXBlbmRlbmNpZXMoZmlsdGVyczogRm9ybUZpbHRlcltdKSB7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhmaWx0ZXJzKTtcbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSBmcm9tKG5hbWVzKS5waXBlKFxuICAgICAgbWFwKGtleSA9PiBmaWx0ZXJzW2tleV0gYXMgRm9ybUZpbHRlciksXG4gICAgICByeEZpbHRlcigoeyBkZXBlbmRzT24gfSkgPT4gZGVwZW5kc09uICYmIGRlcGVuZHNPbi5sZW5ndGggPiAwKSxcbiAgICAgIHRhcCgoeyBkZXBlbmRzT24sIGRvbWFpbiwgZmlsdGVyQ29udHJvbCB9KSA9PiB7XG4gICAgICAgIGNvbnN0IGludmFsaWRGaWx0ZXJzID0gZGVwZW5kc09uXG4gICAgICAgICAgLmZpbHRlcihkZXAgPT4gZGVwLnJlcXVpcmVkKVxuICAgICAgICAgIC5maWx0ZXIoZGVwID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBkZXAuZmlsdGVyTmFtZSk7XG4gICAgICAgICAgICBjb25zdCBmb3JtRmlsdGVyID0gZmlsdGVyc1tpZF07XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCB0eXBlIH0gPSBmb3JtRmlsdGVyO1xuICAgICAgICAgICAgY29uc3QgeyBjb21wYXJhdG9yIH0gPSBkZXA7XG4gICAgICAgICAgICBpZiAoY29tcGFyYXRvciAmJiBpc1ZhbGlkT3BlcmF0b3IoY29tcGFyYXRvci5vcGVyYXRvcikgJiYgaXNTdXBwb3J0ZWRUeXBlKHR5cGUpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSBwYXJzZUZpbHRlclZhbHVlKHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgICAgcmV0dXJuICFjb21wYXJlKGNvbXBhcmF0b3Iub3BlcmF0b3IsIGNvbXBhcmF0b3IudmFsdWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlcC5yZXF1aXJlZCA/ICFmb3JtRmlsdGVyLnZhbHVlIDogZm9ybUZpbHRlci52YWx1ZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW52YWxpZEZpbHRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGZpbHRlckNvbnRyb2wuZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG1hcCgoeyBkb21haW4sIGRlcGVuZHNPbiwgZmlsdGVyQ29udHJvbCB9KSA9PiAoeyBkb21haW4sIGRlcGVuZHNPbiwgZmlsdGVyQ29udHJvbCB9KSlcbiAgICApO1xuXG4gICAgZGVwZW5kZW5jaWVzLnN1YnNjcmliZSgoeyBkZXBlbmRzT24sIGRvbWFpbiwgZmlsdGVyQ29udHJvbCB9KSA9PlxuICAgICAgZnJvbShkZXBlbmRzT24pXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHJ4RmlsdGVyKGRlcCA9PiBkZXAucmVxdWlyZWQpLFxuICAgICAgICAgIG1hcCgoeyBmaWx0ZXJOYW1lIH0pID0+IGdldEZpbHRlcklkKGRvbWFpbiwgZmlsdGVyTmFtZSkpLFxuICAgICAgICAgIG1hcChmaWx0ZXJJZCA9PiBmaWx0ZXJzW2ZpbHRlcklkXSBhcyBGb3JtRmlsdGVyKSxcbiAgICAgICAgICBtZXJnZU1hcChmb3JtRmlsdGVyID0+IGZyb20oZm9ybUZpbHRlci52YWx1ZUNoYW5nZXMpKSxcbiAgICAgICAgICBtYXAodmFsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBhcmF0aW9uID0gZGVwZW5kc09uLmV2ZXJ5KGRlcCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBkZXAuZmlsdGVyTmFtZSk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS50eXBlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgY29tcGFyYXRvciB9ID0gZGVwO1xuICAgICAgICAgICAgICAgIGlmIChjb21wYXJhdG9yICYmIGlzVmFsaWRPcGVyYXRvcihjb21wYXJhdG9yLm9wZXJhdG9yKSAmJiBpc1N1cHBvcnRlZFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGaWx0ZXJWYWx1ZSh2YWwsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUoY29tcGFyYXRvci5vcGVyYXRvciwgY29tcGFyYXRvci52YWx1ZSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gIXRoaXMuSXNFbXB0eSh2YWwpICYmIGNvbXBhcmF0aW9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSc7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHN0YXR1cyA9PiBmaWx0ZXJDb250cm9sW3N0YXR1c10oKSlcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRHZW5lcmFsRmllbGQoZmlsdGVyOiBGaWx0ZXIpIHtcbiAgICBjb25zdCB7IG5hbWUsIGRvbWFpbiwgdHlwZSB9ID0gZmlsdGVyO1xuICAgIGNvbnN0IGNvbnRyb2xOYW1lID0gZ2V0RmlsdGVySWQoZG9tYWluLCBuYW1lKTtcbiAgICBjb25zdCBmaWVsZENvbnRyb2wgPSBjcmVhdGVGb3JtQ29udHJvbChmaWx0ZXIpO1xuXG4gICAgZmllbGRDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgbWFwKHYgPT4gcGFyc2VGaWx0ZXJWYWx1ZSh2LCB0eXBlKSksXG4gICAgICAgIHRhcCh2YWx1ZSA9PiAodGhpcy5mb3JtRmlsdGVyc1tjb250cm9sTmFtZV0udmFsdWUgPSB2YWx1ZSkpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZhbCA9PlxuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSB0YWIuZm9ybS5jb250cm9sc1tuYW1lXTtcbiAgICAgICAgICBpZiAoY29udHJvbCAmJiB0YWIuZG9tYWluID09PSBkb21haW4pIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGNvbnN0IG5ld0ZpbHRlciA9IHsgLi4uZmlsdGVyLCAuLi57IG5hbWU6IGNvbnRyb2xOYW1lIH0gfTtcbiAgICBjb25zdCBuZXdGaWVsZCA9IHRoaXMuY3JlYXRlRmllbGQobmV3RmlsdGVyKTtcbiAgICB0aGlzLmdlbmVyYWwuZm9ybS5hZGRDb250cm9sKGNvbnRyb2xOYW1lLCBmaWVsZENvbnRyb2wpO1xuICAgIHRoaXMuZ2VuZXJhbC5maWVsZHMucHVzaChuZXdGaWVsZCk7XG4gIH1cblxuICAvKlxuICAgKiBWZXJpZmljYSBvcyBjb250ZXh0b3MgZGUgY2FkYSBmaWx0cm8sIGNhc28gdG9kb3Mgb3MgY29udGV4dG9zIGZvcmFtIGluZm9ybWFkb3M6XG4gICAqIEByZXR1cm4gdHJ1ZVxuICAgKiBDYXNvIG7Do28gdGVuaGEgbmVuaHVtIGNvbnRleHRvLCBjb25zaWRlcmEtc2UgcG9yIHBhZHLDo28gcXVlIMOpIHRvZG9zOlxuICAgKiBAcmV0dXJuIHRydWVcbiAgICovXG4gIHByaXZhdGUgY29udGFpbnNBbGxDb250ZXh0cyhteUNvbnRleHRzOiBzdHJpbmdbXSkge1xuICAgIGlmICghbXlDb250ZXh0cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhbGxDb250ZXh0cyA9IHRoaXMuY29udGV4dHMubWFwKGRhdGEgPT4gZGF0YS5jb250ZXh0SWQpO1xuICAgIHJldHVybiBlcXVhbHMobXlDb250ZXh0cy5zb3J0KCksIGFsbENvbnRleHRzLnNvcnQoKSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHRvZG8gUmVmYXRvcmFyLiBPIG3DqXRvZG8gcG9zc3VpIG11aXRhcyByZXNwb25zYWJpbGlkYWRlc1xuICAgKiBcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlVGFicyhmaWx0ZXJzOiBGaWx0ZXJbXSkge1xuICAgIHJldHVybiBmaWx0ZXJzLnJlZHVjZSgodGFicywgZmlsdGVyKSA9PiB7XG4gICAgICBjb25zdCB7IGRvbWFpbiwgc2VydmljZXMsIG5hbWUsIHR5cGUsIHNjb3BlLCBjb250ZXh0cywgZGVwZW5kc09uLCB2YWx1ZSwgc2VhcmNoLCBkZWZhdWx0VmFsdWUgfSA9IGZpbHRlcjtcbiAgICAgIGNvbnN0IGlzTm90TXVsdGlwbGUgPSBzZWFyY2ggJiYgZ2V0U2VhcmNoVHlwZShzZWFyY2gpLm91dHB1dC5tYXhTZWxlY3RlZEl0ZW1zID09PSAxO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmNyZWF0ZUZpZWxkKGZpbHRlcik7XG4gICAgICBjb25zdCBmaWx0ZXJJZCA9IGdldEZpbHRlcklkKGRvbWFpbiwgbmFtZSk7XG4gICAgICBjb25zdCBmaWx0ZXJDb25maWcgPSB7XG4gICAgICAgIGRvbWFpbixcbiAgICAgICAgY29udGV4dHMsXG4gICAgICAgIHNlcnZpY2VzLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkZXBlbmRzT24sXG4gICAgICAgIHZhbHVlOiBmcm9tSnNvbih2YWx1ZSwgdHlwZSwgaXNOb3RNdWx0aXBsZSksXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGlzTXVsdGlwbGU6ICFpc05vdE11bHRpcGxlLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGZyb21Kc29uKGRlZmF1bHRWYWx1ZSwgdHlwZSwgaXNOb3RNdWx0aXBsZSlcbiAgICAgIH07XG4gICAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXSA9IG5ldyBGb3JtRmlsdGVyKGZpbHRlckNvbmZpZyk7XG4gICAgICBjb25zdCBmb3JtRmlsdGVyID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZF07XG4gICAgICBpZiAoc2NvcGUgPT09IFNjb3BlLkRPTUFJTiAmJiB0aGlzLmNvbnRhaW5zQWxsQ29udGV4dHMoY29udGV4dHMpKSB7XG4gICAgICAgIHRoaXMuYWRkR2VuZXJhbEZpZWxkKGZpbHRlcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHRzLmZvckVhY2goY29udGV4dElkID0+IHtcbiAgICAgICAgaWYgKChjb250ZXh0SWQgPT09IHRoaXMuY29udGV4dElkKSB8fCAodGhpcy5jb250ZXh0SWQgPT09ICcnKSkge1xuICAgICAgICAgIGNvbnN0IHRhYklkID0gZ2V0VGFiSWQoZG9tYWluLCBjb250ZXh0SWQpO1xuICAgICAgICAgIGNvbnN0IGZpZWxkQ29udHJvbCA9IGNyZWF0ZUZvcm1Db250cm9sKGZpbHRlcik7XG5cbiAgICAgICAgICBpZiAoIXRhYnMuaGFzKHRhYklkKSkge1xuICAgICAgICAgICAgY29uc3QgeyBjb250ZXh0TGFiZWwgfSA9IHRoaXMuY29udGV4dHMuZmluZChjb250ZXh0ID0+IGNvbnRleHQuY29udGV4dElkID09PSBjb250ZXh0SWQpO1xuICAgICAgICAgICAgY29uc3QgdGFiID0gbmV3IENvbnRleHRUYWIoeyBkb21haW4sIG5hbWU6IGNvbnRleHRMYWJlbCB9KTtcbiAgICAgICAgICAgIHRhYnMuc2V0KHRhYklkLCB0YWIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZpZWxkQ29udHJvbC52YWx1ZUNoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB0aGlzLnVwZGF0ZUZpbHRlclZhbHVlKHRhYklkLCBuYW1lLCB2YWwsIGRvbWFpbiwgdHlwZSkpO1xuXG4gICAgICAgICAgY29uc3QgY29udGV4dFRhYiA9IHRhYnMuZ2V0KHRhYklkKTtcblxuICAgICAgICAgIGNvbnRleHRUYWIuZmllbGRzLnB1c2goZmllbGQpO1xuICAgICAgICAgIGNvbnRleHRUYWIuZm9ybS5hZGRDb250cm9sKGZpbHRlci5uYW1lLCBmaWVsZENvbnRyb2wpO1xuXG4gICAgICAgICAgaWYgKCFmb3JtRmlsdGVyLmZpbHRlckNvbnRyb2wpIHtcbiAgICAgICAgICAgIGZvcm1GaWx0ZXIuZmlsdGVyQ29udHJvbCA9IGZpZWxkQ29udHJvbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG5cbiAgICAgIHJldHVybiB0YWJzO1xuICAgIH0sIG5ldyBNYXA8c3RyaW5nLCBDb250ZXh0VGFiPigpKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyVmFsdWUodGFiSWQ6IHN0cmluZywgZmlsdGVyTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCBkb21haW46IHN0cmluZywgdHlwZTogRmlsdGVyVHlwZSkge1xuICAgIGNvbnN0IGNvbnRyb2xPcHRzID0geyBlbWl0RXZlbnQ6IGZhbHNlIH07XG4gICAgY29uc3QgZmllbGRWYWx1ZSA9IHBhcnNlRmlsdGVyVmFsdWUodmFsdWUsIHR5cGUpO1xuICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWx0ZXJOYW1lKTtcbiAgICBjb25zdCBnZW5lcmFsRmllbGRDb250cm9sID0gdGhpcy5nZW5lcmFsLmZvcm0uY29udHJvbHNbZmlsdGVySWRdO1xuXG4gICAgdGhpcy50YWJzLmZvckVhY2goKHsgZm9ybSB9LCBrZXkpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRyb2wgPSBmb3JtLmNvbnRyb2xzW2ZpbHRlck5hbWVdO1xuXG4gICAgICBpZiAodGFiSWQgIT09IGtleSAmJiBjb250cm9sKSB7XG4gICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIGNvbnRyb2xPcHRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCB7IGNoaWxkcyB9ID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZF07XG4gICAgY2hpbGRzICYmIGNoaWxkcy5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB0aGlzLmNsZWFuRmllbGRBbmRTZXREZWZhdWx0VmFsdWUoY2hpbGQuZmlsdGVyLmtleSkpO1xuICAgIGdlbmVyYWxGaWVsZENvbnRyb2wgJiYgZ2VuZXJhbEZpZWxkQ29udHJvbC5zZXRWYWx1ZSh2YWx1ZSwgY29udHJvbE9wdHMpO1xuICAgIHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWRdLnZhbHVlID0gZmllbGRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5GaWVsZEFuZFNldERlZmF1bHRWYWx1ZShrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHsgaXNNdWx0aXBsZSwgZGVmYXVsdFZhbHVlLCBmaWx0ZXJDb250cm9sLCB0eXBlIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2tleV0gYXMgRm9ybUZpbHRlcjtcbiAgICBjb25zdCBmaW5hbFZhbHVlID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoZGVmYXVsdFZhbHVlLCBpc011bHRpcGxlKTtcblxuICAgIGlmIChmaWx0ZXJDb250cm9sKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ0RBVEUnIHx8ICh0eXBlID09PSAnU0VBUkNIJyAmJiBpc011bHRpcGxlKSkge1xuICAgICAgICBmaWx0ZXJDb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGUgPT09ICdJTlRFR0VSJyB8fCB0eXBlID09PSAnRE9VQkxFJyB8fCB0eXBlID09PSAnTU9ORVknKSB7XG4gICAgICAgIGZpbmFsVmFsdWUgPT09ICcnID8gZmlsdGVyQ29udHJvbC5zZXRWYWx1ZShudWxsKSA6IGZpbHRlckNvbnRyb2wuc2V0VmFsdWUoZmluYWxWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmaWx0ZXJDb250cm9sLnNldFZhbHVlKGZpbmFsVmFsdWUsIHsgb25seVNlbGY6IHRydWUgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDaGlsZEFycmF5KCkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLmZvcm1GaWx0ZXJzKTtcbiAgICBrZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IHsgZGVwZW5kc09uLCBkb21haW4gfSA9IHRoaXMuZm9ybUZpbHRlcnNba2V5XTtcbiAgICAgIGRlcGVuZHNPbi5mb3JFYWNoKChmaWVsZDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWVsZC5maWx0ZXJOYW1lKTtcbiAgICAgICAgaWYgKHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWRdKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS5jaGlsZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybUZpbHRlcnNbZmlsdGVySWRdLmNoaWxkcyA9IFtdO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS5jaGlsZHMucHVzaCh7IGZpbHRlcjogeyBrZXksIHJlcXVpcmVkOiBmaWVsZC5yZXF1aXJlZCB9IH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmllbGQoZmlsdGVyOiBGaWx0ZXIpOiBGaWVsZCB7XG4gICAgY29uc3QgeyBuYW1lLCBsYWJlbCwgZW51bUl0ZW1zLCB0eXBlLCBtYXNrIH0gPSBmaWx0ZXI7XG4gICAgY29uc3QgdHJhbnNsYXRlZEVudW1JdGVtcyA9XG4gICAgICBlbnVtSXRlbXMgJiYgZW51bUl0ZW1zLm1hcCgoaXRlbTogRW51bUl0ZW0pID0+ICh7IGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGl0ZW0ubGFiZWwpLCB2YWx1ZTogaXRlbS52YWx1ZSB9KSk7XG4gICAgY29uc3QgZmllbGQgPSB7IG5hbWUsIGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGxhYmVsKSwgcGxhY2Vob2xkZXI6ICcnIH07XG5cbiAgICBjb25zdCBjcmVhdG9ycyA9IHtcbiAgICAgIFtGaWx0ZXJUeXBlLlNUUklOR106ICgpID0+IG5ldyBUZXh0RmllbGQoeyAuLi5maWVsZCwgbWFzazogbWFzayA/ICgpID0+IG1hc2sgOiBudWxsLCB0eXBlOiBGaWVsZFR5cGUuU3RyaW5nIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuTU9ORVldOiAoKSA9PiBuZXcgQ3VycmVuY3lGaWVsZCh7IC4uLmZpZWxkLCB0eXBlOiBGaWVsZFR5cGUuTW9uZXkgfSksXG4gICAgICBbRmlsdGVyVHlwZS5CT09MRUFOXTogKCkgPT4gdGhpcy5jcmVhdGVSYWRpb0J1dHRvbih7IC4uLmZpZWxkIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuREFURV06ICgpID0+IHRoaXMuY3JlYXRlQ2FsZW5kYXIoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLkRhdGUgfSksXG4gICAgICBbRmlsdGVyVHlwZS5EQVRFVElNRV06ICgpID0+IHRoaXMuY3JlYXRlQ2FsZW5kYXIoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLkRhdGVUaW1lIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuVElNRV06ICgpID0+IHRoaXMuY3JlYXRlQ2FsZW5kYXIoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLlRpbWUgfSksXG4gICAgICBbRmlsdGVyVHlwZS5FTlVNRVJBVElPTl06ICgpID0+XG4gICAgICAgIG5ldyBTZWxlY3RGaWVsZCh7XG4gICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3BsYXRmb3JtLmZpbHRlcl9zZXJ2aWNlLnNlbGVjdCcpLFxuICAgICAgICAgIG9wdGlvbnM6IFsuLi50cmFuc2xhdGVkRW51bUl0ZW1zXSBhcyBhbnksXG4gICAgICAgICAgdHlwZTogRmllbGRUeXBlLkVudW1cbiAgICAgICAgfSksXG4gICAgICBbRmlsdGVyVHlwZS5JTlRFR0VSXTogKCkgPT5cbiAgICAgICAgbmV3IE51bWJlckZpZWxkKHtcbiAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICBudW1iZXJMb2NhbGVPcHRpb25zOiB0aGlzLm9wdGlvbnNJbnRlZ2VyKCksXG4gICAgICAgICAgbWFzazogbWFzayA/ICgpID0+IG1hc2sgOiBudWxsLFxuICAgICAgICAgIHR5cGU6IEZpZWxkVHlwZS5JbnRlZ2VyXG4gICAgICAgIH0pLFxuICAgICAgW0ZpbHRlclR5cGUuRE9VQkxFXTogKCkgPT4gbmV3IEN1cnJlbmN5RmllbGQoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLkRvdWJsZSB9KSxcbiAgICAgIFtGaWx0ZXJUeXBlLlNFQVJDSF06ICgpID0+IHRoaXMuY3JlYXRlQXV0b2NvbXBsZXRlRmllbGQoZmllbGQsIGZpbHRlcilcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNyZWF0b3JzW3R5cGVdKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJhZGlvQnV0dG9uKGZpZWxkOiBGaWVsZENvbmZpZykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXG4gICAgICB7IGxhYmVsOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9Lnllc2ApLCB2YWx1ZTogdHJ1ZSB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5ub2ApLCB2YWx1ZTogZmFsc2UgfVxuICAgIF0gYXMgUmF0aW9uQnV0dG9uT3B0aW9uW107XG5cbiAgICByZXR1cm4gbmV3IFJhZGlvQnV0dG9uRmllbGQoeyAuLi5maWVsZCwgdHlwZTogRmllbGRUeXBlLlJhZGlvLCBvcHRpb25zIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDYWxlbmRhcihjb25maWc6IENhbGVuZGFyRmllbGRDb25maWcpIHtcbiAgICBjb25zdCBjYWxlbmRhciA9IG5ldyBDYWxlbmRhckZpZWxkKGNvbmZpZyk7XG4gICAgY2FsZW5kYXIuY2FsZW5kYXJMb2NhbGVPcHRpb25zID0gdGhpcy5jYWxlbmRhck9wdGlvbnNTZXJ2aWNlLmdldE9wdGlvbnMoKTtcbiAgICBpZiAoIXRoaXMuaXNNb2RhbCkgY2FsZW5kYXIuYXBwZW5kVG8gPSAnYm9keSc7XG4gICAgcmV0dXJuIGNhbGVuZGFyO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBdXRvY29tcGxldGVGaWVsZChmaWVsZDogRmllbGRDb25maWcsIHsgZGVwZW5kc09uLCBzZWFyY2gsIGRvbWFpbiwgbmFtZSB9OiBGaWx0ZXIpIHtcbiAgICBjb25zdCBzdWdnZXN0aW9uc09ic2VydmFibGUgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgY29uc3QgeyBxdWVyeVBhcmFtIH0gPSBnZXRTZWFyY2hUeXBlKHNlYXJjaCkuaW5wdXQ7XG4gICAgY29uc3QgeyBkaXNwbGF5RmllbGRzLCBrZXlGaWVsZHMsIHJlc3VsdERhdGFKc29uUGF0aCwgZGlzcGxheUZpZWxkQ29uY2F0VG9rZW4sIG1heFNlbGVjdGVkSXRlbXMgfSA9IGdldFNlYXJjaFR5cGUoc2VhcmNoKS5vdXRwdXQ7XG4gICAgY29uc3QgZmlsdGVySWQgPSBnZXRGaWx0ZXJJZChkb21haW4sIG5hbWUpO1xuICAgIGNvbnN0IHN1Z2dlc3Rpb25zRXJyb3IgPSAobWVzc2FnZUVycm9yPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlRGV0YWlsID0gbWVzc2FnZUVycm9yID8gbWVzc2FnZUVycm9yIDogdGhpcy50cmFuc2xhdGUuaW5zdGFudChgJHtUUkFOU0xBVEVfUFJFRklYfS5maW5kX3N1Z2dlc3Rpb25zX2Vycm9yYCwgeyBhY3RpdmVGaWx0ZXJzOiB0aGlzLnRvdGFsRmlsdGVyc0FjdGl2ZSB9KVxuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAga2V5OiAnZmlsdGVyU2VydmljZVRvYXN0S2V5JyxcbiAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgIGxpZmU6IFRPQVNUX0xJRkUsXG4gICAgICAgIGRldGFpbDogbWVzc2FnZURldGFpbFxuICAgICAgfTtcbiAgICAgIHRoaXMuc2VuZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgfTtcbiAgICBjb25zdCBvblNlYXJjaCA9ICh2YWw6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgcGFyYW1zID0geyBbcXVlcnlQYXJhbV06IHZhbCB9O1xuICAgICAgZGVwZW5kc09uICYmIE9iamVjdC5hc3NpZ24ocGFyYW1zLCB0aGlzLmdldERlcGVuZGVuY2llc1ZhbHVlcyhkZXBlbmRzT24sIGRvbWFpbikpO1xuXG4gICAgICBjb25zdCBzZWFyY2hVcmwgPVxuICAgICAgICBzZWFyY2ggJiYgc2VhcmNoLnR5cGUgPT09ICdFTlRJVFknXG4gICAgICAgICAgPyB0aGlzLmdldEVudGl0eVNlYXJjaFVybChzZWFyY2guZW50aXR5U2VhcmNoLmlucHV0LCB2YWwsIGRlcGVuZHNPbilcbiAgICAgICAgICA6IGdldFNlYXJjaFR5cGUoc2VhcmNoKS5pbnB1dC51cmw7XG5cbiAgICAgIHRoaXMuZmlsdGVyU2VydmljZVxuICAgICAgICAuc2VhcmNoRmllbGRTdWdnZXN0aW9ucyhzZWFyY2hVcmwsIHBhcmFtcywgc2VhcmNoLnR5cGUpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIG1hcChyZXNwb25zZSA9PiBqc29uUGF0aChyZXNwb25zZSwgcmVzdWx0RGF0YUpzb25QYXRoKSksXG4gICAgICAgICAgbWFwKChzdWdnZXN0aW9uczogYW55W10pID0+IHRoaXMuYWRkU3VnZ2VzdGlvbkZpZWxkcyhzdWdnZXN0aW9ucywgZGlzcGxheUZpZWxkcywga2V5RmllbGRzLCBkaXNwbGF5RmllbGRDb25jYXRUb2tlbiwgZmlsdGVySWQpKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUocmVzdWx0ID0+IHtcbiAgICAgICAgICBzdWdnZXN0aW9uc09ic2VydmFibGUubmV4dChyZXN1bHQpO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBsZXQgbWVzc2FnZUVycm9yID0gdW5kZWZpbmVkXG4gICAgICAgICAgaWYgKGVycm9yICYmIGVycm9yLmVycm9yLm1lc3NhZ2UpIG1lc3NhZ2VFcnJvciA9IGVycm9yLmVycm9yLm1lc3NhZ2VcbiAgICAgICAgICBzdWdnZXN0aW9uc0Vycm9yKG1lc3NhZ2VFcnJvcilcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgQXV0b2NvbXBsZXRlRmllbGQoe1xuICAgICAgLi4uZmllbGQsXG4gICAgICBvblNlYXJjaCxcbiAgICAgIGFwcGVuZFRvOiAnYm9keScsXG4gICAgICBzdWdnZXN0aW9uc09ic2VydmFibGUsXG4gICAgICBkaXNwbGF5RmllbGQ6IHNlYXJjaERpc3BsYXlOYW1lLFxuICAgICAgZGF0YUtleTogc2VhcmNoS2V5TmFtZSxcbiAgICAgIG11bHRpcGxlOiBtYXhTZWxlY3RlZEl0ZW1zID4gMSxcbiAgICAgIHNpemU6IHsgbGc6IDEyLCBtZDogMTIsIHhsOiAxMiB9LFxuICAgICAgZW1wdHlNZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KGAke1RSQU5TTEFURV9QUkVGSVh9LnNlYXJjaF9lbXB0eV9tZXNzYWdlYClcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RW50aXR5U2VhcmNoVXJsKHNlYXJjaDogRW50aXR5U2VhcmNoSW5wdXQsIHZhbHVlOiBzdHJpbmcsIGRlcGVuZHNPbjogRGVwZW5kc09uW10pIHtcbiAgICBjb25zdCB7IGF0dHJpYnV0ZXMsIGRvbWFpbk5hbWUsIGVudGl0eU5hbWUsIHNlcnZpY2VOYW1lIH0gPSBzZWFyY2g7XG4gICAgY29uc3QgdXJsID0gYCR7ZG9tYWluTmFtZX0vJHtzZXJ2aWNlTmFtZX0vZW50aXRpZXMvJHtlbnRpdHlOYW1lfS8/ZmlsdGVyPWA7XG4gICAgY29uc3QgZmlsdGVyczogYW55ID0gYXR0cmlidXRlcy5tYXAoYXR0ciA9PiBmaWx0ZXJPcGVyYXRvcnNbYXR0ci5jb21wYXJhdG9yXShhdHRyLm5hbWUsIHZhbHVlKSk7XG5cbiAgICBkZXBlbmRzT24gJiZcbiAgICAgIGRlcGVuZHNPbi5mb3JFYWNoKG9iaiA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluTmFtZSwgb2JqLmZpbHRlck5hbWUpO1xuICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdGhpcy5mb3JtRmlsdGVyc1tmaWx0ZXJJZF0udmFsdWVbc2VhcmNoS2V5TmFtZV07XG4gICAgICAgIGZpbHRlcnMucHVzaChgJHtvYmouZW50aXR5QXR0cmlidXRlfSBlcSAnJHtmaWVsZFZhbHVlfSdgKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gTyByZWdleCBhcGVuYXMgc2VsZWNpb25hIGFzIHZpcmd1bGFzIGlnbm9yYW5kbyBhcyBxdWUgZXN0aXZlcmVtIGRlbnRybyBkbyAoKVxuICAgIHJldHVybiB1cmwuY29uY2F0KGZpbHRlcnMpLnJlcGxhY2UoL1ssXSsoPyFbXihdKlspXSkvZywgYCAke3NlYXJjaC5vcGVyYXRvcn0gYCk7XG4gIH1cblxuICBwcml2YXRlIGFkZFN1Z2dlc3Rpb25GaWVsZHMoc3VnZ2VzdGlvbnM6IGFueVtdLCBkaXNwbGF5RmllbGRzOiBzdHJpbmdbXSwga2V5RmllbGRzOiBzdHJpbmdbXSwgc2VwYXJhdG9yOiBzdHJpbmcsIGZpbHRlcklkOiBzdHJpbmcpIHtcbiAgICBjb25zdCBhZGRWYWx1ZSA9IChhY2M6IHN0cmluZywgdmFsdWU6IGFueSwgdG9rZW46IHN0cmluZykgPT4gKGFjYyA/IGAke2FjY30ke3Rva2VufSR7dmFsdWV9YCA6IHZhbHVlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHN1Z2dlc3Rpb25zLm1hcChzdWdnZXN0aW9uID0+ICh7XG4gICAgICAuLi5zdWdnZXN0aW9uLFxuICAgICAgW3NlYXJjaERpc3BsYXlOYW1lXTogZGlzcGxheUZpZWxkcy5yZWR1Y2UoKHZhbHVlLCBkaXNwbGF5KSA9PiB7XG4gICAgICAgIHJldHVybiBhZGRWYWx1ZSh2YWx1ZSwgdGhpcy50cmFuc2xhdGUuaW5zdGFudChzdWdnZXN0aW9uW2Rpc3BsYXldKSwgc2VwYXJhdG9yKTtcbiAgICAgIH0sICcnKSxcbiAgICAgIFtzZWFyY2hLZXlOYW1lXToga2V5RmllbGRzLnJlZHVjZSgodmFsdWUsIGtleSkgPT4gYWRkVmFsdWUodmFsdWUsIHN1Z2dlc3Rpb25ba2V5XSwgJywgJyksICcnKVxuICAgIH0pKTtcbiAgICB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXS5pbnZhbGlkVmFsdWUgPSByZXN1bHQubGVuZ3RoID09PSAwO1xuXG4gICAgcmV0dXJuIHJlc3VsdC5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHZhbHVlLmZpbmRJbmRleCgoaTogYW55KSA9PiBpLiQkX19rZXlWYWx1ZV9fID09PSBpdGVtLiQkX19rZXlWYWx1ZV9fKTtcbiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkge1xuICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RGVwZW5kZW5jaWVzVmFsdWVzKGRlcGVuZGVuY2llczogRGVwZW5kc09uW10sIGRvbWFpbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGRlcGVuZGVuY2llcy5yZWR1Y2UoKHBhcmFtcywgeyBmaWx0ZXJOYW1lIH0pID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcklkID0gZ2V0RmlsdGVySWQoZG9tYWluLCBmaWx0ZXJOYW1lKTtcbiAgICAgIGlmICh0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCB0eXBlIH0gPSB0aGlzLmZvcm1GaWx0ZXJzW2ZpbHRlcklkXTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdFTlVNRVJBVElPTicpIHtcbiAgICAgICAgICBwYXJhbXNbZmlsdGVyTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHBhcmFtc1tmaWx0ZXJOYW1lXSA9IHZhbHVlLm1hcChhcnIgPT4gYXJyW3NlYXJjaEtleU5hbWVdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyYW1zW2ZpbHRlck5hbWVdID0gdmFsdWUgPyB2YWx1ZVtzZWFyY2hLZXlOYW1lXSA6IFsnJ107XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuSXNFbXB0eShwYXJhbXNbZmlsdGVyTmFtZV0pICYmIGRlbGV0ZSBwYXJhbXNbZmlsdGVyTmFtZV07XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgICB9XG4gICAgfSwge30pO1xuICB9XG5cbiAgLypcbiAgICogVmVyaWZpY2Egc2UgbyB2YWxvciBpbmZvcm1hZG8gw6kgZmFsc28sIGVtIGFycmF5cywgw6kgdmVyaWZpY2FkbyBjYWRhIGl0ZW1cbiAgICovXG4gIHByaXZhdGUgSXNFbXB0eSh2YWx1ZTogYW55KSB7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZXZlcnkoZGF0YSA9PiAhZGF0YSkgOiAhdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGZvcm1hdCB0byBzcGVjaWZ5IGZvciBpbnRlZ2VyIHR5cGUgZmllbGRcbiAgICovXG4gIHByaXZhdGUgb3B0aW9uc0ludGVnZXIoKSB7XG4gICAgcmV0dXJuIHsgY3VycmVuY3lTeW1ib2w6ICcnLCBkZWNpbWFsU2VwYXJhdG9yOiAnJywgdGhvdXNhbmRzU2VwYXJhdG9yOiAnJyB9O1xuICB9XG59XG4iXX0=
|