@snabcentr/client-ui 3.47.7 → 3.48.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.
Files changed (27) hide show
  1. package/catalog/catalog-filters/index.d.ts +3 -0
  2. package/catalog/catalog-filters/sc-catalog-filters.component.d.ts +99 -0
  3. package/catalog/catalog-filters/tokens/sc-catalog-products-filters.d.ts +7 -0
  4. package/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.d.ts +5 -0
  5. package/catalog/index.d.ts +1 -0
  6. package/configurators/sandwich/sc-sandwich.component.d.ts +9 -1
  7. package/esm2022/catalog/catalog-filters/index.mjs +4 -0
  8. package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +202 -0
  9. package/esm2022/catalog/catalog-filters/tokens/sc-catalog-products-filters.mjs +10 -0
  10. package/esm2022/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.mjs +6 -0
  11. package/esm2022/catalog/index.mjs +2 -1
  12. package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +22 -11
  13. package/esm2022/methods/index.mjs +2 -0
  14. package/esm2022/methods/sc-get-current-route.mjs +14 -0
  15. package/esm2022/pages/frequently-asked-questions-with-groups/sc-frequently-asked-questions-with-groups.component.mjs +3 -2
  16. package/esm2022/providers/index.mjs +2 -1
  17. package/esm2022/providers/sc-category.providers.mjs +43 -0
  18. package/esm2022/public-api.mjs +2 -1
  19. package/fesm2022/snabcentr-client-ui.mjs +414 -157
  20. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  21. package/methods/index.d.ts +1 -0
  22. package/methods/sc-get-current-route.d.ts +8 -0
  23. package/package.json +19 -19
  24. package/providers/index.d.ts +1 -0
  25. package/providers/sc-category.providers.d.ts +11 -0
  26. package/public-api.d.ts +1 -0
  27. package/styles/tailwind/tailwind.scss +5 -1
