@snabcentr/client-ui 2.4.3 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @snabcentr/client-ui might be problematic. Click here for more details.
- package/cart/cart-item-mobile/sc-cart-item-mobile.component.d.ts +9 -5
- package/catalog/hover-image-carousel/hover-image-carousel.component.d.ts +24 -0
- package/catalog/price-card/sc-price-card.component.d.ts +1 -5
- package/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.d.ts +3 -3
- package/catalog/sc-catalog.module.d.ts +2 -1
- package/directives/abstract-price-card/abstract-sc-price-card.directive.d.ts +6 -0
- package/esm2022/cart/cart-item-mobile/sc-cart-item-mobile.component.mjs +15 -17
- package/esm2022/catalog/hover-image-carousel/hover-image-carousel.component.mjs +45 -0
- package/esm2022/catalog/price-card/sc-price-card.component.mjs +7 -18
- package/esm2022/catalog/price-warehouse-stock/sc-price-warehouse-stock.component.mjs +4 -3
- package/esm2022/catalog/sc-catalog.module.mjs +13 -4
- package/esm2022/catalog/sc-favorite-btn/sc-favorite-btn.component.mjs +3 -3
- package/esm2022/directives/abstract-price-card/abstract-sc-price-card.directive.mjs +10 -1
- package/esm2022/order/order-item-mobile/sc-order-item-mobile.component.mjs +15 -19
- package/fesm2022/snabcentr-client-ui.mjs +93 -52
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/order/order-item-mobile/sc-order-item-mobile.component.d.ts +9 -7
- package/package.json +2 -2
- package/release_notes.tmp +1 -1
- package/styles/tailwind/tailwind.scss +44 -74
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            import { EventEmitter, OnInit } from '@angular/core';
         | 
| 2 2 | 
             
            import { FormControl } from '@angular/forms';
         | 
