@snabcentr/client-ui 4.16.9 → 4.16.10-profstroy

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 (64) hide show
  1. package/alerts/confirm-alert/sc-confirm-alert.component.d.ts +22 -0
  2. package/alerts/index.d.ts +1 -0
  3. package/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.d.ts +1 -1
  4. package/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.d.ts +3 -3
  5. package/catalog/input-quantity/sc-input-quantity.component.d.ts +17 -1
  6. package/esm2022/alerts/confirm-alert/sc-confirm-alert.component.mjs +29 -0
  7. package/esm2022/alerts/index.mjs +2 -0
  8. package/esm2022/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.mjs +4 -3
  9. package/esm2022/cart/sc-cart-add-products-from-csv-dialog/sc-cart-add-products-from-csv-dialog.component.mjs +5 -16
  10. package/esm2022/catalog/input-quantity/sc-input-quantity.component.mjs +24 -4
  11. package/esm2022/helpers/sc-api-error-helper.mjs +25 -0
  12. package/esm2022/helpers/sc-file-helper.mjs +29 -0
  13. package/esm2022/order/draft/helpers/sc-draft-list-helper.mjs +83 -0
  14. package/esm2022/order/draft/models/sc-i-draft-list-item.mjs +2 -0
  15. package/esm2022/order/draft/profstroy/actualization-panel/sc-profstroy-actualization-panel.component.mjs +73 -0
  16. package/esm2022/order/draft/profstroy/badge/sc-profstroy-badge.component.mjs +21 -0
  17. package/esm2022/order/draft/profstroy/badges/sc-profstroy-draft-badges.component.mjs +31 -0
  18. package/esm2022/order/draft/profstroy/create-dialog/sc-profstroy-draft-create-dialog.component.mjs +139 -0
  19. package/esm2022/order/draft/profstroy/enums/sc-profstroy-draft-state.mjs +32 -0
  20. package/esm2022/order/draft/profstroy/helpers/sc-profstroy-draft-helper.mjs +94 -0
  21. package/esm2022/order/draft/profstroy/index.mjs +8 -0
  22. package/esm2022/order/draft/profstroy/models/sc-i-profstroy-draft-state-view.mjs +2 -0
  23. package/esm2022/order/draft/sc-draft.component.mjs +148 -14
  24. package/esm2022/order/draft/services/sc-draft-expiration-clock.service.mjs +42 -0
  25. package/esm2022/order/draft/services/sc-draft-list-updates.service.mjs +288 -0
  26. package/esm2022/order/index.mjs +6 -1
  27. package/esm2022/order/new-order-items/sc-new-order-items.component.mjs +11 -3
  28. package/esm2022/order/order-form/sc-order-form.component.mjs +4 -2
  29. package/esm2022/order/order-item/sc-order-item.component.mjs +37 -5
  30. package/esm2022/order/order-items-list/sc-order-items-list.component.mjs +180 -47
  31. package/esm2022/order/order-items-list-by-stock/sc-order-items-list-by-stock.component.mjs +1 -1
  32. package/esm2022/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.mjs +15 -3
  33. package/esm2022/pipes/sc-format-date.mjs +1 -1
  34. package/esm2022/providers/sc-date-formatter.mjs +1 -1
  35. package/esm2022/public-api.mjs +2 -1
  36. package/fesm2022/snabcentr-client-ui.mjs +1273 -122
  37. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  38. package/helpers/sc-api-error-helper.d.ts +18 -0
  39. package/helpers/sc-file-helper.d.ts +13 -0
  40. package/order/draft/helpers/sc-draft-list-helper.d.ts +51 -0
  41. package/order/draft/models/sc-i-draft-list-item.d.ts +14 -0
  42. package/order/draft/profstroy/actualization-panel/sc-profstroy-actualization-panel.component.d.ts +58 -0
  43. package/order/draft/profstroy/badge/sc-profstroy-badge.component.d.ts +12 -0
  44. package/order/draft/profstroy/badges/sc-profstroy-draft-badges.component.d.ts +21 -0
  45. package/order/draft/profstroy/create-dialog/sc-profstroy-draft-create-dialog.component.d.ts +65 -0
  46. package/order/draft/profstroy/enums/sc-profstroy-draft-state.d.ts +29 -0
  47. package/order/draft/profstroy/helpers/sc-profstroy-draft-helper.d.ts +33 -0
  48. package/order/draft/profstroy/index.d.ts +7 -0
  49. package/order/draft/profstroy/models/sc-i-profstroy-draft-state-view.d.ts +17 -0
  50. package/order/draft/sc-draft.component.d.ts +73 -1
  51. package/order/draft/services/sc-draft-expiration-clock.service.d.ts +29 -0
  52. package/order/draft/services/sc-draft-list-updates.service.d.ts +158 -0
  53. package/order/index.d.ts +5 -0
  54. package/order/new-order-items/sc-new-order-items.component.d.ts +9 -1
  55. package/order/order-form/sc-order-form.component.d.ts +1 -0
  56. package/order/order-item/sc-order-item.component.d.ts +25 -1
  57. package/order/order-items-list/sc-order-items-list.component.d.ts +87 -9
  58. package/order/order-items-list-with-actions/sc-order-items-list-with-actions.component.d.ts +13 -1
  59. package/package.json +2 -2
  60. package/pipes/sc-format-date.d.ts +1 -1
  61. package/providers/sc-date-formatter.d.ts +1 -1
  62. package/public-api.d.ts +1 -0
  63. package/release_notes.tmp +1 -1
  64. package/styles/tailwind/tailwind.scss +41 -0
