@snabcentr/client-ui 3.32.4 → 3.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/banner/sc-banner.module.d.ts +2 -1
  2. package/catalog/category-card/sc-category-card.component.d.ts +0 -6
  3. package/catalog/hover-image-carousel/{hover-image-carousel.component.d.ts → sc-hover-image-carousel.component.d.ts} +16 -7
  4. package/catalog/index.d.ts +1 -0
  5. package/catalog/sc-catalog.module.d.ts +3 -2
  6. package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +4 -4
  7. package/esm2022/banner/sc-banner.component.mjs +3 -3
  8. package/esm2022/banner/sc-banner.module.mjs +4 -3
  9. package/esm2022/cart/cart-item/sc-cart-item.component.mjs +4 -4
  10. package/esm2022/catalog/category-card/sc-category-card.component.mjs +4 -11
  11. package/esm2022/catalog/hover-image-carousel/sc-hover-image-carousel.component.mjs +76 -0
  12. package/esm2022/catalog/index.mjs +2 -1
  13. package/esm2022/catalog/price-card/sc-price-card.component.mjs +2 -2
  14. package/esm2022/catalog/price-card-inline/sc-price-card-inline.component.mjs +4 -4
  15. package/esm2022/catalog/sc-catalog.module.mjs +8 -5
  16. package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +5 -6
  17. package/esm2022/news/news-card/sc-news-card.component.mjs +4 -8
  18. package/esm2022/news/sc-news.module.mjs +4 -3
  19. package/esm2022/order/order-item-mobile/sc-order-item-mobile.component.mjs +12 -20
  20. package/fesm2022/snabcentr-client-ui.mjs +57 -76
  21. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  22. package/news/news-card/sc-news-card.component.d.ts +1 -5
  23. package/news/sc-news.module.d.ts +2 -1
  24. package/order/order-item-mobile/sc-order-item-mobile.component.d.ts +8 -14
  25. package/package.json +2 -2
  26. package/release_notes.tmp +6 -2
  27. package/styles/tailwind/tailwind.scss +0 -4
  28. package/esm2022/catalog/hover-image-carousel/hover-image-carousel.component.mjs +0 -76
@@ -1,5 +1,5 @@
1
1
  import { InputSignal } from '@angular/core';
2
- import { ScImageHelper, ScNewsTile } from '@snabcentr/client-core';
2
+ import { ScNewsTile } from '@snabcentr/client-core';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * Компонент карточки новости.
@@ -17,10 +17,6 @@ export declare class ScNewsCardComponent {
17
17
  * Признак того, что этот компонент отображается на мобильном устройстве.
18
18
  */
19
19
  readonly isMobile: boolean;
20
- /**
21
- * Класс с вспомогательными методами для работы с изображениями.
22
- */
23
- protected readonly imageHelper: ScImageHelper;
24
20
  static ɵfac: i0.ɵɵFactoryDeclaration<ScNewsCardComponent, never>;
25
21
  static ɵcmp: i0.ɵɵComponentDeclaration<ScNewsCardComponent, "sc-news-card", never, { "news": { "alias": "news"; "required": true; "isSignal": true; }; "href": { "alias": "href"; "required": true; "isSignal": true; }; }, {}, never, never, false, never>;
26
22
  }
@@ -5,11 +5,12 @@ import * as i3 from "@angular/common";
5
5
  import * as i4 from "@angular/router";
6
6
  import * as i5 from "../share-button/sc-share-button.module";
7
7
  import * as i6 from "../pipes/sc-format-date";
8
+ import * as i7 from "@snabcentr/client-core";
8
9
  /**
9
10
  * Модуль работы с новостями.
10
11
  */
11
12
  export declare class ScNewsModule {
12
13
  static ɵfac: i0.ɵɵFactoryDeclaration<ScNewsModule, never>;
13
- static ɵmod: i0.ɵɵNgModuleDeclaration<ScNewsModule, [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent], [typeof i3.CommonModule, typeof i4.RouterModule, typeof i5.ScShareButtonModule, typeof i6.ScFormatDatePipe], [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent]>;
14
+ static ɵmod: i0.ɵɵNgModuleDeclaration<ScNewsModule, [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent], [typeof i3.CommonModule, typeof i4.RouterModule, typeof i5.ScShareButtonModule, typeof i6.ScFormatDatePipe, typeof i7.ScMediaImageTransformerPipe], [typeof i1.ScNewsCardComponent, typeof i2.ScNewsCardSkeletonComponent]>;
14
15
  static ɵinj: i0.ɵɵInjectorDeclaration<ScNewsModule>;
15
16
  }