| 3 | 
            -
            import { ScCartItem,  | 
| 3 | 
            +
            import { ScCartItem, ScProduct, ScUnitsHelper } from '@snabcentr/client-core';
         | 
| 4 4 | 
             
            import { TuiPreviewDialogService } from '@taiga-ui/kit';
         | 
| 5 5 | 
             
            import { Observable } from 'rxjs';
         | 
| 6 6 | 
             
            import * as i0 from "@angular/core";
         | 
| @@ -10,8 +10,6 @@ import * as i0 from "@angular/core"; | |
| 10 10 | 
             
            export declare class ScCartItemMobileComponent implements OnInit {
         | 
| 11 11 | 
             
                readonly unitsHelper: ScUnitsHelper;
         | 
| 12 12 | 
             
                private readonly previewDialogService;
         | 
| 13 | 
            -
                private readonly urls;
         | 
| 14 | 
            -
                private readonly pathImageNotFound;
         | 
| 15 13 | 
             
                /**
         | 
| 16 14 | 
             
                 * Элемент корзины.
         | 
| 17 15 | 
             
                 */
         | 
| @@ -44,6 +42,10 @@ export declare class ScCartItemMobileComponent implements OnInit { | |
| 44 42 | 
             
                 * Событие нажатия на карточку.
         | 
| 45 43 | 
             
                 */
         | 
| 46 44 | 
             
                clickCardEvent: EventEmitter<void>;
         | 
| 45 | 
            +
                /**
         | 
| 46 | 
            +
                 * Хелпер для работы с изображениями товара.
         | 
| 47 | 
            +
                 */
         | 
| 48 | 
            +
                private readonly imageHelper;
         | 
| 47 49 | 
             
                /**
         | 
| 48 50 | 
             
                 * Элемент корзины.
         | 
| 49 51 | 
             
                 */
         | 
| @@ -56,7 +58,7 @@ export declare class ScCartItemMobileComponent implements OnInit { | |
| 56 58 | 
             
                 * @param urls Список ссылок на разделы backend'a.
         | 
| 57 59 | 
             
                 * @param pathImageNotFound Путь до изображения 'Товар не найден'.
         | 
| 58 60 | 
             
                 */
         | 
| 59 | 
            -
                constructor(unitsHelper: ScUnitsHelper, previewDialogService: TuiPreviewDialogService | 
| 61 | 
            +
                constructor(unitsHelper: ScUnitsHelper, previewDialogService: TuiPreviewDialogService);
         | 
| 60 62 | 
             
                /**
         | 
| 61 63 | 
             
                 * Продукт элемента корзины.
         | 
| 62 64 | 
             
                 */
         | 
| @@ -69,8 +71,10 @@ export declare class ScCartItemMobileComponent implements OnInit { | |
| 69 71 | 
             
                showSpecification(): void;
         | 
| 70 72 | 
             
                /**
         | 
| 71 73 | 
             
                 * Возвращает ссылку на изображение карточки товара.
         | 
| 74 | 
            +
                 *
         | 
| 75 | 
            +
                 * @param product Позиция товара/услуги.
         | 
| 72 76 | 
             
                 */
         | 
| 73 | 
            -
                getCardImage(): string;
         | 
| 77 | 
            +
                getCardImage(product: ScProduct): string;
         | 
| 74 78 | 
             
                static ɵfac: i0.ɵɵFactoryDeclaration<ScCartItemMobileComponent, never>;
         | 
| 75 79 | 
             
                static ɵcmp: i0.ɵɵComponentDeclaration<ScCartItemMobileComponent, "sc-cart-item-mobile", never, { "cartItem": { "alias": "cartItem"; "required": false; }; }, { "quantityValueChanges": "quantityValueChanges"; "clickDeleteEvent": "clickDeleteEvent"; "clickSettingsEvent": "clickSettingsEvent"; "clickCardEvent": "clickCardEvent"; }, never, never, false, never>;
         | 
| 76 80 | 
             
            }
         | 
| @@ -0,0 +1,24 @@ | |
| 1 | 
            +
            import { WritableSignal } from '@angular/core';
         | 
| 2 | 
            +
            import * as i0 from "@angular/core";
         | 
| 3 | 
            +
            /**
         | 
| 4 | 
            +
             * Компонент просмотра изображений через событие наведения.
         | 
| 5 | 
            +
             */
         | 
| 6 | 
            +
            export declare class HoverImageCarouselComponent {
         | 
| 7 | 
            +
                /**
         | 
| 8 | 
            +
                 * Массив изображений.
         | 
| 9 | 
            +
                 */
         | 
| 10 | 
            +
                images: string[];
         | 
| 11 | 
            +
                /**
         | 
| 12 | 
            +
                 * {@link WritableSignal} для отслеживания текущего индекса изображения.
         | 
| 13 | 
            +
                 */
         | 
| 14 | 
            +
                currentIndex: WritableSignal<number>;
         | 
| 15 | 
            +
                /**
         | 
| 16 | 
            +
                 * Обработчик события mousemove.
         | 
| 17 | 
            +
                 *
         | 
| 18 | 
            +
                 * @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
         | 
| 19 | 
            +
                 * @param target Объект {@link HTMLElement} в котором лежат изображения
         | 
| 20 | 
            +
                 */
         | 
| 21 | 
            +
                private onHover;
         | 
| 22 | 
            +
                static ɵfac: i0.ɵɵFactoryDeclaration<HoverImageCarouselComponent, never>;
         | 
| 23 | 
            +
                static ɵcmp: i0.ɵɵComponentDeclaration<HoverImageCarouselComponent, "sc-hover-image-carousel", never, { "images": { "alias": "images"; "required": false; }; }, {}, never, never, true, never>;
         | 
| 24 | 
            +
            }
         | 
| @@ -14,17 +14,13 @@ export declare class ScPriceCardComponent extends AbstractScPriceCard { | |
| 14 14 | 
             
                /**
         | 
| 15 15 | 
             
                 * Признак того, что этот компонент отображается на мобильном устройстве.
         | 
| 16 16 | 
             
                 */
         | 
| 17 | 
            -
                 | 
| 17 | 
            +
                readonly isMobile: boolean;
         | 
| 18 18 | 
             
                /**
         | 
| 19 19 | 
             
                 * Инициирует экземпляр класса {@link ScPriceCardComponent}.
         | 
| 20 20 | 
             
                 *
         | 
| 21 21 | 
             
                 * @param cdr Объект для работы с обнаружением изменений.
         | 
| 22 22 | 
             
                 */
         | 
| 23 23 | 
             
                constructor(cdr: ChangeDetectorRef);
         | 
| 24 | 
            -
                /**
         | 
| 25 | 
            -
                 * Признак того, что компонент находится в корзине.
         | 
| 26 | 
            -
                 */
         | 
| 27 | 
            -
                get isInCart(): boolean;
         | 
| 28 24 | 
             
                /**
         | 
| 29 25 | 
             
                 * Устанавливает компонент в очередь на обновление.
         | 
| 30 26 | 
             
                 */
         | 
| @@ -1,5 +1,5 @@ | |
| 1 1 | 
             
            import { OnInit } from '@angular/core';
         | 
| 2 | 
            -
            import { ScIWarehouseStockCount, ScProduct,  | 
| 2 | 
            +
            import { ScIWarehouse, ScIWarehouseStockCount, ScProduct, ScWarehouseService } from '@snabcentr/client-core';
         | 
| 3 3 | 
             
            import { Observable } from 'rxjs';
         | 
| 4 4 | 
             
            import * as i0 from "@angular/core";
         | 
| 5 5 | 
             
            /**
         | 
| @@ -30,10 +30,10 @@ export declare class ScPriceWarehouseStockComponent implements OnInit { | |
| 30 30 | 
             
                /**
         | 
| 31 31 | 
             
                 * {@link Observable} изменения списка складов.
         | 
| 32 32 | 
             
                 */
         | 
| 33 | 
            -
                warehousesList$?: Observable<{
         | 
| 33 | 
            +
                warehousesList$?: Observable<Array<{
         | 
| 34 34 | 
             
                    sc: ScIWarehouseStockCount;
         | 
| 35 35 | 
             
                    w: ScIWarehouse | undefined;
         | 
| 36 | 
            -
                } | 
| 36 | 
            +
                }> | undefined>;
         | 
| 37 37 | 
             
                /**
         | 
| 38 38 | 
             
                 * Инициализирует экземпляр класса {@link ScPriceWarehouseStockComponent}.
         | 
| 39 39 | 
             
                 *
         | 
| @@ -15,11 +15,12 @@ import * as i13 from "@angular/forms"; | |
| 15 15 | 
             
            import * as i14 from "@taiga-ui/kit";
         | 
| 16 16 | 
             
            import * as i15 from "@taiga-ui/cdk";
         | 
| 17 17 | 
             
            import * as i16 from "@taiga-ui/addon-charts";
         | 
| 18 | 
            +
            import * as i17 from "./hover-image-carousel/hover-image-carousel.component";
         | 
| 18 19 | 
             
            /**
         | 
| 19 20 | 
             
             * Модуль каталога.
         | 
| 20 21 | 
             
             */
         | 
| 21 22 | 
             
            export declare class ScCatalogModule {
         | 
| 22 23 | 
             
                static ɵfac: i0.ɵɵFactoryDeclaration<ScCatalogModule, never>;
         | 
| 23 | 
            -
                static ɵmod: i0.ɵɵNgModuleDeclaration<ScCatalogModule, [typeof i1.ScPriceListPaginationComponent, typeof i2.ScCategoryCardComponent, typeof i3.ScFavoriteBtnComponent, typeof i4.ScInputQuantityComponent, typeof i5.ScPriceCardComponent, typeof i6.ScPriceWarehouseStockComponent, typeof i7.ScPriceHistoryComponent, typeof i8.ScCategoriesListComponent], [typeof i9.CommonModule, typeof i10.RouterModule, typeof i11.TuiButton, typeof i11.TuiIcon, typeof i12.TuiIslandDirective, typeof i12.TuiInputNumberModule, typeof i11.TuiLabel, typeof i12.TuiTextfieldControllerModule, typeof i13.FormsModule, typeof i13.ReactiveFormsModule, typeof i11.TuiHintComponent, typeof i11.TuiHintDirective, typeof i11.TuiHintOptionsDirective, typeof i11.TuiHintUnstyled, typeof i11.TuiHintDriver, typeof i11.TuiHintPosition, typeof i11.TuiHintHover, typeof i11.TuiHintOverflow, typeof i11.TuiHintDescribe, typeof i11.TuiHintHost, typeof i11.TuiHintManual, typeof i11.TuiHintPointer, typeof i14.TuiFieldErrorPipe, typeof i11.TuiLoader, typeof i11.TuiLink, typeof i14.TuiElasticContainer, typeof i15.TuiLet, typeof i15.TuiRepeatTimes, typeof i14.TuiHighlight, typeof i16.TuiLineDaysChart, typeof i16.TuiLineDaysChartHint, typeof i16.TuiAxes, typeof i14.TuiButtonLoading], [typeof i1.ScPriceListPaginationComponent, typeof i2.ScCategoryCardComponent, typeof i3.ScFavoriteBtnComponent, typeof i4.ScInputQuantityComponent, typeof i5.ScPriceCardComponent, typeof i6.ScPriceWarehouseStockComponent, typeof i7.ScPriceHistoryComponent, typeof i8.ScCategoriesListComponent]>;
         | 
| 24 | 
            +
                static ɵmod: i0.ɵɵNgModuleDeclaration<ScCatalogModule, [typeof i1.ScPriceListPaginationComponent, typeof i2.ScCategoryCardComponent, typeof i3.ScFavoriteBtnComponent, typeof i4.ScInputQuantityComponent, typeof i5.ScPriceCardComponent, typeof i6.ScPriceWarehouseStockComponent, typeof i7.ScPriceHistoryComponent, typeof i8.ScCategoriesListComponent], [typeof i9.CommonModule, typeof i10.RouterModule, typeof i11.TuiButton, typeof i11.TuiIcon, typeof i12.TuiIslandDirective, typeof i12.TuiInputNumberModule, typeof i11.TuiLabel, typeof i12.TuiTextfieldControllerModule, typeof i13.FormsModule, typeof i13.ReactiveFormsModule, typeof i11.TuiHintComponent, typeof i11.TuiHintDirective, typeof i11.TuiHintOptionsDirective, typeof i11.TuiHintUnstyled, typeof i11.TuiHintDriver, typeof i11.TuiHintPosition, typeof i11.TuiHintHover, typeof i11.TuiHintOverflow, typeof i11.TuiHintDescribe, typeof i11.TuiHintHost, typeof i11.TuiHintManual, typeof i11.TuiHintPointer, typeof i14.TuiFieldErrorPipe, typeof i11.TuiLoader, typeof i11.TuiLink, typeof i14.TuiElasticContainer, typeof i15.TuiLet, typeof i15.TuiRepeatTimes, typeof i14.TuiHighlight, typeof i16.TuiLineDaysChart, typeof i16.TuiLineDaysChartHint, typeof i16.TuiAxes, typeof i14.TuiButtonLoading, typeof i14.TuiAvatar, typeof i14.TuiBadge, typeof i17.HoverImageCarouselComponent], [typeof i1.ScPriceListPaginationComponent, typeof i2.ScCategoryCardComponent, typeof i3.ScFavoriteBtnComponent, typeof i4.ScInputQuantityComponent, typeof i5.ScPriceCardComponent, typeof i6.ScPriceWarehouseStockComponent, typeof i7.ScPriceHistoryComponent, typeof i8.ScCategoriesListComponent]>;
         | 
| 24 25 | 
             
                static ɵinj: i0.ɵɵInjectorDeclaration<ScCatalogModule>;
         | 
| 25 26 | 
             
            }
         | 
| @@ -101,6 +101,12 @@ export declare class AbstractScPriceCard { | |
| 101 101 | 
             
                 * Возвращает ссылку на preview-изображение карточки товара.
         | 
| 102 102 | 
             
                 */
         | 
| 103 103 | 
             
                getCardImagePreview(): string;
         | 
| 104 | 
            +
                /**
         | 
| 105 | 
            +
                 * Возвращает массив превью-изображений товара.
         | 
| 106 | 
            +
                 *
         | 
| 107 | 
            +
                 * @param product Объект товара.
         | 
| 108 | 
            +
                 */
         | 
| 109 | 
            +
                getCardImagePreviewList(product: ScProduct): string[];
         | 
| 104 110 | 
             
                static ɵfac: i0.ɵɵFactoryDeclaration<AbstractScPriceCard, never>;
         | 
| 105 111 | 
             
                static ɵdir: i0.ɵɵDirectiveDeclaration<AbstractScPriceCard, never, never, { "cartItem": { "alias": "cartItem"; "required": false; }; "product": { "alias": "product"; "required": false; }; "showQuantityControl": { "alias": "showQuantityControl"; "required": false; }; }, { "clickFavoriteEvent": "clickFavoriteEvent"; "clickAddToCartEvent": "clickAddToCartEvent"; "clickClearEvent": "clickClearEvent"; "clickCardEvent": "clickCardEvent"; "clickPriceHistoryEvent": "clickPriceHistoryEvent"; "quantityValueChanges": "quantityValueChanges"; }, never, never, false, never>;
         | 
| 106 112 | 
             
            }
         | 
| @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            /* eslint-disable no-underscore-dangle */
         | 
| 2 | 
            -
            import { ChangeDetectionStrategy, Component, EventEmitter, Inject, Input, Output, ViewChild } from '@angular/core';
         | 
| 2 | 
            +
            import { ChangeDetectionStrategy, Component, EventEmitter, Inject, inject, Input, Output, ViewChild } from '@angular/core';
         | 
| 3 3 | 
             
            import { FormControl } from '@angular/forms';
         | 
| 4 | 
            -
            import {  | 
| 4 | 
            +
            import { ScImageHelper } from '@snabcentr/client-core';
         | 
| 5 5 | 
             
            import { TuiPreviewDialogService } from '@taiga-ui/kit';
         | 
| 6 6 | 
             
            import { skip } from 'rxjs';
         | 
| 7 7 | 
             
            import * as i0 from "@angular/core";
         | 
| @@ -41,11 +41,9 @@ export class ScCartItemMobileComponent { | |
| 41 41 | 
             
                 * @param urls Список ссылок на разделы backend'a.
         | 
| 42 42 | 
             
                 * @param pathImageNotFound Путь до изображения 'Товар не найден'.
         | 
| 43 43 | 
             
                 */
         | 
| 44 | 
            -
                constructor(unitsHelper, previewDialogService | 
| 44 | 
            +
                constructor(unitsHelper, previewDialogService) {
         | 
| 45 45 | 
             
                    this.unitsHelper = unitsHelper;
         | 
| 46 46 | 
             
                    this.previewDialogService = previewDialogService;
         | 
| 47 | 
            -
                    this.urls = urls;
         | 
| 48 | 
            -
                    this.pathImageNotFound = pathImageNotFound;
         | 
| 49 47 | 
             
                    /**
         | 
| 50 48 | 
             
                     * {@link FormControl} поля ввода количества товара в корзине.
         | 
| 51 49 | 
             
                     */
         | 
| @@ -66,6 +64,10 @@ export class ScCartItemMobileComponent { | |
| 66 64 | 
             
                     * Событие нажатия на карточку.
         | 
| 67 65 | 
             
                     */
         | 
| 68 66 | 
             
                    this.clickCardEvent = new EventEmitter();
         | 
| 67 | 
            +
                    /**
         | 
| 68 | 
            +
                     * Хелпер для работы с изображениями товара.
         | 
| 69 | 
            +
                     */
         | 
| 70 | 
            +
                    this.imageHelper = inject(ScImageHelper);
         | 
| 69 71 | 
             
                }
         | 
| 70 72 | 
             
                /**
         | 
| 71 73 | 
             
                 * Продукт элемента корзины.
         | 
| @@ -85,25 +87,21 @@ export class ScCartItemMobileComponent { | |
| 85 87 | 
             
                }
         | 
| 86 88 | 
             
                /**
         | 
| 87 89 | 
             
                 * Возвращает ссылку на изображение карточки товара.
         | 
| 90 | 
            +
                 *
         | 
| 91 | 
            +
                 * @param product Позиция товара/услуги.
         | 
| 88 92 | 
             
                 */
         | 
| 89 | 
            -
                getCardImage() {
         | 
| 90 | 
            -
                    return this.product | 
| 93 | 
            +
                getCardImage(product) {
         | 
| 94 | 
            +
                    return this.imageHelper.getImage(product);
         | 
| 91 95 | 
             
                }
         | 
| 92 | 
            -
                static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ScCartItemMobileComponent, deps: [{ token: i1.ScUnitsHelper }, { token: TuiPreviewDialogService } | 
| 93 | 
            -
                static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: ScCartItemMobileComponent, selector: "sc-cart-item-mobile", inputs: { cartItem: "cartItem" }, outputs: { quantityValueChanges: "quantityValueChanges", clickDeleteEvent: "clickDeleteEvent", clickSettingsEvent: "clickSettingsEvent", clickCardEvent: "clickCardEvent" }, viewQueries: [{ propertyName: "specificationPreviewRef", first: true, predicate: ["specificationPreview"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"cartItem && product; else skeleton\">\n    <div class=\"flex min-w-72 gap-2 rounded-xl border border-tui-base-04 bg-white p-2 shadow-sc-2\">\n        <div class=\"flex w-40 items-center\">\n            <img\n                (click)=\"clickCardEvent.emit()\"\n                [src]=\"getCardImage()\"\n                [alt]=\"product.name\"\n                class=\"max-h-full w-full rounded-xl object-cover\"\n            />\n        </div>\n        <div class=\"flex w-full flex-col items-center justify-between gap-2 sm:flex-row sm:gap-5\">\n            <div class=\"flex max-w-full flex-col gap-1 self-start\">\n                <a\n                    tuiLink\n                    (click)=\"clickCardEvent.emit()\"\n                >\n                    <span class=\"font-bold\">{{ product.name }}</span>\n                </a>\n\n                <div class=\"flex w-full flex-wrap gap-x-2 gap-y-1 text-xs text-tui-base-07\">\n                    <p *ngIf=\"product.pack\">\n                        \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n                        <tui-svg\n                            *ngIf=\"product.ignoreMinCountCheck\"\n                            src=\"tuiIconPackage\"\n                            [tuiHint]=\"minCountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                        ></tui-svg>\n                        <ng-template #minCountHint>\n                            \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0437\u0430\u043A\u0430\u0437 <br />\n                            \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E <br />\n                            \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n                        </ng-template>\n                    </p>\n                    <p>\u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}</p>\n                </div>\n\n                <div class=\"flex w-full flex-wrap items-center gap-x-2 gap-y-1\">\n                    <p\n                        *ngIf=\"!product.priceInRub\"\n                        class=\"font-bold\"\n                    >\n                        {{ product.costString }}\n                    </p>\n                    <p class=\"text-xs font-bold text-tui-base-07\">{{ product.costRubString }}</p>\n                    <span\n                        *ngIf=\"product.discount\"\n                        class=\"flex items-center\"\n                    >\n                        <span class=\"line-through\">{{ product.discountCostString }}</span>  \n                        <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n                        <tui-icon\n                            icon=\"@tui.info\"\n                            [tuiHint]=\"discountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                            class=\"!h-4 !text-xs\"\n                        ></tui-icon>\n                        <ng-template #discountHint>\n                            <div class=\"font-bold\">{{ product.discount.name }}</div>\n                            <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n                        </ng-template>\n                    </span>\n                </div>\n\n                <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n\n                <div\n                    *ngIf=\"cartItem.height || cartItem.length || cartItem.width\"\n                    class=\"flex items-center gap-1\"\n                >\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.settings\"\n                        (click)=\"clickSettingsEvent.emit()\"\n                        size=\"s\"\n                        appearance=\"secondary\"\n                        class=\"mr-2 !self-center\"\n                    ></button>\n                    <div class=\"flex flex-wrap gap-x-2 text-xs font-thin text-tui-base-04\">\n                        <p *ngIf=\"cartItem.marker\">\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430: {{ cartItem.marker }}</p>\n                        <p *ngIf=\"cartItem.width\">\u0428\u0438\u0440\u0438\u043D\u0430: {{ cartItem.width }} \u043C.</p>\n                        <ng-container *ngIf=\"cartItem.height; else length\">\n                            <p>\u0412\u044B\u0441\u043E\u0442\u0430: {{ cartItem.height }} \u043C.</p>\n                        </ng-container>\n                        <ng-template #length>\n                            <p *ngIf=\"cartItem.length\">\u0414\u043B\u0438\u043D\u0430: {{ cartItem.length }} \u043C.</p>\n                        </ng-template>\n                    </div>\n                </div>\n\n                <a\n                    tuiLink\n                    *ngIf=\"cartItem.specificationImgUrl\"\n                    (click)=\"showSpecification()\"\n                    >\u0421\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F</a\n                >\n                <ng-template\n                    #specificationPreview\n                    let-preview\n                >\n                    <tui-preview\n                        [rotatable]=\"false\"\n                        [zoomable]=\"false\"\n                    >\n                        <img\n                            *polymorpheusOutlet=\"cartItem.specificationImgUrl as src\"\n                            alt=\"preview\"\n                            [src]=\"cartItem.specificationImgUrl\"\n                        />\n                        <button\n                            iconStart=\"@tui.x\"\n                            title=\"Close\"\n                            tuiIconButton\n                            tuiPreviewAction\n                            type=\"button\"\n                            (click)=\"preview.complete()\"\n                        ></button>\n                    </tui-preview>\n                </ng-template>\n            </div>\n            <div class=\"flex flex-col gap-1 self-start sm:mr-9 sm:self-center\">\n                <div class=\"flex gap-2\">\n                    <sc-input-quantity\n                        #inputQuantity\n                        *ngIf=\"quantityControl\"\n                        [formControl]=\"quantityControl\"\n                        [showCross]=\"false\"\n                        size=\"s\"\n                        [step]=\"unitsHelper.productMultiplicity(product)\"\n                        [ignoreStepValidators]=\"product.ignoreMinCountCheck\"\n                        (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n                        class=\"w-28\"\n                    ></sc-input-quantity>\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.trash-2\"\n                        [style.border-radius.%]=\"100\"\n                        size=\"xs\"\n                        (click)=\"clickDeleteEvent.emit()\"\n                    ></button>\n                </div>\n                <p class=\"text-sm font-bold text-tui-text-01\">\n                    \u0418\u0442\u043E\u0433\u043E: {{ cartItem.costRub | tuiFormatNumber: { precision: 2, decimalSeparator: '.', rounding: 'ceil' } | async }} {{ 'RUB' | tuiCurrency }}\n                </p>\n            </div>\n        </div>\n    </div>\n</ng-container>\n\n<ng-template #skeleton>\n    <div class=\"flex w-full gap-2\">\n        <div class=\"size-20 rounded-xl bg-tui-base-02\"></div>\n        <div class=\"flex grow flex-col gap-2.5 bg-white\">\n            <div class=\"h-4 w-full rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-3/5 rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-4/5 rounded-xl bg-tui-base-02\"></div>\n        </div>\n    </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "component", type: i4.ScInputQuantityComponent, selector: "sc-input-quantity", inputs: ["step", "showLoader", "showCross", "ignoreStepValidators", "appearance", "isDisabled", "size"], outputs: ["clickClearEvent"] }, { kind: "component", type: i5.ScPriceWarehouseStockComponent, selector: "sc-price-warehouse-stock", inputs: ["classList", "product", "withStockHint", "fromMain"] }, { kind: "directive", type: i3.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i3.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i7.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { kind: "directive", type: i7.TuiPreviewAction, selector: "[tuiPreviewAction]" }, { kind: "directive", type: i8.PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TuiCurrencyPipe, name: "tuiCurrency" }, { kind: "pipe", type: i3.TuiFormatNumberPipe, name: "tuiFormatNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
         | 
| 96 | 
            +
                static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ScCartItemMobileComponent, deps: [{ token: i1.ScUnitsHelper }, { token: TuiPreviewDialogService }], target: i0.ɵɵFactoryTarget.Component }); }
         | 
| 97 | 
            +
                static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: ScCartItemMobileComponent, selector: "sc-cart-item-mobile", inputs: { cartItem: "cartItem" }, outputs: { quantityValueChanges: "quantityValueChanges", clickDeleteEvent: "clickDeleteEvent", clickSettingsEvent: "clickSettingsEvent", clickCardEvent: "clickCardEvent" }, viewQueries: [{ propertyName: "specificationPreviewRef", first: true, predicate: ["specificationPreview"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"cartItem && product; else skeleton\">\n    <div class=\"flex min-w-72 gap-2 rounded-xl border border-tui-base-04 bg-white p-2 shadow-sc-2\">\n        <div class=\"flex w-40 items-center\">\n            <img\n                (click)=\"clickCardEvent.emit()\"\n                [src]=\"getCardImage(product)\"\n                [alt]=\"product.name\"\n                class=\"max-h-full w-full rounded-xl object-cover\"\n            />\n        </div>\n        <div class=\"flex w-full flex-col items-center justify-between gap-2 sm:flex-row sm:gap-5\">\n            <div class=\"flex max-w-full flex-col gap-1 self-start\">\n                <a\n                    tuiLink\n                    (click)=\"clickCardEvent.emit()\"\n                >\n                    <span class=\"font-bold\">{{ product.name }}</span>\n                </a>\n\n                <div class=\"flex w-full flex-wrap gap-x-2 gap-y-1 text-xs text-tui-base-07\">\n                    <p *ngIf=\"product.pack\">\n                        \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n                        <tui-svg\n                            *ngIf=\"product.ignoreMinCountCheck\"\n                            src=\"tuiIconPackage\"\n                            [tuiHint]=\"minCountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                        ></tui-svg>\n                        <ng-template #minCountHint>\n                            \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0437\u0430\u043A\u0430\u0437 <br />\n                            \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E <br />\n                            \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n                        </ng-template>\n                    </p>\n                    <p>\u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}</p>\n                </div>\n\n                <div class=\"flex w-full flex-wrap items-center gap-x-2 gap-y-1\">\n                    <p\n                        *ngIf=\"!product.priceInRub\"\n                        class=\"font-bold\"\n                    >\n                        {{ product.costString }}\n                    </p>\n                    <p class=\"text-xs font-bold text-tui-base-07\">{{ product.costRubString }}</p>\n                    <span\n                        *ngIf=\"product.discount\"\n                        class=\"flex items-center\"\n                    >\n                        <span class=\"line-through\">{{ product.discountCostString }}</span>  \n                        <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n                        <tui-icon\n                            icon=\"@tui.info\"\n                            [tuiHint]=\"discountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                            class=\"!h-4 !text-xs\"\n                        ></tui-icon>\n                        <ng-template #discountHint>\n                            <div class=\"font-bold\">{{ product.discount.name }}</div>\n                            <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n                        </ng-template>\n                    </span>\n                </div>\n\n                <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n\n                <div\n                    *ngIf=\"cartItem.height || cartItem.length || cartItem.width\"\n                    class=\"flex items-center gap-1\"\n                >\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.settings\"\n                        (click)=\"clickSettingsEvent.emit()\"\n                        size=\"s\"\n                        appearance=\"secondary\"\n                        class=\"mr-2 !self-center\"\n                    ></button>\n                    <div class=\"flex flex-wrap gap-x-2 text-xs font-thin text-tui-base-04\">\n                        <p *ngIf=\"cartItem.marker\">\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430: {{ cartItem.marker }}</p>\n                        <p *ngIf=\"cartItem.width\">\u0428\u0438\u0440\u0438\u043D\u0430: {{ cartItem.width }} \u043C.</p>\n                        <ng-container *ngIf=\"cartItem.height; else length\">\n                            <p>\u0412\u044B\u0441\u043E\u0442\u0430: {{ cartItem.height }} \u043C.</p>\n                        </ng-container>\n                        <ng-template #length>\n                            <p *ngIf=\"cartItem.length\">\u0414\u043B\u0438\u043D\u0430: {{ cartItem.length }} \u043C.</p>\n                        </ng-template>\n                    </div>\n                </div>\n\n                <a\n                    tuiLink\n                    *ngIf=\"cartItem.specificationImgUrl\"\n                    (click)=\"showSpecification()\"\n                    >\u0421\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F</a\n                >\n                <ng-template\n                    #specificationPreview\n                    let-preview\n                >\n                    <tui-preview\n                        [rotatable]=\"false\"\n                        [zoomable]=\"false\"\n                    >\n                        <img\n                            *polymorpheusOutlet=\"cartItem.specificationImgUrl as src\"\n                            alt=\"preview\"\n                            [src]=\"cartItem.specificationImgUrl\"\n                        />\n                        <button\n                            iconStart=\"@tui.x\"\n                            title=\"Close\"\n                            tuiIconButton\n                            tuiPreviewAction\n                            type=\"button\"\n                            (click)=\"preview.complete()\"\n                        ></button>\n                    </tui-preview>\n                </ng-template>\n            </div>\n            <div class=\"flex flex-col gap-1 self-start sm:mr-9 sm:self-center\">\n                <div class=\"flex gap-2\">\n                    <sc-input-quantity\n                        #inputQuantity\n                        *ngIf=\"quantityControl\"\n                        [formControl]=\"quantityControl\"\n                        [showCross]=\"false\"\n                        size=\"s\"\n                        [step]=\"unitsHelper.productMultiplicity(product)\"\n                        [ignoreStepValidators]=\"product.ignoreMinCountCheck\"\n                        (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n                        class=\"w-28\"\n                    ></sc-input-quantity>\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.trash-2\"\n                        [style.border-radius.%]=\"100\"\n                        size=\"xs\"\n                        (click)=\"clickDeleteEvent.emit()\"\n                    ></button>\n                </div>\n                <p class=\"text-sm font-bold text-tui-text-01\">\n                    \u0418\u0442\u043E\u0433\u043E: {{ cartItem.costRub | tuiFormatNumber: { precision: 2, decimalSeparator: '.', rounding: 'ceil' } | async }} {{ 'RUB' | tuiCurrency }}\n                </p>\n            </div>\n        </div>\n    </div>\n</ng-container>\n\n<ng-template #skeleton>\n    <div class=\"flex w-full gap-2\">\n        <div class=\"size-20 rounded-xl bg-tui-base-02\"></div>\n        <div class=\"flex grow flex-col gap-2.5 bg-white\">\n            <div class=\"h-4 w-full rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-3/5 rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-4/5 rounded-xl bg-tui-base-02\"></div>\n        </div>\n    </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "component", type: i4.ScInputQuantityComponent, selector: "sc-input-quantity", inputs: ["step", "showLoader", "showCross", "ignoreStepValidators", "appearance", "isDisabled", "size"], outputs: ["clickClearEvent"] }, { kind: "component", type: i5.ScPriceWarehouseStockComponent, selector: "sc-price-warehouse-stock", inputs: ["classList", "product", "withStockHint", "fromMain"] }, { kind: "directive", type: i3.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i3.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i7.TuiPreviewComponent, selector: "tui-preview", inputs: ["zoomable", "rotatable"] }, { kind: "directive", type: i7.TuiPreviewAction, selector: "[tuiPreviewAction]" }, { kind: "directive", type: i8.PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TuiCurrencyPipe, name: "tuiCurrency" }, { kind: "pipe", type: i3.TuiFormatNumberPipe, name: "tuiFormatNumber" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
         | 
| 94 98 | 
             
            }
         | 
| 95 99 | 
             
            i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ScCartItemMobileComponent, decorators: [{
         | 
| 96 100 | 
             
                        type: Component,
         | 
| 97 | 
            -
                        args: [{ selector: 'sc-cart-item-mobile', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"cartItem && product; else skeleton\">\n    <div class=\"flex min-w-72 gap-2 rounded-xl border border-tui-base-04 bg-white p-2 shadow-sc-2\">\n        <div class=\"flex w-40 items-center\">\n            <img\n                (click)=\"clickCardEvent.emit()\"\n                [src]=\"getCardImage()\"\n                [alt]=\"product.name\"\n                class=\"max-h-full w-full rounded-xl object-cover\"\n            />\n        </div>\n        <div class=\"flex w-full flex-col items-center justify-between gap-2 sm:flex-row sm:gap-5\">\n            <div class=\"flex max-w-full flex-col gap-1 self-start\">\n                <a\n                    tuiLink\n                    (click)=\"clickCardEvent.emit()\"\n                >\n                    <span class=\"font-bold\">{{ product.name }}</span>\n                </a>\n\n                <div class=\"flex w-full flex-wrap gap-x-2 gap-y-1 text-xs text-tui-base-07\">\n                    <p *ngIf=\"product.pack\">\n                        \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n                        <tui-svg\n                            *ngIf=\"product.ignoreMinCountCheck\"\n                            src=\"tuiIconPackage\"\n                            [tuiHint]=\"minCountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                        ></tui-svg>\n                        <ng-template #minCountHint>\n                            \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0437\u0430\u043A\u0430\u0437 <br />\n                            \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E <br />\n                            \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n                        </ng-template>\n                    </p>\n                    <p>\u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}</p>\n                </div>\n\n                <div class=\"flex w-full flex-wrap items-center gap-x-2 gap-y-1\">\n                    <p\n                        *ngIf=\"!product.priceInRub\"\n                        class=\"font-bold\"\n                    >\n                        {{ product.costString }}\n                    </p>\n                    <p class=\"text-xs font-bold text-tui-base-07\">{{ product.costRubString }}</p>\n                    <span\n                        *ngIf=\"product.discount\"\n                        class=\"flex items-center\"\n                    >\n                        <span class=\"line-through\">{{ product.discountCostString }}</span>  \n                        <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n                        <tui-icon\n                            icon=\"@tui.info\"\n                            [tuiHint]=\"discountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                            class=\"!h-4 !text-xs\"\n                        ></tui-icon>\n                        <ng-template #discountHint>\n                            <div class=\"font-bold\">{{ product.discount.name }}</div>\n                            <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n                        </ng-template>\n                    </span>\n                </div>\n\n                <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n\n                <div\n                    *ngIf=\"cartItem.height || cartItem.length || cartItem.width\"\n                    class=\"flex items-center gap-1\"\n                >\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.settings\"\n                        (click)=\"clickSettingsEvent.emit()\"\n                        size=\"s\"\n                        appearance=\"secondary\"\n                        class=\"mr-2 !self-center\"\n                    ></button>\n                    <div class=\"flex flex-wrap gap-x-2 text-xs font-thin text-tui-base-04\">\n                        <p *ngIf=\"cartItem.marker\">\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430: {{ cartItem.marker }}</p>\n                        <p *ngIf=\"cartItem.width\">\u0428\u0438\u0440\u0438\u043D\u0430: {{ cartItem.width }} \u043C.</p>\n                        <ng-container *ngIf=\"cartItem.height; else length\">\n                            <p>\u0412\u044B\u0441\u043E\u0442\u0430: {{ cartItem.height }} \u043C.</p>\n                        </ng-container>\n                        <ng-template #length>\n                            <p *ngIf=\"cartItem.length\">\u0414\u043B\u0438\u043D\u0430: {{ cartItem.length }} \u043C.</p>\n                        </ng-template>\n                    </div>\n                </div>\n\n                <a\n                    tuiLink\n                    *ngIf=\"cartItem.specificationImgUrl\"\n                    (click)=\"showSpecification()\"\n                    >\u0421\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F</a\n                >\n                <ng-template\n                    #specificationPreview\n                    let-preview\n                >\n                    <tui-preview\n                        [rotatable]=\"false\"\n                        [zoomable]=\"false\"\n                    >\n                        <img\n                            *polymorpheusOutlet=\"cartItem.specificationImgUrl as src\"\n                            alt=\"preview\"\n                            [src]=\"cartItem.specificationImgUrl\"\n                        />\n                        <button\n                            iconStart=\"@tui.x\"\n                            title=\"Close\"\n                            tuiIconButton\n                            tuiPreviewAction\n                            type=\"button\"\n                            (click)=\"preview.complete()\"\n                        ></button>\n                    </tui-preview>\n                </ng-template>\n            </div>\n            <div class=\"flex flex-col gap-1 self-start sm:mr-9 sm:self-center\">\n                <div class=\"flex gap-2\">\n                    <sc-input-quantity\n                        #inputQuantity\n                        *ngIf=\"quantityControl\"\n                        [formControl]=\"quantityControl\"\n                        [showCross]=\"false\"\n                        size=\"s\"\n                        [step]=\"unitsHelper.productMultiplicity(product)\"\n                        [ignoreStepValidators]=\"product.ignoreMinCountCheck\"\n                        (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n                        class=\"w-28\"\n                    ></sc-input-quantity>\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.trash-2\"\n                        [style.border-radius.%]=\"100\"\n                        size=\"xs\"\n                        (click)=\"clickDeleteEvent.emit()\"\n                    ></button>\n                </div>\n                <p class=\"text-sm font-bold text-tui-text-01\">\n                    \u0418\u0442\u043E\u0433\u043E: {{ cartItem.costRub | tuiFormatNumber: { precision: 2, decimalSeparator: '.', rounding: 'ceil' } | async }} {{ 'RUB' | tuiCurrency }}\n                </p>\n            </div>\n        </div>\n    </div>\n</ng-container>\n\n<ng-template #skeleton>\n    <div class=\"flex w-full gap-2\">\n        <div class=\"size-20 rounded-xl bg-tui-base-02\"></div>\n        <div class=\"flex grow flex-col gap-2.5 bg-white\">\n            <div class=\"h-4 w-full rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-3/5 rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-4/5 rounded-xl bg-tui-base-02\"></div>\n        </div>\n    </div>\n</ng-template>\n" }]
         | 
| 101 | 
            +
                        args: [{ selector: 'sc-cart-item-mobile', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"cartItem && product; else skeleton\">\n    <div class=\"flex min-w-72 gap-2 rounded-xl border border-tui-base-04 bg-white p-2 shadow-sc-2\">\n        <div class=\"flex w-40 items-center\">\n            <img\n                (click)=\"clickCardEvent.emit()\"\n                [src]=\"getCardImage(product)\"\n                [alt]=\"product.name\"\n                class=\"max-h-full w-full rounded-xl object-cover\"\n            />\n        </div>\n        <div class=\"flex w-full flex-col items-center justify-between gap-2 sm:flex-row sm:gap-5\">\n            <div class=\"flex max-w-full flex-col gap-1 self-start\">\n                <a\n                    tuiLink\n                    (click)=\"clickCardEvent.emit()\"\n                >\n                    <span class=\"font-bold\">{{ product.name }}</span>\n                </a>\n\n                <div class=\"flex w-full flex-wrap gap-x-2 gap-y-1 text-xs text-tui-base-07\">\n                    <p *ngIf=\"product.pack\">\n                        \u041D\u043E\u0440\u043C\u0430 \u0443\u043F\u0430\u043A\u043E\u0432\u043A\u0438: {{ product.pack }}\n                        <tui-svg\n                            *ngIf=\"product.ignoreMinCountCheck\"\n                            src=\"tuiIconPackage\"\n                            [tuiHint]=\"minCountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                        ></tui-svg>\n                        <ng-template #minCountHint>\n                            \u0414\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u0437\u0430\u043A\u0430\u0437 <br />\n                            \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u043B\u044C\u043D\u043E\u0433\u043E <br />\n                            \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430\n                        </ng-template>\n                    </p>\n                    <p>\u0410\u0440\u0442\u0438\u043A\u0443\u043B: {{ product.code }}</p>\n                </div>\n\n                <div class=\"flex w-full flex-wrap items-center gap-x-2 gap-y-1\">\n                    <p\n                        *ngIf=\"!product.priceInRub\"\n                        class=\"font-bold\"\n                    >\n                        {{ product.costString }}\n                    </p>\n                    <p class=\"text-xs font-bold text-tui-base-07\">{{ product.costRubString }}</p>\n                    <span\n                        *ngIf=\"product.discount\"\n                        class=\"flex items-center\"\n                    >\n                        <span class=\"line-through\">{{ product.discountCostString }}</span>  \n                        <span class=\"font-bold text-tui-success-fill\"> -{{ product.discount.percent }}% </span>\n                        <tui-icon\n                            icon=\"@tui.info\"\n                            [tuiHint]=\"discountHint\"\n                            [tuiHintShowDelay]=\"100\"\n                            tuiHintDirection=\"top\"\n                            class=\"!h-4 !text-xs\"\n                        ></tui-icon>\n                        <ng-template #discountHint>\n                            <div class=\"font-bold\">{{ product.discount.name }}</div>\n                            <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n                        </ng-template>\n                    </span>\n                </div>\n\n                <sc-price-warehouse-stock [product]=\"product\"></sc-price-warehouse-stock>\n\n                <div\n                    *ngIf=\"cartItem.height || cartItem.length || cartItem.width\"\n                    class=\"flex items-center gap-1\"\n                >\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.settings\"\n                        (click)=\"clickSettingsEvent.emit()\"\n                        size=\"s\"\n                        appearance=\"secondary\"\n                        class=\"mr-2 !self-center\"\n                    ></button>\n                    <div class=\"flex flex-wrap gap-x-2 text-xs font-thin text-tui-base-04\">\n                        <p *ngIf=\"cartItem.marker\">\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430: {{ cartItem.marker }}</p>\n                        <p *ngIf=\"cartItem.width\">\u0428\u0438\u0440\u0438\u043D\u0430: {{ cartItem.width }} \u043C.</p>\n                        <ng-container *ngIf=\"cartItem.height; else length\">\n                            <p>\u0412\u044B\u0441\u043E\u0442\u0430: {{ cartItem.height }} \u043C.</p>\n                        </ng-container>\n                        <ng-template #length>\n                            <p *ngIf=\"cartItem.length\">\u0414\u043B\u0438\u043D\u0430: {{ cartItem.length }} \u043C.</p>\n                        </ng-template>\n                    </div>\n                </div>\n\n                <a\n                    tuiLink\n                    *ngIf=\"cartItem.specificationImgUrl\"\n                    (click)=\"showSpecification()\"\n                    >\u0421\u043F\u0435\u0446\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u044F</a\n                >\n                <ng-template\n                    #specificationPreview\n                    let-preview\n                >\n                    <tui-preview\n                        [rotatable]=\"false\"\n                        [zoomable]=\"false\"\n                    >\n                        <img\n                            *polymorpheusOutlet=\"cartItem.specificationImgUrl as src\"\n                            alt=\"preview\"\n                            [src]=\"cartItem.specificationImgUrl\"\n                        />\n                        <button\n                            iconStart=\"@tui.x\"\n                            title=\"Close\"\n                            tuiIconButton\n                            tuiPreviewAction\n                            type=\"button\"\n                            (click)=\"preview.complete()\"\n                        ></button>\n                    </tui-preview>\n                </ng-template>\n            </div>\n            <div class=\"flex flex-col gap-1 self-start sm:mr-9 sm:self-center\">\n                <div class=\"flex gap-2\">\n                    <sc-input-quantity\n                        #inputQuantity\n                        *ngIf=\"quantityControl\"\n                        [formControl]=\"quantityControl\"\n                        [showCross]=\"false\"\n                        size=\"s\"\n                        [step]=\"unitsHelper.productMultiplicity(product)\"\n                        [ignoreStepValidators]=\"product.ignoreMinCountCheck\"\n                        (keydown.enter)=\"inputQuantity.nativeFocusableElement?.blur()\"\n                        class=\"w-28\"\n                    ></sc-input-quantity>\n                    <button\n                        tuiIconButton\n                        iconStart=\"@tui.trash-2\"\n                        [style.border-radius.%]=\"100\"\n                        size=\"xs\"\n                        (click)=\"clickDeleteEvent.emit()\"\n                    ></button>\n                </div>\n                <p class=\"text-sm font-bold text-tui-text-01\">\n                    \u0418\u0442\u043E\u0433\u043E: {{ cartItem.costRub | tuiFormatNumber: { precision: 2, decimalSeparator: '.', rounding: 'ceil' } | async }} {{ 'RUB' | tuiCurrency }}\n                </p>\n            </div>\n        </div>\n    </div>\n</ng-container>\n\n<ng-template #skeleton>\n    <div class=\"flex w-full gap-2\">\n        <div class=\"size-20 rounded-xl bg-tui-base-02\"></div>\n        <div class=\"flex grow flex-col gap-2.5 bg-white\">\n            <div class=\"h-4 w-full rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-3/5 rounded-xl bg-tui-base-02\"></div>\n            <div class=\"h-4 w-4/5 rounded-xl bg-tui-base-02\"></div>\n        </div>\n    </div>\n</ng-template>\n" }]
         | 
| 98 102 | 
             
                    }], ctorParameters: () => [{ type: i1.ScUnitsHelper }, { type: i7.TuiPreviewDialogService, decorators: [{
         | 
| 99 103 | 
             
                                type: Inject,
         | 
| 100 104 | 
             
                                args: [TuiPreviewDialogService]
         | 
| 101 | 
            -
                            }] }, { type: undefined, decorators: [{
         | 
| 102 | 
            -
                                type: Inject,
         | 
| 103 | 
            -
                                args: [SC_URLS]
         | 
| 104 | 
            -
                            }] }, { type: undefined, decorators: [{
         | 
| 105 | 
            -
                                type: Inject,
         | 
| 106 | 
            -
                                args: [SC_PATH_IMAGE_NOT_FOUND]
         | 
| 107 105 | 
             
                            }] }], propDecorators: { cartItem: [{
         | 
| 108 106 | 
             
                            type: Input
         | 
| 109 107 | 
             
                        }], specificationPreviewRef: [{
         | 
| @@ -118,4 +116,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor | |
| 118 116 | 
             
                        }], clickCardEvent: [{
         | 
| 119 117 | 
             
                            type: Output
         | 
| 120 118 | 
             
                        }] } });
         | 
| 121 | 
            -
            //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2FydC1pdGVtLW1vYmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9jYXJ0LWl0ZW0tbW9iaWxlL3NjLWNhcnQtaXRlbS1tb2JpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhcnQvY2FydC1pdGVtLW1vYmlsZS9zYy1jYXJ0LWl0ZW0tbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUV6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEksT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxPQUFPLEVBQWlELE1BQU0sd0JBQXdCLENBQUM7QUFFekgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBYyxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBRXhDOztHQUVHO0FBTUgsTUFBTSxPQUFPLHlCQUF5QjtJQUNsQzs7T0FFRztJQUNILElBQ1csUUFBUSxDQUFDLElBQTRCO1FBQzVDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBMENEOzs7Ozs7O09BT0c7SUFDSCxZQUNvQixXQUEwQixFQUV6QixvQkFBNkMsRUFDNUIsSUFBYSxFQUNHLGlCQUF5QjtRQUozRCxnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUV6Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXlCO1FBQzVCLFNBQUksR0FBSixJQUFJLENBQVM7UUFDRyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQVE7UUEvQy9FOztXQUVHO1FBQ0ksb0JBQWUsR0FBK0IsSUFBSSxXQUFXLENBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTdHOztXQUVHO1FBRUkseUJBQW9CLEdBQThCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6Rzs7V0FFRztRQUVJLHFCQUFnQixHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZFOztXQUVHO1FBRUksdUJBQWtCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFFekU7O1dBRUc7UUFFSSxtQkFBYyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO0lBcUJsRSxDQUFDO0lBRUo7O09BRUc7SUFDSCxJQUFXLE9BQU87UUFDZCxPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxrQkFBa0I7SUFDWCxRQUFRO1FBQ1gsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNJLGlCQUFpQjtRQUNwQixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxZQUFZO1FBQ2YsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNwSCxDQUFDOzhHQXBHUSx5QkFBeUIsK0NBc0V0Qix1QkFBdUIsYUFFdkIsT0FBTyxhQUNQLHVCQUF1QjtrR0F6RTFCLHlCQUF5QiwyWUNqQnRDLDgrUEFpS0E7OzJGRGhKYSx5QkFBeUI7a0JBTHJDLFNBQVM7K0JBQ0kscUJBQXFCLG1CQUVkLHVCQUF1QixDQUFDLE1BQU07OzBCQXdFMUMsTUFBTTsyQkFBQyx1QkFBdUI7OzBCQUU5QixNQUFNOzJCQUFDLE9BQU87OzBCQUNkLE1BQU07MkJBQUMsdUJBQXVCO3lDQXBFeEIsUUFBUTtzQkFEbEIsS0FBSztnQkFvQlcsdUJBQXVCO3NCQUR2QyxTQUFTO3VCQUFDLHNCQUFzQjtnQkFZMUIsb0JBQW9CO3NCQUQxQixNQUFNO2dCQU9BLGdCQUFnQjtzQkFEdEIsTUFBTTtnQkFPQSxrQkFBa0I7c0JBRHhCLE1BQU07Z0JBT0EsY0FBYztzQkFEcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG5cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU0NfUEFUSF9JTUFHRV9OT1RfRk9VTkQsIFNDX1VSTFMsIFNjQ2FydEl0ZW0sIFNjSVVybHMsIFNjUHJvZHVjdCwgU2NVbml0c0hlbHBlciB9IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVHVpRGlhbG9nQ29udGV4dCB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aVByZXZpZXdEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBza2lwIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICog0JrQvtC80L/QvtC90LXQvdGCINC60LDRgNGC0L7Rh9C60Lgg0Y3Qu9C10LzQtdC90YLQsCDQutC+0YDQt9C40L3Riy5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzYy1jYXJ0LWl0ZW0tbW9iaWxlJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2MtY2FydC1pdGVtLW1vYmlsZS5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjQ2FydEl0ZW1Nb2JpbGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqINCt0LvQtdC80LXQvdGCINC60L7RgNC30LjQvdGLLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHNldCBjYXJ0SXRlbShkYXRhOiBTY0NhcnRJdGVtIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuX2NhcnRJdGVtID0gZGF0YTtcblxuICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy5xdWFudGl0eUNvbnRyb2wucGF0Y2hWYWx1ZShkYXRhLnF1YW50aXR5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCt0LvQtdC80LXQvdGCINC60L7RgNC30LjQvdGLLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY2FydEl0ZW0oKTogU2NDYXJ0SXRlbSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYXJ0SXRlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodGB0YvQu9C60LAg0L3QsCDQv9GA0LXQtNGB0YLQsNCy0LvQtdC90LjQtSDRgdC/0LXRhtC40YTQuNC60LDRhtC40LguXG4gICAgICovXG4gICAgQFZpZXdDaGlsZCgnc3BlY2lmaWNhdGlvblByZXZpZXcnKVxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3BlY2lmaWNhdGlvblByZXZpZXdSZWY/OiBUZW1wbGF0ZVJlZjxUdWlEaWFsb2dDb250ZXh0PjtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBGb3JtQ29udHJvbH0g0L/QvtC70Y8g0LLQstC+0LTQsCDQutC+0LvQuNGH0LXRgdGC0LLQsCDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgcHVibGljIHF1YW50aXR5Q29udHJvbDogRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4gPSBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4oMCwgeyB1cGRhdGVPbjogJ2JsdXInIH0pO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC40LfQvNC10L3QtdC90LjRjyDQutC+0LvQuNGH0LXRgdGC0LLQsCDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHF1YW50aXR5VmFsdWVDaGFuZ2VzOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bGw+ID0gdGhpcy5xdWFudGl0eUNvbnRyb2wudmFsdWVDaGFuZ2VzLnBpcGUoc2tpcCgxKSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINC60L3QvtC/0LrRgyBcItCj0LTQsNC70LjRgtGMINC40Lcg0LrQvtGA0LfQuNC90YtcIi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xpY2tEZWxldGVFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICog0KHQvtCx0YvRgtC40LUg0L3QsNC20LDRgtC40Y8g0L3QsCDQutC90L7Qv9C60YMgXCLQo9C00LDQu9C40YLRjCDQuNC3INC60L7RgNC30LjQvdGLXCIuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNsaWNrU2V0dGluZ3NFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICog0KHQvtCx0YvRgtC40LUg0L3QsNC20LDRgtC40Y8g0L3QsCDQutCw0YDRgtC+0YfQutGDLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjbGlja0NhcmRFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICog0K3Qu9C10LzQtdC90YIg0LrQvtGA0LfQuNC90YsuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY2FydEl0ZW0/OiBTY0NhcnRJdGVtO1xuXG4gICAgLyoqXG4gICAgICog0JjQvdC40YbQuNC40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NDYXJ0SXRlbU1vYmlsZUNvbXBvbmVudH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdW5pdHNIZWxwZXIg0K3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsC3Qv9C+0LzQvtGJ0L3QuNC60LAg0LTQu9GPINGA0LDQsdC+0YLRiyDRgdC+INC30L3QsNGH0LXQvdC40Y/QvNC4INC10LTQuNC90LjRhiDQuNC30LzQtdGA0LXQvdC40Y8g0YLQvtCy0LDRgNCwLlxuICAgICAqIEBwYXJhbSBwcmV2aWV3RGlhbG9nU2VydmljZSDQodC10YDQstC40YEg0LTQuNCw0LvQvtCz0L7QstC+0LPQviDQvtC60L3QsCDQv9GA0LXQtNCy0LDRgNC40YLQtdC70YzQvdC+0LPQviDQv9GA0L7RgdC80L7RgtGA0LAuXG4gICAgICogQHBhcmFtIHVybHMg0KHQv9C40YHQvtC6INGB0YHRi9C70L7QuiDQvdCwINGA0LDQt9C00LXQu9GLIGJhY2tlbmQnYS5cbiAgICAgKiBAcGFyYW0gcGF0aEltYWdlTm90Rm91bmQg0J/Rg9GC0Ywg0LTQviDQuNC30L7QsdGA0LDQttC10L3QuNGPICfQotC+0LLQsNGAINC90LUg0L3QsNC50LTQtdC9Jy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSB1bml0c0hlbHBlcjogU2NVbml0c0hlbHBlcixcbiAgICAgICAgQEluamVjdChUdWlQcmV2aWV3RGlhbG9nU2VydmljZSlcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwcmV2aWV3RGlhbG9nU2VydmljZTogVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UsXG4gICAgICAgIEBJbmplY3QoU0NfVVJMUykgcHJpdmF0ZSByZWFkb25seSB1cmxzOiBTY0lVcmxzLFxuICAgICAgICBASW5qZWN0KFNDX1BBVEhfSU1BR0VfTk9UX0ZPVU5EKSBwcml2YXRlIHJlYWRvbmx5IHBhdGhJbWFnZU5vdEZvdW5kOiBzdHJpbmdcbiAgICApIHt9XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0L7QtNGD0LrRgiDRjdC70LXQvNC10L3RgtCwINC60L7RgNC30LjQvdGLLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgcHJvZHVjdCgpOiBTY1Byb2R1Y3QgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJ0SXRlbT8ucHJvZHVjdDtcbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucXVhbnRpdHlWYWx1ZUNoYW5nZXMgPSB0aGlzLnF1YW50aXR5Q29udHJvbC52YWx1ZUNoYW5nZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7RgtC+0LHRgNCw0LfQuNGC0Ywg0YHQv9C10YbQuNGE0LjQutCw0YbQuNGOLlxuICAgICAqL1xuICAgIHB1YmxpYyBzaG93U3BlY2lmaWNhdGlvbigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcmV2aWV3RGlhbG9nU2VydmljZS5vcGVuKHRoaXMuc3BlY2lmaWNhdGlvblByZXZpZXdSZWYgPz8gJycpLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINGB0YHRi9C70LrRgyDQvdCwINC40LfQvtCx0YDQsNC20LXQvdC40LUg0LrQsNGA0YLQvtGH0LrQuCDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHVibGljIGdldENhcmRJbWFnZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9kdWN0Py5nZXRJbWFnZVByZXZpZXcodGhpcy51cmxzLmltZ1NlcnZlclVybCkgPz8gdGhpcy51cmxzLmltZ1NlcnZlclVybCArIHRoaXMucGF0aEltYWdlTm90Rm91bmQ7XG4gICAgfVxufVxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcnRJdGVtICYmIHByb2R1Y3Q7IGVsc2Ugc2tlbGV0b25cIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBtaW4tdy03MiBnYXAtMiByb3VuZGVkLXhsIGJvcmRlciBib3JkZXItdHVpLWJhc2UtMDQgYmctd2hpdGUgcC0yIHNoYWRvdy1zYy0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctNDAgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQ2FyZEV2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgW3NyY109XCJnZXRDYXJkSW1hZ2UoKVwiXG4gICAgICAgICAgICAgICAgW2FsdF09XCJwcm9kdWN0Lm5hbWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF4LWgtZnVsbCB3LWZ1bGwgcm91bmRlZC14bCBvYmplY3QtY292ZXJcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHNtOmZsZXgtcm93IHNtOmdhcC01XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBtYXgtdy1mdWxsIGZsZXgtY29sIGdhcC0xIHNlbGYtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgICAgICB0dWlMaW5rXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NhcmRFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj57eyBwcm9kdWN0Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtd3JhcCBnYXAteC0yIGdhcC15LTEgdGV4dC14cyB0ZXh0LXR1aS1iYXNlLTA3XCI+XG4gICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwicHJvZHVjdC5wYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICDQndC+0YDQvNCwINGD0L/QsNC60L7QstC60Lg6IHt7IHByb2R1Y3QucGFjayB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS1zdmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2R1Y3QuaWdub3JlTWluQ291bnRDaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwidHVpSWNvblBhY2thZ2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlIaW50XT1cIm1pbkNvdW50SGludFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R1aUhpbnRTaG93RGVsYXldPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlIaW50RGlyZWN0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3R1aS1zdmc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21pbkNvdW50SGludD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQlNC+0YHRgtGD0L/QtdC9INC30LDQutCw0LcgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg0L/RgNC+0LjQt9Cy0L7Qu9GM0L3QvtCz0L4gPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg0LrQvtC70LjRh9C10YHRgtCy0LBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHA+0JDRgNGC0LjQutGD0Ls6IHt7IHByb2R1Y3QuY29kZSB9fTwvcD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC14LTIgZ2FwLXktMVwiPlxuICAgICAgICAgICAgICAgICAgICA8cFxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcHJvZHVjdC5wcmljZUluUnViXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udC1ib2xkXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgcHJvZHVjdC5jb3N0U3RyaW5nIH19XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXR1aS1iYXNlLTA3XCI+e3sgcHJvZHVjdC5jb3N0UnViU3RyaW5nIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0LmRpc2NvdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpbmUtdGhyb3VnaFwiPnt7IHByb2R1Y3QuZGlzY291bnRDb3N0U3RyaW5nIH19PC9zcGFuPiAmbmJzcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHRleHQtdHVpLXN1Y2Nlc3MtZmlsbFwiPiAte3sgcHJvZHVjdC5kaXNjb3VudC5wZXJjZW50IH19JSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwiQHR1aS5pbmZvXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpSGludF09XCJkaXNjb3VudEhpbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlIaW50U2hvd0RlbGF5XT1cIjEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSGludERpcmVjdGlvbj1cInRvcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCIhaC00ICF0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3R1aS1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkaXNjb3VudEhpbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IHByb2R1Y3QuZGlzY291bnQubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9kdWN0LmRpc2NvdW50LmV4cGlyZWRBdCBhcyBleHBpcmVkQXRcIj7QlNCw0YLQsCDQvtC60L7QvdGH0LDQvdC40Y86IHt7IGV4cGlyZWRBdCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPHNjLXByaWNlLXdhcmVob3VzZS1zdG9jayBbcHJvZHVjdF09XCJwcm9kdWN0XCI+PC9zYy1wcmljZS13YXJlaG91c2Utc3RvY2s+XG5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FydEl0ZW0uaGVpZ2h0IHx8IGNhcnRJdGVtLmxlbmd0aCB8fCBjYXJ0SXRlbS53aWR0aFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5zZXR0aW5nc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tTZXR0aW5nc0V2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXItMiAhc2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAteC0yIHRleHQteHMgZm9udC10aGluIHRleHQtdHVpLWJhc2UtMDRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY2FydEl0ZW0ubWFya2VyXCI+0JzQsNGA0LrQuNGA0L7QstC60LA6IHt7IGNhcnRJdGVtLm1hcmtlciB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY2FydEl0ZW0ud2lkdGhcIj7QqNC40YDQuNC90LA6IHt7IGNhcnRJdGVtLndpZHRoIH19INC8LjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJ0SXRlbS5oZWlnaHQ7IGVsc2UgbGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+0JLRi9GB0L7RgtCwOiB7eyBjYXJ0SXRlbS5oZWlnaHQgfX0g0LwuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xlbmd0aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImNhcnRJdGVtLmxlbmd0aFwiPtCU0LvQuNC90LA6IHt7IGNhcnRJdGVtLmxlbmd0aCB9fSDQvC48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXJ0SXRlbS5zcGVjaWZpY2F0aW9uSW1nVXJsXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dTcGVjaWZpY2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICA+0KHQv9C10YbQuNGE0LjQutCw0YbQuNGPPC9hXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAjc3BlY2lmaWNhdGlvblByZXZpZXdcbiAgICAgICAgICAgICAgICAgICAgbGV0LXByZXZpZXdcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDx0dWktcHJldmlld1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvdGF0YWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbem9vbWFibGVdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBvbHltb3JwaGV1c091dGxldD1cImNhcnRJdGVtLnNwZWNpZmljYXRpb25JbWdVcmwgYXMgc3JjXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJwcmV2aWV3XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3JjXT1cImNhcnRJdGVtLnNwZWNpZmljYXRpb25JbWdVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQ2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlQcmV2aWV3QWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInByZXZpZXcuY29tcGxldGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvdHVpLXByZXZpZXc+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTEgc2VsZi1zdGFydCBzbTptci05IHNtOnNlbGYtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNjLWlucHV0LXF1YW50aXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAjaW5wdXRRdWFudGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJxdWFudGl0eUNvbnRyb2xcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInF1YW50aXR5Q29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2hvd0Nyb3NzXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdGVwXT1cInVuaXRzSGVscGVyLnByb2R1Y3RNdWx0aXBsaWNpdHkocHJvZHVjdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lnbm9yZVN0ZXBWYWxpZGF0b3JzXT1cInByb2R1Y3QuaWdub3JlTWluQ291bnRDaGVja1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJpbnB1dFF1YW50aXR5Lm5hdGl2ZUZvY3VzYWJsZUVsZW1lbnQ/LmJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMjhcIlxuICAgICAgICAgICAgICAgICAgICA+PC9zYy1pbnB1dC1xdWFudGl0eT5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS50cmFzaC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItcmFkaXVzLiVdPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xpY2tEZWxldGVFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtYm9sZCB0ZXh0LXR1aS10ZXh0LTAxXCI+XG4gICAgICAgICAgICAgICAgICAgINCY0YLQvtCz0L46IHt7IGNhcnRJdGVtLmNvc3RSdWIgfCB0dWlGb3JtYXROdW1iZXI6IHsgcHJlY2lzaW9uOiAyLCBkZWNpbWFsU2VwYXJhdG9yOiAnLicsIHJvdW5kaW5nOiAnY2VpbCcgfSB8IGFzeW5jIH19IHt7ICdSVUInIHwgdHVpQ3VycmVuY3kgfX1cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNza2VsZXRvbj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZ2FwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNpemUtMjAgcm91bmRlZC14bCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBncm93IGZsZXgtY29sIGdhcC0yLjUgYmctd2hpdGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTQgdy1mdWxsIHJvdW5kZWQteGwgYmctdHVpLWJhc2UtMDJcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoLTQgdy0zLzUgcm91bmRlZC14bCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCB3LTQvNSByb3VuZGVkLXhsIGJnLXR1aS1iYXNlLTAyXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
         | 
| 119 | 
            +
            //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2FydC1pdGVtLW1vYmlsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9jYXJ0LWl0ZW0tbW9iaWxlL3NjLWNhcnQtaXRlbS1tb2JpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhcnQvY2FydC1pdGVtLW1vYmlsZS9zYy1jYXJ0LWl0ZW0tbW9iaWxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUV6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hKLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQWMsYUFBYSxFQUE0QixNQUFNLHdCQUF3QixDQUFDO0FBRTdGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RCxPQUFPLEVBQWMsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7OztBQUV4Qzs7R0FFRztBQU1ILE1BQU0sT0FBTyx5QkFBeUI7SUFDbEM7O09BRUc7SUFDSCxJQUNXLFFBQVEsQ0FBQyxJQUE0QjtRQUM1QyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1AsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25ELENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDZixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQStDRDs7Ozs7OztPQU9HO0lBQ0gsWUFDb0IsV0FBMEIsRUFFekIsb0JBQTZDO1FBRjlDLGdCQUFXLEdBQVgsV0FBVyxDQUFlO1FBRXpCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBeUI7UUFsRGxFOztXQUVHO1FBQ0ksb0JBQWUsR0FBK0IsSUFBSSxXQUFXLENBQWdCLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBRTdHOztXQUVHO1FBRUkseUJBQW9CLEdBQThCLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6Rzs7V0FFRztRQUVJLHFCQUFnQixHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXZFOztXQUVHO1FBRUksdUJBQWtCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFFekU7O1dBRUc7UUFFSSxtQkFBYyxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBRXJFOztXQUVHO1FBQ2MsZ0JBQVcsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7SUFtQmxELENBQUM7SUFFSjs7T0FFRztJQUNILElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUM7SUFDbEMsQ0FBQztJQUVELGtCQUFrQjtJQUNYLFFBQVE7UUFDWCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksaUJBQWlCO1FBQ3BCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLEVBQUUsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksWUFBWSxDQUFDLE9BQWtCO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUMsQ0FBQzs4R0F6R1EseUJBQXlCLCtDQTJFdEIsdUJBQXVCO2tHQTNFMUIseUJBQXlCLDJZQ2pCdEMscS9QQWlLQTs7MkZEaEphLHlCQUF5QjtrQkFMckMsU0FBUzsrQkFDSSxxQkFBcUIsbUJBRWQsdUJBQXVCLENBQUMsTUFBTTs7MEJBNkUxQyxNQUFNOzJCQUFDLHVCQUF1Qjt5Q0F0RXhCLFFBQVE7c0JBRGxCLEtBQUs7Z0JBb0JXLHVCQUF1QjtzQkFEdkMsU0FBUzt1QkFBQyxzQkFBc0I7Z0JBWTFCLG9CQUFvQjtzQkFEMUIsTUFBTTtnQkFPQSxnQkFBZ0I7c0JBRHRCLE1BQU07Z0JBT0Esa0JBQWtCO3NCQUR4QixNQUFNO2dCQU9BLGNBQWM7c0JBRHBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlcnNjb3JlLWRhbmdsZSAqL1xuXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgaW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2NDYXJ0SXRlbSwgU2NJbWFnZUhlbHBlciwgU2NQcm9kdWN0LCBTY1VuaXRzSGVscGVyIH0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyBUdWlEaWFsb2dDb250ZXh0IH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHsgVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UgfSBmcm9tICdAdGFpZ2EtdWkva2l0JztcbmltcG9ydCB7IE9ic2VydmFibGUsIHNraXAgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0LrQsNGA0YLQvtGH0LrQuCDRjdC70LXQvNC10L3RgtCwINC60L7RgNC30LjQvdGLLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3NjLWNhcnQtaXRlbS1tb2JpbGUnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9zYy1jYXJ0LWl0ZW0tbW9iaWxlLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NDYXJ0SXRlbU1vYmlsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgLyoqXG4gICAgICog0K3Qu9C10LzQtdC90YIg0LrQvtGA0LfQuNC90YsuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgc2V0IGNhcnRJdGVtKGRhdGE6IFNjQ2FydEl0ZW0gfCB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5fY2FydEl0ZW0gPSBkYXRhO1xuXG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnF1YW50aXR5Q29udHJvbC5wYXRjaFZhbHVlKGRhdGEucXVhbnRpdHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0K3Qu9C10LzQtdC90YIg0LrQvtGA0LfQuNC90YsuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjYXJ0SXRlbSgpOiBTY0NhcnRJdGVtIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhcnRJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0YHRi9C70LrQsCDQvdCwINC/0YDQtdC00YHRgtCw0LLQu9C10L3QuNC1INGB0L/QtdGG0LjRhNC40LrQsNGG0LjQuC5cbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdzcGVjaWZpY2F0aW9uUHJldmlldycpXG4gICAgcHJpdmF0ZSByZWFkb25seSBzcGVjaWZpY2F0aW9uUHJldmlld1JlZj86IFRlbXBsYXRlUmVmPFR1aURpYWxvZ0NvbnRleHQ+O1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIEZvcm1Db250cm9sfSDQv9C+0LvRjyDQstCy0L7QtNCwINC60L7Qu9C40YfQtdGB0YLQstCwINGC0L7QstCw0YDQsCDQsiDQutC+0YDQt9C40L3QtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcXVhbnRpdHlDb250cm9sOiBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPiA9IG5ldyBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPigwLCB7IHVwZGF0ZU9uOiAnYmx1cicgfSk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0LjQt9C80LXQvdC10L3QuNGPINC60L7Qu9C40YfQtdGB0YLQstCwINGC0L7QstCw0YDQsCDQsiDQutC+0YDQt9C40L3QtS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgcXVhbnRpdHlWYWx1ZUNoYW5nZXM6IE9ic2VydmFibGU8bnVtYmVyIHwgbnVsbD4gPSB0aGlzLnF1YW50aXR5Q29udHJvbC52YWx1ZUNoYW5nZXMucGlwZShza2lwKDEpKTtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC90LDQttCw0YLQuNGPINC90LAg0LrQvdC+0L/QutGDIFwi0KPQtNCw0LvQuNGC0Ywg0LjQtyDQutC+0YDQt9C40L3Ri1wiLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHB1YmxpYyBjbGlja0RlbGV0ZUV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINC60L3QvtC/0LrRgyBcItCj0LTQsNC70LjRgtGMINC40Lcg0LrQvtGA0LfQuNC90YtcIi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgY2xpY2tTZXR0aW5nc0V2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LHRi9GC0LjQtSDQvdCw0LbQsNGC0LjRjyDQvdCwINC60LDRgNGC0L7Rh9C60YMuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIGNsaWNrQ2FyZEV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQpdC10LvQv9C10YAg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQuNC30L7QsdGA0LDQttC10L3QuNGP0LzQuCDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbWFnZUhlbHBlciA9IGluamVjdChTY0ltYWdlSGVscGVyKTtcblxuICAgIC8qKlxuICAgICAqINCt0LvQtdC80LXQvdGCINC60L7RgNC30LjQvdGLLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2NhcnRJdGVtPzogU2NDYXJ0SXRlbTtcblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjQ2FydEl0ZW1Nb2JpbGVDb21wb25lbnR9LlxuICAgICAqXG4gICAgICogQHBhcmFtIHVuaXRzSGVscGVyINCt0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAt0L/QvtC80L7RidC90LjQutCwINC00LvRjyDRgNCw0LHQvtGC0Ysg0YHQviDQt9C90LDRh9C10L3QuNGP0LzQuCDQtdC00LjQvdC40YYg0LjQt9C80LXRgNC10L3QuNGPINGC0L7QstCw0YDQsC5cbiAgICAgKiBAcGFyYW0gcHJldmlld0RpYWxvZ1NlcnZpY2Ug0KHQtdGA0LLQuNGBINC00LjQsNC70L7Qs9C+0LLQvtCz0L4g0L7QutC90LAg0L/RgNC10LTQstCw0YDQuNGC0LXQu9GM0L3QvtCz0L4g0L/RgNC+0YHQvNC+0YLRgNCwLlxuICAgICAqIEBwYXJhbSB1cmxzINCh0L/QuNGB0L7QuiDRgdGB0YvQu9C+0Log0L3QsCDRgNCw0LfQtNC10LvRiyBiYWNrZW5kJ2EuXG4gICAgICogQHBhcmFtIHBhdGhJbWFnZU5vdEZvdW5kINCf0YPRgtGMINC00L4g0LjQt9C+0LHRgNCw0LbQtdC90LjRjyAn0KLQvtCy0LDRgCDQvdC1INC90LDQudC00LXQvScuXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgdW5pdHNIZWxwZXI6IFNjVW5pdHNIZWxwZXIsXG4gICAgICAgIEBJbmplY3QoVHVpUHJldmlld0RpYWxvZ1NlcnZpY2UpXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcHJldmlld0RpYWxvZ1NlcnZpY2U6IFR1aVByZXZpZXdEaWFsb2dTZXJ2aWNlXG4gICAgKSB7fVxuXG4gICAgLyoqXG4gICAgICog0J/RgNC+0LTRg9C60YIg0Y3Qu9C10LzQtdC90YLQsCDQutC+0YDQt9C40L3Riy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHByb2R1Y3QoKTogU2NQcm9kdWN0IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FydEl0ZW0/LnByb2R1Y3Q7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnF1YW50aXR5VmFsdWVDaGFuZ2VzID0gdGhpcy5xdWFudGl0eUNvbnRyb2wudmFsdWVDaGFuZ2VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0YLQvtCx0YDQsNC30LjRgtGMINGB0L/QtdGG0LjRhNC40LrQsNGG0LjRji5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1NwZWNpZmljYXRpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJldmlld0RpYWxvZ1NlcnZpY2Uub3Blbih0aGlzLnNwZWNpZmljYXRpb25QcmV2aWV3UmVmID8/ICcnKS5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQktC+0LfQstGA0LDRidCw0LXRgiDRgdGB0YvQu9C60YMg0L3QsCDQuNC30L7QsdGA0LDQttC10L3QuNC1INC60LDRgNGC0L7Rh9C60Lgg0YLQvtCy0LDRgNCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHByb2R1Y3Qg0J/QvtC30LjRhtC40Y8g0YLQvtCy0LDRgNCwL9GD0YHQu9GD0LPQuC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q2FyZEltYWdlKHByb2R1Y3Q6IFNjUHJvZHVjdCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmltYWdlSGVscGVyLmdldEltYWdlKHByb2R1Y3QpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJ0SXRlbSAmJiBwcm9kdWN0OyBlbHNlIHNrZWxldG9uXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggbWluLXctNzIgZ2FwLTIgcm91bmRlZC14bCBib3JkZXIgYm9yZGVyLXR1aS1iYXNlLTA0IGJnLXdoaXRlIHAtMiBzaGFkb3ctc2MtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LTQwIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGltZ1xuICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0NhcmRFdmVudC5lbWl0KClcIlxuICAgICAgICAgICAgICAgIFtzcmNdPVwiZ2V0Q2FyZEltYWdlKHByb2R1Y3QpXCJcbiAgICAgICAgICAgICAgICBbYWx0XT1cInByb2R1Y3QubmFtZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXgtaC1mdWxsIHctZnVsbCByb3VuZGVkLXhsIG9iamVjdC1jb3ZlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgc206ZmxleC1yb3cgc206Z2FwLTVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IG1heC13LWZ1bGwgZmxleC1jb2wgZ2FwLTEgc2VsZi1zdGFydFwiPlxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIHR1aUxpbmtcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrQ2FyZEV2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IHByb2R1Y3QubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC13cmFwIGdhcC14LTIgZ2FwLXktMSB0ZXh0LXhzIHRleHQtdHVpLWJhc2UtMDdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJwcm9kdWN0LnBhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgINCd0L7RgNC80LAg0YPQv9Cw0LrQvtCy0LrQuDoge3sgcHJvZHVjdC5wYWNrIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXN2Z1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicHJvZHVjdC5pZ25vcmVNaW5Db3VudENoZWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJ0dWlJY29uUGFja2FnZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R1aUhpbnRdPVwibWluQ291bnRIaW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpSGludFNob3dEZWxheV09XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUhpbnREaXJlY3Rpb249XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvdHVpLXN2Zz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbWluQ291bnRIaW50PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgINCU0L7RgdGC0YPQv9C10L0g0LfQsNC60LDQtyA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQv9GA0L7QuNC30LLQvtC70YzQvdC+0LPQviA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICDQutC+0LvQuNGH0LXRgdGC0LLQsFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cD7QkNGA0YLQuNC60YPQuzoge3sgcHJvZHVjdC5jb2RlIH19PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIgZ2FwLXgtMiBnYXAteS0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFwcm9kdWN0LnByaWNlSW5SdWJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGRcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBwcm9kdWN0LmNvc3RTdHJpbmcgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtdHVpLWJhc2UtMDdcIj57eyBwcm9kdWN0LmNvc3RSdWJTdHJpbmcgfX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInByb2R1Y3QuZGlzY291bnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGluZS10aHJvdWdoXCI+e3sgcHJvZHVjdC5kaXNjb3VudENvc3RTdHJpbmcgfX08L3NwYW4+ICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgdGV4dC10dWktc3VjY2Vzcy1maWxsXCI+IC17eyBwcm9kdWN0LmRpc2NvdW50LnBlcmNlbnQgfX0lIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktaWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJAdHVpLmluZm9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlIaW50XT1cImRpc2NvdW50SGludFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3R1aUhpbnRTaG93RGVsYXldPVwiMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlIaW50RGlyZWN0aW9uPVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIiFoLTQgIXRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvdHVpLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Rpc2NvdW50SGludD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgcHJvZHVjdC5kaXNjb3VudC5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb2R1Y3QuZGlzY291bnQuZXhwaXJlZEF0IGFzIGV4cGlyZWRBdFwiPtCU0LDRgtCwINC+0LrQvtC90YfQsNC90LjRjzoge3sgZXhwaXJlZEF0IH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8c2MtcHJpY2Utd2FyZWhvdXNlLXN0b2NrIFtwcm9kdWN0XT1cInByb2R1Y3RcIj48L3NjLXByaWNlLXdhcmVob3VzZS1zdG9jaz5cblxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXJ0SXRlbS5oZWlnaHQgfHwgY2FydEl0ZW0ubGVuZ3RoIHx8IGNhcnRJdGVtLndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnNldHRpbmdzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja1NldHRpbmdzRXZlbnQuZW1pdCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtci0yICFzZWxmLWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC14LTIgdGV4dC14cyBmb250LXRoaW4gdGV4dC10dWktYmFzZS0wNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjYXJ0SXRlbS5tYXJrZXJcIj7QnNCw0YDQutC40YDQvtCy0LrQsDoge3sgY2FydEl0ZW0ubWFya2VyIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgKm5nSWY9XCJjYXJ0SXRlbS53aWR0aFwiPtCo0LjRgNC40L3QsDoge3sgY2FydEl0ZW0ud2lkdGggfX0g0LwuPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcnRJdGVtLmhlaWdodDsgZWxzZSBsZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD7QktGL0YHQvtGC0LA6IHt7IGNhcnRJdGVtLmhlaWdodCB9fSDQvC48L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGVuZ3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwICpuZ0lmPVwiY2FydEl0ZW0ubGVuZ3RoXCI+0JTQu9C40L3QsDoge3sgY2FydEl0ZW0ubGVuZ3RoIH19INC8LjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGFcbiAgICAgICAgICAgICAgICAgICAgdHVpTGlua1xuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNhcnRJdGVtLnNwZWNpZmljYXRpb25JbWdVcmxcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1NwZWNpZmljYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgID7QodC/0LXRhtC40YTQuNC60LDRhtC40Y88L2FcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgICAgICAgICNzcGVjaWZpY2F0aW9uUHJldmlld1xuICAgICAgICAgICAgICAgICAgICBsZXQtcHJldmlld1xuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHR1aS1wcmV2aWV3XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm90YXRhYmxlXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt6b29tYWJsZV09XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcG9seW1vcnBoZXVzT3V0bGV0PVwiY2FydEl0ZW0uc3BlY2lmaWNhdGlvbkltZ1VybCBhcyBzcmNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInByZXZpZXdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzcmNdPVwiY2FydEl0ZW0uc3BlY2lmaWNhdGlvbkltZ1VybFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkueFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDbG9zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSWNvbkJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aVByZXZpZXdBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicHJldmlldy5jb21wbGV0ZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC90dWktcHJldmlldz5cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBzZWxmLXN0YXJ0IHNtOm1yLTkgc206c2VsZi1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICA8c2MtaW5wdXQtcXVhbnRpdHlcbiAgICAgICAgICAgICAgICAgICAgICAgICNpbnB1dFF1YW50aXR5XG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInF1YW50aXR5Q29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicXVhbnRpdHlDb250cm9sXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93Q3Jvc3NdPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0ZXBdPVwidW5pdHNIZWxwZXIucHJvZHVjdE11bHRpcGxpY2l0eShwcm9kdWN0KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaWdub3JlU3RlcFZhbGlkYXRvcnNdPVwicHJvZHVjdC5pZ25vcmVNaW5Db3VudENoZWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cImlucHV0UXVhbnRpdHkubmF0aXZlRm9jdXNhYmxlRWxlbWVudD8uYmx1cigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0yOFwiXG4gICAgICAgICAgICAgICAgICAgID48L3NjLWlucHV0LXF1YW50aXR5PlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnRyYXNoLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1yYWRpdXMuJV09XCIxMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cInhzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjbGlja0RlbGV0ZUV2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInRleHQtc20gZm9udC1ib2xkIHRleHQtdHVpLXRleHQtMDFcIj5cbiAgICAgICAgICAgICAgICAgICAg0JjRgtC+0LPQvjoge3sgY2FydEl0ZW0uY29zdFJ1YiB8IHR1aUZvcm1hdE51bWJlcjogeyBwcmVjaXNpb246IDIsIGRlY2ltYWxTZXBhcmF0b3I6ICcuJywgcm91bmRpbmc6ICdjZWlsJyB9IHwgYXN5bmMgfX0ge3sgJ1JVQicgfCB0dWlDdXJyZW5jeSB9fVxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuXG48bmctdGVtcGxhdGUgI3NrZWxldG9uPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IHctZnVsbCBnYXAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2l6ZS0yMCByb3VuZGVkLXhsIGJnLXR1aS1iYXNlLTAyXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdyb3cgZmxleC1jb2wgZ2FwLTIuNSBiZy13aGl0ZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCB3LWZ1bGwgcm91bmRlZC14bCBiZy10dWktYmFzZS0wMlwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImgtNCB3LTMvNSByb3VuZGVkLXhsIGJnLXR1aS1iYXNlLTAyXCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC00IHctNC81IHJvdW5kZWQteGwgYmctdHVpLWJhc2UtMDJcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            import { ChangeDetectionStrategy, Component, HostListener, Input, signal } from '@angular/core';
         | 
| 2 | 
            +
            import { TuiPagination } from '@taiga-ui/kit';
         | 
| 3 | 
            +
            import * as i0 from "@angular/core";
         | 
| 4 | 
            +
            /**
         | 
| 5 | 
            +
             * Компонент просмотра изображений через событие наведения.
         | 
| 6 | 
            +
             */
         | 
| 7 | 
            +
            export class HoverImageCarouselComponent {
         | 
| 8 | 
            +
                constructor() {
         | 
| 9 | 
            +
                    /**
         | 
| 10 | 
            +
                     * Массив изображений.
         | 
| 11 | 
            +
                     */
         | 
| 12 | 
            +
                    this.images = [];
         | 
| 13 | 
            +
                    /**
         | 
| 14 | 
            +
                     * {@link WritableSignal} для отслеживания текущего индекса изображения.
         | 
| 15 | 
            +
                     */
         | 
| 16 | 
            +
                    this.currentIndex = signal(0);
         | 
| 17 | 
            +
                }
         | 
| 18 | 
            +
                /**
         | 
| 19 | 
            +
                 * Обработчик события mousemove.
         | 
| 20 | 
            +
                 *
         | 
| 21 | 
            +
                 * @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
         | 
| 22 | 
            +
                 * @param target Объект {@link HTMLElement} в котором лежат изображения
         | 
| 23 | 
            +
                 */
         | 
| 24 | 
            +
                onHover(offsetX, target) {
         | 
| 25 | 
            +
                    if (this.images.length <= 1 || offsetX < 0) {
         | 
| 26 | 
            +
                        return;
         | 
| 27 | 
            +
                    }
         | 
| 28 | 
            +
                    const elementWidth = target.offsetWidth;
         | 
| 29 | 
            +
                    const hoverPercentage = offsetX / elementWidth;
         | 
| 30 | 
            +
                    const newIndex = Math.floor(hoverPercentage * this.images.length);
         | 
| 31 | 
            +
                    this.currentIndex.set(newIndex);
         | 
| 32 | 
            +
                }
         | 
| 33 | 
            +
                static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: HoverImageCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
         | 
| 34 | 
            +
                static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: HoverImageCarouselComponent, isStandalone: true, selector: "sc-hover-image-carousel", inputs: { images: "images" }, host: { listeners: { "mousemove.silent": "onHover($event.offsetX,$event.target)" } }, ngImport: i0, template: "<div\n    class=\"overflow-hidden rounded-xl\"\n    [class.mb-2]=\"images.length <= 1\"\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) {\n    <tui-pagination\n        size=\"s\"\n        [length]=\"images.length\"\n        [index]=\"currentIndex()\"\n    />\n}\n", dependencies: [{ kind: "component", type: TuiPagination, selector: "tui-pagination", inputs: ["length", "focusable", "size", "disabled", "activePadding", "sidePadding", "content", "index"], outputs: ["indexChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
         | 
| 35 | 
            +
            }
         | 
| 36 | 
            +
            i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: HoverImageCarouselComponent, decorators: [{
         | 
| 37 | 
            +
                        type: Component,
         | 
| 38 | 
            +
                        args: [{ selector: 'sc-hover-image-carousel', standalone: true, imports: [TuiPagination], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n    class=\"overflow-hidden rounded-xl\"\n    [class.mb-2]=\"images.length <= 1\"\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) {\n    <tui-pagination\n        size=\"s\"\n        [length]=\"images.length\"\n        [index]=\"currentIndex()\"\n    />\n}\n" }]
         | 
| 39 | 
            +
                    }], propDecorators: { images: [{
         | 
| 40 | 
            +
                            type: Input
         | 
| 41 | 
            +
                        }], onHover: [{
         | 
| 42 | 
            +
                            type: HostListener,
         | 
| 43 | 
            +
                            args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
         | 
| 44 | 
            +
                        }] } });
         | 
| 45 | 
            +
            //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvaG92ZXItaW1hZ2UtY2Fyb3VzZWwvaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvaG92ZXItaW1hZ2UtY2Fyb3VzZWwvaG92ZXItaW1hZ2UtY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBa0IsTUFBTSxlQUFlLENBQUM7QUFDaEgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFOUM7O0dBRUc7QUFRSCxNQUFNLE9BQU8sMkJBQTJCO0lBUHhDO1FBUUk7O1dBRUc7UUFFSSxXQUFNLEdBQWEsRUFBRSxDQUFDO1FBRTdCOztXQUVHO1FBQ0ksaUJBQVksR0FBMkIsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBbUIzRDtJQWpCRzs7Ozs7T0FLRztJQUVLLE9BQU8sQ0FBQyxPQUFlLEVBQUUsTUFBbUI7UUFDaEQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3pDLE9BQU87UUFDWCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUN4QyxNQUFNLGVBQWUsR0FBRyxPQUFPLEdBQUcsWUFBWSxDQUFDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQzs4R0E1QlEsMkJBQTJCO2tHQUEzQiwyQkFBMkIsdU1DYnhDLHdaQWtCQSw0Q0RUYyxhQUFhOzsyRkFJZCwyQkFBMkI7a0JBUHZDLFNBQVM7K0JBQ0kseUJBQXlCLGNBQ3ZCLElBQUksV0FDUCxDQUFDLGFBQWEsQ0FBQyxtQkFFUCx1QkFBdUIsQ0FBQyxNQUFNOzhCQU94QyxNQUFNO3NCQURaLEtBQUs7Z0JBZUUsT0FBTztzQkFEZCxZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSG9zdExpc3RlbmVyLCBJbnB1dCwgc2lnbmFsLCBXcml0YWJsZVNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHVpUGFnaW5hdGlvbiB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQv9GA0L7RgdC80L7RgtGA0LAg0LjQt9C+0LHRgNCw0LbQtdC90LjQuSDRh9C10YDQtdC3INGB0L7QsdGL0YLQuNC1INC90LDQstC10LTQtdC90LjRjy5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdzYy1ob3Zlci1pbWFnZS1jYXJvdXNlbCcsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbVHVpUGFnaW5hdGlvbl0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hvdmVyLWltYWdlLWNhcm91c2VsLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgSG92ZXJJbWFnZUNhcm91c2VsQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQnNCw0YHRgdC40LIg0LjQt9C+0LHRgNCw0LbQtdC90LjQuS5cbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBpbWFnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgV3JpdGFibGVTaWduYWx9INC00LvRjyDQvtGC0YHQu9C10LbQuNCy0LDQvdC40Y8g0YLQtdC60YPRidC10LPQviDQuNC90LTQtdC60YHQsCDQuNC30L7QsdGA0LDQttC10L3QuNGPLlxuICAgICAqL1xuICAgIHB1YmxpYyBjdXJyZW50SW5kZXg6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMCk7XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDRgdC+0LHRi9GC0LjRjyBtb3VzZW1vdmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2Zmc2V0WCDQntGC0YHRgtGD0L8g0LrRg9GA0YHQvtGA0LAg0LzRi9GI0Lgg0L/QviDQvtGB0LggWCDQvtGCINC60YDQsNGPIHtAbGluayBIVE1MRWxlbWVudH0uXG4gICAgICogQHBhcmFtIHRhcmdldCDQntCx0YrQtdC60YIge0BsaW5rIEhUTUxFbGVtZW50fSDQsiDQutC+0YLQvtGA0L7QvCDQu9C10LbQsNGCINC40LfQvtCx0YDQsNC20LXQvdC40Y9cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdtb3VzZW1vdmUuc2lsZW50JywgWyckZXZlbnQub2Zmc2V0WCcsICckZXZlbnQudGFyZ2V0J10pXG4gICAgcHJpdmF0ZSBvbkhvdmVyKG9mZnNldFg6IG51bWJlciwgdGFyZ2V0OiBIVE1MRWxlbWVudCkge1xuICAgICAgICBpZiAodGhpcy5pbWFnZXMubGVuZ3RoIDw9IDEgfHwgb2Zmc2V0WCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVsZW1lbnRXaWR0aCA9IHRhcmdldC5vZmZzZXRXaWR0aDtcbiAgICAgICAgY29uc3QgaG92ZXJQZXJjZW50YWdlID0gb2Zmc2V0WCAvIGVsZW1lbnRXaWR0aDtcbiAgICAgICAgY29uc3QgbmV3SW5kZXggPSBNYXRoLmZsb29yKGhvdmVyUGVyY2VudGFnZSAqIHRoaXMuaW1hZ2VzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMuY3VycmVudEluZGV4LnNldChuZXdJbmRleCk7XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwib3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQteGxcIlxuICAgIFtjbGFzcy5tYi0yXT1cImltYWdlcy5sZW5ndGggPD0gMVwiXG4gICAgW3N0eWxlLmFzcGVjdC1yYXRpb109XCInMjAvMTknXCJcbj5cbiAgICA8aW1nXG4gICAgICAgIFtzcmNdPVwiaW1hZ2VzW2N1cnJlbnRJbmRleCgpXVwiXG4gICAgICAgIGNsYXNzPVwic2l6ZS1mdWxsIHJvdW5kZWQteGwgb2JqZWN0LWNvbnRhaW5cIlxuICAgIC8+XG48L2Rpdj5cblxuQGlmIChpbWFnZXMubGVuZ3RoID4gMSkge1xuICAgIDx0dWktcGFnaW5hdGlvblxuICAgICAgICBzaXplPVwic1wiXG4gICAgICAgIFtsZW5ndGhdPVwiaW1hZ2VzLmxlbmd0aFwiXG4gICAgICAgIFtpbmRleF09XCJjdXJyZW50SW5kZXgoKVwiXG4gICAgLz5cbn1cbiJdfQ==
         |