@@ -0,0 +1,94 @@
1
+ import { ScOrderDraftActualizationStatus } from '@snabcentr/client-core';
2
+ import { ScProfstroyDraftState } from '../enums/sc-profstroy-draft-state';
3
+ /**
4
+ * Класс-помощник для отображения черновиков Профстрой.
5
+ */
6
+ export class ScProfstroyDraftHelper {
7
+ /**
8
+ * Данные об отображении состояний черновика.
9
+ */
10
+ static { this.stateViews = {
11
+ [ScProfstroyDraftState.processing]: {
12
+ label: 'Выполняется обработка',
13
+ appearance: 'info',
14
+ description: 'Файл обрабатывается, позиции и цены уточняются. Изменение состава и оформление заказа станут доступны после завершения.',
15
+ },
16
+ [ScProfstroyDraftState.actual]: {
17
+ label: 'Актуализирован',
18
+ appearance: 'positive',
19
+ description: 'Цены и позиции актуальны, заказ можно оформлять.',
20
+ },
21
+ [ScProfstroyDraftState.outdated]: {
22
+ label: 'Данные устарели',
23
+ appearance: 'warning',
24
+ description: 'С момента последней актуализации прошло много времени. Запустите её повторно, чтобы оформить заказ по актуальным ценам.',
25
+ },
26
+ [ScProfstroyDraftState.error]: {
27
+ label: 'Ошибка обработки',
28
+ appearance: 'negative',
29
+ description: 'Обработка завершилась с ошибкой. Запустите актуализацию повторно или соберите заявку из файла заново.',
30
+ },
31
+ [ScProfstroyDraftState.needsActualization]: {
32
+ label: 'Требуется актуализация',
33
+ appearance: 'warning',
34
+ description: 'Состав заявки изменён после последней актуализации. Запустите актуализацию, чтобы обновить цены и оформить заказ. Цены и примечания к позициям обновятся после актуализации.',
35
+ },
36
+ [ScProfstroyDraftState.unknown]: {
37
+ label: 'Состояние неизвестно',
38
+ appearance: 'neutral',
39
+ description: '',
40
+ },
41
+ }; }
42
+ /**
43
+ * Возвращает состояние черновика на указанный момент.
44
+ *
45
+ * @param actualization Данные об актуализации.
46
+ * @param now Момент проверки.
47
+ */
48
+ static getState(actualization, now) {
49
+ switch (actualization?.status) {
50
+ case ScOrderDraftActualizationStatus.processing:
51
+ return ScProfstroyDraftState.processing;
52
+ case ScOrderDraftActualizationStatus.completed:
53
+ return actualization.isOutdatedAt(now) ? ScProfstroyDraftState.outdated : ScProfstroyDraftState.actual;
54
+ case ScOrderDraftActualizationStatus.error:
55
+ return ScProfstroyDraftState.error;
56
+ case ScOrderDraftActualizationStatus.needsActualization:
57
+ return ScProfstroyDraftState.needsActualization;
58
+ default:
59
+ return ScProfstroyDraftState.unknown;
60
+ }
61
+ }
62
+ /**
63
+ * Возвращает данные об отображении состояния черновика на указанный момент.
64
+ *
65
+ * @param actualization Данные об актуализации.
66
+ * @param now Момент проверки.
67
+ */
68
+ static getStateView(actualization, now) {
69
+ return ScProfstroyDraftHelper.stateViews[ScProfstroyDraftHelper.getState(actualization, now)];
70
+ }
71
+ /**
72
+ * Возвращает данные об отображении панели состояния черновика: для актуальной заявки пояснение зависит от того, сколько позиций попадёт в заказ.
73
+ *
74
+ * @param draft Черновик Профстрой.
75
+ * @param now Момент проверки.
76
+ */
77
+ static getPanelView(draft, now) {
78
+ const view = ScProfstroyDraftHelper.getStateView(draft.actualization, now);
79
+ if (ScProfstroyDraftHelper.getState(draft.actualization, now) !== ScProfstroyDraftState.actual) {
80
+ return view;
81
+ }
82
+ const total = draft.products.length;
83
+ const orderable = draft.products.filter((item) => item.isOrderable).length;
84
+ if (orderable === 0) {
85
+ return {
86
+ ...view,
87
+ appearance: 'warning',
88
+ description: 'Актуализация завершена, но ни одна позиция не попадёт в заказ. Исправьте или удалите позиции с примечанием и запустите актуализацию повторно или соберите заявку заново из файла.',
89
+ };
90
+ }
91
+ return orderable < total ? { ...view, description: `Цены актуальны. В заказ попадут ${orderable} из ${total} позиций, остальные отмечены в поле «Примечание».` } : view;
92
+ }
93
+ }
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtcHJvZnN0cm95LWRyYWZ0LWhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9vcmRlci9kcmFmdC9wcm9mc3Ryb3kvaGVscGVycy9zYy1wcm9mc3Ryb3ktZHJhZnQtaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBMkMsK0JBQStCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUVsSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUcxRTs7R0FFRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDL0I7O09BRUc7YUFDcUIsZUFBVSxHQUE4RDtRQUM1RixDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2hDLEtBQUssRUFBRSx1QkFBdUI7WUFDOUIsVUFBVSxFQUFFLE1BQU07WUFDbEIsV0FBVyxFQUFFLHlIQUF5SDtTQUN6STtRQUNELENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDNUIsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixVQUFVLEVBQUUsVUFBVTtZQUN0QixXQUFXLEVBQUUsa0RBQWtEO1NBQ2xFO1FBQ0QsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUM5QixLQUFLLEVBQUUsaUJBQWlCO1lBQ3hCLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFdBQVcsRUFBRSx5SEFBeUg7U0FDekk7UUFDRCxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNCLEtBQUssRUFBRSxrQkFBa0I7WUFDekIsVUFBVSxFQUFFLFVBQVU7WUFDdEIsV0FBVyxFQUFFLHVHQUF1RztTQUN2SDtRQUNELENBQUMscUJBQXFCLENBQUMsa0JBQWtCLENBQUMsRUFBRTtZQUN4QyxLQUFLLEVBQUUsd0JBQXdCO1lBQy9CLFVBQVUsRUFBRSxTQUFTO1lBQ3JCLFdBQVcsRUFDUCw4S0FBOEs7U0FDckw7UUFDRCxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzdCLEtBQUssRUFBRSxzQkFBc0I7WUFDN0IsVUFBVSxFQUFFLFNBQVM7WUFDckIsV0FBVyxFQUFFLEVBQUU7U0FDbEI7S0FDSixDQUFDO0lBRUY7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsUUFBUSxDQUFDLGFBQW9ELEVBQUUsR0FBUztRQUNsRixRQUFRLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM1QixLQUFLLCtCQUErQixDQUFDLFVBQVU7Z0JBQzNDLE9BQU8scUJBQXFCLENBQUMsVUFBVSxDQUFDO1lBQzVDLEtBQUssK0JBQStCLENBQUMsU0FBUztnQkFDMUMsT0FBTyxhQUFhLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQztZQUMzRyxLQUFLLCtCQUErQixDQUFDLEtBQUs7Z0JBQ3RDLE9BQU8scUJBQXFCLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLEtBQUssK0JBQStCLENBQUMsa0JBQWtCO2dCQUNuRCxPQUFPLHFCQUFxQixDQUFDLGtCQUFrQixDQUFDO1lBQ3BEO2dCQUNJLE9BQU8scUJBQXFCLENBQUMsT0FBTyxDQUFDO1FBQzdDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQW9ELEVBQUUsR0FBUztRQUN0RixPQUFPLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFtQixFQUFFLEdBQVM7UUFDckQsTUFBTSxJQUFJLEdBQUcsc0JBQXNCLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFFM0UsSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxxQkFBcUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3RixPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFFM0UsSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDbEIsT0FBTztnQkFDSCxHQUFHLElBQUk7Z0JBQ1AsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFdBQVcsRUFDUCxtTEFBbUw7YUFDMUwsQ0FBQztRQUNOLENBQUM7UUFFRCxPQUFPLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsV0FBVyxFQUFFLG1DQUFtQyxTQUFTLE9BQU8sS0FBSyxtREFBbUQsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUssQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNjT3JkZXJEcmFmdCwgU2NPcmRlckRyYWZ0QWN0dWFsaXphdGlvbiwgU2NPcmRlckRyYWZ0QWN0dWFsaXphdGlvblN0YXR1cyB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuXG5pbXBvcnQgeyBTY1Byb2ZzdHJveURyYWZ0U3RhdGUgfSBmcm9tICcuLi9lbnVtcy9zYy1wcm9mc3Ryb3ktZHJhZnQtc3RhdGUnO1xuaW1wb3J0IHsgU2NJUHJvZnN0cm95RHJhZnRTdGF0ZVZpZXcgfSBmcm9tICcuLi9tb2RlbHMvc2MtaS1wcm9mc3Ryb3ktZHJhZnQtc3RhdGUtdmlldyc7XG5cbi8qKlxuICog0JrQu9Cw0YHRgS3Qv9C+0LzQvtGJ0L3QuNC6INC00LvRjyDQvtGC0L7QsdGA0LDQttC10L3QuNGPINGH0LXRgNC90L7QstC40LrQvtCyINCf0YDQvtGE0YHRgtGA0L7QuS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjUHJvZnN0cm95RHJhZnRIZWxwZXIge1xuICAgIC8qKlxuICAgICAqINCU0LDQvdC90YvQtSDQvtCxINC+0YLQvtCx0YDQsNC20LXQvdC40Lgg0YHQvtGB0YLQvtGP0L3QuNC5INGH0LXRgNC90L7QstC40LrQsC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdGF0ZVZpZXdzOiBSZWNvcmQ8U2NQcm9mc3Ryb3lEcmFmdFN0YXRlLCBTY0lQcm9mc3Ryb3lEcmFmdFN0YXRlVmlldz4gPSB7XG4gICAgICAgIFtTY1Byb2ZzdHJveURyYWZ0U3RhdGUucHJvY2Vzc2luZ106IHtcbiAgICAgICAgICAgIGxhYmVsOiAn0JLRi9C/0L7Qu9C90Y/QtdGC0YHRjyDQvtCx0YDQsNCx0L7RgtC60LAnLFxuICAgICAgICAgICAgYXBwZWFyYW5jZTogJ2luZm8nLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICfQpNCw0LnQuyDQvtCx0YDQsNCx0LDRgtGL0LLQsNC10YLRgdGPLCDQv9C+0LfQuNGG0LjQuCDQuCDRhtC10L3RiyDRg9GC0L7Rh9C90Y/RjtGC0YHRjy4g0JjQt9C80LXQvdC10L3QuNC1INGB0L7RgdGC0LDQstCwINC4INC+0YTQvtGA0LzQu9C10L3QuNC1INC30LDQutCw0LfQsCDRgdGC0LDQvdGD0YIg0LTQvtGB0YLRg9C/0L3RiyDQv9C+0YHQu9C1INC30LDQstC10YDRiNC10L3QuNGPLicsXG4gICAgICAgIH0sXG4gICAgICAgIFtTY1Byb2ZzdHJveURyYWZ0U3RhdGUuYWN0dWFsXToge1xuICAgICAgICAgICAgbGFiZWw6ICfQkNC60YLRg9Cw0LvQuNC30LjRgNC+0LLQsNC9JyxcbiAgICAgICAgICAgIGFwcGVhcmFuY2U6ICdwb3NpdGl2ZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ9Cm0LXQvdGLINC4INC/0L7Qt9C40YbQuNC4INCw0LrRgtGD0LDQu9GM0L3Riywg0LfQsNC60LDQtyDQvNC+0LbQvdC+INC+0YTQvtGA0LzQu9GP0YLRjC4nLFxuICAgICAgICB9LFxuICAgICAgICBbU2NQcm9mc3Ryb3lEcmFmdFN0YXRlLm91dGRhdGVkXToge1xuICAgICAgICAgICAgbGFiZWw6ICfQlNCw0L3QvdGL0LUg0YPRgdGC0LDRgNC10LvQuCcsXG4gICAgICAgICAgICBhcHBlYXJhbmNlOiAnd2FybmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ9ChINC80L7QvNC10L3RgtCwINC/0L7RgdC70LXQtNC90LXQuSDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Lgg0L/RgNC+0YjQu9C+INC80L3QvtCz0L4g0LLRgNC10LzQtdC90LguINCX0LDQv9GD0YHRgtC40YLQtSDQtdGRINC/0L7QstGC0L7RgNC90L4sINGH0YLQvtCx0Ysg0L7RhNC+0YDQvNC40YLRjCDQt9Cw0LrQsNC3INC/0L4g0LDQutGC0YPQsNC70YzQvdGL0Lwg0YbQtdC90LDQvC4nLFxuICAgICAgICB9LFxuICAgICAgICBbU2NQcm9mc3Ryb3lEcmFmdFN0YXRlLmVycm9yXToge1xuICAgICAgICAgICAgbGFiZWw6ICfQntGI0LjQsdC60LAg0L7QsdGA0LDQsdC+0YLQutC4JyxcbiAgICAgICAgICAgIGFwcGVhcmFuY2U6ICduZWdhdGl2ZScsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ9Ce0LHRgNCw0LHQvtGC0LrQsCDQt9Cw0LLQtdGA0YjQuNC70LDRgdGMINGBINC+0YjQuNCx0LrQvtC5LiDQl9Cw0L/Rg9GB0YLQuNGC0LUg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNGOINC/0L7QstGC0L7RgNC90L4g0LjQu9C4INGB0L7QsdC10YDQuNGC0LUg0LfQsNGP0LLQutGDINC40Lcg0YTQsNC50LvQsCDQt9Cw0L3QvtCy0L4uJyxcbiAgICAgICAgfSxcbiAgICAgICAgW1NjUHJvZnN0cm95RHJhZnRTdGF0ZS5uZWVkc0FjdHVhbGl6YXRpb25dOiB7XG4gICAgICAgICAgICBsYWJlbDogJ9Ci0YDQtdCx0YPQtdGC0YHRjyDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y8nLFxuICAgICAgICAgICAgYXBwZWFyYW5jZTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgJ9Ch0L7RgdGC0LDQsiDQt9Cw0Y/QstC60Lgg0LjQt9C80LXQvdGR0L0g0L/QvtGB0LvQtSDQv9C+0YHQu9C10LTQvdC10Lkg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4LiDQl9Cw0L/Rg9GB0YLQuNGC0LUg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNGOLCDRh9GC0L7QsdGLINC+0LHQvdC+0LLQuNGC0Ywg0YbQtdC90Ysg0Lgg0L7RhNC+0YDQvNC40YLRjCDQt9Cw0LrQsNC3LiDQptC10L3RiyDQuCDQv9GA0LjQvNC10YfQsNC90LjRjyDQuiDQv9C+0LfQuNGG0LjRj9C8INC+0LHQvdC+0LLRj9GC0YHRjyDQv9C+0YHQu9C1INCw0LrRgtGD0LDQu9C40LfQsNGG0LjQuC4nLFxuICAgICAgICB9LFxuICAgICAgICBbU2NQcm9mc3Ryb3lEcmFmdFN0YXRlLnVua25vd25dOiB7XG4gICAgICAgICAgICBsYWJlbDogJ9Ch0L7RgdGC0L7Rj9C90LjQtSDQvdC10LjQt9Cy0LXRgdGC0L3QvicsXG4gICAgICAgICAgICBhcHBlYXJhbmNlOiAnbmV1dHJhbCcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIH0sXG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDRh9C10YDQvdC+0LLQuNC60LAg0L3QsCDRg9C60LDQt9Cw0L3QvdGL0Lkg0LzQvtC80LXQvdGCLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdHVhbGl6YXRpb24g0JTQsNC90L3Ri9C1INC+0LEg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4LlxuICAgICAqIEBwYXJhbSBub3cg0JzQvtC80LXQvdGCINC/0YDQvtCy0LXRgNC60LguXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTdGF0ZShhY3R1YWxpemF0aW9uOiBTY09yZGVyRHJhZnRBY3R1YWxpemF0aW9uIHwgdW5kZWZpbmVkLCBub3c6IERhdGUpOiBTY1Byb2ZzdHJveURyYWZ0U3RhdGUge1xuICAgICAgICBzd2l0Y2ggKGFjdHVhbGl6YXRpb24/LnN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSBTY09yZGVyRHJhZnRBY3R1YWxpemF0aW9uU3RhdHVzLnByb2Nlc3Npbmc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNjUHJvZnN0cm95RHJhZnRTdGF0ZS5wcm9jZXNzaW5nO1xuICAgICAgICAgICAgY2FzZSBTY09yZGVyRHJhZnRBY3R1YWxpemF0aW9uU3RhdHVzLmNvbXBsZXRlZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0dWFsaXphdGlvbi5pc091dGRhdGVkQXQobm93KSA/IFNjUHJvZnN0cm95RHJhZnRTdGF0ZS5vdXRkYXRlZCA6IFNjUHJvZnN0cm95RHJhZnRTdGF0ZS5hY3R1YWw7XG4gICAgICAgICAgICBjYXNlIFNjT3JkZXJEcmFmdEFjdHVhbGl6YXRpb25TdGF0dXMuZXJyb3I6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNjUHJvZnN0cm95RHJhZnRTdGF0ZS5lcnJvcjtcbiAgICAgICAgICAgIGNhc2UgU2NPcmRlckRyYWZ0QWN0dWFsaXphdGlvblN0YXR1cy5uZWVkc0FjdHVhbGl6YXRpb246XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNjUHJvZnN0cm95RHJhZnRTdGF0ZS5uZWVkc0FjdHVhbGl6YXRpb247XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBTY1Byb2ZzdHJveURyYWZ0U3RhdGUudW5rbm93bjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC00LDQvdC90YvQtSDQvtCxINC+0YLQvtCx0YDQsNC20LXQvdC40Lgg0YHQvtGB0YLQvtGP0L3QuNGPINGH0LXRgNC90L7QstC40LrQsCDQvdCwINGD0LrQsNC30LDQvdC90YvQuSDQvNC+0LzQtdC90YIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gYWN0dWFsaXphdGlvbiDQlNCw0L3QvdGL0LUg0L7QsSDQsNC60YLRg9Cw0LvQuNC30LDRhtC40LguXG4gICAgICogQHBhcmFtIG5vdyDQnNC+0LzQtdC90YIg0L/RgNC+0LLQtdGA0LrQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFN0YXRlVmlldyhhY3R1YWxpemF0aW9uOiBTY09yZGVyRHJhZnRBY3R1YWxpemF0aW9uIHwgdW5kZWZpbmVkLCBub3c6IERhdGUpOiBTY0lQcm9mc3Ryb3lEcmFmdFN0YXRlVmlldyB7XG4gICAgICAgIHJldHVybiBTY1Byb2ZzdHJveURyYWZ0SGVscGVyLnN0YXRlVmlld3NbU2NQcm9mc3Ryb3lEcmFmdEhlbHBlci5nZXRTdGF0ZShhY3R1YWxpemF0aW9uLCBub3cpXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDQtNCw0L3QvdGL0LUg0L7QsSDQvtGC0L7QsdGA0LDQttC10L3QuNC4INC/0LDQvdC10LvQuCDRgdC+0YHRgtC+0Y/QvdC40Y8g0YfQtdGA0L3QvtCy0LjQutCwOiDQtNC70Y8g0LDQutGC0YPQsNC70YzQvdC+0Lkg0LfQsNGP0LLQutC4INC/0L7Rj9GB0L3QtdC90LjQtSDQt9Cw0LLQuNGB0LjRgiDQvtGCINGC0L7Qs9C+LCDRgdC60L7Qu9GM0LrQviDQv9C+0LfQuNGG0LjQuSDQv9C+0L/QsNC00ZHRgiDQsiDQt9Cw0LrQsNC3LlxuICAgICAqXG4gICAgICogQHBhcmFtIGRyYWZ0INCn0LXRgNC90L7QstC40Log0J/RgNC+0YTRgdGC0YDQvtC5LlxuICAgICAqIEBwYXJhbSBub3cg0JzQvtC80LXQvdGCINC/0YDQvtCy0LXRgNC60LguXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQYW5lbFZpZXcoZHJhZnQ6IFNjT3JkZXJEcmFmdCwgbm93OiBEYXRlKTogU2NJUHJvZnN0cm95RHJhZnRTdGF0ZVZpZXcge1xuICAgICAgICBjb25zdCB2aWV3ID0gU2NQcm9mc3Ryb3lEcmFmdEhlbHBlci5nZXRTdGF0ZVZpZXcoZHJhZnQuYWN0dWFsaXphdGlvbiwgbm93KTtcblxuICAgICAgICBpZiAoU2NQcm9mc3Ryb3lEcmFmdEhlbHBlci5nZXRTdGF0ZShkcmFmdC5hY3R1YWxpemF0aW9uLCBub3cpICE9PSBTY1Byb2ZzdHJveURyYWZ0U3RhdGUuYWN0dWFsKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlldztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsID0gZHJhZnQucHJvZHVjdHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBvcmRlcmFibGUgPSBkcmFmdC5wcm9kdWN0cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNPcmRlcmFibGUpLmxlbmd0aDtcblxuICAgICAgICBpZiAob3JkZXJhYmxlID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLnZpZXcsXG4gICAgICAgICAgICAgICAgYXBwZWFyYW5jZTogJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAn0JDQutGC0YPQsNC70LjQt9Cw0YbQuNGPINC30LDQstC10YDRiNC10L3QsCwg0L3QviDQvdC4INC+0LTQvdCwINC/0L7Qt9C40YbQuNGPINC90LUg0L/QvtC/0LDQtNGR0YIg0LIg0LfQsNC60LDQty4g0JjRgdC/0YDQsNCy0YzRgtC1INC40LvQuCDRg9C00LDQu9C40YLQtSDQv9C+0LfQuNGG0LjQuCDRgSDQv9GA0LjQvNC10YfQsNC90LjQtdC8INC4INC30LDQv9GD0YHRgtC40YLQtSDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y4g0L/QvtCy0YLQvtGA0L3QviDQuNC70Lgg0YHQvtCx0LXRgNC40YLQtSDQt9Cw0Y/QstC60YMg0LfQsNC90L7QstC+INC40Lcg0YTQsNC50LvQsC4nLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcmRlcmFibGUgPCB0b3RhbCA/IHsgLi4udmlldywgZGVzY3JpcHRpb246IGDQptC10L3RiyDQsNC60YLRg9Cw0LvRjNC90YsuINCSINC30LDQutCw0Lcg0L/QvtC/0LDQtNGD0YIgJHtvcmRlcmFibGV9INC40LcgJHt0b3RhbH0g0L/QvtC30LjRhtC40LksINC+0YHRgtCw0LvRjNC90YvQtSDQvtGC0LzQtdGH0LXQvdGLINCyINC/0L7Qu9C1IMKr0J/RgNC40LzQtdGH0LDQvdC40LXCuy5gIH0gOiB2aWV3O1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export * from './actualization-panel/sc-profstroy-actualization-panel.component';
2
+ export * from './badge/sc-profstroy-badge.component';
3
+ export * from './badges/sc-profstroy-draft-badges.component';
4
+ export * from './create-dialog/sc-profstroy-draft-create-dialog.component';
5
+ export * from './enums/sc-profstroy-draft-state';
6
+ export * from './helpers/sc-profstroy-draft-helper';
7
+ export * from './models/sc-i-profstroy-draft-state-view';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvb3JkZXIvZHJhZnQvcHJvZnN0cm95L2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsa0VBQWtFLENBQUM7QUFDakYsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLDhDQUE4QyxDQUFDO0FBQzdELGNBQWMsNERBQTRELENBQUM7QUFDM0UsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsMENBQTBDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2FjdHVhbGl6YXRpb24tcGFuZWwvc2MtcHJvZnN0cm95LWFjdHVhbGl6YXRpb24tcGFuZWwuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vYmFkZ2Uvc2MtcHJvZnN0cm95LWJhZGdlLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2JhZGdlcy9zYy1wcm9mc3Ryb3ktZHJhZnQtYmFkZ2VzLmNvbXBvbmVudCc7XG5leHBvcnQgKiBmcm9tICcuL2NyZWF0ZS1kaWFsb2cvc2MtcHJvZnN0cm95LWRyYWZ0LWNyZWF0ZS1kaWFsb2cuY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvc2MtcHJvZnN0cm95LWRyYWZ0LXN0YXRlJztcbmV4cG9ydCAqIGZyb20gJy4vaGVscGVycy9zYy1wcm9mc3Ryb3ktZHJhZnQtaGVscGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWxzL3NjLWktcHJvZnN0cm95LWRyYWZ0LXN0YXRlLXZpZXcnO1xuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtaS1wcm9mc3Ryb3ktZHJhZnQtc3RhdGUtdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9vcmRlci9kcmFmdC9wcm9mc3Ryb3kvbW9kZWxzL3NjLWktcHJvZnN0cm95LWRyYWZ0LXN0YXRlLXZpZXcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog0JTQsNC90L3Ri9C1INC+0LEg0L7RgtC+0LHRgNCw0LbQtdC90LjQuCDRgdC+0YHRgtC+0Y/QvdC40Y8g0YfQtdGA0L3QvtCy0LjQutCwINCf0YDQvtGE0YHRgtGA0L7QuS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY0lQcm9mc3Ryb3lEcmFmdFN0YXRlVmlldyB7XG4gICAgLyoqXG4gICAgICog0JrRgNCw0YLQutC+0LUg0L3QsNC30LLQsNC90LjQtSDRgdC+0YHRgtC+0Y/QvdC40Y8uXG4gICAgICovXG4gICAgbGFiZWw6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqINCe0YTQvtGA0LzQu9C10L3QuNC1INC80LXRgtC60Lgg0Lgg0L/QsNC90LXQu9C4INGB0L7RgdGC0L7Rj9C90LjRjy5cbiAgICAgKi9cbiAgICBhcHBlYXJhbmNlOiAnaW5mbycgfCAncG9zaXRpdmUnIHwgJ3dhcm5pbmcnIHwgJ25lZ2F0aXZlJyB8ICduZXV0cmFsJztcblxuICAgIC8qKlxuICAgICAqINCf0L7Rj9GB0L3QtdC90LjQtSDQuiDRgdC+0YHRgtC+0Y/QvdC40Y4uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbn1cbiJdfQ==
@@ -1,17 +1,25 @@
1
- import { ChangeDetectionStrategy, Component, DestroyRef, inject, model, output, signal } from '@angular/core';
2
- import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
1
+ import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, model, output, signal } from '@angular/core';
2
+ import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
3
3
  import { ActivatedRoute, Router } from '@angular/router';
