@ks89/angular-modal-gallery 8.0.1 → 9.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +58 -0
- package/CONTRIBUTING.md +3 -3
- package/README.md +22 -26
- package/{esm2015/ks89-angular-modal-gallery.js → esm2020/ks89-angular-modal-gallery.mjs} +0 -0
- package/{esm2015/lib/components/accessibility-default.js → esm2020/lib/components/accessibility-default.mjs} +0 -0
- package/{esm2015/lib/components/accessible.component.js → esm2020/lib/components/accessible.component.mjs} +6 -6
- package/esm2020/lib/components/carousel/carousel-previews/carousel-previews.component.mjs +462 -0
- package/esm2020/lib/components/carousel/carousel.component.mjs +747 -0
- package/{esm2015/lib/components/components.js → esm2020/lib/components/components.mjs} +0 -0
- package/esm2020/lib/components/current-image/current-image.component.mjs +616 -0
- package/esm2020/lib/components/current-image/loading-spinner/loading-spinner.component.mjs +80 -0
- package/esm2020/lib/components/dots/dots.component.mjs +127 -0
- package/{esm2015/lib/components/modal-gallery/modal-gallery-ref.js → esm2020/lib/components/modal-gallery/modal-gallery-ref.mjs} +0 -0
- package/esm2020/lib/components/modal-gallery/modal-gallery.component.mjs +524 -0
- package/esm2020/lib/components/modal-gallery/modal-gallery.service.mjs +187 -0
- package/{esm2015/lib/components/modal-gallery/modal-gallery.tokens.js → esm2020/lib/components/modal-gallery/modal-gallery.tokens.mjs} +0 -0
- package/esm2020/lib/components/plain-gallery/plain-gallery.component.mjs +249 -0
- package/esm2020/lib/components/previews/previews.component.mjs +337 -0
- package/{esm2015/lib/components/upper-buttons/upper-buttons-default.js → esm2020/lib/components/upper-buttons/upper-buttons-default.mjs} +0 -0
- package/esm2020/lib/components/upper-buttons/upper-buttons.component.mjs +249 -0
- package/{esm2015/lib/directives/a-tag-bg-image.directive.js → esm2020/lib/directives/a-tag-bg-image.directive.mjs} +3 -3
- package/{esm2015/lib/directives/click-outside.directive.js → esm2020/lib/directives/click-outside.directive.mjs} +3 -3
- package/{esm2015/lib/directives/description.directive.js → esm2020/lib/directives/description.directive.mjs} +3 -3
- package/{esm2015/lib/directives/direction.directive.js → esm2020/lib/directives/direction.directive.mjs} +3 -3
- package/{esm2015/lib/directives/directives.js → esm2020/lib/directives/directives.mjs} +0 -0
- package/{esm2015/lib/directives/fallback-image.directive.js → esm2020/lib/directives/fallback-image.directive.mjs} +3 -3
- package/{esm2015/lib/directives/keyboard-navigation.directive.js → esm2020/lib/directives/keyboard-navigation.directive.mjs} +5 -5
- package/{esm2015/lib/directives/margin.directive.js → esm2020/lib/directives/margin.directive.mjs} +3 -3
- package/{esm2015/lib/directives/max-size.directive.js → esm2020/lib/directives/max-size.directive.mjs} +3 -3
- package/{esm2015/lib/directives/size.directive.js → esm2020/lib/directives/size.directive.mjs} +3 -3
- package/{esm2015/lib/directives/wrap.directive.js → esm2020/lib/directives/wrap.directive.mjs} +3 -3
- package/{esm2015/lib/modal-gallery.module.js → esm2020/lib/modal-gallery.module.mjs} +7 -7
- package/{esm2015/lib/model/accessibility.interface.js → esm2020/lib/model/accessibility.interface.mjs} +0 -0
- package/{esm2015/lib/model/action.enum.js → esm2020/lib/model/action.enum.mjs} +0 -0
- package/{esm2015/lib/model/buttons-config.interface.js → esm2020/lib/model/buttons-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/carousel-config.interface.js → esm2020/lib/model/carousel-config.interface.mjs} +1 -1
- package/{esm2015/lib/model/carousel-image-config.interface.js → esm2020/lib/model/carousel-image-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/carousel-preview-config.interface.js → esm2020/lib/model/carousel-preview-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/current-image-config.interface.js → esm2020/lib/model/current-image-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/description.interface.js → esm2020/lib/model/description.interface.mjs} +0 -0
- package/{esm2015/lib/model/dots-config.interface.js → esm2020/lib/model/dots-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/image-internal.class.js → esm2020/lib/model/image-internal.class.mjs} +0 -0
- package/{esm2015/lib/model/image.class.js → esm2020/lib/model/image.class.mjs} +0 -0
- package/{esm2015/lib/model/interaction-event.interface.js → esm2020/lib/model/interaction-event.interface.mjs} +0 -0
- package/{esm2015/lib/model/keyboard-config.interface.js → esm2020/lib/model/keyboard-config.interface.mjs} +1 -1
- package/{esm2015/lib/model/keyboard-service-config.interface.js → esm2020/lib/model/keyboard-service-config.interface.mjs} +0 -0
- package/esm2020/lib/model/keyboard.enum.mjs +35 -0
- package/{esm2015/lib/model/lib-config.interface.js → esm2020/lib/model/lib-config.interface.mjs} +1 -1
- package/{esm2015/lib/model/loading-config.interface.js → esm2020/lib/model/loading-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/max-size.interface.js → esm2020/lib/model/max-size.interface.mjs} +0 -0
- package/{esm2015/lib/model/modal-gallery-config.interface.js → esm2020/lib/model/modal-gallery-config.interface.mjs} +1 -1
- package/esm2020/lib/model/plain-gallery-config.interface.mjs +55 -0
- package/{esm2015/lib/model/play-config.interface.js → esm2020/lib/model/play-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/preview-config.interface.js → esm2020/lib/model/preview-config.interface.mjs} +0 -0
- package/{esm2015/lib/model/size.interface.js → esm2020/lib/model/size.interface.mjs} +0 -0
- package/{esm2015/lib/model/slide-config.interface.js → esm2020/lib/model/slide-config.interface.mjs} +0 -0
- package/esm2020/lib/services/config.service.mjs +396 -0
- package/{esm2015/lib/services/id-validator.service.js → esm2020/lib/services/id-validator.service.mjs} +3 -3
- package/{esm2015/lib/services/keyboard.service.js → esm2020/lib/services/keyboard.service.mjs} +3 -3
- package/{esm2015/lib/utils/image.util.js → esm2020/lib/utils/image.util.mjs} +0 -0
- package/esm2020/lib/utils/user-input.util.mjs +104 -0
- package/esm2020/public-api.mjs +42 -0
- package/fesm2015/ks89-angular-modal-gallery.mjs +5788 -0
- package/fesm2015/ks89-angular-modal-gallery.mjs.map +1 -0
- package/{fesm2015/ks89-angular-modal-gallery.js → fesm2020/ks89-angular-modal-gallery.mjs} +270 -432
- package/fesm2020/ks89-angular-modal-gallery.mjs.map +1 -0
- package/lib/components/accessible.component.d.ts +2 -2
- package/lib/components/carousel/carousel-previews/carousel-previews.component.d.ts +0 -7
- package/lib/components/carousel/carousel.component.d.ts +25 -67
- package/lib/components/current-image/current-image.component.d.ts +3 -3
- package/lib/components/modal-gallery/modal-gallery.component.d.ts +8 -21
- package/lib/components/modal-gallery/modal-gallery.service.d.ts +1 -0
- package/lib/components/plain-gallery/plain-gallery.component.d.ts +6 -10
- package/lib/components/previews/previews.component.d.ts +9 -2
- package/lib/directives/keyboard-navigation.directive.d.ts +1 -1
- package/lib/model/carousel-config.interface.d.ts +0 -1
- package/lib/model/keyboard-config.interface.d.ts +4 -4
- package/lib/model/keyboard.enum.d.ts +11 -8
- package/lib/model/lib-config.interface.d.ts +20 -7
- package/lib/model/modal-gallery-config.interface.d.ts +10 -2
- package/lib/model/plain-gallery-config.interface.d.ts +1 -9
- package/lib/utils/user-input.util.d.ts +35 -26
- package/package.json +27 -14
- package/public-api.d.ts +2 -2
- package/bundles/ks89-angular-modal-gallery.umd.js +0 -6221
- package/bundles/ks89-angular-modal-gallery.umd.js.map +0 -1
- package/esm2015/lib/components/carousel/carousel-previews/carousel-previews.component.js +0 -480
- package/esm2015/lib/components/carousel/carousel.component.js +0 -800
- package/esm2015/lib/components/current-image/current-image.component.js +0 -621
- package/esm2015/lib/components/current-image/loading-spinner/loading-spinner.component.js +0 -93
- package/esm2015/lib/components/dots/dots.component.js +0 -132
- package/esm2015/lib/components/modal-gallery/modal-gallery.component.js +0 -576
- package/esm2015/lib/components/modal-gallery/modal-gallery.service.js +0 -186
- package/esm2015/lib/components/plain-gallery/plain-gallery.component.js +0 -259
- package/esm2015/lib/components/previews/previews.component.js +0 -337
- package/esm2015/lib/components/upper-buttons/upper-buttons.component.js +0 -254
- package/esm2015/lib/model/keyboard.enum.js +0 -35
- package/esm2015/lib/model/plain-gallery-config.interface.js +0 -64
- package/esm2015/lib/services/config.service.js +0 -395
- package/esm2015/lib/utils/user-input.util.js +0 -95
- package/esm2015/public-api.js +0 -42
- package/fesm2015/ks89-angular-modal-gallery.js.map +0 -1
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
/*
|
|
2
|
+
The MIT License (MIT)
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2017-2021 Stefano Cappa (Ks89)
|
|
5
|
+
|
|
6
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
8
|
+
in the Software without restriction, including without limitation the rights
|
|
9
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
10
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
11
|
+
furnished to do so, subject to the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be included in all
|
|
14
|
+
copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
18
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL THE
|
|
19
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
20
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
21
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
22
|
+
SOFTWARE.
|
|
23
|
+
*/
|
|
24
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, HostBinding, Input, Output } from '@angular/core';
|
|
25
|
+
import { Breakpoints } from '@angular/cdk/layout';
|
|
26
|
+
import { AccessibleComponent } from '../../accessible.component';
|
|
27
|
+
import { NEXT, PREV } from '../../../utils/user-input.util';
|
|
28
|
+
import { getIndex } from '../../../utils/image.util';
|
|
29
|
+
import { Action } from '../../../model/action.enum';
|
|
30
|
+
import * as i0 from "@angular/core";
|
|
31
|
+
import * as i1 from "@angular/cdk/layout";
|
|
32
|
+
import * as i2 from "@angular/platform-browser";
|
|
33
|
+
import * as i3 from "../../../services/config.service";
|
|
34
|
+
import * as i4 from "@angular/common";
|
|
35
|
+
import * as i5 from "../../../directives/fallback-image.directive";
|
|
36
|
+
import * as i6 from "../../../directives/size.directive";
|
|
37
|
+
/**
|
|
38
|
+
* Default max height of previews.
|
|
39
|
+
*/
|
|
40
|
+
const DEFAULT_MAX_HEIGHT = '200px';
|
|
41
|
+
/**
|
|
42
|
+
* Component with image previews for carousel
|
|
43
|
+
*/
|
|
44
|
+
export class CarouselPreviewsComponent extends AccessibleComponent {
|
|
45
|
+
constructor(ref, breakpointObserver,
|
|
46
|
+
// sanitizer is used only to sanitize style before add it to background property when legacyIE11Mode is enabled
|
|
47
|
+
sanitizer, configService) {
|
|
48
|
+
super();
|
|
49
|
+
this.ref = ref;
|
|
50
|
+
this.breakpointObserver = breakpointObserver;
|
|
51
|
+
this.sanitizer = sanitizer;
|
|
52
|
+
this.configService = configService;
|
|
53
|
+
/**
|
|
54
|
+
* Variable to change the max-width of the host component
|
|
55
|
+
*/
|
|
56
|
+
this.hostMaxWidth = '100%';
|
|
57
|
+
/**
|
|
58
|
+
* Variable to set aria-label of the host component
|
|
59
|
+
*/
|
|
60
|
+
this.ariaLabel = `Carousel previews`;
|
|
61
|
+
/**
|
|
62
|
+
* Output to emit the clicked preview. The payload contains the `InternalLibImage` associated to the clicked preview.
|
|
63
|
+
*/
|
|
64
|
+
this.clickPreview = new EventEmitter();
|
|
65
|
+
/**
|
|
66
|
+
* Enum of type `Action` that represents a mouse click on a button.
|
|
67
|
+
* Declared here to be used inside the template.
|
|
68
|
+
*/
|
|
69
|
+
this.clickAction = Action.CLICK;
|
|
70
|
+
/**
|
|
71
|
+
* Enum of type `Action` that represents a keyboard action.
|
|
72
|
+
* Declared here to be used inside the template.
|
|
73
|
+
*/
|
|
74
|
+
this.keyboardAction = Action.KEYBOARD;
|
|
75
|
+
/**
|
|
76
|
+
* Array of `InternalLibImage` exposed to the template. This field is initialized
|
|
77
|
+
* applying transformations, default values and so on to the input of the same type.
|
|
78
|
+
*/
|
|
79
|
+
this.previews = [];
|
|
80
|
+
/**
|
|
81
|
+
* Variable with the preview's maxHeight
|
|
82
|
+
*/
|
|
83
|
+
this.previewMaxHeight = DEFAULT_MAX_HEIGHT;
|
|
84
|
+
// listen for width changes and update preview heights accordingly
|
|
85
|
+
this.breakpointSubscription = breakpointObserver
|
|
86
|
+
.observe([Breakpoints.XSmall, Breakpoints.Small, Breakpoints.Medium, Breakpoints.Large, Breakpoints.XLarge])
|
|
87
|
+
.subscribe((result) => {
|
|
88
|
+
if (!this.previewConfig || !this.previewConfig.breakpoints) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (result.breakpoints[Breakpoints.XSmall]) {
|
|
92
|
+
this.updateHeight(this.previewConfig.breakpoints.xSmall);
|
|
93
|
+
}
|
|
94
|
+
else if (result.breakpoints[Breakpoints.Small]) {
|
|
95
|
+
this.updateHeight(this.previewConfig.breakpoints.small);
|
|
96
|
+
}
|
|
97
|
+
else if (result.breakpoints[Breakpoints.Medium]) {
|
|
98
|
+
this.updateHeight(this.previewConfig.breakpoints.medium);
|
|
99
|
+
}
|
|
100
|
+
else if (result.breakpoints[Breakpoints.Large]) {
|
|
101
|
+
this.updateHeight(this.previewConfig.breakpoints.large);
|
|
102
|
+
}
|
|
103
|
+
else if (result.breakpoints[Breakpoints.XLarge]) {
|
|
104
|
+
this.updateHeight(this.previewConfig.breakpoints.xLarge);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Method to update the height of previews, passing the desired height as input.
|
|
110
|
+
* @param configBreakpointHeight is a number that represent the desired height to set.
|
|
111
|
+
*/
|
|
112
|
+
updateHeight(configBreakpointHeight) {
|
|
113
|
+
if (this.previewConfig && this.previewConfig.maxHeight) {
|
|
114
|
+
const heightNum = +this.previewConfig.maxHeight.replace('/px/g', '').replace('/%/g', '');
|
|
115
|
+
this.previewMaxHeight = Math.min(configBreakpointHeight, heightNum) + 'px';
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const heightNum = +DEFAULT_MAX_HEIGHT.replace('/px/g', '').replace('/%/g', '');
|
|
119
|
+
this.previewMaxHeight = Math.min(configBreakpointHeight, heightNum) + 'px';
|
|
120
|
+
}
|
|
121
|
+
this.ref.markForCheck();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Method ´ngOnInit´ to build `configPreview` applying a default value and also to
|
|
125
|
+
* init the `previews` array.
|
|
126
|
+
* This is an Angular's lifecycle hook, so its called automatically by Angular itself.
|
|
127
|
+
* In particular, it's called only one time!!!
|
|
128
|
+
*/
|
|
129
|
+
ngOnInit() {
|
|
130
|
+
const libConfig = this.configService.getConfig(this.id);
|
|
131
|
+
if (!libConfig) {
|
|
132
|
+
throw new Error('Internal library error - libConfig must be defined');
|
|
133
|
+
}
|
|
134
|
+
this.carouselConfig = libConfig.carouselConfig;
|
|
135
|
+
this.previewConfig = libConfig.carouselPreviewsConfig;
|
|
136
|
+
this.accessibilityConfig = libConfig.accessibilityConfig;
|
|
137
|
+
if (!this.previewConfig || !this.previewConfig.maxHeight || !this.previewConfig.breakpoints) {
|
|
138
|
+
throw new Error('Internal library error - previewConfig must be defined');
|
|
139
|
+
}
|
|
140
|
+
// change the max-width of this component if there is a specified width !== 100% in carouselConfig
|
|
141
|
+
if (this.carouselConfig && this.carouselConfig.maxWidth !== '100%') {
|
|
142
|
+
this.hostMaxWidth = this.carouselConfig.maxWidth;
|
|
143
|
+
}
|
|
144
|
+
this.previewMaxHeight = this.previewConfig.maxHeight;
|
|
145
|
+
// init previews based on currentImage and the full array of images
|
|
146
|
+
this.initPreviews(this.currentImage, this.images);
|
|
147
|
+
// apply custom height based on responsive breakpoints
|
|
148
|
+
// This is required, because the breakpointSubscription is not triggered at creation,
|
|
149
|
+
// but only when the width changes
|
|
150
|
+
const isXsmallScreen = this.breakpointObserver.isMatched(Breakpoints.XSmall);
|
|
151
|
+
const isSmallScreen = this.breakpointObserver.isMatched(Breakpoints.Small);
|
|
152
|
+
const isMediumScreen = this.breakpointObserver.isMatched(Breakpoints.Medium);
|
|
153
|
+
const isLargeScreen = this.breakpointObserver.isMatched(Breakpoints.Large);
|
|
154
|
+
const isxLargeScreen = this.breakpointObserver.isMatched(Breakpoints.XLarge);
|
|
155
|
+
if (isXsmallScreen) {
|
|
156
|
+
this.updateHeight(this.previewConfig.breakpoints.xSmall);
|
|
157
|
+
}
|
|
158
|
+
else if (isSmallScreen) {
|
|
159
|
+
this.updateHeight(this.previewConfig.breakpoints.small);
|
|
160
|
+
}
|
|
161
|
+
else if (isMediumScreen) {
|
|
162
|
+
this.updateHeight(this.previewConfig.breakpoints.medium);
|
|
163
|
+
}
|
|
164
|
+
else if (isLargeScreen) {
|
|
165
|
+
this.updateHeight(this.previewConfig.breakpoints.large);
|
|
166
|
+
}
|
|
167
|
+
else if (isxLargeScreen) {
|
|
168
|
+
this.updateHeight(this.previewConfig.breakpoints.xLarge);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Method to check if an image is active (i.e. a preview image).
|
|
173
|
+
* @param InternalLibImage preview is an image to check if it's active or not
|
|
174
|
+
* @returns boolean true if is active, false otherwise
|
|
175
|
+
*/
|
|
176
|
+
isActive(preview) {
|
|
177
|
+
if (!preview || !this.currentImage) {
|
|
178
|
+
return false;
|
|
179
|
+
}
|
|
180
|
+
return preview.id === this.currentImage.id;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Method ´ngOnChanges´ to update `previews` array.
|
|
184
|
+
* Also, both `start` and `end` local variables will be updated accordingly.
|
|
185
|
+
* This is an Angular's lifecycle hook, so its called automatically by Angular itself.
|
|
186
|
+
* In particular, it's called when any data-bound property of a directive changes!!!
|
|
187
|
+
*/
|
|
188
|
+
ngOnChanges(changes) {
|
|
189
|
+
const simpleChange = changes.currentImage;
|
|
190
|
+
if (!simpleChange) {
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const prev = simpleChange.previousValue;
|
|
194
|
+
const current = simpleChange.currentValue;
|
|
195
|
+
if (current && changes.images && changes.images.previousValue && changes.images.currentValue) {
|
|
196
|
+
// I'm in this if statement, if input images are changed (for instance, because I removed one of them with the 'delete button',
|
|
197
|
+
// or because users changed the images array while modal gallery is still open).
|
|
198
|
+
// In this case, I have to re-init previews, because the input array of images is changed.
|
|
199
|
+
this.initPreviews(current, changes.images.currentValue);
|
|
200
|
+
}
|
|
201
|
+
if (prev && current && prev.id !== current.id) {
|
|
202
|
+
// to manage infinite sliding I have to reset both `start` and `end` at the beginning
|
|
203
|
+
// to show again previews from the first image.
|
|
204
|
+
// This happens when you navigate over the last image to return to the first one
|
|
205
|
+
let prevIndex;
|
|
206
|
+
let currentIndex;
|
|
207
|
+
try {
|
|
208
|
+
prevIndex = getIndex(prev, this.images);
|
|
209
|
+
currentIndex = getIndex(current, this.images);
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
console.error('Cannot get previous and current image indexes in previews');
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
215
|
+
// apply a formula to get a values to be used to decide if go next, return back or stay without doing anything
|
|
216
|
+
const calc = Math.floor((this.end - this.start) / 2) + this.start;
|
|
217
|
+
if (prevIndex === this.images.length - 1 && currentIndex === 0) {
|
|
218
|
+
// first image
|
|
219
|
+
this.setBeginningIndexesPreviews();
|
|
220
|
+
this.previews = this.images.filter((img, i) => i >= this.start && i < this.end);
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
// the same for the opposite case, when you navigate back from the fist image to go to the last one.
|
|
224
|
+
if (prevIndex === 0 && currentIndex === this.images.length - 1) {
|
|
225
|
+
// last image
|
|
226
|
+
this.setEndIndexesPreviews();
|
|
227
|
+
this.previews = this.images.filter((img, i) => i >= this.start && i < this.end);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (this.previewConfig && this.previewConfig.number % 2 === 0) {
|
|
231
|
+
if (calc > currentIndex) {
|
|
232
|
+
this.previous();
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
this.next();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
if (calc > currentIndex) {
|
|
240
|
+
this.previous();
|
|
241
|
+
}
|
|
242
|
+
if (calc < currentIndex) {
|
|
243
|
+
this.next();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Method called by events from both keyboard and mouse on a preview.
|
|
250
|
+
* This will trigger the `clickpreview` output with the input preview as its payload.
|
|
251
|
+
* @param InternalLibImage preview that triggered this method
|
|
252
|
+
* @param KeyboardEvent | MouseEvent event payload
|
|
253
|
+
* @param Action that triggered this event (Action.NORMAL by default)
|
|
254
|
+
*/
|
|
255
|
+
onImageEvent(preview, event, action = Action.NORMAL) {
|
|
256
|
+
if (!this.previewConfig || !this.previewConfig.clickable) {
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const clickedImageIndex = this.images.indexOf(preview);
|
|
260
|
+
const result = super.handleImageEvent(event);
|
|
261
|
+
if (result === NEXT) {
|
|
262
|
+
this.clickPreview.emit({ action, result: clickedImageIndex });
|
|
263
|
+
}
|
|
264
|
+
else if (result === PREV) {
|
|
265
|
+
this.clickPreview.emit({ action, result: clickedImageIndex });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Method called by events from both keyboard and mouse on a navigation arrow.
|
|
270
|
+
* @param string direction of the navigation that can be either 'next' or 'prev'
|
|
271
|
+
* @param KeyboardEvent | MouseEvent event payload
|
|
272
|
+
*/
|
|
273
|
+
onNavigationEvent(direction, event) {
|
|
274
|
+
const result = super.handleNavigationEvent(direction, event);
|
|
275
|
+
if (result === NEXT) {
|
|
276
|
+
this.next();
|
|
277
|
+
}
|
|
278
|
+
else if (result === PREV) {
|
|
279
|
+
this.previous();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Method to get aria-label text for a preview image.
|
|
284
|
+
* @param Image is the preview
|
|
285
|
+
*/
|
|
286
|
+
getAriaLabel(preview) {
|
|
287
|
+
if (!preview.plain) {
|
|
288
|
+
return preview.modal.ariaLabel || '';
|
|
289
|
+
}
|
|
290
|
+
return preview.plain.ariaLabel || preview.modal.ariaLabel || '';
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Method to get title text for a preview image.
|
|
294
|
+
* @param Image is the preview
|
|
295
|
+
*/
|
|
296
|
+
getTitle(preview) {
|
|
297
|
+
if (!preview.plain) {
|
|
298
|
+
return preview.modal.title || '';
|
|
299
|
+
}
|
|
300
|
+
return preview.plain.title || preview.modal.title || '';
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Method to get alt text for a preview image.
|
|
304
|
+
* @param Image is the preview
|
|
305
|
+
*/
|
|
306
|
+
getAlt(preview) {
|
|
307
|
+
if (!preview.plain) {
|
|
308
|
+
return preview.modal.alt || '';
|
|
309
|
+
}
|
|
310
|
+
return preview.plain.alt || preview.modal.alt || '';
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Method used in the template to track ids in ngFor.
|
|
314
|
+
* @param number index of the array
|
|
315
|
+
* @param Image item of the array
|
|
316
|
+
* @returns number the id of the item
|
|
317
|
+
*/
|
|
318
|
+
trackById(index, item) {
|
|
319
|
+
return item.id;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Method used in template to sanitize an url when you need legacyIE11Mode.
|
|
323
|
+
* In this way you can set an url as background of a div.
|
|
324
|
+
* @param unsafeStyle is a string or a SafeResourceUrl that represents the url to sanitize.
|
|
325
|
+
* @param unsafeStyleFallback is a string or a SafeResourceUrl that represents the fallback url to sanitize.
|
|
326
|
+
* @returns a SafeStyle object that can be used in template without problems.
|
|
327
|
+
*/
|
|
328
|
+
sanitizeUrlBgStyle(unsafeStyle, unsafeStyleFallback) {
|
|
329
|
+
// Method used only to sanitize background-image style before add it to background property when legacyIE11Mode is enabled
|
|
330
|
+
let bg = 'url(' + unsafeStyle + ')';
|
|
331
|
+
if (!!unsafeStyleFallback) {
|
|
332
|
+
// if a fallback image is defined, append it. In this way, it will be used by the browser as fallback.
|
|
333
|
+
bg += ', ' + 'url(' + unsafeStyleFallback + ')';
|
|
334
|
+
}
|
|
335
|
+
return this.sanitizer.bypassSecurityTrustStyle(bg);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Method to cleanup resources. In fact, it cleans breakpointSubscription.
|
|
339
|
+
* This is an Angular's lifecycle hook that is called when this component is destroyed.
|
|
340
|
+
*/
|
|
341
|
+
ngOnDestroy() {
|
|
342
|
+
if (this.breakpointSubscription) {
|
|
343
|
+
this.breakpointSubscription.unsubscribe();
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Private method to init previews based on the currentImage and the full array of images.
|
|
348
|
+
* The current image in mandatory to show always the current preview (as highlighted).
|
|
349
|
+
* @param InternalLibImage currentImage to decide how to show previews, because I always want to see the current image as highlighted
|
|
350
|
+
* @param InternalLibImage[] images is the array of all images.
|
|
351
|
+
*/
|
|
352
|
+
initPreviews(currentImage, images) {
|
|
353
|
+
let index;
|
|
354
|
+
try {
|
|
355
|
+
index = getIndex(currentImage, images);
|
|
356
|
+
}
|
|
357
|
+
catch (err) {
|
|
358
|
+
throw err;
|
|
359
|
+
}
|
|
360
|
+
switch (index) {
|
|
361
|
+
case 0:
|
|
362
|
+
// first image
|
|
363
|
+
this.setBeginningIndexesPreviews();
|
|
364
|
+
break;
|
|
365
|
+
case images.length - 1:
|
|
366
|
+
// last image
|
|
367
|
+
this.setEndIndexesPreviews();
|
|
368
|
+
break;
|
|
369
|
+
// default:
|
|
370
|
+
// // other images
|
|
371
|
+
// // TODO unused because it starts always at image 0
|
|
372
|
+
// this.setIndexesPreviews();
|
|
373
|
+
// break;
|
|
374
|
+
}
|
|
375
|
+
this.previews = images.filter((img, i) => i >= this.start && i < this.end);
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Private method to init both `start` and `end` to the beginning.
|
|
379
|
+
*/
|
|
380
|
+
setBeginningIndexesPreviews() {
|
|
381
|
+
if (!this.previewConfig || this.previewConfig.number === undefined) {
|
|
382
|
+
throw new Error('Internal library error - previewConfig and number must be defined');
|
|
383
|
+
}
|
|
384
|
+
this.start = 0;
|
|
385
|
+
this.end = Math.min(this.previewConfig.number, this.images.length);
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Private method to init both `start` and `end` to the end.
|
|
389
|
+
*/
|
|
390
|
+
setEndIndexesPreviews() {
|
|
391
|
+
if (!this.previewConfig || this.previewConfig.number === undefined) {
|
|
392
|
+
throw new Error('Internal library error - previewConfig and number must be defined');
|
|
393
|
+
}
|
|
394
|
+
this.start = this.images.length - 1 - (this.previewConfig.number - 1);
|
|
395
|
+
this.end = this.images.length;
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Private method to update the visible previews navigating to the right (next).
|
|
399
|
+
*/
|
|
400
|
+
next() {
|
|
401
|
+
// check if nextImage should be blocked
|
|
402
|
+
if (this.isPreventSliding(this.images.length - 1)) {
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (this.end === this.images.length) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
this.start++;
|
|
409
|
+
this.end = Math.min(this.end + 1, this.images.length);
|
|
410
|
+
this.previews = this.images.filter((img, i) => i >= this.start && i < this.end);
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Private method to update the visible previews navigating to the left (previous).
|
|
414
|
+
*/
|
|
415
|
+
previous() {
|
|
416
|
+
// check if prevImage should be blocked
|
|
417
|
+
if (this.isPreventSliding(0)) {
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
if (this.start === 0) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
this.start = Math.max(this.start - 1, 0);
|
|
424
|
+
this.end = Math.min(this.end - 1, this.images.length);
|
|
425
|
+
this.previews = this.images.filter((img, i) => i >= this.start && i < this.end);
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Private method to block/permit sliding between previews.
|
|
429
|
+
* @param number boundaryIndex is the first or the last index of `images` input array
|
|
430
|
+
* @returns boolean if true block sliding, otherwise not
|
|
431
|
+
*/
|
|
432
|
+
isPreventSliding(boundaryIndex) {
|
|
433
|
+
return getIndex(this.currentImage, this.images) === boundaryIndex;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
CarouselPreviewsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CarouselPreviewsComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.BreakpointObserver }, { token: i2.DomSanitizer }, { token: i3.ConfigService }], target: i0.ɵɵFactoryTarget.Component });
|
|
437
|
+
CarouselPreviewsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.0.0", type: CarouselPreviewsComponent, selector: "ks-carousel-previews", inputs: { id: "id", currentImage: "currentImage", images: "images" }, outputs: { clickPreview: "clickPreview" }, host: { properties: { "style.max-width": "this.hostMaxWidth", "attr.aria-label": "this.ariaLabel" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<nav *ngIf=\"previewConfig?.visible\"\n class=\"previews-container\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewsContainerAriaLabel\"\n [title]=\"accessibilityConfig?.carouselPreviewsContainerTitle\">\n\n <a class=\"nav-left\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewScrollPrevAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && start > 0 ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event)\" (keyup)=\"onNavigationEvent('left', $event)\">\n <div class=\"inside {{previewConfig?.arrows && start > 0 ? 'left-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.carouselPreviewScrollPrevTitle\"></div>\n </a>\n\n <div class=\"preview-inner-container\">\n <ng-container *ngFor=\"let preview of previews; trackBy: trackById; let index = index\">\n <img *ngIf=\"preview?.modal?.img\"\n class=\"inside preview-image{{isActive(preview) ? ' active' : ''}}{{!previewConfig?.clickable ? ' unclickable' : ''}}\"\n [src]=\"preview.plain?.img ? preview.plain?.img : preview.modal.img\"\n ksFallbackImage [fallbackImg]=\"preview.plain?.fallbackImg ? preview.plain?.fallbackImg : preview.modal.fallbackImg\"\n ksSize [sizeConfig]=\"{width: previewConfig?.width!,\n height: previewMaxHeight}\"\n [attr.aria-label]=\"getAriaLabel(preview)\"\n [title]=\"getTitle(preview)\"\n alt=\"{{getAlt(preview)}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onImageEvent(preview, $event, clickAction)\" (keyup)=\"onImageEvent(preview, $event, keyboardAction)\"/>\n </ng-container>\n </div>\n\n <a class=\"nav-right\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewScrollNextAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && end < images.length ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event)\" (keyup)=\"onNavigationEvent('right', $event)\">\n <div class=\"inside {{previewConfig?.arrows && end < images.length ? 'right-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.carouselPreviewScrollNextTitle\"></div>\n </a>\n\n</nav>\n", styles: [":host{position:relative;margin-top:3px;margin-bottom:3px;width:100%}.previews-container{align-items:center;animation:fadein-semi-visible08 .8s;display:flex;flex-direction:row;justify-content:center;margin-bottom:0}.previews-container>.preview-inner-container{display:flex;flex-direction:row;justify-content:center;align-items:center;flex-wrap:nowrap;width:100%}.previews-container>.preview-inner-container>.preview-image{cursor:pointer;object-fit:cover}.previews-container>.preview-inner-container>.preview-image.unclickable{cursor:not-allowed}.previews-container .nav,.previews-container>.nav-right,.previews-container>.nav-left{position:absolute;top:calc(50% - 7px);color:#919191;z-index:1000;cursor:pointer;transition:all .5s}.previews-container .nav:hover,.previews-container>.nav-right:hover,.previews-container>.nav-left:hover{transform:scale(1.1)}.previews-container>.nav-left{margin-right:10px;left:10px}.previews-container>.nav-left>.left-arrow-preview-image{opacity:1}.previews-container>.nav-right{margin-left:10px;right:10px}.previews-container>.nav-right>.right-arrow-preview-image{opacity:1}\n", ".arrow-preview-image,.right-arrow-preview-image,.left-arrow-preview-image,.empty-arrow-preview-image{width:15px;height:15px;opacity:.5}.empty-arrow-preview-image{background:black;opacity:0}.left-arrow-preview-image{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ3Ny4xNzUgNDc3LjE3NSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDc3LjE3NSA0NzcuMTc1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij48Zz48cGF0aCBkPSJNMTQ1LjE4OCwyMzguNTc1bDIxNS41LTIxNS41YzUuMy01LjMsNS4zLTEzLjgsMC0xOS4xcy0xMy44LTUuMy0xOS4xLDBsLTIyNS4xLDIyNS4xYy01LjMsNS4zLTUuMywxMy44LDAsMTkuMWwyMjUuMSwyMjUgICBjMi42LDIuNiw2LjEsNCw5LjUsNHM2LjktMS4zLDkuNS00YzUuMy01LjMsNS4zLTEzLjgsMC0xOS4xTDE0NS4xODgsMjM4LjU3NXoiIGZpbGw9IiNGRkZGRkYiLz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PC9zdmc+);background-size:15px;transition:all .5s}.left-arrow-preview-image:hover{transform:scale(1.2)}.right-arrow-preview-image{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ3Ny4xNzUgNDc3LjE3NSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDc3LjE3NSA0NzcuMTc1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij48Zz48cGF0aCBkPSJNMzYwLjczMSwyMjkuMDc1bC0yMjUuMS0yMjUuMWMtNS4zLTUuMy0xMy44LTUuMy0xOS4xLDBzLTUuMywxMy44LDAsMTkuMWwyMTUuNSwyMTUuNWwtMjE1LjUsMjE1LjUgICBjLTUuMyw1LjMtNS4zLDEzLjgsMCwxOS4xYzIuNiwyLjYsNi4xLDQsOS41LDRjMy40LDAsNi45LTEuMyw5LjUtNGwyMjUuMS0yMjUuMUMzNjUuOTMxLDI0Mi44NzUsMzY1LjkzMSwyMzQuMjc1LDM2MC43MzEsMjI5LjA3NXogICAiIGZpbGw9IiNGRkZGRkYiLz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PC9zdmc+);background-size:15px;transition:all .5s}.right-arrow-preview-image:hover{transform:scale(1.2)}\n"], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i5.FallbackImageDirective, selector: "[ksFallbackImage]", inputs: ["fallbackImg"], outputs: ["fallbackApplied"] }, { type: i6.SizeDirective, selector: "[ksSize]", inputs: ["sizeConfig"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
438
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: CarouselPreviewsComponent, decorators: [{
|
|
439
|
+
type: Component,
|
|
440
|
+
args: [{ selector: 'ks-carousel-previews', changeDetection: ChangeDetectionStrategy.OnPush, template: "<nav *ngIf=\"previewConfig?.visible\"\n class=\"previews-container\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewsContainerAriaLabel\"\n [title]=\"accessibilityConfig?.carouselPreviewsContainerTitle\">\n\n <a class=\"nav-left\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewScrollPrevAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && start > 0 ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('left', $event)\" (keyup)=\"onNavigationEvent('left', $event)\">\n <div class=\"inside {{previewConfig?.arrows && start > 0 ? 'left-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.carouselPreviewScrollPrevTitle\"></div>\n </a>\n\n <div class=\"preview-inner-container\">\n <ng-container *ngFor=\"let preview of previews; trackBy: trackById; let index = index\">\n <img *ngIf=\"preview?.modal?.img\"\n class=\"inside preview-image{{isActive(preview) ? ' active' : ''}}{{!previewConfig?.clickable ? ' unclickable' : ''}}\"\n [src]=\"preview.plain?.img ? preview.plain?.img : preview.modal.img\"\n ksFallbackImage [fallbackImg]=\"preview.plain?.fallbackImg ? preview.plain?.fallbackImg : preview.modal.fallbackImg\"\n ksSize [sizeConfig]=\"{width: previewConfig?.width!,\n height: previewMaxHeight}\"\n [attr.aria-label]=\"getAriaLabel(preview)\"\n [title]=\"getTitle(preview)\"\n alt=\"{{getAlt(preview)}}\"\n [tabIndex]=\"0\" role=\"img\"\n (click)=\"onImageEvent(preview, $event, clickAction)\" (keyup)=\"onImageEvent(preview, $event, keyboardAction)\"/>\n </ng-container>\n </div>\n\n <a class=\"nav-right\"\n [attr.aria-label]=\"accessibilityConfig?.carouselPreviewScrollNextAriaLabel\"\n [tabIndex]=\"previewConfig?.arrows && end < images.length ? 0 : -1\" role=\"button\"\n (click)=\"onNavigationEvent('right', $event)\" (keyup)=\"onNavigationEvent('right', $event)\">\n <div class=\"inside {{previewConfig?.arrows && end < images.length ? 'right-arrow-preview-image' : 'empty-arrow-preview-image'}}\"\n aria-hidden=\"true\"\n [title]=\"accessibilityConfig?.carouselPreviewScrollNextTitle\"></div>\n </a>\n\n</nav>\n", styles: [":host{position:relative;margin-top:3px;margin-bottom:3px;width:100%}.previews-container{align-items:center;animation:fadein-semi-visible08 .8s;display:flex;flex-direction:row;justify-content:center;margin-bottom:0}.previews-container>.preview-inner-container{display:flex;flex-direction:row;justify-content:center;align-items:center;flex-wrap:nowrap;width:100%}.previews-container>.preview-inner-container>.preview-image{cursor:pointer;object-fit:cover}.previews-container>.preview-inner-container>.preview-image.unclickable{cursor:not-allowed}.previews-container .nav,.previews-container>.nav-right,.previews-container>.nav-left{position:absolute;top:calc(50% - 7px);color:#919191;z-index:1000;cursor:pointer;transition:all .5s}.previews-container .nav:hover,.previews-container>.nav-right:hover,.previews-container>.nav-left:hover{transform:scale(1.1)}.previews-container>.nav-left{margin-right:10px;left:10px}.previews-container>.nav-left>.left-arrow-preview-image{opacity:1}.previews-container>.nav-right{margin-left:10px;right:10px}.previews-container>.nav-right>.right-arrow-preview-image{opacity:1}\n", ".arrow-preview-image,.right-arrow-preview-image,.left-arrow-preview-image,.empty-arrow-preview-image{width:15px;height:15px;opacity:.5}.empty-arrow-preview-image{background:black;opacity:0}.left-arrow-preview-image{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ3Ny4xNzUgNDc3LjE3NSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDc3LjE3NSA0NzcuMTc1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij48Zz48cGF0aCBkPSJNMTQ1LjE4OCwyMzguNTc1bDIxNS41LTIxNS41YzUuMy01LjMsNS4zLTEzLjgsMC0xOS4xcy0xMy44LTUuMy0xOS4xLDBsLTIyNS4xLDIyNS4xYy01LjMsNS4zLTUuMywxMy44LDAsMTkuMWwyMjUuMSwyMjUgICBjMi42LDIuNiw2LjEsNCw5LjUsNHM2LjktMS4zLDkuNS00YzUuMy01LjMsNS4zLTEzLjgsMC0xOS4xTDE0NS4xODgsMjM4LjU3NXoiIGZpbGw9IiNGRkZGRkYiLz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PC9zdmc+);background-size:15px;transition:all .5s}.left-arrow-preview-image:hover{transform:scale(1.2)}.right-arrow-preview-image{background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmVyc2lvbj0iMS4xIiBpZD0iQ2FwYV8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDQ3Ny4xNzUgNDc3LjE3NSIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgNDc3LjE3NSA0NzcuMTc1OyIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgd2lkdGg9IjUxMnB4IiBoZWlnaHQ9IjUxMnB4Ij48Zz48cGF0aCBkPSJNMzYwLjczMSwyMjkuMDc1bC0yMjUuMS0yMjUuMWMtNS4zLTUuMy0xMy44LTUuMy0xOS4xLDBzLTUuMywxMy44LDAsMTkuMWwyMTUuNSwyMTUuNWwtMjE1LjUsMjE1LjUgICBjLTUuMyw1LjMtNS4zLDEzLjgsMCwxOS4xYzIuNiwyLjYsNi4xLDQsOS41LDRjMy40LDAsNi45LTEuMyw5LjUtNGwyMjUuMS0yMjUuMUMzNjUuOTMxLDI0Mi44NzUsMzY1LjkzMSwyMzQuMjc1LDM2MC43MzEsMjI5LjA3NXogICAiIGZpbGw9IiNGRkZGRkYiLz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PGc+PC9nPjxnPjwvZz48Zz48L2c+PC9zdmc+);background-size:15px;transition:all .5s}.right-arrow-preview-image:hover{transform:scale(1.2)}\n"] }]
|
|
441
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.BreakpointObserver }, { type: i2.DomSanitizer }, { type: i3.ConfigService }]; }, propDecorators: { hostMaxWidth: [{
|
|
442
|
+
type: HostBinding,
|
|
443
|
+
args: ['style.max-width']
|
|
444
|
+
}], ariaLabel: [{
|
|
445
|
+
type: HostBinding,
|
|
446
|
+
args: ['attr.aria-label']
|
|
447
|
+
}],
|
|
448
|
+
// @ts-ignore
|
|
449
|
+
id: [{
|
|
450
|
+
type: Input
|
|
451
|
+
}],
|
|
452
|
+
// @ts-ignore
|
|
453
|
+
currentImage: [{
|
|
454
|
+
type: Input
|
|
455
|
+
}],
|
|
456
|
+
// @ts-ignore
|
|
457
|
+
images: [{
|
|
458
|
+
type: Input
|
|
459
|
+
}], clickPreview: [{
|
|
460
|
+
type: Output
|
|
461
|
+
}] } });
|
|
462
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwtcHJldmlld3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3M4OS9hbmd1bGFyLW1vZGFsLWdhbGxlcnkvc3JjL2xpYi9jb21wb25lbnRzL2Nhcm91c2VsL2Nhcm91c2VsLXByZXZpZXdzL2Nhcm91c2VsLXByZXZpZXdzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tzODkvYW5ndWxhci1tb2RhbC1nYWxsZXJ5L3NyYy9saWIvY29tcG9uZW50cy9jYXJvdXNlbC9jYXJvdXNlbC1wcmV2aWV3cy9jYXJvdXNlbC1wcmV2aWV3cy5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBRUgsT0FBTyxFQUNMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxLQUFLLEVBSUwsTUFBTSxFQUdQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBc0IsV0FBVyxFQUFtQixNQUFNLHFCQUFxQixDQUFDO0FBSXZGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBUWpFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7QUFJcEQ7O0dBRUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLE9BQU8sQ0FBQztBQUVuQzs7R0FFRztBQU9ILE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxtQkFBbUI7SUFzRmhFLFlBQ1UsR0FBc0IsRUFDdEIsa0JBQXNDO0lBQzlDLCtHQUErRztJQUN2RyxTQUF1QixFQUN2QixhQUE0QjtRQUVwQyxL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LElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGdCQUFnQixDQUFDLGFBQXFCO1FBQzVDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLGFBQWEsQ0FBQztJQUNwRSxDQUFDOztzSEFqZFUseUJBQXlCOzBHQUF6Qix5QkFBeUIsZ1VDdkV0Qyx1eEVBd0NBOzJGRCtCYSx5QkFBeUI7a0JBTnJDLFNBQVM7K0JBQ0Usc0JBQXNCLG1CQUdmLHVCQUF1QixDQUFDLE1BQU07Z01BTy9DLFlBQVk7c0JBRFgsV0FBVzt1QkFBQyxpQkFBaUI7Z0JBTzlCLFNBQVM7c0JBRFIsV0FBVzt1QkFBQyxpQkFBaUI7O1FBTzlCLGFBQWE7UUFDYixFQUFFO3NCQUZELEtBQUs7O1FBT04sYUFBYTtRQUNiLFlBQVk7c0JBRlgsS0FBSzs7UUFRTixhQUFhO1FBQ2IsTUFBTTtzQkFGTCxLQUFLO2dCQVFOLFlBQVk7c0JBRFgsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gVGhlIE1JVCBMaWNlbnNlIChNSVQpXG5cbiBDb3B5cmlnaHQgKEMpIDIwMTctMjAyMSBTdGVmYW5vIENhcHBhIChLczg5KVxuXG4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cbiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04gSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVSZXNvdXJjZVVybCwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBCcmVha3BvaW50T2JzZXJ2ZXIsIEJyZWFrcG9pbnRzLCBCcmVha3BvaW50U3RhdGUgfSBmcm9tICdAYW5ndWxhci9jZGsvbGF5b3V0JztcblxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEFjY2Vzc2libGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hY2Nlc3NpYmxlLmNvbXBvbmVudCc7XG5cbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlDb25maWcgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9hY2Nlc3NpYmlsaXR5LmludGVyZmFjZSc7XG5pbXBvcnQgeyBJbWFnZSwgSW1hZ2VFdmVudCB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2ltYWdlLmNsYXNzJztcbmltcG9ydCB7IEludGVybmFsTGliSW1hZ2UgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9pbWFnZS1pbnRlcm5hbC5jbGFzcyc7XG5pbXBvcnQgeyBDYXJvdXNlbFByZXZpZXdDb25maWcgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9jYXJvdXNlbC1wcmV2aWV3LWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ2Fyb3VzZWxDb25maWcgfSBmcm9tICcuLi8uLi8uLi9tb2RlbC9jYXJvdXNlbC1jb25maWcuaW50ZXJmYWNlJztcblxuaW1wb3J0IHsgTkVYVCwgUFJFViB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3VzZXItaW5wdXQudXRpbCc7XG5pbXBvcnQgeyBnZXRJbmRleCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2ltYWdlLnV0aWwnO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWwvYWN0aW9uLmVudW0nO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IExpYkNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL21vZGVsL2xpYi1jb25maWcuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBEZWZhdWx0IG1heCBoZWlnaHQgb2YgcHJldmlld3MuXG4gKi9cbmNvbnN0IERFRkFVTFRfTUFYX0hFSUdIVCA9ICcyMDBweCc7XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggaW1hZ2UgcHJldmlld3MgZm9yIGNhcm91c2VsXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2tzLWNhcm91c2VsLXByZXZpZXdzJyxcbiAgc3R5bGVVcmxzOiBbJ2Nhcm91c2VsLXByZXZpZXdzLnNjc3MnLCAnLi4vLi4vcHJldmlld3MtYXJyb3dzLnNjc3MnXSxcbiAgdGVtcGxhdGVVcmw6ICdjYXJvdXNlbC1wcmV2aWV3cy5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ2Fyb3VzZWxQcmV2aWV3c0NvbXBvbmVudCBleHRlbmRzIEFjY2Vzc2libGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFZhcmlhYmxlIHRvIGNoYW5nZSB0aGUgbWF4LXdpZHRoIG9mIHRoZSBob3N0IGNvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5tYXgtd2lkdGgnKVxuICBob3N0TWF4V2lkdGggPSAnMTAwJSc7XG5cbiAgLyoqXG4gICAqIFZhcmlhYmxlIHRvIHNldCBhcmlhLWxhYmVsIG9mIHRoZSBob3N0IGNvbXBvbmVudFxuICAgKi9cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWwnKVxuICBhcmlhTGFiZWwgPSBgQ2Fyb3VzZWwgcHJldmlld3NgO1xuXG4gIC8qKlxuICAgKiBUT0RPIHdyaXRlIGRvY1xuICAgKi9cbiAgQElucHV0KClcbiAgLy8gQHRzLWlnbm9yZVxuICBpZDogbnVtYmVyO1xuICAvKipcbiAgICogT2JqZWN0IG9mIHR5cGUgYEludGVybmFsTGliSW1hZ2VgIHRoYXQgcmVwcmVzZW50IHRoZSB2aXNpYmxlIGltYWdlLlxuICAgKi9cbiAgQElucHV0KClcbiAgLy8gQHRzLWlnbm9yZVxuICBjdXJyZW50SW1hZ2U6IEludGVybmFsTGliSW1hZ2U7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBgSW50ZXJuYWxMaWJJbWFnZWAgdGhhdCByZXByZXNlbnQgdGhlIG1vZGVsIG9mIHRoaXMgbGlicmFyeSB3aXRoIGFsbCBpbWFnZXMsXG4gICAqIHRodW1icyBhbmQgc28gb24uXG4gICAqL1xuICBASW5wdXQoKVxuICAvLyBAdHMtaWdub3JlXG4gIGltYWdlczogSW50ZXJuYWxMaWJJbWFnZVtdO1xuXG4gIC8qKlxuICAgKiBPdXRwdXQgdG8gZW1pdCB0aGUgY2xpY2tlZCBwcmV2aWV3LiBUaGUgcGF5bG9hZCBjb250YWlucyB0aGUgYEludGVybmFsTGliSW1hZ2VgIGFzc29jaWF0ZWQgdG8gdGhlIGNsaWNrZWQgcHJldmlldy5cbiAgICovXG4gIEBPdXRwdXQoKVxuICBjbGlja1ByZXZpZXc6IEV2ZW50RW1pdHRlcjxJbWFnZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SW1hZ2VFdmVudD4oKTtcblxuICAvKipcbiAgICogT2JqZWN0IG9mIHR5cGUgYENhcm91c2VsQ29uZmlnYCB0byBpbml0IENhcm91c2VsQ29tcG9uZW50J3MgZmVhdHVyZXMuXG4gICAqIEZvciBpbnN0YW5jZSwgaXQgY29udGFpbnMgcGFyYW1ldGVycyB0byBjaGFuZ2UgdGhlIHN0eWxlLCBob3cgaXQgbmF2aWdhdGVzIGFuZCBzbyBvbi5cbiAgICovXG4gIGNhcm91c2VsQ29uZmlnOiBDYXJvdXNlbENvbmZpZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIE9iamVjdCBvZiB0eXBlIGBDYXJvdXNlbFByZXZpZXdDb25maWdgIHRvIGluaXQgUHJldmlld3NDb21wb25lbnQncyBmZWF0dXJlcy5cbiAgICogRm9yIGluc3RhbmNlLCBpdCBjb250YWlucyBhIHBhcmFtIHRvIHNob3cvaGlkZSB0aGlzIGNvbXBvbmVudCwgc2l6ZXMuXG4gICAqL1xuICBwcmV2aWV3Q29uZmlnOiBDYXJvdXNlbFByZXZpZXdDb25maWcgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBPYmplY3Qgb2YgdHlwZSBgQWNjZXNzaWJpbGl0eUNvbmZpZ2AgdG8gaW5pdCBjdXN0b20gYWNjZXNzaWJpbGl0eSBmZWF0dXJlcy5cbiAgICogRm9yIGluc3RhbmNlLCBpdCBjb250YWlucyB0aXRsZXMsIGFsdCB0ZXh0cywgYXJpYS1sYWJlbHMgYW5kIHNvIG9uLlxuICAgKi9cbiAgYWNjZXNzaWJpbGl0eUNvbmZpZzogQWNjZXNzaWJpbGl0eUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEVudW0gb2YgdHlwZSBgQWN0aW9uYCB0aGF0IHJlcHJlc2VudHMgYSBtb3VzZSBjbGljayBvbiBhIGJ1dHRvbi5cbiAgICogRGVjbGFyZWQgaGVyZSB0byBiZSB1c2VkIGluc2lkZSB0aGUgdGVtcGxhdGUuXG4gICAqL1xuICBjbGlja0FjdGlvbjogQWN0aW9uID0gQWN0aW9uLkNMSUNLO1xuICAvKipcbiAgICogRW51bSBvZiB0eXBlIGBBY3Rpb25gIHRoYXQgcmVwcmVzZW50cyBhIGtleWJvYXJkIGFjdGlvbi5cbiAgICogRGVjbGFyZWQgaGVyZSB0byBiZSB1c2VkIGluc2lkZSB0aGUgdGVtcGxhdGUuXG4gICAqL1xuICBrZXlib2FyZEFjdGlvbjogQWN0aW9uID0gQWN0aW9uLktFWUJPQVJEO1xuICAvKipcbiAgICogQXJyYXkgb2YgYEludGVybmFsTGliSW1hZ2VgIGV4cG9zZWQgdG8gdGhlIHRlbXBsYXRlLiBUaGlzIGZpZWxkIGlzIGluaXRpYWxpemVkXG4gICAqIGFwcGx5aW5nIHRyYW5zZm9ybWF0aW9ucywgZGVmYXVsdCB2YWx1ZXMgYW5kIHNvIG9uIHRvIHRoZSBpbnB1dCBvZiB0aGUgc2FtZSB0eXBlLlxuICAgKi9cbiAgcHJldmlld3M6IEludGVybmFsTGliSW1hZ2VbXSA9IFtdO1xuICAvKipcbiAgICogVmFyaWFibGUgd2l0aCB0aGUgcHJldmlldydzIG1heEhlaWdodFxuICAgKi9cbiAgcHJldmlld01heEhlaWdodDogc3RyaW5nID0gREVGQVVMVF9NQVhfSEVJR0hUO1xuICAvKipcbiAgICogU3RhcnQgaW5kZXggKGluY2x1c2l2ZSkgb2YgdGhlIGlucHV0IGltYWdlcyB1c2VkIHRvIGRpc3BsYXkgcHJldmlld3MuXG4gICAqL1xuICAvLyBAdHMtaWdub3JlXG4gIHN0YXJ0OiBudW1iZXI7XG4gIC8qKlxuICAgKiBFbmQgaW5kZXggKG5vbiBpbmNsdXNpdmUpIG9mIHRoZSBpbnB1dCBpbWFnZXMgdXNlZCB0byBkaXNwbGF5IHByZXZpZXdzLlxuICAgKi9cbiAgLy8gQHRzLWlnbm9yZVxuICBlbmQ6IG51bWJlcjtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJyZWFrcG9pbnRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBicmVha3BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcixcbiAgICAvLyBzYW5pdGl6ZXIgaXMgdXNlZCBvbmx5IHRvIHNhbml0aXplIHN0eWxlIGJlZm9yZSBhZGQgaXQgdG8gYmFja2dyb3VuZCBwcm9wZXJ0eSB3aGVuIGxlZ2FjeUlFMTFNb2RlIGlzIGVuYWJsZWRcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gbGlzdGVuIGZvciB3aWR0aCBjaGFuZ2VzIGFuZCB1cGRhdGUgcHJldmlldyBoZWlnaHRzIGFjY29yZGluZ2x5XG4gICAgdGhpcy5icmVha3BvaW50U3Vic2NyaXB0aW9uID0gYnJlYWtwb2ludE9ic2VydmVyXG4gICAgICAub2JzZXJ2ZShbQnJlYWtwb2ludHMuWFNtYWxsLCBCcmVha3BvaW50cy5TbWFsbCwgQnJlYWtwb2ludHMuTWVkaXVtLCBCcmVha3BvaW50cy5MYXJnZSwgQnJlYWtwb2ludHMuWExhcmdlXSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdDogQnJlYWtwb2ludFN0YXRlKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5wcmV2aWV3Q29uZmlnIHx8ICF0aGlzLnByZXZpZXdDb25maWcuYnJlYWtwb2ludHMpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5icmVha3BvaW50c1tCcmVha3BvaW50cy5YU21hbGxdKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQodGhpcy5wcmV2aWV3Q29uZmlnLmJyZWFrcG9pbnRzLnhTbWFsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmJyZWFrcG9pbnRzW0JyZWFrcG9pbnRzLlNtYWxsXSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KHRoaXMucHJldmlld0NvbmZpZy5icmVha3BvaW50cy5zbWFsbCk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LmJyZWFrcG9pbnRzW0JyZWFrcG9pbnRzLk1lZGl1bV0pIHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodCh0aGlzLnByZXZpZXdDb25maWcuYnJlYWtwb2ludHMubWVkaXVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYnJlYWtwb2ludHNbQnJlYWtwb2ludHMuTGFyZ2VdKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVIZWlnaHQodGhpcy5wcmV2aWV3Q29uZmlnLmJyZWFrcG9pbnRzLmxhcmdlKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQuYnJlYWtwb2ludHNbQnJlYWtwb2ludHMuWExhcmdlXSkge1xuICAgICAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KHRoaXMucHJldmlld0NvbmZpZy5icmVha3BvaW50cy54TGFyZ2UpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdXBkYXRlIHRoZSBoZWlnaHQgb2YgcHJldmlld3MsIHBhc3NpbmcgdGhlIGRlc2lyZWQgaGVpZ2h0IGFzIGlucHV0LlxuICAgKiBAcGFyYW0gY29uZmlnQnJlYWtwb2ludEhlaWdodCBpcyBhIG51bWJlciB0aGF0IHJlcHJlc2VudCB0aGUgZGVzaXJlZCBoZWlnaHQgdG8gc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVIZWlnaHQoY29uZmlnQnJlYWtwb2ludEhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlld0NvbmZpZyAmJiB0aGlzLnByZXZpZXdDb25maWcubWF4SGVpZ2h0KSB7XG4gICAgICBjb25zdCBoZWlnaHROdW06IG51bWJlciA9ICt0aGlzLnByZXZpZXdDb25maWcubWF4SGVpZ2h0LnJlcGxhY2UoJy9weC9nJywgJycpLnJlcGxhY2UoJy8lL2cnLCAnJyk7XG4gICAgICB0aGlzLnByZXZpZXdNYXhIZWlnaHQgPSBNYXRoLm1pbihjb25maWdCcmVha3BvaW50SGVpZ2h0LCBoZWlnaHROdW0pICsgJ3B4JztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGVpZ2h0TnVtOiBudW1iZXIgPSArREVGQVVMVF9NQVhfSEVJR0hULnJlcGxhY2UoJy9weC9nJywgJycpLnJlcGxhY2UoJy8lL2cnLCAnJyk7XG4gICAgICB0aGlzLnByZXZpZXdNYXhIZWlnaHQgPSBNYXRoLm1pbihjb25maWdCcmVha3BvaW50SGVpZ2h0LCBoZWlnaHROdW0pICsgJ3B4JztcbiAgICB9XG4gICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIMK0bmdPbkluaXTCtCB0byBidWlsZCBgY29uZmlnUHJldmlld2AgYXBwbHlpbmcgYSBkZWZhdWx0IHZhbHVlIGFuZCBhbHNvIHRvXG4gICAqIGluaXQgdGhlIGBwcmV2aWV3c2AgYXJyYXkuXG4gICAqIFRoaXMgaXMgYW4gQW5ndWxhcidzIGxpZmVjeWNsZSBob29rLCBzbyBpdHMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgYnkgQW5ndWxhciBpdHNlbGYuXG4gICAqIEluIHBhcnRpY3VsYXIsIGl0J3MgY2FsbGVkIG9ubHkgb25lIHRpbWUhISFcbiAgICovXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGxpYkNvbmZpZzogTGliQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWdTZXJ2aWNlLmdldENvbmZpZyh0aGlzLmlkKTtcbiAgICBpZiAoIWxpYkNvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIC0gbGliQ29uZmlnIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cbiAgICB0aGlzLmNhcm91c2VsQ29uZmlnID0gbGliQ29uZmlnLmNhcm91c2VsQ29uZmlnO1xuICAgIHRoaXMucHJldmlld0NvbmZpZyA9IGxpYkNvbmZpZy5jYXJvdXNlbFByZXZpZXdzQ29uZmlnO1xuICAgIHRoaXMuYWNjZXNzaWJpbGl0eUNvbmZpZyA9IGxpYkNvbmZpZy5hY2Nlc3NpYmlsaXR5Q29uZmlnO1xuXG4gICAgaWYgKCF0aGlzLnByZXZpZXdDb25maWcgfHwgIXRoaXMucHJldmlld0NvbmZpZy5tYXhIZWlnaHQgfHwgIXRoaXMucHJldmlld0NvbmZpZy5icmVha3BvaW50cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIC0gcHJldmlld0NvbmZpZyBtdXN0IGJlIGRlZmluZWQnKTtcbiAgICB9XG4gICAgLy8gY2hhbmdlIHRoZSBtYXgtd2lkdGggb2YgdGhpcyBjb21wb25lbnQgaWYgdGhlcmUgaXMgYSBzcGVjaWZpZWQgd2lkdGggIT09IDEwMCUgaW4gY2Fyb3VzZWxDb25maWdcbiAgICBpZiAodGhpcy5jYXJvdXNlbENvbmZpZyAmJiB0aGlzLmNhcm91c2VsQ29uZmlnLm1heFdpZHRoICE9PSAnMTAwJScpIHtcbiAgICAgIHRoaXMuaG9zdE1heFdpZHRoID0gdGhpcy5jYXJvdXNlbENvbmZpZy5tYXhXaWR0aDtcbiAgICB9XG5cbiAgICB0aGlzLnByZXZpZXdNYXhIZWlnaHQgPSB0aGlzLnByZXZpZXdDb25maWcubWF4SGVpZ2h0O1xuICAgIC8vIGluaXQgcHJldmlld3MgYmFzZWQgb24gY3VycmVudEltYWdlIGFuZCB0aGUgZnVsbCBhcnJheSBvZiBpbWFnZXNcbiAgICB0aGlzLmluaXRQcmV2aWV3cyh0aGlzLmN1cnJlbnRJbWFnZSwgdGhpcy5pbWFnZXMpO1xuXG4gICAgLy8gYXBwbHkgY3VzdG9tIGhlaWdodCBiYXNlZCBvbiByZXNwb25zaXZlIGJyZWFrcG9pbnRzXG4gICAgLy8gVGhpcyBpcyByZXF1aXJlZCwgYmVjYXVzZSB0aGUgYnJlYWtwb2ludFN1YnNjcmlwdGlvbiBpcyBub3QgdHJpZ2dlcmVkIGF0IGNyZWF0aW9uLFxuICAgIC8vIGJ1dCBvbmx5IHdoZW4gdGhlIHdpZHRoIGNoYW5nZXNcbiAgICBjb25zdCBpc1hzbWFsbFNjcmVlbiA9IHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLmlzTWF0Y2hlZChCcmVha3BvaW50cy5YU21hbGwpO1xuICAgIGNvbnN0IGlzU21hbGxTY3JlZW4gPSB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5pc01hdGNoZWQoQnJlYWtwb2ludHMuU21hbGwpO1xuICAgIGNvbnN0IGlzTWVkaXVtU2NyZWVuID0gdGhpcy5icmVha3BvaW50T2JzZXJ2ZXIuaXNNYXRjaGVkKEJyZWFrcG9pbnRzLk1lZGl1bSk7XG4gICAgY29uc3QgaXNMYXJnZVNjcmVlbiA9IHRoaXMuYnJlYWtwb2ludE9ic2VydmVyLmlzTWF0Y2hlZChCcmVha3BvaW50cy5MYXJnZSk7XG4gICAgY29uc3QgaXN4TGFyZ2VTY3JlZW4gPSB0aGlzLmJyZWFrcG9pbnRPYnNlcnZlci5pc01hdGNoZWQoQnJlYWtwb2ludHMuWExhcmdlKTtcbiAgICBpZiAoaXNYc21hbGxTY3JlZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KHRoaXMucHJldmlld0NvbmZpZy5icmVha3BvaW50cy54U21hbGwpO1xuICAgIH0gZWxzZSBpZiAoaXNTbWFsbFNjcmVlbikge1xuICAgICAgdGhpcy51cGRhdGVIZWlnaHQodGhpcy5wcmV2aWV3Q29uZmlnLmJyZWFrcG9pbnRzLnNtYWxsKTtcbiAgICB9IGVsc2UgaWYgKGlzTWVkaXVtU2NyZWVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZUhlaWdodCh0aGlzLnByZXZpZXdDb25maWcuYnJlYWtwb2ludHMubWVkaXVtKTtcbiAgICB9IGVsc2UgaWYgKGlzTGFyZ2VTY3JlZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlSGVpZ2h0KHRoaXMucHJldmlld0NvbmZpZy5icmVha3BvaW50cy5sYXJnZSk7XG4gICAgfSBlbHNlIGlmIChpc3hMYXJnZVNjcmVlbikge1xuICAgICAgdGhpcy51cGRhdGVIZWlnaHQodGhpcy5wcmV2aWV3Q29uZmlnLmJyZWFrcG9pbnRzLnhMYXJnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBjaGVjayBpZiBhbiBpbWFnZSBpcyBhY3RpdmUgKGkuZS4gYSBwcmV2aWV3IGltYWdlKS5cbiAgICogQHBhcmFtIEludGVybmFsTGliSW1hZ2UgcHJldmlldyBpcyBhbiBpbWFnZSB0byBjaGVjayBpZiBpdCdzIGFjdGl2ZSBvciBub3RcbiAgICogQHJldHVybnMgYm9vbGVhbiB0cnVlIGlmIGlzIGFjdGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBpc0FjdGl2ZShwcmV2aWV3OiBJbnRlcm5hbExpYkltYWdlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFwcmV2aWV3IHx8ICF0aGlzLmN1cnJlbnRJbWFnZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gcHJldmlldy5pZCA9PT0gdGhpcy5jdXJyZW50SW1hZ2UuaWQ7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIMK0bmdPbkNoYW5nZXPCtCB0byB1cGRhdGUgYHByZXZpZXdzYCBhcnJheS5cbiAgICogQWxzbywgYm90aCBgc3RhcnRgIGFuZCBgZW5kYCBsb2NhbCB2YXJpYWJsZXMgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LlxuICAgKiBUaGlzIGlzIGFuIEFuZ3VsYXIncyBsaWZlY3ljbGUgaG9vaywgc28gaXRzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IEFuZ3VsYXIgaXRzZWxmLlxuICAgKiBJbiBwYXJ0aWN1bGFyLCBpdCdzIGNhbGxlZCB3aGVuIGFueSBkYXRhLWJvdW5kIHByb3BlcnR5IG9mIGEgZGlyZWN0aXZlIGNoYW5nZXMhISFcbiAgICovXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCBzaW1wbGVDaGFuZ2U6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXMuY3VycmVudEltYWdlO1xuICAgIGlmICghc2ltcGxlQ2hhbmdlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldjogSW50ZXJuYWxMaWJJbWFnZSA9IHNpbXBsZUNoYW5nZS5wcmV2aW91c1ZhbHVlO1xuICAgIGNvbnN0IGN1cnJlbnQ6IEludGVybmFsTGliSW1hZ2UgPSBzaW1wbGVDaGFuZ2UuY3VycmVudFZhbHVlO1xuXG4gICAgaWYgKGN1cnJlbnQgJiYgY2hhbmdlcy5pbWFnZXMgJiYgY2hhbmdlcy5pbWFnZXMucHJldmlvdXNWYWx1ZSAmJiBjaGFuZ2VzLmltYWdlcy5jdXJyZW50VmFsdWUpIHtcbiAgICAgIC8vIEknbSBpbiB0aGlzIGlmIHN0YXRlbWVudCwgaWYgaW5wdXQgaW1hZ2VzIGFyZSBjaGFuZ2VkIChmb3IgaW5zdGFuY2UsIGJlY2F1c2UgSSByZW1vdmVkIG9uZSBvZiB0aGVtIHdpdGggdGhlICdkZWxldGUgYnV0dG9uJyxcbiAgICAgIC8vIG9yIGJlY2F1c2UgdXNlcnMgY2hhbmdlZCB0aGUgaW1hZ2VzIGFycmF5IHdoaWxlIG1vZGFsIGdhbGxlcnkgaXMgc3RpbGwgb3BlbikuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UsIEkgaGF2ZSB0byByZS1pbml0IHByZXZpZXdzLCBiZWNhdXNlIHRoZSBpbnB1dCBhcnJheSBvZiBpbWFnZXMgaXMgY2hhbmdlZC5cbiAgICAgIHRoaXMuaW5pdFByZXZpZXdzKGN1cnJlbnQsIGNoYW5nZXMuaW1hZ2VzLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXYgJiYgY3VycmVudCAmJiBwcmV2LmlkICE9PSBjdXJyZW50LmlkKSB7XG4gICAgICAvLyB0byBtYW5hZ2UgaW5maW5pdGUgc2xpZGluZyBJIGhhdmUgdG8gcmVzZXQgYm90aCBgc3RhcnRgIGFuZCBgZW5kYCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAvLyB0byBzaG93IGFnYWluIHByZXZpZXdzIGZyb20gdGhlIGZpcnN0IGltYWdlLlxuICAgICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4geW91IG5hdmlnYXRlIG92ZXIgdGhlIGxhc3QgaW1hZ2UgdG8gcmV0dXJuIHRvIHRoZSBmaXJzdCBvbmVcbiAgICAgIGxldCBwcmV2SW5kZXg6IG51bWJlcjtcbiAgICAgIGxldCBjdXJyZW50SW5kZXg6IG51bWJlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIHByZXZJbmRleCA9IGdldEluZGV4KHByZXYsIHRoaXMuaW1hZ2VzKTtcbiAgICAgICAgY3VycmVudEluZGV4ID0gZ2V0SW5kZXgoY3VycmVudCwgdGhpcy5pbWFnZXMpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Nhbm5vdCBnZXQgcHJldmlvdXMgYW5kIGN1cnJlbnQgaW1hZ2UgaW5kZXhlcyBpbiBwcmV2aWV3cycpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIC8vIGFwcGx5IGEgZm9ybXVsYSB0byBnZXQgYSB2YWx1ZXMgdG8gYmUgdXNlZCB0byBkZWNpZGUgaWYgZ28gbmV4dCwgcmV0dXJuIGJhY2sgb3Igc3RheSB3aXRob3V0IGRvaW5nIGFueXRoaW5nXG4gICAgICBjb25zdCBjYWxjID0gTWF0aC5mbG9vcigodGhpcy5lbmQgLSB0aGlzLnN0YXJ0KSAvIDIpICsgdGhpcy5zdGFydDtcblxuICAgICAgaWYgKHByZXZJbmRleCA9PT0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMSAmJiBjdXJyZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgLy8gZmlyc3QgaW1hZ2VcbiAgICAgICAgdGhpcy5zZXRCZWdpbm5pbmdJbmRleGVzUHJldmlld3MoKTtcbiAgICAgICAgdGhpcy5wcmV2aWV3cyA9IHRoaXMuaW1hZ2VzLmZpbHRlcigoaW1nOiBJbnRlcm5hbExpYkltYWdlLCBpOiBudW1iZXIpID0+IGkgPj0gdGhpcy5zdGFydCAmJiBpIDwgdGhpcy5lbmQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyB0aGUgc2FtZSBmb3IgdGhlIG9wcG9zaXRlIGNhc2UsIHdoZW4geW91IG5hdmlnYXRlIGJhY2sgZnJvbSB0aGUgZmlzdCBpbWFnZSB0byBnbyB0byB0aGUgbGFzdCBvbmUuXG4gICAgICBpZiAocHJldkluZGV4ID09PSAwICYmIGN1cnJlbnRJbmRleCA9PT0gdGhpcy5pbWFnZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAvLyBsYXN0IGltYWdlXG4gICAgICAgIHRoaXMuc2V0RW5kSW5kZXhlc1ByZXZpZXdzKCk7XG4gICAgICAgIHRoaXMucHJldmlld3MgPSB0aGlzLmltYWdlcy5maWx0ZXIoKGltZzogSW50ZXJuYWxMaWJJbWFnZSwgaTogbnVtYmVyKSA9PiBpID49IHRoaXMuc3RhcnQgJiYgaSA8IHRoaXMuZW5kKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5wcmV2aWV3Q29uZmlnICYmICh0aGlzLnByZXZpZXdDb25maWcubnVtYmVyIGFzIG51bWJlcikgJSAyID09PSAwKSB7XG4gICAgICAgIGlmIChjYWxjID4gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgdGhpcy5wcmV2aW91cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoY2FsYyA+IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgIHRoaXMucHJldmlvdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2FsYyA8IGN1cnJlbnRJbmRleCkge1xuICAgICAgICAgIHRoaXMubmV4dCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBjYWxsZWQgYnkgZXZlbnRzIGZyb20gYm90aCBrZXlib2FyZCBhbmQgbW91c2Ugb24gYSBwcmV2aWV3LlxuICAgKiBUaGlzIHdpbGwgdHJpZ2dlciB0aGUgYGNsaWNrcHJldmlld2Agb3V0cHV0IHdpdGggdGhlIGlucHV0IHByZXZpZXcgYXMgaXRzIHBheWxvYWQuXG4gICAqIEBwYXJhbSBJbnRlcm5hbExpYkltYWdlIHByZXZpZXcgdGhhdCB0cmlnZ2VyZWQgdGhpcyBtZXRob2RcbiAgICogQHBhcmFtIEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50IGV2ZW50IHBheWxvYWRcbiAgICogQHBhcmFtIEFjdGlvbiB0aGF0IHRyaWdnZXJlZCB0aGlzIGV2ZW50IChBY3Rpb24uTk9STUFMIGJ5IGRlZmF1bHQpXG4gICAqL1xuICBvbkltYWdlRXZlbnQocHJldmlldzogSW50ZXJuYWxMaWJJbWFnZSwgZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50LCBhY3Rpb246IEFjdGlvbiA9IEFjdGlvbi5OT1JNQUwpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJldmlld0NvbmZpZyB8fCAhdGhpcy5wcmV2aWV3Q29uZmlnLmNsaWNrYWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjbGlja2VkSW1hZ2VJbmRleDogbnVtYmVyID0gdGhpcy5pbWFnZXMuaW5kZXhPZihwcmV2aWV3KTtcbiAgICBjb25zdCByZXN1bHQ6IG51bWJlciA9IHN1cGVyLmhhbmRsZUltYWdlRXZlbnQoZXZlbnQpO1xuICAgIGlmIChyZXN1bHQgPT09IE5FWFQpIHtcbiAgICAgIHRoaXMuY2xpY2tQcmV2aWV3LmVtaXQoeyBhY3Rpb24sIHJlc3VsdDogY2xpY2tlZEltYWdlSW5kZXggfSBhcyBJbWFnZUV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gUFJFVikge1xuICAgICAgdGhpcy5jbGlja1ByZXZpZXcuZW1pdCh7IGFjdGlvbiwgcmVzdWx0OiBjbGlja2VkSW1hZ2VJbmRleCB9IGFzIEltYWdlRXZlbnQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgY2FsbGVkIGJ5IGV2ZW50cyBmcm9tIGJvdGgga2V5Ym9hcmQgYW5kIG1vdXNlIG9uIGEgbmF2aWdhdGlvbiBhcnJvdy5cbiAgICogQHBhcmFtIHN0cmluZyBkaXJlY3Rpb24gb2YgdGhlIG5hdmlnYXRpb24gdGhhdCBjYW4gYmUgZWl0aGVyICduZXh0JyBvciAncHJldidcbiAgICogQHBhcmFtIEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50IGV2ZW50IHBheWxvYWRcbiAgICovXG4gIG9uTmF2aWdhdGlvbkV2ZW50KGRpcmVjdGlvbjogc3RyaW5nLCBldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCByZXN1bHQ6IG51bWJlciA9IHN1cGVyLmhhbmRsZU5hdmlnYXRpb25FdmVudChkaXJlY3Rpb24sIGV2ZW50KTtcbiAgICBpZiAocmVzdWx0ID09PSBORVhUKSB7XG4gICAgICB0aGlzLm5leHQoKTtcbiAgICB9IGVsc2UgaWYgKHJlc3VsdCA9PT0gUFJFVikge1xuICAgICAgdGhpcy5wcmV2aW91cygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZ2V0IGFyaWEtbGFiZWwgdGV4dCBmb3IgYSBwcmV2aWV3IGltYWdlLlxuICAgKiBAcGFyYW0gSW1hZ2UgaXMgdGhlIHByZXZpZXdcbiAgICovXG4gIGdldEFyaWFMYWJlbChwcmV2aWV3OiBJbWFnZSk6IHN0cmluZyB7XG4gICAgaWYgKCFwcmV2aWV3LnBsYWluKSB7XG4gICAgICByZXR1cm4gcHJldmlldy5tb2RhbC5hcmlhTGFiZWwgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiBwcmV2aWV3LnBsYWluLmFyaWFMYWJlbCB8fCBwcmV2aWV3Lm1vZGFsLmFyaWFMYWJlbCB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZ2V0IHRpdGxlIHRleHQgZm9yIGEgcHJldmlldyBpbWFnZS5cbiAgICogQHBhcmFtIEltYWdlIGlzIHRoZSBwcmV2aWV3XG4gICAqL1xuICBnZXRUaXRsZShwcmV2aWV3OiBJbWFnZSk6IHN0cmluZyB7XG4gICAgaWYgKCFwcmV2aWV3LnBsYWluKSB7XG4gICAgICByZXR1cm4gcHJldmlldy5tb2RhbC50aXRsZSB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuIHByZXZpZXcucGxhaW4udGl0bGUgfHwgcHJldmlldy5tb2RhbC50aXRsZSB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZ2V0IGFsdCB0ZXh0IGZvciBhIHByZXZpZXcgaW1hZ2UuXG4gICAqIEBwYXJhbSBJbWFnZSBpcyB0aGUgcHJldmlld1xuICAgKi9cbiAgZ2V0QWx0KHByZXZpZXc6IEltYWdlKTogc3RyaW5nIHtcbiAgICBpZiAoIXByZXZpZXcucGxhaW4pIHtcbiAgICAgIHJldHVybiBwcmV2aWV3Lm1vZGFsLmFsdCB8fCAnJztcbiAgICB9XG4gICAgcmV0dXJuIHByZXZpZXcucGxhaW4uYWx0IHx8IHByZXZpZXcubW9kYWwuYWx0IHx8ICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIGluIHRoZSB0ZW1wbGF0ZSB0byB0cmFjayBpZHMgaW4gbmdGb3IuXG4gICAqIEBwYXJhbSBudW1iZXIgaW5kZXggb2YgdGhlIGFycmF5XG4gICAqIEBwYXJhbSBJbWFnZSBpdGVtIG9mIHRoZSBhcnJheVxuICAgKiBAcmV0dXJucyBudW1iZXIgdGhlIGlkIG9mIHRoZSBpdGVtXG4gICAqL1xuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgaXRlbTogSW1hZ2UpOiBudW1iZXIge1xuICAgIHJldHVybiBpdGVtLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB1c2VkIGluIHRlbXBsYXRlIHRvIHNhbml0aXplIGFuIHVybCB3aGVuIHlvdSBuZWVkIGxlZ2FjeUlFMTFNb2RlLlxuICAgKiBJbiB0aGlzIHdheSB5b3UgY2FuIHNldCBhbiB1cmwgYXMgYmFja2dyb3VuZCBvZiBhIGRpdi5cbiAgICogQHBhcmFtIHVuc2FmZVN0eWxlIGlzIGEgc3RyaW5nIG9yIGEgU2FmZVJlc291cmNlVXJsIHRoYXQgcmVwcmVzZW50cyB0aGUgdXJsIHRvIHNhbml0aXplLlxuICAgKiBAcGFyYW0gdW5zYWZlU3R5bGVGYWxsYmFjayBpcyBhIHN0cmluZyBvciBhIFNhZmVSZXNvdXJjZVVybCB0aGF0IHJlcHJlc2VudHMgdGhlIGZhbGxiYWNrIHVybCB0byBzYW5pdGl6ZS5cbiAgICogQHJldHVybnMgYSBTYWZlU3R5bGUgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gdGVtcGxhdGUgd2l0aG91dCBwcm9ibGVtcy5cbiAgICovXG4gIHNhbml0aXplVXJsQmdTdHlsZSh1bnNhZmVTdHlsZTogc3RyaW5nIHwgU2FmZVJlc291cmNlVXJsLCB1bnNhZmVTdHlsZUZhbGxiYWNrOiBzdHJpbmcgfCBTYWZlUmVzb3VyY2VVcmwpOiBTYWZlU3R5bGUge1xuICAgIC8vIE1ldGhvZCB1c2VkIG9ubHkgdG8gc2FuaXRpemUgYmFja2dyb3VuZC1pbWFnZSBzdHlsZSBiZWZvcmUgYWRkIGl0IHRvIGJhY2tncm91bmQgcHJvcGVydHkgd2hlbiBsZWdhY3lJRTExTW9kZSBpcyBlbmFibGVkXG4gICAgbGV0IGJnOiBzdHJpbmcgPSAndXJsKCcgKyB1bnNhZmVTdHlsZSArICcpJztcbiAgICBpZiAoISF1bnNhZmVTdHlsZUZhbGxiYWNrKSB7XG4gICAgICAvLyBpZiBhIGZhbGxiYWNrIGltYWdlIGlzIGRlZmluZWQsIGFwcGVuZCBpdC4gSW4gdGhpcyB3YXksIGl0IHdpbGwgYmUgdXNlZCBieSB0aGUgYnJvd3NlciBhcyBmYWxsYmFjay5cbiAgICAgIGJnICs9ICcsICcgKyAndXJsKCcgKyB1bnNhZmVTdHlsZUZhbGxiYWNrICsgJyknO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKGJnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gY2xlYW51cCByZXNvdXJjZXMuIEluIGZhY3QsIGl0IGNsZWFucyBicmVha3BvaW50U3Vic2NyaXB0aW9uLlxuICAgKiBUaGlzIGlzIGFuIEFuZ3VsYXIncyBsaWZlY3ljbGUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoaXMgY29tcG9uZW50IGlzIGRlc3Ryb3llZC5cbiAgICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJyZWFrcG9pbnRTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYnJlYWtwb2ludFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZCB0byBpbml0IHByZXZpZXdzIGJhc2VkIG9uIHRoZSBjdXJyZW50SW1hZ2UgYW5kIHRoZSBmdWxsIGFycmF5IG9mIGltYWdlcy5cbiAgICogVGhlIGN1cnJlbnQgaW1hZ2UgaW4gbWFuZGF0b3J5IHRvIHNob3cgYWx3YXlzIHRoZSBjdXJyZW50IHByZXZpZXcgKGFzIGhpZ2hsaWdodGVkKS5cbiAgICogQHBhcmFtIEludGVybmFsTGliSW1hZ2UgY3VycmVudEltYWdlIHRvIGRlY2lkZSBob3cgdG8gc2hvdyBwcmV2aWV3cywgYmVjYXVzZSBJIGFsd2F5cyB3YW50IHRvIHNlZSB0aGUgY3VycmVudCBpbWFnZSBhcyBoaWdobGlnaHRlZFxuICAgKiBAcGFyYW0gSW50ZXJuYWxMaWJJbWFnZVtdIGltYWdlcyBpcyB0aGUgYXJyYXkgb2YgYWxsIGltYWdlcy5cbiAgICovXG4gIHByaXZhdGUgaW5pdFByZXZpZXdzKGN1cnJlbnRJbWFnZTogSW50ZXJuYWxMaWJJbWFnZSwgaW1hZ2VzOiBJbnRlcm5hbExpYkltYWdlW10pOiB2b2lkIHtcbiAgICBsZXQgaW5kZXg6IG51bWJlcjtcbiAgICB0cnkge1xuICAgICAgaW5kZXggPSBnZXRJbmRleChjdXJyZW50SW1hZ2UsIGltYWdlcyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHN3aXRjaCAoaW5kZXgpIHtcbiAgICAgIGNhc2UgMDpcbiAgICAgICAgLy8gZmlyc3QgaW1hZ2VcbiAgICAgICAgdGhpcy5zZXRCZWdpbm5pbmdJbmRleGVzUHJldmlld3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIGltYWdlcy5sZW5ndGggLSAxOlxuICAgICAgICAvLyBsYXN0IGltYWdlXG4gICAgICAgIHRoaXMuc2V0RW5kSW5kZXhlc1ByZXZpZXdzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gZGVmYXVsdDpcbiAgICAgIC8vICAgLy8gb3RoZXIgaW1hZ2VzXG4gICAgICAvLyAgIC8vIFRPRE8gdW51c2VkIGJlY2F1c2UgaXQgc3RhcnRzIGFsd2F5cyBhdCBpbWFnZSAwXG4gICAgICAvLyAgIHRoaXMuc2V0SW5kZXhlc1ByZXZpZXdzKCk7XG4gICAgICAvLyAgIGJyZWFrO1xuICAgIH1cbiAgICB0aGlzLnByZXZpZXdzID0gaW1hZ2VzLmZpbHRlcigoaW1nOiBJbnRlcm5hbExpYkltYWdlLCBpOiBudW1iZXIpID0+IGkgPj0gdGhpcy5zdGFydCAmJiBpIDwgdGhpcy5lbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgbWV0aG9kIHRvIGluaXQgYm90aCBgc3RhcnRgIGFuZCBgZW5kYCB0byB0aGUgYmVnaW5uaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzZXRCZWdpbm5pbmdJbmRleGVzUHJldmlld3MoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByZXZpZXdDb25maWcgfHwgdGhpcy5wcmV2aWV3Q29uZmlnLm51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludGVybmFsIGxpYnJhcnkgZXJyb3IgLSBwcmV2aWV3Q29uZmlnIGFuZCBudW1iZXIgbXVzdCBiZSBkZWZpbmVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFydCA9IDA7XG4gICAgdGhpcy5lbmQgPSBNYXRoLm1pbih0aGlzLnByZXZpZXdDb25maWcubnVtYmVyIGFzIG51bWJlciwgdGhpcy5pbWFnZXMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZCB0byBpbml0IGJvdGggYHN0YXJ0YCBhbmQgYGVuZGAgdG8gdGhlIGVuZC5cbiAgICovXG4gIHByaXZhdGUgc2V0RW5kSW5kZXhlc1ByZXZpZXdzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcmV2aWV3Q29uZmlnIHx8IHRoaXMucHJldmlld0NvbmZpZy5udW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnRlcm5hbCBsaWJyYXJ5IGVycm9yIC0gcHJldmlld0NvbmZpZyBhbmQgbnVtYmVyIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnQgPSB0aGlzLmltYWdlcy5sZW5ndGggLSAxIC0gKCh0aGlzLnByZXZpZXdDb25maWcubnVtYmVyIGFzIG51bWJlcikgLSAxKTtcbiAgICB0aGlzLmVuZCA9IHRoaXMuaW1hZ2VzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZCB0byB1cGRhdGUgdGhlIHZpc2libGUgcHJldmlld3MgbmF2aWdhdGluZyB0byB0aGUgcmlnaHQgKG5leHQpLlxuICAgKi9cbiAgcHJpdmF0ZSBuZXh0KCk6IHZvaWQge1xuICAgIC8vIGNoZWNrIGlmIG5leHRJbWFnZSBzaG91bGQgYmUgYmxvY2tlZFxuICAgIGlmICh0aGlzLmlzUHJldmVudFNsaWRpbmcodGhpcy5pbWFnZXMubGVuZ3RoIC0gMSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5lbmQgPT09IHRoaXMuaW1hZ2VzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc3RhcnQrKztcbiAgICB0aGlzLmVuZCA9IE1hdGgubWluKHRoaXMuZW5kICsgMSwgdGhpcy5pbWFnZXMubGVuZ3RoKTtcblxuICAgIHRoaXMucHJldmlld3MgPSB0aGlzLmltYWdlcy5maWx0ZXIoKGltZzogSW50ZXJuYWxMaWJJbWFnZSwgaTogbnVtYmVyKSA9PiBpID49IHRoaXMuc3RhcnQgJiYgaSA8IHRoaXMuZW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZCB0byB1cGRhdGUgdGhlIHZpc2libGUgcHJldmlld3MgbmF2aWdhdGluZyB0byB0aGUgbGVmdCAocHJldmlvdXMpLlxuICAgKi9cbiAgcHJpdmF0ZSBwcmV2aW91cygpOiB2b2lkIHtcbiAgICAvLyBjaGVjayBpZiBwcmV2SW1hZ2Ugc2hvdWxkIGJlIGJsb2NrZWRcbiAgICBpZiAodGhpcy5pc1ByZXZlbnRTbGlkaW5nKDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhcnQgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnN0YXJ0ID0gTWF0aC5tYXgodGhpcy5zdGFydCAtIDEsIDApO1xuICAgIHRoaXMuZW5kID0gTWF0aC5taW4odGhpcy5lbmQgLSAxLCB0aGlzLmltYWdlcy5sZW5ndGgpO1xuXG4gICAgdGhpcy5wcmV2aWV3cyA9IHRoaXMuaW1hZ2VzLmZpbHRlcigoaW1nOiBJbnRlcm5hbExpYkltYWdlLCBpOiBudW1iZXIpID0+IGkgPj0gdGhpcy5zdGFydCAmJiBpIDwgdGhpcy5lbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaXZhdGUgbWV0aG9kIHRvIGJsb2NrL3Blcm1pdCBzbGlkaW5nIGJldHdlZW4gcHJldmlld3MuXG4gICAqIEBwYXJhbSBudW1iZXIgYm91bmRhcnlJbmRleCBpcyB0aGUgZmlyc3Qgb3IgdGhlIGxhc3QgaW5kZXggb2YgYGltYWdlc2AgaW5wdXQgYXJyYXlcbiAgICogQHJldHVybnMgYm9vbGVhbiBpZiB0cnVlIGJsb2NrIHNsaWRpbmcsIG90aGVyd2lzZSBub3RcbiAgICovXG4gIHByaXZhdGUgaXNQcmV2ZW50U2xpZGluZyhib3VuZGFyeUluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0SW5kZXgodGhpcy5jdXJyZW50SW1hZ2UsIHRoaXMuaW1hZ2VzKSA9PT0gYm91bmRhcnlJbmRleDtcbiAgfVxufVxuIiwiPG5hdiAqbmdJZj1cInByZXZpZXdDb25maWc/LnZpc2libGVcIlxuICAgICBjbGFzcz1cInByZXZpZXdzLWNvbnRhaW5lclwiXG4gICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWNjZXNzaWJpbGl0eUNvbmZpZz8uY2Fyb3VzZWxQcmV2aWV3c0NvbnRhaW5lckFyaWFMYWJlbFwiXG4gICAgIFt0aXRsZV09XCJhY2Nlc3NpYmlsaXR5Q29uZmlnPy5jYXJvdXNlbFByZXZpZXdzQ29udGFpbmVyVGl0bGVcIj5cblxuICA8YSBjbGFzcz1cIm5hdi1sZWZ0XCJcbiAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY2Nlc3NpYmlsaXR5Q29uZmlnPy5jYXJvdXNlbFByZXZpZXdTY3JvbGxQcmV2QXJpYUxhYmVsXCJcbiAgICAgW3RhYkluZGV4XT1cInByZXZpZXdDb25maWc/LmFycm93cyAmJiBzdGFydCA+IDAgPyAwIDogLTFcIiByb2xlPVwiYnV0dG9uXCJcbiAgICAgKGNsaWNrKT1cIm9uTmF2aWdhdGlvbkV2ZW50KCdsZWZ0JywgJGV2ZW50KVwiIChrZXl1cCk9XCJvbk5hdmlnYXRpb25FdmVudCgnbGVmdCcsICRldmVudClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5zaWRlIHt7cHJldmlld0NvbmZpZz8uYXJyb3dzICYmIHN0YXJ0ID4gMCA/ICdsZWZ0LWFycm93LXByZXZpZXctaW1hZ2UnIDogJ2VtcHR5LWFycm93LXByZXZpZXctaW1hZ2UnfX1cIlxuICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgIFt0aXRsZV09XCJhY2Nlc3NpYmlsaXR5Q29uZmlnPy5jYXJvdXNlbFByZXZpZXdTY3JvbGxQcmV2VGl0bGVcIj48L2Rpdj5cbiAgPC9hPlxuXG4gIDxkaXYgY2xhc3M9XCJwcmV2aWV3LWlubmVyLWNvbnRhaW5lclwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHByZXZpZXcgb2YgcHJldmlld3M7IHRyYWNrQnk6IHRyYWNrQnlJZDsgbGV0IGluZGV4ID0gaW5kZXhcIj5cbiAgICAgIDxpbWcgKm5nSWY9XCJwcmV2aWV3Py5tb2RhbD8uaW1nXCJcbiAgICAgICAgICAgY2xhc3M9XCJpbnNpZGUgcHJldmlldy1pbWFnZXt7aXNBY3RpdmUocHJldmlldykgPyAnIGFjdGl2ZScgOiAnJ319e3shcHJldmlld0NvbmZpZz8uY2xpY2thYmxlID8gJyB1bmNsaWNrYWJsZScgOiAnJ319XCJcbiAgICAgICAgICAgW3NyY109XCJwcmV2aWV3LnBsYWluPy5pbWcgPyBwcmV2aWV3LnBsYWluPy5pbWcgOiBwcmV2aWV3Lm1vZGFsLmltZ1wiXG4gICAgICAgICAgIGtzRmFsbGJhY2tJbWFnZSBbZmFsbGJhY2tJbWddPVwicHJldmlldy5wbGFpbj8uZmFsbGJhY2tJbWcgPyBwcmV2aWV3LnBsYWluPy5mYWxsYmFja0ltZyA6IHByZXZpZXcubW9kYWwuZmFsbGJhY2tJbWdcIlxuICAgICAgICAgICBrc1NpemUgW3NpemVDb25maWddPVwie3dpZHRoOiBwcmV2aWV3Q29uZmlnPy53aWR0aCEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHByZXZpZXdNYXhIZWlnaHR9XCJcbiAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJnZXRBcmlhTGFiZWwocHJldmlldylcIlxuICAgICAgICAgICBbdGl0bGVdPVwiZ2V0VGl0bGUocHJldmlldylcIlxuICAgICAgICAgICBhbHQ9XCJ7e2dldEFsdChwcmV2aWV3KX19XCJcbiAgICAgICAgICAgW3RhYkluZGV4XT1cIjBcIiByb2xlPVwiaW1nXCJcbiAgICAgICAgICAgKGNsaWNrKT1cIm9uSW1hZ2VFdmVudChwcmV2aWV3LCAkZXZlbnQsIGNsaWNrQWN0aW9uKVwiIChrZXl1cCk9XCJvbkltYWdlRXZlbnQocHJldmlldywgJGV2ZW50LCBrZXlib2FyZEFjdGlvbilcIi8+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuXG4gIDxhIGNsYXNzPVwibmF2LXJpZ2h0XCJcbiAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhY2Nlc3NpYmlsaXR5Q29uZmlnPy5jYXJvdXNlbFByZXZpZXdTY3JvbGxOZXh0QXJpYUxhYmVsXCJcbiAgICAgW3RhYkluZGV4XT1cInByZXZpZXdDb25maWc/LmFycm93cyAmJiBlbmQgPCBpbWFnZXMubGVuZ3RoID8gMCA6IC0xXCIgcm9sZT1cImJ1dHRvblwiXG4gICAgIChjbGljayk9XCJvbk5hdmlnYXRpb25FdmVudCgncmlnaHQnLCAkZXZlbnQpXCIgKGtleXVwKT1cIm9uTmF2aWdhdGlvbkV2ZW50KCdyaWdodCcsICRldmVudClcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaW5zaWRlIHt7cHJldmlld0NvbmZpZz8uYXJyb3dzICYmIGVuZCA8IGltYWdlcy5sZW5ndGggPyAncmlnaHQtYXJyb3ctcHJldmlldy1pbWFnZScgOiAnZW1wdHktYXJyb3ctcHJldmlldy1pbWFnZSd9fVwiXG4gICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgW3RpdGxlXT1cImFjY2Vzc2liaWxpdHlDb25maWc/LmNhcm91c2VsUHJldmlld1Njcm9sbE5leHRUaXRsZVwiPjwvZGl2PlxuICA8L2E+XG5cbjwvbmF2PlxuIl19
|