@@ -0,0 +1,3 @@
1
+ export * from './tokens/sc-catalog-products-filters';
2
+ export * from './tokens/sc-catalog-show-products-recursively';
3
+ export * from './sc-catalog-filters.component';
@@ -0,0 +1,99 @@
1
+ import { FormControl, FormGroup } from '@angular/forms';
2
+ import { ScCatalogFilter, ScICheckboxFilter, ScPropertyFilters, ScRangeFilter, ScToggleFilter } from '@snabcentr/client-core';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Компонент вывода фильтров каталога.
6
+ */
7
+ export declare class ScCatalogFiltersComponent {
8
+ /**
9
+ * Состояние открытия accordion.
10
+ */
11
+ readonly isOpenAccordion: import("@angular/core").InputSignal<boolean>;
12
+ /**
13
+ * Сервис для работы с фильтрами каталога.
14
+ */
15
+ private readonly catalogFilterService;
16
+ /**
17
+ * Пайп, возвращающий идентификатор или символьное обозначение (slug) исходя из настроек окружения.
18
+ */
19
+ private readonly idOrSlugPipe;
20
+ /**
21
+ * Subject для хранения фильтров продуктов.
22
+ */
23
+ private readonly catalogProductsFilters$;
24
+ /**
25
+ * Признак необходимости отображать фильтры для вложенных категорий.
26
+ */
27
+ private readonly isRecursively;
28
+ /**
29
+ * {@link Observable} фильтров категории.
30
+ */
31
+ protected readonly filters: import("@angular/core").Signal<ScCatalogFilter[]>;
32
+ /**
33
+ * FormGroup для фильтров.
34
+ */
35
+ readonly form: FormGroup<Record<string, FormControl<boolean> | FormGroup<Record<string, FormControl<boolean>>> | FormControl<[number, number]>>>;
36
+ /**
37
+ * Инициализирует экземпляр класса {@link ScCatalogFiltersComponent}.
38
+ */
39
+ constructor();
40
+ /**
41
+ * Обновляет состав контролов формы на основе переданных фильтров.
42
+ *
43
+ * @param filters Массив фильтров для создания контролов.
44
+ */
45
+ protected updateFormControls(filters: ScCatalogFilter[]): void;
46
+ /**
47
+ * Преобразует значения формы в объект фильтров свойств.
48
+ *
49
+ * @param value Значения формы.
50
+ * @returns Объект фильтров свойств.
51
+ */
52
+ protected buildPropertyFilters(value: Partial<Record<string, boolean | Record<string, boolean> | [number, number]>> | Record<string, unknown>): ScPropertyFilters;
53
+ /**
54
+ * Создает FormGroup для checkbox.
55
+ *
56
+ * @param checkboxFilter Фильтр типа checkbox.
57
+ */
58
+ protected createCheckboxFormControl(checkboxFilter: ScICheckboxFilter): FormGroup<Record<string, FormControl<boolean>>>;
59
+ /**
60
+ * Создает FormControl для range.
61
+ *
62
+ * @param rangeFilter Фильтр типа range.
63
+ */
64
+ protected createRangeFormControl(rangeFilter: ScRangeFilter): FormControl<[number, number]>;
65
+ /**
66
+ * Создает FormControl для toggle.
67
+ *
68
+ * @param toggleFilter Фильтр типа toggle.
69
+ */
70
+ protected createToggleFormControl(toggleFilter: ScToggleFilter): FormControl<boolean>;
71
+ /**
72
+ * Обрабатывает checkbox фильтр.
73
+ *
74
+ * @param result Объект результата для заполнения.
75
+ * @param filterId Идентификатор фильтра.
76
+ * @param controlValue Значение контрола формы.
77
+ */
78
+ private processCheckboxFilter;
79
+ /**
80
+ * Обрабатывает range фильтр.
81
+ *
82
+ * @param result Объект результата для заполнения.
83
+ * @param filterId Идентификатор фильтра.
84
+ * @param controlValue Значение контрола формы.
85
+ * @param controlValue.0 Начальное значение диапазона.
86
+ * @param controlValue.1 Конечное значение диапазона.
87
+ */
88
+ private processRangeFilter;
89
+ /**
90
+ * Обрабатывает toggle фильтр.
91
+ *
92
+ * @param result Объект результата для заполнения.
93
+ * @param filterId Идентификатор фильтра.
94
+ * @param controlValue Значение контрола формы.
95
+ */
96
+ private processToggleFilter;
97
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScCatalogFiltersComponent, never>;
98
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScCatalogFiltersComponent, "sc-catalog-filters", never, { "isOpenAccordion": { "alias": "isOpenAccordion"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
99
+ }
@@ -0,0 +1,7 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { ScPropertyFilters } from '@snabcentr/client-core';
3
+ import { Subject } from 'rxjs';
4
+ /**
5
+ * Токен для инъекции {@link Subject} для хранения фильтров продуктов.
6
+ */
7
+ export declare const SC_CATALOG_PRODUCTS_FILTERS: InjectionToken<Subject<ScPropertyFilters>>;
@@ -0,0 +1,5 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Токен для инъекции признака необходимости отображать фильтры для вложенных категорий.
4
+ */
5
+ export declare const SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY: InjectionToken<boolean>;
@@ -11,3 +11,4 @@ export * from './price-list-pagination/sc-price-list-pagination.component';
11
11
  export * from './price-warehouse-stock/sc-price-warehouse-stock.component';
12
12
  export * from './sc-favorite-button/sc-favorite-button.component';
13
13
  export * from './sc-catalog.module';
14
+ export * from './catalog-filters';
@@ -75,10 +75,18 @@ export declare class ScSandwichComponent implements OnInit {
75
75
  * Выбранный продукт (материал для раскроя).
76
76
  */
77
77
  protected readonly product: FormControl<ScProduct | null>;
78
+ /**
79
+ * {@link Observable} расчета оптимизации раскладки.
80
+ */
81
+ private readonly calculate$;
78
82
  /**
79
83
  * Результат расчета оптимизации раскладки.
80
84
  */
81
- protected readonly calculateResult$: Observable<ScIConfiguratorCalculateResult | null>;
85
+ protected readonly calculateResult$: Observable<ScIConfiguratorCalculateResult>;
86
+ /**
87
+ * Сигнал состояния загрузки расчета.
88
+ */
89
+ protected readonly isCalculateLoading: import("@angular/core").Signal<boolean>;
82
90
  /**
83
91
  * Валидатор для ширины изделия.
84
92
  */
@@ -0,0 +1,4 @@
1
+ export * from './tokens/sc-catalog-products-filters';
2
+ export * from './tokens/sc-catalog-show-products-recursively';
3
+ export * from './sc-catalog-filters.component';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9jYXRhbG9nLWZpbHRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLCtDQUErQyxDQUFDO0FBQzlELGNBQWMsZ0NBQWdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3Rva2Vucy9zYy1jYXRhbG9nLXByb2R1Y3RzLWZpbHRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi90b2tlbnMvc2MtY2F0YWxvZy1zaG93LXByb2R1Y3RzLXJlY3Vyc2l2ZWx5JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudCc7XG4iXX0=
@@ -0,0 +1,202 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';
3
+ import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
4
+ import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
+ import { ScCatalogFilterService, ScIdOrSlugPipe } from '@snabcentr/client-core';
6
+ import { tuiIsPresent } from '@taiga-ui/cdk';
7
+ import { TuiTextfield } from '@taiga-ui/core';
8
+ import { TuiAccordion } from '@taiga-ui/experimental';
9
+ import { TuiCheckbox, TuiInputRange } from '@taiga-ui/kit';
10
+ import { isNil } from 'lodash-es';
11
+ import { debounceTime, filter, map, share, switchMap, tap } from 'rxjs';
12
+ import { SC_CATEGORY_INFO } from '../../providers/sc-category.providers';
13
+ import { SC_CATALOG_PRODUCTS_FILTERS } from './tokens/sc-catalog-products-filters';
14
+ import { SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY } from './tokens/sc-catalog-show-products-recursively';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "@angular/forms";
17
+ import * as i2 from "@taiga-ui/kit";
18
+ import * as i3 from "@taiga-ui/experimental";
19
+ import * as i4 from "@taiga-ui/experimental/components/expand";
20
+ /**
21
+ * Компонент вывода фильтров каталога.
22
+ */
23
+ export class ScCatalogFiltersComponent {
24
+ /**
25
+ * Инициализирует экземпляр класса {@link ScCatalogFiltersComponent}.
26
+ */
27
+ constructor() {
28
+ /**
29
+ * Состояние открытия accordion.
30
+ */
31
+ this.isOpenAccordion = input(false);
32
+ /**
33
+ * Сервис для работы с фильтрами каталога.
34
+ */
35
+ this.catalogFilterService = inject(ScCatalogFilterService);
36
+ /**
37
+ * Пайп, возвращающий идентификатор или символьное обозначение (slug) исходя из настроек окружения.
38
+ */
39
+ this.idOrSlugPipe = inject(ScIdOrSlugPipe);
40
+ /**
41
+ * Subject для хранения фильтров продуктов.
42
+ */
43
+ this.catalogProductsFilters$ = inject(SC_CATALOG_PRODUCTS_FILTERS);
44
+ /**
45
+ * Признак необходимости отображать фильтры для вложенных категорий.
46
+ */
47
+ this.isRecursively = inject(SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY);
48
+ /**
49
+ * {@link Observable} фильтров категории.
50
+ */
51
+ this.filters = toSignal(inject(SC_CATEGORY_INFO).pipe(filter(tuiIsPresent), switchMap((category) => this.catalogFilterService.getFilters$(this.idOrSlugPipe.transform(category), this.isRecursively)), map((filters) => filters.filter((item) => item.type !== 'range' || item.min !== item.max)), tap((filters) => {
52
+ // Обновляем состав контролов формы на основе полученных фильтров.
53
+ this.updateFormControls(filters);
54
+ }), share()), { initialValue: [] });
55
+ /**
56
+ * FormGroup для фильтров.
57
+ */
58
+ this.form = new FormGroup({});
59
+ this.form.valueChanges.pipe(debounceTime(0), takeUntilDestroyed()).subscribe((filters) => {
60
+ this.catalogProductsFilters$.next(this.buildPropertyFilters(filters));
61
+ });
62
+ }
63
+ /**
64
+ * Обновляет состав контролов формы на основе переданных фильтров.
65
+ *
66
+ * @param filters Массив фильтров для создания контролов.
67
+ */
68
+ updateFormControls(filters) {
69
+ Object.keys(this.form.controls).forEach((key) => {
70
+ this.form.removeControl(key, { emitEvent: false });
71
+ });
72
+ filters.forEach((item) => {
73
+ switch (item.type) {
74
+ case 'checkbox':
75
+ this.form.addControl(item.id, this.createCheckboxFormControl(item), { emitEvent: false });
76
+ break;
77
+ case 'range':
78
+ this.form.addControl(item.id, this.createRangeFormControl(item), { emitEvent: false });
79
+ break;
80
+ case 'toggle':
81
+ this.form.addControl(item.id, this.createToggleFormControl(item), { emitEvent: false });
82
+ break;
83
+ default:
84
+ break;
85
+ }
86
+ });
87
+ this.form.updateValueAndValidity();
88
+ }
89
+ /**
90
+ * Преобразует значения формы в объект фильтров свойств.
91
+ *
92
+ * @param value Значения формы.
93
+ * @returns Объект фильтров свойств.
94
+ */
95
+ buildPropertyFilters(value) {
96
+ const result = {};
97
+ this.filters().forEach((filterItem) => {
98
+ const controlValue = value[filterItem.id];
99
+ if (isNil(controlValue)) {
100
+ return;
101
+ }
102
+ switch (filterItem.type) {
103
+ case 'checkbox':
104
+ this.processCheckboxFilter(result, filterItem.id, controlValue);
105
+ break;
106
+ case 'range':
107
+ this.processRangeFilter(result, filterItem.id, controlValue);
108
+ break;
109
+ case 'toggle':
110
+ this.processToggleFilter(result, filterItem.id, controlValue);
111
+ break;
112
+ default:
113
+ break;
114
+ }
115
+ });
116
+ return result;
117
+ }
118
+ /**
119
+ * Создает FormGroup для checkbox.
120
+ *
121
+ * @param checkboxFilter Фильтр типа checkbox.
122
+ */
123
+ createCheckboxFormControl(checkboxFilter) {
124
+ const controls = {};
125
+ checkboxFilter.values.forEach((value) => {
126
+ controls[value.id] = new FormControl(false, { nonNullable: true });
127
+ });
128
+ return new FormGroup(controls);
129
+ }
130
+ /**
131
+ * Создает FormControl для range.
132
+ *
133
+ * @param rangeFilter Фильтр типа range.
134
+ */
135
+ createRangeFormControl(rangeFilter) {
136
+ // TODO: Добавить updateOn: 'blur' после исправления бага в taiga-ui.
137
+ return new FormControl([Number(rangeFilter.selectedMin ?? rangeFilter.min), Number(rangeFilter.selectedMax ?? rangeFilter.max)], { nonNullable: true });
138
+ }
139
+ /**
140
+ * Создает FormControl для toggle.
141
+ *
142
+ * @param toggleFilter Фильтр типа toggle.
143
+ */
144
+ createToggleFormControl(toggleFilter) {
145
+ return new FormControl(toggleFilter.selectedValue ?? false, { nonNullable: true });
146
+ }
147
+ /**
148
+ * Обрабатывает checkbox фильтр.
149
+ *
150
+ * @param result Объект результата для заполнения.
151
+ * @param filterId Идентификатор фильтра.
152
+ * @param controlValue Значение контрола формы.
153
+ */
154
+ processCheckboxFilter(result, filterId, controlValue) {
155
+ // Для checkbox: FormGroup с FormControl<boolean> -> string[] (массив ID выбранных значений)
156
+ const selectedIds = Object.entries(controlValue)
157
+ .filter(([, isSelected]) => isSelected)
158
+ .map(([id]) => id);
159
+ if (selectedIds.length > 0) {
160
+ // eslint-disable-next-line security/detect-object-injection, no-param-reassign
161
+ result[filterId] = selectedIds;
162
+ }
163
+ }
164
+ /**
165
+ * Обрабатывает range фильтр.
166
+ *
167
+ * @param result Объект результата для заполнения.
168
+ * @param filterId Идентификатор фильтра.
169
+ * @param controlValue Значение контрола формы.
170
+ * @param controlValue.0 Начальное значение диапазона.
171
+ * @param controlValue.1 Конечное значение диапазона.
172
+ */
173
+ processRangeFilter(result, filterId, [from, to]) {
174
+ // Для range: FormControl<[number, number]> -> { from?: string; to?: string; }
175
+ // eslint-disable-next-line security/detect-object-injection, no-param-reassign
176
+ result[filterId] = {
177
+ from: String(from),
178
+ to: String(to),
179
+ };
180
+ }
181
+ /**
182
+ * Обрабатывает toggle фильтр.
183
+ *
184
+ * @param result Объект результата для заполнения.
185
+ * @param filterId Идентификатор фильтра.
186
+ * @param controlValue Значение контрола формы.
187
+ */
188
+ processToggleFilter(result, filterId, controlValue) {
189
+ // Для toggle: FormControl<boolean> -> boolean
190
+ if (controlValue) {
191
+ // eslint-disable-next-line security/detect-object-injection, no-param-reassign
192
+ result[filterId] = controlValue;
193
+ }
194
+ }
195
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
196
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { isOpenAccordion: { classPropertyName: "isOpenAccordion", publicName: "isOpenAccordion", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (filters().length) {\n <div class=\"bg-tui-base-01 shadow-sc mb-4 flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "component", type: i2.TuiInputRangeComponent, selector: "tui-input-range", inputs: ["min", "max", "step", "segments", "keySteps", "prefix", "postfix", "quantum", "content"] }, { kind: "component", type: i3.TuiAccordionComponent, selector: "tui-accordion", inputs: ["closeOthers", "size"] }, { kind: "directive", type: i3.TuiAccordionDirective, selector: "button[tuiAccordion]", inputs: ["tuiAccordion"], outputs: ["tuiAccordionChange"] }, { kind: "component", type: i4.TuiExpand, selector: "tui-expand", inputs: ["expanded"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
197
+ }
198
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, decorators: [{
199
+ type: Component,
200
+ args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, TuiTextfield, TuiCheckbox, TuiInputRange, TuiAccordion, ReactiveFormsModule], template: "@if (filters().length) {\n <div class=\"bg-tui-base-01 shadow-sc mb-4 flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"] }]
201
+ }], ctorParameters: () => [] });
202
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9jYXRhbG9nL2NhdGFsb2ctZmlsdGVycy9zYy1jYXRhbG9nLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFFM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQW1CLHNCQUFzQixFQUFxQixjQUFjLEVBQW9ELE1BQU0sd0JBQXdCLENBQUM7QUFDdEssT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLCtDQUErQyxDQUFDOzs7Ozs7QUFFckc7O0dBRUc7QUFTSCxNQUFNLE9BQU8seUJBQXlCO0lBa0RsQzs7T0FFRztJQUNIO1FBcERBOztXQUVHO1FBQ2Esb0JBQWUsR0FBRyxLQUFLLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFeEQ7O1dBRUc7UUFDYyx5QkFBb0IsR0FBMkIsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFL0Y7O1dBRUc7UUFDYyxpQkFBWSxHQUFtQixNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFdkU7O1dBRUc7UUFDYyw0QkFBdUIsR0FBRyxNQUFNLENBQUMsMkJBQTJCLENBQUMsQ0FBQztRQUUvRTs7V0FFRztRQUNjLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7UUFFOUU7O1dBRUc7UUFDZ0IsWUFBTyxHQUFHLFFBQVEsQ0FDakMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUN6QixNQUFNLENBQUMsWUFBWSxDQUFDLEVBQ3BCLFNBQVMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsRUFDekgsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUMxRixHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNaLGtFQUFrRTtZQUNsRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxFQUFFLENBQ1YsRUFDRCxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsQ0FDdkIsQ0FBQztRQUVGOztXQUVHO1FBQ2EsU0FBSSxHQUFHLElBQUksU0FBUyxDQUVsQyxFQUFFLENBQUMsQ0FBQztRQU1GLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ3JGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLGtCQUFrQixDQUFDLE9BQTBCO1FBQ25ELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoRSxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEIsS0FBSyxVQUFVO29CQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQzFGLE1BQU07Z0JBQ1YsS0FBSyxPQUFPO29CQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ3ZGLE1BQU07Z0JBQ1YsS0FBSyxRQUFRO29CQUNULElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7b0JBQ3hGLE1BQU07Z0JBQ1Y7b0JBQ0ksTUFBTTtZQUNkLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDTyxvQkFBb0IsQ0FBQyxLQUE4RztRQUN6SSxNQUFNLE1BQU0sR0FBc0IsRUFBRSxDQUFDO1FBRXJDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRTtZQUNsQyxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBcUUsQ0FBQztZQUU5RyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUN0QixPQUFPO1lBQ1gsQ0FBQztZQUVELFFBQVEsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QixLQUFLLFVBQVU7b0JBQ1gsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFlBQXVDLENBQUMsQ0FBQztvQkFDM0YsTUFBTTtnQkFDVixLQUFLLE9BQU87b0JBQ1IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFlBQWdDLENBQUMsQ0FBQztvQkFDakYsTUFBTTtnQkFDVixLQUFLLFFBQVE7b0JBQ1QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFlBQXVCLENBQUMsQ0FBQztvQkFDekUsTUFBTTtnQkFDVjtvQkFDSSxNQUFNO1lBQ2QsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyx5QkFBeUIsQ0FBQyxjQUFpQztRQUNqRSxNQUFNLFFBQVEsR0FBeUMsRUFBRSxDQUFDO1FBQzFELGNBQWMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDcEMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLFdBQVcsQ0FBQyxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sSUFBSSxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxzQkFBc0IsQ0FBQyxXQUEwQjtRQUN2RCxxRUFBcUU7UUFDckUsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzVKLENBQUM7SUFFRDs7OztPQUlHO0lBQ08sdUJBQXVCLENBQUMsWUFBNEI7UUFDMUQsT0FBTyxJQUFJLFdBQVcsQ0FBQyxZQUFZLENBQUMsYUFBYSxJQUFJLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxxQkFBcUIsQ0FBQyxNQUF5QixFQUFFLFFBQWdCLEVBQUUsWUFBcUM7UUFDNUcsNEZBQTRGO1FBQzVGLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO2FBQzNDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDO2FBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRXZCLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QiwrRUFBK0U7WUFDL0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUNuQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssa0JBQWtCLENBQUMsTUFBeUIsRUFBRSxRQUFnQixFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBbUI7UUFDaEcsOEVBQThFO1FBQzlFLCtFQUErRTtRQUMvRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUc7WUFDZixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNsQixFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztTQUNqQixDQUFDO0lBQ04sQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLG1CQUFtQixDQUFDLE1BQXlCLEVBQUUsUUFBZ0IsRUFBRSxZQUFxQjtRQUMxRiw4Q0FBOEM7UUFDOUMsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNmLCtFQUErRTtZQUMvRSxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsWUFBWSxDQUFDO1FBQ3BDLENBQUM7SUFDTCxDQUFDOytHQTdNUSx5QkFBeUI7bUdBQXpCLHlCQUF5QixnUEM1QnRDLDR5RkE2REEsaUpEbkNjLFdBQVcsNmpCQUFnQixXQUFXLDJuQkFBK0IsbUJBQW1COzs0RkFFekYseUJBQXlCO2tCQVJyQyxTQUFTO2lDQUNNLElBQUksWUFDTixvQkFBb0IsbUJBR2IsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgaW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFNjQ2F0YWxvZ0ZpbHRlciwgU2NDYXRhbG9nRmlsdGVyU2VydmljZSwgU2NJQ2hlY2tib3hGaWx0ZXIsIFNjSWRPclNsdWdQaXBlLCBTY1Byb3BlcnR5RmlsdGVycywgU2NSYW5nZUZpbHRlciwgU2NUb2dnbGVGaWx0ZXIgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUlzUHJlc2VudCB9IGZyb20gJ0B0YWlnYS11aS9jZGsnO1xuaW1wb3J0IHsgVHVpVGV4dGZpZWxkIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVHVpQWNjb3JkaW9uIH0gZnJvbSAnQHRhaWdhLXVpL2V4cGVyaW1lbnRhbCc7XG5pbXBvcnQgeyBUdWlDaGVja2JveCwgVHVpSW5wdXRSYW5nZSB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuaW1wb3J0IHsgaXNOaWwgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIG1hcCwgc2hhcmUsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNDX0NBVEVHT1JZX0lORk8gfSBmcm9tICcuLi8uLi9wcm92aWRlcnMvc2MtY2F0ZWdvcnkucHJvdmlkZXJzJztcbmltcG9ydCB7IFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyB9IGZyb20gJy4vdG9rZW5zL3NjLWNhdGFsb2ctcHJvZHVjdHMtZmlsdGVycyc7XG5pbXBvcnQgeyBTQ19DQVRBTE9HX1NIT1dfUFJPRFVDVFNfUkVDVVJTSVZFTFkgfSBmcm9tICcuL3Rva2Vucy9zYy1jYXRhbG9nLXNob3ctcHJvZHVjdHMtcmVjdXJzaXZlbHknO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQstGL0LLQvtC00LAg0YTQuNC70YzRgtGA0L7QsiDQutCw0YLQsNC70L7Qs9CwLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2MtY2F0YWxvZy1maWx0ZXJzJyxcbiAgICBzdHlsZVVybDogJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIFR1aVRleHRmaWVsZCwgVHVpQ2hlY2tib3gsIFR1aUlucHV0UmFuZ2UsIFR1aUFjY29yZGlvbiwgUmVhY3RpdmVGb3Jtc01vZHVsZV0sXG59KVxuZXhwb3J0IGNsYXNzIFNjQ2F0YWxvZ0ZpbHRlcnNDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqINCh0L7RgdGC0L7Rj9C90LjQtSDQvtGC0LrRgNGL0YLQuNGPIGFjY29yZGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgaXNPcGVuQWNjb3JkaW9uID0gaW5wdXQ8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0YTQuNC70YzRgtGA0LDQvNC4INC60LDRgtCw0LvQvtCz0LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nRmlsdGVyU2VydmljZTogU2NDYXRhbG9nRmlsdGVyU2VydmljZSA9IGluamVjdChTY0NhdGFsb2dGaWx0ZXJTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCf0LDQudC/LCDQstC+0LfQstGA0LDRidCw0Y7RidC40Lkg0LjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LjQu9C4INGB0LjQvNCy0L7Qu9GM0L3QvtC1INC+0LHQvtC30L3QsNGH0LXQvdC40LUgKHNsdWcpINC40YHRhdC+0LTRjyDQuNC3INC90LDRgdGC0YDQvtC10Log0L7QutGA0YPQttC10L3QuNGPLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaWRPclNsdWdQaXBlOiBTY0lkT3JTbHVnUGlwZSA9IGluamVjdChTY0lkT3JTbHVnUGlwZSk7XG5cbiAgICAvKipcbiAgICAgKiBTdWJqZWN0INC00LvRjyDRhdGA0LDQvdC10L3QuNGPINGE0LjQu9GM0YLRgNC+0LIg0L/RgNC+0LTRg9C60YLQvtCyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZ1Byb2R1Y3RzRmlsdGVycyQgPSBpbmplY3QoU0NfQ0FUQUxPR19QUk9EVUNUU19GSUxURVJTKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6INC90LXQvtCx0YXQvtC00LjQvNC+0YHRgtC4INC+0YLQvtCx0YDQsNC20LDRgtGMINGE0LjQu9GM0YLRgNGLINC00LvRjyDQstC70L7QttC10L3QvdGL0YUg0LrQsNGC0LXQs9C+0YDQuNC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgaXNSZWN1cnNpdmVseSA9IGluamVjdChTQ19DQVRBTE9HX1NIT1dfUFJPRFVDVFNfUkVDVVJTSVZFTFkpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGE0LjQu9GM0YLRgNC+0LIg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmaWx0ZXJzID0gdG9TaWduYWwoXG4gICAgICAgIGluamVjdChTQ19DQVRFR09SWV9JTkZPKS5waXBlKFxuICAgICAgICAgICAgZmlsdGVyKHR1aUlzUHJlc2VudCksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGNhdGVnb3J5KSA9PiB0aGlzLmNhdGFsb2dGaWx0ZXJTZXJ2aWNlLmdldEZpbHRlcnMkKHRoaXMuaWRPclNsdWdQaXBlLnRyYW5zZm9ybShjYXRlZ29yeSksIHRoaXMuaXNSZWN1cnNpdmVseSkpLFxuICAgICAgICAgICAgbWFwKChmaWx0ZXJzKSA9PiBmaWx0ZXJzLmZpbHRlcigoaXRlbSkgPT4gaXRlbS50eXBlICE9PSAncmFuZ2UnIHx8IGl0ZW0ubWluICE9PSBpdGVtLm1heCkpLFxuICAgICAgICAgICAgdGFwKChmaWx0ZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8g0J7QsdC90L7QstC70Y/QtdC8INGB0L7RgdGC0LDQsiDQutC+0L3RgtGA0L7Qu9C+0LIg0YTQvtGA0LzRiyDQvdCwINC+0YHQvdC+0LLQtSDQv9C+0LvRg9GH0LXQvdC90YvRhSDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xzKGZpbHRlcnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgICksXG4gICAgICAgIHsgaW5pdGlhbFZhbHVlOiBbXSB9XG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1Hcm91cCDQtNC70Y8g0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8XG4gICAgICAgIFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIHRoaXMuY3JlYXRlQ2hlY2tib3hGb3JtQ29udHJvbD4gfCBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmNyZWF0ZVJhbmdlRm9ybUNvbnRyb2w+IHwgUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5jcmVhdGVUb2dnbGVGb3JtQ29udHJvbD4+XG4gICAgPih7fSk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjQ2F0YWxvZ0ZpbHRlcnNDb21wb25lbnR9LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJC5uZXh0KHRoaXMuYnVpbGRQcm9wZXJ0eUZpbHRlcnMoZmlsdGVycykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0L3QvtCy0LvRj9C10YIg0YHQvtGB0YLQsNCyINC60L7QvdGC0YDQvtC70L7QsiDRhNC+0YDQvNGLINC90LAg0L7RgdC90L7QstC1INC/0LXRgNC10LTQsNC90L3Ri9GFINGE0LjQu9GM0YLRgNC+0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVycyDQnNCw0YHRgdC40LIg0YTQuNC70YzRgtGA0L7QsiDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDQutC+0L3RgtGA0L7Qu9C+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Db250cm9scyhmaWx0ZXJzOiBTY0NhdGFsb2dGaWx0ZXJbXSk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChrZXkgYXMgbmV2ZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGl0ZW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVSYW5nZUZvcm1Db250cm9sKGl0ZW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGl0ZW0uaWQsIHRoaXMuY3JlYXRlVG9nZ2xlRm9ybUNvbnRyb2woaXRlbSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC10L7QsdGA0LDQt9GD0LXRgiDQt9C90LDRh9C10L3QuNGPINGE0L7RgNC80Ysg0LIg0L7QsdGK0LXQutGCINGE0LjQu9GM0YLRgNC+0LIg0YHQstC+0LnRgdGC0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdmFsdWUg0JfQvdCw0YfQtdC90LjRjyDRhNC+0YDQvNGLLlxuICAgICAqIEByZXR1cm5zINCe0LHRitC10LrRgiDRhNC40LvRjNGC0YDQvtCyINGB0LLQvtC50YHRgtCyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBidWlsZFByb3BlcnR5RmlsdGVycyh2YWx1ZTogUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuIHwgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gfCBbbnVtYmVyLCBudW1iZXJdPj4gfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFNjUHJvcGVydHlGaWx0ZXJzIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMuZmlsdGVycygpLmZvckVhY2goKGZpbHRlckl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2xWYWx1ZSA9IHZhbHVlW2ZpbHRlckl0ZW0uaWRdIGFzIGJvb2xlYW4gfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPiB8IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGlmIChpc05pbChjb250cm9sVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzd2l0Y2ggKGZpbHRlckl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2hlY2tib3hGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLmlkLCBjb250cm9sVmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdyYW5nZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1JhbmdlRmlsdGVyKHJlc3VsdCwgZmlsdGVySXRlbS5pZCwgY29udHJvbFZhbHVlIGFzIFtudW1iZXIsIG51bWJlcl0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd0b2dnbGUnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NUb2dnbGVGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLmlkLCBjb250cm9sVmFsdWUgYXMgYm9vbGVhbik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDQtdGCIEZvcm1Hcm91cCDQtNC70Y8gY2hlY2tib3guXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tib3hGaWx0ZXIg0KTQuNC70YzRgtGAINGC0LjQv9CwIGNoZWNrYm94LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGNoZWNrYm94RmlsdGVyOiBTY0lDaGVja2JveEZpbHRlcik6IEZvcm1Hcm91cDxSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbDxib29sZWFuPj4+IHtcbiAgICAgICAgY29uc3QgY29udHJvbHM6IFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+PiA9IHt9O1xuICAgICAgICBjaGVja2JveEZpbHRlci52YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnRyb2xzW3ZhbHVlLmlkXSA9IG5ldyBGb3JtQ29udHJvbChmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoY29udHJvbHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDQtdGCIEZvcm1Db250cm9sINC00LvRjyByYW5nZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZUZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgcmFuZ2UuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVJhbmdlRm9ybUNvbnRyb2wocmFuZ2VGaWx0ZXI6IFNjUmFuZ2VGaWx0ZXIpOiBGb3JtQ29udHJvbDxbbnVtYmVyLCBudW1iZXJdPiB7XG4gICAgICAgIC8vIFRPRE86INCU0L7QsdCw0LLQuNGC0YwgdXBkYXRlT246ICdibHVyJyDQv9C+0YHQu9C1INC40YHQv9GA0LDQstC70LXQvdC40Y8g0LHQsNCz0LAg0LIgdGFpZ2EtdWkuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woW051bWJlcihyYW5nZUZpbHRlci5zZWxlY3RlZE1pbiA/PyByYW5nZUZpbHRlci5taW4pLCBOdW1iZXIocmFuZ2VGaWx0ZXIuc2VsZWN0ZWRNYXggPz8gcmFuZ2VGaWx0ZXIubWF4KV0sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIgRm9ybUNvbnRyb2wg0LTQu9GPIHRvZ2dsZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB0b2dnbGVGaWx0ZXIg0KTQuNC70YzRgtGAINGC0LjQv9CwIHRvZ2dsZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlVG9nZ2xlRm9ybUNvbnRyb2wodG9nZ2xlRmlsdGVyOiBTY1RvZ2dsZUZpbHRlcik6IEZvcm1Db250cm9sPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbCh0b2dnbGVGaWx0ZXIuc2VsZWN0ZWRWYWx1ZSA/PyBmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIgY2hlY2tib3gg0YTQuNC70YzRgtGALlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCDQntCx0YrQtdC60YIg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPLlxuICAgICAqIEBwYXJhbSBmaWx0ZXJJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRhNC40LvRjNGC0YDQsC5cbiAgICAgKiBAcGFyYW0gY29udHJvbFZhbHVlINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDRhNC+0YDQvNGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc0NoZWNrYm94RmlsdGVyKHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMsIGZpbHRlcklkOiBzdHJpbmcsIGNvbnRyb2xWYWx1ZTogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4pOiB2b2lkIHtcbiAgICAgICAgLy8g0JTQu9GPIGNoZWNrYm94OiBGb3JtR3JvdXAg0YEgRm9ybUNvbnRyb2w8Ym9vbGVhbj4gLT4gc3RyaW5nW10gKNC80LDRgdGB0LjQsiBJRCDQstGL0LHRgNCw0L3QvdGL0YUg0LfQvdCw0YfQtdC90LjQuSlcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJZHMgPSBPYmplY3QuZW50cmllcyhjb250cm9sVmFsdWUpXG4gICAgICAgICAgICAuZmlsdGVyKChbLCBpc1NlbGVjdGVkXSkgPT4gaXNTZWxlY3RlZClcbiAgICAgICAgICAgIC5tYXAoKFtpZF0pID0+IGlkKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRJZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uLCBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgcmVzdWx0W2ZpbHRlcklkXSA9IHNlbGVjdGVkSWRzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCIHJhbmdlINGE0LjQu9GM0YLRgC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQg0J7QsdGK0LXQutGCINGA0LXQt9GD0LvRjNGC0LDRgtCwINC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjy5cbiAgICAgKiBAcGFyYW0gZmlsdGVySWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YTQuNC70YzRgtGA0LAuXG4gICAgICogQHBhcmFtIGNvbnRyb2xWYWx1ZSDQl9C90LDRh9C10L3QuNC1INC60L7QvdGC0YDQvtC70LAg0YTQvtGA0LzRiy5cbiAgICAgKiBAcGFyYW0gY29udHJvbFZhbHVlLjAg0J3QsNGH0LDQu9GM0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LTQuNCw0L/QsNC30L7QvdCwLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUuMSDQmtC+0L3QtdGH0L3QvtC1INC30L3QsNGH0LXQvdC40LUg0LTQuNCw0L/QsNC30L7QvdCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc1JhbmdlRmlsdGVyKHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMsIGZpbHRlcklkOiBzdHJpbmcsIFtmcm9tLCB0b106IFtudW1iZXIsIG51bWJlcl0pOiB2b2lkIHtcbiAgICAgICAgLy8g0JTQu9GPIHJhbmdlOiBGb3JtQ29udHJvbDxbbnVtYmVyLCBudW1iZXJdPiAtPiB7IGZyb20/OiBzdHJpbmc7IHRvPzogc3RyaW5nOyB9XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgcmVzdWx0W2ZpbHRlcklkXSA9IHtcbiAgICAgICAgICAgIGZyb206IFN0cmluZyhmcm9tKSxcbiAgICAgICAgICAgIHRvOiBTdHJpbmcodG8pLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiB0b2dnbGUg0YTQuNC70YzRgtGALlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCDQntCx0YrQtdC60YIg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPLlxuICAgICAqIEBwYXJhbSBmaWx0ZXJJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRhNC40LvRjNGC0YDQsC5cbiAgICAgKiBAcGFyYW0gY29udHJvbFZhbHVlINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDRhNC+0YDQvNGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgcHJvY2Vzc1RvZ2dsZUZpbHRlcihyZXN1bHQ6IFNjUHJvcGVydHlGaWx0ZXJzLCBmaWx0ZXJJZDogc3RyaW5nLCBjb250cm9sVmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgLy8g0JTQu9GPIHRvZ2dsZTogRm9ybUNvbnRyb2w8Ym9vbGVhbj4gLT4gYm9vbGVhblxuICAgICAgICBpZiAoY29udHJvbFZhbHVlKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb24sIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICByZXN1bHRbZmlsdGVySWRdID0gY29udHJvbFZhbHVlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChmaWx0ZXJzKCkubGVuZ3RoKSB7XG4gICAgPGRpdiBjbGFzcz1cImJnLXR1aS1iYXNlLTAxIHNoYWRvdy1zYyBtYi00IGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0zIHJvdW5kZWQteGxcIj5cbiAgICAgICAgPHR1aS1hY2NvcmRpb24gY2xhc3M9XCJhY2NvcmRpb25cIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBbdHVpQWNjb3JkaW9uXT1cImlzT3BlbkFjY29yZGlvbigpXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0KTQuNC70YzRgtGA0YtcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHR1aS1leHBhbmQ+XG4gICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHBiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmlsdGVyIG9mIGZpbHRlcnMoKTsgdHJhY2sgZmlsdGVyLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtYm9keS1zIGZvbnQtbWVkaXVtXCI+e3sgZmlsdGVyLmxhYmVsIH19PC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiZmlsdGVyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIGZpbHRlci52YWx1ZXM7IHRyYWNrIHZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInZhbHVlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtYm9keS1zXCI+e3sgdmFsdWUubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWx0ZXIudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWlucHV0LXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIitmaWx0ZXIubWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiK2ZpbHRlci5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXNcIj7QlNCwPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC90dWktZXhwYW5kPlxuICAgICAgICA8L3R1aS1hY2NvcmRpb24+XG4gICAgPC9kaXY+XG59XG4iXX0=
@@ -0,0 +1,10 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ /**
4
+ * Токен для инъекции {@link Subject} для хранения фильтров продуктов.
5
+ */
6
+ export const SC_CATALOG_PRODUCTS_FILTERS = new InjectionToken('SC_CATALOG_PRODUCTS_FILTERS$', {
7
+ providedIn: 'root',
8
+ factory: () => new Subject(),
9
+ });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1wcm9kdWN0cy1maWx0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3Rva2Vucy9zYy1jYXRhbG9nLXByb2R1Y3RzLWZpbHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRS9COztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxjQUFjLENBQTZCLDhCQUE4QixFQUFFO0lBQ3RILFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLE9BQU8sRUFBcUI7Q0FDbEQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0aW9uVG9rZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNjUHJvcGVydHlGaWx0ZXJzIH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICog0KLQvtC60LXQvSDQtNC70Y8g0LjQvdGK0LXQutGG0LjQuCB7QGxpbmsgU3ViamVjdH0g0LTQu9GPINGF0YDQsNC90LXQvdC40Y8g0YTQuNC70YzRgtGA0L7QsiDQv9GA0L7QtNGD0LrRgtC+0LIuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW48U3ViamVjdDxTY1Byb3BlcnR5RmlsdGVycz4+KCdTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMkJywge1xuICAgIHByb3ZpZGVkSW46ICdyb290JyxcbiAgICBmYWN0b3J5OiAoKSA9PiBuZXcgU3ViamVjdDxTY1Byb3BlcnR5RmlsdGVycz4oKSxcbn0pO1xuIl19
@@ -0,0 +1,6 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ /**
3
+ * Токен для инъекции признака необходимости отображать фильтры для вложенных категорий.
4
+ */
5
+ export const SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY = new InjectionToken('SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY');
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1zaG93LXByb2R1Y3RzLXJlY3Vyc2l2ZWx5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3Rva2Vucy9zYy1jYXRhbG9nLXNob3ctcHJvZHVjdHMtcmVjdXJzaXZlbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9DQUFvQyxHQUFHLElBQUksY0FBYyxDQUFVLHNDQUFzQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqINCi0L7QutC10L0g0LTQu9GPINC40L3RitC10LrRhtC40Lgg0L/RgNC40LfQvdCw0LrQsCDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNC40LvRjNGC0YDRiyDQtNC70Y8g0LLQu9C+0LbQtdC90L3Ri9GFINC60LDRgtC10LPQvtGA0LjQuS5cbiAqL1xuZXhwb3J0IGNvbnN0IFNDX0NBVEFMT0dfU0hPV19QUk9EVUNUU19SRUNVUlNJVkVMWSA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZJyk7XG4iXX0=
@@ -11,4 +11,5 @@ export * from './price-list-pagination/sc-price-list-pagination.component';
11
11
  export * from './price-warehouse-stock/sc-price-warehouse-stock.component';
