@snabcentr/client-ui 4.11.8 → 4.15.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/auth/sc-auth.module.d.ts +2 -1
- package/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.d.ts +19 -8
- package/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.d.ts +6 -7
- package/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.d.ts +9 -2
- package/auth/sign-up-form/sc-sign-up-form.component.d.ts +14 -9
- package/catalog/catalog-filters/index.d.ts +3 -0
- package/catalog/catalog-filters/sc-catalog-filters.component.d.ts +99 -0
- package/catalog/catalog-filters/tokens/sc-catalog-products-filters.d.ts +7 -0
- package/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.d.ts +5 -0
- package/catalog/index.d.ts +1 -0
- package/catalog/input-quantity/sc-input-quantity.component.d.ts +2 -2
- package/configurators/index.d.ts +2 -0
- package/configurators/models/index.d.ts +2 -0
- package/configurators/models/sandwich/sc-i-configurator-search-product-sandwich.d.ts +22 -0
- package/configurators/models/sandwich/sc-i-sandwich-settings.d.ts +18 -0
- package/configurators/sandwich/index.d.ts +3 -0
- package/configurators/sandwich/sandwich-skeleton/sc-sandwich-skeleton.component.d.ts +8 -0
- package/configurators/sandwich/sc-i-new-cart-item-sandwich.d.ts +14 -0
- package/configurators/sandwich/sc-sandwich.component.d.ts +146 -0
- package/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.d.ts +21 -24
- package/contragents/new-contragent-form/sc-new-contragent-form.component.d.ts +12 -18
- package/directives/select-on-focusin/sc-select-on-focusin.directive.d.ts +1 -1
- package/esm2022/auth/sc-auth.module.mjs +11 -5
- package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-email/sc-sign-in-form-by-email.component.mjs +37 -18
- package/esm2022/auth/sc-sign-in-form/sc-sign-in-form-by-phone/sc-sign-in-form-by-phone.component.mjs +20 -18
- package/esm2022/auth/sc-simple-sign-up-form/sc-simple-sign-up-form.component.mjs +20 -5
- package/esm2022/auth/sign-up-form/sc-sign-up-form.component.mjs +37 -36
- package/esm2022/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.mjs +4 -4
- package/esm2022/cart/cart-item/sc-cart-item.component.mjs +3 -3
- package/esm2022/catalog/catalog-filters/index.mjs +4 -0
- package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +202 -0
- package/esm2022/catalog/catalog-filters/tokens/sc-catalog-products-filters.mjs +10 -0
- package/esm2022/catalog/catalog-filters/tokens/sc-catalog-show-products-recursively.mjs +6 -0
- package/esm2022/catalog/category-card/sc-category-card.component.mjs +3 -3
- package/esm2022/catalog/index.mjs +2 -1
- package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +19 -7
- package/esm2022/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +3 -3
- package/esm2022/configurators/index.mjs +3 -0
- package/esm2022/configurators/models/index.mjs +3 -0
- package/esm2022/configurators/models/sandwich/sc-i-configurator-search-product-sandwich.mjs +2 -0
- package/esm2022/configurators/models/sandwich/sc-i-sandwich-settings.mjs +2 -0
- package/esm2022/configurators/sandwich/index.mjs +4 -0
- package/esm2022/configurators/sandwich/sandwich-skeleton/sc-sandwich-skeleton.component.mjs +14 -0
- package/esm2022/configurators/sandwich/sc-i-new-cart-item-sandwich.mjs +2 -0
- package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +322 -0
- package/esm2022/contragents/add-contragent-dialog/sc-add-contragent-dialog.component.mjs +38 -50
- package/esm2022/contragents/new-contragent-form/sc-new-contragent-form.component.mjs +28 -46
- package/esm2022/directives/select-on-focusin/sc-select-on-focusin.directive.mjs +3 -3
- package/esm2022/methods/index.mjs +2 -0
- package/esm2022/methods/sc-get-current-route.mjs +14 -0
- package/esm2022/noindex-wrapper/sc-noindex-wrapper.component.mjs +5 -3
- package/esm2022/pages/frequently-asked-questions-with-groups/sc-frequently-asked-questions-with-groups.component.mjs +3 -2
- package/esm2022/providers/index.mjs +3 -1
- package/esm2022/providers/sc-category.providers.mjs +43 -0
- package/esm2022/providers/sc-debounce-time-default.mjs +9 -0
- package/esm2022/public-api.mjs +3 -1
- package/esm2022/samples/preview-sample/sc-preview-sample.component.mjs +3 -3
- package/esm2022/user/user-managers/sc-user-managers.component.mjs +22 -24
- package/esm2022/verification/verification-phone-check-form/sc-verification-phone-check-form.component.mjs +14 -14
- package/fesm2022/snabcentr-client-ui.mjs +976 -386
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/methods/index.d.ts +1 -0
- package/methods/sc-get-current-route.d.ts +8 -0
- package/package.json +19 -19
- package/providers/index.d.ts +2 -0
- package/providers/sc-category.providers.d.ts +11 -0
- package/providers/sc-debounce-time-default.d.ts +5 -0
- package/public-api.d.ts +2 -0
- package/styles/tailwind/tailwind.scss +76 -4
- package/user/user-managers/sc-user-managers.component.d.ts +7 -10
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/unbound-method */
|
|
2
|
+
import { AsyncPipe } from '@angular/common';
|
|
3
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, inject, input, output, signal } from '@angular/core';
|
|
5
|
+
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
6
|
+
import { FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
7
|
+
import { ScCartService, ScCatalogService, ScConfiguratorService, ScConvertersService, } from '@snabcentr/client-core';
|
|
8
|
+
import { tuiControlValue, tuiIsFalsy, tuiIsPresent } from '@taiga-ui/cdk';
|
|
9
|
+
import { TuiButton, TuiDataList, TuiError, tuiItemsHandlersProvider, TuiLabel, TuiLoader, TuiNumberFormat, tuiNumberFormatProvider, TuiTextfield, } from '@taiga-ui/core';
|
|
10
|
+
import { TuiAppearance, TuiWithAppearance } from '@taiga-ui/core/directives/appearance';
|
|
11
|
+
import { TuiIcons, TuiWithIcons } from '@taiga-ui/core/directives/icons';
|
|
12
|
+
import { TuiChevron, TuiDataListWrapperComponent, TuiFieldErrorPipe, TuiInputNumber, tuiInputNumberOptionsProvider, TuiInputSlider, TuiSelect } from '@taiga-ui/kit';
|
|
13
|
+
import { POLYMORPHEUS_CONTEXT } from '@taiga-ui/polymorpheus';
|
|
14
|
+
import { catchError, combineLatest, debounceTime, filter, finalize, map, of, share, startWith, switchMap, tap } from 'rxjs';
|
|
15
|
+
import { ScNextInputFocusModule } from '../../directives/next-input-focus/sc-next-input-focus.module';
|
|
16
|
+
import { ScSelectOnFocusinDirective } from '../../directives/select-on-focusin/sc-select-on-focusin.directive';
|
|
17
|
+
import { SC_DEBOUNCE_TIME_DEFAULT } from '../../providers';
|
|
18
|
+
import { stepValidator } from '../../validators/step-validator';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
import * as i1 from "@angular/forms";
|
|
21
|
+
import * as i2 from "../../directives/next-input-focus/sc-next-input-focus.directive";
|
|
22
|
+
import * as i3 from "@taiga-ui/core";
|
|
23
|
+
import * as i4 from "@taiga-ui/kit";
|
|
24
|
+
import * as i5 from "@taiga-ui/kit/components/slider";
|
|
25
|
+
/**
|
|
26
|
+
* Конфигуратор распила сэндвич-панелей.
|
|
27
|
+
*/
|
|
28
|
+
export class ScSandwichComponent {
|
|
29
|
+
constructor() {
|
|
30
|
+
/**
|
|
31
|
+
* Данные настроек окружения.
|
|
32
|
+
*/
|
|
33
|
+
this.debounceTimeDefault = inject(SC_DEBOUNCE_TIME_DEFAULT);
|
|
34
|
+
/**
|
|
35
|
+
* Настройки для конфигуратора сэндвич-панелей.
|
|
36
|
+
*/
|
|
37
|
+
this.settings = input();
|
|
38
|
+
/**
|
|
39
|
+
* Идентификатор категории.
|
|
40
|
+
*/
|
|
41
|
+
this.categoryId = input.required();
|
|
42
|
+
/**
|
|
43
|
+
* Название конфигуратора.
|
|
44
|
+
*/
|
|
45
|
+
this.editor = input.required();
|
|
46
|
+
/**
|
|
47
|
+
* Позиция товара/услуги в корзине.
|
|
48
|
+
*/
|
|
49
|
+
this.cartItem = input.required();
|
|
50
|
+
/**
|
|
51
|
+
* Событие переключения отображения товаров.
|
|
52
|
+
*/
|
|
53
|
+
this.toggleShowEvent = output();
|
|
54
|
+
/**
|
|
55
|
+
* Форма добавления/редактирования продукта в корзине.
|
|
56
|
+
*/
|
|
57
|
+
this.form = new FormGroup({
|
|
58
|
+
productCategoryId: new FormControl(null, { validators: Validators.required, nonNullable: false }),
|
|
59
|
+
configurator: new FormControl(null, { validators: Validators.required, nonNullable: false }),
|
|
60
|
+
quantity: new FormControl(null, { validators: [Validators.required, stepValidator(1)], nonNullable: false }),
|
|
61
|
+
marker: new FormControl('', { nonNullable: true }),
|
|
62
|
+
items: new FormArray([]),
|
|
63
|
+
calculationId: new FormControl(null, { nonNullable: false }),
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Сервис для работы с корзиной.
|
|
67
|
+
*/
|
|
68
|
+
this.cartService = inject(ScCartService);
|
|
69
|
+
/**
|
|
70
|
+
* Сервис конвертации данных.
|
|
71
|
+
*/
|
|
72
|
+
this.convertersService = inject(ScConvertersService);
|
|
73
|
+
/**
|
|
74
|
+
* Контекст диалогового окна, в котором открыт компонент.
|
|
75
|
+
*/
|
|
76
|
+
this.context = inject(POLYMORPHEUS_CONTEXT, { optional: true });
|
|
77
|
+
/**
|
|
78
|
+
* Сервис для работы с каталогом.
|
|
79
|
+
*/
|
|
80
|
+
this.catalogService = inject(ScCatalogService);
|
|
81
|
+
/**
|
|
82
|
+
* Сервис для работы с конфигураторами.
|
|
83
|
+
*/
|
|
84
|
+
this.configuratorService = inject(ScConfiguratorService);
|
|
85
|
+
/**
|
|
86
|
+
* {@link Observable} списка товаров категории.
|
|
87
|
+
*/
|
|
88
|
+
this.products$ = toObservable(this.categoryId).pipe(switchMap((categoryId) => {
|
|
89
|
+
if (!categoryId) {
|
|
90
|
+
return of([]);
|
|
91
|
+
}
|
|
92
|
+
return this.catalogService.getProductsCategoryCached$({ categoryId: Number(categoryId) }).pipe(map((products) => products ?? []));
|
|
93
|
+
}));
|
|
94
|
+
/**
|
|
95
|
+
* Выбранный продукт (материал для раскроя).
|
|
96
|
+
*/
|
|
97
|
+
this.product = new FormControl(null, { validators: Validators.required, nonNullable: false });
|
|
98
|
+
/**
|
|
99
|
+
* {@link Observable} расчета оптимизации раскладки.
|
|
100
|
+
*/
|
|
101
|
+
this.calculate$ = combineLatest({
|
|
102
|
+
productId: tuiControlValue(this.product).pipe(map((product) => product?.id ?? null)),
|
|
103
|
+
items: tuiControlValue(this.items),
|
|
104
|
+
}).pipe(debounceTime(this.debounceTimeDefault), filter(() => this.product.valid && this.form.controls.items.valid), switchMap(({ productId, items }) => {
|
|
105
|
+
if (productId === null || items.length === 0) {
|
|
106
|
+
return of(null);
|
|
107
|
+
}
|
|
108
|
+
return this.configuratorService.calculate$(this.categoryId(), this.editor(), { productId, items }).pipe(tap((calculateResult) => {
|
|
109
|
+
this.form.get('quantity')?.setValue(calculateResult.quantity);
|
|
110
|
+
}), startWith(null), catchError(() => of(null)));
|
|
111
|
+
}), share(), tap((calculateResult) => {
|
|
112
|
+
console.log('calculateResult', calculateResult);
|
|
113
|
+
}));
|
|
114
|
+
/**
|
|
115
|
+
* Результат расчета оптимизации раскладки.
|
|
116
|
+
*/
|
|
117
|
+
this.calculateResult$ = this.calculate$.pipe(filter(tuiIsPresent));
|
|
118
|
+
/**
|
|
119
|
+
* Сигнал состояния загрузки расчета.
|
|
120
|
+
*/
|
|
121
|
+
this.isCalculateLoading = toSignal(this.calculate$.pipe(map(tuiIsFalsy)), { initialValue: false });
|
|
122
|
+
/**
|
|
123
|
+
* Валидатор для ширины изделия.
|
|
124
|
+
*/
|
|
125
|
+
this.validatorWidth$ = tuiControlValue(this.product).pipe(map((product) => Validators.min(product?.properties?.width ?? 0)));
|
|
126
|
+
/**
|
|
127
|
+
* Валидатор для длины изделия.
|
|
128
|
+
*/
|
|
129
|
+
this.validatorLength$ = tuiControlValue(this.product).pipe(map((product) => Validators.min(product?.properties?.length ?? 0)));
|
|
130
|
+
/**
|
|
131
|
+
* Признак того, что выполняется запрос на отправку данных выполняется.
|
|
132
|
+
*/
|
|
133
|
+
this.isSubmitLoading = signal(false);
|
|
134
|
+
/**
|
|
135
|
+
* Ссылка для автоматического управления уничтожением зависимостей.
|
|
136
|
+
*/
|
|
137
|
+
this.destroyRef = inject(DestroyRef);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Массив изделий.
|
|
141
|
+
*/
|
|
142
|
+
get items() {
|
|
143
|
+
return this.form.controls.items;
|
|
144
|
+
}
|
|
145
|
+
/** @inheritDoc */
|
|
146
|
+
ngOnInit() {
|
|
147
|
+
this.setDefaultFormValue();
|
|
148
|
+
this.product.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((product) => {
|
|
149
|
+
if (product) {
|
|
150
|
+
this.items.controls.forEach((item) => {
|
|
151
|
+
const value = item.getRawValue();
|
|
152
|
+
if ((product.properties?.width && value.width < product.properties.width) || (product.properties?.length && value.length < product.properties.length)) {
|
|
153
|
+
item.patchValue({
|
|
154
|
+
width: Math.min(value.width, product.properties.width ?? value.width),
|
|
155
|
+
length: Math.min(value.length, product.properties.length ?? value.length),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Создает группу для изделия.
|
|
164
|
+
*
|
|
165
|
+
* @param item Параметры изделия.
|
|
166
|
+
*/
|
|
167
|
+
createItemGroup(item) {
|
|
168
|
+
return new FormGroup({
|
|
169
|
+
width: new FormControl(item?.width ?? 0, {
|
|
170
|
+
validators: [Validators.required, Validators.min(this.settings()?.minWidth ?? 0.01)],
|
|
171
|
+
nonNullable: true,
|
|
172
|
+
}),
|
|
173
|
+
length: new FormControl(item?.length ?? 0, {
|
|
174
|
+
validators: [Validators.required, Validators.min(this.settings()?.minLength ?? 0.01)],
|
|
175
|
+
nonNullable: true,
|
|
176
|
+
}),
|
|
177
|
+
quantity: new FormControl(item?.quantity ?? 1, {
|
|
178
|
+
validators: [Validators.required, Validators.min(1)],
|
|
179
|
+
nonNullable: true,
|
|
180
|
+
}),
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Добавляет новое изделие в форму.
|
|
185
|
+
*/
|
|
186
|
+
addItem() {
|
|
187
|
+
this.items.push(this.createItemGroup());
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Удаляет изделие из формы.
|
|
191
|
+
*
|
|
192
|
+
* @param index Индекс изделия.
|
|
193
|
+
*/
|
|
194
|
+
removeItem(index) {
|
|
195
|
+
this.items.removeAt(index);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Возвращает итоговую стоимость.
|
|
199
|
+
*
|
|
200
|
+
* @param calculateResult Результат расчета оптимизации раскладки.
|
|
201
|
+
*/
|
|
202
|
+
getTotalCost(calculateResult) {
|
|
203
|
+
if (!this.product.value?.costRub) {
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
const quantity = this.form.get('quantity')?.value ?? 1;
|
|
207
|
+
const totalCost = calculateResult.quantity * this.product.value.costRub * quantity;
|
|
208
|
+
return Math.round(totalCost * 100) / 100;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Обработчик добавления/редактирования продукта в корзине.
|
|
212
|
+
*
|
|
213
|
+
* @param calculateResult Результат расчета оптимизации раскладки.
|
|
214
|
+
*/
|
|
215
|
+
onSubmit(calculateResult) {
|
|
216
|
+
if (!calculateResult || this.form.invalid || !this.isCalculateLoading()) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
const formValue = { ...this.form.value, productId: this.product.value?.id ?? null, calculationId: calculateResult.id };
|
|
220
|
+
// Удаляем items, так как они не нужны в {@link ScINewCartItemSandwich}.
|
|
221
|
+
delete formValue.items;
|
|
222
|
+
const cartItem = this.cartItem();
|
|
223
|
+
const newCartItem$ = cartItem
|
|
224
|
+
? this.cartService.patchCartItem$(cartItem.id, this.convertersService.removeNull(formValue))
|
|
225
|
+
: this.cartService.addToCart$(this.convertersService.removeNull(formValue));
|
|
226
|
+
this.isSubmitLoading.set(true);
|
|
227
|
+
newCartItem$
|
|
228
|
+
.pipe(tap(() => {
|
|
229
|
+
if (this.context) {
|
|
230
|
+
this.context.$implicit.complete();
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
this.setDefaultFormValue();
|
|
234
|
+
}
|
|
235
|
+
}), catchError((error) => {
|
|
236
|
+
if (error instanceof HttpErrorResponse) {
|
|
237
|
+
const { errors, message } = error.error;
|
|
238
|
+
if (errors) {
|
|
239
|
+
Object.keys(errors).forEach((key) => {
|
|
240
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
241
|
+
this.form.get(key)?.setErrors({ serverResponse: errors[key] });
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
else if (message) {
|
|
245
|
+
this.form.setErrors({ serverResponse: [message] });
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return of();
|
|
249
|
+
}), finalize(() => {
|
|
250
|
+
this.isSubmitLoading.set(false);
|
|
251
|
+
}))
|
|
252
|
+
.subscribe();
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Устанавливает начальные значения для полей формы.
|
|
256
|
+
*/
|
|
257
|
+
setDefaultFormValue() {
|
|
258
|
+
this.form.reset({
|
|
259
|
+
productCategoryId: Number(this.categoryId()),
|
|
260
|
+
configurator: this.editor(),
|
|
261
|
+
quantity: this.cartItem()?.quantity ?? null,
|
|
262
|
+
marker: this.cartItem()?.marker ?? '',
|
|
263
|
+
});
|
|
264
|
+
this.items.clear();
|
|
265
|
+
this.product.reset(this.cartItem()?.product ?? null);
|
|
266
|
+
const configuratorParameters = this.cartItem()?.configuratorParams;
|
|
267
|
+
configuratorParameters?.items.forEach((item) => {
|
|
268
|
+
this.items.push(this.createItemGroup({ width: item.width, length: item.length, quantity: item.quantity }));
|
|
269
|
+
});
|
|
270
|
+
if (!configuratorParameters?.items.length) {
|
|
271
|
+
this.addItem();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScSandwichComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
275
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScSandwichComponent, isStandalone: true, selector: "sc-sandwich", inputs: { settings: { classPropertyName: "settings", publicName: "settings", isSignal: true, isRequired: false, transformFunction: null }, categoryId: { classPropertyName: "categoryId", publicName: "categoryId", isSignal: true, isRequired: true, transformFunction: null }, editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, cartItem: { classPropertyName: "cartItem", publicName: "cartItem", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { toggleShowEvent: "toggleShowEvent" }, providers: [
|
|
276
|
+
tuiNumberFormatProvider({ precision: 0 }),
|
|
277
|
+
tuiInputNumberOptionsProvider({
|
|
278
|
+
min: 0,
|
|
279
|
+
}),
|
|
280
|
+
tuiItemsHandlersProvider({
|
|
281
|
+
stringify: signal((x) => x.name),
|
|
282
|
+
identityMatcher: signal((a, b) => a.id === b.id),
|
|
283
|
+
}),
|
|
284
|
+
], ngImport: i0, template: "@if (!cartItem() && settings()?.allowShowTable) {\n <div class=\"mb-5 flex justify-center\">\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"toggleShowEvent.emit()\"\n type=\"button\"\n iconStart=\"@tui.layout-list\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432 \u0432\u0438\u0434\u0435 \u0441\u043F\u0438\u0441\u043A\u0430\n </button>\n </div>\n}\n<div class=\"\">\n @let calculateResult = calculateResult$ | async;\n @let products = products$ | async;\n @let productValue = product.value;\n @let validatorWidth = validatorWidth$ | async;\n @let validatorLength = validatorLength$ | async;\n\n <form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit(calculateResult)\"\n ScNextInputFocus\n class=\"flex flex-col gap-3\"\n >\n <label\n tuiLabel\n class=\"grow\"\n >\n \u0422\u043E\u0432\u0430\u0440\n <tui-textfield\n tuiChevron\n [tuiTextfieldCleaner]=\"false\"\n >\n <input\n tuiChevron\n tuiSelect\n [formControl]=\"product\"\n placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\"\n />\n\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"products\"\n />\n </tui-textfield>\n @if (productValue) {\n <div class=\"ml-2 text-tui-text-secondary\">\n \u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C:\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.</span>\n </div>\n }\n <tui-error\n [formControl]=\"product\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value && validatorWidth && validatorLength) {\n <p class=\"w-full font-bold\">\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u0438\u0437\u0434\u0435\u043B\u0438\u0439</p>\n <p class=\"w-full\">\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ settings()?.minWidth }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ product.value.properties?.width }} \u043C\u043C.\n <br />\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ settings()?.minLength }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ product.value.properties?.length }} \u043C\u043C.\n <br />\n </p>\n <div\n formArrayName=\"items\"\n class=\"flex flex-col gap-3\"\n >\n @for (item of items.controls; track item) {\n <div\n class=\"flex grow gap-2\"\n [formGroupName]=\"$index\"\n >\n <div class=\"grid grow grid-cols-3 gap-2\">\n <label tuiLabel>\n \u0428\u0438\u0440\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"width\"\n [min]=\"settings()?.minWidth ?? 0\"\n [max]=\"product.value.properties?.width ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0428\u0438\u0440\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.width }}</span>\n </div>\n }\n <tui-error\n formControlName=\"width\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0414\u043B\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"length\"\n [min]=\"settings()?.minLength ?? 0\"\n [max]=\"product.value.properties?.length ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0414\u043B\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.length }}</span>\n </div>\n }\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <label tuiLabel>\n <span class=\"whitespace-nowrap\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442</span>\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n tuiInputNumber\n formControlName=\"quantity\"\n [min]=\"1\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n autocomplete=\"off\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"quantity\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n </div>\n <button\n tuiIconButton\n (click)=\"removeItem($index)\"\n [disabled]=\"items.length <= 1\"\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.trash-2\"\n appearance=\"secondary\"\n class=\"mt-6\"\n [style.flex]=\"'0 0 auto'\"\n ></button>\n </div>\n }\n </div>\n <button\n tuiButton\n appearance=\"secondary\"\n [disabled]=\"items.invalid\"\n (click)=\"addItem()\"\n type=\"button\"\n class=\"self-center\"\n iconStart=\"@tui.plus\"\n >\n \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0437\u0434\u0435\u043B\u0438\u0435\n </button>\n } @else if (product.value) {\n <tui-error error=\"\u0420\u0430\u0441\u0447\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0443\" />\n }\n\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\n <tui-textfield>\n <input\n tuiTextfield\n formControlName=\"marker\"\n placeholder=\"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\"\n autocomplete=\"marker\"\n />\n </tui-textfield>\n\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (calculateResult && product.value) {\n <tui-loader [showLoader]=\"isCalculateLoading()\" >\n <div class=\"mt-2 flex flex-wrap items-end gap-2\">\n <div>\n \u0418\u0442\u043E\u0433\u043E: <span class=\"text-xl font-bold whitespace-nowrap\">{{ getTotalCost(calculateResult).toLocaleString() }} {{ product.value.currency.symbol }}</span>\n </div>\n @if (calculateResult?.quantity && productValue) {\n <div class=\"text-lg text-sc-dark-grey whitespace-nowrap\">\n <span class=\"font-bold\">({{ calculateResult.quantity }} \u0448\u0442.</span> x\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.)</span>\n </div>\n }\n </div>\n </tui-loader>\n }\n\n <tui-error [error]=\"[] | tuiFieldError | async\" />\n <button\n [disabled]=\"form.invalid || !calculateResult || isCalculateLoading() || isSubmitLoading()\"\n tuiButton\n class=\"self-center\"\n iconStart=\"@tui.check\"\n >\n {{ !cartItem() ? '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' : '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' }}\n </button>\n </form>\n</div>\n", styles: [":host{display:block;width:100%;max-width:30rem}.slider-ticks-labels{--t-offset: calc($thumb / 2);display:flex;font:var(--tui-font-text-s);margin-inline-start:var(--t-offset);margin-inline-end:var(--t-offset);color:var(--tui-text-secondary)}.slider-ticks-labels>*{position:relative;flex:2;text-align:center}.slider-ticks-labels>*:first-child{left:calc(-1 * var(--t-offset));inset-inline-start:calc(-1 * var(--t-offset));flex:1;text-align:start}.slider-ticks-labels>*:last-child{right:calc(-1 * var(--t-offset));flex:1;text-align:end}@supports (inset-inline-end: 0){.slider-ticks-labels>*:last-child{right:unset;inset-inline-end:calc(-1 * var(--t-offset))}}tui-input-slider+.slider-ticks-labels{margin-inline-start:calc(var(--tui-radius-m) / 2 + var(--t-offset))}tui-textfield+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-m) / 2 + $thumb / 2)}tui-textfield[data-size=l]+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-l) / 2 + $thumb / 2)}tui-input-range:not([new])+.slider-ticks-labels,tui-range+.slider-ticks-labels{--t-offset: $thumb}tui-input-range[new]+.slider-ticks-labels{--t-offset: calc(map-get($track-inset, $input-size) + $thumb)}\n"], dependencies: [{ kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: ScNextInputFocusModule }, { kind: "directive", type: i2.ScNextInputFocusDirective, selector: "form[ScNextInputFocus]" }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", inputs: ["items", "disabledItemHandler", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i3.TuiTextfieldDirective, selector: "input[tuiTextfield]:not([tuiInputCard]):not([tuiInputExpire]):not([tuiInputCVC])" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3.TuiTextfieldDropdownDirective, selector: "ng-template[tuiTextfieldDropdown]" }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "directive", type: i4.TuiSelectDirective, selector: "input[tuiSelect]" }, { kind: "directive", type: i4.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "directive", type: TuiNumberFormat, selector: "[tuiNumberFormat]", inputs: ["tuiNumberFormat"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "component", type: i5.TuiSliderComponent, selector: "input[type=range][tuiSlider]", inputs: ["size", "segments"] }, { kind: "directive", type: i4.TuiInputSliderDirective, selector: "input[tuiInputSlider]" }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber], input[tuiTextfield], input[tuiInputSlider]" }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
285
|
+
}
|
|
286
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScSandwichComponent, decorators: [{
|
|
287
|
+
type: Component,
|
|
288
|
+
args: [{ standalone: true, selector: 'sc-sandwich', imports: [
|
|
289
|
+
TuiAppearance,
|
|
290
|
+
TuiWithAppearance,
|
|
291
|
+
TuiIcons,
|
|
292
|
+
TuiWithIcons,
|
|
293
|
+
TuiButton,
|
|
294
|
+
FormsModule,
|
|
295
|
+
ReactiveFormsModule,
|
|
296
|
+
ScNextInputFocusModule,
|
|
297
|
+
TuiLabel,
|
|
298
|
+
TuiDataListWrapperComponent,
|
|
299
|
+
TuiError,
|
|
300
|
+
TuiTextfield,
|
|
301
|
+
TuiChevron,
|
|
302
|
+
TuiSelect,
|
|
303
|
+
TuiInputNumber,
|
|
304
|
+
TuiNumberFormat,
|
|
305
|
+
AsyncPipe,
|
|
306
|
+
TuiFieldErrorPipe,
|
|
307
|
+
TuiInputSlider,
|
|
308
|
+
TuiDataList,
|
|
309
|
+
ScSelectOnFocusinDirective,
|
|
310
|
+
TuiLoader,
|
|
311
|
+
], providers: [
|
|
312
|
+
tuiNumberFormatProvider({ precision: 0 }),
|
|
313
|
+
tuiInputNumberOptionsProvider({
|
|
314
|
+
min: 0,
|
|
315
|
+
}),
|
|
316
|
+
tuiItemsHandlersProvider({
|
|
317
|
+
stringify: signal((x) => x.name),
|
|
318
|
+
identityMatcher: signal((a, b) => a.id === b.id),
|
|
319
|
+
}),
|
|
320
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!cartItem() && settings()?.allowShowTable) {\n <div class=\"mb-5 flex justify-center\">\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"toggleShowEvent.emit()\"\n type=\"button\"\n iconStart=\"@tui.layout-list\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432 \u0432\u0438\u0434\u0435 \u0441\u043F\u0438\u0441\u043A\u0430\n </button>\n </div>\n}\n<div class=\"\">\n @let calculateResult = calculateResult$ | async;\n @let products = products$ | async;\n @let productValue = product.value;\n @let validatorWidth = validatorWidth$ | async;\n @let validatorLength = validatorLength$ | async;\n\n <form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit(calculateResult)\"\n ScNextInputFocus\n class=\"flex flex-col gap-3\"\n >\n <label\n tuiLabel\n class=\"grow\"\n >\n \u0422\u043E\u0432\u0430\u0440\n <tui-textfield\n tuiChevron\n [tuiTextfieldCleaner]=\"false\"\n >\n <input\n tuiChevron\n tuiSelect\n [formControl]=\"product\"\n placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\"\n />\n\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"products\"\n />\n </tui-textfield>\n @if (productValue) {\n <div class=\"ml-2 text-tui-text-secondary\">\n \u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C:\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.</span>\n </div>\n }\n <tui-error\n [formControl]=\"product\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value && validatorWidth && validatorLength) {\n <p class=\"w-full font-bold\">\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u0438\u0437\u0434\u0435\u043B\u0438\u0439</p>\n <p class=\"w-full\">\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ settings()?.minWidth }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ product.value.properties?.width }} \u043C\u043C.\n <br />\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ settings()?.minLength }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ product.value.properties?.length }} \u043C\u043C.\n <br />\n </p>\n <div\n formArrayName=\"items\"\n class=\"flex flex-col gap-3\"\n >\n @for (item of items.controls; track item) {\n <div\n class=\"flex grow gap-2\"\n [formGroupName]=\"$index\"\n >\n <div class=\"grid grow grid-cols-3 gap-2\">\n <label tuiLabel>\n \u0428\u0438\u0440\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"width\"\n [min]=\"settings()?.minWidth ?? 0\"\n [max]=\"product.value.properties?.width ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0428\u0438\u0440\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.width }}</span>\n </div>\n }\n <tui-error\n formControlName=\"width\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0414\u043B\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"length\"\n [min]=\"settings()?.minLength ?? 0\"\n [max]=\"product.value.properties?.length ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0414\u043B\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.length }}</span>\n </div>\n }\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <label tuiLabel>\n <span class=\"whitespace-nowrap\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442</span>\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n tuiInputNumber\n formControlName=\"quantity\"\n [min]=\"1\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n autocomplete=\"off\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"quantity\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n </div>\n <button\n tuiIconButton\n (click)=\"removeItem($index)\"\n [disabled]=\"items.length <= 1\"\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.trash-2\"\n appearance=\"secondary\"\n class=\"mt-6\"\n [style.flex]=\"'0 0 auto'\"\n ></button>\n </div>\n }\n </div>\n <button\n tuiButton\n appearance=\"secondary\"\n [disabled]=\"items.invalid\"\n (click)=\"addItem()\"\n type=\"button\"\n class=\"self-center\"\n iconStart=\"@tui.plus\"\n >\n \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0437\u0434\u0435\u043B\u0438\u0435\n </button>\n } @else if (product.value) {\n <tui-error error=\"\u0420\u0430\u0441\u0447\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0443\" />\n }\n\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\n <tui-textfield>\n <input\n tuiTextfield\n formControlName=\"marker\"\n placeholder=\"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\"\n autocomplete=\"marker\"\n />\n </tui-textfield>\n\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (calculateResult && product.value) {\n <tui-loader [showLoader]=\"isCalculateLoading()\" >\n <div class=\"mt-2 flex flex-wrap items-end gap-2\">\n <div>\n \u0418\u0442\u043E\u0433\u043E: <span class=\"text-xl font-bold whitespace-nowrap\">{{ getTotalCost(calculateResult).toLocaleString() }} {{ product.value.currency.symbol }}</span>\n </div>\n @if (calculateResult?.quantity && productValue) {\n <div class=\"text-lg text-sc-dark-grey whitespace-nowrap\">\n <span class=\"font-bold\">({{ calculateResult.quantity }} \u0448\u0442.</span> x\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.)</span>\n </div>\n }\n </div>\n </tui-loader>\n }\n\n <tui-error [error]=\"[] | tuiFieldError | async\" />\n <button\n [disabled]=\"form.invalid || !calculateResult || isCalculateLoading() || isSubmitLoading()\"\n tuiButton\n class=\"self-center\"\n iconStart=\"@tui.check\"\n >\n {{ !cartItem() ? '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' : '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' }}\n </button>\n </form>\n</div>\n", styles: [":host{display:block;width:100%;max-width:30rem}.slider-ticks-labels{--t-offset: calc($thumb / 2);display:flex;font:var(--tui-font-text-s);margin-inline-start:var(--t-offset);margin-inline-end:var(--t-offset);color:var(--tui-text-secondary)}.slider-ticks-labels>*{position:relative;flex:2;text-align:center}.slider-ticks-labels>*:first-child{left:calc(-1 * var(--t-offset));inset-inline-start:calc(-1 * var(--t-offset));flex:1;text-align:start}.slider-ticks-labels>*:last-child{right:calc(-1 * var(--t-offset));flex:1;text-align:end}@supports (inset-inline-end: 0){.slider-ticks-labels>*:last-child{right:unset;inset-inline-end:calc(-1 * var(--t-offset))}}tui-input-slider+.slider-ticks-labels{margin-inline-start:calc(var(--tui-radius-m) / 2 + var(--t-offset))}tui-textfield+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-m) / 2 + $thumb / 2)}tui-textfield[data-size=l]+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-l) / 2 + $thumb / 2)}tui-input-range:not([new])+.slider-ticks-labels,tui-range+.slider-ticks-labels{--t-offset: $thumb}tui-input-range[new]+.slider-ticks-labels{--t-offset: calc(map-get($track-inset, $input-size) + $thumb)}\n"] }]
|
|
321
|
+
}] });
|
|
322
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc2FuZHdpY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NvbmZpZ3VyYXRvcnMvc2FuZHdpY2gvc2Mtc2FuZHdpY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NvbmZpZ3VyYXRvcnMvc2FuZHdpY2gvc2Mtc2FuZHdpY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlILE9BQU8sRUFLSCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixtQkFBbUIsR0FHdEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUUsT0FBTyxFQUNILFNBQVMsRUFDVCxXQUFXLEVBRVgsUUFBUSxFQUNSLHdCQUF3QixFQUN4QixRQUFRLEVBQ1IsU0FBUyxFQUNULGVBQWUsRUFDZix1QkFBdUIsRUFDdkIsWUFBWSxHQUNmLE1BQU0sZ0JBQWdCLENB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b2QgKi9cblxuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgaW5qZWN0LCBpbnB1dCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9yRm4sIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIElTYW5kd2ljaENhbGN1bGF0ZSxcbiAgICBJU2FuZHdpY2hDYWxjdWxhdGVJdGVtLFxuICAgIFNjQ2FydCxcbiAgICBTY0NhcnRJdGVtLFxuICAgIFNjQ2FydFNlcnZpY2UsXG4gICAgU2NDYXRhbG9nU2VydmljZSxcbiAgICBTY0NvbmZpZ3VyYXRvclNlcnZpY2UsXG4gICAgU2NDb252ZXJ0ZXJzU2VydmljZSxcbiAgICBTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQsXG4gICAgU2NQcm9kdWN0LFxufSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUNvbnRyb2xWYWx1ZSwgdHVpSXNGYWxzeSwgdHVpSXNQcmVzZW50IH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQge1xuICAgIFR1aUJ1dHRvbixcbiAgICBUdWlEYXRhTGlzdCxcbiAgICBUdWlEaWFsb2dDb250ZXh0LFxuICAgIFR1aUVycm9yLFxuICAgIHR1aUl0ZW1zSGFuZGxlcnNQcm92aWRlcixcbiAgICBUdWlMYWJlbCxcbiAgICBUdWlMb2FkZXIsXG4gICAgVHVpTnVtYmVyRm9ybWF0LFxuICAgIHR1aU51bWJlckZvcm1hdFByb3ZpZGVyLFxuICAgIFR1aVRleHRmaWVsZCxcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVHVpQXBwZWFyYW5jZSwgVHVpV2l0aEFwcGVhcmFuY2UgfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2FwcGVhcmFuY2UnO1xuaW1wb3J0IHsgVHVpSWNvbnMsIFR1aVdpdGhJY29ucyB9IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaWNvbnMnO1xuaW1wb3J0IHsgVHVpQ2hldnJvbiwgVHVpRGF0YUxpc3RXcmFwcGVyQ29tcG9uZW50LCBUdWlGaWVsZEVycm9yUGlwZSwgVHVpSW5wdXROdW1iZXIsIHR1aUlucHV0TnVtYmVyT3B0aW9uc1Byb3ZpZGVyLCBUdWlJbnB1dFNsaWRlciwgVHVpU2VsZWN0IH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBQT0xZTU9SUEhFVVNfQ09OVEVYVCB9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzaGFyZSwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcGlFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXV0aC9pbnRlcmZhY2VzL2FwaS1lcnJvci1yZXNwb25zZSc7XG5pbXBvcnQgeyBTY05leHRJbnB1dEZvY3VzTW9kdWxlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9uZXh0LWlucHV0LWZvY3VzL3NjLW5leHQtaW5wdXQtZm9jdXMubW9kdWxlJztcbmltcG9ydCB7IFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zZWxlY3Qtb24tZm9jdXNpbi9zYy1zZWxlY3Qtb24tZm9jdXNpbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU0NfREVCT1VOQ0VfVElNRV9ERUZBVUxUIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IHN0ZXBWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N0ZXAtdmFsaWRhdG9yJztcbmltcG9ydCB7IFNjSVNhbmR3aWNoU2V0dGluZ3MgfSBmcm9tICcuLi9tb2RlbHMvc2FuZHdpY2gvc2MtaS1zYW5kd2ljaC1zZXR0aW5ncyc7XG5pbXBvcnQgeyBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNoIH0gZnJvbSAnLi9zYy1pLW5ldy1jYXJ0LWl0ZW0tc2FuZHdpY2gnO1xuXG4vKipcbiAqINCa0L7QvdGE0LjQs9GD0YDQsNGC0L7RgCDRgNCw0YHQv9C40LvQsCDRgdGN0L3QtNCy0LjRhy3Qv9Cw0L3QtdC70LXQuS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLXNhbmR3aWNoJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2Mtc2FuZHdpY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9zYy1zYW5kd2ljaC5jb21wb25lbnQuc2NzcycsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBUdWlBcHBlYXJhbmNlLFxuICAgICAgICBUdWlXaXRoQXBwZWFyYW5jZSxcbiAgICAgICAgVHVpSWNvbnMsXG4gICAgICAgIFR1aVdpdGhJY29ucyxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgU2NOZXh0SW5wdXRGb2N1c01vZHVsZSxcbiAgICAgICAgVHVpTGFiZWwsXG4gICAgICAgIFR1aURhdGFMaXN0V3JhcHBlckNvbXBvbmVudCxcbiAgICAgICAgVHVpRXJyb3IsXG4gICAgICAgIFR1aVRleHRmaWVsZCxcbiAgICAgICAgVHVpQ2hldnJvbixcbiAgICAgICAgVHVpU2VsZWN0LFxuICAgICAgICBUdWlJbnB1dE51bWJlcixcbiAgICAgICAgVHVpTnVtYmVyRm9ybWF0LFxuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIFR1aUZpZWxkRXJyb3JQaXBlLFxuICAgICAgICBUdWlJbnB1dFNsaWRlcixcbiAgICAgICAgVHVpRGF0YUxpc3QsXG4gICAgICAgIFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlLFxuICAgICAgICBUdWlMb2FkZXIsXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgdHVpTnVtYmVyRm9ybWF0UHJvdmlkZXIoeyBwcmVjaXNpb246IDAgfSksXG4gICAgICAgIHR1aUlucHV0TnVtYmVyT3B0aW9uc1Byb3ZpZGVyKHtcbiAgICAgICAgICAgIG1pbjogMCxcbiAgICAgICAgfSksXG4gICAgICAgIHR1aUl0ZW1zSGFuZGxlcnNQcm92aWRlcih7XG4gICAgICAgICAgICBzdHJpbmdpZnk6IHNpZ25hbCgoeDogU2NQcm9kdWN0KSA9PiB4Lm5hbWUpLFxuICAgICAgICAgICAgaWRlbnRpdHlNYXRjaGVyOiBzaWduYWwoKGE6IFNjUHJvZHVjdCwgYjogU2NQcm9kdWN0KSA9PiBhLmlkID09PSBiLmlkKSxcbiAgICAgICAgfSksXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NTYW5kd2ljaENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC90LDRgdGC0YDQvtC10Log0L7QutGA0YPQttC10L3QuNGPLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVib3VuY2VUaW1lRGVmYXVsdDogbnVtYmVyID0gaW5qZWN0PG51bWJlcj4oU0NfREVCT1VOQ0VfVElNRV9ERUZBVUxUKTtcblxuICAgIC8qKlxuICAgICAqINCd0LDRgdGC0YDQvtC50LrQuCDQtNC70Y8g0LrQvtC90YTQuNCz0YPRgNCw0YLQvtGA0LAg0YHRjdC90LTQstC40Yct0L/QsNC90LXQu9C10LkuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHNldHRpbmdzID0gaW5wdXQ8U2NJU2FuZHdpY2hTZXR0aW5ncz4oKTtcblxuICAgIC8qKlxuICAgICAqINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY2F0ZWdvcnlJZCA9IGlucHV0LnJlcXVpcmVkPG51bWJlciB8IHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqINCd0LDQt9Cy0LDQvdC40LUg0LrQvtC90YTQuNCz0YPRgNCw0YLQvtGA0LAuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGVkaXRvciA9IGlucHV0LnJlcXVpcmVkPHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqINCf0L7Qt9C40YbQuNGPINGC0L7QstCw0YDQsC/Rg9GB0LvRg9Cz0Lgg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGNhcnRJdGVtID0gaW5wdXQucmVxdWlyZWQ8U2NDYXJ0SXRlbSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC/0LXRgNC10LrQu9GO0YfQtdC90LjRjyDQvtGC0L7QsdGA0LDQttC10L3QuNGPINGC0L7QstCw0YDQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB0b2dnbGVTaG93RXZlbnQgPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LAg0LTQvtCx0LDQstC70LXQvdC40Y8v0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDQv9GA0L7QtNGD0LrRgtCwINCyINC60L7RgNC30LjQvdC1LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIHByb2R1Y3RDYXRlZ29yeUlkOiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4obnVsbCwgeyB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLCBub25OdWxsYWJsZTogZmFsc2UgfSksXG4gICAgICAgIGNvbmZpZ3VyYXRvcjogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIHsgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCwgbm9uTnVsbGFibGU6IGZhbHNlIH0pLFxuICAgICAgICBxdWFudGl0eTogbmV3IEZvcm1Db250cm9sPG51bWJlciB8IG51bGw+KG51bGwsIHsgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIHN0ZXBWYWxpZGF0b3IoMSldLCBub25OdWxsYWJsZTogZmFsc2UgfSksXG4gICAgICAgIG1hcmtlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZz4oJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gICAgICAgIGl0ZW1zOiBuZXcgRm9ybUFycmF5PFJldHVyblR5cGU8U2NTYW5kd2ljaENvbXBvbmVudFsnY3JlYXRlSXRlbUdyb3VwJ10+PihbXSksXG4gICAgICAgIGNhbGN1bGF0aW9uSWQ6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCB7IG5vbk51bGxhYmxlOiBmYWxzZSB9KSxcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC60L7RgNC30LjQvdC+0LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXJ0U2VydmljZTogU2NDYXJ0U2VydmljZSA9IGluamVjdChTY0NhcnRTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQutC+0L3QstC10YDRgtCw0YbQuNC4INC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnZlcnRlcnNTZXJ2aWNlOiBTY0NvbnZlcnRlcnNTZXJ2aWNlID0gaW5qZWN0KFNjQ29udmVydGVyc1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JrQvtC90YLQtdC60YHRgiDQtNC40LDQu9C+0LPQvtCy0L7Qs9C+INC+0LrQvdCwLCDQsiDQutC+0YLQvtGA0L7QvCDQvtGC0LrRgNGL0YIg0LrQvtC80L/QvtC90LXQvdGCLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGV4dDogVHVpRGlhbG9nQ29udGV4dCB8IHVuZGVmaW5lZCA9IGluamVjdChQT0xZTU9SUEhFVVNfQ09OVEVYVCwgeyBvcHRpb25hbDogdHJ1ZSB9KSBhcyBUdWlEaWFsb2dDb250ZXh0IHwgdW5kZWZpbmVkO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrQsNGC0LDQu9C+0LPQvtC8LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZ1NlcnZpY2U6IFNjQ2F0YWxvZ1NlcnZpY2UgPSBpbmplY3QoU2NDYXRhbG9nU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutC+0L3RhNC40LPRg9GA0LDRgtC+0YDQsNC80LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWd1cmF0b3JTZXJ2aWNlOiBTY0NvbmZpZ3VyYXRvclNlcnZpY2UgPSBpbmplY3QoU2NDb25maWd1cmF0b3JTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRgdC/0LjRgdC60LAg0YLQvtCy0LDRgNC+0LIg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcm9kdWN0cyQ6IE9ic2VydmFibGU8U2NQcm9kdWN0W10+ID0gdG9PYnNlcnZhYmxlKHRoaXMuY2F0ZWdvcnlJZCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYXRhbG9nU2VydmljZS5nZXRQcm9kdWN0c0NhdGVnb3J5Q2FjaGVkJCh7IGNhdGVnb3J5SWQ6IE51bWJlcihjYXRlZ29yeUlkKSB9KS5waXBlKG1hcCgocHJvZHVjdHMpID0+IHByb2R1Y3RzID8/IFtdKSk7XG4gICAgICAgIH0pXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCS0YvQsdGA0LDQvdC90YvQuSDQv9GA0L7QtNGD0LrRgiAo0LzQsNGC0LXRgNC40LDQuyDQtNC70Y8g0YDQsNGB0LrRgNC+0Y8pLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBwcm9kdWN0ID0gbmV3IEZvcm1Db250cm9sPFNjUHJvZHVjdCB8IG51bGw+KG51bGwsIHsgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCwgbm9uTnVsbGFibGU6IGZhbHNlIH0pO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGA0LDRgdGH0LXRgtCwINC+0L/RgtC40LzQuNC30LDRhtC40Lgg0YDQsNGB0LrQu9Cw0LTQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsY3VsYXRlJDogT2JzZXJ2YWJsZTxTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQgfCBudWxsPiA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICBwcm9kdWN0SWQ6IHR1aUNvbnRyb2xWYWx1ZTxTY1Byb2R1Y3QgfCBudWxsPih0aGlzLnByb2R1Y3QpLnBpcGUobWFwKChwcm9kdWN0KSA9PiBwcm9kdWN0Py5pZCA/PyBudWxsKSksXG4gICAgICAgIGl0ZW1zOiB0dWlDb250cm9sVmFsdWU8SVNhbmR3aWNoQ2FsY3VsYXRlSXRlbVtdPih0aGlzLml0ZW1zKSxcbiAgICB9KS5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVEZWZhdWx0KSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMucHJvZHVjdC52YWxpZCAmJiB0aGlzLmZvcm0uY29udHJvbHMuaXRlbXMudmFsaWQpLFxuICAgICAgICBzd2l0Y2hNYXAoKHsgcHJvZHVjdElkLCBpdGVtcyB9KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZHVjdElkID09PSBudWxsIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdG9yU2VydmljZS5jYWxjdWxhdGUkKHRoaXMuY2F0ZWdvcnlJZCgpLCB0aGlzLmVkaXRvcigpLCB7IHByb2R1Y3RJZCwgaXRlbXMgfSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKGNhbGN1bGF0ZVJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KCdxdWFudGl0eScpPy5zZXRWYWx1ZShjYWxjdWxhdGVSZXN1bHQucXVhbnRpdHkpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHN0YXJ0V2l0aChudWxsKSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKG51bGwpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSksXG4gICAgICAgIHNoYXJlKCksXG4gICAgICAgIHRhcCgoY2FsY3VsYXRlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnY2FsY3VsYXRlUmVzdWx0JywgY2FsY3VsYXRlUmVzdWx0KTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0KDQtdC30YPQu9GM0YLQsNGCINGA0LDRgdGH0LXRgtCwINC+0L/RgtC40LzQuNC30LDRhtC40Lgg0YDQsNGB0LrQu9Cw0LTQutC4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjYWxjdWxhdGVSZXN1bHQkOiBPYnNlcnZhYmxlPFNjSUNvbmZpZ3VyYXRvckNhbGN1bGF0ZVJlc3VsdD4gPSB0aGlzLmNhbGN1bGF0ZSQucGlwZShmaWx0ZXIodHVpSXNQcmVzZW50KSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC40LPQvdCw0Lsg0YHQvtGB0YLQvtGP0L3QuNGPINC30LDQs9GA0YPQt9C60Lgg0YDQsNGB0YfQtdGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQ2FsY3VsYXRlTG9hZGluZyA9IHRvU2lnbmFsKHRoaXMuY2FsY3VsYXRlJC5waXBlKG1hcCh0dWlJc0ZhbHN5KSksIHsgaW5pdGlhbFZhbHVlOiBmYWxzZSB9KTtcblxuICAgIC8qKlxuICAgICAqINCS0LDQu9C40LTQsNGC0L7RgCDQtNC70Y8g0YjQuNGA0LjQvdGLINC40LfQtNC10LvQuNGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWxpZGF0b3JXaWR0aCQ6IE9ic2VydmFibGU8VmFsaWRhdG9yRm4gfCBudWxsPiA9IHR1aUNvbnRyb2xWYWx1ZTxTY1Byb2R1Y3QgfCBudWxsPih0aGlzLnByb2R1Y3QpLnBpcGUoXG4gICAgICAgIG1hcCgocHJvZHVjdCkgPT4gVmFsaWRhdG9ycy5taW4ocHJvZHVjdD8ucHJvcGVydGllcz8ud2lkdGggPz8gMCkpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCS0LDQu9C40LTQsNGC0L7RgCDQtNC70Y8g0LTQu9C40L3RiyDQuNC30LTQtdC70LjRjy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmFsaWRhdG9yTGVuZ3RoJDogT2JzZXJ2YWJsZTxWYWxpZGF0b3JGbiB8IG51bGw+ID0gdHVpQ29udHJvbFZhbHVlPFNjUHJvZHVjdCB8IG51bGw+KHRoaXMucHJvZHVjdCkucGlwZShcbiAgICAgICAgbWFwKChwcm9kdWN0KSA9PiBWYWxpZGF0b3JzLm1pbihwcm9kdWN0Py5wcm9wZXJ0aWVzPy5sZW5ndGggPz8gMCkpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6INGC0L7Qs9C+LCDRh9GC0L4g0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjyDQt9Cw0L/RgNC+0YEg0L3QsCDQvtGC0L/RgNCw0LLQutGDINC00LDQvdC90YvRhSDQstGL0L/QvtC70L3Rj9C10YLRgdGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc1N1Ym1pdExvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHRgdGL0LvQutCwINC00LvRjyDQsNCy0YLQvtC80LDRgtC40YfQtdGB0LrQvtCz0L4g0YPQv9GA0LDQstC70LXQvdC40Y8g0YPQvdC40YfRgtC+0LbQtdC90LjQtdC8INC30LDQstC40YHQuNC80L7RgdGC0LXQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWY6IERlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgICAvKipcbiAgICAgKiDQnNCw0YHRgdC40LIg0LjQt9C00LXQu9C40LkuXG4gICAgICovXG4gICAgZ2V0IGl0ZW1zKCk6IEZvcm1BcnJheTxSZXR1cm5UeXBlPFNjU2FuZHdpY2hDb21wb25lbnRbJ2NyZWF0ZUl0ZW1Hcm91cCddPj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzLml0ZW1zO1xuICAgIH1cblxuICAgIC8qKiBAaW5oZXJpdERvYyAqL1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZXREZWZhdWx0Rm9ybVZhbHVlKCk7XG5cbiAgICAgICAgdGhpcy5wcm9kdWN0LnZhbHVlQ2hhbmdlcy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKS5zdWJzY3JpYmUoKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgIGlmIChwcm9kdWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtcy5jb250cm9scy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaXRlbS5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJvZHVjdC5wcm9wZXJ0aWVzPy53aWR0aCAmJiB2YWx1ZS53aWR0aCA8IHByb2R1Y3QucHJvcGVydGllcy53aWR0aCkgfHwgKHByb2R1Y3QucHJvcGVydGllcz8ubGVuZ3RoICYmIHZhbHVlLmxlbmd0aCA8IHByb2R1Y3QucHJvcGVydGllcy5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBNYXRoLm1pbih2YWx1ZS53aWR0aCwgcHJvZHVjdC5wcm9wZXJ0aWVzLndpZHRoID8/IHZhbHVlLndpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IE1hdGgubWluKHZhbHVlLmxlbmd0aCwgcHJvZHVjdC5wcm9wZXJ0aWVzLmxlbmd0aCA/PyB2YWx1ZS5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIg0LPRgNGD0L/Qv9GDINC00LvRjyDQuNC30LTQtdC70LjRjy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtINCf0LDRgNCw0LzQtdGC0YDRiyDQuNC30LTQtdC70LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZUl0ZW1Hcm91cChpdGVtPzogSVNhbmR3aWNoQ2FsY3VsYXRlSXRlbSk6IEZvcm1Hcm91cDx7XG4gICAgICAgIHdpZHRoOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICAgICAgICBsZW5ndGg6IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgICAgIHF1YW50aXR5OiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICAgIH0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtR3JvdXAoe1xuICAgICAgICAgICAgd2lkdGg6IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KGl0ZW0/LndpZHRoID8/IDAsIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4odGhpcy5zZXR0aW5ncygpPy5taW5XaWR0aCA/PyAwLjAxKV0sXG4gICAgICAgICAgICAgICAgbm9uTnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGxlbmd0aDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oaXRlbT8ubGVuZ3RoID8/IDAsIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4odGhpcy5zZXR0aW5ncygpPy5taW5MZW5ndGggPz8gMC4wMSldLFxuICAgICAgICAgICAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBxdWFudGl0eTogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oaXRlbT8ucXVhbnRpdHkgPz8gMSwge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0sXG4gICAgICAgICAgICAgICAgbm9uTnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JTQvtCx0LDQstC70Y/QtdGCINC90L7QstC+0LUg0LjQt9C00LXQu9C40LUg0LIg0YTQvtGA0LzRgy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWRkSXRlbSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlSXRlbUdyb3VwKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINC40LfQtNC10LvQuNC1INC40Lcg0YTQvtGA0LzRiy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpbmRleCDQmNC90LTQtdC60YEg0LjQt9C00LXQu9C40Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1zLnJlbW92ZUF0KGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQuNGC0L7Qs9C+0LLRg9GOINGB0YLQvtC40LzQvtGB0YLRjC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjYWxjdWxhdGVSZXN1bHQg0KDQtdC30YPQu9GM0YLQsNGCINGA0LDRgdGH0LXRgtCwINC+0L/RgtC40LzQuNC30LDRhtC40Lgg0YDQsNGB0LrQu9Cw0LTQutC4LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnZXRUb3RhbENvc3QoY2FsY3VsYXRlUmVzdWx0OiBTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQpOiBudW1iZXIge1xuICAgICAgICBpZiAoIXRoaXMucHJvZHVjdC52YWx1ZT8uY29zdFJ1Yikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBxdWFudGl0eSA9IHRoaXMuZm9ybS5nZXQoJ3F1YW50aXR5Jyk/LnZhbHVlID8/IDE7XG4gICAgICAgIGNvbnN0IHRvdGFsQ29zdCA9IGNhbGN1bGF0ZVJlc3VsdC5xdWFudGl0eSAqIHRoaXMucHJvZHVjdC52YWx1ZS5jb3N0UnViICogcXVhbnRpdHk7XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodG90YWxDb3N0ICogMTAwKSAvIDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDQtNC+0LHQsNCy0LvQtdC90LjRjy/RgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC/0YDQvtC00YPQutGC0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsY3VsYXRlUmVzdWx0INCg0LXQt9GD0LvRjNGC0LDRgiDRgNCw0YHRh9C10YLQsCDQvtC/0YLQuNC80LjQt9Cw0YbQuNC4INGA0LDRgdC60LvQsNC00LrQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25TdWJtaXQoY2FsY3VsYXRlUmVzdWx0OiBTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQgfCBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICghY2FsY3VsYXRlUmVzdWx0IHx8IHRoaXMuZm9ybS5pbnZhbGlkIHx8ICF0aGlzLmlzQ2FsY3VsYXRlTG9hZGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB7IC4uLnRoaXMuZm9ybS52YWx1ZSwgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3QudmFsdWU/LmlkID8/IG51bGwsIGNhbGN1bGF0aW9uSWQ6IGNhbGN1bGF0ZVJlc3VsdC5pZCB9O1xuICAgICAgICAvLyDQo9C00LDQu9GP0LXQvCBpdGVtcywg0YLQsNC6INC60LDQuiDQvtC90Lgg0L3QtSDQvdGD0LbQvdGLINCyIHtAbGluayBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNofS5cbiAgICAgICAgZGVsZXRlIGZvcm1WYWx1ZS5pdGVtcztcbiAgICAgICAgY29uc3QgY2FydEl0ZW0gPSB0aGlzLmNhcnRJdGVtKCk7XG5cbiAgICAgICAgY29uc3QgbmV3Q2FydEl0ZW0kOiBPYnNlcnZhYmxlPFNjQ2FydD4gPSBjYXJ0SXRlbVxuICAgICAgICAgICAgPyB0aGlzLmNhcnRTZXJ2aWNlLnBhdGNoQ2FydEl0ZW0kKGNhcnRJdGVtLmlkLCB0aGlzLmNvbnZlcnRlcnNTZXJ2aWNlLnJlbW92ZU51bGwoZm9ybVZhbHVlKSBhcyBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNoKVxuICAgICAgICAgICAgOiB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydCQodGhpcy5jb252ZXJ0ZXJzU2VydmljZS5yZW1vdmVOdWxsKGZvcm1WYWx1ZSkgYXMgU2NJTmV3Q2FydEl0ZW1TYW5kd2ljaCk7XG5cbiAgICAgICAgdGhpcy5pc1N1Ym1pdExvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgICAgIG5ld0NhcnRJdGVtJFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0LiRpbXBsaWNpdC5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0Rm9ybVZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvcnMsIG1lc3NhZ2UgfSA9IGVycm9yLmVycm9yIGFzIEFwaUVycm9yUmVzcG9uc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhlcnJvcnMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldChrZXkpPy5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogZXJyb3JzW2tleV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IFttZXNzYWdlXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdWJtaXRMb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9GB0YLQsNC90LDQstC70LjQstCw0LXRgiDQvdCw0YfQsNC70YzQvdGL0LUg0LfQvdCw0YfQtdC90LjRjyDQtNC70Y8g0L/QvtC70LXQuSDRhNC+0YDQvNGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0RGVmYXVsdEZvcm1WYWx1ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb3JtLnJlc2V0KHtcbiAgICAgICAgICAgIHByb2R1Y3RDYXRlZ29yeUlkOiBOdW1iZXIodGhpcy5jYXRlZ29yeUlkKCkpLFxuICAgICAgICAgICAgY29uZmlndXJhdG9yOiB0aGlzLmVkaXRvcigpLFxuICAgICAgICAgICAgcXVhbnRpdHk6IHRoaXMuY2FydEl0ZW0oKT8ucXVhbnRpdHkgPz8gbnVsbCxcbiAgICAgICAgICAgIG1hcmtlcjogdGhpcy5jYXJ0SXRlbSgpPy5tYXJrZXIgPz8gJycsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuaXRlbXMuY2xlYXIoKTtcblxuICAgICAgICB0aGlzLnByb2R1Y3QucmVzZXQodGhpcy5jYXJ0SXRlbSgpPy5wcm9kdWN0ID8/IG51bGwpO1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRvclBhcmFtZXRlcnMgPSB0aGlzLmNhcnRJdGVtKCk/LmNvbmZpZ3VyYXRvclBhcmFtcyBhcyBJU2FuZHdpY2hDYWxjdWxhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uZmlndXJhdG9yUGFyYW1ldGVycz8uaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlSXRlbUdyb3VwKHsgd2lkdGg6IGl0ZW0ud2lkdGgsIGxlbmd0aDogaXRlbS5sZW5ndGgsIHF1YW50aXR5OiBpdGVtLnF1YW50aXR5IH0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFjb25maWd1cmF0b3JQYXJhbWV0ZXJzPy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmICghY2FydEl0ZW0oKSAmJiBzZXR0aW5ncygpPy5hbGxvd1Nob3dUYWJsZSkge1xuICAgIDxkaXYgY2xhc3M9XCJtYi01IGZsZXgganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVTaG93RXZlbnQuZW1pdCgpXCJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5sYXlvdXQtbGlzdFwiXG4gICAgICAgID5cbiAgICAgICAgICAgINCf0L7QutCw0LfQsNGC0Ywg0LIg0LLQuNC00LUg0YHQv9C40YHQutCwXG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxufVxuPGRpdiBjbGFzcz1cIlwiPlxuICAgIEBsZXQgY2FsY3VsYXRlUmVzdWx0ID0gY2FsY3VsYXRlUmVzdWx0JCB8IGFzeW5jO1xuICAgIEBsZXQgcHJvZHVjdHMgPSBwcm9kdWN0cyQgfCBhc3luYztcbiAgICBAbGV0IHByb2R1Y3RWYWx1ZSA9IHByb2R1Y3QudmFsdWU7XG4gICAgQGxldCB2YWxpZGF0b3JXaWR0aCA9IHZhbGlkYXRvcldpZHRoJCB8IGFzeW5jO1xuICAgIEBsZXQgdmFsaWRhdG9yTGVuZ3RoID0gdmFsaWRhdG9yTGVuZ3RoJCB8IGFzeW5jO1xuXG4gICAgPGZvcm1cbiAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICAgICAgKG5nU3VibWl0KT1cIm9uU3VibWl0KGNhbGN1bGF0ZVJlc3VsdClcIlxuICAgICAgICBTY05leHRJbnB1dEZvY3VzXG4gICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiXG4gICAgPlxuICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIHR1aUxhYmVsXG4gICAgICAgICAgICBjbGFzcz1cImdyb3dcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQotC+0LLQsNGAXG4gICAgICAgICAgICA8dHVpLXRleHRmaWVsZFxuICAgICAgICAgICAgICAgIHR1aUNoZXZyb25cbiAgICAgICAgICAgICAgICBbdHVpVGV4dGZpZWxkQ2xlYW5lcl09XCJmYWxzZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR1aUNoZXZyb25cbiAgICAgICAgICAgICAgICAgICAgdHVpU2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQktGL0LHQtdGA0LjRgtC1INC80LDRgtC10YDQuNCw0LtcIlxuICAgICAgICAgICAgICAgIC8+XG5cbiAgICAgICAgICAgICAgICA8dHVpLWRhdGEtbGlzdC13cmFwcGVyXG4gICAgICAgICAgICAgICAgICAgICp0dWlUZXh0ZmllbGREcm9wZG93blxuICAgICAgICAgICAgICAgICAgICBuZXdcbiAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cInByb2R1Y3RzXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC90dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgQGlmIChwcm9kdWN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtMiB0ZXh0LXR1aS10ZXh0LXNlY29uZGFyeVwiPlxuICAgICAgICAgICAgICAgICAgICDQodGC0L7QuNC80L7RgdGC0Yw6XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgcHJvZHVjdFZhbHVlLmNvc3RSdWI/LnRvTG9jYWxlU3RyaW5nKCkgfX0ge3sgcHJvZHVjdFZhbHVlLmN1cnJlbmN5LnN5bWJvbCB9fS/RiNGCLjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgQGlmIChwcm9kdWN0LnZhbHVlICYmIHZhbGlkYXRvcldpZHRoICYmIHZhbGlkYXRvckxlbmd0aCkge1xuICAgICAgICAgICAgPHAgY2xhc3M9XCJ3LWZ1bGwgZm9udC1ib2xkXCI+0KDQsNC30LzQtdGA0Ysg0LjQt9C00LXQu9C40Lk8L3A+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInctZnVsbFwiPlxuICAgICAgICAgICAgICAgINCc0LjQvdC40LzQsNC70YzQvdCw0Y8g0YjQuNGA0LjQvdCwOiB7eyBzZXR0aW5ncygpPy5taW5XaWR0aCB9fSDQvNC8LlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgINCc0LDQutGB0LjQvNCw0LvRjNC90LDRjyDRiNC40YDQuNC90LA6IHt7IHByb2R1Y3QudmFsdWUucHJvcGVydGllcz8ud2lkdGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICDQnNC40L3QuNC80LDQu9GM0L3QsNGPINC00LvQuNC90LA6IHt7IHNldHRpbmdzKCk/Lm1pbkxlbmd0aCB9fSDQvNC8LlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgINCc0LDQutGB0LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwOiB7eyBwcm9kdWN0LnZhbHVlLnByb3BlcnRpZXM/Lmxlbmd0aCB9fSDQvNC8LlxuICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGZvcm1BcnJheU5hbWU9XCJpdGVtc1wiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIGl0ZW1zLmNvbnRyb2xzOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBncm93IGdhcC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBOYW1lXT1cIiRpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyb3cgZ3JpZC1jb2xzLTMgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgdHVpTGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINCo0LjRgNC40L3QsCwg0LzQvFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUlucHV0U2xpZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwic2V0dGluZ3MoKT8ubWluV2lkdGggPz8gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heF09XCJwcm9kdWN0LnZhbHVlLnByb3BlcnRpZXM/LndpZHRoID8/IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlOdW1iZXJGb3JtYXRdPVwieyBwcmVjaXNpb246IDAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQqNC40YDQuNC90LBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwcm9kdWN0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aVNsaWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwcm9kdWN0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLXRpY2tzLWxhYmVsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiAwIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwcm9kdWN0LnZhbHVlLnByb3BlcnRpZXM/LndpZHRoIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwid2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQlNC70LjQvdCwLCDQvNC8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXRTbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5dPVwic2V0dGluZ3MoKT8ubWluTGVuZ3RoID8/IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwicHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy5sZW5ndGggPz8gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R1aU51bWJlckZvcm1hdF09XCJ7IHByZWNpc2lvbjogMCB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cItCU0LvQuNC90LBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwcm9kdWN0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aVNsaWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChwcm9kdWN0LnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2xpZGVyLXRpY2tzLWxhYmVsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPiAwIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBwcm9kdWN0LnZhbHVlLnByb3BlcnRpZXM/Lmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxlbmd0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIndoaXRlc3BhY2Utbm93cmFwXCI+0JrQvtC70LjRh9C10YHRgtCy0L4sINGI0YI8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktdGV4dGZpZWxkIFt0dWlUZXh0ZmllbGRDbGVhbmVyXT1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlJbnB1dE51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInF1YW50aXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlOdW1iZXJGb3JtYXRdPVwieyBwcmVjaXNpb246IDAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQmtC+0LvQuNGH0LXRgdGC0LLQvlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicXVhbnRpdHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZW1vdmVJdGVtKCRpbmRleClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpdGVtcy5sZW5ndGggPD0gMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIm1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkudHJhc2gtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuZmxleF09XCInMCAwIGF1dG8nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIml0ZW1zLmludmFsaWRcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGRJdGVtKClcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkucGx1c1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0JTQvtCx0LDQstC40YLRjCDQuNC30LTQtdC70LjQtVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH0gQGVsc2UgaWYgKHByb2R1Y3QudmFsdWUpIHtcbiAgICAgICAgICAgIDx0dWktZXJyb3IgZXJyb3I9XCLQoNCw0YHRh9C10YIg0L/QviDQv9GA0L7QtNGD0LrRgtGDINC90LXQstC+0LfQvNC+0LbQtdC9LiDQntCx0YDQsNGC0LjRgtC10YHRjCDQuiDQvNC10L3QtdC00LbQtdGA0YNcIiAvPlxuICAgICAgICB9XG5cbiAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAg0JzQsNGA0LrQuNGA0L7QstC60LAg0YDQsNGB0L/QuNC70LBcbiAgICAgICAgICAgIDx0dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0dWlUZXh0ZmllbGRcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFya2VyXCJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQnNCw0YDQutC40YDQvtCy0LrQsCDRgNCw0YHQv9C40LvQsFwiXG4gICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm1hcmtlclwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cblxuICAgICAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1hcmtlclwiXG4gICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvbGFiZWw+XG5cbiAgICAgICAgQGlmIChjYWxjdWxhdGVSZXN1bHQgJiYgcHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgPHR1aS1sb2FkZXIgW3Nob3dMb2FkZXJdPVwiaXNDYWxjdWxhdGVMb2FkaW5nKClcIiA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTIgZmxleCBmbGV4LXdyYXAgaXRlbXMtZW5kIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICDQmNGC0L7Qs9C+OiA8c3BhbiBjbGFzcz1cInRleHQteGwgZm9udC1ib2xkIHdoaXRlc3BhY2Utbm93cmFwXCI+e3sgZ2V0VG90YWxDb3N0KGNhbGN1bGF0ZVJlc3VsdCkudG9Mb2NhbGVTdHJpbmcoKSB9fSB7eyBwcm9kdWN0LnZhbHVlLmN1cnJlbmN5LnN5bWJvbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoY2FsY3VsYXRlUmVzdWx0Py5xdWFudGl0eSAmJiBwcm9kdWN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWxnIHRleHQtc2MtZGFyay1ncmV5IHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj4oe3sgY2FsY3VsYXRlUmVzdWx0LnF1YW50aXR5IH19INGI0YIuPC9zcGFuPiB4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj57eyBwcm9kdWN0VmFsdWUuY29zdFJ1Yj8udG9Mb2NhbGVTdHJpbmcoKSB9fSB7eyBwcm9kdWN0VmFsdWUuY3VycmVuY3kuc3ltYm9sIH19L9GI0YIuKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3R1aS1sb2FkZXI+XG4gICAgICAgIH1cblxuICAgICAgICA8dHVpLWVycm9yIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiIC8+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgIWNhbGN1bGF0ZVJlc3VsdCB8fCBpc0NhbGN1bGF0ZUxvYWRpbmcoKSB8fCBpc1N1Ym1pdExvYWRpbmcoKVwiXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5jaGVja1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICFjYXJ0SXRlbSgpID8gJ9CU0L7QsdCw0LLQuNGC0Ywg0LIg0LrQvtGA0LfQuNC90YMnIDogJ9CY0LfQvNC10L3QuNGC0YwnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZm9ybT5cbjwvZGl2PlxuIl19
|