4
4
  import { SC_ORDER_LOADER, ScOrderDraftsService, scOrderIsLoaded, ScRouteKeys, ScSeoService } from '@snabcentr/client-core';
5
- import { TuiButton, TuiDialogService, TuiIcons } from '@taiga-ui/core';
5
+ import { TuiAlertService, TuiButton, TuiDialogService, TuiIcons } from '@taiga-ui/core';
6
6
  import { TUI_CONFIRM } from '@taiga-ui/kit';
7
- import { distinctUntilChanged, filter, map, noop, switchMap } from 'rxjs';
7
+ import { catchError, distinctUntilChanged, EMPTY, exhaustMap, filter, finalize, map, noop, of, switchMap, takeWhile } from 'rxjs';
8
+ import { ScApiErrorHelper } from '../../helpers/sc-api-error-helper';
8
9
  import { ScOrderAccessorDirective } from '../directives/sc-order-accessor.directive';
10
+ import { ScOrderItemsListComponent } from '../order-items-list/sc-order-items-list.component';
9
11
  import { ScOrderItemsListWithActionsComponent } from '../order-items-list-with-actions/sc-order-items-list-with-actions.component';
12
+ import { ScProfstroyActualizationPanelComponent } from './profstroy/actualization-panel/sc-profstroy-actualization-panel.component';
13
+ import { ScProfstroyDraftBadgesComponent } from './profstroy/badges/sc-profstroy-draft-badges.component';
14
+ import { ScDraftExpirationClockService } from './services/sc-draft-expiration-clock.service';
10
15
  import * as i0 from "@angular/core";
11
16
  /**
12
17
  * Компонент страницы черновика заказа (аналог корзины для одного черновика).
13
18
  */