12
12
  export * from './sc-favorite-button/sc-favorite-button.component';
13
13
  export * from './sc-catalog.module';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9kb3dubG9hZC1wcmljZS1saXN0L3NjLWRvd25sb2FkLXByaWNlLWxpc3QuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY2F0ZWdvcnktY2FyZC9zYy1jYXRlZ29yeS1jYXJkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2Nvc3Qtd2l0aC1kaXNjb3VudC9jb3N0LXdpdGgtZGlzY291bnQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaG92ZXItaW1hZ2UtY2Fyb3VzZWwvc2MtaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vaW5wdXQtcXVhbnRpdHkvc2MtaW5wdXQtcXVhbnRpdHkuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vbm90aWZ5LXdoZW4taW4tc3RvY2stZGlhbG9nJztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtY2FyZC9zYy1wcmljZS1jYXJkLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ByaWNlLWNhcmQtaW5saW5lL3NjLXByaWNlLWNhcmQtaW5saW5lLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ByaWNlLWhpc3Rvcnkvc2MtcHJpY2UtaGlzdG9yeS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9wcmljZS1saXN0LXBhZ2luYXRpb24vc2MtcHJpY2UtbGlzdC1wYWdpbmF0aW9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ByaWNlLXdhcmVob3VzZS1zdG9jay9zYy1wcmljZS13YXJlaG91c2Utc3RvY2suY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZmF2b3JpdGUtYnV0dG9uL3NjLWZhdm9yaXRlLWJ1dHRvbi5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1jYXRhbG9nLm1vZHVsZSc7XG4iXX0=
