@elxjs/ui 0.0.177 → 0.0.179

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.
@@ -14,21 +14,59 @@ export class EluxCarouselComponent {
14
14
  this.nextClickEventEmitter = new EventEmitter();
15
15
  this.dotClickEventEmitter = new EventEmitter();
16
16
  this.currentIndex = 0;
17
- this.currentStepIndex = 0; // Separate index for tracking current step/page
17
+ this.currentStepIndex = 0;
18
18
  this.offset = 0;
19
- this.touchStartX = 0;
20
- this.touchEndX = 0;
19
+ this.isDragging = false;
20
+ this.startX = 0;
21
+ this.currentX = 0;
22
+ this.initialOffset = 0;
23
+ this.dragOffset = 0;
24
+ this.containerWidth = 0;
25
+ this.itemWidth = 0;
26
+ this.maxOffset = 0;
27
+ this.minOffset = 0;
28
+ this.animationId = null;
29
+ this.velocity = 0;
30
+ this.lastMoveTime = 0;
31
+ this.lastMoveX = 0;
21
32
  }
22
33
  ngAfterContentInit() {
34
+ this.calculateDimensions();
23
35
  this.setItemWidths();
36
+ this.updateLimits();
24
37
  if (this.autoPlayInterval) {
25
38
  this.startAutoPlay();
26
39
  }
27
40
  this.items.changes.subscribe(() => {
41
+ this.calculateDimensions();
28
42
  this.setItemWidths();
29
- this.updateOffset();
43
+ this.updateLimits();
30
44
  this.goToFirstSlide();
31
45
  });
46
+ // Listen for window resize to recalculate dimensions
47
+ window.addEventListener('resize', () => this.onResize());
48
+ }
49
+ ngOnDestroy() {
50
+ this.stopAutoPlay();
51
+ if (this.animationId) {
52
+ cancelAnimationFrame(this.animationId);
53
+ }
54
+ window.removeEventListener('resize', () => this.onResize());
55
+ }
56
+ calculateDimensions() {
57
+ if (this.slidesContainer) {
58
+ this.containerWidth = this.slidesContainer.nativeElement.offsetWidth;
59
+ this.itemWidth = this.containerWidth / this.itemsPerSlide;
60
+ }
61
+ }
62
+ updateLimits() {
63
+ const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
64
+ this.maxOffset = 0;
65
+ this.minOffset = -((totalSteps - 1) * 100);
66
+ }
67
+ onResize() {
68
+ this.calculateDimensions();
69
+ this.updateOffset();
32
70
  }