14
19
  export class ScDraftComponent {
20
+ /**
21
+ * Инициализирует экземпляр класса {@link ScDraftComponent}.
22
+ */
15
23
  constructor() {
16
24
  /**
17
25
  * Сервис маршрутизации.
@@ -25,6 +33,10 @@ export class ScDraftComponent {
25
33
  * Сервис для работы с черновиками заказов.
26
34
  */
27
35
  this.draftsService = inject(ScOrderDraftsService);
36
+ /**
37
+ * Сервис уведомлений.
38
+ */
39
+ this.alerts = inject(TuiAlertService);
28
40
  /**
29
41
  * Сигнал с данными текущего черновика заказа (из параметра orderId в URL).
30
42
  */
@@ -45,6 +57,45 @@ export class ScDraftComponent {
45
57
  * Текущий ключ маршрута.
46
58
  */
47
59
  this.isDraftPage = toSignal(this.route.data.pipe(map((data) => data['routes_key'] === ScRouteKeys.draft), distinctUntilChanged()), { initialValue: false });
60
+ /**
61
+ * Признак черновика Профстрой.
62
+ */
63
+ this.isProfstroy = computed(() => this.draft()?.isProfstroy === true);
64
+ /**
65
+ * Признак, что идёт обработка черновика Профстрой.
66
+ */
67
+ this.isProcessing = computed(() => this.draft()?.actualization?.isProcessing === true);
68
+ /**
69
+ * Сервис текущего момента для проверки срока актуализации.
70
+ */
71
+ this.expirationClock = inject(ScDraftExpirationClockService);
72
+ /**
73
+ * Текущий момент для проверки срока актуализации из общего источника. Обновляется, пока открыт черновик Профстрой.
74
+ */
75
+ this.now = this.expirationClock.nowWhile(this.isProfstroy);
76
+ /**
77
+ * Признак выполнения актуализации или пересборки черновика Профстрой.
78
+ */
79
+ this.actionRunning = signal(false);
80
+ /**
81
+ * Признак, что для черновика выполняются или ждут очереди запросы изменения или перечитывания.
82
+ */
83
+ this.queueBusy = toSignal(toObservable(this.draft).pipe(map((draft) => draft?.id), distinctUntilChanged(), switchMap((draftId) => (draftId === undefined ? of(false) : this.draftsService.isBusy$(draftId)))), { initialValue: false });
84
+ /**
85
+ * Признак, что действия над черновиком Профстрой недоступны, пока выполняется действие или запрос черновика.
86
+ */
87
+ this.busy = computed(() => this.actionRunning() || this.queueBusy());
88
+ /**
89
+ * Признак, что можно менять состав черновика Профстрой.
90
+ */
91
+ this.canEditProfstroy = computed(() => this.isDraftPage() && !this.actionRunning() && !this.isProcessing());
92
+ /**
93
+ * Причина, по которой нельзя оформить заказ из черновика Профстрой, или пустая строка.
94
+ */
95
+ this.profstroyOrderBlockReason = computed(() => {
96
+ const reason = this.draft()?.getOrderBlockReason(this.now()) ?? '';
97
+ return reason || (this.selectedItemsIds().length === 0 ? 'Выберите позиции для заказа.' : '');
98
+ });
48
99
  /**
49
100
  * Ссылка для автоматического управления уничтожением зависимостей.
50
101
  */
@@ -53,6 +104,7 @@ export class ScDraftComponent {
53
104
  * Сервис установки SEO-данных приложения.
54
105
  */
55
106
  this.seoService = inject(ScSeoService);
107
+ this.watchProfstroyProcessing();
56
108
  }
57
109
  /** @inheritDoc */
58
110
  ngOnInit() {
@@ -73,7 +125,32 @@ export class ScDraftComponent {
73
125
  this.router.navigate(['orders', 'new', this.draft()?.id, 'draft'], { queryParams: { itemsIds: this.selectedItemsIds() } }).catch(noop);
74
126
  }
75
127
  /**
76
- * Удаляет черновик и перенаправляет к списку черновиков.
128
+ * Запускает актуализацию черновика Профстрой.
129
+ */
130
+ actualizeProfstroy() {
131
+ this.runProfstroyAction((draftId) => this.draftsService.actualizeProfstroy$(draftId));
132
+ }
133
+ /**
134
+ * Запускает пересборку черновика Профстрой из файла после подтверждения.
135
+ */
136
+ reloadProfstroy() {
137
+ this.dialogService
138
+ .open(TUI_CONFIRM, {
139
+ label: 'Собрать заявку заново?',
140
+ data: {
141
+ content: 'Заявка будет собрана заново из загруженного файла. Изменённые количество, метраж и маркировка позиций, а также удалённые позиции будут потеряны. Продолжить?',
142
+ yes: 'Да, собрать заново',
143
+ no: 'Отмена',
144
+ },
145
+ })
146
+ .pipe(filter(Boolean), takeUntilDestroyed(this.destroyRef))
147
+ .subscribe(() => {
148
+ this.runProfstroyAction((draftId) => this.draftsService.reloadProfstroy$(draftId));
149
+ });
150
+ }
151
+ /**
152
+ * Удаляет черновик и перенаправляет к списку черновиков. Пока черновик удаляется, действия над ним заблокированы.
153
+ * Если удалить не удалось, пользователь остаётся на странице, сообщение об ошибке показывает перехватчик приложения.
77
154
  */
78
155
  clearDraft() {
79
156
  const { id } = this.draft() ?? {};
@@ -89,27 +166,84 @@ export class ScDraftComponent {
89
166
  no: 'Нет, оставить',
90
167
  },
91
168
  })
92
- .pipe(filter(Boolean), switchMap(() => this.draftsService.delete$(id)), takeUntilDestroyed(this.destroyRef))
93
- .subscribe(() => {
94
- this.deleteEvent.emit();
95
- this.router.navigate(['/drafts']).catch(noop);
169
+ .pipe(filter(Boolean), switchMap(() => {
170
+ this.actionRunning.set(true);
171
+ return this.draftsService.delete$(id).pipe(finalize(() => {
172
+ this.actionRunning.set(false);
173
+ }));
174
+ }), takeUntilDestroyed(this.destroyRef))
175
+ .subscribe({
176
+ next: () => {
177
+ this.deleteEvent.emit();
178
+ this.router.navigate(['/drafts']).catch(noop);
179
+ },
180
+ error: noop,
96
181
  });
97
182
  }
183
+ /**
184
+ * Выполняет действие над черновиком Профстрой. Пока действие выполняется, остальные заблокированы.
185
+ * Ответ попадает в кэш черновика, после отказа 403 или 409 сервис сам перезапрашивает черновик. Сообщение об ошибке показывает перехватчик приложения.
186
+ *
187
+ * @param action Функция, возвращающая запрос действия по идентификатору черновика.
188
+ */
189
+ runProfstroyAction(action) {
190
+ const draftId = this.draft()?.id;
191
+ if (draftId === undefined || this.busy()) {
192
+ return;
193
+ }
194
+ this.actionRunning.set(true);
195
+ action(draftId)
196
+ .pipe(finalize(() => {
197
+ this.actionRunning.set(false);
198
+ }), takeUntilDestroyed(this.destroyRef))
199
+ .subscribe({ error: noop });
200
+ }
201
+ /**
202
+ * Пока черновик Профстрой на его странице в обработке, опрашивает состояние лёгким запросом списка и после окончания обработки перезапрашивает черновик.
203
+ * Опрос идёт, пока перезапрошенный черновик остаётся в обработке: неудачный перезапрос повторяется на следующем шаге.
204
+ * Если черновика больше нет (удалён в другой вкладке), опрос завершается, а пользователь возвращается к списку. В списке черновиков состояние опрашивает сам список.
205
+ */
206
+ watchProfstroyProcessing() {
207
+ toObservable(computed(() => (this.isDraftPage() && this.isProcessing() ? this.draft()?.id : undefined)))
208
+ .pipe(distinctUntilChanged(), switchMap((draftId) => draftId === undefined
209
+ ? EMPTY
210
+ : this.draftsService.watchShortList$([draftId]).pipe(filter((drafts) => !drafts.some((short) => short.id === draftId && short.actualization?.isProcessing)), exhaustMap(() => this.draftsService.fetch$(draftId).pipe(catchError((error) => (ScApiErrorHelper.isNotFound(error) ? of(null) : EMPTY)))), takeWhile((draft) => draft?.actualization?.isProcessing === true, true), filter((draft) => draft === null), map(() => draftId))), takeUntilDestroyed(this.destroyRef))
211
+ .subscribe((draftId) => {
212
+ this.leaveMissingDraft(draftId);
213
+ });
214
+ }
215
+ /**
216
+ * Сообщает, что черновик не найден, и возвращает к списку черновиков.
217
+ *
218
+ * @param draftId Идентификатор черновика.
219
+ */
220
+ leaveMissingDraft(draftId) {
221
+ this.alerts.open(`Черновик №${draftId} не найден. Возможно, он удалён.`, { appearance: 'warning' }).subscribe();
222
+ this.router.navigate(['/drafts']).catch(noop);
223
+ }
98
224
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScDraftComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
99
225
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScDraftComponent, isStandalone: true, selector: "sc-draft", inputs: { draft: { classPropertyName: "draft", publicName: "draft", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { draft: "draftChange", deleteEvent: "deleteEvent" }, providers: [
100
226
  {
101
227
  provide: SC_ORDER_LOADER,
102
228
  useExisting: ScOrderDraftsService,
103
229
  },
104
- ], ngImport: i0, template: "@let items = draft()?.products;\n\n@if (items) {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @if (items.length) {\n <sc-order-items-list-with-actions\n scOrder\n [orderId]=\"draft()?.id\"\n [items]=\"items\"\n [editable]=\"isDraftPage()\"\n (selectedItemsIdsChange)=\"selectedItemsIds.set($event)\"\n >\n <div\n footerActions\n class=\"flex w-full flex-col items-center gap-x-2.5 gap-y-4 sm:flex-row sm:flex-wrap sm:items-start\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n\n <button\n tuiButton\n type=\"button\"\n class=\"sm:ml-auto\"\n iconStart=\"@tui.shopping-cart\"\n [disabled]=\"selectedItemsIds().length === 0\"\n (click)=\"goToNewOrder()\"\n >\n \u0417\u0430\u043A\u0430\u0437\u0430\u0442\u044C\n </button>\n </div>\n </sc-order-items-list-with-actions>\n } @else {\n <p class=\"text-base font-bold\">\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u0443\u0441\u0442.</p>\n <div\n footerActions\n class=\"flex gap-2\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @for (item of [1, 2, 3, 4]; track item) {\n <div class=\"tui-skeleton flex h-[8.25rem] w-full overflow-hidden rounded-xl\"></div>\n }\n <div class=\"flex gap-2\">\n <div class=\"tui-skeleton h-10 w-40 rounded-md\"></div>\n <div class=\"tui-skeleton h-10 w-36 rounded-md\"></div>\n </div>\n </div>\n </div>\n}\n", dependencies: [{ kind: "component", type: ScOrderItemsListWithActionsComponent, selector: "sc-order-items-list-with-actions", inputs: ["items", "selectable", "editable", "selectedItemsIds"], outputs: ["selectedItemsIdsChange"] }, { kind: "directive", type: ScOrderAccessorDirective, selector: "[scOrder]", inputs: ["orderId"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
230
+ ], ngImport: i0, template: "@let currentDraft = draft();\n\n@if (currentDraft && currentDraft.isProfstroy) {\n <div class=\"flex flex-col gap-5\">\n <sc-profstroy-draft-badges\n [actualization]=\"currentDraft.actualization\"\n [now]=\"now()\"\n />\n\n <sc-profstroy-actualization-panel\n [draft]=\"currentDraft\"\n [now]=\"now()\"\n [busy]=\"busy() || !isDraftPage()\"\n (actualize)=\"actualizeProfstroy()\"\n (reload)=\"reloadProfstroy()\"\n />\n\n @if (currentDraft.products.length) {\n <sc-order-items-list\n scOrder\n [orderId]=\"currentDraft.id\"\n [items]=\"currentDraft.products\"\n [grouped]=\"true\"\n [markUnavailable]=\"true\"\n [useLinePrice]=\"true\"\n [measuredInDialog]=\"true\"\n [editable]=\"canEditProfstroy()\"\n [selectable]=\"true\"\n deleteConfirmationTarget=\"\u0438\u0437 \u0437\u0430\u044F\u0432\u043A\u0438\"\n totalLabel=\"\u0418\u0422\u041E\u0413\u041E \u041A \u0417\u0410\u041A\u0410\u0417\u0423\"\n (selectedItemsIdsChange)=\"selectedItemsIds.set($event)\"\n />\n } @else {\n <p class=\"text-base font-bold\">{{ isProcessing() ? '\u041F\u043E\u0437\u0438\u0446\u0438\u0438 \u043F\u043E\u044F\u0432\u044F\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0444\u0430\u0439\u043B\u0430' : '\u0412 \u0437\u0430\u044F\u0432\u043A\u0435 \u043D\u0435\u0442 \u043F\u043E\u0437\u0438\u0446\u0438\u0439' }}</p>\n }\n\n <div class=\"flex flex-col items-center gap-x-2.5 gap-y-4 sm:flex-row sm:flex-wrap-reverse sm:items-start\">\n <button\n tuiButton\n appearance=\"secondary\"\n iconStart=\"@tui.trash-2\"\n [disabled]=\"busy()\"\n (click)=\"clearDraft()\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n\n <div class=\"flex flex-col items-center gap-1 sm:ml-auto sm:items-end\">\n <button\n tuiButton\n type=\"button\"\n iconStart=\"@tui.shopping-cart\"\n [disabled]=\"busy() || !!profstroyOrderBlockReason()\"\n (click)=\"goToNewOrder()\"\n >\n \u041E\u0444\u043E\u0440\u043C\u0438\u0442\u044C \u0437\u0430\u043A\u0430\u0437\n </button>\n @if (profstroyOrderBlockReason(); as reason) {\n <span class=\"text-body-s text-tui-text-02\">{{ reason }}</span>\n }\n </div>\n </div>\n </div>\n} @else {\n @let items = draft()?.products;\n\n @if (items) {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @if (items.length) {\n <sc-order-items-list-with-actions\n scOrder\n [orderId]=\"draft()?.id\"\n [items]=\"items\"\n [editable]=\"isDraftPage()\"\n deleteConfirmationTarget=\"\u0438\u0437 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0430\"\n (selectedItemsIdsChange)=\"selectedItemsIds.set($event)\"\n >\n <div\n footerActions\n class=\"flex w-full flex-col items-center gap-x-2.5 gap-y-4 sm:flex-row sm:flex-wrap sm:items-start\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n\n <button\n tuiButton\n type=\"button\"\n class=\"sm:ml-auto\"\n iconStart=\"@tui.shopping-cart\"\n [disabled]=\"selectedItemsIds().length === 0\"\n (click)=\"goToNewOrder()\"\n >\n \u0417\u0430\u043A\u0430\u0437\u0430\u0442\u044C\n </button>\n </div>\n </sc-order-items-list-with-actions>\n } @else {\n <p class=\"text-base font-bold\">\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u0443\u0441\u0442.</p>\n <div\n footerActions\n class=\"flex gap-2\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @for (item of [1, 2, 3, 4]; track item) {\n <div class=\"tui-skeleton flex h-[8.25rem] w-full overflow-hidden rounded-xl\"></div>\n }\n <div class=\"flex gap-2\">\n <div class=\"tui-skeleton h-10 w-40 rounded-md\"></div>\n <div class=\"tui-skeleton h-10 w-36 rounded-md\"></div>\n </div>\n </div>\n </div>\n }\n}\n", dependencies: [{ kind: "component", type: ScOrderItemsListWithActionsComponent, selector: "sc-order-items-list-with-actions", inputs: ["items", "selectable", "editable", "useLinePrice", "deleteConfirmationTarget", "totalLabel", "selectedItemsIds"], outputs: ["selectedItemsIdsChange"] }, { kind: "directive", type: ScOrderAccessorDirective, selector: "[scOrder]", inputs: ["orderId"] }, { kind: "component", type: ScProfstroyActualizationPanelComponent, selector: "sc-profstroy-actualization-panel", inputs: ["draft", "now", "busy"], outputs: ["actualize", "reload"] }, { kind: "component", type: ScProfstroyDraftBadgesComponent, selector: "sc-profstroy-draft-badges", inputs: ["actualization", "now"] }, { kind: "component", type: ScOrderItemsListComponent, selector: "sc-order-items-list", inputs: ["selectable", "editable", "grouped", "markUnavailable", "useLinePrice", "measuredInDialog", "deleteConfirmationTarget", "totalLabel", "items"], outputs: ["selectedItemsIdsChange"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
105
231
  }
106
232
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScDraftComponent, decorators: [{
107
233
  type: Component,
108
- args: [{ standalone: true, selector: 'sc-draft', imports: [ScOrderItemsListWithActionsComponent, ScOrderAccessorDirective, TuiButton, TuiIcons], providers: [
234
+ args: [{ standalone: true, selector: 'sc-draft', imports: [
235
+ ScOrderItemsListWithActionsComponent,
236
+ ScOrderAccessorDirective,
237
+ ScProfstroyActualizationPanelComponent,
238
+ ScProfstroyDraftBadgesComponent,
239
+ ScOrderItemsListComponent,
240
+ TuiButton,
241
+ TuiIcons,
242
+ ], providers: [
109
243
  {
110
244
  provide: SC_ORDER_LOADER,
111
245
  useExisting: ScOrderDraftsService,
112
246
  },
113
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let items = draft()?.products;\n\n@if (items) {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @if (items.length) {\n <sc-order-items-list-with-actions\n scOrder\n [orderId]=\"draft()?.id\"\n [items]=\"items\"\n [editable]=\"isDraftPage()\"\n (selectedItemsIdsChange)=\"selectedItemsIds.set($event)\"\n >\n <div\n footerActions\n class=\"flex w-full flex-col items-center gap-x-2.5 gap-y-4 sm:flex-row sm:flex-wrap sm:items-start\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n\n <button\n tuiButton\n type=\"button\"\n class=\"sm:ml-auto\"\n iconStart=\"@tui.shopping-cart\"\n [disabled]=\"selectedItemsIds().length === 0\"\n (click)=\"goToNewOrder()\"\n >\n \u0417\u0430\u043A\u0430\u0437\u0430\u0442\u044C\n </button>\n </div>\n </sc-order-items-list-with-actions>\n } @else {\n <p class=\"text-base font-bold\">\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u0443\u0441\u0442.</p>\n <div\n footerActions\n class=\"flex gap-2\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n </div>\n }\n </div>\n </div>\n} @else {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @for (item of [1, 2, 3, 4]; track item) {\n <div class=\"tui-skeleton flex h-[8.25rem] w-full overflow-hidden rounded-xl\"></div>\n }\n <div class=\"flex gap-2\">\n <div class=\"tui-skeleton h-10 w-40 rounded-md\"></div>\n <div class=\"tui-skeleton h-10 w-36 rounded-md\"></div>\n </div>\n </div>\n </div>\n}\n" }]
114
- }] });
115
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtZHJhZnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL29yZGVyL2RyYWZ0L3NjLWRyYWZ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9vcmRlci9kcmFmdC9zYy1kcmFmdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBZ0Isb0JBQW9CLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6SSxPQUFPLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSw2RUFBNkUsQ0FBQzs7QUFFbkk7O0dBRUc7QUFjSCxNQUFNLE9BQU8sZ0JBQWdCO0lBYjdCO1FBY0k7O1dBRUc7UUFDYyxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxD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RSxDQUFDLENBQUMsRUFDL0Msa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUN0QzthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDOytHQXpHUSxnQkFBZ0I7bUdBQWhCLGdCQUFnQiwwUEFSZDtZQUNQO2dCQUNJLE9BQU8sRUFBRSxlQUFlO2dCQUN4QixXQUFXLEVBQUUsb0JBQW9CO2FBQ3BDO1NBQ0osMEJDeEJMLHkzRkFxRUEsNENEbkRjLG9DQUFvQyxtTEFBRSx3QkFBd0IsMkVBQUUsU0FBUzs7NEZBUzFFLGdCQUFnQjtrQkFiNUIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sVUFBVSxXQUVYLENBQUMsb0NBQW9DLEVBQUUsd0JBQXdCLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxhQUNuRjt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsZUFBZTs0QkFDeEIsV0FBVyxFQUFFLG9CQUFvQjt5QkFDcEM7cUJBQ0osbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBEZXN0cm95UmVmLCBpbmplY3QsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTQ19PUkRFUl9MT0FERVIsIFNjT3JkZXJEcmFmdCwgU2NPcmRlckRyYWZ0c1NlcnZpY2UsIHNjT3JkZXJJc0xvYWRlZCwgU2NSb3V0ZUtleXMsIFNjU2VvU2VydmljZSB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVHVpQnV0dG9uLCBUdWlEaWFsb2dTZXJ2aWNlLCBUdWlJY29ucyB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFRVSV9DT05GSVJNIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBtYXAsIG5vb3AsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY09yZGVyQWNjZXNzb3JEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3NjLW9yZGVyLWFjY2Vzc29yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTY09yZGVySXRlbXNMaXN0V2l0aEFjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9vcmRlci1pdGVtcy1saXN0LXdpdGgtYWN0aW9ucy9zYy1vcmRlci1pdGVtcy1saXN0LXdpdGgtYWN0aW9ucy5jb21wb25lbnQnO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDRgdGC0YDQsNC90LjRhtGLINGH0LXRgNC90L7QstC40LrQsCDQt9Cw0LrQsNC30LAgKNCw0L3QsNC70L7QsyDQutC+0YDQt9C40L3RiyDQtNC70Y8g0L7QtNC90L7Qs9C+INGH0LXRgNC90L7QstC40LrQsCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1kcmFmdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWRyYWZ0LmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbU2NPcmRlckl0ZW1zTGlzdFdpdGhBY3Rpb25zQ29tcG9uZW50LCBTY09yZGVyQWNjZXNzb3JEaXJlY3RpdmUsIFR1aUJ1dHRvbiwgVHVpSWNvbnNdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBTQ19PUkRFUl9MT0FERVIsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogU2NPcmRlckRyYWZ0c1NlcnZpY2UsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NEcmFmdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC80LDRgNGI0YDRg9GC0LjQt9Cw0YbQuNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0L/RgNC10LTQvtGB0YLQsNCy0LvRj9GO0YnQuNC5INC00L7RgdGC0YPQvyDQuiDQtNCw0L3QvdGL0Lwg0L4g0LzQsNGA0YjRgNGD0YLQtS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDRh9C10YDQvdC+0LLQuNC60LDQvNC4INC30LDQutCw0LfQvtCyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJhZnRzU2VydmljZSA9IGluamVjdChTY09yZGVyRHJhZnRzU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC40LPQvdCw0Lsg0YEg0LTQsNC90L3Ri9C80Lgg0YLQtdC60YPRidC10LPQviDRh9C10YDQvdC+0LLQuNC60LAg0LfQsNC60LDQt9CwICjQuNC3INC/0LDRgNCw0LzQtdGC0YDQsCBvcmRlcklkINCyIFVSTCkuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRyYWZ0ID0gbW9kZWw8U2NPcmRlckRyYWZ0IHwgbnVsbD4obnVsbCk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNGLINC/0L7Qt9C40YbQuNC5INGH0LXRgNC90L7QstC40LrQsCwg0LLRi9Cx0YDQsNC90L3Ri9GFINC00LvRjyDQvtGE0L7RgNC80LvQtdC90LjRjyDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlbGVjdGVkSXRlbXNJZHMgPSBzaWduYWw8c3RyaW5nW10+KFtdKTtcblxuICAgIC8qKlxuICAgICAqINCY0YHRgtC+0YfQvdC40Log0YHQvtCx0YvRgtC40Y8g0YPQtNCw0LvQtdC90LjRjyDQuNC70Lgg0L7RgtC80LXQvdGLINC30LDQutCw0LfQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZGVsZXRlRXZlbnQgPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC00LjQsNC70L7Qs9C+0LLRi9C80Lgg0L7QutC90LDQvNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nU2VydmljZSA9IGluamVjdDxUdWlEaWFsb2dTZXJ2aWNlPihUdWlEaWFsb2dTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCi0LXQutGD0YnQuNC5INC60LvRjtGHINC80LDRgNGI0YDRg9GC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzRHJhZnRQYWdlID0gdG9TaWduYWwoXG4gICAgICAgIHRoaXMucm91dGUuZGF0YS5waXBlKFxuICAgICAgICAgICAgbWFwKChkYXRhKSA9PiAoZGF0YVsncm91dGVzX2tleSddIGFzIFNjUm91dGVLZXlzKSA9PT0gU2NSb3V0ZUtleXMuZHJhZnQpLFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxuICAgICAgICApLFxuICAgICAgICB7IGluaXRpYWxWYWx1ZTogZmFsc2UgfVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQodGB0YvQu9C60LAg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDRg9C/0YDQsNCy0LvQtdC90LjRjyDRg9C90LjRh9GC0L7QttC10L3QuNC10Lwg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDRg9GB0YLQsNC90L7QstC60LggU0VPLdC00LDQvdC90YvRhSDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlb1NlcnZpY2U6IFNjU2VvU2VydmljZSA9IGluamVjdChTY1Nlb1NlcnZpY2UpO1xuXG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZHJhZnQoKSkge1xuICAgICAgICAgICAgdGhpcy5kcmFmdHNTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldCQoTnVtYmVyLnBhcnNlSW50KHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdvcmRlcklkJykgPz8gJycsIDEwKSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoc2NPcmRlcklzTG9hZGVkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFmdC5zZXQoZHJhZnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlb1NlcnZpY2Uuc2V0QnlEZWZhdWx0QXNOb0luZGV4ZWQoJ9Cn0LXRgNC90L7QstC40LrQuCDQt9Cw0LrQsNC30L7QsicpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXRhdC+0LQg0Log0L7RhNC+0YDQvNC70LXQvdC40Y4g0LfQsNC60LDQt9CwINC40Lcg0LLRi9Cx0YDQsNC90L3Ri9GFINC/0L7Qt9C40YbQuNC5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnb1RvTmV3T3JkZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnb3JkZXJzJywgJ25ldycsIHRoaXMuZHJhZnQoKT8uaWQsICdkcmFmdCddLCB7IHF1ZXJ5UGFyYW1zOiB7IGl0ZW1zSWRzOiB0aGlzLnNlbGVjdGVkSXRlbXNJZHMoKSB9IH0pLmNhdGNoKG5vb3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0LTQsNC70Y/QtdGCINGH0LXRgNC90L7QstC40Log0Lgg0L/QtdGA0LXQvdCw0L/RgNCw0LLQu9GP0LXRgiDQuiDRgdC/0LjRgdC60YMg0YfQtdGA0L3QvtCy0LjQutC+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNsZWFyRHJhZnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMuZHJhZnQoKSA/PyB7fTtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuPGJvb2xlYW4+KFRVSV9DT05GSVJNLCB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGDQo9C00LDQu9C40YLRjCDRh9C10YDQvdC+0LLQuNC6IOKEliR7aWR9P2AsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBg0K3RgtC+INC00LXQudGB0YLQstC40LUg0YPQtNCw0LvQuNGCINGH0LXRgNC90L7QstC40Log4oSWJHtpZH0uYCxcbiAgICAgICAgICAgICAgICAgICAgeWVzOiAn0JTQsCwg0YPQtNCw0LvQuNGC0YwnLFxuICAgICAgICAgICAgICAgICAgICBubzogJ9Cd0LXRgiwg0L7RgdGC0LDQstC40YLRjCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZHJhZnRzU2VydmljZS5kZWxldGUkKGlkKSksXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlRXZlbnQuZW1pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2RyYWZ0cyddKS5jYXRjaChub29wKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbiIsIkBsZXQgaXRlbXMgPSBkcmFmdCgpPy5wcm9kdWN0cztcblxuQGlmIChpdGVtcykge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNVwiPlxuICAgICAgICAgICAgQGlmIChpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICA8c2Mtb3JkZXItaXRlbXMtbGlzdC13aXRoLWFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgc2NPcmRlclxuICAgICAgICAgICAgICAgICAgICBbb3JkZXJJZF09XCJkcmFmdCgpPy5pZFwiXG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgIFtlZGl0YWJsZV09XCJpc0RyYWZ0UGFnZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkSXRlbXNJZHNDaGFuZ2UpPVwic2VsZWN0ZWRJdGVtc0lkcy5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBmb290ZXJBY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAteC0yLjUgZ2FwLXktNCBzbTpmbGV4LXJvdyBzbTpmbGV4LXdyYXAgc206aXRlbXMtc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsZWFyRHJhZnQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS50cmFzaC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQo9C00LDQu9C40YLRjCDRh9C10YDQvdC+0LLQuNC6XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic206bWwtYXV0b1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5zaG9wcGluZy1jYXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRJdGVtc0lkcygpLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvVG9OZXdPcmRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQl9Cw0LrQsNC30LDRgtGMXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9zYy1vcmRlci1pdGVtcy1saXN0LXdpdGgtYWN0aW9ucz5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPtCn0LXRgNC90L7QstC40Log0L/Rg9GB0YIuPC9wPlxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgZm9vdGVyQWN0aW9uc1xuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZ2FwLTJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckRyYWZ0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS50cmFzaC0yXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAg0KPQtNCw0LvQuNGC0Ywg0YfQtdGA0L3QvtCy0LjQulxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG59IEBlbHNlIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTVcIj5cbiAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgWzEsIDIsIDMsIDRdOyB0cmFjayBpdGVtKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1za2VsZXRvbiBmbGV4IGgtWzguMjVyZW1dIHctZnVsbCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bFwiPjwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLXNrZWxldG9uIGgtMTAgdy00MCByb3VuZGVkLW1kXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1za2VsZXRvbiBoLTEwIHctMzYgcm91bmRlZC1tZFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxufVxuIl19
247
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let currentDraft = draft();\n\n@if (currentDraft && currentDraft.isProfstroy) {\n <div class=\"flex flex-col gap-5\">\n <sc-profstroy-draft-badges\n [actualization]=\"currentDraft.actualization\"\n [now]=\"now()\"\n />\n\n <sc-profstroy-actualization-panel\n [draft]=\"currentDraft\"\n [now]=\"now()\"\n [busy]=\"busy() || !isDraftPage()\"\n (actualize)=\"actualizeProfstroy()\"\n (reload)=\"reloadProfstroy()\"\n />\n\n @if (currentDraft.products.length) {\n <sc-order-items-list\n scOrder\n [orderId]=\"currentDraft.id\"\n [items]=\"currentDraft.products\"\n [grouped]=\"true\"\n [markUnavailable]=\"true\"\n [useLinePrice]=\"true\"\n [measuredInDialog]=\"true\"\n [editable]=\"canEditProfstroy()\"\n [selectable]=\"true\"\n deleteConfirmationTarget=\"\u0438\u0437 \u0437\u0430\u044F\u0432\u043A\u0438\"\n totalLabel=\"\u0418\u0422\u041E\u0413\u041E \u041A \u0417\u0410\u041A\u0410\u0417\u0423\"\n (selectedItemsIdsChange)=\"selectedItemsIds.set($event)\"\n />\n } @else {\n <p class=\"text-base font-bold\">{{ isProcessing() ? '\u041F\u043E\u0437\u0438\u0446\u0438\u0438 \u043F\u043E\u044F\u0432\u044F\u0442\u0441\u044F \u043F\u043E\u0441\u043B\u0435 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0444\u0430\u0439\u043B\u0430' : '\u0412 \u0437\u0430\u044F\u0432\u043A\u0435 \u043D\u0435\u0442 \u043F\u043E\u0437\u0438\u0446\u0438\u0439' }}</p>\n }\n\n <div class=\"flex flex-col items-center gap-x-2.5 gap-y-4 sm:flex-row sm:flex-wrap-reverse sm:items-start\">\n <button\n tuiButton\n appearance=\"secondary\"\n iconStart=\"@tui.trash-2\"\n [disabled]=\"busy()\"\n (click)=\"clearDraft()\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n\n <div class=\"flex flex-col items-center gap-1 sm:ml-auto sm:items-end\">\n <button\n tuiButton\n type=\"button\"\n iconStart=\"@tui.shopping-cart\"\n [disabled]=\"busy() || !!profstroyOrderBlockReason()\"\n (click)=\"goToNewOrder()\"\n >\n \u041E\u0444\u043E\u0440\u043C\u0438\u0442\u044C \u0437\u0430\u043A\u0430\u0437\n </button>\n @if (profstroyOrderBlockReason(); as reason) {\n <span class=\"text-body-s text-tui-text-02\">{{ reason }}</span>\n }\n </div>\n </div>\n </div>\n} @else {\n @let items = draft()?.products;\n\n @if (items) {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @if (items.length) {\n <sc-order-items-list-with-actions\n scOrder\n [orderId]=\"draft()?.id\"\n [items]=\"items\"\n [editable]=\"isDraftPage()\"\n deleteConfirmationTarget=\"\u0438\u0437 \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\u0430\"\n (selectedItemsIdsChange)=\"selectedItemsIds.set($event)\"\n >\n <div\n footerActions\n class=\"flex w-full flex-col items-center gap-x-2.5 gap-y-4 sm:flex-row sm:flex-wrap sm:items-start\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n\n <button\n tuiButton\n type=\"button\"\n class=\"sm:ml-auto\"\n iconStart=\"@tui.shopping-cart\"\n [disabled]=\"selectedItemsIds().length === 0\"\n (click)=\"goToNewOrder()\"\n >\n \u0417\u0430\u043A\u0430\u0437\u0430\u0442\u044C\n </button>\n </div>\n </sc-order-items-list-with-actions>\n } @else {\n <p class=\"text-base font-bold\">\u0427\u0435\u0440\u043D\u043E\u0432\u0438\u043A \u043F\u0443\u0441\u0442.</p>\n <div\n footerActions\n class=\"flex gap-2\"\n >\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"clearDraft()\"\n iconStart=\"@tui.trash-2\"\n >\n \u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0447\u0435\u0440\u043D\u043E\u0432\u0438\u043A\n </button>\n </div>\n }\n </div>\n </div>\n } @else {\n <div class=\"flex flex-col gap-12\">\n <div class=\"flex flex-col gap-5\">\n @for (item of [1, 2, 3, 4]; track item) {\n <div class=\"tui-skeleton flex h-[8.25rem] w-full overflow-hidden rounded-xl\"></div>\n }\n <div class=\"flex gap-2\">\n <div class=\"tui-skeleton h-10 w-40 rounded-md\"></div>\n <div class=\"tui-skeleton h-10 w-36 rounded-md\"></div>\n </div>\n </div>\n </div>\n }\n}\n" }]
248
+ }], ctorParameters: () => [] });
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtZHJhZnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL29yZGVyL2RyYWZ0L3NjLWRyYWZ0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9vcmRlci9kcmFmdC9zYy1kcmFmdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hJLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFnQixvQkFBb0IsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3pJLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUU5SSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM5RixPQUFPLEVBQUUsb0NBQW9DLEVBQUUsTUFBTSw2RUFBNkUsQ0FBQztBQUNuSSxPQUFPLEVBQUUsc0NBQXNDLEVBQUUsTUFBTSw0RUFBNEUsQ0FBQztBQUNwSSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUN6RyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQzs7QUFFN0Y7O0dBRUc7QUFzQkgsTUFBTSxPQUFPLGdCQUFnQjtJQXNIekI7O09BRUc7SUFDSDtRQXhIQTs7V0FFRztRQUNjLFdBQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekM7O1dBRUc7UUFDYyxVQUFLLEdBQW1CLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVoRTs7V0FFRztRQUNjLGtCQUFhLEdBQUcsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFOUQ7O1dBRUc7UUFDYyxXQUFNLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRWxEOztXQUVHO1FBQ2EsVUFBSyxHQUFHLEtBQUssQ0FBc0IsSUFBSSxDQUFDLENBQUM7UUFFekQ7O1dBRUc7UUFDZ0IscUJBQWdCLEdBQUcsTUFBTSxDQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRTNEOztXQUVHO1FBQ2EsZ0JBQVcsR0FBRyxNQUFNLEVBQUUsQ0FBQztRQUV2Qzs7V0FFRztRQUNjLGtCQUFhLEdBQUcsTUFBTSxDQUFtQixnQkFBZ0IsQ0FBQyxDQUFDO1FBRTVFOztXQUVHO1FBQ2dCLGdCQUFXLEdBQUcsUUFBUSxDQUNyQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ2hCLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUUsSUFBSSxDQUFDLFlBQVksQ0FBaUIsS0FBSyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQ3hFLG9CQUFvQixFQUFFLENBQ3pCLEVBQ0QsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLENBQzFCLENBQUM7UUFFRjs7V0FFRztRQUNnQixnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsV0FBVyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXBGOztXQUVHO1FBQ2dCLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxhQUFhLEVBQUUsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXJHOztXQUVHO1FBQ2Msb0JBQWUsR0FBRyxNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQztRQUV6RTs7V0FFRztRQUNnQixRQUFHLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRXpFOztXQUVHO1FBQ2dCLGtCQUFhLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWpEOztXQUVHO1FBQ2dCLGNBQVMsR0FBRyxRQUFRLENBQ25DLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUN6QixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFDekIsb0JBQW9CLEVBQUUsRUFDdEIsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNwRyxFQUNELEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxDQUMxQixDQUFDO1FBRUY7O1dBRUc7UUFDZ0IsU0FBSSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFbkY7O1dBRUc7UUFDZ0IscUJBQWdCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBRTFIOztXQUVHO1FBQ2dCLDhCQUF5QixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUVuRSxPQUFPLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRyxDQUFDLENBQUMsQ0FBQztRQUVIOztXQUVHO1FBQ2MsZUFBVSxHQUFlLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU3RDs7V0FFRztRQUNjLGVBQVUsR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBTTdELElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxRQUFRO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxhQUFhO2lCQUNiLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2lCQUM1RSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztpQkFDbEUsU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLHVCQUF1QixDQUFDLG1CQUFtQixDQUFDLENBQUM7WUFDakUsQ0FBQyxDQUFDLENBQUM7UUFDWCxDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ08sWUFBWTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0ksQ0FBQztJQUVEOztPQUVHO0lBQ08sa0JBQWtCO1FBQ3hCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzFGLENBQUM7SUFFRDs7T0FFRztJQUNPLGVBQWU7UUFDckIsSUFBSSxDQUFDLGFBQWE7YUFDYixJQUFJLENBQVUsV0FBVyxFQUFFO1lBQ3hCLEtBQUssRUFBRSx3QkFBd0I7WUFDL0IsSUFBSSxFQUFFO2dCQUNGLE9BQU8sRUFDSCw4SkFBOEo7Z0JBQ2xLLEdBQUcsRUFBRSxvQkFBb0I7Z0JBQ3pCLEVBQUUsRUFBRSxRQUFRO2FBQ2Y7U0FDSixDQUFDO2FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDMUQsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3ZGLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7T0FHRztJQUNPLFVBQVU7UUFDaEIsTUFBTSxFQUFFLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFFbEMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ04sT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYTthQUNiLElBQUksQ0FBVSxXQUFXLEVBQUU7WUFDeEIsS0FBSyxFQUFFLHFCQUFxQixFQUFFLEdBQUc7WUFDakMsSUFBSSxFQUFFO2dCQUNGLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxHQUFHO2dCQUMvQyxHQUFHLEVBQUUsYUFBYTtnQkFDbEIsRUFBRSxFQUFFLGVBQWU7YUFDdEI7U0FDSixDQUFDO2FBQ0QsSUFBSSxDQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFDZixTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFFN0IsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQ3RDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbEMsQ0FBQyxDQUFDLENBQ0wsQ0FBQztRQUNOLENBQUMsQ0FBQyxFQUNGLGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDdEM7YUFDQSxTQUFTLENBQUM7WUFDUCxJQUFJLEVBQUUsR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUNELEtBQUssRUFBRSxJQUFJO1NBQ2QsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssa0JBQWtCLENBQUMsTUFBcUQ7UUFDNUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUVqQyxJQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdkMsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3QixNQUFNLENBQUMsT0FBTyxDQUFDO2FBQ1YsSUFBSSxDQUNELFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDVixJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsRUFDRixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDO2FBQ0EsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx3QkFBd0I7UUFDNUIsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7YUFDbkcsSUFBSSxDQUNELG9CQUFvQixFQUFFLEVBQ3RCLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ2xCLE9BQU8sS0FBSyxTQUFTO1lBQ2pCLENBQUMsQ0FBQyxLQUFLO1lBQ1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLE9BQU8sSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQ3RHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDbEosU0FBUyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksS0FBSyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQ3ZFLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxFQUNqQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQ3JCLENBQ1YsRUFDRCxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3RDO2FBQ0EsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUIsQ0FBQyxPQUFlO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsT0FBTyxrQ0FBa0MsRUFBRSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2hILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEQsQ0FBQzsrR0FsUlEsZ0JBQWdCO21HQUFoQixnQkFBZ0IsMFBBUmQ7WUFDUDtnQkFDSSxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsV0FBVyxFQUFFLG9CQUFvQjthQUNwQztTQUNKLDBCQ3JDTCw0bU1BdUlBLDRDRC9HUSxvQ0FBb0MsNk9BQ3BDLHdCQUF3QiwyRUFDeEIsc0NBQXNDLGlKQUN0QywrQkFBK0Isd0dBQy9CLHlCQUF5Qiw4UEFDekIsU0FBUzs7NEZBV0osZ0JBQWdCO2tCQXJCNUIsU0FBUztpQ0FDTSxJQUFJLFlBQ04sVUFBVSxXQUVYO3dCQUNMLG9DQUFvQzt3QkFDcEMsd0JBQXdCO3dCQUN4QixzQ0FBc0M7d0JBQ3RDLCtCQUErQjt3QkFDL0IseUJBQXlCO3dCQUN6QixTQUFTO3dCQUNULFFBQVE7cUJBQ1gsYUFDVTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsZUFBZTs0QkFDeEIsV0FBVyxFQUFFLG9CQUFvQjt5QkFDcEM7cUJBQ0osbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgaW5qZWN0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTQ19PUkRFUl9MT0FERVIsIFNjT3JkZXJEcmFmdCwgU2NPcmRlckRyYWZ0c1NlcnZpY2UsIHNjT3JkZXJJc0xvYWRlZCwgU2NSb3V0ZUtleXMsIFNjU2VvU2VydmljZSB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVHVpQWxlcnRTZXJ2aWNlLCBUdWlCdXR0b24sIFR1aURpYWxvZ1NlcnZpY2UsIFR1aUljb25zIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVFVJX0NPTkZJUk0gfSBmcm9tICdAdGFpZ2EtdWkva2l0JztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBFTVBUWSwgZXhoYXVzdE1hcCwgZmlsdGVyLCBmaW5hbGl6ZSwgbWFwLCBub29wLCBPYnNlcnZhYmxlLCBvZiwgc3dpdGNoTWFwLCB0YWtlV2hpbGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2NBcGlFcnJvckhlbHBlciB9IGZyb20gJy4uLy4uL2hlbHBlcnMvc2MtYXBpLWVycm9yLWhlbHBlcic7XG5pbXBvcnQgeyBTY09yZGVyQWNjZXNzb3JEaXJlY3RpdmUgfSBmcm9tICcuLi9kaXJlY3RpdmVzL3NjLW9yZGVyLWFjY2Vzc29yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBTY09yZGVySXRlbXNMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vb3JkZXItaXRlbXMtbGlzdC9zYy1vcmRlci1pdGVtcy1saXN0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY09yZGVySXRlbXNMaXN0V2l0aEFjdGlvbnNDb21wb25lbnQgfSBmcm9tICcuLi9vcmRlci1pdGVtcy1saXN0LXdpdGgtYWN0aW9ucy9zYy1vcmRlci1pdGVtcy1saXN0LXdpdGgtYWN0aW9ucy5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2NQcm9mc3Ryb3lBY3R1YWxpemF0aW9uUGFuZWxDb21wb25lbnQgfSBmcm9tICcuL3Byb2ZzdHJveS9hY3R1YWxpemF0aW9uLXBhbmVsL3NjLXByb2ZzdHJveS1hY3R1YWxpemF0aW9uLXBhbmVsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTY1Byb2ZzdHJveURyYWZ0QmFkZ2VzQ29tcG9uZW50IH0gZnJvbSAnLi9wcm9mc3Ryb3kvYmFkZ2VzL3NjLXByb2ZzdHJveS1kcmFmdC1iYWRnZXMuY29tcG9uZW50JztcbmltcG9ydCB7IFNjRHJhZnRFeHBpcmF0aW9uQ2xvY2tTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9zYy1kcmFmdC1leHBpcmF0aW9uLWNsb2NrLnNlcnZpY2UnO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDRgdGC0YDQsNC90LjRhtGLINGH0LXRgNC90L7QstC40LrQsCDQt9Cw0LrQsNC30LAgKNCw0L3QsNC70L7QsyDQutC+0YDQt9C40L3RiyDQtNC70Y8g0L7QtNC90L7Qs9C+INGH0LXRgNC90L7QstC40LrQsCkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1kcmFmdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWRyYWZ0LmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIFNjT3JkZXJJdGVtc0xpc3RXaXRoQWN0aW9uc0NvbXBvbmVudCxcbiAgICAgICAgU2NPcmRlckFjY2Vzc29yRGlyZWN0aXZlLFxuICAgICAgICBTY1Byb2ZzdHJveUFjdHVhbGl6YXRpb25QYW5lbENvbXBvbmVudCxcbiAgICAgICAgU2NQcm9mc3Ryb3lEcmFmdEJhZGdlc0NvbXBvbmVudCxcbiAgICAgICAgU2NPcmRlckl0ZW1zTGlzdENvbXBvbmVudCxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlJY29ucyxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBTQ19PUkRFUl9MT0FERVIsXG4gICAgICAgICAgICB1c2VFeGlzdGluZzogU2NPcmRlckRyYWZ0c1NlcnZpY2UsXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NEcmFmdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC80LDRgNGI0YDRg9GC0LjQt9Cw0YbQuNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0L/RgNC10LTQvtGB0YLQsNCy0LvRj9GO0YnQuNC5INC00L7RgdGC0YPQvyDQuiDQtNCw0L3QvdGL0Lwg0L4g0LzQsNGA0YjRgNGD0YLQtS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDRh9C10YDQvdC+0LLQuNC60LDQvNC4INC30LDQutCw0LfQvtCyLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZHJhZnRzU2VydmljZSA9IGluamVjdChTY09yZGVyRHJhZnRzU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0YPQstC10LTQvtC80LvQtdC90LjQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGFsZXJ0cyA9IGluamVjdChUdWlBbGVydFNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQuNCz0L3QsNC7INGBINC00LDQvdC90YvQvNC4INGC0LXQutGD0YnQtdCz0L4g0YfQtdGA0L3QvtCy0LjQutCwINC30LDQutCw0LfQsCAo0LjQtyDQv9Cw0YDQsNC80LXRgtGA0LAgb3JkZXJJZCDQsiBVUkwpLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBkcmFmdCA9IG1vZGVsPFNjT3JkZXJEcmFmdCB8IG51bGw+KG51bGwpO1xuXG4gICAgLyoqXG4gICAgICog0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YDRiyDQv9C+0LfQuNGG0LjQuSDRh9C10YDQvdC+0LLQuNC60LAsINCy0YvQsdGA0LDQvdC90YvRhSDQtNC70Y8g0L7RhNC+0YDQvNC70LXQvdC40Y8g0LfQsNC60LDQt9CwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzZWxlY3RlZEl0ZW1zSWRzID0gc2lnbmFsPHN0cmluZ1tdPihbXSk7XG5cbiAgICAvKipcbiAgICAgKiDQmNGB0YLQvtGH0L3QuNC6INGB0L7QsdGL0YLQuNGPINGD0LTQsNC70LXQvdC40Y8g0LjQu9C4INC+0YLQvNC10L3RiyDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGRlbGV0ZUV2ZW50ID0gb3V0cHV0KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQtNC40LDQu9C+0LPQvtCy0YvQvNC4INC+0LrQvdCw0LzQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2UgPSBpbmplY3Q8VHVpRGlhbG9nU2VydmljZT4oVHVpRGlhbG9nU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQotC10LrRg9GJ0LjQuSDQutC70Y7RhyDQvNCw0YDRiNGA0YPRgtCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0RyYWZ0UGFnZSA9IHRvU2lnbmFsKFxuICAgICAgICB0aGlzLnJvdXRlLmRhdGEucGlwZShcbiAgICAgICAgICAgIG1hcCgoZGF0YSkgPT4gKGRhdGFbJ3JvdXRlc19rZXknXSBhcyBTY1JvdXRlS2V5cykgPT09IFNjUm91dGVLZXlzLmRyYWZ0KSxcbiAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKSxcbiAgICAgICAgeyBpbml0aWFsVmFsdWU6IGZhbHNlIH1cbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0YfQtdGA0L3QvtCy0LjQutCwINCf0YDQvtGE0YHRgtGA0L7QuS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNQcm9mc3Ryb3kgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmRyYWZ0KCk/LmlzUHJvZnN0cm95ID09PSB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6LCDRh9GC0L4g0LjQtNGR0YIg0L7QsdGA0LDQsdC+0YLQutCwINGH0LXRgNC90L7QstC40LrQsCDQn9GA0L7RhNGB0YLRgNC+0LkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzUHJvY2Vzc2luZyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZHJhZnQoKT8uYWN0dWFsaXphdGlvbj8uaXNQcm9jZXNzaW5nID09PSB0cnVlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDRgtC10LrRg9GJ0LXQs9C+INC80L7QvNC10L3RgtCwINC00LvRjyDQv9GA0L7QstC10YDQutC4INGB0YDQvtC60LAg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhwaXJhdGlvbkNsb2NrID0gaW5qZWN0KFNjRHJhZnRFeHBpcmF0aW9uQ2xvY2tTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCi0LXQutGD0YnQuNC5INC80L7QvNC10L3RgiDQtNC70Y8g0L/RgNC+0LLQtdGA0LrQuCDRgdGA0L7QutCwINCw0LrRgtGD0LDQu9C40LfQsNGG0LjQuCDQuNC3INC+0LHRidC10LPQviDQuNGB0YLQvtGH0L3QuNC60LAuINCe0LHQvdC+0LLQu9GP0LXRgtGB0Y8sINC/0L7QutCwINC+0YLQutGA0YvRgiDRh9C10YDQvdC+0LLQuNC6INCf0YDQvtGE0YHRgtGA0L7QuS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbm93ID0gdGhpcy5leHBpcmF0aW9uQ2xvY2subm93V2hpbGUodGhpcy5pc1Byb2ZzdHJveSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDQstGL0L/QvtC70L3QtdC90LjRjyDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Lgg0LjQu9C4INC/0LXRgNC10YHQsdC+0YDQutC4INGH0LXRgNC90L7QstC40LrQsCDQn9GA0L7RhNGB0YLRgNC+0LkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGFjdGlvblJ1bm5pbmcgPSBzaWduYWwoZmFsc2UpO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0LosINGH0YLQviDQtNC70Y8g0YfQtdGA0L3QvtCy0LjQutCwINCy0YvQv9C+0LvQvdGP0Y7RgtGB0Y8g0LjQu9C4INC20LTRg9GCINC+0YfQtdGA0LXQtNC4INC30LDQv9GA0L7RgdGLINC40LfQvNC10L3QtdC90LjRjyDQuNC70Lgg0L/QtdGA0LXRh9C40YLRi9Cy0LDQvdC40Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHF1ZXVlQnVzeSA9IHRvU2lnbmFsKFxuICAgICAgICB0b09ic2VydmFibGUodGhpcy5kcmFmdCkucGlwZShcbiAgICAgICAgICAgIG1hcCgoZHJhZnQpID0+IGRyYWZ0Py5pZCksXG4gICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChkcmFmdElkKSA9PiAoZHJhZnRJZCA9PT0gdW5kZWZpbmVkID8gb2YoZmFsc2UpIDogdGhpcy5kcmFmdHNTZXJ2aWNlLmlzQnVzeSQoZHJhZnRJZCkpKVxuICAgICAgICApLFxuICAgICAgICB7IGluaXRpYWxWYWx1ZTogZmFsc2UgfVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INC00LXQudGB0YLQstC40Y8g0L3QsNC0INGH0LXRgNC90L7QstC40LrQvtC8INCf0YDQvtGE0YHRgtGA0L7QuSDQvdC10LTQvtGB0YLRg9C/0L3Riywg0L/QvtC60LAg0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjyDQtNC10LnRgdGC0LLQuNC1INC40LvQuCDQt9Cw0L/RgNC+0YEg0YfQtdGA0L3QvtCy0LjQutCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBidXN5ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5hY3Rpb25SdW5uaW5nKCkgfHwgdGhpcy5xdWV1ZUJ1c3koKSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiwg0YfRgtC+INC80L7QttC90L4g0LzQtdC90Y/RgtGMINGB0L7RgdGC0LDQsiDRh9C10YDQvdC+0LLQuNC60LAg0J/RgNC+0YTRgdGC0YDQvtC5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjYW5FZGl0UHJvZnN0cm95ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc0RyYWZ0UGFnZSgpICYmICF0aGlzLmFjdGlvblJ1bm5pbmcoKSAmJiAhdGhpcy5pc1Byb2Nlc3NpbmcoKSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjRh9C40L3QsCwg0L/QviDQutC+0YLQvtGA0L7QuSDQvdC10LvRjNC30Y8g0L7RhNC+0YDQvNC40YLRjCDQt9Cw0LrQsNC3INC40Lcg0YfQtdGA0L3QvtCy0LjQutCwINCf0YDQvtGE0YHRgtGA0L7QuSwg0LjQu9C4INC/0YPRgdGC0LDRjyDRgdGC0YDQvtC60LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb2ZzdHJveU9yZGVyQmxvY2tSZWFzb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuZHJhZnQoKT8uZ2V0T3JkZXJCbG9ja1JlYXNvbih0aGlzLm5vdygpKSA/PyAnJztcblxuICAgICAgICByZXR1cm4gcmVhc29uIHx8ICh0aGlzLnNlbGVjdGVkSXRlbXNJZHMoKS5sZW5ndGggPT09IDAgPyAn0JLRi9Cx0LXRgNC40YLQtSDQv9C+0LfQuNGG0LjQuCDQtNC70Y8g0LfQsNC60LDQt9CwLicgOiAnJyk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQodGB0YvQu9C60LAg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDRg9C/0YDQsNCy0LvQtdC90LjRjyDRg9C90LjRh9GC0L7QttC10L3QuNC10Lwg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDRg9GB0YLQsNC90L7QstC60LggU0VPLdC00LDQvdC90YvRhSDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHNlb1NlcnZpY2U6IFNjU2VvU2VydmljZSA9IGluamVjdChTY1Nlb1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNCw0LvQuNC30LjRgNGD0LXRgiDRjdC60LfQtdC80L/Qu9GP0YAg0LrQu9Cw0YHRgdCwIHtAbGluayBTY0RyYWZ0Q29tcG9uZW50fS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMud2F0Y2hQcm9mc3Ryb3lQcm9jZXNzaW5nKCk7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZHJhZnQoKSkge1xuICAgICAgICAgICAgdGhpcy5kcmFmdHNTZXJ2aWNlXG4gICAgICAgICAgICAgICAgLmdldCQoTnVtYmVyLnBhcnNlSW50KHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KCdvcmRlcklkJykgPz8gJycsIDEwKSlcbiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoc2NPcmRlcklzTG9hZGVkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZHJhZnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFmdC5zZXQoZHJhZnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlb1NlcnZpY2Uuc2V0QnlEZWZhdWx0QXNOb0luZGV4ZWQoJ9Cn0LXRgNC90L7QstC40LrQuCDQt9Cw0LrQsNC30L7QsicpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QtdGA0LXRhdC+0LQg0Log0L7RhNC+0YDQvNC70LXQvdC40Y4g0LfQsNC60LDQt9CwINC40Lcg0LLRi9Cx0YDQsNC90L3Ri9GFINC/0L7Qt9C40YbQuNC5LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBnb1RvTmV3T3JkZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnb3JkZXJzJywgJ25ldycsIHRoaXMuZHJhZnQoKT8uaWQsICdkcmFmdCddLCB7IHF1ZXJ5UGFyYW1zOiB7IGl0ZW1zSWRzOiB0aGlzLnNlbGVjdGVkSXRlbXNJZHMoKSB9IH0pLmNhdGNoKG5vb3ApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9GD0YHQutCw0LXRgiDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Y4g0YfQtdGA0L3QvtCy0LjQutCwINCf0YDQvtGE0YHRgtGA0L7QuS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYWN0dWFsaXplUHJvZnN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnJ1blByb2ZzdHJveUFjdGlvbigoZHJhZnRJZCkgPT4gdGhpcy5kcmFmdHNTZXJ2aWNlLmFjdHVhbGl6ZVByb2ZzdHJveSQoZHJhZnRJZCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCX0LDQv9GD0YHQutCw0LXRgiDQv9C10YDQtdGB0LHQvtGA0LrRgyDRh9C10YDQvdC+0LLQuNC60LAg0J/RgNC+0YTRgdGC0YDQvtC5INC40Lcg0YTQsNC50LvQsCDQv9C+0YHQu9C1INC/0L7QtNGC0LLQtdGA0LbQtNC10L3QuNGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWxvYWRQcm9mc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nU2VydmljZVxuICAgICAgICAgICAgLm9wZW48Ym9vbGVhbj4oVFVJX0NPTkZJUk0sIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ9Ch0L7QsdGA0LDRgtGMINC30LDRj9Cy0LrRgyDQt9Cw0L3QvtCy0L4/JyxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAn0JfQsNGP0LLQutCwINCx0YPQtNC10YIg0YHQvtCx0YDQsNC90LAg0LfQsNC90L7QstC+INC40Lcg0LfQsNCz0YDRg9C20LXQvdC90L7Qs9C+INGE0LDQudC70LAuINCY0LfQvNC10L3RkdC90L3Ri9C1INC60L7Qu9C40YfQtdGB0YLQstC+LCDQvNC10YLRgNCw0LYg0Lgg0LzQsNGA0LrQuNGA0L7QstC60LAg0L/QvtC30LjRhtC40LksINCwINGC0LDQutC20LUg0YPQtNCw0LvRkdC90L3Ri9C1INC/0L7Qt9C40YbQuNC4INCx0YPQtNGD0YIg0L/QvtGC0LXRgNGP0L3Riy4g0J/RgNC+0LTQvtC70LbQuNGC0Yw/JyxcbiAgICAgICAgICAgICAgICAgICAgeWVzOiAn0JTQsCwg0YHQvtCx0YDQsNGC0Ywg0LfQsNC90L7QstC+JyxcbiAgICAgICAgICAgICAgICAgICAgbm86ICfQntGC0LzQtdC90LAnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKEJvb2xlYW4pLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucnVuUHJvZnN0cm95QWN0aW9uKChkcmFmdElkKSA9PiB0aGlzLmRyYWZ0c1NlcnZpY2UucmVsb2FkUHJvZnN0cm95JChkcmFmdElkKSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9GP0LXRgiDRh9C10YDQvdC+0LLQuNC6INC4INC/0LXRgNC10L3QsNC/0YDQsNCy0LvRj9C10YIg0Log0YHQv9C40YHQutGDINGH0LXRgNC90L7QstC40LrQvtCyLiDQn9C+0LrQsCDRh9C10YDQvdC+0LLQuNC6INGD0LTQsNC70Y/QtdGC0YHRjywg0LTQtdC50YHRgtCy0LjRjyDQvdCw0LQg0L3QuNC8INC30LDQsdC70L7QutC40YDQvtCy0LDQvdGLLlxuICAgICAqINCV0YHQu9C4INGD0LTQsNC70LjRgtGMINC90LUg0YPQtNCw0LvQvtGB0YwsINC/0L7Qu9GM0LfQvtCy0LDRgtC10LvRjCDQvtGB0YLQsNGR0YLRgdGPINC90LAg0YHRgtGA0LDQvdC40YbQtSwg0YHQvtC+0LHRidC10L3QuNC1INC+0LEg0L7RiNC40LHQutC1INC/0L7QutCw0LfRi9Cy0LDQtdGCINC/0LXRgNC10YXQstCw0YLRh9C40Log0L/RgNC40LvQvtC20LXQvdC40Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNsZWFyRHJhZnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHsgaWQgfSA9IHRoaXMuZHJhZnQoKSA/PyB7fTtcblxuICAgICAgICBpZiAoIWlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpYWxvZ1NlcnZpY2VcbiAgICAgICAgICAgIC5vcGVuPGJvb2xlYW4+KFRVSV9DT05GSVJNLCB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IGDQo9C00LDQu9C40YLRjCDRh9C10YDQvdC+0LLQuNC6IOKEliR7aWR9P2AsXG4gICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBg0K3RgtC+INC00LXQudGB0YLQstC40LUg0YPQtNCw0LvQuNGCINGH0LXRgNC90L7QstC40Log4oSWJHtpZH0uYCxcbiAgICAgICAgICAgICAgICAgICAgeWVzOiAn0JTQsCwg0YPQtNCw0LvQuNGC0YwnLFxuICAgICAgICAgICAgICAgICAgICBubzogJ9Cd0LXRgiwg0L7RgdGC0LDQstC40YLRjCcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoQm9vbGVhbiksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25SdW5uaW5nLnNldCh0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kcmFmdHNTZXJ2aWNlLmRlbGV0ZSQoaWQpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25SdW5uaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVsZXRlRXZlbnQuZW1pdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9kcmFmdHMnXSkuY2F0Y2gobm9vcCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogbm9vcCxcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0YvQv9C+0LvQvdGP0LXRgiDQtNC10LnRgdGC0LLQuNC1INC90LDQtCDRh9C10YDQvdC+0LLQuNC60L7QvCDQn9GA0L7RhNGB0YLRgNC+0LkuINCf0L7QutCwINC00LXQudGB0YLQstC40LUg0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjywg0L7RgdGC0LDQu9GM0L3Ri9C1INC30LDQsdC70L7QutC40YDQvtCy0LDQvdGLLlxuICAgICAqINCe0YLQstC10YIg0L/QvtC/0LDQtNCw0LXRgiDQsiDQutGN0Ygg0YfQtdGA0L3QvtCy0LjQutCwLCDQv9C+0YHQu9C1INC+0YLQutCw0LfQsCA0MDMg0LjQu9C4IDQwOSDRgdC10YDQstC40YEg0YHQsNC8INC/0LXRgNC10LfQsNC/0YDQsNGI0LjQstCw0LXRgiDRh9C10YDQvdC+0LLQuNC6LiDQodC+0L7QsdGJ0LXQvdC40LUg0L7QsSDQvtGI0LjQsdC60LUg0L/QvtC60LDQt9GL0LLQsNC10YIg0L/QtdGA0LXRhdCy0LDRgtGH0LjQuiDQv9GA0LjQu9C+0LbQtdC90LjRjy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBhY3Rpb24g0KTRg9C90LrRhtC40Y8sINCy0L7Qt9Cy0YDQsNGJ0LDRjtGJ0LDRjyDQt9Cw0L/RgNC+0YEg0LTQtdC50YHRgtCy0LjRjyDQv9C+INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0YMg0YfQtdGA0L3QvtCy0LjQutCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcnVuUHJvZnN0cm95QWN0aW9uKGFjdGlvbjogKGRyYWZ0SWQ6IG51bWJlcikgPT4gT2JzZXJ2YWJsZTxTY09yZGVyRHJhZnQ+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRyYWZ0SWQgPSB0aGlzLmRyYWZ0KCk/LmlkO1xuXG4gICAgICAgIGlmIChkcmFmdElkID09PSB1bmRlZmluZWQgfHwgdGhpcy5idXN5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aW9uUnVubmluZy5zZXQodHJ1ZSk7XG5cbiAgICAgICAgYWN0aW9uKGRyYWZ0SWQpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uUnVubmluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHsgZXJyb3I6IG5vb3AgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J/QvtC60LAg0YfQtdGA0L3QvtCy0LjQuiDQn9GA0L7RhNGB0YLRgNC+0Lkg0L3QsCDQtdCz0L4g0YHRgtGA0LDQvdC40YbQtSDQsiDQvtCx0YDQsNCx0L7RgtC60LUsINC+0L/RgNCw0YjQuNCy0LDQtdGCINGB0L7RgdGC0L7Rj9C90LjQtSDQu9GR0LPQutC40Lwg0LfQsNC/0YDQvtGB0L7QvCDRgdC/0LjRgdC60LAg0Lgg0L/QvtGB0LvQtSDQvtC60L7QvdGH0LDQvdC40Y8g0L7QsdGA0LDQsdC+0YLQutC4INC/0LXRgNC10LfQsNC/0YDQsNGI0LjQstCw0LXRgiDRh9C10YDQvdC+0LLQuNC6LlxuICAgICAqINCe0L/RgNC+0YEg0LjQtNGR0YIsINC/0L7QutCwINC/0LXRgNC10LfQsNC/0YDQvtGI0LXQvdC90YvQuSDRh9C10YDQvdC+0LLQuNC6INC+0YHRgtCw0ZHRgtGB0Y8g0LIg0L7QsdGA0LDQsdC+0YLQutC1OiDQvdC10YPQtNCw0YfQvdGL0Lkg0L/QtdGA0LXQt9Cw0L/RgNC+0YEg0L/QvtCy0YLQvtGA0Y/QtdGC0YHRjyDQvdCwINGB0LvQtdC00YPRjtGJ0LXQvCDRiNCw0LPQtS5cbiAgICAgKiDQldGB0LvQuCDRh9C10YDQvdC+0LLQuNC60LAg0LHQvtC70YzRiNC1INC90LXRgiAo0YPQtNCw0LvRkdC9INCyINC00YDRg9Cz0L7QuSDQstC60LvQsNC00LrQtSksINC+0L/RgNC+0YEg0LfQsNCy0LXRgNGI0LDQtdGC0YHRjywg0LAg0L/QvtC70YzQt9C+0LLQsNGC0LXQu9GMINCy0L7Qt9Cy0YDQsNGJ0LDQtdGC0YHRjyDQuiDRgdC/0LjRgdC60YMuINCSINGB0L/QuNGB0LrQtSDRh9C10YDQvdC+0LLQuNC60L7QsiDRgdC+0YHRgtC+0Y/QvdC40LUg0L7Qv9GA0LDRiNC40LLQsNC10YIg0YHQsNC8INGB0L/QuNGB0L7Qui5cbiAgICAgKi9cbiAgICBwcml2YXRlIHdhdGNoUHJvZnN0cm95UHJvY2Vzc2luZygpOiB2b2lkIHtcbiAgICAgICAgdG9PYnNlcnZhYmxlKGNvbXB1dGVkKCgpID0+ICh0aGlzLmlzRHJhZnRQYWdlKCkgJiYgdGhpcy5pc1Byb2Nlc3NpbmcoKSA/IHRoaXMuZHJhZnQoKT8uaWQgOiB1bmRlZmluZWQpKSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKChkcmFmdElkKSA9PlxuICAgICAgICAgICAgICAgICAgICBkcmFmdElkID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gRU1QVFlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5kcmFmdHNTZXJ2aWNlLndhdGNoU2hvcnRMaXN0JChbZHJhZnRJZF0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKGRyYWZ0cykgPT4gIWRyYWZ0cy5zb21lKChzaG9ydCkgPT4gc2hvcnQuaWQgPT09IGRyYWZ0SWQgJiYgc2hvcnQuYWN0dWFsaXphdGlvbj8uaXNQcm9jZXNzaW5nKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGhhdXN0TWFwKCgpID0+IHRoaXMuZHJhZnRzU2VydmljZS5mZXRjaCQoZHJhZnRJZCkucGlwZShjYXRjaEVycm9yKChlcnJvcjogdW5rbm93bikgPT4gKFNjQXBpRXJyb3JIZWxwZXIuaXNOb3RGb3VuZChlcnJvcikgPyBvZihudWxsKSA6IEVNUFRZKSkpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VXaGlsZSgoZHJhZnQpID0+IGRyYWZ0Py5hY3R1YWxpemF0aW9uPy5pc1Byb2Nlc3NpbmcgPT09IHRydWUsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChkcmFmdCkgPT4gZHJhZnQgPT09IG51bGwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCgpID0+IGRyYWZ0SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChkcmFmdElkKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5sZWF2ZU1pc3NpbmdEcmFmdChkcmFmdElkKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7QvtCx0YnQsNC10YIsINGH0YLQviDRh9C10YDQvdC+0LLQuNC6INC90LUg0L3QsNC50LTQtdC9LCDQuCDQstC+0LfQstGA0LDRidCw0LXRgiDQuiDRgdC/0LjRgdC60YMg0YfQtdGA0L3QvtCy0LjQutC+0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZHJhZnRJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRh9C10YDQvdC+0LLQuNC60LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsZWF2ZU1pc3NpbmdEcmFmdChkcmFmdElkOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGVydHMub3Blbihg0KfQtdGA0L3QvtCy0LjQuiDihJYke2RyYWZ0SWR9INC90LUg0L3QsNC50LTQtdC9LiDQktC+0LfQvNC+0LbQvdC+LCDQvtC9INGD0LTQsNC70ZHQvS5gLCB7IGFwcGVhcmFuY2U6ICd3YXJuaW5nJyB9KS5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvZHJhZnRzJ10pLmNhdGNoKG5vb3ApO1xuICAgIH1cbn1cbiIsIkBsZXQgY3VycmVudERyYWZ0ID0gZHJhZnQoKTtcblxuQGlmIChjdXJyZW50RHJhZnQgJiYgY3VycmVudERyYWZ0LmlzUHJvZnN0cm95KSB7XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTVcIj5cbiAgICAgICAgPHNjLXByb2ZzdHJveS1kcmFmdC1iYWRnZXNcbiAgICAgICAgICAgIFthY3R1YWxpemF0aW9uXT1cImN1cnJlbnREcmFmdC5hY3R1YWxpemF0aW9uXCJcbiAgICAgICAgICAgIFtub3ddPVwibm93KClcIlxuICAgICAgICAvPlxuXG4gICAgICAgIDxzYy1wcm9mc3Ryb3ktYWN0dWFsaXphdGlvbi1wYW5lbFxuICAgICAgICAgICAgW2RyYWZ0XT1cImN1cnJlbnREcmFmdFwiXG4gICAgICAgICAgICBbbm93XT1cIm5vdygpXCJcbiAgICAgICAgICAgIFtidXN5XT1cImJ1c3koKSB8fCAhaXNEcmFmdFBhZ2UoKVwiXG4gICAgICAgICAgICAoYWN0dWFsaXplKT1cImFjdHVhbGl6ZVByb2ZzdHJveSgpXCJcbiAgICAgICAgICAgIChyZWxvYWQpPVwicmVsb2FkUHJvZnN0cm95KClcIlxuICAgICAgICAvPlxuXG4gICAgICAgIEBpZiAoY3VycmVudERyYWZ0LnByb2R1Y3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgPHNjLW9yZGVyLWl0ZW1zLWxpc3RcbiAgICAgICAgICAgICAgICBzY09yZGVyXG4gICAgICAgICAgICAgICAgW29yZGVySWRdPVwiY3VycmVudERyYWZ0LmlkXCJcbiAgICAgICAgICAgICAgICBbaXRlbXNdPVwiY3VycmVudERyYWZ0LnByb2R1Y3RzXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBbbWFya1VuYXZhaWxhYmxlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFt1c2VMaW5lUHJpY2VdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW21lYXN1cmVkSW5EaWFsb2ddPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2VkaXRhYmxlXT1cImNhbkVkaXRQcm9mc3Ryb3koKVwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGFibGVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgZGVsZXRlQ29uZmlybWF0aW9uVGFyZ2V0PVwi0LjQtyDQt9Cw0Y/QstC60LhcIlxuICAgICAgICAgICAgICAgIHRvdGFsTGFiZWw9XCLQmNCi0J7Qk9CeINCaINCX0JDQmtCQ0JfQo1wiXG4gICAgICAgICAgICAgICAgKHNlbGVjdGVkSXRlbXNJZHNDaGFuZ2UpPVwic2VsZWN0ZWRJdGVtc0lkcy5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7IGlzUHJvY2Vzc2luZygpID8gJ9Cf0L7Qt9C40YbQuNC4INC/0L7Rj9Cy0Y/RgtGB0Y8g0L/QvtGB0LvQtSDQvtCx0YDQsNCx0L7RgtC60Lgg0YTQsNC50LvQsCcgOiAn0JIg0LfQsNGP0LLQutC1INC90LXRgiDQv9C+0LfQuNGG0LjQuScgfX08L3A+XG4gICAgICAgIH1cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLXgtMi41IGdhcC15LTQgc206ZmxleC1yb3cgc206ZmxleC13cmFwLXJldmVyc2Ugc206aXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnRyYXNoLTJcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXN5KClcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGVhckRyYWZ0KClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgINCj0LTQsNC70LjRgtGMINGH0LXRgNC90L7QstC40LpcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTEgc206bWwtYXV0byBzbTppdGVtcy1lbmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5zaG9wcGluZy1jYXJ0XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ1c3koKSB8fCAhIXByb2ZzdHJveU9yZGVyQmxvY2tSZWFzb24oKVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV3T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICDQntGE0L7RgNC80LjRgtGMINC30LDQutCw0LdcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICBAaWYgKHByb2ZzdHJveU9yZGVyQmxvY2tSZWFzb24oKTsgYXMgcmVhc29uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXMgdGV4dC10dWktdGV4dC0wMlwiPnt7IHJlYXNvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG59IEBlbHNlIHtcbiAgICBAbGV0IGl0ZW1zID0gZHJhZnQoKT8ucHJvZHVjdHM7XG5cbiAgICBAaWYgKGl0ZW1zKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTVcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8c2Mtb3JkZXItaXRlbXMtbGlzdC13aXRoLWFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjT3JkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtvcmRlcklkXT1cImRyYWZ0KCk/LmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJpdGVtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZWRpdGFibGVdPVwiaXNEcmFmdFBhZ2UoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVDb25maXJtYXRpb25UYXJnZXQ9XCLQuNC3INGH0LXRgNC90L7QstC40LrQsFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRJdGVtc0lkc0NoYW5nZSk9XCJzZWxlY3RlZEl0ZW1zSWRzLnNldCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RlckFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAteC0yLjUgZ2FwLXktNCBzbTpmbGV4LXJvdyBzbTpmbGV4LXdyYXAgc206aXRlbXMtc3RhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEcmFmdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS50cmFzaC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgINCj0LTQsNC70LjRgtGMINGH0LXRgNC90L7QstC40LpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNtOm1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnNob3BwaW5nLWNhcnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic2VsZWN0ZWRJdGVtc0lkcygpLmxlbmd0aCA9PT0gMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJnb1RvTmV3T3JkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQl9Cw0LrQsNC30LDRgtGMXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9zYy1vcmRlci1pdGVtcy1saXN0LXdpdGgtYWN0aW9ucz5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+0KfQtdGA0L3QvtCy0LjQuiDQv9GD0YHRgi48L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RlckFjdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBnYXAtMlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEcmFmdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnRyYXNoLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgINCj0LTQsNC70LjRgtGMINGH0LXRgNC90L7QstC40LpcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgfSBAZWxzZSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xMlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTVcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChpdGVtIG9mIFsxLCAyLCAzLCA0XTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHVpLXNrZWxldG9uIGZsZXggaC1bOC4yNXJlbV0gdy1mdWxsIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLXhsXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dWktc2tlbGV0b24gaC0xMCB3LTQwIHJvdW5kZWQtbWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInR1aS1za2VsZXRvbiBoLTEwIHctMzYgcm91bmRlZC1tZFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,42 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
3
+ import { SC_UPDATE_INTERVAL } from '@snabcentr/client-core';
4
+ import { EMPTY, map, shareReplay, switchMap, timer } from 'rxjs';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * Сервис текущего момента для меток и проверок срока актуализации черновиков Профстрой. Момент обновляется с интервалом проверки срока
8
+ * актуализации одним таймером на всех подписчиков, поэтому список черновиков, страница черновика и оформление заказа видят один момент.
9
+ * Таймер работает, только пока есть подписчики.
10
+ */
11
+ export class ScDraftExpirationClockService {
12
+ constructor() {
13
+ /**
14
+ * Интервалы обновления данных.
15
+ */
16
+ this.updateInterval = inject(SC_UPDATE_INTERVAL);
17
+ /**
18
+ * {@link Observable} текущего момента. Первый подписчик запускает таймер, после отписки всех подписчиков таймер останавливается.
19
+ * Следующие подписчики сразу получают последний момент, а не новый: он может отставать от текущего времени не больше чем
20
+ * на интервал проверки срока, и метки срока у нового подписчика обновятся на ближайшем тике общего таймера.
21
+ */
22
+ this.now$ = timer(0, this.updateInterval.orderDraftExpiration).pipe(map(() => new Date()), shareReplay({ bufferSize: 1, refCount: true }));
23
+ }
24
+ /**
25
+ * Возвращает сигнал текущего момента, который обновляется общим таймером, только пока признак истинен. Вызывается в контексте
26
+ * внедрения зависимостей, например при объявлении поля компонента: подписка живёт, пока жив компонент.
27
+ *
28
+ * @param active Признак, пока он истинен, момент обновляется.
29
+ */
30
+ nowWhile(active) {
31
+ return toSignal(toObservable(active).pipe(switchMap((isActive) => (isActive ? this.now$ : EMPTY))), { initialValue: new Date() });
32
+ }
33
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScDraftExpirationClockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
34
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScDraftExpirationClockService, providedIn: 'root' }); }
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScDraftExpirationClockService, decorators: [{
37
+ type: Injectable,
38
+ args: [{
39
+ providedIn: 'root',
40
+ }]
41
+ }] });
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtZHJhZnQtZXhwaXJhdGlvbi1jbG9jay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL29yZGVyL2RyYWZ0L3NlcnZpY2VzL3NjLWRyYWZ0LWV4cGlyYXRpb24tY2xvY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFjLFdBQVcsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQUU3RTs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLDZCQUE2QjtJQUgxQztRQUlJOztXQUVHO1FBQ2MsbUJBQWMsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUU3RDs7OztXQUlHO1FBQ2EsU0FBSSxHQUFxQixLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFJLENBQzVGLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQ3JCLFdBQVcsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQ2pELENBQUM7S0FXTDtJQVRHOzs7OztPQUtHO0lBQ0ksUUFBUSxDQUFDLE1BQXVCO1FBQ25DLE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3RJLENBQUM7K0dBeEJRLDZCQUE2QjttSEFBN0IsNkJBQTZCLGNBRjFCLE1BQU07OzRGQUVULDZCQUE2QjtrQkFIekMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIFNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IFNDX1VQREFURV9JTlRFUlZBTCB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgRU1QVFksIG1hcCwgT2JzZXJ2YWJsZSwgc2hhcmVSZXBsYXksIHN3aXRjaE1hcCwgdGltZXIgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDQodC10YDQstC40YEg0YLQtdC60YPRidC10LPQviDQvNC+0LzQtdC90YLQsCDQtNC70Y8g0LzQtdGC0L7QuiDQuCDQv9GA0L7QstC10YDQvtC6INGB0YDQvtC60LAg0LDQutGC0YPQsNC70LjQt9Cw0YbQuNC4INGH0LXRgNC90L7QstC40LrQvtCyINCf0YDQvtGE0YHRgtGA0L7QuS4g0JzQvtC80LXQvdGCINC+0LHQvdC+0LLQu9GP0LXRgtGB0Y8g0YEg0LjQvdGC0LXRgNCy0LDQu9C+0Lwg0L/RgNC+0LLQtdGA0LrQuCDRgdGA0L7QutCwXG4gKiDQsNC60YLRg9Cw0LvQuNC30LDRhtC40Lgg0L7QtNC90LjQvCDRgtCw0LnQvNC10YDQvtC8INC90LAg0LLRgdC10YUg0L/QvtC00L/QuNGB0YfQuNC60L7Qsiwg0L/QvtGN0YLQvtC80YMg0YHQv9C40YHQvtC6INGH0LXRgNC90L7QstC40LrQvtCyLCDRgdGC0YDQsNC90LjRhtCwINGH0LXRgNC90L7QstC40LrQsCDQuCDQvtGE0L7RgNC80LvQtdC90LjQtSDQt9Cw0LrQsNC30LAg0LLQuNC00Y/RgiDQvtC00LjQvSDQvNC+0LzQtdC90YIuXG4gKiDQotCw0LnQvNC10YAg0YDQsNCx0L7RgtCw0LXRgiwg0YLQvtC70YzQutC+INC/0L7QutCwINC10YHRgtGMINC/0L7QtNC/0LjRgdGH0LjQutC4LlxuICovXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBTY0RyYWZ0RXhwaXJhdGlvbkNsb2NrU2VydmljZSB7XG4gICAgLyoqXG4gICAgICog0JjQvdGC0LXRgNCy0LDQu9GLINC+0LHQvdC+0LLQu9C10L3QuNGPINC00LDQvdC90YvRhS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVwZGF0ZUludGVydmFsID0gaW5qZWN0KFNDX1VQREFURV9JTlRFUlZBTCk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YLQtdC60YPRidC10LPQviDQvNC+0LzQtdC90YLQsC4g0J/QtdGA0LLRi9C5INC/0L7QtNC/0LjRgdGH0LjQuiDQt9Cw0L/Rg9GB0LrQsNC10YIg0YLQsNC50LzQtdGALCDQv9C+0YHQu9C1INC+0YLQv9C40YHQutC4INCy0YHQtdGFINC/0L7QtNC/0LjRgdGH0LjQutC+0LIg0YLQsNC50LzQtdGAINC+0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGC0YHRjy5cbiAgICAgKiDQodC70LXQtNGD0Y7RidC40LUg0L/QvtC00L/QuNGB0YfQuNC60Lgg0YHRgNCw0LfRgyDQv9C+0LvRg9GH0LDRjtGCINC/0L7RgdC70LXQtNC90LjQuSDQvNC+0LzQtdC90YIsINCwINC90LUg0L3QvtCy0YvQuTog0L7QvSDQvNC+0LbQtdGCINC+0YLRgdGC0LDQstCw0YLRjCDQvtGCINGC0LXQutGD0YnQtdCz0L4g0LLRgNC10LzQtdC90Lgg0L3QtSDQsdC+0LvRjNGI0LUg0YfQtdC8XG4gICAgICog0L3QsCDQuNC90YLQtdGA0LLQsNC7INC/0YDQvtCy0LXRgNC60Lgg0YHRgNC+0LrQsCwg0Lgg0LzQtdGC0LrQuCDRgdGA0L7QutCwINGDINC90L7QstC+0LPQviDQv9C+0LTQv9C40YHRh9C40LrQsCDQvtCx0L3QvtCy0Y/RgtGB0Y8g0L3QsCDQsdC70LjQttCw0LnRiNC10Lwg0YLQuNC60LUg0L7QsdGJ0LXQs9C+INGC0LDQudC80LXRgNCwLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBub3ckOiBPYnNlcnZhYmxlPERhdGU+ID0gdGltZXIoMCwgdGhpcy51cGRhdGVJbnRlcnZhbC5vcmRlckRyYWZ0RXhwaXJhdGlvbikucGlwZShcbiAgICAgICAgbWFwKCgpID0+IG5ldyBEYXRlKCkpLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0LjQs9C90LDQuyDRgtC10LrRg9GJ0LXQs9C+INC80L7QvNC10L3RgtCwLCDQutC+0YLQvtGA0YvQuSDQvtCx0L3QvtCy0LvRj9C10YLRgdGPINC+0LHRidC40Lwg0YLQsNC50LzQtdGA0L7QvCwg0YLQvtC70YzQutC+INC/0L7QutCwINC/0YDQuNC30L3QsNC6INC40YHRgtC40L3QtdC9LiDQktGL0LfRi9Cy0LDQtdGC0YHRjyDQsiDQutC+0L3RgtC10LrRgdGC0LVcbiAgICAgKiDQstC90LXQtNGA0LXQvdC40Y8g0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5LCDQvdCw0L/RgNC40LzQtdGAINC/0YDQuCDQvtCx0YrRj9Cy0LvQtdC90LjQuCDQv9C+0LvRjyDQutC+0LzQv9C+0L3QtdC90YLQsDog0L/QvtC00L/QuNGB0LrQsCDQttC40LLRkdGCLCDQv9C+0LrQsCDQttC40LIg0LrQvtC80L/QvtC90LXQvdGCLlxuICAgICAqXG4gICAgICogQHBhcmFtIGFjdGl2ZSDQn9GA0LjQt9C90LDQuiwg0L/QvtC60LAg0L7QvSDQuNGB0YLQuNC90LXQvSwg0LzQvtC80LXQvdGCINC+0LHQvdC+0LLQu9GP0LXRgtGB0Y8uXG4gICAgICovXG4gICAgcHVibGljIG5vd1doaWxlKGFjdGl2ZTogU2lnbmFsPGJvb2xlYW4+KTogU2lnbmFsPERhdGU+IHtcbiAgICAgICAgcmV0dXJuIHRvU2lnbmFsKHRvT2JzZXJ2YWJsZShhY3RpdmUpLnBpcGUoc3dpdGNoTWFwKChpc0FjdGl2ZSkgPT4gKGlzQWN0aXZlID8gdGhpcy5ub3ckIDogRU1QVFkpKSksIHsgaW5pdGlhbFZhbHVlOiBuZXcgRGF0ZSgpIH0pO1xuICAgIH1cbn1cbiJdfQ==