14
+ export * from './catalog-filters';
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2F0YWxvZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHdEQUF3RCxDQUFDO0FBQ3ZFLGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLDBEQUEwRCxDQUFDO0FBQ3pFLGNBQWMsOENBQThDLENBQUM7QUFDN0QsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyw0Q0FBNEMsQ0FBQztBQUMzRCxjQUFjLDREQUE0RCxDQUFDO0FBQzNFLGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyxtREFBbUQsQ0FBQztBQUNsRSxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Rvd25sb2FkLXByaWNlLWxpc3Qvc2MtZG93bmxvYWQtcHJpY2UtbGlzdC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9jYXRlZ29yeS1jYXJkL3NjLWNhdGVnb3J5LWNhcmQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vY29zdC13aXRoLWRpc2NvdW50L2Nvc3Qtd2l0aC1kaXNjb3VudC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9ob3Zlci1pbWFnZS1jYXJvdXNlbC9zYy1ob3Zlci1pbWFnZS1jYXJvdXNlbC5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnB1dC1xdWFudGl0eS9zYy1pbnB1dC1xdWFudGl0eS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3RpZnktd2hlbi1pbi1zdG9jay1kaWFsb2cnO1xuZXhwb3J0ICogZnJvbSAnLi9wcmljZS1jYXJkL3NjLXByaWNlLWNhcmQuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtY2FyZC1pbmxpbmUvc2MtcHJpY2UtY2FyZC1pbmxpbmUuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2UtaGlzdG9yeS9zYy1wcmljZS1oaXN0b3J5LmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3ByaWNlLWxpc3QtcGFnaW5hdGlvbi9zYy1wcmljZS1saXN0LXBhZ2luYXRpb24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vcHJpY2Utd2FyZWhvdXNlLXN0b2NrL3NjLXByaWNlLXdhcmVob3VzZS1zdG9jay5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1mYXZvcml0ZS1idXR0b24vc2MtZmF2b3JpdGUtYnV0dG9uLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL3NjLWNhdGFsb2cubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vY2F0YWxvZy1maWx0ZXJzJztcbiJdfQ==