@rdlabo/ionic-angular-photo-editor 0.0.1 → 0.0.3

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.
@@ -0,0 +1,27 @@
1
+ export const dictionaryForEditor = () => ({
2
+ // UI labels
3
+ save: '保存',
4
+ crop: '切り抜き・回転',
5
+ filter: 'フィルター',
6
+ brightness: '明るさ',
7
+ // Filter labels
8
+ original: 'オリジナル',
9
+ invert: '反転',
10
+ sepia: 'セピア',
11
+ vintage: 'ヴィンテージ',
12
+ blur: 'ぼかし',
13
+ grayscale: 'グレースケール',
14
+ sharpen: '輪郭',
15
+ emboss: 'エンボス',
16
+ });
17
+ export const dictionaryForViewer = () => ({
18
+ // UI labels
19
+ delete: '削除',
20
+ });
21
+ export const dictionaryForService = () => ({
22
+ // UI labels
23
+ camera: 'カメラ撮影',
24
+ album: 'アルバムから選択',
25
+ cancel: 'キャンセル',
26
+ });
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGljdGlvbmFyaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcGhvdG8tZWRpdG9yL3NyYy9saWIvZGljdGlvbmFyaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQXlCLEVBQUUsQ0FBQyxDQUFDO0lBQzlELFlBQVk7SUFDWixJQUFJLEVBQUUsSUFBSTtJQUNWLElBQUksRUFBRSxTQUFTO0lBQ2YsTUFBTSxFQUFFLE9BQU87SUFDZixVQUFVLEVBQUUsS0FBSztJQUVqQixnQkFBZ0I7SUFDaEIsUUFBUSxFQUFFLE9BQU87SUFDakIsTUFBTSxFQUFFLElBQUk7SUFDWixLQUFLLEVBQUUsS0FBSztJQUNaLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLElBQUksRUFBRSxLQUFLO0lBQ1gsU0FBUyxFQUFFLFNBQVM7SUFDcEIsT0FBTyxFQUFFLElBQUk7SUFDYixNQUFNLEVBQUUsTUFBTTtDQUNmLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEdBQXlCLEVBQUUsQ0FBQyxDQUFDO0lBQzlELFlBQVk7SUFDWixNQUFNLEVBQUUsSUFBSTtDQUNiLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEdBQTBCLEVBQUUsQ0FBQyxDQUFDO0lBQ2hFLFlBQVk7SUFDWixNQUFNLEVBQUUsT0FBTztJQUNmLEtBQUssRUFBRSxVQUFVO0lBQ2pCLE1BQU0sRUFBRSxPQUFPO0NBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEaWN0aW9uYXJ5Rm9yRWRpdG9yLCBJRGljdGlvbmFyeUZvclNlcnZpY2UsIElEaWN0aW9uYXJ5Rm9yVmlld2VyIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBkaWN0aW9uYXJ5Rm9yRWRpdG9yID0gKCk6IElEaWN0aW9uYXJ5Rm9yRWRpdG9yID0+ICh7XG4gIC8vIFVJIGxhYmVsc1xuICBzYXZlOiAn5L+d5a2YJyxcbiAgY3JvcDogJ+WIh+OCiuaKnOOBjeODu+Wbnui7oicsXG4gIGZpbHRlcjogJ+ODleOCo+ODq+OCv+ODvCcsXG4gIGJyaWdodG5lc3M6ICfmmI7jgovjgZUnLFxuXG4gIC8vIEZpbHRlciBsYWJlbHNcbiAgb3JpZ2luYWw6ICfjgqrjg6rjgrjjg4rjg6snLFxuICBpbnZlcnQ6ICflj43ou6InLFxuICBzZXBpYTogJ+OCu+ODlOOCoicsXG4gIHZpbnRhZ2U6ICfjg7TjgqPjg7Pjg4bjg7zjgrgnLFxuICBibHVyOiAn44G844GL44GXJyxcbiAgZ3JheXNjYWxlOiAn44Kw44Os44O844K544Kx44O844OrJyxcbiAgc2hhcnBlbjogJ+i8qumDrScsXG4gIGVtYm9zczogJ+OCqOODs+ODnOOCuScsXG59KTtcblxuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnlGb3JWaWV3ZXIgPSAoKTogSURpY3Rpb25hcnlGb3JWaWV3ZXIgPT4gKHtcbiAgLy8gVUkgbGFiZWxzXG4gIGRlbGV0ZTogJ+WJiumZpCcsXG59KTtcblxuZXhwb3J0IGNvbnN0IGRpY3Rpb25hcnlGb3JTZXJ2aWNlID0gKCk6IElEaWN0aW9uYXJ5Rm9yU2VydmljZSA9PiAoe1xuICAvLyBVSSBsYWJlbHNcbiAgY2FtZXJhOiAn44Kr44Oh44Op5pKu5b2xJyxcbiAgYWxidW06ICfjgqLjg6vjg5Djg6DjgYvjgonpgbjmip4nLFxuICBjYW5jZWw6ICfjgq3jg6Pjg7Pjgrvjg6snLFxufSk7XG4iXX0=
@@ -40,4 +40,4 @@ export const filterPreset = (dictionary) => [
40
40
  // option: null,
41
41
  // },
42
42
  ];
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXByZXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3Bob3RvLWVkaXRvci9zcmMvbGliL2ZpbHRlci1wcmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsVUFBdUIsRUFBbUIsRUFBRSxDQUFDO0lBQ3hFO1FBQ0UsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1FBQ3pCLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLElBQUk7S0FDYjtJQUNELElBQUk7SUFDSiw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixLQUFLO0lBQ0w7UUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdEIsSUFBSSxFQUFFLE9BQU87UUFDYixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU87UUFDeEIsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsS0FBSztRQUNYLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtLQUN0QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQzFCLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxJQUFJO0tBQ2I7SUFDRCxJQUFJO0lBQ0osOEJBQThCO0lBQzlCLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsS0FBSztJQUNMLElBQUk7SUFDSiw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixLQUFLO0NBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEaWN0aW9uYXJ5LCBJRmlsdGVyUHJlc2V0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJQcmVzZXQgPSAoZGljdGlvbmFyeTogSURpY3Rpb25hcnkpOiBJRmlsdGVyUHJlc2V0W10gPT4gW1xuICB7XG4gICAgbmFtZTogZGljdGlvbmFyeS5vcmlnaW5hbCxcbiAgICB0eXBlOiAnRGVmYXVsdCcsXG4gICAgb3B0aW9uOiBudWxsLFxuICB9LFxuICAvLyB7XG4gIC8vICAgbmFtZTogZGljdGlvbmFyeS5pbnZlcnQsXG4gIC8vICAgdHlwZTogJ0ludmVydCcsXG4gIC8vICAgb3B0aW9uOiBudWxsLFxuICAvLyB9LFxuICB7XG4gICAgbmFtZTogZGljdGlvbmFyeS5zZXBpYSxcbiAgICB0eXBlOiAnU2VwaWEnLFxuICAgIG9wdGlvbjogbnVsbCxcbiAgfSxcbiAge1xuICAgIG5hbWU6IGRpY3Rpb25hcnkudmludGFnZSxcbiAgICB0eXBlOiAndmludGFnZScsXG4gICAgb3B0aW9uOiBudWxsLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ+OBvOOBi+OBlycsXG4gICAgdHlwZTogJ0JsdXInLFxuICAgIG9wdGlvbjogeyBibHVyOiAwLjEgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IGRpY3Rpb25hcnkuZ3JheXNjYWxlLFxuICAgIHR5cGU6ICdHcmF5c2NhbGUnLFxuICAgIG9wdGlvbjogbnVsbCxcbiAgfSxcbiAgLy8ge1xuICAvLyAgIG5hbWU6IGRpY3Rpb25hcnkuc2hhcnBlbixcbiAgLy8gICB0eXBlOiAnU2hhcnBlbicsXG4gIC8vICAgb3B0aW9uOiBudWxsLFxuICAvLyB9LFxuICAvLyB7XG4gIC8vICAgbmFtZTogZGljdGlvbmFyeS5lbWJvc3MsXG4gIC8vICAgdHlwZTogJ0VtYm9zcycsXG4gIC8vICAgb3B0aW9uOiBudWxsLFxuICAvLyB9LFxuXTtcbiJdfQ==
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLXByZXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3Bob3RvLWVkaXRvci9zcmMvbGliL2ZpbHRlci1wcmVzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsVUFBZ0MsRUFBbUIsRUFBRSxDQUFDO0lBQ2pGO1FBQ0UsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1FBQ3pCLElBQUksRUFBRSxTQUFTO1FBQ2YsTUFBTSxFQUFFLElBQUk7S0FDYjtJQUNELElBQUk7SUFDSiw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixLQUFLO0lBQ0w7UUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLEtBQUs7UUFDdEIsSUFBSSxFQUFFLE9BQU87UUFDYixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU87UUFDeEIsSUFBSSxFQUFFLFNBQVM7UUFDZixNQUFNLEVBQUUsSUFBSTtLQUNiO0lBQ0Q7UUFDRSxJQUFJLEVBQUUsS0FBSztRQUNYLElBQUksRUFBRSxNQUFNO1FBQ1osTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRTtLQUN0QjtJQUNEO1FBQ0UsSUFBSSxFQUFFLFVBQVUsQ0FBQyxTQUFTO1FBQzFCLElBQUksRUFBRSxXQUFXO1FBQ2pCLE1BQU0sRUFBRSxJQUFJO0tBQ2I7SUFDRCxJQUFJO0lBQ0osOEJBQThCO0lBQzlCLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsS0FBSztJQUNMLElBQUk7SUFDSiw2QkFBNkI7SUFDN0Isb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQixLQUFLO0NBQ04sQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElEaWN0aW9uYXJ5Rm9yRWRpdG9yLCBJRmlsdGVyUHJlc2V0IH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBmaWx0ZXJQcmVzZXQgPSAoZGljdGlvbmFyeTogSURpY3Rpb25hcnlGb3JFZGl0b3IpOiBJRmlsdGVyUHJlc2V0W10gPT4gW1xuICB7XG4gICAgbmFtZTogZGljdGlvbmFyeS5vcmlnaW5hbCxcbiAgICB0eXBlOiAnRGVmYXVsdCcsXG4gICAgb3B0aW9uOiBudWxsLFxuICB9LFxuICAvLyB7XG4gIC8vICAgbmFtZTogZGljdGlvbmFyeS5pbnZlcnQsXG4gIC8vICAgdHlwZTogJ0ludmVydCcsXG4gIC8vICAgb3B0aW9uOiBudWxsLFxuICAvLyB9LFxuICB7XG4gICAgbmFtZTogZGljdGlvbmFyeS5zZXBpYSxcbiAgICB0eXBlOiAnU2VwaWEnLFxuICAgIG9wdGlvbjogbnVsbCxcbiAgfSxcbiAge1xuICAgIG5hbWU6IGRpY3Rpb25hcnkudmludGFnZSxcbiAgICB0eXBlOiAndmludGFnZScsXG4gICAgb3B0aW9uOiBudWxsLFxuICB9LFxuICB7XG4gICAgbmFtZTogJ+OBvOOBi+OBlycsXG4gICAgdHlwZTogJ0JsdXInLFxuICAgIG9wdGlvbjogeyBibHVyOiAwLjEgfSxcbiAgfSxcbiAge1xuICAgIG5hbWU6IGRpY3Rpb25hcnkuZ3JheXNjYWxlLFxuICAgIHR5cGU6ICdHcmF5c2NhbGUnLFxuICAgIG9wdGlvbjogbnVsbCxcbiAgfSxcbiAgLy8ge1xuICAvLyAgIG5hbWU6IGRpY3Rpb25hcnkuc2hhcnBlbixcbiAgLy8gICB0eXBlOiAnU2hhcnBlbicsXG4gIC8vICAgb3B0aW9uOiBudWxsLFxuICAvLyB9LFxuICAvLyB7XG4gIC8vICAgbmFtZTogZGljdGlvbmFyeS5lbWJvc3MsXG4gIC8vICAgdHlwZTogJ0VtYm9zcycsXG4gIC8vICAgb3B0aW9uOiBudWxsLFxuICAvLyB9LFxuXTtcbiJdfQ==
@@ -0,0 +1,187 @@
1
+ import { Component, inject, Input, signal, ViewChild } from '@angular/core';
2
+ import { CommonModule, NgOptimizedImage } from '@angular/common';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { IonContent, ModalController } from '@ionic/angular/standalone';
5
+ import ImageEditor from 'tui-image-editor';
6
+ import { filterPreset } from '../filter-preset';
7
+ import { toObservable } from '@angular/core/rxjs-interop';
8
+ import { HelperService } from '../service/helper.service';
9
+ import { ionComponents } from '../ion-components';
10
+ import { dictionaryForEditor } from '../dictionaries';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@ionic/angular/standalone";
13
+ export class PhotoEditorPage {
14
+ set labels(d) {
15
+ this.dictionary = Object.assign(this.dictionary, d);
16
+ this.filterPreset = filterPreset(this.dictionary);
17
+ }
18
+ constructor() {
19
+ this.dictionary = dictionaryForEditor();
20
+ this.filterPreset = filterPreset(this.dictionary);
21
+ this.requireSquare = false;
22
+ this.$filters = signal([]);
23
+ this.$footerMenu = signal('menu');
24
+ this.$currentCrop = signal('cover');
25
+ this.$currentRotate = signal(0);
26
+ this.$photoCrop = signal({
27
+ width: 0,
28
+ height: 0,
29
+ });
30
+ this.$isCropped = signal(false);
31
+ this.footerMenu$ = toObservable(this.$footerMenu);
32
+ this.$adoptFilter = signal(undefined);
33
+ this.initSubscription$ = [];
34
+ this.filterImageSize = 240;
35
+ this.service = inject(HelperService);
36
+ this.modalCtrl = inject(ModalController);
37
+ this.canvasContainerObserver = new MutationObserver((mutationsList) => {
38
+ if (mutationsList.find((mutation) => mutation.type === 'attributes' && mutation.attributeName === 'style')) {
39
+ // Cover the image editor with the parent element
40
+ this.editorRef.nativeElement.style.minWidth = mutationsList[0].target.parentElement.style.maxWidth;
41
+ this.editorRef.nativeElement.style.minHeight = mutationsList[0].target.parentElement.style.maxHeight;
42
+ this.$photoCrop.set({
43
+ width: mutationsList[0].target.parentElement.querySelector('canvas').width,
44
+ height: mutationsList[0].target.parentElement.querySelector('canvas').height,
45
+ });
46
+ }
47
+ });
48
+ this.service.initializeEditorIcons();
49
+ }
50
+ ngOnInit() {
51
+ this.initSubscription$.push(this.footerMenu$.subscribe((value) => {
52
+ if (value === 'filter') {
53
+ this.initializeFilterMenu().then();
54
+ }
55
+ if (value === 'crop') {
56
+ this.editorInstance.startDrawingMode('CROPPER');
57
+ this.changeCrop(this.requireSquare ? '1' : 'cover');
58
+ }
59
+ }));
60
+ }
61
+ ngOnDestroy() {
62
+ this.initSubscription$.forEach((subscription) => subscription.unsubscribe());
63
+ }
64
+ async ionViewDidEnter() {
65
+ this.editorInstance = new ImageEditor(this.editorRef.nativeElement, {
66
+ cssMaxWidth: this.ionContent.el.clientWidth - 32,
67
+ cssMaxHeight: this.ionContent.el.clientHeight - 32,
68
+ });
69
+ this.service.waitToFindDom(this.editorRef.nativeElement, '.tui-image-editor-canvas-container').then(() => {
70
+ this.canvasContainerObserver.observe(this.editorRef.nativeElement.querySelector('.tui-image-editor-canvas-container'), {
71
+ attributes: true,
72
+ childList: false,
73
+ subtree: true,
74
+ });
75
+ });
76
+ const blob = await fetch(this.value).then((res) => res.blob());
77
+ await this.editorInstance.loadImageFromFile(new File([blob], 'data.png', { type: blob.type }));
78
+ this.$footerMenu.set(this.requireSquare ? 'crop' : 'menu');
79
+ }
80
+ ionViewDidLeave() {
81
+ this.editorInstance.destroy();
82
+ this.canvasContainerObserver.disconnect();
83
+ }
84
+ changeCrop(crop) {
85
+ const rect = crop === 'cover' ? this.$photoCrop().width / this.$photoCrop().height : crop === '16/9' ? 16 / 9 : 1;
86
+ this.editorInstance.setCropzoneRect(crop !== 'auto' ? rect : undefined);
87
+ this.$currentCrop.set(crop);
88
+ }
89
+ async rotate() {
90
+ this.editorInstance.stopDrawingMode();
91
+ await this.editorInstance.rotate(90);
92
+ this.$currentRotate.update((value) => value + 90);
93
+ this.editorInstance.startDrawingMode('CROPPER');
94
+ requestAnimationFrame(() => this.changeCrop(this.$currentCrop()));
95
+ }
96
+ async closeCrop(type) {
97
+ if (this.$footerMenu() === 'crop') {
98
+ if (type === 'cancel') {
99
+ await this.editorInstance.rotate(this.$currentRotate() * -1);
100
+ }
101
+ else {
102
+ await this.editorInstance.crop(this.editorInstance.getCropzoneRect());
103
+ this.$isCropped.set(true);
104
+ }
105
+ this.$currentRotate.set(0);
106
+ this.$currentCrop.set('cover');
107
+ this.editorInstance.stopDrawingMode();
108
+ }
109
+ else if (this.$footerMenu() === 'brightness') {
110
+ if (type === 'cancel' && this.editorInstance.hasFilter('brightness')) {
111
+ await this.editorInstance.removeFilter('brightness');
112
+ }
113
+ }
114
+ this.$footerMenu.set('menu');
115
+ }
116
+ async changeRange(event) {
117
+ if (this.editorInstance.hasFilter('brightness')) {
118
+ await this.editorInstance.removeFilter('brightness');
119
+ }
120
+ this.editorInstance.applyFilter('brightness', {
121
+ brightness: Number(event.detail.value) / 255,
122
+ });
123
+ }
124
+ imageSave() {
125
+ const value = this.editorInstance.toDataURL();
126
+ this.modalCtrl.dismiss({ value });
127
+ }
128
+ async initializeFilterMenu() {
129
+ const filters = [];
130
+ const defaultInstance = new ImageEditor(document.createElement('div'), {
131
+ cssMaxWidth: this.filterImageSize,
132
+ cssMaxHeight: (this.$photoCrop().height * this.filterImageSize) / this.$photoCrop().width,
133
+ });
134
+ const blob = await fetch(this.editorInstance.toDataURL({
135
+ multiplier: this.filterImageSize / this.$photoCrop().width,
136
+ })).then((res) => res.blob());
137
+ await defaultInstance.loadImageFromFile(new File([blob], 'defaultInstance.png', { type: blob.type }));
138
+ for (const filter of this.filterPreset) {
139
+ if (filter.type !== 'Default') {
140
+ await defaultInstance.applyFilter(filter.type, filter.option);
141
+ }
142
+ filters.push({
143
+ name: filter.name,
144
+ type: filter.type,
145
+ option: filter.option,
146
+ data: defaultInstance.toDataURL(),
147
+ width: this.filterImageSize,
148
+ height: (this.$photoCrop().height * this.filterImageSize) / this.$photoCrop().width,
149
+ });
150
+ if (filter.type !== 'Default') {
151
+ await defaultInstance.removeFilter(filter.type);
152
+ }
153
+ }
154
+ this.$filters.set(filters);
155
+ defaultInstance.destroy();
156
+ }
157
+ async filterImage(filter) {
158
+ if (this.$adoptFilter()) {
159
+ await this.editorInstance.removeFilter(this.$adoptFilter().type);
160
+ }
161
+ if (filter.type === 'Default') {
162
+ this.$adoptFilter.set(undefined);
163
+ return;
164
+ }
165
+ await this.editorInstance.applyFilter(filter.type, filter.option);
166
+ this.$adoptFilter.set(filter);
167
+ }
168
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PhotoEditorPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
169
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.7", type: PhotoEditorPage, isStandalone: true, selector: "app-editor-image", inputs: { requireSquare: "requireSquare", value: "value", labels: "labels" }, providers: [HelperService], viewQueries: [{ propertyName: "editorRef", first: true, predicate: ["imageEditor"], descendants: true, static: true }, { propertyName: "ionContent", first: true, predicate: IonContent, descendants: true }], ngImport: i0, template: "<ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"start\"\n ><ion-button (click)=\"modalCtrl.dismiss()\"><ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon></ion-button\n ></ion-buttons>\n <ion-buttons slot=\"end\">\n <ion-button color=\"primary\" fill=\"outline\" [disabled]=\"!['menu', 'filter'].includes($footerMenu())\" (click)=\"imageSave()\">\n {{ dictionary.save }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\" [scrollY]=\"false\">\n <div #imageEditor></div>\n</ion-content>\n<ion-footer>\n <ion-toolbar>\n @if (this.$footerMenu() === 'menu') {\n <aside class=\"ion-justify-content-center\">\n <button (click)=\"$footerMenu.set('crop')\">\n <ion-text>{{ dictionary.crop }}</ion-text>\n <ion-icon name=\"crop-outline\" size=\"large\"></ion-icon>\n </button>\n <button (click)=\"$footerMenu.set('filter')\">\n <ion-text>{{ dictionary.filter }}</ion-text>\n <ion-icon name=\"color-filter-outline\" size=\"large\"></ion-icon>\n </button>\n <button (click)=\"$footerMenu.set('brightness')\">\n <ion-text>{{ dictionary.brightness }}</ion-text>\n <ion-icon name=\"sunny-outline\" size=\"large\"></ion-icon>\n </button>\n </aside>\n }\n\n @if (this.$footerMenu() === 'filter') {\n <aside>\n @for (item of $filters(); track item) {\n <button (click)=\"filterImage(item)\">\n <ion-text>{{ item.name }}</ion-text>\n <span class=\"image-filter-box\" [style.background-image]=\"'url(' + item.data + ')'\"></span>\n </button>\n }\n </aside>\n }\n\n @if (this.$footerMenu() === 'crop' && !requireSquare) {\n <ion-buttons class=\"ion-justify-content-center submenu-icon-buttons\">\n <ion-button (click)=\"changeCrop('cover')\" [color]=\"$currentCrop() === 'cover' ? 'success' : undefined\">\n <ion-icon name=\"expand-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"changeCrop('16/9')\" [color]=\"$currentCrop() === '16/9' ? 'success' : undefined\">\n <ion-icon name=\"tablet-landscape-outline\" slot=\"icon-only\" style=\"transform: scale(1, 0.8)\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"changeCrop('1')\" [color]=\"$currentCrop() === '1' ? 'success' : undefined\">\n <ion-icon name=\"square-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"changeCrop('auto')\" [color]=\"$currentCrop() === 'auto' ? 'success' : undefined\">\n <ion-icon name=\"crop-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"rotate()\"><ion-icon name=\"refresh-outline\" slot=\"icon-only\"></ion-icon></ion-button>\n </ion-buttons>\n }\n\n @if (['brightness'].includes(this.$footerMenu())) {\n <div class=\"ion-padding ion-margin\">\n <ion-range [pin]=\"true\" [min]=\"-100\" [max]=\"100\" (ionChange)=\"changeRange($any($event))\"></ion-range>\n </div>\n }\n </ion-toolbar>\n @if (this.$footerMenu() !== 'menu') {\n <ion-toolbar mode=\"md\">\n @if (this.$footerMenu() === 'filter') {\n <ion-buttons class=\"ion-justify-content-center\" style=\"margin: 0 8px\">\n <ion-button fill=\"outline\" shape=\"round\" (click)=\"this.$footerMenu.set('menu')\">\u623B\u308B</ion-button>\n </ion-buttons>\n } @else {\n <ion-buttons slot=\"start\" style=\"min-width: 60px\">\n @if (!requireSquare || $isCropped()) {\n <ion-button (click)=\"closeCrop('cancel')\"><ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon></ion-button>\n }</ion-buttons\n ><ion-text class=\"footer-title\">\n @if ($footerMenu() === 'crop') {\n {{ dictionary.crop }}\n } @else if ($footerMenu() === 'brightness') {\n {{ dictionary.brightness }}\n }</ion-text\n ><ion-buttons slot=\"end\"\n ><ion-button (click)=\"closeCrop('apply')\"\n ><ion-icon name=\"checkmark-outline\" slot=\"icon-only\" color=\"success\"></ion-icon></ion-button\n ></ion-buttons>\n }\n </ion-toolbar>\n }\n</ion-footer>\n", styles: ["@charset \"UTF-8\";:host{--alway-dark: var(--ion-color-step-100, #2a2a2a);--alway-dark-tint: var(--ion-color-step-200, #414141);--alway-white: var(--ion-color-step-950, #f0f0f0);--alway-white-tint: var(--ion-color-step-850, #dbdbdb)}ion-content,ion-toolbar,ion-header,ion-footer{background:var(--alway-dark);--background: var(--alway-dark)}\n", "ion-content{--background: var(--alway-dark)}ion-content>div{width:100%;height:100%;max-width:100%;max-height:100%;display:grid;align-items:center;justify-items:center}aside{display:flex;overflow-x:scroll;margin-top:16px;min-height:120px}aside ion-icon{color:var(--alway-white);border:1px solid var(--alway-dark-tint);border-radius:50%;padding:16px}aside button{width:120px;display:block;flex:1;background:transparent;margin:0 8px 16px}aside button ion-text{display:block;color:var(--alway-white);margin-bottom:8px;font-size:.8rem}aside button span.image-filter-box{width:96px;height:64px;border-radius:8px;overflow:hidden;display:block;background-position:center,center;background-size:cover}ion-header ion-button,ion-footer ion-button{--color: var(--alway-white) !important}ion-footer ion-toolbar ion-text.footer-title{color:var(--alway-white)!important;display:block;text-align:center}ion-footer ion-toolbar ion-range{--bar-background: var(--alway-white);--bar-background-active: var(--alway-white);--bar-height: 2px;--bar-border-radius: 8px;--knob-background: var(--alway-white);--knob-size: 20px;--pin-background: none;--pin-color: var(--alway-white)}ion-footer ion-toolbar ion-buttons[slot=start] ion-button,ion-footer ion-toolbar ion-buttons[slot=end] ion-button{--background: var(--alway-dark-tint) !important;--border-radius: 50%;margin:0 8px;min-width:32px;min-height:32px}ion-footer ion-toolbar ion-buttons.submenu-icon-buttons ion-button{margin:16px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonRange, selector: "ion-range", inputs: ["activeBarStart", "color", "debounce", "disabled", "dualKnobs", "label", "labelPlacement", "legacy", "max", "min", "mode", "name", "pin", "pinFormatter", "snaps", "step", "ticks", "value"] }] }); }
170
+ }
171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PhotoEditorPage, decorators: [{
172
+ type: Component,
173
+ args: [{ selector: 'app-editor-image', standalone: true, imports: [CommonModule, FormsModule, NgOptimizedImage, ...ionComponents], providers: [HelperService], template: "<ion-header>\n <ion-toolbar>\n <ion-buttons slot=\"start\"\n ><ion-button (click)=\"modalCtrl.dismiss()\"><ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon></ion-button\n ></ion-buttons>\n <ion-buttons slot=\"end\">\n <ion-button color=\"primary\" fill=\"outline\" [disabled]=\"!['menu', 'filter'].includes($footerMenu())\" (click)=\"imageSave()\">\n {{ dictionary.save }}\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n\n<ion-content class=\"ion-padding\" [scrollY]=\"false\">\n <div #imageEditor></div>\n</ion-content>\n<ion-footer>\n <ion-toolbar>\n @if (this.$footerMenu() === 'menu') {\n <aside class=\"ion-justify-content-center\">\n <button (click)=\"$footerMenu.set('crop')\">\n <ion-text>{{ dictionary.crop }}</ion-text>\n <ion-icon name=\"crop-outline\" size=\"large\"></ion-icon>\n </button>\n <button (click)=\"$footerMenu.set('filter')\">\n <ion-text>{{ dictionary.filter }}</ion-text>\n <ion-icon name=\"color-filter-outline\" size=\"large\"></ion-icon>\n </button>\n <button (click)=\"$footerMenu.set('brightness')\">\n <ion-text>{{ dictionary.brightness }}</ion-text>\n <ion-icon name=\"sunny-outline\" size=\"large\"></ion-icon>\n </button>\n </aside>\n }\n\n @if (this.$footerMenu() === 'filter') {\n <aside>\n @for (item of $filters(); track item) {\n <button (click)=\"filterImage(item)\">\n <ion-text>{{ item.name }}</ion-text>\n <span class=\"image-filter-box\" [style.background-image]=\"'url(' + item.data + ')'\"></span>\n </button>\n }\n </aside>\n }\n\n @if (this.$footerMenu() === 'crop' && !requireSquare) {\n <ion-buttons class=\"ion-justify-content-center submenu-icon-buttons\">\n <ion-button (click)=\"changeCrop('cover')\" [color]=\"$currentCrop() === 'cover' ? 'success' : undefined\">\n <ion-icon name=\"expand-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"changeCrop('16/9')\" [color]=\"$currentCrop() === '16/9' ? 'success' : undefined\">\n <ion-icon name=\"tablet-landscape-outline\" slot=\"icon-only\" style=\"transform: scale(1, 0.8)\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"changeCrop('1')\" [color]=\"$currentCrop() === '1' ? 'success' : undefined\">\n <ion-icon name=\"square-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"changeCrop('auto')\" [color]=\"$currentCrop() === 'auto' ? 'success' : undefined\">\n <ion-icon name=\"crop-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n <ion-button (click)=\"rotate()\"><ion-icon name=\"refresh-outline\" slot=\"icon-only\"></ion-icon></ion-button>\n </ion-buttons>\n }\n\n @if (['brightness'].includes(this.$footerMenu())) {\n <div class=\"ion-padding ion-margin\">\n <ion-range [pin]=\"true\" [min]=\"-100\" [max]=\"100\" (ionChange)=\"changeRange($any($event))\"></ion-range>\n </div>\n }\n </ion-toolbar>\n @if (this.$footerMenu() !== 'menu') {\n <ion-toolbar mode=\"md\">\n @if (this.$footerMenu() === 'filter') {\n <ion-buttons class=\"ion-justify-content-center\" style=\"margin: 0 8px\">\n <ion-button fill=\"outline\" shape=\"round\" (click)=\"this.$footerMenu.set('menu')\">\u623B\u308B</ion-button>\n </ion-buttons>\n } @else {\n <ion-buttons slot=\"start\" style=\"min-width: 60px\">\n @if (!requireSquare || $isCropped()) {\n <ion-button (click)=\"closeCrop('cancel')\"><ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon></ion-button>\n }</ion-buttons\n ><ion-text class=\"footer-title\">\n @if ($footerMenu() === 'crop') {\n {{ dictionary.crop }}\n } @else if ($footerMenu() === 'brightness') {\n {{ dictionary.brightness }}\n }</ion-text\n ><ion-buttons slot=\"end\"\n ><ion-button (click)=\"closeCrop('apply')\"\n ><ion-icon name=\"checkmark-outline\" slot=\"icon-only\" color=\"success\"></ion-icon></ion-button\n ></ion-buttons>\n }\n </ion-toolbar>\n }\n</ion-footer>\n", styles: ["@charset \"UTF-8\";:host{--alway-dark: var(--ion-color-step-100, #2a2a2a);--alway-dark-tint: var(--ion-color-step-200, #414141);--alway-white: var(--ion-color-step-950, #f0f0f0);--alway-white-tint: var(--ion-color-step-850, #dbdbdb)}ion-content,ion-toolbar,ion-header,ion-footer{background:var(--alway-dark);--background: var(--alway-dark)}\n", "ion-content{--background: var(--alway-dark)}ion-content>div{width:100%;height:100%;max-width:100%;max-height:100%;display:grid;align-items:center;justify-items:center}aside{display:flex;overflow-x:scroll;margin-top:16px;min-height:120px}aside ion-icon{color:var(--alway-white);border:1px solid var(--alway-dark-tint);border-radius:50%;padding:16px}aside button{width:120px;display:block;flex:1;background:transparent;margin:0 8px 16px}aside button ion-text{display:block;color:var(--alway-white);margin-bottom:8px;font-size:.8rem}aside button span.image-filter-box{width:96px;height:64px;border-radius:8px;overflow:hidden;display:block;background-position:center,center;background-size:cover}ion-header ion-button,ion-footer ion-button{--color: var(--alway-white) !important}ion-footer ion-toolbar ion-text.footer-title{color:var(--alway-white)!important;display:block;text-align:center}ion-footer ion-toolbar ion-range{--bar-background: var(--alway-white);--bar-background-active: var(--alway-white);--bar-height: 2px;--bar-border-radius: 8px;--knob-background: var(--alway-white);--knob-size: 20px;--pin-background: none;--pin-color: var(--alway-white)}ion-footer ion-toolbar ion-buttons[slot=start] ion-button,ion-footer ion-toolbar ion-buttons[slot=end] ion-button{--background: var(--alway-dark-tint) !important;--border-radius: 50%;margin:0 8px;min-width:32px;min-height:32px}ion-footer ion-toolbar ion-buttons.submenu-icon-buttons ion-button{margin:16px}\n"] }]
174
+ }], ctorParameters: () => [], propDecorators: { requireSquare: [{
175
+ type: Input
176
+ }], value: [{
177
+ type: Input
178
+ }], labels: [{
179
+ type: Input
180
+ }], editorRef: [{
181
+ type: ViewChild,
182
+ args: ['imageEditor', { static: true }]
183
+ }], ionContent: [{
184
+ type: ViewChild,
185
+ args: [IonContent]
186
+ }] } });
187
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvdG8tZWRpdG9yLnBhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waG90by1lZGl0b3Ivc3JjL2xpYi9wYWdlcy9waG90by1lZGl0b3IucGFnZS50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Bob3RvLWVkaXRvci9zcmMvbGliL3BhZ2VzL3Bob3RvLWVkaXRvci5wYWdlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNHLE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQWdELE1BQU0sMkJBQTJCLENBQUM7QUFDdEgsT0FBTyxXQUFXLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFVdEQsTUFBTSxPQUFPLGVBQWU7SUFNMUIsSUFBYSxNQUFNLENBQUMsQ0FBdUI7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUMsSUFBSSxD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LElBQUksQ0FBQyxDQUFDO1NBQ25FO1FBQ0QsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUM3QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNqQyxPQUFPO1NBQ1I7UUFDRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7OEdBdkxVLGVBQWU7a0dBQWYsZUFBZSw2SUFGZixDQUFDLGFBQWEsQ0FBQywrS0FjZixVQUFVLGdEQ2pDdkIsd3ZJQStGQSwwMEREN0VZLFlBQVksOEJBQUUsV0FBVzs7MkZBR3hCLGVBQWU7a0JBUjNCLFNBQVM7K0JBQ0Usa0JBQWtCLGNBR2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxhQUFhLENBQUMsYUFDN0QsQ0FBQyxhQUFhLENBQUM7d0RBTWpCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNPLE1BQU07c0JBQWxCLEtBQUs7Z0JBS3NDLFNBQVM7c0JBQXBELFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDbkIsVUFBVTtzQkFBaEMsU0FBUzt1QkFBQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgc2lnbmFsLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSwgTmdPcHRpbWl6ZWRJbWFnZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElvbkNvbnRlbnQsIE1vZGFsQ29udHJvbGxlciwgUmFuZ2VDdXN0b21FdmVudCwgVmlld0RpZEVudGVyLCBWaWV3RGlkTGVhdmUgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCBJbWFnZUVkaXRvciBmcm9tICd0dWktaW1hZ2UtZWRpdG9yJztcbmltcG9ydCB7IGZpbHRlclByZXNldCB9IGZyb20gJy4uL2ZpbHRlci1wcmVzZXQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBJRGljdGlvbmFyeUZvckVkaXRvciwgSVBob3RvRWRpdG9yRGlzbWlzcywgSUZpbHRlciwgSVNpemUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBpb25Db21wb25lbnRzIH0gZnJvbSAnLi4vaW9uLWNvbXBvbmVudHMnO1xuaW1wb3J0IHsgZGljdGlvbmFyeUZvckVkaXRvciB9IGZyb20gJy4uL2RpY3Rpb25hcmllcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1lZGl0b3ItaW1hZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vcGhvdG8tZWRpdG9yLnBhZ2UuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvcmUuc2NzcycsICcuL3Bob3RvLWVkaXRvci5wYWdlLnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE5nT3B0aW1pemVkSW1hZ2UsIC4uLmlvbkNvbXBvbmVudHNdLFxuICBwcm92aWRlcnM6IFtIZWxwZXJTZXJ2aWNlXSxcbn0pXG5leHBvcnQgY2xhc3MgUGhvdG9FZGl0b3JQYWdlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIFZpZXdEaWRFbnRlciwgVmlld0RpZExlYXZlIHtcbiAgcHJvdGVjdGVkIGRpY3Rpb25hcnk6IElEaWN0aW9uYXJ5Rm9yRWRpdG9yID0gZGljdGlvbmFyeUZvckVkaXRvcigpO1xuICBwcm90ZWN0ZWQgZmlsdGVyUHJlc2V0ID0gZmlsdGVyUHJlc2V0KHRoaXMuZGljdGlvbmFyeSk7XG5cbiAgQElucHV0KCkgcmVxdWlyZVNxdWFyZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB2YWx1ZSE6IHN0cmluZztcbiAgQElucHV0KCkgc2V0IGxhYmVscyhkOiBJRGljdGlvbmFyeUZvckVkaXRvcikge1xuICAgIHRoaXMuZGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24odGhpcy5kaWN0aW9uYXJ5LCBkKTtcbiAgICB0aGlzLmZpbHRlclByZXNldCA9IGZpbHRlclByZXNldCh0aGlzLmRpY3Rpb25hcnkpO1xuICB9XG5cbiAgQFZpZXdDaGlsZCgnaW1hZ2VFZGl0b3InLCB7IHN0YXRpYzogdHJ1ZSB9KSBlZGl0b3JSZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQpIGlvbkNvbnRlbnQhOiB7XG4gICAgZWw6IElvbkNvbnRlbnQgJiBIVE1MRWxlbWVudDtcbiAgfTtcblxuICAkZmlsdGVycyA9IHNpZ25hbDxJRmlsdGVyW10+KFtdKTtcbiAgJGZvb3Rlck1lbnUgPSBzaWduYWw8J2ZpbHRlcicgfCAnbWVudScgfCAnY3JvcCcgfCAnYnJpZ2h0bmVzcyc+KCdtZW51Jyk7XG4gICRjdXJyZW50Q3JvcCA9IHNpZ25hbDwnY292ZXInIHwgJzE2LzknIHwgJzEnIHwgJ2F1dG8nPignY292ZXInKTtcbiAgJGN1cnJlbnRSb3RhdGUgPSBzaWduYWw8bnVtYmVyPigwKTtcbiAgJHBob3RvQ3JvcCA9IHNpZ25hbDxJU2l6ZT4oe1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgfSk7XG4gICRpc0Nyb3BwZWQgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgZm9vdGVyTWVudSQgPSB0b09ic2VydmFibGUodGhpcy4kZm9vdGVyTWVudSk7XG4gIHByaXZhdGUgJGFkb3B0RmlsdGVyID0gc2lnbmFsPElGaWx0ZXIgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgZWRpdG9ySW5zdGFuY2UhOiBJbWFnZUVkaXRvcjtcbiAgcHJpdmF0ZSBpbml0U3Vic2NyaXB0aW9uJDogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBmaWx0ZXJJbWFnZVNpemUgPSAyNDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChIZWxwZXJTZXJ2aWNlKTtcblxuICBtb2RhbEN0cmwgPSBpbmplY3QoTW9kYWxDb250cm9sbGVyKTtcblxuICBwcml2YXRlIGNhbnZhc0NvbnRhaW5lck9ic2VydmVyOiBNdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uc0xpc3Q6IE11dGF0aW9uUmVjb3JkW10pID0+IHtcbiAgICBpZiAobXV0YXRpb25zTGlzdC5maW5kKChtdXRhdGlvbikgPT4gbXV0YXRpb24udHlwZSA9PT0gJ2F0dHJpYnV0ZXMnICYmIG11dGF0aW9uLmF0dHJpYnV0ZU5hbWUgPT09ICdzdHlsZScpKSB7XG4gICAgICAvLyBDb3ZlciB0aGUgaW1hZ2UgZWRpdG9yIHdpdGggdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbldpZHRoID0gbXV0YXRpb25zTGlzdFswXS50YXJnZXQucGFyZW50RWxlbWVudCEuc3R5bGUubWF4V2lkdGg7XG4gICAgICB0aGlzLmVkaXRvclJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLm1pbkhlaWdodCA9IG11dGF0aW9uc0xpc3RbMF0udGFyZ2V0LnBhcmVudEVsZW1lbnQhLnN0eWxlLm1heEhlaWdodDtcblxuICAgICAgdGhpcy4kcGhvdG9Dcm9wLnNldCh7XG4gICAgICAgIHdpZHRoOiBtdXRhdGlvbnNMaXN0WzBdLnRhcmdldC5wYXJlbnRFbGVtZW50IS5xdWVyeVNlbGVjdG9yKCdjYW52YXMnKSEud2lkdGgsXG4gICAgICAgIGhlaWdodDogbXV0YXRpb25zTGlzdFswXS50YXJnZXQucGFyZW50RWxlbWVudCEucXVlcnlTZWxlY3RvcignY2FudmFzJykhLmhlaWdodCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZXJ2aWNlLmluaXRpYWxpemVFZGl0b3JJY29ucygpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5pbml0U3Vic2NyaXB0aW9uJC5wdXNoKFxuICAgICAgdGhpcy5mb290ZXJNZW51JC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ2ZpbHRlcicpIHtcbiAgICAgICAgICB0aGlzLmluaXRpYWxpemVGaWx0ZXJNZW51KCkudGhlbigpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gJ2Nyb3AnKSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5zdGFydERyYXdpbmdNb2RlKCdDUk9QUEVSJyk7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VDcm9wKHRoaXMucmVxdWlyZVNxdWFyZSA/ICcxJyA6ICdjb3ZlcicpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5pbml0U3Vic2NyaXB0aW9uJC5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGFzeW5jIGlvblZpZXdEaWRFbnRlcigpIHtcbiAgICB0aGlzLmVkaXRvckluc3RhbmNlID0gbmV3IEltYWdlRWRpdG9yKHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgIGNzc01heFdpZHRoOiB0aGlzLmlvbkNvbnRlbnQuZWwuY2xpZW50V2lkdGggLSAzMixcbiAgICAgIGNzc01heEhlaWdodDogdGhpcy5pb25Db250ZW50LmVsLmNsaWVudEhlaWdodCAtIDMyLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmljZS53YWl0VG9GaW5kRG9tKHRoaXMuZWRpdG9yUmVmLm5hdGl2ZUVsZW1lbnQsICcudHVpLWltYWdlLWVkaXRvci1jYW52YXMtY29udGFpbmVyJykudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLmNhbnZhc0NvbnRhaW5lck9ic2VydmVyLm9ic2VydmUodGhpcy5lZGl0b3JSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcudHVpLWltYWdlLWVkaXRvci1jYW52YXMtY29udGFpbmVyJyksIHtcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiBmYWxzZSxcbiAgICAgICAgc3VidHJlZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBmZXRjaCh0aGlzLnZhbHVlKS50aGVuKChyZXMpID0+IHJlcy5ibG9iKCkpO1xuICAgIGF3YWl0IHRoaXMuZWRpdG9ySW5zdGFuY2UubG9hZEltYWdlRnJvbUZpbGUobmV3IEZpbGUoW2Jsb2JdLCAnZGF0YS5wbmcnLCB7IHR5cGU6IGJsb2IudHlwZSB9KSk7XG4gICAgdGhpcy4kZm9vdGVyTWVudS5zZXQodGhpcy5yZXF1aXJlU3F1YXJlID8gJ2Nyb3AnIDogJ21lbnUnKTtcbiAgfVxuXG4gIGlvblZpZXdEaWRMZWF2ZSgpIHtcbiAgICB0aGlzLmVkaXRvckluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICB0aGlzLmNhbnZhc0NvbnRhaW5lck9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxuXG4gIGNoYW5nZUNyb3AoY3JvcDogJ2NvdmVyJyB8ICcxNi85JyB8ICcxJyB8ICdhdXRvJykge1xuICAgIGNvbnN0IHJlY3QgPSBjcm9wID09PSAnY292ZXInID8gdGhpcy4kcGhvdG9Dcm9wKCkud2lkdGggLyB0aGlzLiRwaG90b0Nyb3AoKS5oZWlnaHQgOiBjcm9wID09PSAnMTYvOScgPyAxNiAvIDkgOiAxO1xuICAgIHRoaXMuZWRpdG9ySW5zdGFuY2Uuc2V0Q3JvcHpvbmVSZWN0KGNyb3AgIT09ICdhdXRvJyA/IHJlY3QgOiB1bmRlZmluZWQpO1xuICAgIHRoaXMuJGN1cnJlbnRDcm9wLnNldChjcm9wKTtcbiAgfVxuXG4gIGFzeW5jIHJvdGF0ZSgpIHtcbiAgICB0aGlzLmVkaXRvckluc3RhbmNlLnN0b3BEcmF3aW5nTW9kZSgpO1xuICAgIGF3YWl0IHRoaXMuZWRpdG9ySW5zdGFuY2Uucm90YXRlKDkwKTtcbiAgICB0aGlzLiRjdXJyZW50Um90YXRlLnVwZGF0ZSgodmFsdWUpID0+IHZhbHVlICsgOTApO1xuICAgIHRoaXMuZWRpdG9ySW5zdGFuY2Uuc3RhcnREcmF3aW5nTW9kZSgnQ1JPUFBFUicpO1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLmNoYW5nZUNyb3AodGhpcy4kY3VycmVudENyb3AoKSkpO1xuICB9XG5cbiAgYXN5bmMgY2xvc2VDcm9wKHR5cGU6ICdjYW5jZWwnIHwgJ2FwcGx5Jykge1xuICAgIGlmICh0aGlzLiRmb290ZXJNZW51KCkgPT09ICdjcm9wJykge1xuICAgICAgaWYgKHR5cGUgPT09ICdjYW5jZWwnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZWRpdG9ySW5zdGFuY2Uucm90YXRlKHRoaXMuJGN1cnJlbnRSb3RhdGUoKSAqIC0xKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZWRpdG9ySW5zdGFuY2UuY3JvcCh0aGlzLmVkaXRvckluc3RhbmNlLmdldENyb3B6b25lUmVjdCgpKTtcbiAgICAgICAgdGhpcy4kaXNDcm9wcGVkLnNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuJGN1cnJlbnRSb3RhdGUuc2V0KDApO1xuICAgICAgdGhpcy4kY3VycmVudENyb3Auc2V0KCdjb3ZlcicpO1xuICAgICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5zdG9wRHJhd2luZ01vZGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJGZvb3Rlck1lbnUoKSA9PT0gJ2JyaWdodG5lc3MnKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ2NhbmNlbCcgJiYgdGhpcy5lZGl0b3JJbnN0YW5jZS5oYXNGaWx0ZXIoJ2JyaWdodG5lc3MnKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVkaXRvckluc3RhbmNlLnJlbW92ZUZpbHRlcignYnJpZ2h0bmVzcycpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLiRmb290ZXJNZW51LnNldCgnbWVudScpO1xuICB9XG5cbiAgYXN5bmMgY2hhbmdlUmFuZ2UoZXZlbnQ6IFJhbmdlQ3VzdG9tRXZlbnQpIHtcbiAgICBpZiAodGhpcy5lZGl0b3JJbnN0YW5jZS5oYXNGaWx0ZXIoJ2JyaWdodG5lc3MnKSkge1xuICAgICAgYXdhaXQgdGhpcy5lZGl0b3JJbnN0YW5jZS5yZW1vdmVGaWx0ZXIoJ2JyaWdodG5lc3MnKTtcbiAgICB9XG4gICAgdGhpcy5lZGl0b3JJbnN0YW5jZS5hcHBseUZpbHRlcignYnJpZ2h0bmVzcycsIHtcbiAgICAgIGJyaWdodG5lc3M6IE51bWJlcihldmVudC5kZXRhaWwudmFsdWUpIC8gMjU1LFxuICAgIH0pO1xuICB9XG5cbiAgaW1hZ2VTYXZlKCkge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5lZGl0b3JJbnN0YW5jZS50b0RhdGFVUkwoKTtcbiAgICB0aGlzLm1vZGFsQ3RybC5kaXNtaXNzKHsgdmFsdWUgfSBhcyBJUGhvdG9FZGl0b3JEaXNtaXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZUZpbHRlck1lbnUoKSB7XG4gICAgY29uc3QgZmlsdGVyczogSUZpbHRlcltdID0gW107XG5cbiAgICBjb25zdCBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgSW1hZ2VFZGl0b3IoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIHtcbiAgICAgIGNzc01heFdpZHRoOiB0aGlzLmZpbHRlckltYWdlU2l6ZSxcbiAgICAgIGNzc01heEhlaWdodDogKHRoaXMuJHBob3RvQ3JvcCgpLmhlaWdodCAqIHRoaXMuZmlsdGVySW1hZ2VTaXplKSAvIHRoaXMuJHBob3RvQ3JvcCgpLndpZHRoLFxuICAgIH0pO1xuICAgIGNvbnN0IGJsb2IgPSBhd2FpdCBmZXRjaChcbiAgICAgIHRoaXMuZWRpdG9ySW5zdGFuY2UudG9EYXRhVVJMKHtcbiAgICAgICAgbXVsdGlwbGllcjogdGhpcy5maWx0ZXJJbWFnZVNpemUgLyB0aGlzLiRwaG90b0Nyb3AoKS53aWR0aCxcbiAgICAgIH0pLFxuICAgICkudGhlbigocmVzKSA9PiByZXMuYmxvYigpKTtcbiAgICBhd2FpdCBkZWZhdWx0SW5zdGFuY2UubG9hZEltYWdlRnJvbUZpbGUobmV3IEZpbGUoW2Jsb2JdLCAnZGVmYXVsdEluc3RhbmNlLnBuZycsIHsgdHlwZTogYmxvYi50eXBlIH0pKTtcblxuICAgIGZvciAoY29uc3QgZmlsdGVyIG9mIHRoaXMuZmlsdGVyUHJlc2V0KSB7XG4gICAgICBpZiAoZmlsdGVyLnR5cGUgIT09ICdEZWZhdWx0Jykge1xuICAgICAgICBhd2FpdCBkZWZhdWx0SW5zdGFuY2UuYXBwbHlGaWx0ZXIoZmlsdGVyLnR5cGUsIGZpbHRlci5vcHRpb24pO1xuICAgICAgfVxuICAgICAgZmlsdGVycy5wdXNoKHtcbiAgICAgICAgbmFtZTogZmlsdGVyLm5hbWUsXG4gICAgICAgIHR5cGU6IGZpbHRlci50eXBlLFxuICAgICAgICBvcHRpb246IGZpbHRlci5vcHRpb24sXG4gICAgICAgIGRhdGE6IGRlZmF1bHRJbnN0YW5jZS50b0RhdGFVUkwoKSxcbiAgICAgICAgd2lkdGg6IHRoaXMuZmlsdGVySW1hZ2VTaXplLFxuICAgICAgICBoZWlnaHQ6ICh0aGlzLiRwaG90b0Nyb3AoKS5oZWlnaHQgKiB0aGlzLmZpbHRlckltYWdlU2l6ZSkgLyB0aGlzLiRwaG90b0Nyb3AoKS53aWR0aCxcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbHRlci50eXBlICE9PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgYXdhaXQgZGVmYXVsdEluc3RhbmNlLnJlbW92ZUZpbHRlcihmaWx0ZXIudHlwZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuJGZpbHRlcnMuc2V0KGZpbHRlcnMpO1xuICAgIGRlZmF1bHRJbnN0YW5jZS5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBmaWx0ZXJJbWFnZShmaWx0ZXI6IElGaWx0ZXIpIHtcbiAgICBpZiAodGhpcy4kYWRvcHRGaWx0ZXIoKSkge1xuICAgICAgYXdhaXQgdGhpcy5lZGl0b3JJbnN0YW5jZS5yZW1vdmVGaWx0ZXIodGhpcy4kYWRvcHRGaWx0ZXIoKSEudHlwZSk7XG4gICAgfVxuICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICB0aGlzLiRhZG9wdEZpbHRlci5zZXQodW5kZWZpbmVkKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5lZGl0b3JJbnN0YW5jZS5hcHBseUZpbHRlcihmaWx0ZXIudHlwZSwgZmlsdGVyLm9wdGlvbik7XG4gICAgdGhpcy4kYWRvcHRGaWx0ZXIuc2V0KGZpbHRlcik7XG4gIH1cbn1cbiIsIjxpb24taGVhZGVyPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiXG4gICAgICA+PGlvbi1idXR0b24gKGNsaWNrKT1cIm1vZGFsQ3RybC5kaXNtaXNzKClcIj48aW9uLWljb24gbmFtZT1cImNsb3NlLW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj48L2lvbi1idXR0b25cbiAgICA+PC9pb24tYnV0dG9ucz5cbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxuICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgZmlsbD1cIm91dGxpbmVcIiBbZGlzYWJsZWRdPVwiIVsnbWVudScsICdmaWx0ZXInXS5pbmNsdWRlcygkZm9vdGVyTWVudSgpKVwiIChjbGljayk9XCJpbWFnZVNhdmUoKVwiPlxuICAgICAgICB7eyBkaWN0aW9uYXJ5LnNhdmUgfX1cbiAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICA8L2lvbi1idXR0b25zPlxuICA8L2lvbi10b29sYmFyPlxuPC9pb24taGVhZGVyPlxuXG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiIFtzY3JvbGxZXT1cImZhbHNlXCI+XG4gIDxkaXYgI2ltYWdlRWRpdG9yPjwvZGl2PlxuPC9pb24tY29udGVudD5cbjxpb24tZm9vdGVyPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgQGlmICh0aGlzLiRmb290ZXJNZW51KCkgPT09ICdtZW51Jykge1xuICAgICAgPGFzaWRlIGNsYXNzPVwiaW9uLWp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiJGZvb3Rlck1lbnUuc2V0KCdjcm9wJylcIj5cbiAgICAgICAgICA8aW9uLXRleHQ+e3sgZGljdGlvbmFyeS5jcm9wIH19PC9pb24tdGV4dD5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNyb3Atb3V0bGluZVwiIHNpemU9XCJsYXJnZVwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCIkZm9vdGVyTWVudS5zZXQoJ2ZpbHRlcicpXCI+XG4gICAgICAgICAgPGlvbi10ZXh0Pnt7IGRpY3Rpb25hcnkuZmlsdGVyIH19PC9pb24tdGV4dD5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNvbG9yLWZpbHRlci1vdXRsaW5lXCIgc2l6ZT1cImxhcmdlXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cIiRmb290ZXJNZW51LnNldCgnYnJpZ2h0bmVzcycpXCI+XG4gICAgICAgICAgPGlvbi10ZXh0Pnt7IGRpY3Rpb25hcnkuYnJpZ2h0bmVzcyB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJzdW5ueS1vdXRsaW5lXCIgc2l6ZT1cImxhcmdlXCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2FzaWRlPlxuICAgIH1cblxuICAgIEBpZiAodGhpcy4kZm9vdGVyTWVudSgpID09PSAnZmlsdGVyJykge1xuICAgICAgPGFzaWRlPlxuICAgICAgICBAZm9yIChpdGVtIG9mICRmaWx0ZXJzKCk7IHRyYWNrIGl0ZW0pIHtcbiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJmaWx0ZXJJbWFnZShpdGVtKVwiPlxuICAgICAgICAgICAgPGlvbi10ZXh0Pnt7IGl0ZW0ubmFtZSB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImltYWdlLWZpbHRlci1ib3hcIiBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCIndXJsKCcgKyBpdGVtLmRhdGEgKyAnKSdcIj48L3NwYW4+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvYXNpZGU+XG4gICAgfVxuXG4gICAgQGlmICh0aGlzLiRmb290ZXJNZW51KCkgPT09ICdjcm9wJyAmJiAhcmVxdWlyZVNxdWFyZSkge1xuICAgICAgPGlvbi1idXR0b25zIGNsYXNzPVwiaW9uLWp1c3RpZnktY29udGVudC1jZW50ZXIgc3VibWVudS1pY29uLWJ1dHRvbnNcIj5cbiAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImNoYW5nZUNyb3AoJ2NvdmVyJylcIiBbY29sb3JdPVwiJGN1cnJlbnRDcm9wKCkgPT09ICdjb3ZlcicgPyAnc3VjY2VzcycgOiB1bmRlZmluZWRcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImV4cGFuZC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImNoYW5nZUNyb3AoJzE2LzknKVwiIFtjb2xvcl09XCIkY3VycmVudENyb3AoKSA9PT0gJzE2LzknID8gJ3N1Y2Nlc3MnIDogdW5kZWZpbmVkXCI+XG4gICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0YWJsZXQtbGFuZHNjYXBlLW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgc3R5bGU9XCJ0cmFuc2Zvcm06IHNjYWxlKDEsIDAuOClcIj48L2lvbi1pY29uPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJjaGFuZ2VDcm9wKCcxJylcIiBbY29sb3JdPVwiJGN1cnJlbnRDcm9wKCkgPT09ICcxJyA/ICdzdWNjZXNzJyA6IHVuZGVmaW5lZFwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwic3F1YXJlLW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCI+PC9pb24taWNvbj5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2hhbmdlQ3JvcCgnYXV0bycpXCIgW2NvbG9yXT1cIiRjdXJyZW50Q3JvcCgpID09PSAnYXV0bycgPyAnc3VjY2VzcycgOiB1bmRlZmluZWRcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNyb3Atb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJyb3RhdGUoKVwiPjxpb24taWNvbiBuYW1lPVwicmVmcmVzaC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+PC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICB9XG5cbiAgICBAaWYgKFsnYnJpZ2h0bmVzcyddLmluY2x1ZGVzKHRoaXMuJGZvb3Rlck1lbnUoKSkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJpb24tcGFkZGluZyBpb24tbWFyZ2luXCI+XG4gICAgICAgIDxpb24tcmFuZ2UgW3Bpbl09XCJ0cnVlXCIgW21pbl09XCItMTAwXCIgW21heF09XCIxMDBcIiAoaW9uQ2hhbmdlKT1cImNoYW5nZVJhbmdlKCRhbnkoJGV2ZW50KSlcIj48L2lvbi1yYW5nZT5cbiAgICAgIDwvZGl2PlxuICAgIH1cbiAgPC9pb24tdG9vbGJhcj5cbiAgQGlmICh0aGlzLiRmb290ZXJNZW51KCkgIT09ICdtZW51Jykge1xuICAgIDxpb24tdG9vbGJhciBtb2RlPVwibWRcIj5cbiAgICAgIEBpZiAodGhpcy4kZm9vdGVyTWVudSgpID09PSAnZmlsdGVyJykge1xuICAgICAgICA8aW9uLWJ1dHRvbnMgY2xhc3M9XCJpb24tanVzdGlmeS1jb250ZW50LWNlbnRlclwiIHN0eWxlPVwibWFyZ2luOiAwIDhweFwiPlxuICAgICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJvdXRsaW5lXCIgc2hhcGU9XCJyb3VuZFwiIChjbGljayk9XCJ0aGlzLiRmb290ZXJNZW51LnNldCgnbWVudScpXCI+5oi744KLPC9pb24tYnV0dG9uPlxuICAgICAgICA8L2lvbi1idXR0b25zPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjBweFwiPlxuICAgICAgICAgIEBpZiAoIXJlcXVpcmVTcXVhcmUgfHwgJGlzQ3JvcHBlZCgpKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiY2xvc2VDcm9wKCdjYW5jZWwnKVwiPjxpb24taWNvbiBuYW1lPVwiY2xvc2Utb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIj48L2lvbi1pY29uPjwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICB9PC9pb24tYnV0dG9uc1xuICAgICAgICA+PGlvbi10ZXh0IGNsYXNzPVwiZm9vdGVyLXRpdGxlXCI+XG4gICAgICAgICAgQGlmICgkZm9vdGVyTWVudSgpID09PSAnY3JvcCcpIHtcbiAgICAgICAgICAgIHt7IGRpY3Rpb25hcnkuY3JvcCB9fVxuICAgICAgICAgIH0gQGVsc2UgaWYgKCRmb290ZXJNZW51KCkgPT09ICdicmlnaHRuZXNzJykge1xuICAgICAgICAgICAge3sgZGljdGlvbmFyeS5icmlnaHRuZXNzIH19XG4gICAgICAgICAgfTwvaW9uLXRleHRcbiAgICAgICAgPjxpb24tYnV0dG9ucyBzbG90PVwiZW5kXCJcbiAgICAgICAgICA+PGlvbi1idXR0b24gKGNsaWNrKT1cImNsb3NlQ3JvcCgnYXBwbHknKVwiXG4gICAgICAgICAgICA+PGlvbi1pY29uIG5hbWU9XCJjaGVja21hcmstb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiBjb2xvcj1cInN1Y2Nlc3NcIj48L2lvbi1pY29uPjwvaW9uLWJ1dHRvblxuICAgICAgICA+PC9pb24tYnV0dG9ucz5cbiAgICAgIH1cbiAgICA8L2lvbi10b29sYmFyPlxuICB9XG48L2lvbi1mb290ZXI+XG4iXX0=
@@ -0,0 +1,96 @@
1
+ import { Component, CUSTOM_ELEMENTS_SCHEMA, ElementRef, inject, Input, ViewChild, } from '@angular/core';
2
+ import { IonicSlides, ModalController } from '@ionic/angular/standalone';
3
+ import { Navigation, Zoom } from 'swiper/modules';
4
+ import { fromEvent, throttleTime, withLatestFrom, zipWith } from 'rxjs';
5
+ import { NgFor, NgIf } from '@angular/common';
6
+ import { ionComponents } from '../ion-components';
7
+ import { HelperService } from '../service/helper.service';
8
+ import { register } from 'swiper/element/bundle';
9
+ import { dictionaryForViewer } from '../dictionaries';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@ionic/angular/standalone";
12
+ export class PhotoViewerPage {
13
+ set labels(d) {
14
+ this.dictionary = Object.assign(this.dictionary, d);
15
+ }
16
+ constructor() {
17
+ this.dictionary = dictionaryForViewer();
18
+ this.imageUrls = [];
19
+ this.index = 0;
20
+ this.isCircle = false;
21
+ this.enableDelete = false;
22
+ this.enableFooterSafeArea = false;
23
+ this.modalCtrl = inject(ModalController);
24
+ this.el = inject(ElementRef);
25
+ this.service = inject(HelperService);
26
+ register();
27
+ this.service.initializeViewerIcons();
28
+ }
29
+ async ngOnInit() {
30
+ this.service.waitToFindDom(this.el.nativeElement, 'swiper-container').then(() => {
31
+ Object.assign(this.swiper.nativeElement, {
32
+ modules: [Navigation, Zoom, IonicSlides],
33
+ initialSlide: this.index,
34
+ slidesPerView: 1,
35
+ pagination: {
36
+ enabled: true,
37
+ clickable: true,
38
+ },
39
+ zoom: true,
40
+ });
41
+ this.swiper.nativeElement.initialize();
42
+ this.swiper.nativeElement.swiper.zoom.enable();
43
+ this.swiper.nativeElement.swiper.activeIndex = this.index;
44
+ this.swiper.nativeElement.swiper.update();
45
+ });
46
+ this.watchSwipe$ = fromEvent(this.el.nativeElement, 'touchstart')
47
+ .pipe(zipWith(fromEvent(this.el.nativeElement, 'touchend').pipe(withLatestFrom(fromEvent(this.el.nativeElement, 'touchmove')))), throttleTime(1))
48
+ .subscribe(([touchstart, [_, touchmove]]) => {
49
+ const touchstartClientX = touchstart.touches ? touchstart.touches[0].clientX : touchstart.detail[1].clientX;
50
+ const touchmoveClientX = touchmove.touches ? touchmove.touches[0].clientX : touchmove.detail[1].clientX;
51
+ const touchstartClientY = touchstart.touches ? touchstart.touches[0].clientY : touchstart.detail[1].clientY;
52
+ const touchmoveClientY = touchmove.touches ? touchmove.touches[0].clientY : touchmove.detail[1].clientY;
53
+ const xDiff = touchstartClientX - touchmoveClientX;
54
+ const yDiff = touchstartClientY - touchmoveClientY;
55
+ const slides = this.swiper.nativeElement.querySelectorAll('swiper-slide');
56
+ const isZoomed = Array.from(slides).find((slide) => {
57
+ return ['swiper-slide-zoomed', 'swiper-slide-active'].every((c) => slide.classList.contains(c));
58
+ });
59
+ const threshold = touchmove.touches ? -50 : -5;
60
+ if (!isZoomed && Math.abs(xDiff) < Math.abs(threshold) && yDiff < threshold && touchstart.timeStamp <= touchmove.timeStamp) {
61
+ this.watchSwipe$.unsubscribe();
62
+ this.modalCtrl.dismiss();
63
+ }
64
+ });
65
+ }
66
+ ngOnDestroy() {
67
+ if (this.watchSwipe$ && !this.watchSwipe$.closed) {
68
+ this.watchSwipe$.unsubscribe();
69
+ }
70
+ }
71
+ remove() {
72
+ this.modalCtrl.dismiss({ delete: true });
73
+ }
74
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PhotoViewerPage, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
75
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.0.7", type: PhotoViewerPage, isStandalone: true, selector: "app-photo-image", inputs: { imageUrls: "imageUrls", index: "index", isCircle: "isCircle", enableDelete: "enableDelete", enableFooterSafeArea: "enableFooterSafeArea", labels: "labels" }, providers: [HelperService], viewQueries: [{ propertyName: "swiper", first: true, predicate: ["swiper"], descendants: true }], ngImport: i0, template: "<ion-header [translucent]=\"true\">\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"modalCtrl.dismiss()\" class=\"viewer-close-button\">\n <ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n @if (enableDelete) {\n <ion-buttons slot=\"end\">\n <ion-button color=\"danger\" fill=\"outline\" (click)=\"remove()\">{{ dictionary.delete }}</ion-button>\n </ion-buttons>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n <swiper-container #swiper>\n @for (url of imageUrls; track url) {\n <swiper-slide>\n <div class=\"swiper-zoom-container\"><img [src]=\"url\" alt=\"\" [class.circle]=\"isCircle\" /></div>\n </swiper-slide>\n }\n </swiper-container>\n</ion-content>\n\n@if (enableFooterSafeArea) {\n <!-- use for safe area-->\n <ion-footer>\n <ion-toolbar style=\"--border-width: 0; --min-height: 0\"></ion-toolbar>\n </ion-footer>\n}\n", styles: ["@charset \"UTF-8\";:host{--alway-dark: var(--ion-color-step-100, #2a2a2a);--alway-dark-tint: var(--ion-color-step-200, #414141);--alway-white: var(--ion-color-step-950, #f0f0f0);--alway-white-tint: var(--ion-color-step-850, #dbdbdb)}ion-content,ion-toolbar,ion-header,ion-footer{background:var(--alway-dark);--background: var(--alway-dark)}\n", "ion-button.viewer-close-button{--color: var(--alway-white) !important}img.circle{border-radius:50%;display:block;padding:16px}swiper-container{height:100%;max-height:100%}swiper-slide{height:100%;max-height:100%;display:flex;justify-content:center;align-items:center}swiper-slide img{display:block;object-fit:contain;max-width:100%;max-height:100%}\n"], dependencies: [{ kind: "component", type: i1.IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i1.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: i1.IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: i1.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i1.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i1.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }] }); }
76
+ }
77
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PhotoViewerPage, decorators: [{
78
+ type: Component,
79
+ args: [{ selector: 'app-photo-image', standalone: true, imports: [NgFor, NgIf, ...ionComponents], schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [HelperService], template: "<ion-header [translucent]=\"true\">\n <ion-toolbar>\n <ion-buttons slot=\"start\">\n <ion-button (click)=\"modalCtrl.dismiss()\" class=\"viewer-close-button\">\n <ion-icon name=\"close-outline\" slot=\"icon-only\"></ion-icon>\n </ion-button>\n </ion-buttons>\n @if (enableDelete) {\n <ion-buttons slot=\"end\">\n <ion-button color=\"danger\" fill=\"outline\" (click)=\"remove()\">{{ dictionary.delete }}</ion-button>\n </ion-buttons>\n }\n </ion-toolbar>\n</ion-header>\n\n<ion-content [fullscreen]=\"true\">\n <swiper-container #swiper>\n @for (url of imageUrls; track url) {\n <swiper-slide>\n <div class=\"swiper-zoom-container\"><img [src]=\"url\" alt=\"\" [class.circle]=\"isCircle\" /></div>\n </swiper-slide>\n }\n </swiper-container>\n</ion-content>\n\n@if (enableFooterSafeArea) {\n <!-- use for safe area-->\n <ion-footer>\n <ion-toolbar style=\"--border-width: 0; --min-height: 0\"></ion-toolbar>\n </ion-footer>\n}\n", styles: ["@charset \"UTF-8\";:host{--alway-dark: var(--ion-color-step-100, #2a2a2a);--alway-dark-tint: var(--ion-color-step-200, #414141);--alway-white: var(--ion-color-step-950, #f0f0f0);--alway-white-tint: var(--ion-color-step-850, #dbdbdb)}ion-content,ion-toolbar,ion-header,ion-footer{background:var(--alway-dark);--background: var(--alway-dark)}\n", "ion-button.viewer-close-button{--color: var(--alway-white) !important}img.circle{border-radius:50%;display:block;padding:16px}swiper-container{height:100%;max-height:100%}swiper-slide{height:100%;max-height:100%;display:flex;justify-content:center;align-items:center}swiper-slide img{display:block;object-fit:contain;max-width:100%;max-height:100%}\n"] }]
80
+ }], ctorParameters: () => [], propDecorators: { imageUrls: [{
81
+ type: Input
82
+ }], index: [{
83
+ type: Input
84
+ }], isCircle: [{
85
+ type: Input
86
+ }], enableDelete: [{
87
+ type: Input
88
+ }], enableFooterSafeArea: [{
89
+ type: Input
90
+ }], labels: [{
91
+ type: Input
92
+ }], swiper: [{
93
+ type: ViewChild,
94
+ args: ['swiper']
95
+ }] } });
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvdG8tdmlld2VyLnBhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waG90by1lZGl0b3Ivc3JjL2xpYi9wYWdlcy9waG90by12aWV3ZXIucGFnZS50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Bob3RvLWVkaXRvci9zcmMvbGliL3BhZ2VzL3Bob3RvLXZpZXdlci5wYWdlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxzQkFBc0IsRUFDdEIsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFnQixZQUFZLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFMUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFXdEQsTUFBTSxPQUFPLGVBQWU7SUFRMUIsSUFBYSxNQUFNLENBQUMsQ0FBdUI7UUFDekMsSUFBSSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQVNEO1FBbEJVLGVBQVUs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LENBQUMsT0FBTyxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDaEQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUF5QixDQUFDLENBQUM7SUFDbEUsQ0FBQzs4R0FwRlUsZUFBZTtrR0FBZixlQUFlLHNPQUZmLENBQUMsYUFBYSxDQUFDLDRIQzdCNUIsaS9CQStCQTs7MkZEQWEsZUFBZTtrQkFUM0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FHZixJQUFJLFdBQ1AsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsYUFBYSxDQUFDLFdBQy9CLENBQUMsc0JBQXNCLENBQUMsYUFDdEIsQ0FBQyxhQUFhLENBQUM7d0RBS2pCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxvQkFBb0I7c0JBQTVCLEtBQUs7Z0JBQ08sTUFBTTtzQkFBbEIsS0FBSztnQkFJZSxNQUFNO3NCQUExQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gIEVsZW1lbnRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IElvbmljU2xpZGVzLCBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IE5hdmlnYXRpb24sIFpvb20gfSBmcm9tICdzd2lwZXIvbW9kdWxlcyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIFN1YnNjcmlwdGlvbiwgdGhyb3R0bGVUaW1lLCB3aXRoTGF0ZXN0RnJvbSwgemlwV2l0aCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTmdGb3IsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgU3dpcGVyQ29udGFpbmVyIH0gZnJvbSAnc3dpcGVyL2VsZW1lbnQnO1xuaW1wb3J0IHsgaW9uQ29tcG9uZW50cyB9IGZyb20gJy4uL2lvbi1jb21wb25lbnRzJztcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlL2hlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IElEaWN0aW9uYXJ5Rm9yVmlld2VyLCBJUGhvdG9WaWV3ZXJEaXNtaXNzIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICdzd2lwZXIvZWxlbWVudC9idW5kbGUnO1xuaW1wb3J0IHsgZGljdGlvbmFyeUZvclZpZXdlciB9IGZyb20gJy4uL2RpY3Rpb25hcmllcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1waG90by1pbWFnZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9waG90by12aWV3ZXIucGFnZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY29yZS5zY3NzJywgJy4vcGhvdG8tdmlld2VyLnBhZ2Uuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdGb3IsIE5nSWYsIC4uLmlvbkNvbXBvbmVudHNdLFxuICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG4gIHByb3ZpZGVyczogW0hlbHBlclNlcnZpY2VdLFxufSlcbmV4cG9ydCBjbGFzcyBQaG90b1ZpZXdlclBhZ2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCBkaWN0aW9uYXJ5OiBJRGljdGlvbmFyeUZvclZpZXdlciA9IGRpY3Rpb25hcnlGb3JWaWV3ZXIoKTtcblxuICBASW5wdXQoKSBpbWFnZVVybHM6IHN0cmluZ1tdID0gW107XG4gIEBJbnB1dCgpIGluZGV4OiBudW1iZXIgPSAwO1xuICBASW5wdXQoKSBpc0NpcmNsZSA9IGZhbHNlO1xuICBASW5wdXQoKSBlbmFibGVEZWxldGUgPSBmYWxzZTtcbiAgQElucHV0KCkgZW5hYmxlRm9vdGVyU2FmZUFyZWEgPSBmYWxzZTtcbiAgQElucHV0KCkgc2V0IGxhYmVscyhkOiBJRGljdGlvbmFyeUZvclZpZXdlcikge1xuICAgIHRoaXMuZGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24odGhpcy5kaWN0aW9uYXJ5LCBkKTtcbiAgfVxuXG4gIEBWaWV3Q2hpbGQoJ3N3aXBlcicpIHN3aXBlciE6IEVsZW1lbnRSZWY8U3dpcGVyQ29udGFpbmVyPjtcblxuICB3YXRjaFN3aXBlJCE6IFN1YnNjcmlwdGlvbjtcbiAgcmVhZG9ubHkgbW9kYWxDdHJsID0gaW5qZWN0KE1vZGFsQ29udHJvbGxlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgZWwgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VydmljZSA9IGluamVjdChIZWxwZXJTZXJ2aWNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICByZWdpc3RlcigpO1xuICAgIHRoaXMuc2VydmljZS5pbml0aWFsaXplVmlld2VySWNvbnMoKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIHRoaXMuc2VydmljZS53YWl0VG9GaW5kRG9tKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3N3aXBlci1jb250YWluZXInKS50aGVuKCgpID0+IHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5zd2lwZXIubmF0aXZlRWxlbWVudCwge1xuICAgICAgICBtb2R1bGVzOiBbTmF2aWdhdGlvbiwgWm9vbSwgSW9uaWNTbGlkZXNdLFxuICAgICAgICBpbml0aWFsU2xpZGU6IHRoaXMuaW5kZXgsXG4gICAgICAgIHNsaWRlc1BlclZpZXc6IDEsXG4gICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgem9vbTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zd2lwZXIubmF0aXZlRWxlbWVudC5pbml0aWFsaXplKCk7XG4gICAgICB0aGlzLnN3aXBlci5uYXRpdmVFbGVtZW50LnN3aXBlci56b29tLmVuYWJsZSgpO1xuXG4gICAgICB0aGlzLnN3aXBlci5uYXRpdmVFbGVtZW50LnN3aXBlci5hY3RpdmVJbmRleCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLnN3aXBlci5uYXRpdmVFbGVtZW50LnN3aXBlci51cGRhdGUoKTtcbiAgICB9KTtcblxuICAgIHRoaXMud2F0Y2hTd2lwZSQgPSBmcm9tRXZlbnQ8VG91Y2hFdmVudD4odGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndG91Y2hzdGFydCcpXG4gICAgICAucGlwZShcbiAgICAgICAgemlwV2l0aChcbiAgICAgICAgICBmcm9tRXZlbnQ8VG91Y2hFdmVudD4odGhpcy5lbC5uYXRpdmVFbGVtZW50LCAndG91Y2hlbmQnKS5waXBlKFxuICAgICAgICAgICAgd2l0aExhdGVzdEZyb20oZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RvdWNobW92ZScpKSxcbiAgICAgICAgICApLFxuICAgICAgICApLFxuICAgICAgICB0aHJvdHRsZVRpbWUoMSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChbdG91Y2hzdGFydCwgW18sIHRvdWNobW92ZV1dKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvdWNoc3RhcnRDbGllbnRYID0gdG91Y2hzdGFydC50b3VjaGVzID8gdG91Y2hzdGFydC50b3VjaGVzWzBdLmNsaWVudFggOiAodG91Y2hzdGFydCBhcyBhbnkpLmRldGFpbFsxXS5jbGllbnRYO1xuICAgICAgICBjb25zdCB0b3VjaG1vdmVDbGllbnRYID0gdG91Y2htb3ZlLnRvdWNoZXMgPyB0b3VjaG1vdmUudG91Y2hlc1swXS5jbGllbnRYIDogKHRvdWNobW92ZSBhcyBhbnkpLmRldGFpbFsxXS5jbGllbnRYO1xuXG4gICAgICAgIGNvbnN0IHRvdWNoc3RhcnRDbGllbnRZID0gdG91Y2hzdGFydC50b3VjaGVzID8gdG91Y2hzdGFydC50b3VjaGVzWzBdLmNsaWVudFkgOiAodG91Y2hzdGFydCBhcyBhbnkpLmRldGFpbFsxXS5jbGllbnRZO1xuICAgICAgICBjb25zdCB0b3VjaG1vdmVDbGllbnRZID0gdG91Y2htb3ZlLnRvdWNoZXMgPyB0b3VjaG1vdmUudG91Y2hlc1swXS5jbGllbnRZIDogKHRvdWNobW92ZSBhcyBhbnkpLmRldGFpbFsxXS5jbGllbnRZO1xuXG4gICAgICAgIGNvbnN0IHhEaWZmID0gdG91Y2hzdGFydENsaWVudFggLSB0b3VjaG1vdmVDbGllbnRYO1xuICAgICAgICBjb25zdCB5RGlmZiA9IHRvdWNoc3RhcnRDbGllbnRZIC0gdG91Y2htb3ZlQ2xpZW50WTtcblxuICAgICAgICBjb25zdCBzbGlkZXMgPSAodGhpcy5zd2lwZXIgYXMgYW55KS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N3aXBlci1zbGlkZScpIGFzIEhUTUxFbGVtZW50W107XG4gICAgICAgIGNvbnN0IGlzWm9vbWVkID0gQXJyYXkuZnJvbShzbGlkZXMpLmZpbmQoKHNsaWRlOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbJ3N3aXBlci1zbGlkZS16b29tZWQnLCAnc3dpcGVyLXNsaWRlLWFjdGl2ZSddLmV2ZXJ5KChjKSA9PiBzbGlkZS5jbGFzc0xpc3QuY29udGFpbnMoYykpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSB0b3VjaG1vdmUudG91Y2hlcyA/IC01MCA6IC01O1xuXG4gICAgICAgIGlmICghaXNab29tZWQgJiYgTWF0aC5hYnMoeERpZmYpIDwgTWF0aC5hYnModGhyZXNob2xkKSAmJiB5RGlmZiA8IHRocmVzaG9sZCAmJiB0b3VjaHN0YXJ0LnRpbWVTdGFtcCA8PSB0b3VjaG1vdmUudGltZVN0YW1wKSB7XG4gICAgICAgICAgdGhpcy53YXRjaFN3aXBlJC51bnN1YnNjcmliZSgpO1xuICAgICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy53YXRjaFN3aXBlJCAmJiAhdGhpcy53YXRjaFN3aXBlJC5jbG9zZWQpIHtcbiAgICAgIHRoaXMud2F0Y2hTd2lwZSQudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmUoKSB7XG4gICAgdGhpcy5tb2RhbEN0cmwuZGlzbWlzcyh7IGRlbGV0ZTogdHJ1ZSB9IGFzIElQaG90b1ZpZXdlckRpc21pc3MpO1xuICB9XG59XG4iLCI8aW9uLWhlYWRlciBbdHJhbnNsdWNlbnRdPVwidHJ1ZVwiPlxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIm1vZGFsQ3RybC5kaXNtaXNzKClcIiBjbGFzcz1cInZpZXdlci1jbG9zZS1idXR0b25cIj5cbiAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiPjwvaW9uLWljb24+XG4gICAgICA8L2lvbi1idXR0b24+XG4gICAgPC9pb24tYnV0dG9ucz5cbiAgICBAaWYgKGVuYWJsZURlbGV0ZSkge1xuICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgPGlvbi1idXR0b24gY29sb3I9XCJkYW5nZXJcIiBmaWxsPVwib3V0bGluZVwiIChjbGljayk9XCJyZW1vdmUoKVwiPnt7IGRpY3Rpb25hcnkuZGVsZXRlIH19PC9pb24tYnV0dG9uPlxuICAgICAgPC9pb24tYnV0dG9ucz5cbiAgICB9XG4gIDwvaW9uLXRvb2xiYXI+XG48L2lvbi1oZWFkZXI+XG5cbjxpb24tY29udGVudCBbZnVsbHNjcmVlbl09XCJ0cnVlXCI+XG4gIDxzd2lwZXItY29udGFpbmVyICNzd2lwZXI+XG4gICAgQGZvciAodXJsIG9mIGltYWdlVXJsczsgdHJhY2sgdXJsKSB7XG4gICAgICA8c3dpcGVyLXNsaWRlPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3dpcGVyLXpvb20tY29udGFpbmVyXCI+PGltZyBbc3JjXT1cInVybFwiIGFsdD1cIlwiIFtjbGFzcy5jaXJjbGVdPVwiaXNDaXJjbGVcIiAvPjwvZGl2PlxuICAgICAgPC9zd2lwZXItc2xpZGU+XG4gICAgfVxuICA8L3N3aXBlci1jb250YWluZXI+XG48L2lvbi1jb250ZW50PlxuXG5AaWYgKGVuYWJsZUZvb3RlclNhZmVBcmVhKSB7XG4gIDwhLS0gdXNlIGZvciBzYWZlIGFyZWEtLT5cbiAgPGlvbi1mb290ZXI+XG4gICAgPGlvbi10b29sYmFyIHN0eWxlPVwiLS1ib3JkZXItd2lkdGg6IDA7IC0tbWluLWhlaWdodDogMFwiPjwvaW9uLXRvb2xiYXI+XG4gIDwvaW9uLWZvb3Rlcj5cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export var PhotoEditorErrors;
2
+ (function (PhotoEditorErrors) {
3
+ PhotoEditorErrors["initialize"] = "input dom is not found";
4
+ PhotoEditorErrors["cancel"] = "user canceled";
5
+ PhotoEditorErrors["type"] = "upload file is not image.";
6
+ })(PhotoEditorErrors || (PhotoEditorErrors = {}));
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvdG9FZGl0b3JFcnJvcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9waG90by1lZGl0b3Ivc3JjL2xpYi9waG90b0VkaXRvckVycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQU4sSUFBWSxpQkFJWDtBQUpELFdBQVksaUJBQWlCO0lBQzNCLDBEQUF1QyxDQUFBO0lBQ3ZDLDZDQUEwQixDQUFBO0lBQzFCLHVEQUFvQyxDQUFBO0FBQ3RDLENBQUMsRUFKVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBSTVCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gUGhvdG9FZGl0b3JFcnJvcnMge1xuICAnaW5pdGlhbGl6ZScgPSAnaW5wdXQgZG9tIGlzIG5vdCBmb3VuZCcsXG4gICdjYW5jZWwnID0gJ3VzZXIgY2FuY2VsZWQnLFxuICAndHlwZScgPSAndXBsb2FkIGZpbGUgaXMgbm90IGltYWdlLicsXG59XG4iXX0=
@@ -0,0 +1,44 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { addIcons } from 'ionicons';
3
+ import { checkmarkOutline, closeOutline, colorFilterOutline, cropOutline, expandOutline, refreshOutline, send, squareOutline, sunnyOutline, tabletLandscapeOutline, removeOutline, } from 'ionicons/icons';
4
+ import * as i0 from "@angular/core";
5
+ export class HelperService {
6
+ constructor() { }
7
+ initializeViewerIcons() {
8
+ addIcons({
9
+ closeOutline,
10
+ removeOutline,
11
+ });
12
+ }
13
+ initializeEditorIcons() {
14
+ addIcons({
15
+ closeOutline,
16
+ send,
17
+ cropOutline,
18
+ colorFilterOutline,
19
+ sunnyOutline,
20
+ expandOutline,
21
+ tabletLandscapeOutline,
22
+ squareOutline,
23
+ refreshOutline,
24
+ checkmarkOutline,
25
+ });
26
+ }
27
+ waitToFindDom(nativeElement, selector) {
28
+ return new Promise((resolve) => {
29
+ const interval = setInterval(() => {
30
+ const find = nativeElement.querySelector(selector);
31
+ if (find) {
32
+ clearInterval(interval);
33
+ resolve();
34
+ }
35
+ });
36
+ });
37
+ }
38
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: HelperService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
39
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: HelperService }); }
40
+ }
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: HelperService, decorators: [{
42
+ type: Injectable
43
+ }], ctorParameters: () => [] });
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9waG90by1lZGl0b3Ivc3JjL2xpYi9zZXJ2aWNlL2hlbHBlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsSUFBSSxFQUNKLGFBQWEsRUFDYixZQUFZLEVBQ1osc0JBQXNCLEVBQ3RCLGFBQWEsR0FDZCxNQUFNLGdCQUFnQixDQUFDOztBQUd4QixNQUFNLE9BQU8sYUFBYTtJQUN4QixnQkFBZSxDQUFDO0lBRWhCLHFCQUFxQjtRQUNuQixRQUFRLENBQUM7WUFDUCxZQUFZO1lBQ1osYUFBYTtTQUNkLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsUUFBUSxDQUFDO1lBQ1AsWUFBWTtZQUNaLElBQUk7WUFDSixXQUFXO1lBQ1gsa0JBQWtCO1lBQ2xCLFlBQVk7WUFDWixhQUFhO1lBQ2Isc0JBQXNCO1lBQ3RCLGFBQWE7WUFDYixjQUFjO1lBQ2QsZ0JBQWdCO1NBQ2pCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxhQUFhLENBQUMsYUFBMEIsRUFBRSxRQUFnQjtRQUN4RCxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDbkMsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbkQsSUFBSSxJQUFJLEVBQUU7b0JBQ1IsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4QixPQUFPLEVBQUUsQ0FBQztpQkFDWDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOzhHQW5DVSxhQUFhO2tIQUFiLGFBQWE7OzJGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7XG4gIGNoZWNrbWFya091dGxpbmUsXG4gIGNsb3NlT3V0bGluZSxcbiAgY29sb3JGaWx0ZXJPdXRsaW5lLFxuICBjcm9wT3V0bGluZSxcbiAgZXhwYW5kT3V0bGluZSxcbiAgcmVmcmVzaE91dGxpbmUsXG4gIHNlbmQsXG4gIHNxdWFyZU91dGxpbmUsXG4gIHN1bm55T3V0bGluZSxcbiAgdGFibGV0TGFuZHNjYXBlT3V0bGluZSxcbiAgcmVtb3ZlT3V0bGluZSxcbn0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGVscGVyU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBpbml0aWFsaXplVmlld2VySWNvbnMoKTogdm9pZCB7XG4gICAgYWRkSWNvbnMoe1xuICAgICAgY2xvc2VPdXRsaW5lLFxuICAgICAgcmVtb3ZlT3V0bGluZSxcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRpYWxpemVFZGl0b3JJY29ucygpOiB2b2lkIHtcbiAgICBhZGRJY29ucyh7XG4gICAgICBjbG9zZU91dGxpbmUsXG4gICAgICBzZW5kLFxuICAgICAgY3JvcE91dGxpbmUsXG4gICAgICBjb2xvckZpbHRlck91dGxpbmUsXG4gICAgICBzdW5ueU91dGxpbmUsXG4gICAgICBleHBhbmRPdXRsaW5lLFxuICAgICAgdGFibGV0TGFuZHNjYXBlT3V0bGluZSxcbiAgICAgIHNxdWFyZU91dGxpbmUsXG4gICAgICByZWZyZXNoT3V0bGluZSxcbiAgICAgIGNoZWNrbWFya091dGxpbmUsXG4gICAgfSk7XG4gIH1cblxuICB3YWl0VG9GaW5kRG9tKG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmluZCA9IG5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgIGlmIChmaW5kKSB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19