33
71
  setItemWidths() {
34
72
  this.items.forEach((item) => {
@@ -37,9 +75,11 @@ export class EluxCarouselComponent {
37
75
  });
38
76
  }
39
77
  startAutoPlay() {
40
- this.stopAutoPlay(); // Garante que não há intervalos ativos
78
+ this.stopAutoPlay();
41
79
  this.autoPlayTimer = setInterval(() => {
42
- this.nextSlide();
80
+ if (!this.isDragging) {
81
+ this.nextSlide();
82
+ }
43
83
  }, (this.autoPlayInterval || 0) * 1000);
44
84
  }
45
85
  stopAutoPlay() {
@@ -48,23 +88,126 @@ export class EluxCarouselComponent {
48
88
  this.autoPlayTimer = null;
49
89
  }
50
90
  }
91
+ // Mouse events
92
+ onMouseDown(event) {
93
+ event.preventDefault();
94
+ this.startDrag(event.clientX);
95
+ }
96
+ onMouseMove(event) {
97
+ if (this.isDragging) {
98
+ event.preventDefault();
99
+ this.updateDrag(event.clientX);
100
+ }
101
+ }
102
+ onMouseUp(event) {
103
+ if (this.isDragging) {
104
+ this.endDrag();
105
+ }
106
+ }
107
+ onMouseLeave(event) {
108
+ if (this.isDragging) {
109
+ this.endDrag();
110
+ }
111
+ }
112
+ // Touch events
51
113
  onTouchStart(event) {
52
- this.touchStartX = event.touches[0].clientX;
53
- this.touchEndX = this.touchStartX; // reseta para evitar swipe falso
114
+ event.preventDefault();
115
+ this.startDrag(event.touches[0].clientX);
54
116
  }
55
117
  onTouchMove(event) {
56
- this.touchEndX = event.touches[0].clientX;
118
+ if (this.isDragging) {
119
+ event.preventDefault();
120
+ this.updateDrag(event.touches[0].clientX);
121
+ }
122
+ }
123
+ onTouchEnd(event) {
124
+ if (this.isDragging) {
125
+ this.endDrag();
126
+ }
57
127
  }
58
- onTouchEnd() {
59
- const swipeDistance = this.touchEndX - this.touchStartX;
60
- // considera swipe se movimento for maior que 2px
61
- if (Math.abs(swipeDistance) < 2)
128
+ startDrag(clientX) {
129
+ this.isDragging = true;
130
+ this.startX = clientX;
131
+ this.currentX = clientX;
132
+ this.initialOffset = this.offset;
133
+ this.dragOffset = 0;
134
+ this.velocity = 0;
135
+ this.lastMoveTime = Date.now();
136
+ this.lastMoveX = clientX;
137
+ this.calculateDimensions();
138
+ this.stopAutoPlay();
139
+ // Disable CSS transitions during drag
140
+ this.renderer.setStyle(this.slidesContainer.nativeElement, 'transition', 'none');
141
+ }
142
+ updateDrag(clientX) {
143
+ if (!this.isDragging)
144
+ return;
145
+ this.currentX = clientX;
146
+ const deltaX = this.currentX - this.startX;
147
+ // Calculate velocity for momentum
148
+ const now = Date.now();
149
+ const timeDelta = now - this.lastMoveTime;
150
+ if (timeDelta > 0) {
151
+ this.velocity = (clientX - this.lastMoveX) / timeDelta;
152
+ }
153
+ this.lastMoveTime = now;
154
+ this.lastMoveX = clientX;
155
+ // Convert pixel movement to percentage
156
+ const dragPercentage = (deltaX / this.containerWidth) * 100;
157
+ // Apply resistance at boundaries
158
+ let resistedDragPercentage = dragPercentage;
159
+ const potentialOffset = this.initialOffset + dragPercentage;
160
+ if (potentialOffset > this.maxOffset) {
161
+ const overDrag = potentialOffset - this.maxOffset;
162
+ resistedDragPercentage = dragPercentage - (overDrag * 0.3);
163
+ }
164
+ else if (potentialOffset < this.minOffset) {
165
+ const overDrag = this.minOffset - potentialOffset;
166
+ resistedDragPercentage = dragPercentage + (overDrag * 0.3);
167
+ }
168
+ this.dragOffset = resistedDragPercentage;
169
+ this.updateDragPosition();
170
+ }
171
+ updateDragPosition() {
172
+ const newOffset = this.initialOffset + this.dragOffset;
173
+ this.renderer.setStyle(this.slidesContainer.nativeElement, 'transform', `translateX(${newOffset}%)`);
174
+ }
175
+ endDrag() {
176
+ if (!this.isDragging)
62
177
  return;
63
- if (swipeDistance > 0) {
64
- this.prevSlide();
178
+ this.isDragging = false;
179
+ // Re-enable CSS transitions
180
+ this.renderer.setStyle(this.slidesContainer.nativeElement, 'transition', 'transform 0.4s ease-out');
181
+ const finalOffset = this.initialOffset + this.dragOffset;
182
+ const threshold = 50; // Minimum drag distance in pixels to trigger slide change
183
+ const dragDistance = Math.abs(this.currentX - this.startX);
184
+ // Check for momentum (velocity-based slide change)
185
+ const momentumThreshold = 0.5;
186
+ const hasSignificantVelocity = Math.abs(this.velocity) > momentumThreshold;
187
+ if (dragDistance > threshold || hasSignificantVelocity) {
188
+ if (this.dragOffset > 0 || (hasSignificantVelocity && this.velocity > 0)) {
189
+ // Dragged right or has positive velocity - go to previous slide
190
+ this.prevSlide();
191
+ }
192
+ else if (this.dragOffset < 0 || (hasSignificantVelocity && this.velocity < 0)) {
193
+ // Dragged left or has negative velocity - go to next slide
194
+ this.nextSlide();
195
+ }
196
+ else {
197
+ // Small drag, snap back to current position
198
+ this.updateOffset();
199
+ }
200
+ }
201
+ else {
202
+ // Small drag, snap back to current position
203
+ this.updateOffset();
65
204
  }
66
- else if (swipeDistance < 0) {
67
- this.nextSlide();
205
+ // Reset drag state
206
+ this.dragOffset = 0;
207
+ this.velocity = 0;
208
+ // Restart autoplay if it was enabled
209
+ if (this.autoPlayInterval) {
210
+ setTimeout(() => this.startAutoPlay(), 1000);
68
211
  }
69
212
  }
70
213
  getStepIndexCount() {
@@ -88,13 +231,18 @@ export class EluxCarouselComponent {
88
231
  this.dotClickEventEmitter.emit();
89
232
  }
90
233
  prevSlide() {
234
+ const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
91
235
  if (this.currentStepIndex > 0) {
92
236
  this.currentStepIndex--;
93
237
  this.currentIndex = this.currentStepIndex * this.itemsPerSlide;
94
- this.updateOffset();
95
- this.scrollActiveDotIntoView(this.currentStepIndex);
96
- this.previousClickEventEmitter.emit();
97
238
  }
239
+ else {
240
+ this.currentStepIndex = totalSteps - 1;
241
+ this.currentIndex = Math.min(this.currentStepIndex * this.itemsPerSlide, this.items.length - this.itemsPerSlide);
242
+ }
243
+ this.updateOffset();
244
+ this.scrollActiveDotIntoView(this.currentStepIndex);
245
+ this.previousClickEventEmitter.emit();
98
246
  }
99
247
  nextSlide() {
100
248
  const totalSteps = Math.ceil(this.items.length / this.itemsPerSlide);
@@ -112,6 +260,9 @@ export class EluxCarouselComponent {
112
260
  }
113
261
  updateOffset() {
114
262
  this.offset = -100 * (this.currentIndex / this.itemsPerSlide);
263
+ if (!this.isDragging && this.slidesContainer) {
264
+ this.renderer.setStyle(this.slidesContainer.nativeElement, 'transform', `translateX(${this.offset}%)`);
265
+ }
115
266
  }
116
267
  scrollActiveDotIntoView(index) {
117
268
  setTimeout(() => {
@@ -132,17 +283,20 @@ export class EluxCarouselComponent {
132
283
  });
133
284
  }
134
285
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EluxCarouselComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
135
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EluxCarouselComponent, isStandalone: true, selector: "lib-elux-carousel", inputs: { itemsPerSlide: "itemsPerSlide", removeArrows: "removeArrows", removeDots: "removeDots", autoPlayInterval: "autoPlayInterval" }, outputs: { previousClickEventEmitter: "previousClickEventEmitter", nextClickEventEmitter: "nextClickEventEmitter", dotClickEventEmitter: "dotClickEventEmitter" }, queries: [{ propertyName: "items", predicate: ["carouselItem"], read: ElementRef }], viewQueries: [{ propertyName: "dotsContainer", first: true, predicate: ["dotsContainer"], descendants: true }], ngImport: i0, template: "<div class=\"c-carousel-container\">\n <div class=\"c-carousel-slides\" [style.transform]=\"'translateX(' + offset + '%)'\" (touchstart)=\"onTouchStart($event)\" (touchmove)=\"onTouchMove($event)\" (touchend)=\"onTouchEnd()\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav prev\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div [hidden]=\"removeDots\" class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav next\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-slides{display:flex;transition:transform .4s ease-in-out;touch-action:pan-y}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:16px 0 24px}.c-carousel-footer .c-carousel-nav{background:none;border:none;cursor:pointer;padding:8px;border-radius:50px;background-color:#dfe7ea;transition:all ease-in-out .2s;z-index:2}.c-carousel-footer .c-carousel-nav:hover{transform:scale(1.1)}.c-carousel-footer .c-carousel-nav ::ng-deep span{display:block}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border:1px solid #020f2e;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover,.c-carousel-footer .dot.active{background-color:#011e41}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: EluxIcon, selector: "lib-elux-icon", inputs: ["color", "useSubscription", "icon", "description", "size", "height", "width", "sizeType"] }] }); }
286
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EluxCarouselComponent, isStandalone: true, selector: "lib-elux-carousel", inputs: { itemsPerSlide: "itemsPerSlide", removeArrows: "removeArrows", removeDots: "removeDots", autoPlayInterval: "autoPlayInterval" }, outputs: { previousClickEventEmitter: "previousClickEventEmitter", nextClickEventEmitter: "nextClickEventEmitter", dotClickEventEmitter: "dotClickEventEmitter" }, queries: [{ propertyName: "items", predicate: ["carouselItem"], read: ElementRef }], viewQueries: [{ propertyName: "dotsContainer", first: true, predicate: ["dotsContainer"], descendants: true }, { propertyName: "slidesContainer", first: true, predicate: ["slidesContainer"], descendants: true }], ngImport: i0, template: "<div class=\"c-carousel-container\">\n <div \n class=\"c-carousel-slides\" \n #slidesContainer\n [style.transform]=\"'translateX(' + offset + '%)'\" \n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave($event)\"\n (touchstart)=\"onTouchStart($event)\" \n (touchmove)=\"onTouchMove($event)\" \n (touchend)=\"onTouchEnd($event)\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav prev\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div [hidden]=\"removeDots\" class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav next\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-slides{display:flex;transition:transform .4s ease-out;touch-action:pan-y;cursor:grab;-webkit-user-select:none;user-select:none;will-change:transform}.c-carousel-slides:active{cursor:grabbing}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer;pointer-events:auto}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:16px 0 24px}.c-carousel-footer .c-carousel-nav{background:none;border:none;cursor:pointer;padding:8px;border-radius:50px;background-color:#dfe7ea;transition:all ease-in-out .2s;z-index:2}.c-carousel-footer .c-carousel-nav:hover{transform:scale(1.1)}.c-carousel-footer .c-carousel-nav ::ng-deep span{display:block}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border:1px solid #020f2e;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover,.c-carousel-footer .dot.active{background-color:#011e41}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: EluxIcon, selector: "lib-elux-icon", inputs: ["color", "useSubscription", "icon", "description", "size", "height", "width", "sizeType"] }] }); }
136
287
  }
137
288
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EluxCarouselComponent, decorators: [{
138
289
  type: Component,
139
- args: [{ standalone: true, selector: 'lib-elux-carousel', imports: [CommonModule, EluxIcon], template: "<div class=\"c-carousel-container\">\n <div class=\"c-carousel-slides\" [style.transform]=\"'translateX(' + offset + '%)'\" (touchstart)=\"onTouchStart($event)\" (touchmove)=\"onTouchMove($event)\" (touchend)=\"onTouchEnd()\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav prev\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div [hidden]=\"removeDots\" class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav next\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-slides{display:flex;transition:transform .4s ease-in-out;touch-action:pan-y}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:16px 0 24px}.c-carousel-footer .c-carousel-nav{background:none;border:none;cursor:pointer;padding:8px;border-radius:50px;background-color:#dfe7ea;transition:all ease-in-out .2s;z-index:2}.c-carousel-footer .c-carousel-nav:hover{transform:scale(1.1)}.c-carousel-footer .c-carousel-nav ::ng-deep span{display:block}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border:1px solid #020f2e;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover,.c-carousel-footer .dot.active{background-color:#011e41}\n"] }]
290
+ args: [{ standalone: true, selector: 'lib-elux-carousel', imports: [CommonModule, EluxIcon], template: "<div class=\"c-carousel-container\">\n <div \n class=\"c-carousel-slides\" \n #slidesContainer\n [style.transform]=\"'translateX(' + offset + '%)'\" \n (mousedown)=\"onMouseDown($event)\"\n (mousemove)=\"onMouseMove($event)\"\n (mouseup)=\"onMouseUp($event)\"\n (mouseleave)=\"onMouseLeave($event)\"\n (touchstart)=\"onTouchStart($event)\" \n (touchmove)=\"onTouchMove($event)\" \n (touchend)=\"onTouchEnd($event)\">\n <ng-content></ng-content>\n </div>\n\n <div class=\"c-carousel-footer\">\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav prev\" title=\"Slide anterior\" aria-label=\"Slide anterior\" (click)=\"prevSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Left.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n\n <div [hidden]=\"removeDots\" class=\"c-carousel-dots\" #dotsContainer>\n <span\n role=\"button\"\n class=\"dot\"\n *ngFor=\"let index of getStepIndexCount()\"\n (click)=\"goToSlide(index)\"\n (keyup)=\"goToSlide(index)\"\n [class.active]=\"index === getCurrentStepIndex()\"\n [attr.aria-disabled]=\"true\"\n [attr.aria-label]=\"'pagina' + (index + 1)\"\n >\n </span>\n </div>\n\n <button [hidden]=\"removeArrows\" class=\"c-carousel-nav next\" title=\"Pr\u00F3ximo slide\" aria-label=\"Pr\u00F3ximo slide\" (click)=\"nextSlide()\">\n <lib-elux-icon [icon]=\"'Chevron_Right.svg'\" [size]=\"'16'\" [sizeType]=\"'px'\" [color]=\"'#020F2E'\"></lib-elux-icon>\n </button>\n </div>\n</div>\n", styles: [".display{font-family:Electrolux Sans;font-size:48px;font-weight:700;line-height:56px}.heading-1{font-family:Electrolux Sans;font-size:34px;font-weight:700;line-height:40px}.heading-2{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}@media screen and (max-width: 768px){.display{font-family:Electrolux Sans;font-size:40px;font-weight:700;line-height:46px}.heading-1{font-family:Electrolux Sans;font-size:28px;font-weight:600;line-height:32px}.heading-2{font-family:Electrolux Sans;font-size:24px;font-weight:600;line-height:28px}.heading-3{font-family:Electrolux Sans;font-size:20px;font-weight:600;line-height:24px}.subtitle-1{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:20px}.body{font-family:Electrolux Sans;font-size:16px;font-weight:400;line-height:21px}.caption{font-family:Electrolux Sans;font-size:14px;font-weight:400;line-height:normal}.links{font-family:Electrolux Sans;font-size:16px;font-weight:600;line-height:normal;text-decoration-line:underline}}.c-carousel-container{position:relative;width:100%}.c-carousel-slides{display:flex;transition:transform .4s ease-out;touch-action:pan-y;cursor:grab;-webkit-user-select:none;user-select:none;will-change:transform}.c-carousel-slides:active{cursor:grabbing}.c-carousel-item{display:flex;flex-direction:column;text-align:center;align-items:center;justify-content:center;gap:16px;height:150px;margin:6px;border:1px solid #dee7ea;border-radius:2px;cursor:pointer;pointer-events:auto}.c-carousel-item .c-span{font-weight:400;font-size:18px;color:#011e41}.c-carousel-footer{width:min-content;margin:auto;display:flex;align-items:center;justify-content:space-between;padding:16px 0 24px}.c-carousel-footer .c-carousel-nav{background:none;border:none;cursor:pointer;padding:8px;border-radius:50px;background-color:#dfe7ea;transition:all ease-in-out .2s;z-index:2}.c-carousel-footer .c-carousel-nav:hover{transform:scale(1.1)}.c-carousel-footer .c-carousel-nav ::ng-deep span{display:block}.c-carousel-footer .c-carousel-dots{padding:6px;display:flex;text-align:center;border:1px solid #020f2e;border-radius:16px;margin:0 16px;max-width:120px;overflow:hidden;position:relative}@media (max-width: 768px){.c-carousel-footer .c-carousel-dots{margin:0 12px;max-width:100px}}.c-carousel-footer .dot{height:10px;width:10px;margin:0 5px;background-color:#dfe7ea;border-radius:50%;display:inline-block;cursor:pointer;transition:all ease-in-out .2s;flex-shrink:0}.c-carousel-footer .dot:hover,.c-carousel-footer .dot.active{background-color:#011e41}\n"] }]
140
291
  }], ctorParameters: () => [{ type: i0.Renderer2 }], propDecorators: { items: [{
141
292
  type: ContentChildren,
142
293
  args: ['carouselItem', { read: ElementRef }]
143
294
  }], dotsContainer: [{
144
295
  type: ViewChild,
145
296
  args: ['dotsContainer']
297
+ }], slidesContainer: [{
298
+ type: ViewChild,
299
+ args: ['slidesContainer']
146
300
  }], itemsPerSlide: [{
147
301
  type: Input
148
302
  }], removeArrows: [{
@@ -158,4 +312,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
158
312
  }], dotClickEventEmitter: [{
159
313
  type: Output
160
314
  }] } });
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQXVDLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqTCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7QUFjbkMsTUFBTSxPQUFPLHFCQUFxQjtJQXFCaEMsWUFBb0IsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWpCOUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBRXRDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDdEQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNsRCx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBRTNELGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLENBQUMsQ0FBQyxDQUFDLGdEQUFnRDtRQUN0RSxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRUgsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsY0FBUyxHQUFHLENBQUMsQ0FBQztJQUdvQixDQUFD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QyxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQzVDLE1BQU0sY0FBYyxHQUFHLFFBQVEsR0FBRyxLQUFLLEdBQUcsY0FBYyxHQUFHLENBQUMsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBRTVFLGFBQWEsQ0FBQyxRQUFRLENBQUM7Z0JBQ3JCLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUM7Z0JBQ2pDLFFBQVEsRUFBRSxRQUFRO2FBQ25CLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0F0SlUscUJBQXFCO21HQUFyQixxQkFBcUIsd2FBQ1MsVUFBVSw2SUNqQnJELG0yQ0E2QkEsaTNGRGZZLFlBQVksNEpBQUUsUUFBUTs7NEZBRXJCLHFCQUFxQjtrQkFQakMsU0FBUztpQ0FDSSxJQUFJLFlBQ04sbUJBQW1CLFdBR3BCLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQzs4RUFHc0IsS0FBSztzQkFBM0QsZUFBZTt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFO2dCQUN6QixhQUFhO3NCQUF4QyxTQUFTO3VCQUFDLGVBQWU7Z0JBRWpCLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFSSx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNHLG9CQUFvQjtzQkFBN0IsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb21wb25lbnQsIENvbnRlbnRDaGlsZHJlbiwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEVsdXhJY29uIH0gZnJvbSAnLi4vaWNvbic7XG5cbmV4cG9ydCB0eXBlIFByb2R1Y3RJdGVtID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGltYWdlOiBzdHJpbmc7XG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdsaWItZWx1eC1jYXJvdXNlbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJvdXNlbC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Nhcm91c2VsLmNvbXBvbmVudC5zY3NzJ10sXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEVsdXhJY29uXSxcbn0pXG5leHBvcnQgY2xhc3MgRWx1eENhcm91c2VsQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGRyZW4oJ2Nhcm91c2VsSXRlbScsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBpdGVtcyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnZG90c0NvbnRhaW5lcicpIGRvdHNDb250YWluZXIhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGl0ZW1zUGVyU2xpZGU6IG51bWJlciA9IDQ7XG4gIEBJbnB1dCgpIHJlbW92ZUFycm93czogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSByZW1vdmVEb3RzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGF1dG9QbGF5SW50ZXJ2YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSBwcmV2aW91c0NsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIG5leHRDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkb3RDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7ICBcblxuICBjdXJyZW50SW5kZXggPSAwO1xuICBjdXJyZW50U3RlcEluZGV4ID0gMDsgLy8gU2VwYXJhdGUgaW5kZXggZm9yIHRyYWNraW5nIGN1cnJlbnQgc3RlcC9wYWdlXG4gIG9mZnNldCA9IDA7XG5cbiAgcHJpdmF0ZSB0b3VjaFN0YXJ0WCA9IDA7XG4gIHByaXZhdGUgdG91Y2hFbmRYID0gMDtcbiAgcHJpdmF0ZSBhdXRvUGxheVRpbWVyOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICB0aGlzLnNldEl0ZW1XaWR0aHMoKTtcblxuICAgIGlmICh0aGlzLmF1dG9QbGF5SW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuc3RhcnRBdXRvUGxheSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5zZXRJdGVtV2lkdGhzKCk7XG4gICAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgICAgdGhpcy5nb1RvRmlyc3RTbGlkZSgpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJdGVtV2lkdGhzKCkge1xuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgbWluV2lkdGggPSBgY2FsYygxMDAlIC8gJHt0aGlzLml0ZW1zUGVyU2xpZGV9KWA7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGl0ZW0ubmF0aXZlRWxlbWVudCwgJ21pbldpZHRoJywgbWluV2lkdGgpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhcnRBdXRvUGxheSgpIHtcbiAgICB0aGlzLnN0b3BBdXRvUGxheSgpOyAvLyBHYXJhbnRlIHF1ZSBuw6NvIGjDoSBpbnRlcnZhbG9zIGF0aXZvc1xuICAgIHRoaXMuYXV0b1BsYXlUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIHRoaXMubmV4dFNsaWRlKCk7XG4gICAgfSwgKHRoaXMuYXV0b1BsYXlJbnRlcnZhbCB8fCAwKSAqIDEwMDApO1xuICB9XG5cbiAgc3RvcEF1dG9QbGF5KCkge1xuICAgIGlmICh0aGlzLmF1dG9QbGF5VGltZXIpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hdXRvUGxheVRpbWVyKTtcbiAgICAgIHRoaXMuYXV0b1BsYXlUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgb25Ub3VjaFN0YXJ0KGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgdGhpcy50b3VjaFN0YXJ0WCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgICB0aGlzLnRvdWNoRW5kWCA9IHRoaXMudG91Y2hTdGFydFg7IC8vIHJlc2V0YSBwYXJhIGV2aXRhciBzd2lwZSBmYWxzb1xuICB9XG5cbiAgb25Ub3VjaE1vdmUoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICB0aGlzLnRvdWNoRW5kWCA9IGV2ZW50LnRvdWNoZXNbMF0uY2xpZW50WDtcbiAgfVxuXG4gIG9uVG91Y2hFbmQoKSB7XG4gICAgY29uc3Qgc3dpcGVEaXN0YW5jZSA9IHRoaXMudG91Y2hFbmRYIC0gdGhpcy50b3VjaFN0YXJ0WDtcblxuICAgIC8vIFPDsyBjb25zaWRlcmEgc3dpcGUgc2UgbW92aW1lbnRvIGZvciBtYWlvciBxdWUgMnB4XG4gICAgaWYgKE1hdGguYWJzKHN3aXBlRGlzdGFuY2UpIDwgMikgcmV0dXJuO1xuXG4gICAgaWYgKHN3aXBlRGlzdGFuY2UgPiAwKSB7XG4gICAgICB0aGlzLnByZXZTbGlkZSgpO1xuICAgIH0gZWxzZSBpZiAoc3dpcGVEaXN0YW5jZSA8IDApIHtcbiAgICAgIHRoaXMubmV4dFNsaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RlcEluZGV4Q291bnQoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHRvdGFsU3RlcHMgPSBNYXRoLmNlaWwodGhpcy5pdGVtcy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiB0b3RhbFN0ZXBzIH0sIChfLCBpKSA9PiBpKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRTdGVwSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50U3RlcEluZGV4OyBcbiAgfVxuXG4gIGdvVG9GaXJzdFNsaWRlKCkge1xuICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSAwO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldygwKTtcbiAgfVxuXG4gIGdvVG9TbGlkZShpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gaW5kZXg7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSBNYXRoLm1pbihpbmRleCAqIHRoaXMuaXRlbXNQZXJTbGlkZSwgdGhpcy5pdGVtcy5sZW5ndGggLSB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldyhpbmRleCk7XG4gICAgdGhpcy5kb3RDbGlja0V2ZW50RW1pdHRlci5lbWl0KCk7XG4gIH1cblxuICBwcmV2U2xpZGUoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXBJbmRleCA+IDApIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleC0tO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSB0aGlzLmN1cnJlbnRTdGVwSW5kZXggKiB0aGlzLml0ZW1zUGVyU2xpZGU7XG4gICAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgICAgdGhpcy5zY3JvbGxBY3RpdmVEb3RJbnRvVmlldyh0aGlzLmN1cnJlbnRTdGVwSW5kZXgpO1xuICAgICAgdGhpcy5wcmV2aW91c0NsaWNrRXZlbnRFbWl0dGVyLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBuZXh0U2xpZGUoKSB7XG4gICAgY29uc3QgdG90YWxTdGVwcyA9IE1hdGguY2VpbCh0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgaWYgKHRoaXMuY3VycmVudFN0ZXBJbmRleCA+PSB0b3RhbFN0ZXBzIC0gMSkge1xuICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gMDtcbiAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4Kys7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IE1hdGgubWluKHRoaXMuY3VycmVudFN0ZXBJbmRleCAqIHRoaXMuaXRlbXNQZXJTbGlkZSwgdGhpcy5pdGVtcy5sZW5ndGggLSB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgIHRoaXMuc2Nyb2xsQWN0aXZlRG90SW50b1ZpZXcodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcbiAgICB0aGlzLm5leHRDbGlja0V2ZW50RW1pdHRlci5lbWl0KCk7XG4gIH1cblxuICB1cGRhdGVPZmZzZXQoKSB7XG4gICAgdGhpcy5vZmZzZXQgPSAtMTAwICogKHRoaXMuY3VycmVudEluZGV4IC8gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsQWN0aXZlRG90SW50b1ZpZXcoaW5kZXg6IG51bWJlcikge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZG90c0NvbnRhaW5lciA9IHRoaXMuZG90c0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghZG90c0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkb3RzID0gZG90c0NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkb3QnKTtcbiAgICAgIGlmICghZG90cyB8fCAhZG90c1tpbmRleF0pIHJldHVybjtcblxuICAgICAgY29uc3QgYWN0aXZlRG90ID0gZG90c1tpbmRleF07XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGRvdHNDb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCBkb3RXaWR0aCA9IGFjdGl2ZURvdC5vZmZzZXRXaWR0aCArIDEwO1xuICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSBkb3RXaWR0aCAqIGluZGV4IC0gY29udGFpbmVyV2lkdGggLyAyICsgZG90V2lkdGggLyAyO1xuXG4gICAgICBkb3RzQ29udGFpbmVyLnNjcm9sbFRvKHtcbiAgICAgICAgbGVmdDogTWF0aC5tYXgoMCwgc2Nyb2xsUG9zaXRpb24pLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImMtY2Fyb3VzZWwtY29udGFpbmVyXCI+XG4gIDxkaXYgY2xhc3M9XCJjLWNhcm91c2VsLXNsaWRlc1wiIFtzdHlsZS50cmFuc2Zvcm1dPVwiJ3RyYW5zbGF0ZVgoJyArIG9mZnNldCArICclKSdcIiAodG91Y2hzdGFydCk9XCJvblRvdWNoU3RhcnQoJGV2ZW50KVwiICh0b3VjaG1vdmUpPVwib25Ub3VjaE1vdmUoJGV2ZW50KVwiICh0b3VjaGVuZCk9XCJvblRvdWNoRW5kKClcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJjLWNhcm91c2VsLWZvb3RlclwiPlxuICAgIDxidXR0b24gW2hpZGRlbl09XCJyZW1vdmVBcnJvd3NcIiBjbGFzcz1cImMtY2Fyb3VzZWwtbmF2IHByZXZcIiB0aXRsZT1cIlNsaWRlIGFudGVyaW9yXCIgYXJpYS1sYWJlbD1cIlNsaWRlIGFudGVyaW9yXCIgKGNsaWNrKT1cInByZXZTbGlkZSgpXCI+XG4gICAgICA8bGliLWVsdXgtaWNvbiBbaWNvbl09XCInQ2hldnJvbl9MZWZ0LnN2ZydcIiBbc2l6ZV09XCInMTYnXCIgW3NpemVUeXBlXT1cIidweCdcIiBbY29sb3JdPVwiJyMwMjBGMkUnXCI+PC9saWItZWx1eC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBbaGlkZGVuXT1cInJlbW92ZURvdHNcIiBjbGFzcz1cImMtY2Fyb3VzZWwtZG90c1wiICNkb3RzQ29udGFpbmVyPlxuICAgICAgPHNwYW5cbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzPVwiZG90XCJcbiAgICAgICAgKm5nRm9yPVwibGV0IGluZGV4IG9mIGdldFN0ZXBJbmRleENvdW50KClcIlxuICAgICAgICAoY2xpY2spPVwiZ29Ub1NsaWRlKGluZGV4KVwiXG4gICAgICAgIChrZXl1cCk9XCJnb1RvU2xpZGUoaW5kZXgpXCJcbiAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJpbmRleCA9PT0gZ2V0Q3VycmVudFN0ZXBJbmRleCgpXCJcbiAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGFnaW5hJyArIChpbmRleCArIDEpXCJcbiAgICAgID5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxidXR0b24gW2hpZGRlbl09XCJyZW1vdmVBcnJvd3NcIiBjbGFzcz1cImMtY2Fyb3VzZWwtbmF2IG5leHRcIiB0aXRsZT1cIlByw7N4aW1vIHNsaWRlXCIgYXJpYS1sYWJlbD1cIlByw7N4aW1vIHNsaWRlXCIgKGNsaWNrKT1cIm5leHRTbGlkZSgpXCI+XG4gICAgICA8bGliLWVsdXgtaWNvbiBbaWNvbl09XCInQ2hldnJvbl9SaWdodC5zdmcnXCIgW3NpemVdPVwiJzE2J1wiIFtzaXplVHlwZV09XCIncHgnXCIgW2NvbG9yXT1cIicjMDIwRjJFJ1wiPjwvbGliLWVsdXgtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fyb3VzZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdWkvbGlicmFyeS9zcmMvbGliL2NvbXBvbmVudHMvY2Fyb3VzZWwvY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBb0IsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQXdCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsSyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sU0FBUyxDQUFDOzs7QUFjbkMsTUFBTSxPQUFPLHFCQUFxQjtJQWlDaEMsWUFBb0IsUUFBbUI7UUFBbkIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQTVCOUIsa0JBQWEsR0FBVyxDQUFDLENBQUM7UUFDMUIsaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUM1QixxQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO1FBRXRDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFTLENBQUM7UUFDdEQsMEJBQXFCLEdBQUcsSUFBSSxZQUFZLEVBQVMsQ0FBQztRQUNsRCx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBRTNELGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLHFCQUFnQixHQUFHLENBQUMsQ0FBQztRQUNyQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBRUgsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsYUFBUSxHQUFHLENBQUMsQ0FB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REF1Q0Esdy9GRHpCWSxZQUFZLDRKQUFFLFFBQVE7OzRGQUVyQixxQkFBcUI7a0JBUGpDLFNBQVM7aUNBQ0ksSUFBSSxZQUNOLG1CQUFtQixXQUdwQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUM7OEVBR3NCLEtBQUs7c0JBQTNELGVBQWU7dUJBQUMsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFDekIsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQUNJLGVBQWU7c0JBQTVDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUVuQixhQUFhO3NCQUFyQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUkseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGRyZW4sIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBRdWVyeUxpc3QsIFJlbmRlcmVyMiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFbHV4SWNvbiB9IGZyb20gJy4uL2ljb24nO1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0SXRlbSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBpbWFnZTogc3RyaW5nO1xufTtcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnbGliLWVsdXgtY2Fyb3VzZWwnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2Fyb3VzZWwuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jYXJvdXNlbC5jb21wb25lbnQuc2NzcyddLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBFbHV4SWNvbl0sXG59KVxuZXhwb3J0IGNsYXNzIEVsdXhDYXJvdXNlbENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uRGVzdHJveSB7XG4gIEBDb250ZW50Q2hpbGRyZW4oJ2Nhcm91c2VsSXRlbScsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBpdGVtcyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgQFZpZXdDaGlsZCgnZG90c0NvbnRhaW5lcicpIGRvdHNDb250YWluZXIhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzbGlkZXNDb250YWluZXInKSBzbGlkZXNDb250YWluZXIhOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpIGl0ZW1zUGVyU2xpZGU6IG51bWJlciA9IDQ7XG4gIEBJbnB1dCgpIHJlbW92ZUFycm93czogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSByZW1vdmVEb3RzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGF1dG9QbGF5SW50ZXJ2YWw6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIEBPdXRwdXQoKSBwcmV2aW91c0NsaWNrRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIG5leHRDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkb3RDbGlja0V2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RXZlbnQ+KCk7ICBcblxuICBjdXJyZW50SW5kZXggPSAwO1xuICBjdXJyZW50U3RlcEluZGV4ID0gMDtcbiAgb2Zmc2V0ID0gMDtcblxuICBwcml2YXRlIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBzdGFydFggPSAwO1xuICBwcml2YXRlIGN1cnJlbnRYID0gMDtcbiAgcHJpdmF0ZSBpbml0aWFsT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBkcmFnT2Zmc2V0ID0gMDtcbiAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDA7XG4gIHByaXZhdGUgaXRlbVdpZHRoID0gMDtcbiAgcHJpdmF0ZSBtYXhPZmZzZXQgPSAwO1xuICBwcml2YXRlIG1pbk9mZnNldCA9IDA7XG4gIHByaXZhdGUgYXV0b1BsYXlUaW1lcjogYW55O1xuICBwcml2YXRlIGFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB2ZWxvY2l0eSA9IDA7XG4gIHByaXZhdGUgbGFzdE1vdmVUaW1lID0gMDtcbiAgcHJpdmF0ZSBsYXN0TW92ZVggPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMikge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5zZXRJdGVtV2lkdGhzKCk7XG4gICAgdGhpcy51cGRhdGVMaW1pdHMoKTtcblxuICAgIGlmICh0aGlzLmF1dG9QbGF5SW50ZXJ2YWwpIHtcbiAgICAgIHRoaXMuc3RhcnRBdXRvUGxheSgpO1xuICAgIH1cblxuICAgIHRoaXMuaXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgICB0aGlzLnNldEl0ZW1XaWR0aHMoKTtcbiAgICAgIHRoaXMudXBkYXRlTGltaXRzKCk7XG4gICAgICB0aGlzLmdvVG9GaXJzdFNsaWRlKCk7XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHdpbmRvdyByZXNpemUgdG8gcmVjYWxjdWxhdGUgZGltZW5zaW9uc1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLm9uUmVzaXplKCkpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdG9wQXV0b1BsYXkoKTtcbiAgICBpZiAodGhpcy5hbmltYXRpb25JZCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5hbmltYXRpb25JZCk7XG4gICAgfVxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB0aGlzLm9uUmVzaXplKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVEaW1lbnNpb25zKCkge1xuICAgIGlmICh0aGlzLnNsaWRlc0NvbnRhaW5lcikge1xuICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IHRoaXMuc2xpZGVzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICB0aGlzLml0ZW1XaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggLyB0aGlzLml0ZW1zUGVyU2xpZGU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMaW1pdHMoKSB7XG4gICAgY29uc3QgdG90YWxTdGVwcyA9IE1hdGguY2VpbCh0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgdGhpcy5tYXhPZmZzZXQgPSAwO1xuICAgIHRoaXMubWluT2Zmc2V0ID0gLSgodG90YWxTdGVwcyAtIDEpICogMTAwKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZXNpemUoKSB7XG4gICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SXRlbVdpZHRocygpIHtcbiAgICB0aGlzLml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IG1pbldpZHRoID0gYGNhbGMoMTAwJSAvICR7dGhpcy5pdGVtc1BlclNsaWRlfSlgO1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZShpdGVtLm5hdGl2ZUVsZW1lbnQsICdtaW5XaWR0aCcsIG1pbldpZHRoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXJ0QXV0b1BsYXkoKSB7XG4gICAgdGhpcy5zdG9wQXV0b1BsYXkoKTtcbiAgICB0aGlzLmF1dG9QbGF5VGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgICB0aGlzLm5leHRTbGlkZSgpO1xuICAgICAgfVxuICAgIH0sICh0aGlzLmF1dG9QbGF5SW50ZXJ2YWwgfHwgMCkgKiAxMDAwKTtcbiAgfVxuXG4gIHN0b3BBdXRvUGxheSgpIHtcbiAgICBpZiAodGhpcy5hdXRvUGxheVRpbWVyKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMuYXV0b1BsYXlUaW1lcik7XG4gICAgICB0aGlzLmF1dG9QbGF5VGltZXIgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1vdXNlIGV2ZW50c1xuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGFydERyYWcoZXZlbnQuY2xpZW50WCk7XG4gIH1cblxuICBvbk1vdXNlTW92ZShldmVudDogTW91c2VFdmVudCkge1xuICAgIGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnVwZGF0ZURyYWcoZXZlbnQuY2xpZW50WCk7XG4gICAgfVxuICB9XG5cbiAgb25Nb3VzZVVwKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgdGhpcy5lbmREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgb25Nb3VzZUxlYXZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgdGhpcy5lbmREcmFnKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVG91Y2ggZXZlbnRzXG4gIG9uVG91Y2hTdGFydChldmVudDogVG91Y2hFdmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5zdGFydERyYWcoZXZlbnQudG91Y2hlc1swXS5jbGllbnRYKTtcbiAgfVxuXG4gIG9uVG91Y2hNb3ZlKGV2ZW50OiBUb3VjaEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuaXNEcmFnZ2luZykge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMudXBkYXRlRHJhZyhldmVudC50b3VjaGVzWzBdLmNsaWVudFgpO1xuICAgIH1cbiAgfVxuXG4gIG9uVG91Y2hFbmQoZXZlbnQ6IFRvdWNoRXZlbnQpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICB0aGlzLmVuZERyYWcoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXJ0RHJhZyhjbGllbnRYOiBudW1iZXIpIHtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMuc3RhcnRYID0gY2xpZW50WDtcbiAgICB0aGlzLmN1cnJlbnRYID0gY2xpZW50WDtcbiAgICB0aGlzLmluaXRpYWxPZmZzZXQgPSB0aGlzLm9mZnNldDtcbiAgICB0aGlzLmRyYWdPZmZzZXQgPSAwO1xuICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgIHRoaXMubGFzdE1vdmVUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmxhc3RNb3ZlWCA9IGNsaWVudFg7XG4gICAgXG4gICAgdGhpcy5jYWxjdWxhdGVEaW1lbnNpb25zKCk7XG4gICAgdGhpcy5zdG9wQXV0b1BsYXkoKTtcbiAgICBcbiAgICAvLyBEaXNhYmxlIENTUyB0cmFuc2l0aW9ucyBkdXJpbmcgZHJhZ1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5zbGlkZXNDb250YWluZXIubmF0aXZlRWxlbWVudCwgJ3RyYW5zaXRpb24nLCAnbm9uZScpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcmFnKGNsaWVudFg6IG51bWJlcikge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmN1cnJlbnRYID0gY2xpZW50WDtcbiAgICBjb25zdCBkZWx0YVggPSB0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFg7XG4gICAgXG4gICAgLy8gQ2FsY3VsYXRlIHZlbG9jaXR5IGZvciBtb21lbnR1bVxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgdGltZURlbHRhID0gbm93IC0gdGhpcy5sYXN0TW92ZVRpbWU7XG4gICAgaWYgKHRpbWVEZWx0YSA+IDApIHtcbiAgICAgIHRoaXMudmVsb2NpdHkgPSAoY2xpZW50WCAtIHRoaXMubGFzdE1vdmVYKSAvIHRpbWVEZWx0YTtcbiAgICB9XG4gICAgdGhpcy5sYXN0TW92ZVRpbWUgPSBub3c7XG4gICAgdGhpcy5sYXN0TW92ZVggPSBjbGllbnRYO1xuXG4gICAgLy8gQ29udmVydCBwaXhlbCBtb3ZlbWVudCB0byBwZXJjZW50YWdlXG4gICAgY29uc3QgZHJhZ1BlcmNlbnRhZ2UgPSAoZGVsdGFYIC8gdGhpcy5jb250YWluZXJXaWR0aCkgKiAxMDA7XG4gICAgXG4gICAgLy8gQXBwbHkgcmVzaXN0YW5jZSBhdCBib3VuZGFyaWVzXG4gICAgbGV0IHJlc2lzdGVkRHJhZ1BlcmNlbnRhZ2UgPSBkcmFnUGVyY2VudGFnZTtcbiAgICBjb25zdCBwb3RlbnRpYWxPZmZzZXQgPSB0aGlzLmluaXRpYWxPZmZzZXQgKyBkcmFnUGVyY2VudGFnZTtcbiAgICBcbiAgICBpZiAocG90ZW50aWFsT2Zmc2V0ID4gdGhpcy5tYXhPZmZzZXQpIHtcbiAgICAgIGNvbnN0IG92ZXJEcmFnID0gcG90ZW50aWFsT2Zmc2V0IC0gdGhpcy5tYXhPZmZzZXQ7XG4gICAgICByZXNpc3RlZERyYWdQZXJjZW50YWdlID0gZHJhZ1BlcmNlbnRhZ2UgLSAob3ZlckRyYWcgKiAwLjMpO1xuICAgIH0gZWxzZSBpZiAocG90ZW50aWFsT2Zmc2V0IDwgdGhpcy5taW5PZmZzZXQpIHtcbiAgICAgIGNvbnN0IG92ZXJEcmFnID0gdGhpcy5taW5PZmZzZXQgLSBwb3RlbnRpYWxPZmZzZXQ7XG4gICAgICByZXNpc3RlZERyYWdQZXJjZW50YWdlID0gZHJhZ1BlcmNlbnRhZ2UgKyAob3ZlckRyYWcgKiAwLjMpO1xuICAgIH1cblxuICAgIHRoaXMuZHJhZ09mZnNldCA9IHJlc2lzdGVkRHJhZ1BlcmNlbnRhZ2U7XG4gICAgdGhpcy51cGRhdGVEcmFnUG9zaXRpb24oKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRHJhZ1Bvc2l0aW9uKCkge1xuICAgIGNvbnN0IG5ld09mZnNldCA9IHRoaXMuaW5pdGlhbE9mZnNldCArIHRoaXMuZHJhZ09mZnNldDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgdGhpcy5zbGlkZXNDb250YWluZXIubmF0aXZlRWxlbWVudCwgXG4gICAgICAndHJhbnNmb3JtJywgXG4gICAgICBgdHJhbnNsYXRlWCgke25ld09mZnNldH0lKWBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBlbmREcmFnKCkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBcbiAgICAvLyBSZS1lbmFibGUgQ1NTIHRyYW5zaXRpb25zXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLnNsaWRlc0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gMC40cyBlYXNlLW91dCcpO1xuXG4gICAgY29uc3QgZmluYWxPZmZzZXQgPSB0aGlzLmluaXRpYWxPZmZzZXQgKyB0aGlzLmRyYWdPZmZzZXQ7XG4gICAgY29uc3QgdGhyZXNob2xkID0gNTA7IC8vIE1pbmltdW0gZHJhZyBkaXN0YW5jZSBpbiBwaXhlbHMgdG8gdHJpZ2dlciBzbGlkZSBjaGFuZ2VcbiAgICBjb25zdCBkcmFnRGlzdGFuY2UgPSBNYXRoLmFicyh0aGlzLmN1cnJlbnRYIC0gdGhpcy5zdGFydFgpO1xuICAgIFxuICAgIC8vIENoZWNrIGZvciBtb21lbnR1bSAodmVsb2NpdHktYmFzZWQgc2xpZGUgY2hhbmdlKVxuICAgIGNvbnN0IG1vbWVudHVtVGhyZXNob2xkID0gMC41O1xuICAgIGNvbnN0IGhhc1NpZ25pZmljYW50VmVsb2NpdHkgPSBNYXRoLmFicyh0aGlzLnZlbG9jaXR5KSA+IG1vbWVudHVtVGhyZXNob2xkO1xuICAgIFxuICAgIGlmIChkcmFnRGlzdGFuY2UgPiB0aHJlc2hvbGQgfHwgaGFzU2lnbmlmaWNhbnRWZWxvY2l0eSkge1xuICAgICAgaWYgKHRoaXMuZHJhZ09mZnNldCA+IDAgfHwgKGhhc1NpZ25pZmljYW50VmVsb2NpdHkgJiYgdGhpcy52ZWxvY2l0eSA+IDApKSB7XG4gICAgICAgIC8vIERyYWdnZWQgcmlnaHQgb3IgaGFzIHBvc2l0aXZlIHZlbG9jaXR5IC0gZ28gdG8gcHJldmlvdXMgc2xpZGVcbiAgICAgICAgdGhpcy5wcmV2U2xpZGUoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnT2Zmc2V0IDwgMCB8fCAoaGFzU2lnbmlmaWNhbnRWZWxvY2l0eSAmJiB0aGlzLnZlbG9jaXR5IDwgMCkpIHtcbiAgICAgICAgLy8gRHJhZ2dlZCBsZWZ0IG9yIGhhcyBuZWdhdGl2ZSB2ZWxvY2l0eSAtIGdvIHRvIG5leHQgc2xpZGVcbiAgICAgICAgdGhpcy5uZXh0U2xpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFNtYWxsIGRyYWcsIHNuYXAgYmFjayB0byBjdXJyZW50IHBvc2l0aW9uXG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFNtYWxsIGRyYWcsIHNuYXAgYmFjayB0byBjdXJyZW50IHBvc2l0aW9uXG4gICAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGRyYWcgc3RhdGVcbiAgICB0aGlzLmRyYWdPZmZzZXQgPSAwO1xuICAgIHRoaXMudmVsb2NpdHkgPSAwO1xuICAgIFxuICAgIC8vIFJlc3RhcnQgYXV0b3BsYXkgaWYgaXQgd2FzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5hdXRvUGxheUludGVydmFsKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc3RhcnRBdXRvUGxheSgpLCAxMDAwKTtcbiAgICB9XG4gIH1cblxuICBnZXRTdGVwSW5kZXhDb3VudCgpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgdG90YWxTdGVwcyA9IE1hdGguY2VpbCh0aGlzLml0ZW1zLmxlbmd0aCAvIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IHRvdGFsU3RlcHMgfSwgKF8sIGkpID0+IGkpO1xuICB9XG5cbiAgZ2V0Q3VycmVudFN0ZXBJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRTdGVwSW5kZXg7IFxuICB9XG5cbiAgZ29Ub0ZpcnN0U2xpZGUoKSB7XG4gICAgdGhpcy5jdXJyZW50SW5kZXggPSAwO1xuICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IDA7XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgICB0aGlzLnNjcm9sbEFjdGl2ZURvdEludG9WaWV3KDApO1xuICB9XG5cbiAgZ29Ub1NsaWRlKGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLmN1cnJlbnRTdGVwSW5kZXggPSBpbmRleDtcbiAgICB0aGlzLmN1cnJlbnRJbmRleCA9IE1hdGgubWluKGluZGV4ICogdGhpcy5pdGVtc1BlclNsaWRlLCB0aGlzLml0ZW1zLmxlbmd0aCAtIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgICB0aGlzLnNjcm9sbEFjdGl2ZURvdEludG9WaWV3KGluZGV4KTtcbiAgICB0aGlzLmRvdENsaWNrRXZlbnRFbWl0dGVyLmVtaXQoKTtcbiAgfVxuXG4gIHByZXZTbGlkZSgpIHtcbiAgICBjb25zdCB0b3RhbFN0ZXBzID0gTWF0aC5jZWlsKHRoaXMuaXRlbXMubGVuZ3RoIC8gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgICBcbiAgICBpZiAodGhpcy5jdXJyZW50U3RlcEluZGV4ID4gMCkge1xuICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4LS07XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHRoaXMuY3VycmVudFN0ZXBJbmRleCAqIHRoaXMuaXRlbXNQZXJTbGlkZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50U3RlcEluZGV4ID0gdG90YWxTdGVwcyAtIDE7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IE1hdGgubWluKHRoaXMuY3VycmVudFN0ZXBJbmRleCAqIHRoaXMuaXRlbXNQZXJTbGlkZSwgdGhpcy5pdGVtcy5sZW5ndGggLSB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLnVwZGF0ZU9mZnNldCgpO1xuICAgIHRoaXMuc2Nyb2xsQWN0aXZlRG90SW50b1ZpZXcodGhpcy5jdXJyZW50U3RlcEluZGV4KTtcbiAgICB0aGlzLnByZXZpb3VzQ2xpY2tFdmVudEVtaXR0ZXIuZW1pdCgpO1xuICB9XG5cbiAgbmV4dFNsaWRlKCkge1xuICAgIGNvbnN0IHRvdGFsU3RlcHMgPSBNYXRoLmNlaWwodGhpcy5pdGVtcy5sZW5ndGggLyB0aGlzLml0ZW1zUGVyU2xpZGUpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRTdGVwSW5kZXggPj0gdG90YWxTdGVwcyAtIDEpIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCA9IDA7XG4gICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3VycmVudFN0ZXBJbmRleCsrO1xuICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRTdGVwSW5kZXggKiB0aGlzLml0ZW1zUGVyU2xpZGUsIHRoaXMuaXRlbXMubGVuZ3RoIC0gdGhpcy5pdGVtc1BlclNsaWRlKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVPZmZzZXQoKTtcbiAgICB0aGlzLnNjcm9sbEFjdGl2ZURvdEludG9WaWV3KHRoaXMuY3VycmVudFN0ZXBJbmRleCk7XG4gICAgdGhpcy5uZXh0Q2xpY2tFdmVudEVtaXR0ZXIuZW1pdCgpO1xuICB9XG5cbiAgdXBkYXRlT2Zmc2V0KCkge1xuICAgIHRoaXMub2Zmc2V0ID0gLTEwMCAqICh0aGlzLmN1cnJlbnRJbmRleCAvIHRoaXMuaXRlbXNQZXJTbGlkZSk7XG4gICAgXG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5zbGlkZXNDb250YWluZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgIHRoaXMuc2xpZGVzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQsIFxuICAgICAgICAndHJhbnNmb3JtJywgXG4gICAgICAgIGB0cmFuc2xhdGVYKCR7dGhpcy5vZmZzZXR9JSlgXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2Nyb2xsQWN0aXZlRG90SW50b1ZpZXcoaW5kZXg6IG51bWJlcikge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZG90c0NvbnRhaW5lciA9IHRoaXMuZG90c0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcbiAgICAgIGlmICghZG90c0NvbnRhaW5lcikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkb3RzID0gZG90c0NvbnRhaW5lci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdkb3QnKTtcbiAgICAgIGlmICghZG90cyB8fCAhZG90c1tpbmRleF0pIHJldHVybjtcblxuICAgICAgY29uc3QgYWN0aXZlRG90ID0gZG90c1tpbmRleF07XG4gICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IGRvdHNDb250YWluZXIub2Zmc2V0V2lkdGg7XG4gICAgICBjb25zdCBkb3RXaWR0aCA9IGFjdGl2ZURvdC5vZmZzZXRXaWR0aCArIDEwO1xuICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSBkb3RXaWR0aCAqIGluZGV4IC0gY29udGFpbmVyV2lkdGggLyAyICsgZG90V2lkdGggLyAyO1xuXG4gICAgICBkb3RzQ29udGFpbmVyLnNjcm9sbFRvKHtcbiAgICAgICAgbGVmdDogTWF0aC5tYXgoMCwgc2Nyb2xsUG9zaXRpb24pLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImMtY2Fyb3VzZWwtY29udGFpbmVyXCI+XG4gIDxkaXYgXG4gICAgY2xhc3M9XCJjLWNhcm91c2VsLXNsaWRlc1wiIFxuICAgICNzbGlkZXNDb250YWluZXJcbiAgICBbc3R5bGUudHJhbnNmb3JtXT1cIid0cmFuc2xhdGVYKCcgKyBvZmZzZXQgKyAnJSknXCIgXG4gICAgKG1vdXNlZG93bik9XCJvbk1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAobW91c2Vtb3ZlKT1cIm9uTW91c2VNb3ZlKCRldmVudClcIlxuICAgIChtb3VzZXVwKT1cIm9uTW91c2VVcCgkZXZlbnQpXCJcbiAgICAobW91c2VsZWF2ZSk9XCJvbk1vdXNlTGVhdmUoJGV2ZW50KVwiXG4gICAgKHRvdWNoc3RhcnQpPVwib25Ub3VjaFN0YXJ0KCRldmVudClcIiBcbiAgICAodG91Y2htb3ZlKT1cIm9uVG91Y2hNb3ZlKCRldmVudClcIiBcbiAgICAodG91Y2hlbmQpPVwib25Ub3VjaEVuZCgkZXZlbnQpXCI+XG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiYy1jYXJvdXNlbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIFtoaWRkZW5dPVwicmVtb3ZlQXJyb3dzXCIgY2xhc3M9XCJjLWNhcm91c2VsLW5hdiBwcmV2XCIgdGl0bGU9XCJTbGlkZSBhbnRlcmlvclwiIGFyaWEtbGFiZWw9XCJTbGlkZSBhbnRlcmlvclwiIChjbGljayk9XCJwcmV2U2xpZGUoKVwiPlxuICAgICAgPGxpYi1lbHV4LWljb24gW2ljb25dPVwiJ0NoZXZyb25fTGVmdC5zdmcnXCIgW3NpemVdPVwiJzE2J1wiIFtzaXplVHlwZV09XCIncHgnXCIgW2NvbG9yXT1cIicjMDIwRjJFJ1wiPjwvbGliLWVsdXgtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICAgIDxkaXYgW2hpZGRlbl09XCJyZW1vdmVEb3RzXCIgY2xhc3M9XCJjLWNhcm91c2VsLWRvdHNcIiAjZG90c0NvbnRhaW5lcj5cbiAgICAgIDxzcGFuXG4gICAgICAgIHJvbGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImRvdFwiXG4gICAgICAgICpuZ0Zvcj1cImxldCBpbmRleCBvZiBnZXRTdGVwSW5kZXhDb3VudCgpXCJcbiAgICAgICAgKGNsaWNrKT1cImdvVG9TbGlkZShpbmRleClcIlxuICAgICAgICAoa2V5dXApPVwiZ29Ub1NsaWRlKGluZGV4KVwiXG4gICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiaW5kZXggPT09IGdldEN1cnJlbnRTdGVwSW5kZXgoKVwiXG4gICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BhZ2luYScgKyAoaW5kZXggKyAxKVwiXG4gICAgICA+XG4gICAgICA8L3NwYW4+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uIFtoaWRkZW5dPVwicmVtb3ZlQXJyb3dzXCIgY2xhc3M9XCJjLWNhcm91c2VsLW5hdiBuZXh0XCIgdGl0bGU9XCJQcsOzeGltbyBzbGlkZVwiIGFyaWEtbGFiZWw9XCJQcsOzeGltbyBzbGlkZVwiIChjbGljayk9XCJuZXh0U2xpZGUoKVwiPlxuICAgICAgPGxpYi1lbHV4LWljb24gW2ljb25dPVwiJ0NoZXZyb25fUmlnaHQuc3ZnJ1wiIFtzaXplXT1cIicxNidcIiBbc2l6ZVR5cGVdPVwiJ3B4J1wiIFtjb2xvcl09XCInIzAyMEYyRSdcIj48L2xpYi1lbHV4LWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=