@@ -1,5 +1,5 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { ScCartItem, ScProduct } from '@snabcentr/client-core';
1
+ import { EventEmitter, InputSignal, Signal } from '@angular/core';
2
+ import { ScCartItem, ScIImage } from '@snabcentr/client-core';
3
3
  import { TuiPreviewDialogService } from '@taiga-ui/kit';
4
4
  import { AbstractScPriceCard } from '../../directives';
5
5
  import * as i0 from "@angular/core";
@@ -15,31 +15,25 @@ export declare class ScOrderItemMobileComponent extends AbstractScPriceCard {
15
15
  /**
16
16
  * Элемент заказа.
17
17
  */
18
- orderItem?: ScCartItem;
18
+ readonly orderItem: InputSignal<ScCartItem>;
19
19
  /**
20
20
  * Событие нажатия на дополнительные действия.
21
21
  */
22
22
  clickActionsEvent: EventEmitter<void>;
23
+ /**
24
+ * Изображение товара в заказе.
25
+ */
26
+ readonly cartImage: Signal<ScIImage>;
23
27
  /**
24
28
  * Инициирует экземпляр класса {@link ScOrderItemMobileComponent}.
25
29
  *
26
30
  * @param previewDialogService Сервис диалогового окна предварительного просмотра.
27
31
  */
28
32
  constructor(previewDialogService: TuiPreviewDialogService);
29
- /**
30
- * Продукт элемента заказа.
31
- */
32
- get product(): ScProduct | undefined;
33
33
  /**
34
34
  * Отобразить спецификацию.
35
35
  */
36
36
  showSpecification(): void;
37
- /**
38
- * Возвращает ссылку на изображение карточки товара.
39
- *
40
- * @param product Позиция товара/услуги.
41
- */
42
- getCardImage(product: ScProduct): string;
43
37
  static ɵfac: i0.ɵɵFactoryDeclaration<ScOrderItemMobileComponent, never>;
44
- static ɵcmp: i0.ɵɵComponentDeclaration<ScOrderItemMobileComponent, "sc-order-item-mobile", never, { "orderItem": { "alias": "orderItem"; "required": false; }; }, { "clickActionsEvent": "clickActionsEvent"; }, never, never, false, never>;
38
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScOrderItemMobileComponent, "sc-order-item-mobile", never, { "orderItem": { "alias": "orderItem"; "required": true; "isSignal": true; }; }, { "clickActionsEvent": "clickActionsEvent"; }, never, never, false, never>;
45
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snabcentr/client-ui",
3
- "version": "3.32.4",
3
+ "version": "3.33.0",
4
4
  "author": "Snabcentr Ltd.",
5
5
  "repository": "https://gitlab.snabcentr.met/web/angular/snabcentr-client-ui-lib",
6
6
  "license": "Commercial",
@@ -15,7 +15,7 @@
15
15
  "@maskito/core": "^3.2.0",
16
16
  "@ng-web-apis/intersection-observer": "^4.11.1",
17
17
  "@ng-web-apis/common": "^4.11.1",
18
- "@snabcentr/client-core": "^2.52.2",
18
+ "@snabcentr/client-core": "^2.54.0",
19
19
  "@taiga-ui/addon-charts": "^4.41.0",
20
20
  "@taiga-ui/addon-commerce": "^4.41.0",
21
21
  "@taiga-ui/cdk": "^4.41.0",
package/release_notes.tmp CHANGED
@@ -1,6 +1,10 @@
1
- ## 3.32.4 (2025-06-27)
1
+ ## 3.33.0 (2025-07-03)
2
+
3
+ ### added (1 change)
4
+
5
+ - [#11909: Добавлена поддержка WebP изображений в компонентах товаров, новостей, баннеров и категорий](web_soft/libs/angular/snabcentr-client-ui-lib@973979a00de3a2b1509dee5343ebc97abdc1220c) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!295))
2
6
 
3
7
  ### fixed (1 change)
4
8
 
5
- - [#11775: Исправлена ошибка добавления измеряемого товара в корзину.](web_soft/libs/angular/snabcentr-client-ui-lib@00496f0f567c6e46f91f33b38090e9fc75bd6825) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!293))
9
+ - [#11775: Исправлена ошибка добавления измеряемого товара в корзину.](web_soft/libs/angular/snabcentr-client-ui-lib@2e94b690a62736a481c061745ead0eebb6cacc2d) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!294))
6
10
 
@@ -1323,10 +1323,6 @@ video {
1323
1323
  --tw-gradient-to: var(--tui-background-base) var(--tw-gradient-to-position);
1324
1324
  }
1325
1325
 
1326
- .bg-\[length\:100\%_100\%\] {
1327
- background-size: 100% 100%;
1328
- }
1329
-
1330
1326
  .bg-cover {
1331
1327
  background-size: cover;
1332
1328
  }
@@ -1,76 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, HostListener, Input, signal } from '@angular/core';
2
- import { TuiHovered, TuiRepeatTimes } from '@taiga-ui/cdk';
3
- import { TuiButton } from '@taiga-ui/core';
4
- import * as i0 from "@angular/core";
5
- /**
6
- * Компонент просмотра изображений через событие наведения.
7
- */
8
- export class HoverImageCarouselComponent {
9
- constructor() {
10
- /**
11
- * Массив изображений.
12
- */
13
- this.images = [];
14
- /**
15
- * Признак что необходимо отобразить элементы управления.
16
- */
17
- this.isShowActions = true;
18
- /**
19
- * {@link WritableSignal} для отслеживания текущего индекса изображения.
20
- */
21
- this.currentIndex = signal(0);
22
- }
23
- /**
24
- * Обработчик события `mousemove.silent`.
25
- *
26
- * @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
27
- * @param target Объект {@link HTMLElement} в котором лежат изображения
28
- */
29
- onHover(offsetX, target) {
30
- if (this.images.length <= 1 || offsetX < 0) {
31
- return;
32
- }
33
- // new Event().preventDefault
34
- const elementWidth = target.offsetWidth;
35
- const hoverPercentage = offsetX / elementWidth;
36
- const newIndex = Math.floor(hoverPercentage * this.images.length);
37
- this.currentIndex.set(newIndex);
38
- }
39
- /**
40
- * Обработчик события `mouseleave.silent`.
41
- */
42
- onLeave() {
43
- if (this.images.length <= 1) {
44
- return;
45
- }
46
- this.currentIndex.set(0);
47
- }
48
- /**
49
- * Обработчик события наведения указателя мыши на точку.
50
- *
51
- * @param hovered Признак что указатель мыши наведен на точку.
52
- * @param index Индекс изображения, который соответствует точке.
53
- */
54
- onDotHovered(hovered, index) {
55
- if (hovered) {
56
- this.currentIndex.set(index);
57
- }
58
- }
59
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HoverImageCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
60
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: HoverImageCarouselComponent, isStandalone: true, selector: "sc-hover-image-carousel", inputs: { images: "images", isShowActions: "isShowActions" }, host: { listeners: { "mousemove.silent": "onHover($event.offsetX,$event.target)", "mouseleave.silent": "onLeave()" } }, ngImport: i0, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"], dependencies: [{ kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
61
- }
62
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HoverImageCarouselComponent, decorators: [{
63
- type: Component,
64
- args: [{ standalone: true, selector: 'sc-hover-image-carousel', imports: [TuiRepeatTimes, TuiButton, TuiHovered], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"] }]
65
- }], propDecorators: { images: [{
66
- type: Input
67
- }], isShowActions: [{
68
- type: Input
69
- }], onHover: [{
70
- type: HostListener,
71
- args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
72
- }], onLeave: [{
73
- type: HostListener,
74
- args: ['mouseleave.silent']
75
- }] } });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvaG92ZXItaW1hZ2UtY2Fyb3VzZWwvaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvaG92ZXItaW1hZ2UtY2Fyb3VzZWwvaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUUzQzs7R0FFRztBQVNILE1BQU0sT0FBTywyQkFBMkI7SUFSeEM7UUFTSTs7V0FFRztRQUVJLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFFN0I7O1dBRUc7UUFFSSxrQkFBYSxHQUFZLElBQUksQ0FBQztRQUVyQzs7V0FFRztRQUNJLGlCQUFZLEdBQTJCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQTJDM0Q7SUF6Q0c7Ozs7O09BS0c7SUFFSyxPQUFPLENBQUMsT0FBZSxFQUFFLE1BQW1CO1FBQ2hELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QyxPQUFPO1FBQ1gsQ0FBQztRQUNELDZCQUE2QjtRQUM3QixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ3hDLE1BQU0sZUFBZSxHQUFHLE9BQU8sR0FBRyxZQUFZLENBQUM7UUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFFSyxPQUFPO1FBQ1gsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLFlBQVksQ0FBQyxPQUFnQixFQUFFLEtBQWE7UUFDbEQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDTCxDQUFDOytHQTFEUSwyQkFBMkI7bUdBQTNCLDJCQUEyQix5UUNmeEMsaXpCQTJCQSxxU0RqQmMsY0FBYyw2R0FBRSxTQUFTLG9JQUFFLFVBQVU7OzRGQUt0QywyQkFBMkI7a0JBUnZDLFNBQVM7aUNBQ00sSUFBSSxZQUNOLHlCQUF5QixXQUMxQixDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLG1CQUcvQix1QkFBdUIsQ0FBQyxNQUFNOzhCQU94QyxNQUFNO3NCQURaLEtBQUs7Z0JBT0MsYUFBYTtzQkFEbkIsS0FBSztnQkFlRSxPQUFPO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUM7Z0JBZ0I3RCxPQUFPO3NCQURkLFlBQVk7dUJBQUMsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHVpSG92ZXJlZCwgVHVpUmVwZWF0VGltZXMgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aUJ1dHRvbiB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0L/RgNC+0YHQvNC+0YLRgNCwINC40LfQvtCx0YDQsNC20LXQvdC40Lkg0YfQtdGA0LXQtyDRgdC+0LHRi9GC0LjQtSDQvdCw0LLQtdC00LXQvdC40Y8uXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1ob3Zlci1pbWFnZS1jYXJvdXNlbCcsXG4gICAgaW1wb3J0czogW1R1aVJlcGVhdFRpbWVzLCBUdWlCdXR0b24sIFR1aUhvdmVyZWRdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9ob3Zlci1pbWFnZS1jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2hvdmVyLWltYWdlLWNhcm91c2VsLmNvbXBvbmVudC5zY3NzJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSG92ZXJJbWFnZUNhcm91c2VsQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQnNCw0YHRgdC40LIg0LjQt9C+0LHRgNCw0LbQtdC90LjQuS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpbWFnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRh9GC0L4g0L3QtdC+0LHRhdC+0LTQuNC80L4g0L7RgtC+0LHRgNCw0LfQuNGC0Ywg0Y3Qu9C10LzQtdC90YLRiyDRg9C/0YDQsNCy0LvQtdC90LjRjy5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpc1Nob3dBY3Rpb25zOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBXcml0YWJsZVNpZ25hbH0g0LTQu9GPINC+0YLRgdC70LXQttC40LLQsNC90LjRjyDRgtC10LrRg9GJ0LXQs9C+INC40L3QtNC10LrRgdCwINC40LfQvtCx0YDQsNC20LXQvdC40Y8uXG4gICAgICovXG4gICAgcHVibGljIGN1cnJlbnRJbmRleDogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgwKTtcblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INGB0L7QsdGL0YLQuNGPIGBtb3VzZW1vdmUuc2lsZW50YC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvZmZzZXRYINCe0YLRgdGC0YPQvyDQutGD0YDRgdC+0YDQsCDQvNGL0YjQuCDQv9C+INC+0YHQuCBYINC+0YIg0LrRgNCw0Y8ge0BsaW5rIEhUTUxFbGVtZW50fS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0INCe0LHRitC10LrRgiB7QGxpbmsgSFRNTEVsZW1lbnR9INCyINC60L7RgtC+0YDQvtC8INC70LXQttCw0YIg0LjQt9C+0LHRgNCw0LbQtdC90LjRj1xuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ21vdXNlbW92ZS5zaWxlbnQnLCBbJyRldmVudC5vZmZzZXRYJywgJyRldmVudC50YXJnZXQnXSlcbiAgICBwcml2YXRlIG9uSG92ZXIob2Zmc2V0WDogbnVtYmVyLCB0YXJnZXQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlcy5sZW5ndGggPD0gMSB8fCBvZmZzZXRYIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG5ldyBFdmVudCgpLnByZXZlbnREZWZhdWx0XG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRhcmdldC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgaG92ZXJQZXJjZW50YWdlID0gb2Zmc2V0WCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBNYXRoLmZsb29yKGhvdmVyUGVyY2VudGFnZSAqIHRoaXMuaW1hZ2VzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldChuZXdJbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdC+0YLRh9C40Log0YHQvtCx0YvRgtC40Y8gYG1vdXNlbGVhdmUuc2lsZW50YC5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZWxlYXZlLnNpbGVudCcpXG4gICAgcHJpdmF0ZSBvbkxlYXZlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pbWFnZXMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldCgwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDRgdC+0LHRi9GC0LjRjyDQvdCw0LLQtdC00LXQvdC40Y8g0YPQutCw0LfQsNGC0LXQu9GPINC80YvRiNC4INC90LAg0YLQvtGH0LrRgy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBob3ZlcmVkINCf0YDQuNC30L3QsNC6INGH0YLQviDRg9C60LDQt9Cw0YLQtdC70Ywg0LzRi9GI0Lgg0L3QsNCy0LXQtNC10L0g0L3QsCDRgtC+0YfQutGDLlxuICAgICAqIEBwYXJhbSBpbmRleCDQmNC90LTQtdC60YEg0LjQt9C+0LHRgNCw0LbQtdC90LjRjywg0LrQvtGC0L7RgNGL0Lkg0YHQvtC+0YLQstC10YLRgdGC0LLRg9C10YIg0YLQvtGH0LrQtS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25Eb3RIb3ZlcmVkKGhvdmVyZWQ6IGJvb2xlYW4sIGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGhvdmVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldChpbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC14bFwiXG4gICAgW2NsYXNzLm1iLTJdPVwiaW1hZ2VzLmxlbmd0aCA8PSAxICYmIGlzU2hvd0FjdGlvbnNcIlxuICAgIFtzdHlsZS5hc3BlY3QtcmF0aW9dPVwiJzIwLzE5J1wiXG4+XG4gICAgPGltZ1xuICAgICAgICBbc3JjXT1cImltYWdlc1tjdXJyZW50SW5kZXgoKV1cIlxuICAgICAgICBjbGFzcz1cInNpemUtZnVsbCByb3VuZGVkLXhsIG9iamVjdC1jb250YWluXCJcbiAgICAvPlxuPC9kaXY+XG5cbkBpZiAoaW1hZ2VzLmxlbmd0aCA+IDEgJiYgaXNTaG93QWN0aW9ucykge1xuICAgIDxkaXZcbiAgICAgICAgKG1vdXNlbW92ZS5zaWxlbnQpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgY2xhc3M9XCJmbGV4IGp1c3RpZnktY2VudGVyXCJcbiAgICA+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICp0dWlSZXBlYXRUaW1lcz1cImxldCBpbmRleEl0ZW0gb2YgaW1hZ2VzLmxlbmd0aFwiXG4gICAgICAgICAgICAjZWxlbWVudFxuICAgICAgICAgICAgdHVpQnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGJ1dHRvbl9zbWFsbFwiXG4gICAgICAgICAgICBbYXBwZWFyYW5jZV09XCJpbmRleEl0ZW0gPT09IGN1cnJlbnRJbmRleCgpID8gJ3ByaW1hcnknIDogJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgKHR1aUhvdmVyZWRDaGFuZ2UpPVwib25Eb3RIb3ZlcmVkKCRldmVudCwgaW5kZXhJdGVtKVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICA8L2Rpdj5cbn1cbiJdfQ==