@igo2/geo 1.13.2 → 1.13.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { Component, Input, ChangeDetectionStrategy, Output } from '@angular/core';
2
- import { FEATURE, FeatureStoreSelectionStrategy, tryBindStoreLayer, tryAddLoadingStrategy, tryAddSelectionStrategy, FeatureMotion, FeatureStoreLoadingStrategy, featureToOl } from '../../feature';
1
+ import { Component, Input, ChangeDetectionStrategy, Output, EventEmitter, ViewChild } from '@angular/core';
2
+ import { FEATURE, FeatureStore, FeatureStoreSelectionStrategy, tryBindStoreLayer, tryAddLoadingStrategy, tryAddSelectionStrategy, FeatureMotion, FeatureStoreLoadingStrategy, featureToOl } from '../../feature';
3
3
  import { FontType, GeometryType } from '../shared/draw.enum';
4
4
  import { BehaviorSubject } from 'rxjs';
5
5
  import { VectorLayer } from '../../layer/shared/layers/vector-layer';
@@ -11,7 +11,7 @@ import OlCircle from 'ol/geom/Circle';
11
11
  import OlPoint from 'ol/geom/Point';
12
12
  import OlGeoJSON from 'ol/format/GeoJSON';
13
13
  import { getDistance } from 'ol/sphere';
14
- import { skip, first } from 'rxjs/operators';
14
+ import { first, skip } from 'rxjs/operators';
15
15
  import { DrawPopupComponent } from './draw-popup.component';
16
16
  import { DrawShorcutsComponent } from './draw-shorcuts.component';
17
17
  import { getTooltipsOfOlGeometry } from '../../measure/shared/measure.utils';
@@ -20,6 +20,7 @@ import { transform } from 'ol/proj';
20
20
  import { StyleModalComponent } from '../../layer/style-modal/style-modal.component';
21
21
  import { trigger, state, style, animate, transition } from '@angular/animations';
22
22
  import Point from 'ol/geom/Point';
23
+ import { DrawLayerPopupComponent } from './draw-layer-popup.component';
23
24
  import * as i0 from "@angular/core";
24
25
  import * as i1 from "@igo2/core";
25
26
  import * as i2 from "@angular/forms";
@@ -29,92 +30,118 @@ import * as i5 from "../shared/draw-icon.service";
29
30
  import * as i6 from "@angular/common";
30
31
  import * as i7 from "@angular/material/button";
31
32
  import * as i8 from "@angular/material/button-toggle";
32
- import * as i9 from "@angular/material/form-field";
33
- import * as i10 from "@angular/material/icon";
34
- import * as i11 from "@angular/material/badge";
35
- import * as i12 from "@angular/material/tooltip";
36
- import * as i13 from "@angular/material/select";
37
- import * as i14 from "@angular/material/core";
38
- import * as i15 from "@angular/material/slide-toggle";
39
- import * as i16 from "@igo2/common";
40
- import * as i17 from "@ngx-translate/core";
41
- function DrawComponent_button_23_Template(rf, ctx) { if (rf & 1) {
42
- const _r5 = i0.ɵɵgetCurrentView();
43
- i0.ɵɵelementStart(0, "button", 14);
44
- i0.ɵɵlistener("click", function DrawComponent_button_23_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r5); const ctx_r4 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r4.deleteDrawings()); });
33
+ import * as i9 from "@angular/material/divider";
34
+ import * as i10 from "@angular/material/form-field";
35
+ import * as i11 from "@angular/material/icon";
36
+ import * as i12 from "@angular/material/badge";
37
+ import * as i13 from "@angular/material/tooltip";
38
+ import * as i14 from "@angular/material/select";
39
+ import * as i15 from "@angular/material/core";
40
+ import * as i16 from "@angular/material/slide-toggle";
41
+ import * as i17 from "@igo2/common";
42
+ import * as i18 from "@ngx-translate/core";
43
+ const _c0 = ["selectedLayer"];
44
+ function DrawComponent_mat_option_30_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵelementStart(0, "mat-option", 2);
46
+ i0.ɵɵtext(1);
47
+ i0.ɵɵelementEnd();
48
+ } if (rf & 2) {
49
+ const layer_r7 = ctx.$implicit;
50
+ i0.ɵɵproperty("value", layer_r7);
51
+ i0.ɵɵadvance(1);
52
+ i0.ɵɵtextInterpolate1(" ", layer_r7.title, " ");
53
+ } }
54
+ function DrawComponent_button_34_Template(rf, ctx) { if (rf & 1) {
55
+ const _r9 = i0.ɵɵgetCurrentView();
56
+ i0.ɵɵelementStart(0, "button", 20);
57
+ i0.ɵɵlistener("click", function DrawComponent_button_34_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r9); const ctx_r8 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r8.activeDrawingLayer.visible = !ctx_r8.activeDrawingLayer.visible); });
58
+ i0.ɵɵpipe(1, "translate");
59
+ i0.ɵɵpipe(2, "translate");
60
+ i0.ɵɵelement(3, "mat-icon", 21);
61
+ i0.ɵɵelementEnd();
62
+ } if (rf & 2) {
63
+ const ctx_r2 = i0.ɵɵnextContext();
64
+ i0.ɵɵproperty("color", ctx_r2.activeDrawingLayer.visible ? "primary" : "default")("matTooltip", ctx_r2.activeDrawingLayer.visible ? i0.ɵɵpipeBind1(1, 3, "igo.geo.layer.hideLayer") : i0.ɵɵpipeBind1(2, 5, "igo.geo.layer.showLayer"));
65
+ i0.ɵɵadvance(3);
66
+ i0.ɵɵproperty("svgIcon", ctx_r2.activeDrawingLayer.visible ? "eye" : "eye-off");
67
+ } }
68
+ function DrawComponent_button_37_Template(rf, ctx) { if (rf & 1) {
69
+ const _r11 = i0.ɵɵgetCurrentView();
70
+ i0.ɵɵelementStart(0, "button", 22);
71
+ i0.ɵɵlistener("click", function DrawComponent_button_37_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r11); const ctx_r10 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r10.deleteDrawings()); });
45
72
  i0.ɵɵpipe(1, "translate");
46
73
  i0.ɵɵpipe(2, "async");
47
- i0.ɵɵelement(3, "mat-icon", 15);
74
+ i0.ɵɵelement(3, "mat-icon", 23);
48
75
  i0.ɵɵelementEnd();
49
76
  } if (rf & 2) {
50
- const ctx_r0 = i0.ɵɵnextContext();
51
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.draw.delete"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r0.selectedFeatures$).length === 0);
77
+ const ctx_r3 = i0.ɵɵnextContext();
78
+ i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 2, "igo.geo.draw.delete"))("disabled", i0.ɵɵpipeBind1(2, 4, ctx_r3.selectedFeatures$).length === 0);
52
79
  } }
53
- function DrawComponent_mat_form_field_28_div_6_Template(rf, ctx) { if (rf & 1) {
54
- i0.ɵɵelementStart(0, "div", 19);
55
- i0.ɵɵelement(1, "img", 20);
80
+ function DrawComponent_mat_form_field_42_div_6_Template(rf, ctx) { if (rf & 1) {
81
+ i0.ɵɵelementStart(0, "div", 27);
82
+ i0.ɵɵelement(1, "img", 28);
56
83
  i0.ɵɵelementEnd();
57
84
  } if (rf & 2) {
58
- const ctx_r6 = i0.ɵɵnextContext(2);
85
+ const ctx_r12 = i0.ɵɵnextContext(2);
59
86
  i0.ɵɵadvance(1);
60
- i0.ɵɵpropertyInterpolate("src", ctx_r6.icon, i0.ɵɵsanitizeUrl);
87
+ i0.ɵɵpropertyInterpolate("src", ctx_r12.icon, i0.ɵɵsanitizeUrl);
61
88
  } }
62
- function DrawComponent_mat_form_field_28_mat_option_10_Template(rf, ctx) { if (rf & 1) {
63
- const _r10 = i0.ɵɵgetCurrentView();
64
- i0.ɵɵelementStart(0, "mat-option", 21);
65
- i0.ɵɵlistener("click", function DrawComponent_mat_form_field_28_mat_option_10_Template_mat_option_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r10); const icon_html_r8 = restoredCtx.$implicit; const ctx_r9 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r9.onIconChange(icon_html_r8)); });
66
- i0.ɵɵelementStart(1, "div", 19);
67
- i0.ɵɵelement(2, "img", 20);
89
+ function DrawComponent_mat_form_field_42_mat_option_10_Template(rf, ctx) { if (rf & 1) {
90
+ const _r16 = i0.ɵɵgetCurrentView();
91
+ i0.ɵɵelementStart(0, "mat-option", 29);
92
+ i0.ɵɵlistener("click", function DrawComponent_mat_form_field_42_mat_option_10_Template_mat_option_click_0_listener() { const restoredCtx = i0.ɵɵrestoreView(_r16); const icon_html_r14 = restoredCtx.$implicit; const ctx_r15 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r15.onIconChange(icon_html_r14)); });
93
+ i0.ɵɵelementStart(1, "div", 27);
94
+ i0.ɵɵelement(2, "img", 28);
68
95
  i0.ɵɵelementEnd()();
69
96
  } if (rf & 2) {
70
- const icon_html_r8 = ctx.$implicit;
71
- i0.ɵɵproperty("value", icon_html_r8);
97
+ const icon_html_r14 = ctx.$implicit;
98
+ i0.ɵɵproperty("value", icon_html_r14);
72
99
  i0.ɵɵadvance(2);
73
- i0.ɵɵpropertyInterpolate("src", icon_html_r8, i0.ɵɵsanitizeUrl);
100
+ i0.ɵɵpropertyInterpolate("src", icon_html_r14, i0.ɵɵsanitizeUrl);
74
101
  } }
75
- function DrawComponent_mat_form_field_28_Template(rf, ctx) { if (rf & 1) {
76
- const _r12 = i0.ɵɵgetCurrentView();
102
+ function DrawComponent_mat_form_field_42_Template(rf, ctx) { if (rf & 1) {
103
+ const _r18 = i0.ɵɵgetCurrentView();
77
104
  i0.ɵɵelementStart(0, "mat-form-field")(1, "mat-label");
78
105
  i0.ɵɵtext(2);
79
106
  i0.ɵɵpipe(3, "translate");
80
107
  i0.ɵɵelementEnd();
81
108
  i0.ɵɵelementStart(4, "mat-select")(5, "mat-select-trigger");
82
- i0.ɵɵtemplate(6, DrawComponent_mat_form_field_28_div_6_Template, 2, 1, "div", 16);
109
+ i0.ɵɵtemplate(6, DrawComponent_mat_form_field_42_div_6_Template, 2, 1, "div", 24);
83
110
  i0.ɵɵelementEnd();
84
- i0.ɵɵelementStart(7, "mat-option", 17);
85
- i0.ɵɵlistener("click", function DrawComponent_mat_form_field_28_Template_mat_option_click_7_listener() { i0.ɵɵrestoreView(_r12); const ctx_r11 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r11.onIconChange()); });
111
+ i0.ɵɵelementStart(7, "mat-option", 25);
112
+ i0.ɵɵlistener("click", function DrawComponent_mat_form_field_42_Template_mat_option_click_7_listener() { i0.ɵɵrestoreView(_r18); const ctx_r17 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r17.onIconChange()); });
86
113
  i0.ɵɵtext(8);
87
114
  i0.ɵɵpipe(9, "translate");
88
115
  i0.ɵɵelementEnd();
89
- i0.ɵɵtemplate(10, DrawComponent_mat_form_field_28_mat_option_10_Template, 3, 2, "mat-option", 18);
116
+ i0.ɵɵtemplate(10, DrawComponent_mat_form_field_42_mat_option_10_Template, 3, 2, "mat-option", 26);
90
117
  i0.ɵɵelementEnd()();
91
118
  } if (rf & 2) {
92
- const ctx_r2 = i0.ɵɵnextContext();
119
+ const ctx_r5 = i0.ɵɵnextContext();
93
120
  i0.ɵɵadvance(2);
94
121
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(3, 4, "igo.geo.draw.icon"));
95
122
  i0.ɵɵadvance(4);
96
- i0.ɵɵproperty("ngIf", ctx_r2.icon);
123
+ i0.ɵɵproperty("ngIf", ctx_r5.icon);
97
124
  i0.ɵɵadvance(2);
98
125
  i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(9, 6, "igo.geo.draw.noIcon"));
99
126
  i0.ɵɵadvance(2);
100
- i0.ɵɵproperty("ngForOf", ctx_r2.icons);
127
+ i0.ɵɵproperty("ngForOf", ctx_r5.icons);
101
128
  } }
102
- function DrawComponent_button_32_Template(rf, ctx) { if (rf & 1) {
103
- const _r14 = i0.ɵɵgetCurrentView();
104
- i0.ɵɵelementStart(0, "button", 22);
105
- i0.ɵɵlistener("click", function DrawComponent_button_32_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r14); const ctx_r13 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r13.openStyleModalDialog()); });
129
+ function DrawComponent_button_46_Template(rf, ctx) { if (rf & 1) {
130
+ const _r20 = i0.ɵɵgetCurrentView();
131
+ i0.ɵɵelementStart(0, "button", 30);
132
+ i0.ɵɵlistener("click", function DrawComponent_button_46_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r20); const ctx_r19 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r19.openStyleModalDialog()); });
106
133
  i0.ɵɵpipe(1, "translate");
107
134
  i0.ɵɵtext(2);
108
135
  i0.ɵɵpipe(3, "translate");
109
- i0.ɵɵelement(4, "mat-icon", 23);
136
+ i0.ɵɵelement(4, "mat-icon", 31);
110
137
  i0.ɵɵelementEnd();
111
138
  } if (rf & 2) {
112
- const ctx_r3 = i0.ɵɵnextContext();
139
+ const ctx_r6 = i0.ɵɵnextContext();
113
140
  i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(1, 3, "igo.geo.layer.style.styleModalTooltip"));
114
141
  i0.ɵɵadvance(2);
115
142
  i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(3, 5, "igo.geo.layer.style.styleModal"), " ");
116
143
  i0.ɵɵadvance(2);
117
- i0.ɵɵproperty("matBadge", ctx_r3.selectedFeatures$.value.length);
144
+ i0.ɵɵproperty("matBadge", ctx_r6.selectedFeatures$.value.length);
118
145
  } }
119
146
  export class DrawComponent {
120
147
  constructor(languageService, formBuilder, drawStyleService, dialog, drawIconService) {
@@ -146,13 +173,21 @@ export class DrawComponent {
146
173
  ]
147
174
  };
148
175
  this.geometryType = GeometryType; // Reference to the GeometryType enum
176
+ this._stores = [];
177
+ this._drawControls = [];
178
+ this.activeLayerChange = new EventEmitter();
179
+ this.drawControlsEvent = new EventEmitter();
180
+ this.layersIDEvent = new EventEmitter();
181
+ this.layerCounterID = 0;
149
182
  this.draw$ = new BehaviorSubject({}); // Observable of draw
150
- this.olDrawingLayerSource = new OlVectorSource();
183
+ this.activeDrawingLayerSource = new OlVectorSource();
151
184
  this.selectedFeatures$ = new BehaviorSubject([]);
152
185
  this.drawControlIsDisabled = true;
153
186
  this.drawControlIsActive = false;
154
187
  this.subscriptions$$ = [];
155
188
  this.position = 'bottom';
189
+ this.isCreatingNewLayer = false;
190
+ this.currGeometryType = this.geometryType.Point;
156
191
  this.buildForm();
157
192
  this.fillColor = this.drawStyleService.getFillColor();
158
193
  this.strokeColor = this.drawStyleService.getStrokeColor();
@@ -163,19 +198,85 @@ export class DrawComponent {
163
198
  this.fontSize = this.drawStyleService.getFontSize();
164
199
  this.fontStyle = this.drawStyleService.getFontStyle();
165
200
  }
201
+ get stores() {
202
+ return this._stores;
203
+ }
204
+ set stores(value) {
205
+ this._stores = value;
206
+ }
207
+ get drawControls() {
208
+ return this._drawControls;
209
+ }
210
+ set drawControls(value) {
211
+ this._drawControls = value;
212
+ }
213
+ get activeDrawingLayer() {
214
+ return this._activeDrawingLayer;
215
+ }
216
+ set activeDrawingLayer(value) {
217
+ this._activeDrawingLayer = value;
218
+ }
166
219
  // Initialize the store that will contain the entities and create the Draw control
167
220
  ngOnInit() {
168
- this.initStore();
169
- this.drawControl = this.createDrawControl(this.fillColor, this.strokeColor, this.strokeWidth);
170
- this.drawControl.setGeometryType(this.geometryType.Point);
171
- this.toggleDrawControl();
221
+ if (!this.stores.length) {
222
+ this.activeStore = new FeatureStore([], {
223
+ map: this.map
224
+ });
225
+ this.initStore();
226
+ this.activeDrawControl = this.createDrawControl(this.fillColor, this.strokeColor, this.strokeWidth);
227
+ this.activeDrawControl.setGeometryType(this.geometryType.Point);
228
+ this.toggleDrawControl();
229
+ this.stores.push(this.activeStore);
230
+ this.drawControls.push([this.activeDrawingLayer.id, this.activeDrawControl]);
231
+ this.drawControlsEvent.emit(this.drawControls);
232
+ this.layersIDEvent.emit(this.activeDrawingLayer.id);
233
+ this.onLayerChange(this.activeDrawingLayer);
234
+ }
235
+ else {
236
+ this.activeStore = this.stores.find(store => store.layer.id === this.activeDrawingLayer.id);
237
+ this.activeDrawControl = this.drawControls.find(dc => dc[0] === this.activeDrawingLayer.id)[1];
238
+ this.deactivateDrawControl();
239
+ this.allLayers.forEach(layer => {
240
+ if (layer.id !== this.activeDrawingLayer.id) {
241
+ layer.opacity = 0;
242
+ }
243
+ let store = this.stores.find(s => s.layer.id === layer.id);
244
+ this.subscriptions$$.push(store.stateView
245
+ .manyBy$((record) => {
246
+ return record.state.selected === true;
247
+ })
248
+ .pipe(first())
249
+ .subscribe((records) => {
250
+ records.forEach((record) => {
251
+ record.state.selected = false;
252
+ });
253
+ }));
254
+ this.subscriptions$$.push(store.stateView
255
+ .manyBy$((record) => {
256
+ return record.state.selected === true;
257
+ })
258
+ .pipe(skip(1) // Skip initial emission
259
+ )
260
+ .subscribe((records) => {
261
+ this.selectedFeatures$.next(records.map((record) => record.entity));
262
+ }));
263
+ this.subscriptions$$.push(store.count$.subscribe((cnt) => {
264
+ cnt >= 1
265
+ ? (this.activeStore.layer.options.showInLayerList = true)
266
+ : (this.activeStore.layer.options.showInLayerList = false);
267
+ }));
268
+ });
269
+ this.onLayerChange(this.activeDrawingLayer);
270
+ }
172
271
  }
173
272
  /**
174
273
  * Remove the drawing layer and the interactions
175
274
  * @internal
176
275
  */
177
276
  ngOnDestroy() {
178
- this.drawControl.setOlMap(undefined);
277
+ this.allLayers.forEach(layer => layer.opacity = 1);
278
+ this.activeStore.state.updateAll({ selected: false });
279
+ this.deactivateDrawControl();
179
280
  this.subscriptions$$.map((s) => s.unsubscribe());
180
281
  }
181
282
  /**
@@ -186,61 +287,20 @@ export class DrawComponent {
186
287
  * @returns a Draw Control
187
288
  */
188
289
  createDrawControl(fillColor, strokeColor, strokeWidth) {
189
- const drawControl = new DrawControl({
290
+ const activeDrawControl = new DrawControl({
190
291
  geometryType: undefined,
191
- drawingLayerSource: this.olDrawingLayerSource,
292
+ drawingLayerSource: this.activeDrawingLayerSource,
192
293
  drawingLayerStyle: new OlStyle.Style({}),
193
294
  interactionStyle: createInteractionStyle(fillColor, strokeColor, strokeWidth)
194
295
  });
195
- return drawControl;
296
+ return activeDrawControl;
196
297
  }
197
298
  /**
198
299
  * Store initialization, including drawing layer creation
199
300
  */
200
- initStore() {
201
- this.map.removeLayer(this.olDrawingLayer);
202
- // this.map.addLayer()
203
- this.olDrawingLayer = new VectorLayer({
204
- isIgoInternalLayer: true,
205
- id: 'igo-draw-layer',
206
- title: this.languageService.translate.instant('igo.geo.draw.drawing'),
207
- zIndex: 200,
208
- source: new FeatureDataSource(),
209
- style: (feature, resolution) => {
210
- return this.drawStyleService.createIndividualElementStyle(feature, resolution, this.labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'), this.icon);
211
- },
212
- showInLayerList: true,
213
- exportable: true,
214
- browsable: false,
215
- workspace: {
216
- enabled: false
217
- }
218
- });
219
- tryBindStoreLayer(this.store, this.olDrawingLayer);
220
- tryAddLoadingStrategy(this.store, new FeatureStoreLoadingStrategy({
221
- motion: FeatureMotion.None
222
- }));
223
- tryAddSelectionStrategy(this.store, new FeatureStoreSelectionStrategy({
224
- map: this.map,
225
- motion: FeatureMotion.None,
226
- many: true
227
- }));
228
- this.store.layer.visible = true;
229
- this.store.source.ol.on('removefeature', (event) => {
230
- const olGeometry = event.feature.getGeometry();
231
- this.clearLabelsOfOlGeometry(olGeometry);
232
- });
233
- this.subscriptions$$.push(this.store.stateView
234
- .manyBy$((record) => {
235
- return record.state.selected === true;
236
- })
237
- .pipe(first())
238
- .subscribe((records) => {
239
- records.forEach((record) => {
240
- record.state.selected = false;
241
- });
242
- }));
243
- this.subscriptions$$.push(this.store.stateView
301
+ initStore(newTitle, isNewLayer) {
302
+ this.createLayer(newTitle, isNewLayer);
303
+ this.subscriptions$$.push(this.activeStore.stateView
244
304
  .manyBy$((record) => {
245
305
  return record.state.selected === true;
246
306
  })
@@ -249,13 +309,10 @@ export class DrawComponent {
249
309
  .subscribe((records) => {
250
310
  this.selectedFeatures$.next(records.map((record) => record.entity));
251
311
  }));
252
- this.subscriptions$$.push(this.store.count$.subscribe((cnt) => {
253
- if (cnt > 0) {
254
- this.store.setLayerExtent();
255
- }
312
+ this.subscriptions$$.push(this.activeStore.count$.subscribe((cnt) => {
256
313
  cnt >= 1
257
- ? (this.store.layer.options.showInLayerList = true)
258
- : (this.store.layer.options.showInLayerList = false);
314
+ ? (this.activeStore.layer.options.showInLayerList = true)
315
+ : (this.activeStore.layer.options.showInLayerList = false);
259
316
  }));
260
317
  }
261
318
  /**
@@ -322,12 +379,12 @@ export class DrawComponent {
322
379
  }
323
380
  // deletes the feature
324
381
  else {
325
- this.olDrawingLayerSource
382
+ this.activeDrawingLayerSource
326
383
  .getFeatures()
327
384
  .forEach((drawingLayerFeature) => {
328
385
  const geometry = drawingLayerFeature.getGeometry();
329
386
  if (olGeometry === geometry) {
330
- this.olDrawingLayerSource.removeFeature(drawingLayerFeature);
387
+ this.activeDrawingLayerSource.removeFeature(drawingLayerFeature);
331
388
  }
332
389
  });
333
390
  }
@@ -341,10 +398,10 @@ export class DrawComponent {
341
398
  onDrawEnd(olGeometry, radius) {
342
399
  this.addFeatureToStore(olGeometry, radius);
343
400
  this.clearLabelsOfOlGeometry(olGeometry);
344
- this.store.layer.ol.getSource().refresh();
401
+ this.activeStore.layer.ol.getSource().refresh();
345
402
  }
346
403
  onModifyDraw(olGeometry) {
347
- const entities = this.store.all();
404
+ const entities = this.activeStore.all();
348
405
  entities.forEach((entity) => {
349
406
  const entityId = entity.properties.id;
350
407
  const olGeometryId = olGeometry.ol_uid;
@@ -358,7 +415,7 @@ export class DrawComponent {
358
415
  });
359
416
  }
360
417
  onSelectDraw(olFeature, label) {
361
- const entities = this.store.all();
418
+ const entities = this.activeStore.all();
362
419
  const olGeometry = olFeature.getGeometry();
363
420
  olGeometry.ol_uid = olFeature.get('id');
364
421
  const olGeometryCoordinates = JSON.stringify(olGeometry.getCoordinates()[0]);
@@ -429,7 +486,7 @@ export class DrawComponent {
429
486
  lon4326 = point4326[0];
430
487
  lat4326 = point4326[1];
431
488
  }
432
- this.store.update({
489
+ this.activeStore.update({
433
490
  type: FEATURE,
434
491
  geometry,
435
492
  projection: projection.getCode(),
@@ -458,6 +515,40 @@ export class DrawComponent {
458
515
  stroke: ['']
459
516
  });
460
517
  }
518
+ setupLayer(isNewLayer) {
519
+ setTimeout(() => {
520
+ const dialogRef = this.dialog.open(DrawLayerPopupComponent, {
521
+ disableClose: false,
522
+ });
523
+ dialogRef.afterClosed().subscribe((label) => {
524
+ if (dialogRef.componentInstance.confirmFlag) {
525
+ this.activeStore.state.updateAll({ selected: false });
526
+ this.activeStore = new FeatureStore([], { map: this.map });
527
+ this.activeDrawingLayerSource = new OlVectorSource();
528
+ this.activeDrawingLayer.opacity = 0;
529
+ this.deactivateDrawControl();
530
+ this.initStore(label, isNewLayer);
531
+ this.activeDrawControl = this.createDrawControl(this.fillColor, this.strokeColor, this.strokeWidth);
532
+ this.activeDrawControl.setGeometryType(this.currGeometryType);
533
+ this.toggleDrawControl();
534
+ this.stores.push(this.activeStore);
535
+ this.drawControls.push([this.activeDrawingLayer.id, this.activeDrawControl]);
536
+ this.drawControlsEvent.emit(this.drawControls);
537
+ this.layersIDEvent.emit(this.activeDrawingLayer.id);
538
+ this.isCreatingNewLayer = false;
539
+ if (!this.labelsAreShown) {
540
+ this.onToggleLabels();
541
+ }
542
+ this.activeLayerChange.emit(this.activeDrawingLayer);
543
+ }
544
+ else {
545
+ this.select.value = this.activeDrawingLayer;
546
+ this.select.selectionChange.emit(this.activeDrawingLayer);
547
+ }
548
+ });
549
+ }, 250);
550
+ }
551
+ // HTML user interactions
461
552
  /**
462
553
  * Called when the user double-clicks the selected drawing
463
554
  */
@@ -471,12 +562,14 @@ export class DrawComponent {
471
562
  this.dialog.open(DrawShorcutsComponent);
472
563
  }
473
564
  deleteDrawings() {
474
- this.store.deleteMany(this.selectedFeatures$.value);
565
+ this.activeStore.deleteMany(this.selectedFeatures$.value);
475
566
  this.selectedFeatures$.value.forEach((selectedFeature) => {
476
- this.olDrawingLayerSource.getFeatures().forEach((drawingLayerFeature) => {
567
+ this.activeDrawingLayerSource
568
+ .getFeatures()
569
+ .forEach((drawingLayerFeature) => {
477
570
  const geometry = drawingLayerFeature.getGeometry();
478
571
  if (selectedFeature.properties.id === geometry.ol_uid) {
479
- this.olDrawingLayerSource.removeFeature(drawingLayerFeature);
572
+ this.activeDrawingLayerSource.removeFeature(drawingLayerFeature);
480
573
  }
481
574
  });
482
575
  });
@@ -489,8 +582,9 @@ export class DrawComponent {
489
582
  this.drawStyleService.toggleLabelsAreShown();
490
583
  this.labelsAreShown = !this.labelsAreShown;
491
584
  this.icon
492
- ? this.onColorChange(this.labelsAreShown, true, this.fillColor, this.strokeColor)
493
- : this.onColorChange(this.labelsAreShown, false, this.fillColor, this.strokeColor);
585
+ ? this.elementStyle(this.labelsAreShown, true)
586
+ : this.elementStyle(this.labelsAreShown, false);
587
+ this.createDrawControl();
494
588
  }
495
589
  /**
496
590
  * Called when the user toggles the Draw control is toggled
@@ -500,6 +594,69 @@ export class DrawComponent {
500
594
  toggleIsChecked ? this.toggleDrawControl() : this.deactivateDrawControl();
501
595
  }
502
596
  // User changes properties of a drawing element
597
+ /**
598
+ * Display the current layer with the current store and the current layerSource
599
+ */
600
+ onLayerChange(currLayer) {
601
+ if (currLayer) {
602
+ this.activeStore.state.updateAll({ selected: false });
603
+ this.isCreatingNewLayer = false;
604
+ this.activeDrawingLayer.opacity = 0;
605
+ this.activeDrawingLayer = currLayer;
606
+ this.activeDrawingLayer.opacity = 1;
607
+ this.deactivateDrawControl();
608
+ if (!this.labelsAreShown) {
609
+ this.onToggleLabels();
610
+ }
611
+ this.activeStore = this.stores.find(store => store.layer.id === this.activeDrawingLayer.id);
612
+ this.activeDrawControl = this.drawControls.find(dc => dc[0] === this.activeDrawingLayer.id)[1];
613
+ this.activeDrawingLayerSource = this.activeDrawControl.olDrawingLayerSource;
614
+ this.activeDrawControl.setGeometryType(this.currGeometryType);
615
+ this.toggleDrawControl();
616
+ }
617
+ else {
618
+ this.setupLayer(true);
619
+ }
620
+ this.activeLayerChange.emit(this.activeDrawingLayer);
621
+ }
622
+ createLayer(newTitle, isNewLayer) {
623
+ for (const layer of this.allLayers) {
624
+ let numberId = Number(layer.id.replace('igo-draw-layer', ''));
625
+ this.layerCounterID = Math.max(numberId, this.layerCounterID);
626
+ }
627
+ this.activeDrawingLayer = new VectorLayer({
628
+ isIgoInternalLayer: true,
629
+ id: 'igo-draw-layer' + ++this.layerCounterID,
630
+ title: isNewLayer
631
+ ? newTitle
632
+ : this.languageService.translate.instant('igo.geo.draw.drawing'),
633
+ zIndex: 200,
634
+ source: new FeatureDataSource(),
635
+ style: (feature, resolution) => {
636
+ return this.drawStyleService.createIndividualElementStyle(feature, resolution, this.labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'), this.icon);
637
+ },
638
+ showInLayerList: true,
639
+ exportable: true,
640
+ browsable: false,
641
+ workspace: {
642
+ enabled: false
643
+ }
644
+ });
645
+ tryBindStoreLayer(this.activeStore, this.activeDrawingLayer);
646
+ tryAddLoadingStrategy(this.activeStore, new FeatureStoreLoadingStrategy({
647
+ motion: FeatureMotion.None
648
+ }));
649
+ tryAddSelectionStrategy(this.activeStore, new FeatureStoreSelectionStrategy({
650
+ map: this.map,
651
+ motion: FeatureMotion.None,
652
+ many: true
653
+ }));
654
+ this.activeStore.layer.visible = true;
655
+ this.activeStore.source.ol.on('removefeature', (event) => {
656
+ const olGeometry = event.feature.getGeometry();
657
+ this.clearLabelsOfOlGeometry(olGeometry);
658
+ });
659
+ }
503
660
  /**
504
661
  * Called when the user changes the color in a color picker
505
662
  * @param labelsAreShown wheter the labels are shown or not
@@ -512,16 +669,14 @@ export class DrawComponent {
512
669
  this.selectedFeatures$.value.forEach((feature) => {
513
670
  let olFeature = featureToOl(feature, this.map.ol.getView().getProjection().getCode());
514
671
  this.updateFillAndStrokeColor(olFeature, fillColor, strokeColor);
515
- const entity = this.store
672
+ const entity = this.activeStore
516
673
  .all()
517
674
  .find((e) => e.meta.id === olFeature.getId());
518
675
  entity.properties.drawingStyle.fill = olFeature.get('fillColor_');
519
676
  entity.properties.drawingStyle.stroke = olFeature.get('strokeColor_');
520
- this.store.update(entity);
677
+ this.activeStore.update(entity);
521
678
  });
522
679
  }
523
- this.fillColor = fillColor;
524
- this.strokeColor = strokeColor;
525
680
  this.elementStyle(labelsAreShown, isAnIcon);
526
681
  this.createDrawControl();
527
682
  }
@@ -536,12 +691,12 @@ export class DrawComponent {
536
691
  this.selectedFeatures$.value.forEach((feature) => {
537
692
  let olFeature = featureToOl(feature, this.map.ol.getView().getProjection().getCode());
538
693
  this.updateFontSizeAndStyle(olFeature, size, style);
539
- const entity = this.store
694
+ const entity = this.activeStore
540
695
  .all()
541
696
  .find((e) => e.meta.id === olFeature.getId());
542
697
  entity.properties.fontStyle = olFeature.get('fontStyle_');
543
- this.store.update(entity);
544
- olFeature = this.store.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
698
+ this.activeStore.update(entity);
699
+ olFeature = this.activeStore.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
545
700
  olFeature.setProperties({ fontStyle: entity.properties.fontStyle });
546
701
  olFeature.changed();
547
702
  });
@@ -563,13 +718,13 @@ export class DrawComponent {
563
718
  this.selectedFeatures$.value.forEach((feature) => {
564
719
  let olFeature = featureToOl(feature, this.map.ol.getView().getProjection().getCode());
565
720
  this.updateOffset(olFeature, offsetX, offsetY);
566
- const entity = this.store
721
+ const entity = this.activeStore
567
722
  .all()
568
723
  .find((e) => e.meta.id === olFeature.getId());
569
724
  entity.properties.offsetX = olFeature.get('offsetX_');
570
725
  entity.properties.offsetY = olFeature.get('offsetY_');
571
- this.store.update(entity);
572
- olFeature = this.store.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
726
+ this.activeStore.update(entity);
727
+ olFeature = this.activeStore.layer.ol.getSource().getFeatures().find(f => f.getId() === entity.meta.id);
573
728
  olFeature.setProperties({ offsetX: entity.properties.offsetX, offsetY: entity.properties.offsetY });
574
729
  olFeature.changed();
575
730
  });
@@ -586,7 +741,8 @@ export class DrawComponent {
586
741
  * @param geometryType the geometry type selected by the user
587
742
  */
588
743
  onGeometryTypeChange(geometryType) {
589
- this.drawControl.setGeometryType(geometryType);
744
+ this.currGeometryType = geometryType;
745
+ this.activeDrawControl.setGeometryType(geometryType);
590
746
  this.toggleDrawControl();
591
747
  }
592
748
  // Updates the properties of olFeature inputted
@@ -617,13 +773,57 @@ export class DrawComponent {
617
773
  offsetY_: offsetY
618
774
  }, true);
619
775
  }
620
- /**
621
- * Check the amount of rows as a possible alternative
622
- */
776
+ // Updates values of the selected element on the HTML view
777
+ getFeatureFontSize() {
778
+ return this.selectedFeatures$.value.length > 0
779
+ ? this.selectedFeatures$.value[0].properties.fontStyle
780
+ .split(' ')[0]
781
+ .replace('px', '')
782
+ : '20';
783
+ }
784
+ getFeatureFontStyle() {
785
+ return this.selectedFeatures$.value.length > 0
786
+ ? this.selectedFeatures$.value[0].properties.fontStyle.substring(this.selectedFeatures$.value[0].properties.fontStyle.indexOf(' ') + 1)
787
+ : FontType.Arial;
788
+ }
789
+ getFeatureFillColor() {
790
+ return this.selectedFeatures$.value.length > 0
791
+ ? this.selectedFeatures$.value[0].properties.drawingStyle.fill
792
+ : 'rgba(255,255,255,0.4)';
793
+ }
794
+ getFeatureStrokeColor() {
795
+ return this.selectedFeatures$.value.length > 0
796
+ ? this.selectedFeatures$.value[0].properties.drawingStyle.stroke
797
+ : 'rgba(143,7,7,1)';
798
+ }
799
+ getFeatureOffsetX() {
800
+ return this.selectedFeatures$.value.length > 0
801
+ ? this.selectedFeatures$.value[0].properties.offsetX
802
+ : this.drawStyleService.getOffsetX();
803
+ }
804
+ getFeatureOffsetY() {
805
+ return this.selectedFeatures$.value.length > 0
806
+ ? this.selectedFeatures$.value[0].properties.offsetY
807
+ : '0';
808
+ }
809
+ get allFontStyles() {
810
+ return Object.values(FontType);
811
+ }
812
+ get allLayers() {
813
+ return this.map.layers.filter((layer) => layer.id.includes('igo-draw-layer'));
814
+ }
623
815
  updateHeightTable() {
624
- this.numberOfDrawings = this.store.count$.getValue();
625
- this.numberOfDrawings > 10 ? this.tableTemplate.tableHeight = '35vh' : this.tableTemplate.tableHeight = 'auto';
816
+ // Check the amount of rows as a possible alternative
817
+ this.numberOfDrawings = this.activeStore.count$.getValue();
818
+ this.numberOfDrawings > 10
819
+ ? (this.tableTemplate.tableHeight = '35vh')
820
+ : (this.tableTemplate.tableHeight = 'auto');
626
821
  }
822
+ updateActiveLayer() {
823
+ let currLayer = this.allLayers.find(layer => layer.title === this.activeDrawingLayer.title);
824
+ return currLayer ? currLayer : this.allLayers[0];
825
+ }
826
+ // Helper methods
627
827
  /**
628
828
  * Activate the correct control
629
829
  */
@@ -648,20 +848,20 @@ export class DrawComponent {
648
848
  * @param olGeometry the new geometry to insert in the store
649
849
  */
650
850
  replaceFeatureInStore(entity, olGeometry, radius) {
651
- this.store.delete(entity);
851
+ this.activeStore.delete(entity);
652
852
  this.onDrawEnd(olGeometry, radius);
653
853
  }
654
854
  /**
655
855
  * Deactivate the active draw control
656
856
  */
657
857
  deactivateDrawControl() {
658
- if (!this.drawControl) {
858
+ if (!this.activeDrawControl) {
659
859
  return;
660
860
  }
661
861
  if (this.drawEnd$$) {
662
862
  this.drawEnd$$.unsubscribe();
663
863
  }
664
- this.drawControl.setOlMap(undefined);
864
+ this.activeDrawControl.setOlMap(undefined);
665
865
  this.drawControlIsActive = false;
666
866
  }
667
867
  /**
@@ -670,37 +870,43 @@ export class DrawComponent {
670
870
  activateDrawControl() {
671
871
  this.drawControlIsDisabled = false;
672
872
  this.drawControlIsActive = true;
673
- this.drawEnd$$ = this.drawControl.end$.subscribe((olGeometry) => {
873
+ this.drawEnd$$ = this.activeDrawControl.end$.subscribe((olGeometry) => {
674
874
  this.openDrawDialog(olGeometry, true);
675
875
  });
676
- this.drawControl.modify$.subscribe((olGeometry) => {
876
+ this.activeDrawControl.modify$.subscribe((olGeometry) => {
677
877
  this.onModifyDraw(olGeometry);
678
878
  });
679
879
  if (!this.drawSelect$$) {
680
- this.drawSelect$$ = this.drawControl.select$.subscribe((olFeature) => {
880
+ this.drawSelect$$ = this.activeDrawControl.select$.subscribe((olFeature) => {
681
881
  this.openDrawDialog(olFeature, false);
682
882
  });
683
883
  }
684
- this.drawControl.setOlMap(this.map.ol, true);
884
+ this.activeDrawControl.setOlMap(this.map.ol, true);
685
885
  }
686
886
  /**
687
887
  * Recreates the style of the feature stored
688
888
  */
689
889
  elementStyle(labelsAreShown, isAnIcon) {
690
890
  if (isAnIcon) {
691
- this.store.layer.ol.setStyle((feature, resolution) => {
891
+ this.activeStore.layer.ol.setStyle((feature, resolution) => {
692
892
  return this.drawStyleService.createIndividualElementStyle(feature, resolution, labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'), this.icon);
693
893
  });
694
894
  }
695
895
  else {
696
- this.store.layer.ol.setStyle((feature, resolution) => {
896
+ this.activeStore.layer.ol.setStyle((feature, resolution) => {
697
897
  return this.drawStyleService.createIndividualElementStyle(feature, resolution, labelsAreShown, feature.get('fontStyle'), feature.get('drawingStyle').fill, feature.get('drawingStyle').stroke, feature.get('offsetX'), feature.get('offsetY'));
698
898
  });
699
899
  }
700
900
  }
701
901
  }
702
902
  DrawComponent.ɵfac = function DrawComponent_Factory(t) { return new (t || DrawComponent)(i0.ɵɵdirectiveInject(i1.LanguageService), i0.ɵɵdirectiveInject(i2.UntypedFormBuilder), i0.ɵɵdirectiveInject(i3.DrawStyleService), i0.ɵɵdirectiveInject(i4.MatDialog), i0.ɵɵdirectiveInject(i5.DrawIconService)); };
703
- DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent, selectors: [["igo-draw"]], inputs: { map: "map", store: "store" }, outputs: { fillColor: "fillColor", strokeColor: "strokeColor", strokeWidth: "strokeWidth", fontSize: "fontSize", fontStyle: "fontStyle" }, decls: 33, vars: 36, consts: [[1, "geometry-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [1, "draw-options", "mat-typography"], [3, "disabled", "checked", "labelPosition", "change"], [3, "checked", "labelPosition", "change"], ["class", "deleteBtn", "mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "disabled", "click", 4, "ngIf"], ["id", "storeElements", 1, "table-compact", 3, "store", "template", "dblclick"], ["table", ""], [1, "icon-options"], [4, "ngIf"], ["mat-icon-button", "", "color", "accent", "disableRipple", "true", 3, "click"], ["svgIcon", "keyboard-outline", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "shortcuts-icon", 3, "matTooltip"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click", 4, "ngIf"], ["mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "deleteBtn", 3, "matTooltip", "disabled", "click"], ["svgIcon", "delete"], ["class", "box", 4, "ngIf"], ["value", "", 3, "click"], [3, "value", "click", 4, "ngFor", "ngForOf"], [1, "box"], [3, "src"], [3, "value", "click"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click"], ["svgIcon", "palette", "matBadgeColor", "warn", "matBadgeSize", "medium", 1, "style-icon", 3, "matBadge"]], template: function DrawComponent_Template(rf, ctx) { if (rf & 1) {
903
+ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent, selectors: [["igo-draw"]], viewQuery: function DrawComponent_Query(rf, ctx) { if (rf & 1) {
904
+ i0.ɵɵviewQuery(_c0, 5);
905
+ } if (rf & 2) {
906
+ let _t;
907
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.select = _t.first);
908
+ } }, inputs: { map: "map", stores: "stores", drawControls: "drawControls", activeDrawingLayer: "activeDrawingLayer" }, outputs: { activeLayerChange: "activeLayerChange", drawControlsEvent: "drawControlsEvent", layersIDEvent: "layersIDEvent", fillColor: "fillColor", strokeColor: "strokeColor", strokeWidth: "strokeWidth", fontSize: "fontSize", fontStyle: "fontStyle" }, decls: 47, vars: 45, consts: [[1, "geometry-type-toggle", "mat-typography"], [3, "value", "change"], [3, "value"], [1, "draw-options", "mat-typography"], [3, "disabled", "checked", "labelPosition", "change"], [3, "checked", "labelPosition", "change"], ["appearance", "outline", 1, "layer-select"], [3, "value", "selectionChange"], ["selectedLayer", ""], [3, "value", 4, "ngFor", "ngForOf"], ["id", "createNewLayer"], ["mat-icon-button", "", "collapsibleButton", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "color", "matTooltip", "click", 4, "ngIf"], ["class", "deleteBtn", "mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "matTooltip", "disabled", "click", 4, "ngIf"], [1, "table-compact", 3, "store", "template", "dblclick"], ["table", ""], [1, "icon-options"], [4, "ngIf"], ["mat-icon-button", "", "color", "accent", "disableRipple", "true", 3, "click"], ["svgIcon", "keyboard-outline", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "shortcuts-icon", 3, "matTooltip"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click", 4, "ngIf"], ["mat-icon-button", "", "collapsibleButton", "", "tooltip-position", "below", "matTooltipShowDelay", "500", 3, "color", "matTooltip", "click"], [3, "svgIcon"], ["mat-icon-button", "", "color", "warn", "tooltip-position", "below", "matTooltipShowDelay", "500", 1, "deleteBtn", 3, "matTooltip", "disabled", "click"], ["svgIcon", "delete"], ["class", "box", 4, "ngIf"], ["value", "", 3, "click"], [3, "value", "click", 4, "ngFor", "ngForOf"], [1, "box"], [3, "src"], [3, "value", "click"], ["mat-raised-button", "", "color", "primary", 3, "matTooltip", "click"], ["svgIcon", "palette", "matBadgeColor", "warn", "matBadgeSize", "medium", 1, "style-icon", 3, "matBadge"]], template: function DrawComponent_Template(rf, ctx) { if (rf & 1) {
909
+ const _r21 = i0.ɵɵgetCurrentView();
704
910
  i0.ɵɵelementStart(0, "div")(1, "div", 0)(2, "mat-button-toggle-group", 1);
705
911
  i0.ɵɵlistener("change", function DrawComponent_Template_mat_button_toggle_group_change_2_listener($event) { return ctx.onGeometryTypeChange($event.value); });
706
912
  i0.ɵɵelementStart(3, "mat-button-toggle", 2);
@@ -729,20 +935,35 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
729
935
  i0.ɵɵtext(20);
730
936
  i0.ɵɵpipe(21, "translate");
731
937
  i0.ɵɵelementEnd()();
732
- i0.ɵɵelementStart(22, "div");
733
- i0.ɵɵtemplate(23, DrawComponent_button_23_Template, 4, 6, "button", 6);
734
- i0.ɵɵelementStart(24, "div")(25, "igo-entity-table", 7, 8);
735
- i0.ɵɵlistener("dblclick", function DrawComponent_Template_igo_entity_table_dblclick_25_listener() { return ctx.editLabelDrawing(); });
938
+ i0.ɵɵelement(22, "mat-divider");
939
+ i0.ɵɵelementStart(23, "div")(24, "mat-form-field", 6)(25, "mat-label");
940
+ i0.ɵɵtext(26);
941
+ i0.ɵɵpipe(27, "translate");
942
+ i0.ɵɵelementEnd();
943
+ i0.ɵɵelementStart(28, "mat-select", 7, 8);
944
+ i0.ɵɵlistener("selectionChange", function DrawComponent_Template_mat_select_selectionChange_28_listener() { i0.ɵɵrestoreView(_r21); const _r0 = i0.ɵɵreference(29); return i0.ɵɵresetView(ctx.onLayerChange(_r0.value)); });
945
+ i0.ɵɵtemplate(30, DrawComponent_mat_option_30_Template, 2, 2, "mat-option", 9);
946
+ i0.ɵɵelementStart(31, "mat-option", 10);
947
+ i0.ɵɵtext(32);
948
+ i0.ɵɵpipe(33, "translate");
949
+ i0.ɵɵelementEnd()()();
950
+ i0.ɵɵtemplate(34, DrawComponent_button_34_Template, 4, 7, "button", 11);
951
+ i0.ɵɵelementEnd();
952
+ i0.ɵɵelement(35, "mat-divider");
953
+ i0.ɵɵelementStart(36, "div");
954
+ i0.ɵɵtemplate(37, DrawComponent_button_37_Template, 4, 6, "button", 12);
955
+ i0.ɵɵelementStart(38, "div")(39, "igo-entity-table", 13, 14);
956
+ i0.ɵɵlistener("dblclick", function DrawComponent_Template_igo_entity_table_dblclick_39_listener() { return ctx.editLabelDrawing(); });
736
957
  i0.ɵɵelementEnd()()();
737
- i0.ɵɵelementStart(27, "div", 9);
738
- i0.ɵɵtemplate(28, DrawComponent_mat_form_field_28_Template, 11, 8, "mat-form-field", 10);
958
+ i0.ɵɵelementStart(41, "div", 15);
959
+ i0.ɵɵtemplate(42, DrawComponent_mat_form_field_42_Template, 11, 8, "mat-form-field", 16);
739
960
  i0.ɵɵelementEnd();
740
- i0.ɵɵelementStart(29, "button", 11);
741
- i0.ɵɵlistener("click", function DrawComponent_Template_button_click_29_listener() { return ctx.openShorcutsDialog(); });
742
- i0.ɵɵelement(30, "mat-icon", 12);
743
- i0.ɵɵpipe(31, "translate");
961
+ i0.ɵɵelementStart(43, "button", 17);
962
+ i0.ɵɵlistener("click", function DrawComponent_Template_button_click_43_listener() { return ctx.openShorcutsDialog(); });
963
+ i0.ɵɵelement(44, "mat-icon", 18);
964
+ i0.ɵɵpipe(45, "translate");
744
965
  i0.ɵɵelementEnd();
745
- i0.ɵɵtemplate(32, DrawComponent_button_32_Template, 5, 7, "button", 13);
966
+ i0.ɵɵtemplate(46, DrawComponent_button_46_Template, 5, 7, "button", 19);
746
967
  i0.ɵɵelementEnd();
747
968
  } if (rf & 2) {
748
969
  i0.ɵɵadvance(2);
@@ -750,38 +971,48 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
750
971
  i0.ɵɵadvance(1);
751
972
  i0.ɵɵproperty("value", ctx.geometryType.Point);
752
973
  i0.ɵɵadvance(1);
753
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 22, "igo.geo.draw." + ctx.geometryType.Point), " ");
974
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(5, 27, "igo.geo.draw." + ctx.geometryType.Point), " ");
754
975
  i0.ɵɵadvance(2);
755
976
  i0.ɵɵproperty("value", ctx.geometryType.LineString);
756
977
  i0.ɵɵadvance(1);
757
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 24, "igo.geo.draw." + ctx.geometryType.LineString), " ");
978
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(8, 29, "igo.geo.draw." + ctx.geometryType.LineString), " ");
758
979
  i0.ɵɵadvance(2);
759
980
  i0.ɵɵproperty("value", ctx.geometryType.Polygon);
760
981
  i0.ɵɵadvance(1);
761
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 26, "igo.geo.draw." + ctx.geometryType.Polygon), " ");
982
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(11, 31, "igo.geo.draw." + ctx.geometryType.Polygon), " ");
762
983
  i0.ɵɵadvance(2);
763
984
  i0.ɵɵproperty("value", ctx.geometryType.Circle);
764
985
  i0.ɵɵadvance(1);
765
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(14, 28, "igo.geo.draw." + ctx.geometryType.Circle), " ");
986
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(14, 33, "igo.geo.draw." + ctx.geometryType.Circle), " ");
766
987
  i0.ɵɵadvance(3);
767
988
  i0.ɵɵproperty("disabled", ctx.drawControlIsDisabled)("checked", ctx.drawControlIsActive)("labelPosition", "before");
768
989
  i0.ɵɵadvance(1);
769
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 30, "igo.geo.spatialFilter.drawControl"), " ");
990
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(18, 35, "igo.geo.spatialFilter.drawControl"), " ");
770
991
  i0.ɵɵadvance(2);
771
992
  i0.ɵɵproperty("checked", ctx.labelsAreShown)("labelPosition", "before");
772
993
  i0.ɵɵadvance(1);
773
- i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 32, "igo.geo.draw.toggleMapTooltips"), " ");
994
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(21, 37, "igo.geo.draw.toggleMapTooltips"), " ");
995
+ i0.ɵɵadvance(6);
996
+ i0.ɵɵtextInterpolate(i0.ɵɵpipeBind1(27, 39, "igo.geo.draw.layer.title"));
997
+ i0.ɵɵadvance(2);
998
+ i0.ɵɵproperty("value", ctx.updateActiveLayer());
999
+ i0.ɵɵadvance(2);
1000
+ i0.ɵɵproperty("ngForOf", ctx.allLayers);
1001
+ i0.ɵɵadvance(2);
1002
+ i0.ɵɵtextInterpolate1(" ", i0.ɵɵpipeBind1(33, 41, "igo.geo.draw.layer.createNewLayer"), " ");
1003
+ i0.ɵɵadvance(2);
1004
+ i0.ɵɵproperty("ngIf", ctx.activeDrawingLayer);
774
1005
  i0.ɵɵadvance(3);
775
- i0.ɵɵproperty("ngIf", ctx.store.count$.getValue() > 0);
1006
+ i0.ɵɵproperty("ngIf", ctx.activeStore.count$.getValue() > 0);
776
1007
  i0.ɵɵadvance(2);
777
- i0.ɵɵproperty("store", ctx.store)("template", ctx.tableTemplate);
1008
+ i0.ɵɵproperty("store", ctx.activeStore)("template", ctx.tableTemplate);
778
1009
  i0.ɵɵadvance(3);
779
1010
  i0.ɵɵproperty("ngIf", ctx.icons.length >= 1);
780
1011
  i0.ɵɵadvance(2);
781
- i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(31, 34, "igo.geo.draw.shortcuts"));
1012
+ i0.ɵɵproperty("matTooltip", i0.ɵɵpipeBind1(45, 43, "igo.geo.draw.shortcuts"));
782
1013
  i0.ɵɵadvance(2);
783
1014
  i0.ɵɵproperty("ngIf", ctx.selectedFeatures$.value.length);
784
- } }, dependencies: [i6.NgForOf, i6.NgIf, i7.MatButton, i8.MatButtonToggleGroup, i8.MatButtonToggle, i9.MatFormField, i9.MatLabel, i10.MatIcon, i11.MatBadge, i12.MatTooltip, i13.MatSelect, i13.MatSelectTrigger, i14.MatOption, i15.MatSlideToggle, i16.EntityTableComponent, i6.AsyncPipe, i17.TranslatePipe], styles: [".geometry-type-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:25%}.draw-options[_ngcontent-%COMP%]{overflow-x:hidden}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options[_ngcontent-%COMP%]{margin:5px 5px 0}.deleteBtn[_ngcontent-%COMP%]{margin-left:12px}img[_ngcontent-%COMP%]{width:100%;height:100%}.box[_ngcontent-%COMP%]{width:25px;height:25px}"], data: { animation: [
1015
+ } }, dependencies: [i6.NgForOf, i6.NgIf, i7.MatButton, i8.MatButtonToggleGroup, i8.MatButtonToggle, i9.MatDivider, i10.MatFormField, i10.MatLabel, i11.MatIcon, i12.MatBadge, i13.MatTooltip, i14.MatSelect, i14.MatSelectTrigger, i15.MatOption, i16.MatSlideToggle, i17.EntityTableComponent, i6.AsyncPipe, i18.TranslatePipe], styles: [".geometry-type-toggle[_ngcontent-%COMP%]{padding:10px;text-align:center}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%]{width:100%}.geometry-type-toggle[_ngcontent-%COMP%] mat-button-toggle-group[_ngcontent-%COMP%] mat-button-toggle[_ngcontent-%COMP%]{width:25%}.draw-options[_ngcontent-%COMP%]{overflow-x:hidden}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%]{width:100%;margin:10px}.draw-options[_ngcontent-%COMP%] mat-slide-toggle[_ngcontent-%COMP%] .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options[_ngcontent-%COMP%]{margin:5px 5px 0}.edition-drawing[_ngcontent-%COMP%]{padding:10px 0}img[_ngcontent-%COMP%]{width:100%;height:100%}.deleteBtn[_ngcontent-%COMP%]{margin-left:12px}.storeTable[_ngcontent-%COMP%]{height:auto!important}.layer-select[_ngcontent-%COMP%]{width:85%;padding:10px 10px 0%}.input-button-container[_ngcontent-%COMP%]{padding:10px}.input-button-container[_ngcontent-%COMP%] mat-form-field[_ngcontent-%COMP%]{width:25%}.input-button-container[_ngcontent-%COMP%] button[_ngcontent-%COMP%]{left:8px;bottom:10px}"], data: { animation: [
785
1016
  trigger('openClose', [
786
1017
  state('open', style({
787
1018
  opacity: 1
@@ -806,8 +1037,22 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
806
1037
  transition('open => closed', [animate('600ms ease')]),
807
1038
  transition('closed => open', [animate('800ms ease')])
808
1039
  ])
809
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\r\n <div class=\"geometry-type-toggle mat-typography\">\r\n <mat-button-toggle-group\r\n (change)=\"onGeometryTypeChange($event.value)\" [value]=\"geometryType.Point\">\r\n <mat-button-toggle [value]=\"geometryType.Point\">\r\n {{'igo.geo.draw.' + geometryType.Point | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.LineString\">\r\n {{'igo.geo.draw.' + geometryType.LineString | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.Polygon\">\r\n {{'igo.geo.draw.' + geometryType.Polygon | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.Circle\">\r\n {{'igo.geo.draw.' + geometryType.Circle | translate}}\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n\r\n <div class=\"draw-options mat-typography\">\r\n <mat-slide-toggle\r\n [disabled]=\"drawControlIsDisabled\"\r\n [checked]=\"drawControlIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onToggleDrawControl($event.checked)\">\r\n {{'igo.geo.spatialFilter.drawControl' | translate}}\r\n </mat-slide-toggle>\r\n\r\n <mat-slide-toggle\r\n [checked]=\"labelsAreShown\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onToggleLabels()\">\r\n {{'igo.geo.draw.toggleMapTooltips' | translate}}\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <div>\r\n <button *ngIf=\"store.count$.getValue() > 0\"\r\n class=\"deleteBtn\"\r\n mat-icon-button\r\n color=\"warn\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.draw.delete' | translate\"\r\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\r\n (click)=\"deleteDrawings()\">\r\n <mat-icon svgIcon=\"delete\"></mat-icon>\r\n </button>\r\n\r\n <div>\r\n <igo-entity-table\r\n #table\r\n class=\"table-compact\"\r\n id=\"storeElements\"\r\n [store]=\"store\"\r\n [template]=\"tableTemplate\"\r\n (dblclick)=\"editLabelDrawing()\">\r\n </igo-entity-table>\r\n </div>\r\n </div>\r\n\r\n <div class=\"icon-options\">\r\n <mat-form-field *ngIf=\"icons.length >= 1\">\r\n <mat-label>{{ 'igo.geo.draw.icon' | translate }}</mat-label>\r\n <mat-select>\r\n <mat-select-trigger>\r\n <div *ngIf=\"icon\" class=\"box\">\r\n <img src=\"{{ icon }}\">\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"\" (click)=\"onIconChange()\">{{ 'igo.geo.draw.noIcon' | translate }}</mat-option>\r\n <mat-option\r\n *ngFor=\"let icon_html of icons\"\r\n [value]=\"icon_html\"\r\n (click)=\"onIconChange(icon_html)\">\r\n <div class=\"box\">\r\n <img src=\"{{ icon_html }}\">\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <button\r\n mat-icon-button\r\n color=\"accent\"\r\n disableRipple=\"true\"\r\n (click)=\"openShorcutsDialog()\">\r\n <mat-icon\r\n class=\"shortcuts-icon\"\r\n svgIcon=\"keyboard-outline\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.draw.shortcuts' | translate\">\r\n </mat-icon>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"selectedFeatures$.value.length\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"openStyleModalDialog()\"\r\n [matTooltip]=\"'igo.geo.layer.style.styleModalTooltip' | translate\">\r\n {{'igo.geo.layer.style.styleModal' | translate}}\r\n <mat-icon\r\n class=\"style-icon\"\r\n svgIcon=\"palette\"\r\n [matBadge]=\"selectedFeatures$.value.length\"\r\n matBadgeColor=\"warn\"\r\n matBadgeSize=\"medium\">\r\n </mat-icon>\r\n </button>\r\n</div>\r\n", styles: [".geometry-type-toggle{padding:10px;text-align:center}.geometry-type-toggle mat-button-toggle-group{width:100%}.geometry-type-toggle mat-button-toggle-group mat-button-toggle{width:25%}.draw-options{overflow-x:hidden}.draw-options mat-slide-toggle{width:100%;margin:10px}.draw-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options{margin:5px 5px 0}.deleteBtn{margin-left:12px}img{width:100%;height:100%}.box{width:25px;height:25px}\n"] }]
810
- }], function () { return [{ type: i1.LanguageService }, { type: i2.UntypedFormBuilder }, { type: i3.DrawStyleService }, { type: i4.MatDialog }, { type: i5.DrawIconService }]; }, { fillColor: [{
1040
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div>\r\n <div class=\"geometry-type-toggle mat-typography\">\r\n <mat-button-toggle-group\r\n (change)=\"onGeometryTypeChange($event.value)\" [value]=\"geometryType.Point\">\r\n <mat-button-toggle [value]=\"geometryType.Point\">\r\n {{'igo.geo.draw.' + geometryType.Point | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.LineString\">\r\n {{'igo.geo.draw.' + geometryType.LineString | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.Polygon\">\r\n {{'igo.geo.draw.' + geometryType.Polygon | translate}}\r\n </mat-button-toggle>\r\n\r\n <mat-button-toggle [value]=\"geometryType.Circle\">\r\n {{'igo.geo.draw.' + geometryType.Circle | translate}}\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n </div>\r\n\r\n <div class=\"draw-options mat-typography\">\r\n <mat-slide-toggle\r\n [disabled]=\"drawControlIsDisabled\"\r\n [checked]=\"drawControlIsActive\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onToggleDrawControl($event.checked)\">\r\n {{'igo.geo.spatialFilter.drawControl' | translate}}\r\n </mat-slide-toggle>\r\n\r\n <mat-slide-toggle\r\n [checked]=\"labelsAreShown\"\r\n [labelPosition]=\"'before'\"\r\n (change)=\"onToggleLabels()\"\r\n >\r\n {{ 'igo.geo.draw.toggleMapTooltips' | translate }}\r\n </mat-slide-toggle>\r\n </div>\r\n\r\n <mat-divider></mat-divider>\r\n\r\n <div>\r\n <mat-form-field appearance=\"outline\" class=\"layer-select\">\r\n <mat-label>{{'igo.geo.draw.layer.title' | translate}}</mat-label>\r\n <mat-select #selectedLayer (selectionChange)=\"onLayerChange(selectedLayer.value)\" [value]=\"updateActiveLayer()\">\r\n <mat-option *ngFor=\"let layer of allLayers\" [value]=\"layer\">\r\n {{ layer.title }}\r\n </mat-option>\r\n <mat-option id=\"createNewLayer\" >\r\n {{'igo.geo.draw.layer.createNewLayer' | translate}}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n <button\r\n *ngIf=\"activeDrawingLayer\"\r\n mat-icon-button\r\n [color]=\"activeDrawingLayer.visible ? 'primary' : 'default'\"\r\n collapsibleButton\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"activeDrawingLayer.visible ?\r\n ('igo.geo.layer.hideLayer' | translate) :\r\n ('igo.geo.layer.showLayer' | translate)\"\r\n (click)=\"activeDrawingLayer.visible = !activeDrawingLayer.visible\">\r\n <mat-icon\r\n [svgIcon]=\"activeDrawingLayer.visible ? 'eye' : 'eye-off'\">\r\n </mat-icon>\r\n </button>\r\n </div>\r\n <mat-divider></mat-divider>\r\n <div>\r\n <button\r\n *ngIf=\"activeStore.count$.getValue() > 0\"\r\n class=\"deleteBtn\"\r\n mat-icon-button\r\n color=\"warn\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.draw.delete' | translate\"\r\n [disabled]=\"(selectedFeatures$ | async).length === 0\"\r\n (click)=\"deleteDrawings()\">\r\n <mat-icon svgIcon=\"delete\"></mat-icon>\r\n </button>\r\n\r\n <div>\r\n <igo-entity-table\r\n #table\r\n class=\"table-compact\"\r\n [store]=\"activeStore\"\r\n [template]=\"tableTemplate\"\r\n (dblclick)=\"editLabelDrawing()\">\r\n </igo-entity-table>\r\n </div>\r\n </div>\r\n\r\n <div class=\"icon-options\">\r\n <mat-form-field *ngIf=\"icons.length >= 1\">\r\n <mat-label>{{ 'igo.geo.draw.icon' | translate }}</mat-label>\r\n <mat-select>\r\n <mat-select-trigger>\r\n <div *ngIf=\"icon\" class=\"box\">\r\n <img src=\"{{ icon }}\">\r\n </div>\r\n </mat-select-trigger>\r\n <mat-option value=\"\" (click)=\"onIconChange()\">{{ 'igo.geo.draw.noIcon' | translate }}</mat-option>\r\n <mat-option\r\n *ngFor=\"let icon_html of icons\"\r\n [value]=\"icon_html\"\r\n (click)=\"onIconChange(icon_html)\">\r\n <div class=\"box\">\r\n <img src=\"{{ icon_html }}\">\r\n </div>\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n\r\n <button\r\n mat-icon-button\r\n color=\"accent\"\r\n disableRipple=\"true\"\r\n (click)=\"openShorcutsDialog()\"\r\n >\r\n <mat-icon\r\n class=\"shortcuts-icon\"\r\n svgIcon=\"keyboard-outline\"\r\n tooltip-position=\"below\"\r\n matTooltipShowDelay=\"500\"\r\n [matTooltip]=\"'igo.geo.draw.shortcuts' | translate\"\r\n >\r\n </mat-icon>\r\n </button>\r\n\r\n <button\r\n *ngIf=\"selectedFeatures$.value.length\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"openStyleModalDialog()\"\r\n [matTooltip]=\"'igo.geo.layer.style.styleModalTooltip' | translate\">\r\n {{'igo.geo.layer.style.styleModal' | translate}}\r\n <mat-icon\r\n class=\"style-icon\"\r\n svgIcon=\"palette\"\r\n [matBadge]=\"selectedFeatures$.value.length\"\r\n matBadgeColor=\"warn\"\r\n matBadgeSize=\"medium\">\r\n </mat-icon>\r\n </button>\r\n</div>\r\n", styles: [".geometry-type-toggle{padding:10px;text-align:center}.geometry-type-toggle mat-button-toggle-group{width:100%}.geometry-type-toggle mat-button-toggle-group mat-button-toggle{width:25%}.draw-options{overflow-x:hidden}.draw-options mat-slide-toggle{width:100%;margin:10px}.draw-options mat-slide-toggle ::ng-deep .mat-slide-toggle-content{width:calc(100% - 60px)}.icon-options{margin:5px 5px 0}.edition-drawing{padding:10px 0}img{width:100%;height:100%}.deleteBtn{margin-left:12px}.storeTable{height:auto!important}.layer-select{width:85%;padding:10px 10px 0%}.input-button-container{padding:10px}.input-button-container mat-form-field{width:25%}.input-button-container button{left:8px;bottom:10px}\n"] }]
1041
+ }], function () { return [{ type: i1.LanguageService }, { type: i2.UntypedFormBuilder }, { type: i3.DrawStyleService }, { type: i4.MatDialog }, { type: i5.DrawIconService }]; }, { map: [{
1042
+ type: Input
1043
+ }], stores: [{
1044
+ type: Input
1045
+ }], drawControls: [{
1046
+ type: Input
1047
+ }], activeDrawingLayer: [{
1048
+ type: Input
1049
+ }], activeLayerChange: [{
1050
+ type: Output
1051
+ }], drawControlsEvent: [{
1052
+ type: Output
1053
+ }], layersIDEvent: [{
1054
+ type: Output
1055
+ }], fillColor: [{
811
1056
  type: Output
812
1057
  }], strokeColor: [{
813
1058
  type: Output
@@ -817,9 +1062,8 @@ DrawComponent.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DrawComponent
817
1062
  type: Output
818
1063
  }], fontStyle: [{
819
1064
  type: Output
820
- }], map: [{
821
- type: Input
822
- }], store: [{
823
- type: Input
1065
+ }], select: [{
1066
+ type: ViewChild,
1067
+ args: ['selectedLayer']
824
1068
  }] }); })();
825
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCx1QkFBdUIsRUFDdkIsTUFBTSxFQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFDTCxPQUFPLEVBRVAsNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYiwyQkFBMkIsRUFDM0IsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFJckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU1sRSxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFcEMsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFJMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxN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LFNBQVM7MkJBQ0UsVUFBVSxjQUNSO29CQUNWLE9BQU8sQ0FBQyxXQUFXLEVBQUU7d0JBQ25CLEtBQUssQ0FDSCxNQUFNLEVBQ04sS0FBSyxDQUFDOzRCQUNKLE9BQU8sRUFBRSxDQUFDO3lCQUNYLENBQUMsQ0FDSDt3QkFDRCxLQUFLLENBQ0gsUUFBUSxFQUNSLEtBQUssQ0FBQzs0QkFDSixPQUFPLEVBQUUsQ0FBQzt5QkFDWCxDQUFDLENBQ0g7d0JBQ0QsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7d0JBQ3JELFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3FCQUN0RCxDQUFDO2lCQUNILG1CQUdnQix1QkFBdUIsQ0FBQyxNQUFNO3dMQTRCckMsU0FBUztrQkFBbEIsTUFBTTtZQUNHLFdBQVc7a0JBQXBCLE1BQU07WUFDRyxXQUFXO2tCQUFwQixNQUFNO1lBRUcsUUFBUTtrQkFBakIsTUFBTTtZQUNHLFNBQVM7a0JBQWxCLE1BQU07WUFDRSxHQUFHO2tCQUFYLEtBQUs7WUFDRyxLQUFLO2tCQUFiLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIE91dHB1dFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBGRUFUVVJFLFxyXG4gIEZlYXR1cmVTdG9yZSxcclxuICBGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSxcclxuICB0cnlCaW5kU3RvcmVMYXllcixcclxuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3ksXHJcbiAgdHJ5QWRkU2VsZWN0aW9uU3RyYXRlZ3ksXHJcbiAgRmVhdHVyZU1vdGlvbixcclxuICBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3ksXHJcbiAgZmVhdHVyZVRvT2xcclxufSBmcm9tICcuLi8uLi9mZWF0dXJlJztcclxuXHJcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBGb250VHlwZSwgR2VvbWV0cnlUeXBlIH0gZnJvbSAnLi4vc2hhcmVkL2RyYXcuZW51bSc7XHJcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHJhdywgRmVhdHVyZVdpdGhEcmF3IH0gZnJvbSAnLi4vc2hhcmVkL2RyYXcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWZWN0b3JTb3VyY2VFdmVudCBhcyBPbFZlY3RvclNvdXJjZUV2ZW50IH0gZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCB7IFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy92ZWN0b3ItbGF5ZXInO1xyXG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2ZlYXR1cmUtZGF0YXNvdXJjZSc7XHJcbmltcG9ydCB7IERyYXdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvc2hhcmVkL2NvbnRyb2xzL2RyYXcnO1xyXG5pbXBvcnQge1xyXG4gIEVudGl0eVJlY29yZCxcclxuICBFbnRpdHlUYWJsZVRlbXBsYXRlXHJcbn0gZnJvbSAnQGlnbzIvY29tbW9uJztcclxuXHJcbmltcG9ydCAqIGFzIE9sU3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xyXG5pbXBvcnQgT2xWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCBPbENpcmNsZSBmcm9tICdvbC9nZW9tL0NpcmNsZSc7XHJcbmltcG9ydCBPbFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xyXG5pbXBvcnQgT2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xyXG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcclxuaW1wb3J0IE9sT3ZlcmxheSBmcm9tICdvbC9PdmVybGF5JztcclxuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBnZXREaXN0YW5jZSB9IGZyb20gJ29sL3NwaGVyZSc7XHJcbmltcG9ydCB7IERyYXdTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZHJhdy1zdHlsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgc2tpcCwgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERyYXdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vZHJhdy1wb3B1cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcmF3U2hvcmN1dHNDb21wb25lbnQgfSBmcm9tICcuL2RyYXctc2hvcmN1dHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgZ2V0VG9vbHRpcHNPZk9sR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9tZWFzdXJlL3NoYXJlZC9tZWFzdXJlLnV0aWxzJztcclxuaW1wb3J0IHsgY3JlYXRlSW50ZXJhY3Rpb25TdHlsZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LnV0aWxzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtIH0gZnJvbSAnb2wvcHJvaic7XHJcbmltcG9ydCB7IERyYXdJY29uU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LWljb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN0eWxlTW9kYWxDb21wb25lbnQsIFN0eWxlTW9kYWxEYXRhIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc3R5bGUtbW9kYWwvc3R5bGUtbW9kYWwuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgdHJpZ2dlcixcclxuICBzdGF0ZSxcclxuICBzdHlsZSxcclxuICBhbmltYXRlLFxyXG4gIHRyYW5zaXRpb25cclxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdpZ28tZHJhdycsXHJcbiAgYW5pbWF0aW9uczogW1xyXG4gICAgdHJpZ2dlcignb3BlbkNsb3NlJywgW1xyXG4gICAgICBzdGF0ZShcclxuICAgICAgICAnb3BlbicsXHJcbiAgICAgICAgc3R5bGUoe1xyXG4gICAgICAgICAgb3BhY2l0eTogMVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIHN0YXRlKFxyXG4gICAgICAgICdjbG9zZWQnLFxyXG4gICAgICAgIHN0eWxlKHtcclxuICAgICAgICAgIG9wYWNpdHk6IDBcclxuICAgICAgICB9KVxyXG4gICAgICApLFxyXG4gICAgICB0cmFuc2l0aW9uKCdvcGVuID0+IGNsb3NlZCcsIFthbmltYXRlKCc2MDBtcyBlYXNlJyldKSxcclxuICAgICAgdHJhbnNpdGlvbignY2xvc2VkID0+IG9wZW4nLCBbYW5pbWF0ZSgnODAwbXMgZWFzZScpXSlcclxuICAgIF0pXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vZHJhdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZHJhdy5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEcmF3Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8qKlxyXG4gICAqIFRhYmxlIHRlbXBsYXRlXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcHVibGljIHRhYmxlVGVtcGxhdGU6IEVudGl0eVRhYmxlVGVtcGxhdGUgPSB7XHJcbiAgICBzZWxlY3Rpb246IHRydWUsXHJcbiAgICBzZWxlY3RNYW55OiB0cnVlLFxyXG4gICAgc2VsZWN0aW9uQ2hlY2tib3g6IHRydWUsXHJcbiAgICBzb3J0OiB0cnVlLFxyXG4gICAgZml4ZWRIZWFkZXI6IHRydWUsXHJcbiAgICB0YWJsZUhlaWdodDogJ2F1dG8nLFxyXG4gICAgY29sdW1uczogW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0RyYXdpbmcnLFxyXG4gICAgICAgIHRpdGxlOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kcmF3LmxhYmVscycpLFxyXG4gICAgICAgIHRvb2x0aXA6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcuY2hhbmdlTGFiZWwnKSxcclxuICAgICAgICB2YWx1ZUFjY2Vzc29yOiAoZmVhdHVyZTogRmVhdHVyZVdpdGhEcmF3KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gZmVhdHVyZS5wcm9wZXJ0aWVzLmRyYXc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgfTtcclxuXHJcbiAgcHVibGljIGdlb21ldHJ5VHlwZSA9IEdlb21ldHJ5VHlwZTsgLy8gUmVmZXJlbmNlIHRvIHRoZSBHZW9tZXRyeVR5cGUgZW51bVxyXG5cclxuICBAT3V0cHV0KCkgZmlsbENvbG9yOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHN0cm9rZUNvbG9yOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHN0cm9rZVdpZHRoOiBudW1iZXI7XHJcblxyXG4gIEBPdXRwdXQoKSBmb250U2l6ZTogc3RyaW5nO1xyXG4gIEBPdXRwdXQoKSBmb250U3R5bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBtYXA6IElnb01hcDsgLy8gTWFwIHRvIGRyYXcgb25cclxuICBASW5wdXQoKSBzdG9yZTogRmVhdHVyZVN0b3JlPEZlYXR1cmVXaXRoRHJhdz47IC8vIERyYXdpbmcgc3RvcmVcclxuXHJcbiAgcHVibGljIGRyYXckOiBCZWhhdmlvclN1YmplY3Q8RHJhdz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTsgLy8gT2JzZXJ2YWJsZSBvZiBkcmF3XHJcblxyXG4gIHByaXZhdGUgb2xEcmF3aW5nTGF5ZXJTb3VyY2UgPSBuZXcgT2xWZWN0b3JTb3VyY2UoKTtcclxuICBwcml2YXRlIGRyYXdDb250cm9sOiBEcmF3Q29udHJvbDtcclxuICBwcml2YXRlIGRyYXdFbmQkJDogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgZHJhd1NlbGVjdCQkOiBTdWJzY3JpcHRpb247XHJcbiAgcHJpdmF0ZSBvbERyYXdpbmdMYXllcjogVmVjdG9yTGF5ZXI7XHJcbiAgcHVibGljIHNlbGVjdGVkRmVhdHVyZXMkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZVdpdGhEcmF3W10+ID1cclxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xyXG4gIHB1YmxpYyBmaWxsRm9ybTogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdHJva2VGb3JtOiBzdHJpbmc7XHJcbiAgcHVibGljIGRyYXdDb250cm9sSXNEaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGRyYXdDb250cm9sSXNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGFiZWxzQXJlU2hvd246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zJCQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHB1YmxpYyBwb3NpdGlvbjogc3RyaW5nID0gJ2JvdHRvbSc7XHJcbiAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIGljb25zOiBBcnJheTxzdHJpbmc+O1xyXG4gIHB1YmxpYyBpY29uOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgbnVtYmVyT2ZEcmF3aW5nczogbnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIGRyYXdTdHlsZVNlcnZpY2U6IERyYXdTdHlsZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBkcmF3SWNvblNlcnZpY2U6IERyYXdJY29uU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5idWlsZEZvcm0oKTtcclxuICAgIHRoaXMuZmlsbENvbG9yID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldEZpbGxDb2xvcigpO1xyXG4gICAgdGhpcy5zdHJva2VDb2xvciA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRTdHJva2VDb2xvcigpO1xyXG4gICAgdGhpcy5zdHJva2VXaWR0aCA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRTdHJva2VXaWR0aCgpO1xyXG4gICAgdGhpcy5sYWJlbHNBcmVTaG93biA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRMYWJlbHNBcmVTaG93bigpO1xyXG4gICAgdGhpcy5pY29ucyA9IHRoaXMuZHJhd0ljb25TZXJ2aWNlLmdldEljb25zKCk7XHJcbiAgICB0aGlzLmljb24gPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0SWNvbigpO1xyXG5cclxuICAgIHRoaXMuZm9udFNpemUgPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0Rm9udFNpemUoKTtcclxuICAgIHRoaXMuZm9udFN0eWxlID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldEZvbnRTdHlsZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gSW5pdGlhbGl6ZSB0aGUgc3RvcmUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGVudGl0aWVzIGFuZCBjcmVhdGUgdGhlIERyYXcgY29udHJvbFxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5pbml0U3RvcmUoKTtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2wgPSB0aGlzLmNyZWF0ZURyYXdDb250cm9sKFxyXG4gICAgICB0aGlzLmZpbGxDb2xvcixcclxuICAgICAgdGhpcy5zdHJva2VDb2xvcixcclxuICAgICAgdGhpcy5zdHJva2VXaWR0aFxyXG4gICAgKTtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2wuc2V0R2VvbWV0cnlUeXBlKHRoaXMuZ2VvbWV0cnlUeXBlLlBvaW50IGFzIGFueSk7XHJcbiAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIGRyYXdpbmcgbGF5ZXIgYW5kIHRoZSBpbnRlcmFjdGlvbnNcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2wuc2V0T2xNYXAodW5kZWZpbmVkKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLm1hcCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERyYXcgQ29udHJvbFxyXG4gICAqIEBwYXJhbSBmaWxsQ29sb3IgdGhlIGZpbGwgY29sb3JcclxuICAgKiBAcGFyYW0gc3Ryb2tlQ29sb3IgdGhlIHN0cm9rZSBjb2xvclxyXG4gICAqIEBwYXJhbSBzdHJva2VXaWR0aCB0aGUgc3Ryb2tlIHdpZHRoXHJcbiAgICogQHJldHVybnMgYSBEcmF3IENvbnRyb2xcclxuICAgKi9cclxuICBjcmVhdGVEcmF3Q29udHJvbChcclxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcclxuICAgIHN0cm9rZUNvbG9yPzogc3RyaW5nLFxyXG4gICAgc3Ryb2tlV2lkdGg/OiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGRyYXdDb250cm9sID0gbmV3IERyYXdDb250cm9sKHtcclxuICAgICAgZ2VvbWV0cnlUeXBlOiB1bmRlZmluZWQsXHJcbiAgICAgIGRyYXdpbmdMYXllclNvdXJjZTogdGhpcy5vbERyYXdpbmdMYXllclNvdXJjZSxcclxuICAgICAgZHJhd2luZ0xheWVyU3R5bGU6IG5ldyBPbFN0eWxlLlN0eWxlKHt9KSxcclxuICAgICAgaW50ZXJhY3Rpb25TdHlsZTogY3JlYXRlSW50ZXJhY3Rpb25TdHlsZShcclxuICAgICAgICBmaWxsQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlQ29sb3IsXHJcbiAgICAgICAgc3Ryb2tlV2lkdGhcclxuICAgICAgKVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGRyYXdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmUgaW5pdGlhbGl6YXRpb24sIGluY2x1ZGluZyBkcmF3aW5nIGxheWVyIGNyZWF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpbml0U3RvcmUoKSB7XHJcbiAgICB0aGlzLm1hcC5yZW1vdmVMYXllcih0aGlzLm9sRHJhd2luZ0xheWVyKTtcclxuXHJcbiAgICAvLyB0aGlzLm1hcC5hZGRMYXllcigpXHJcbiAgICB0aGlzLm9sRHJhd2luZ0xheWVyID0gbmV3IFZlY3RvckxheWVyKHtcclxuICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxyXG4gICAgICBpZDogJ2lnby1kcmF3LWxheWVyJyxcclxuICAgICAgdGl0bGU6IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmRyYXcuZHJhd2luZycpLFxyXG4gICAgICB6SW5kZXg6IDIwMCxcclxuICAgICAgc291cmNlOiBuZXcgRmVhdHVyZURhdGFTb3VyY2UoKSxcclxuICAgICAgc3R5bGU6IChmZWF0dXJlLCByZXNvbHV0aW9uKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhd1N0eWxlU2VydmljZS5jcmVhdGVJbmRpdmlkdWFsRWxlbWVudFN0eWxlKFxyXG4gICAgICAgICAgZmVhdHVyZSxcclxuICAgICAgICAgIHJlc29sdXRpb24sXHJcbiAgICAgICAgICB0aGlzLmxhYmVsc0FyZVNob3duLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZScpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLmZpbGwsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFgnKSxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRZJyksXHJcbiAgICAgICAgICB0aGlzLmljb25cclxuICAgICAgICApO1xyXG4gICAgICB9LFxyXG4gICAgICBzaG93SW5MYXllckxpc3Q6IHRydWUsXHJcbiAgICAgIGV4cG9ydGFibGU6IHRydWUsXHJcbiAgICAgIGJyb3dzYWJsZTogZmFsc2UsXHJcbiAgICAgIHdvcmtzcGFjZToge1xyXG4gICAgICAgIGVuYWJsZWQ6IGZhbHNlXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdHJ5QmluZFN0b3JlTGF5ZXIodGhpcy5zdG9yZSwgdGhpcy5vbERyYXdpbmdMYXllcik7XHJcblxyXG4gICAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KFxyXG4gICAgICB0aGlzLnN0b3JlLFxyXG4gICAgICBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcclxuICAgICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uTm9uZVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0cnlBZGRTZWxlY3Rpb25TdHJhdGVneShcclxuICAgICAgdGhpcy5zdG9yZSxcclxuICAgICAgbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcclxuICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lLFxyXG4gICAgICAgIG1hbnk6IHRydWVcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICB0aGlzLnN0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5zdG9yZS5zb3VyY2Uub2wub24oXHJcbiAgICAgICdyZW1vdmVmZWF0dXJlJyxcclxuICAgICAgKGV2ZW50OiBPbFZlY3RvclNvdXJjZUV2ZW50PE9sR2VvbWV0cnk+KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGV2ZW50LmZlYXR1cmUuZ2V0R2VvbWV0cnkoKTtcclxuICAgICAgICB0aGlzLmNsZWFyTGFiZWxzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXHJcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGVWaWV3XHJcbiAgICAgICAgLm1hbnlCeSQoKHJlY29yZDogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz4pID0+IHtcclxuICAgICAgICAgIHJldHVybiByZWNvcmQuc3RhdGUuc2VsZWN0ZWQgPT09IHRydWU7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpcnN0KClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgocmVjb3JkczogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz5bXSkgPT4ge1xyXG4gICAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKChyZWNvcmQpID0+IHtcclxuICAgICAgICAgICAgcmVjb3JkLnN0YXRlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKFxyXG4gICAgICB0aGlzLnN0b3JlLnN0YXRlVmlld1xyXG4gICAgICAgIC5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aERyYXc+KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBza2lwKDEpIC8vIFNraXAgaW5pdGlhbCBlbWlzc2lvblxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLm5leHQocmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gcmVjb3JkLmVudGl0eSkpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXHJcbiAgICAgIHRoaXMuc3RvcmUuY291bnQkLnN1YnNjcmliZSgoY250KSA9PiB7XHJcbiAgICAgICAgaWYgKGNudCA+IDApIHtcclxuICAgICAgICAgIHRoaXMuc3RvcmUuc2V0TGF5ZXJFeHRlbnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY250ID49IDFcclxuICAgICAgICAgID8gKHRoaXMuc3RvcmUubGF5ZXIub3B0aW9ucy5zaG93SW5MYXllckxpc3QgPSB0cnVlKVxyXG4gICAgICAgICAgOiAodGhpcy5zdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuLyoqXHJcbiAqIE9wZW4gdGhlIHN0eWxlIG1vZGFsIGRpYWxvZyBib3hcclxuICovXHJcbiAgb3BlblN0eWxlTW9kYWxEaWFsb2coKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gb3BlbiB0aGUgZGlhbG9nIGJveCB1c2VkIHRvIHN0eWxlIGZlYXR1cmVzXHJcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU3R5bGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZmVhdHVyZXM6IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgIGljb25zOiB0aGlzLmljb25zLFxyXG4gICAgICAgICAgaWNvbjogdGhpcy5pY29uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gd2hlbiBkaWFsb2cgYm94IGlzIGNsb3NlZCwgZ2V0IGxhYmVsIGFuZCBzZXQgaXQgdG8gZ2VvbWV0cnlcclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChkYXRhOiBTdHlsZU1vZGFsRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vIGNoZWNrcyBpZiB0aGUgdXNlciBjbGlja2VkIG9rXHJcbiAgICAgICAgaWYgKGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtRmxhZykge1xyXG4gICAgICAgICAgdGhpcy5vbkZvbnRDaGFuZ2UodGhpcy5sYWJlbHNBcmVTaG93biwgZGF0YS5mb250U2l6ZSwgZGF0YS5mb250U3R5bGUpO1xyXG4gICAgICAgICAgdGhpcy5vbkNvbG9yQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIHRoaXMuaWNvbiA/IHRydWUgOiBmYWxzZSwgZGF0YS5maWxsQ29sb3IsIGRhdGEuc3Ryb2tlQ29sb3IpO1xyXG4gICAgICAgICAgdGhpcy5vbk9mZnNldExhYmVsQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIGRhdGEub2Zmc2V0WCwgZGF0YS5vZmZzZXRZKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gYSBkaWFsb2cgYm94IHRvIGVudGVyIGxhYmVsIGFuZCBkbyBzb21ldGhpbmdcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBnZW9tZXRyeSBhdCBkcmF3IGVuZCBvciBzZWxlY3RlZCBnZW9tZXRyeVxyXG4gICAqIEBwYXJhbSBkcmF3RW5kIGV2ZW50IGZpcmVkIGF0IGRyYXdFbmQ/XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvcGVuRHJhd0RpYWxvZyhvbEdlb21ldHJ5LCBpc0RyYXdFbmQ6IGJvb2xlYW4pIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBvcGVuIHRoZSBkaWFsb2cgYm94IHVzZWQgdG8gZW50ZXIgbGFiZWxcclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEcmF3UG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICAgIGRhdGE6IHsgY3VycmVudExhYmVsOiBvbEdlb21ldHJ5LmdldCgnZHJhdycpIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyB3aGVuIGRpYWxvZyBib3ggaXMgY2xvc2VkLCBnZXQgbGFiZWwgYW5kIHNldCBpdCB0byBnZW9tZXRyeVxyXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGxhYmVsOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAvLyBjaGVja3MgaWYgdGhlIHVzZXIgY2xpY2tlZCBva1xyXG4gICAgICAgIGlmIChkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUZsYWcpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWxPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgbGFiZWwpO1xyXG4gICAgICAgICAgaWYgKCFvbEdlb21ldHJ5LnZhbHVlc18uZm9udFN0eWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEdlb21ldHJ5LCAnMjAnLCBGb250VHlwZS5BcmlhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIW9sR2VvbWV0cnkudmFsdWVzXy5kcmF3aW5nU3R5bGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWxsQW5kU3Ryb2tlQ29sb3IoXHJcbiAgICAgICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjQpJyxcclxuICAgICAgICAgICAgICAncmdiYSgxNDMsNyw3LDEpJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCEob2xHZW9tZXRyeS52YWx1ZXNfLm9mZnNldFggfHwgb2xHZW9tZXRyeS52YWx1ZXNfLm9mZnNldFkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KFxyXG4gICAgICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICBvbEdlb21ldHJ5IGluc3RhbmNlb2YgUG9pbnQgPyAtMTUgOiAwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgZXZlbnQgd2FzIGZpcmVkIGF0IGRyYXcgZW5kXHJcbiAgICAgICAgICBpZiAoaXNEcmF3RW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25EcmF3RW5kKG9sR2VvbWV0cnkpO1xyXG4gICAgICAgICAgICAvLyBpZiBldmVudCB3YXMgZmlyZWQgYXQgc2VsZWN0XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0RHJhdyhvbEdlb21ldHJ5LCBsYWJlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodFRhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZXMgdGhlIGZlYXR1cmVcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMub2xEcmF3aW5nTGF5ZXJTb3VyY2VcclxuICAgICAgICAgICAgLmdldEZlYXR1cmVzKClcclxuICAgICAgICAgICAgLmZvckVhY2goKGRyYXdpbmdMYXllckZlYXR1cmUpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBnZW9tZXRyeSA9IGRyYXdpbmdMYXllckZlYXR1cmUuZ2V0R2VvbWV0cnkoKSBhcyBhbnk7XHJcbiAgICAgICAgICAgICAgaWYgKG9sR2VvbWV0cnkgPT09IGdlb21ldHJ5KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9sRHJhd2luZ0xheWVyU291cmNlLnJlbW92ZUZlYXR1cmUoZHJhd2luZ0xheWVyRmVhdHVyZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSBkcmF3IHNvdXJjZSBhbmQgdHJhY2sgdGhlIGdlb21ldHJ5IGJlaW5nIGRyYXdcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPbCBsaW5lc3RyaW5nIG9yIHBvbHlnb25cclxuICAgKi9cclxuICBwcml2YXRlIG9uRHJhd0VuZChvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LCByYWRpdXM/OiBudW1iZXIpIHtcclxuICAgIHRoaXMuYWRkRmVhdHVyZVRvU3RvcmUob2xHZW9tZXRyeSwgcmFkaXVzKTtcclxuICAgIHRoaXMuY2xlYXJMYWJlbHNPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSk7XHJcbiAgICB0aGlzLnN0b3JlLmxheWVyLm9sLmdldFNvdXJjZSgpLnJlZnJlc2goKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb2RpZnlEcmF3KG9sR2VvbWV0cnkpIHtcclxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5zdG9yZS5hbGwoKTtcclxuXHJcbiAgICBlbnRpdGllcy5mb3JFYWNoKChlbnRpdHkpID0+IHtcclxuICAgICAgY29uc3QgZW50aXR5SWQgPSBlbnRpdHkucHJvcGVydGllcy5pZDtcclxuXHJcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnlJZCA9IG9sR2VvbWV0cnkub2xfdWlkO1xyXG5cclxuICAgICAgaWYgKGVudGl0eUlkID09PSBvbEdlb21ldHJ5SWQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZUxhYmVsT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnksIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXcpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShcclxuICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUuc3BsaXQoJyAnKVswXS5yZXBsYWNlKCdweCcsICcnKSxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5zdWJzdHJpbmcoXHJcbiAgICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5pbmRleE9mKCcgJykgKyAxXHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihcclxuICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5kcmF3aW5nU3R5bGUuZmlsbCxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5zdHJva2VcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KFxyXG4gICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFgsXHJcbiAgICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnJlcGxhY2VGZWF0dXJlSW5TdG9yZShlbnRpdHksIG9sR2VvbWV0cnkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25TZWxlY3REcmF3KG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuc3RvcmUuYWxsKCk7XHJcblxyXG4gICAgY29uc3Qgb2xHZW9tZXRyeSA9IG9sRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueTtcclxuICAgIG9sR2VvbWV0cnkub2xfdWlkID0gb2xGZWF0dXJlLmdldCgnaWQnKTtcclxuXHJcbiAgICBjb25zdCBvbEdlb21ldHJ5Q29vcmRpbmF0ZXMgPSBKU09OLnN0cmluZ2lmeShcclxuICAgICAgb2xHZW9tZXRyeS5nZXRDb29yZGluYXRlcygpWzBdXHJcbiAgICApO1xyXG5cclxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xyXG4gICAgICBjb25zdCBlbnRpdHlDb29yZGluYXRlcyA9IEpTT04uc3RyaW5naWZ5KGVudGl0eS5nZW9tZXRyeS5jb29yZGluYXRlc1swXSk7XHJcblxyXG4gICAgICBpZiAob2xHZW9tZXRyeUNvb3JkaW5hdGVzID09PSBlbnRpdHlDb29yZGluYXRlcykge1xyXG4gICAgICAgIGNvbnN0IGZvbnRTaXplID0gb2xGZWF0dXJlXHJcbiAgICAgICAgICAuZ2V0KCdmb250U3R5bGUnKVxyXG4gICAgICAgICAgLnNwbGl0KCcgJylbMF1cclxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKTtcclxuICAgICAgICBjb25zdCBmb250U3R5bGUgPSBvbEZlYXR1cmVcclxuICAgICAgICAgIC5nZXQoJ2ZvbnRTdHlsZScpXHJcbiAgICAgICAgICAuc3Vic3RyaW5nKG9sRmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZScpLmluZGV4T2YoJyAnKSArIDEpO1xyXG5cclxuICAgICAgICBjb25zdCBmaWxsQ29sb3IgPSBvbEZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5maWxsO1xyXG4gICAgICAgIGNvbnN0IHN0cm9rZUNvbG9yID0gb2xGZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlO1xyXG5cclxuICAgICAgICBjb25zdCBvZmZzZXRYID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WCcpO1xyXG4gICAgICAgIGNvbnN0IG9mZnNldFkgPSBvbEZlYXR1cmUuZ2V0KCdvZmZzZXRZJyk7XHJcblxyXG4gICAgICAgIGNvbnN0IHJhZDogbnVtYmVyID0gZW50aXR5LnByb3BlcnRpZXMucmFkXHJcbiAgICAgICAgICA/IGVudGl0eS5wcm9wZXJ0aWVzLnJhZFxyXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy51cGRhdGVMYWJlbE9mT2xHZW9tZXRyeShvbEdlb21ldHJ5LCBsYWJlbCk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGb250U2l6ZUFuZFN0eWxlKG9sR2VvbWV0cnksIGZvbnRTaXplLCBmb250U3R5bGUpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKG9sR2VvbWV0cnksIGZpbGxDb2xvciwgc3Ryb2tlQ29sb3IpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KG9sR2VvbWV0cnksIG9mZnNldFgsIG9mZnNldFkpO1xyXG4gICAgICAgIHRoaXMucmVwbGFjZUZlYXR1cmVJblN0b3JlKGVudGl0eSwgb2xHZW9tZXRyeSwgcmFkKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGQgYSBmZWF0dXJlIHdpdGggZHJhdyBsYWJlbCB0byB0aGUgc3RvcmUuIFRoZSBsb2FkaW5nIHN0cmFnZWd5IG9mIHRoZSBzdG9yZVxyXG4gICAqIHdpbGwgdHJpZ2dlciBhbmQgYWRkIHRoZSBmZWF0dXJlIHRvIHRoZSBtYXAuXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGRGZWF0dXJlVG9TdG9yZShcclxuICAgIG9sR2VvbWV0cnksXHJcbiAgICByYWRpdXM/OiBudW1iZXIsXHJcbiAgICBmZWF0dXJlPzogRmVhdHVyZVdpdGhEcmF3XHJcbiAgKSB7XHJcbiAgICBsZXQgcmFkOiBudW1iZXI7XHJcbiAgICBsZXQgY2VudGVyNDMyNjogQXJyYXk8bnVtYmVyPjtcclxuICAgIGxldCBwb2ludDQzMjY6IEFycmF5PG51bWJlcj47XHJcbiAgICBsZXQgbG9uNDMyNjogbnVtYmVyO1xyXG4gICAgbGV0IGxhdDQzMjY6IG51bWJlcjtcclxuICAgIGNvbnN0IGZlYXR1cmVJZCA9IGZlYXR1cmUgPyBmZWF0dXJlLnByb3BlcnRpZXMuaWQgOiBvbEdlb21ldHJ5Lm9sX3VpZDtcclxuICAgIGNvbnN0IHByb2plY3Rpb24gPSB0aGlzLm1hcC5vbC5nZXRWaWV3KCkuZ2V0UHJvamVjdGlvbigpO1xyXG5cclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IE9sR2VvSlNPTigpLndyaXRlR2VvbWV0cnlPYmplY3Qob2xHZW9tZXRyeSwge1xyXG4gICAgICBmZWF0dXJlUHJvamVjdGlvbjogcHJvamVjdGlvbixcclxuICAgICAgZGF0YVByb2plY3Rpb246IHByb2plY3Rpb25cclxuICAgIH0pIGFzIGFueTtcclxuXHJcbiAgICBpZiAob2xHZW9tZXRyeSBpbnN0YW5jZW9mIE9sQ2lyY2xlIHx8IHJhZGl1cykge1xyXG4gICAgICBpZiAocmFkaXVzKSB7XHJcbiAgICAgICAgcmFkID0gcmFkaXVzO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnUG9pbnQnO1xyXG4gICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gb2xHZW9tZXRyeS5nZXRDZW50ZXIoKTtcclxuICAgICAgICBjb25zdCBleHRlbnQ0MzI2ID0gdHJhbnNmb3JtKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzJdLFxyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzNdXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgcHJvamVjdGlvbixcclxuICAgICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjZW50ZXI0MzI2ID0gdHJhbnNmb3JtKFxyXG4gICAgICAgICAgW1xyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzBdLFxyXG4gICAgICAgICAgICBvbEdlb21ldHJ5LmdldEZsYXRDb29yZGluYXRlcygpWzFdXHJcbiAgICAgICAgICBdLFxyXG4gICAgICAgICAgcHJvamVjdGlvbixcclxuICAgICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsb240MzI2ID0gY2VudGVyNDMyNlswXTtcclxuICAgICAgICBsYXQ0MzI2ID0gY2VudGVyNDMyNlsxXTtcclxuICAgICAgICByYWQgPSBnZXREaXN0YW5jZShjZW50ZXI0MzI2LCBleHRlbnQ0MzI2KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChvbEdlb21ldHJ5IGluc3RhbmNlb2YgT2xQb2ludCkge1xyXG4gICAgICBwb2ludDQzMjYgPSB0cmFuc2Zvcm0oXHJcbiAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKSxcclxuICAgICAgICBwcm9qZWN0aW9uLFxyXG4gICAgICAgICdFUFNHOjQzMjYnXHJcbiAgICAgICk7XHJcbiAgICAgIGxvbjQzMjYgPSBwb2ludDQzMjZbMF07XHJcbiAgICAgIGxhdDQzMjYgPSBwb2ludDQzMjZbMV07XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoe1xyXG4gICAgICB0eXBlOiBGRUFUVVJFLFxyXG4gICAgICBnZW9tZXRyeSxcclxuICAgICAgcHJvamVjdGlvbjogcHJvamVjdGlvbi5nZXRDb2RlKCksXHJcbiAgICAgIHByb3BlcnRpZXM6IHtcclxuICAgICAgICBpZDogZmVhdHVyZUlkLFxyXG4gICAgICAgIGRyYXc6IG9sR2VvbWV0cnkuZ2V0KCdfbGFiZWwnKSxcclxuICAgICAgICBsb25naXR1ZGU6IGxvbjQzMjYgPyBsb240MzI2IDogbnVsbCxcclxuICAgICAgICBsYXRpdHVkZTogbGF0NDMyNiA/IGxhdDQzMjYgOiBudWxsLFxyXG4gICAgICAgIHJhZDogcmFkID8gcmFkIDogbnVsbCxcclxuICAgICAgICBmb250U3R5bGU6IG9sR2VvbWV0cnkuZ2V0KCdmb250U3R5bGVfJyksXHJcbiAgICAgICAgZHJhd2luZ1N0eWxlOiB7XHJcbiAgICAgICAgICBmaWxsOiBvbEdlb21ldHJ5LmdldCgnZmlsbENvbG9yXycpLFxyXG4gICAgICAgICAgc3Ryb2tlOiBvbEdlb21ldHJ5LmdldCgnc3Ryb2tlQ29sb3JfJylcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9mZnNldFg6IG9sR2VvbWV0cnkuZ2V0KCdvZmZzZXRYXycpLFxyXG4gICAgICAgIG9mZnNldFk6IG9sR2VvbWV0cnkuZ2V0KCdvZmZzZXRZXycpXHJcbiAgICAgIH0sXHJcbiAgICAgIG1ldGE6IHtcclxuICAgICAgICBpZDogZmVhdHVyZUlkXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBidWlsZEZvcm0oKSB7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgZmlsbDogWycnXSxcclxuICAgICAgc3Ryb2tlOiBbJyddXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGRvdWJsZS1jbGlja3MgdGhlIHNlbGVjdGVkIGRyYXdpbmdcclxuICAgKi9cclxuICBlZGl0TGFiZWxEcmF3aW5nKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG9sR2VvbWV0cnkgPSBmZWF0dXJlVG9PbChcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlWzBdLFxyXG4gICAgICAgIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMub3BlbkRyYXdEaWFsb2cob2xHZW9tZXRyeSwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlblNob3JjdXRzRGlhbG9nKCkge1xyXG4gICAgdGhpcy5kaWFsb2cub3BlbihEcmF3U2hvcmN1dHNDb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlRHJhd2luZ3MoKSB7XHJcbiAgICB0aGlzLnN0b3JlLmRlbGV0ZU1hbnkodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZSk7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKHNlbGVjdGVkRmVhdHVyZSkgPT4ge1xyXG4gICAgICB0aGlzLm9sRHJhd2luZ0xheWVyU291cmNlLmdldEZlYXR1cmVzKCkuZm9yRWFjaCgoZHJhd2luZ0xheWVyRmVhdHVyZSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGdlb21ldHJ5ID0gZHJhd2luZ0xheWVyRmVhdHVyZS5nZXRHZW9tZXRyeSgpIGFzIGFueTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRGZWF0dXJlLnByb3BlcnRpZXMuaWQgPT09IGdlb21ldHJ5Lm9sX3VpZCkge1xyXG4gICAgICAgICAgdGhpcy5vbERyYXdpbmdMYXllclNvdXJjZS5yZW1vdmVGZWF0dXJlKGRyYXdpbmdMYXllckZlYXR1cmUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMudXBkYXRlSGVpZ2h0VGFibGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIGxhYmVscyB0b2dnbGVcclxuICAgKi9cclxuICBvblRvZ2dsZUxhYmVscygpIHtcclxuICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS50b2dnbGVMYWJlbHNBcmVTaG93bigpO1xyXG4gICAgdGhpcy5sYWJlbHNBcmVTaG93biA9ICF0aGlzLmxhYmVsc0FyZVNob3duO1xyXG4gICAgdGhpcy5pY29uXHJcbiAgICAgID8gdGhpcy5vbkNvbG9yQ2hhbmdlKFxyXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcclxuICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcclxuICAgICAgICAgIHRoaXMuc3Ryb2tlQ29sb3JcclxuICAgICAgICApXHJcbiAgICAgIDogdGhpcy5vbkNvbG9yQ2hhbmdlKFxyXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcclxuICAgICAgICAgIGZhbHNlLFxyXG4gICAgICAgICAgdGhpcy5maWxsQ29sb3IsXHJcbiAgICAgICAgICB0aGlzLnN0cm9rZUNvbG9yXHJcbiAgICAgICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIERyYXcgY29udHJvbCBpcyB0b2dnbGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgb25Ub2dnbGVEcmF3Q29udHJvbCh0b2dnbGVJc0NoZWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRvZ2dsZUlzQ2hlY2tlZCA/IHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKSA6IHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVc2VyIGNoYW5nZXMgcHJvcGVydGllcyBvZiBhIGRyYXdpbmcgZWxlbWVudFxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBjb2xvciBpbiBhIGNvbG9yIHBpY2tlclxyXG4gICAqIEBwYXJhbSBsYWJlbHNBcmVTaG93biB3aGV0ZXIgdGhlIGxhYmVscyBhcmUgc2hvd24gb3Igbm90XHJcbiAgICogQHBhcmFtIGlzQW5JY29uIHdoZXRlciB0aGUgZmVhdHVyZSBpcyBhbiBpY29uIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBmaWxsQ29sb3Igd2hpY2ggaXMgdGhlIGZpbGxpbmcgY29sb3JcclxuICAgKiBAcGFyYW0gc3Ryb2tlQ29sb3Igd2hpY2ggaXMgdGhlIHN0cm9rZSBjb2xvclxyXG4gICAqL1xyXG4gIG9uQ29sb3JDaGFuZ2UoXHJcbiAgICBsYWJlbHNBcmVTaG93bjogYm9vbGVhbixcclxuICAgIGlzQW5JY29uOiBib29sZWFuLFxyXG4gICAgZmlsbENvbG9yOiBzdHJpbmcsXHJcbiAgICBzdHJva2VDb2xvcjogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwICYmICFpc0FuSWNvbikge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKGZlYXR1cmUpID0+IHtcclxuICAgICAgICBsZXQgb2xGZWF0dXJlID0gZmVhdHVyZVRvT2woXHJcbiAgICAgICAgICBmZWF0dXJlLFxyXG4gICAgICAgICAgdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKG9sRmVhdHVyZSwgZmlsbENvbG9yLCBzdHJva2VDb2xvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuc3RvcmVcclxuICAgICAgICAgIC5hbGwoKVxyXG4gICAgICAgICAgLmZpbmQoKGUpID0+IGUubWV0YS5pZCA9PT0gb2xGZWF0dXJlLmdldElkKCkpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5maWxsID0gb2xGZWF0dXJlLmdldCgnZmlsbENvbG9yXycpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5zdHJva2UgPSBvbEZlYXR1cmUuZ2V0KCdzdHJva2VDb2xvcl8nKTtcclxuICAgICAgICB0aGlzLnN0b3JlLnVwZGF0ZShlbnRpdHkpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZmlsbENvbG9yID0gZmlsbENvbG9yO1xyXG4gICAgdGhpcy5zdHJva2VDb2xvciA9IHN0cm9rZUNvbG9yO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duLCBpc0FuSWNvbik7XHJcbiAgICB0aGlzLmNyZWF0ZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSBmb250IHNpemUgb3IvYW5kIHN0eWxlXHJcbiAgICogQHBhcmFtIGxhYmVsc0FyZVNob3duIHdoZXRlciB0aGUgbGFiZWxzIGFyZSBzaG93biBvciBub3RcclxuICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZm9udFxyXG4gICAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgb2YgdGhlIGZvbnRcclxuICAgKi9cclxuXHJcbiAgb25Gb250Q2hhbmdlKGxhYmVsc0FyZVNob3duOiBib29sZWFuLCBzaXplOiBzdHJpbmcsIHN0eWxlOiBGb250VHlwZSkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmZvckVhY2goKGZlYXR1cmUpID0+IHtcclxuICAgICAgICBsZXQgb2xGZWF0dXJlID0gZmVhdHVyZVRvT2woXHJcbiAgICAgICAgICBmZWF0dXJlLFxyXG4gICAgICAgICAgdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEZlYXR1cmUsIHNpemUsIHN0eWxlKTtcclxuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnN0b3JlXHJcbiAgICAgICAgICAuYWxsKClcclxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUgPSBvbEZlYXR1cmUuZ2V0KCdmb250U3R5bGVfJyk7XHJcbiAgICAgICAgdGhpcy5zdG9yZS51cGRhdGUoZW50aXR5KTtcclxuICAgICAgICBvbEZlYXR1cmUgPSB0aGlzLnN0b3JlLmxheWVyLm9sLmdldFNvdXJjZSgpLmdldEZlYXR1cmVzKCkuZmluZChmID0+IGYuZ2V0SWQoKSA9PT0gZW50aXR5Lm1ldGEuaWQpO1xyXG4gICAgICAgIG9sRmVhdHVyZS5zZXRQcm9wZXJ0aWVzKHsgZm9udFN0eWxlOiBlbnRpdHkucHJvcGVydGllcy5mb250U3R5bGUgfSk7XHJcbiAgICAgICAgb2xGZWF0dXJlLmNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmZvbnRTaXplID0gc2l6ZTtcclxuICAgICAgdGhpcy5mb250U3R5bGUgPSBzdHlsZTtcclxuXHJcbiAgICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS5zZXRGb250U2l6ZShzaXplKTtcclxuICAgICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEZvbnRTdHlsZShzdHlsZSk7XHJcblxyXG4gICAgICB0aGlzLmVsZW1lbnRTdHlsZShsYWJlbHNBcmVTaG93bik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBjaGFuZ2VzIHRoZSB2YWx1ZSBvZiB0aGUgaG9yaXpvbnRhbC92ZXJ0aWNhbCBvZmZzZXRcclxuICAgKiBAcGFyYW0gbGFiZWxzQXJlU2hvd24gd2hldGVyIHRoZSBsYWJlbHMgYXJlIHNob3duIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBvZmZzZXRYIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSBsYWJlbFxyXG4gICAqIEBwYXJhbSBvZmZzZXRZIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgbGFiZWxcclxuICAgKi9cclxuXHJcbiAgb25PZmZzZXRMYWJlbENoYW5nZShcclxuICAgIGxhYmVsc0FyZVNob3duOiBib29sZWFuLFxyXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxyXG4gICAgb2Zmc2V0WTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xyXG4gICAgICAgIGxldCBvbEZlYXR1cmUgPSBmZWF0dXJlVG9PbChcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICB0aGlzLm1hcC5vbC5nZXRWaWV3KCkuZ2V0UHJvamVjdGlvbigpLmdldENvZGUoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXQob2xGZWF0dXJlLCBvZmZzZXRYLCBvZmZzZXRZKTtcclxuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLnN0b3JlXHJcbiAgICAgICAgICAuYWxsKClcclxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRYID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WF8nKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WV8nKTtcclxuICAgICAgICB0aGlzLnN0b3JlLnVwZGF0ZShlbnRpdHkpO1xyXG4gICAgICAgIG9sRmVhdHVyZSA9IHRoaXMuc3RvcmUubGF5ZXIub2wuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKS5maW5kKGYgPT4gZi5nZXRJZCgpID09PSBlbnRpdHkubWV0YS5pZCk7XHJcbiAgICAgICAgb2xGZWF0dXJlLnNldFByb3BlcnRpZXMoeyBvZmZzZXRYOiBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRYLCBvZmZzZXRZOiBlbnRpdHkucHJvcGVydGllcy5vZmZzZXRZIH0pO1xyXG4gICAgICAgIG9sRmVhdHVyZS5jaGFuZ2VkKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLmVsZW1lbnRTdHlsZShsYWJlbHNBcmVTaG93bik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkljb25DaGFuZ2UoZXZlbnQ/KSB7XHJcbiAgICB0aGlzLmljb24gPSBldmVudDtcclxuICAgIHRoaXMuZHJhd1N0eWxlU2VydmljZS5zZXRJY29uKHRoaXMuaWNvbik7XHJcbiAgICB0aGlzLmVsZW1lbnRTdHlsZSh0cnVlLCB0aGlzLmljb24pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhIG5ldyBnZW9tZXRyeSB0eXBlXHJcbiAgICogQHBhcmFtIGdlb21ldHJ5VHlwZSB0aGUgZ2VvbWV0cnkgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlclxyXG4gICAqL1xyXG4gIG9uR2VvbWV0cnlUeXBlQ2hhbmdlKGdlb21ldHJ5VHlwZTogVHlwZSkge1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbC5zZXRHZW9tZXRyeVR5cGUoZ2VvbWV0cnlUeXBlKTtcclxuICAgIHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2Ygb2xGZWF0dXJlIGlucHV0dGVkXHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZSB0aGUgbGFiZWwgb2YgYSBnZW9tZXRyeSB3aGVuIGEgbGFiZWwgaXMgZW50ZXJlZCBpbiBhIGRpYWxvZyBib3hcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSB0aGUgZ2VvbWV0cnlcclxuICAgKiBAcGFyYW0gbGFiZWwgdGhlIGxhYmVsXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVMYWJlbE9mT2xHZW9tZXRyeShvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LCBsYWJlbDogc3RyaW5nKSB7XHJcbiAgICBvbEdlb21ldHJ5LnNldFByb3BlcnRpZXMoXHJcbiAgICAgIHtcclxuICAgICAgICBfbGFiZWw6IGxhYmVsXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvbnRTaXplQW5kU3R5bGUoXHJcbiAgICBvbEZlYXR1cmU6IE9sRmVhdHVyZTxPbEdlb21ldHJ5PixcclxuICAgIGZvbnRTaXplOiBzdHJpbmcsXHJcbiAgICBmb250U3R5bGU6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgb2xGZWF0dXJlLnNldFByb3BlcnRpZXMoXHJcbiAgICAgIHtcclxuICAgICAgICBmb250U3R5bGVfOiBgJHtmb250U2l6ZX1weCAke2ZvbnRTdHlsZX1gXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihcclxuICAgIG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxyXG4gICAgZmlsbENvbG9yOiBzdHJpbmcsXHJcbiAgICBzdHJva2VDb2xvcjogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyhcclxuICAgICAge1xyXG4gICAgICAgIGZpbGxDb2xvcl86IGZpbGxDb2xvcixcclxuICAgICAgICBzdHJva2VDb2xvcl86IHN0cm9rZUNvbG9yXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU9mZnNldChcclxuICAgIG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxyXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxyXG4gICAgb2Zmc2V0WTogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyhcclxuICAgICAge1xyXG4gICAgICAgIG9mZnNldFhfOiBvZmZzZXRYLFxyXG4gICAgICAgIG9mZnNldFlfOiBvZmZzZXRZXHJcbiAgICAgIH0sXHJcbiAgICAgIHRydWVcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDaGVjayB0aGUgYW1vdW50IG9mIHJvd3MgYXMgYSBwb3NzaWJsZSBhbHRlcm5hdGl2ZVxyXG4gICAqL1xyXG4gIHVwZGF0ZUhlaWdodFRhYmxlKCkge1xyXG4gICAgdGhpcy5udW1iZXJPZkRyYXdpbmdzID0gdGhpcy5zdG9yZS5jb3VudCQuZ2V0VmFsdWUoKTtcclxuICAgIHRoaXMubnVtYmVyT2ZEcmF3aW5ncyA+IDEwID8gdGhpcy50YWJsZVRlbXBsYXRlLnRhYmxlSGVpZ2h0ID0gJzM1dmgnOiB0aGlzLnRhYmxlVGVtcGxhdGUudGFibGVIZWlnaHQgPSAnYXV0byc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSB0aGUgY29ycmVjdCBjb250cm9sXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB0b2dnbGVEcmF3Q29udHJvbCgpIHtcclxuICAgIHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgICB0aGlzLmFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENsZWFyIHRoZSB0b29sdGlwcyBvZiBhbiBPTCBnZW9tZXRyeVxyXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9MIGdlb21ldHJ5IHdpdGggdG9vbHRpcHNcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFyTGFiZWxzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpIHtcclxuICAgIGdldFRvb2x0aXBzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpLmZvckVhY2goXHJcbiAgICAgIChvbFRvb2x0aXA6IE9sT3ZlcmxheSB8IHVuZGVmaW5lZCkgPT4ge1xyXG4gICAgICAgIGlmIChvbFRvb2x0aXAgJiYgb2xUb29sdGlwLmdldE1hcCgpKSB7XHJcbiAgICAgICAgICB0aGlzLm1hcC5vbC5yZW1vdmVPdmVybGF5KG9sVG9vbHRpcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBSZXBsYWNlIHRoZSBmZWF0dXJlIGluIHRoZSBzdG9yZVxyXG4gICAqIEBwYXJhbSBlbnRpdHkgdGhlIGVudGl0eSB0byByZXBsYWNlXHJcbiAgICogQHBhcmFtIG9sR2VvbWV0cnkgdGhlIG5ldyBnZW9tZXRyeSB0byBpbnNlcnQgaW4gdGhlIHN0b3JlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXBsYWNlRmVhdHVyZUluU3RvcmUoXHJcbiAgICBlbnRpdHksXHJcbiAgICBvbEdlb21ldHJ5OiBPbEdlb21ldHJ5LFxyXG4gICAgcmFkaXVzPzogbnVtYmVyXHJcbiAgKSB7XHJcbiAgICB0aGlzLnN0b3JlLmRlbGV0ZShlbnRpdHkpO1xyXG4gICAgdGhpcy5vbkRyYXdFbmQob2xHZW9tZXRyeSwgcmFkaXVzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlYWN0aXZhdGUgdGhlIGFjdGl2ZSBkcmF3IGNvbnRyb2xcclxuICAgKi9cclxuICBwcml2YXRlIGRlYWN0aXZhdGVEcmF3Q29udHJvbCgpIHtcclxuICAgIGlmICghdGhpcy5kcmF3Q29udHJvbCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZHJhd0VuZCQkKSB7XHJcbiAgICAgIHRoaXMuZHJhd0VuZCQkLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kcmF3Q29udHJvbC5zZXRPbE1hcCh1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3RpdmF0ZSBhIGdpdmVuIGNvbnRyb2xcclxuICAgKi9cclxuICBwcml2YXRlIGFjdGl2YXRlRHJhd0NvbnRyb2woKSB7XHJcbiAgICB0aGlzLmRyYXdDb250cm9sSXNEaXNhYmxlZCA9IGZhbHNlO1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbElzQWN0aXZlID0gdHJ1ZTtcclxuICAgIHRoaXMuZHJhd0VuZCQkID0gdGhpcy5kcmF3Q29udHJvbC5lbmQkLnN1YnNjcmliZShcclxuICAgICAgKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnkpID0+IHtcclxuICAgICAgICB0aGlzLm9wZW5EcmF3RGlhbG9nKG9sR2VvbWV0cnksIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuZHJhd0NvbnRyb2wubW9kaWZ5JC5zdWJzY3JpYmUoKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnkpID0+IHtcclxuICAgICAgdGhpcy5vbk1vZGlmeURyYXcob2xHZW9tZXRyeSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZHJhd1NlbGVjdCQkKSB7XHJcbiAgICAgIHRoaXMuZHJhd1NlbGVjdCQkID0gdGhpcy5kcmF3Q29udHJvbC5zZWxlY3QkLnN1YnNjcmliZShcclxuICAgICAgICAob2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4pID0+IHtcclxuICAgICAgICAgIHRoaXMub3BlbkRyYXdEaWFsb2cob2xGZWF0dXJlLCBmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZHJhd0NvbnRyb2wuc2V0T2xNYXAodGhpcy5tYXAub2wsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVjcmVhdGVzIHRoZSBzdHlsZSBvZiB0aGUgZmVhdHVyZSBzdG9yZWRcclxuICAgKi9cclxuICBwcml2YXRlIGVsZW1lbnRTdHlsZShsYWJlbHNBcmVTaG93bjogYm9vbGVhbiwgaXNBbkljb24/KSB7XHJcbiAgICBpZiAoaXNBbkljb24pIHtcclxuICAgICAgdGhpcy5zdG9yZS5sYXllci5vbC5zZXRTdHlsZSgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuY3JlYXRlSW5kaXZpZHVhbEVsZW1lbnRTdHlsZShcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgbGFiZWxzQXJlU2hvd24sXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZm9udFN0eWxlJyksXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbCxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5zdHJva2UsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnb2Zmc2V0WCcpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFknKSxcclxuICAgICAgICAgIHRoaXMuaWNvblxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdG9yZS5sYXllci5vbC5zZXRTdHlsZSgoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuY3JlYXRlSW5kaXZpZHVhbEVsZW1lbnRTdHlsZShcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgbGFiZWxzQXJlU2hvd24sXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZm9udFN0eWxlJyksXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbCxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5zdHJva2UsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnb2Zmc2V0WCcpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFknKVxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJnZW9tZXRyeS10eXBlLXRvZ2dsZSBtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwXHJcbiAgICAgIChjaGFuZ2UpPVwib25HZW9tZXRyeVR5cGVDaGFuZ2UoJGV2ZW50LnZhbHVlKVwiIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuUG9pbnRcIj5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuUG9pbnRcIj5cclxuICAgICAgICB7eydpZ28uZ2VvLmRyYXcuJyArIGdlb21ldHJ5VHlwZS5Qb2ludCB8IHRyYW5zbGF0ZX19XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcblxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5MaW5lU3RyaW5nXCI+XHJcbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuTGluZVN0cmluZyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcblxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5Qb2x5Z29uXCI+XHJcbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuUG9seWdvbiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcblxyXG4gICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgW3ZhbHVlXT1cImdlb21ldHJ5VHlwZS5DaXJjbGVcIj5cclxuICAgICAgICB7eydpZ28uZ2VvLmRyYXcuJyArIGdlb21ldHJ5VHlwZS5DaXJjbGUgfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG4gICAgPC9tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cImRyYXctb3B0aW9ucyBtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICAgW2Rpc2FibGVkXT1cImRyYXdDb250cm9sSXNEaXNhYmxlZFwiXHJcbiAgICAgIFtjaGVja2VkXT1cImRyYXdDb250cm9sSXNBY3RpdmVcIlxyXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXHJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVEcmF3Q29udHJvbCgkZXZlbnQuY2hlY2tlZClcIj5cclxuICAgICAge3snaWdvLmdlby5zcGF0aWFsRmlsdGVyLmRyYXdDb250cm9sJyB8IHRyYW5zbGF0ZX19XHJcbiAgICA8L21hdC1zbGlkZS10b2dnbGU+XHJcblxyXG4gICAgPG1hdC1zbGlkZS10b2dnbGVcclxuICAgICAgW2NoZWNrZWRdPVwibGFiZWxzQXJlU2hvd25cIlxyXG4gICAgICBbbGFiZWxQb3NpdGlvbl09XCInYmVmb3JlJ1wiXHJcbiAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVMYWJlbHMoKVwiPlxyXG4gICAgICB7eydpZ28uZ2VvLmRyYXcudG9nZ2xlTWFwVG9vbHRpcHMnIHwgdHJhbnNsYXRlfX1cclxuICAgIDwvbWF0LXNsaWRlLXRvZ2dsZT5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJzdG9yZS5jb3VudCQuZ2V0VmFsdWUoKSA+IDBcIlxyXG4gICAgICBjbGFzcz1cImRlbGV0ZUJ0blwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICB0b29sdGlwLXBvc2l0aW9uPVwiYmVsb3dcIlxyXG4gICAgICBtYXRUb29sdGlwU2hvd0RlbGF5PVwiNTAwXCJcclxuICAgICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8uZHJhdy5kZWxldGUnIHwgdHJhbnNsYXRlXCJcclxuICAgICAgW2Rpc2FibGVkXT1cIihzZWxlY3RlZEZlYXR1cmVzJCB8IGFzeW5jKS5sZW5ndGggPT09IDBcIlxyXG4gICAgICAoY2xpY2spPVwiZGVsZXRlRHJhd2luZ3MoKVwiPlxyXG4gICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImRlbGV0ZVwiPjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2PlxyXG4gICAgICA8aWdvLWVudGl0eS10YWJsZVxyXG4gICAgICAgICN0YWJsZVxyXG4gICAgICAgIGNsYXNzPVwidGFibGUtY29tcGFjdFwiXHJcbiAgICAgICAgaWQ9XCJzdG9yZUVsZW1lbnRzXCJcclxuICAgICAgICBbc3RvcmVdPVwic3RvcmVcIlxyXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJ0YWJsZVRlbXBsYXRlXCJcclxuICAgICAgICAoZGJsY2xpY2spPVwiZWRpdExhYmVsRHJhd2luZygpXCI+XHJcbiAgICAgIDwvaWdvLWVudGl0eS10YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaWNvbi1vcHRpb25zXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpY29ucy5sZW5ndGggPj0gMVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLmRyYXcuaWNvbicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3Q+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpY29uXCIgY2xhc3M9XCJib3hcIj5cclxuICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBpY29uIH19XCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiIChjbGljayk9XCJvbkljb25DaGFuZ2UoKVwiPnt7ICdpZ28uZ2VvLmRyYXcubm9JY29uJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGljb25faHRtbCBvZiBpY29uc1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiaWNvbl9odG1sXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkljb25DaGFuZ2UoaWNvbl9odG1sKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxyXG4gICAgICAgICAgICA8aW1nIHNyYz1cInt7IGljb25faHRtbCB9fVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uXHJcbiAgICBtYXQtaWNvbi1idXR0b25cclxuICAgIGNvbG9yPVwiYWNjZW50XCJcclxuICAgIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCJcclxuICAgIChjbGljayk9XCJvcGVuU2hvcmN1dHNEaWFsb2coKVwiPlxyXG4gICAgPG1hdC1pY29uXHJcbiAgICAgIGNsYXNzPVwic2hvcnRjdXRzLWljb25cIlxyXG4gICAgICBzdmdJY29uPVwia2V5Ym9hcmQtb3V0bGluZVwiXHJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXHJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kcmF3LnNob3J0Y3V0cycgfCB0cmFuc2xhdGVcIj5cclxuICAgIDwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcblxyXG4gIDxidXR0b25cclxuICAgICpuZ0lmPVwic2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoXCJcclxuICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgKGNsaWNrKT1cIm9wZW5TdHlsZU1vZGFsRGlhbG9nKClcIlxyXG4gICAgW21hdFRvb2x0aXBdPVwiJ2lnby5nZW8ubGF5ZXIuc3R5bGUuc3R5bGVNb2RhbFRvb2x0aXAnIHwgdHJhbnNsYXRlXCI+XHJcbiAgICB7eydpZ28uZ2VvLmxheWVyLnN0eWxlLnN0eWxlTW9kYWwnIHwgdHJhbnNsYXRlfX1cclxuICAgIDxtYXQtaWNvblxyXG4gICAgICBjbGFzcz1cInN0eWxlLWljb25cIlxyXG4gICAgICBzdmdJY29uPVwicGFsZXR0ZVwiXHJcbiAgICAgIFttYXRCYWRnZV09XCJzZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGhcIlxyXG4gICAgICBtYXRCYWRnZUNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdEJhZGdlU2l6ZT1cIm1lZGl1bVwiPlxyXG4gICAgPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuPC9kaXY+XHJcbiJdfQ==
1069
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhdy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9nZW8vc3JjL2xpYi9kcmF3L2RyYXcvZHJhdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFHTCx1QkFBdUIsRUFDdkIsTUFBTSxFQUNOLFlBQVksRUFDWixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUNMLE9BQU8sRUFDUCxZQUFZLEVBQ1osNkJBQTZCLEVBQzdCLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYiwyQkFBMkIsRUFDM0IsV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBSXZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUFFLGVBQWUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFJckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQU1sRSxPQUFPLEtBQUssT0FBTyxNQUFNLFVBQVUsQ0FBQztBQUNwQyxPQUFPLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLFFBQVEsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFcEMsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLENBQUM7QUFJMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV4QyxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2xFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFcEMsT0FBTyxFQUFFLG1CQUFtQixFQUFrQixNQUFNLCtDQUErQyxDQUFDO0FBRXBHLE9BQU8sRUFDTCxPQUFPLEVBQ1AsS0FBSyxFQUNMLEtBQUssRUFDTCxPQUFPLEVBQ1AsVUFBVSxFQUNYLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxLQUFLLE1BQU0sZUFBZSxDQUFDO0FBRWxDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDdEIvRCxxQ0FBNEQ7SUFDMUQsWUFDRjtJQUFBLGlCQUFhOzs7SUFGK0IsZ0NBQWU7SUFDekQsZUFDRjtJQURFLCtDQUNGOzs7O0lBTUosa0NBVXFFO0lBQW5FLDhKQUFTLHNGQUF3RCxJQUFDOzs7SUFDbEUsK0JBRVc7SUFDYixpQkFBUzs7O0lBWFAsaUZBQTRELHFKQUFBO0lBUzFELGVBQTBEO0lBQTFELCtFQUEwRDs7OztJQU05RCxrQ0FTNkI7SUFBM0IsZ0tBQVMsZUFBQSx3QkFBZ0IsQ0FBQSxJQUFDOzs7SUFDMUIsK0JBQXNDO0lBQ3hDLGlCQUFTOzs7SUFKUCx3RUFBZ0QseUVBQUE7OztJQXNCNUMsK0JBQThCO0lBQzVCLDBCQUFzQjtJQUN4QixpQkFBTTs7O0lBREMsZUFBZ0I7SUFBaEIsK0RBQWdCOzs7O0lBSXpCLHNDQUdvQztJQUFsQyw0UEFBUyxlQUFBLG1DQUF1QixDQUFBLElBQUM7SUFDakMsK0JBQWlCO0lBQ2YsMEJBQTJCO0lBQzdCLGlCQUFNLEVBQUE7OztJQUpOLHFDQUFtQjtJQUdaLGVBQXFCO0lBQXJCLGdFQUFxQjs7OztJQWRsQyxzQ0FBMEMsZ0JBQUE7SUFDN0IsWUFBcUM7O0lBQUEsaUJBQVk7SUFDNUQsa0NBQVkseUJBQUE7SUFFUixpRkFFTTtJQUNSLGlCQUFxQjtJQUNyQixzQ0FBOEM7SUFBekIsNEtBQVMsZUFBQSxzQkFBYyxDQUFBLElBQUM7SUFBQyxZQUF1Qzs7SUFBQSxpQkFBYTtJQUNsRyxpR0FPYTtJQUNmLGlCQUFhLEVBQUE7OztJQWhCRixlQUFxQztJQUFyQywrREFBcUM7SUFHdEMsZUFBVTtJQUFWLGtDQUFVO0lBSTRCLGVBQXVDO0lBQXZDLGlFQUF1QztJQUU3RCxlQUFRO0lBQVIsc0NBQVE7Ozs7SUEyQnRDLGtDQUtxRTtJQURuRSxnS0FBUyxlQUFBLDhCQUFzQixDQUFBLElBQUM7O0lBRWhDLFlBQ0E7O0lBQUEsK0JBTVc7SUFDYixpQkFBUzs7O0lBVFAsMEZBQWtFO0lBQ2xFLGVBQ0E7SUFEQSx1RkFDQTtJQUdFLGVBQTJDO0lBQTNDLGdFQUEyQzs7QURsRGpELE1BQU0sT0FBTyxhQUFhO0lBNEZ4QixZQUNVLGVBQWdDLEVBQ2hDLFdBQStCLEVBQy9CLGdCQUFrQyxFQUNsQyxNQUFpQixFQUNqQixlQUFnQztRQUpoQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQy9CLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFoRzFDOzs7V0FHRztRQUNJLGtCQUFhLEdBQXdCO1lBQzFDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsVUFBVSxFQUFFLElBQUk7WUFDaEIsaUJBQWlCLEVBQUUsSUFBSTtZQUN2QixJQUFJLEVBQUUsSUFBSTtZQUNWLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFdBQVcsRUFBRSxNQUFNO1lBQ25CLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsU0FBUztvQkFDZixLQUFLLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDO29CQUNwRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDO29CQUMzRSxhQUFhLEVBQUUsQ0FBQyxPQUF3QixFQUFFLEVBQUU7d0JBQzFDLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7b0JBQ2pDLENBQUM7aUJBQ0Y7YUFDRjtTQUNGLENBQUM7UUFFSyxpQkFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLHFDQUFxQztRQVVqRSxZQUFPLEdBQW1DLEVBQUUsQ0FBQztRQVM3QyxrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQVdqQixzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO1FBQ3BELHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUEyQixDQUFDO1FBQ2hFLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQVU3QyxtQkFBYyxHQUFXLENBQUMsQ0FBQztRQUM1QixVQUFLLEdBQTBCLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1FBQzVFLDZCQUF3QixHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7UUFJakQsc0JBQWlCLEdBQ3RCLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBR25CLDBCQUFxQixHQUFZLElBQUksQ0FBQztRQUN0Qyx3QkFBbUIsR0FBWSxLQUFLLENBQUM7UUFFcEMsb0JBQWUsR0FBbUIsRUFBRSxDQUFDO1FBRXRDLGFBQVEsR0FBVyxRQUFRLENBQUM7UUFNNUIsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ25DLHFCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBWSxDQUFDO1FBV3hELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN0RCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ2hFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUU1QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBbEZELElBQ0ksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBc0M7UUFDL0MsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQUdELElBQ0ksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBOEI7UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUdELElBQ0ksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxJQUFJLGtCQUFrQixDQUFDLEtBQWtCO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQTRERCxrRkFBa0Y7SUFDbEYsUUFBUTtRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxDQUFrQixFQUFFLEVBQUU7Z0JBQ3ZELEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRzthQUNkLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUM3QyxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7WUFDRixJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBWSxDQUFDLENBQUM7WUFDdkUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQzdFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzdDO2FBQU07WUFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzVGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLElBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFO29CQUMzQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztpQkFDbkI7Z0JBQ0QsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBRTNELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN2QixLQUFLLENBQUMsU0FBUztxQkFDWixPQUFPLENBQUMsQ0FBQyxNQUFxQyxFQUFFLEVBQUU7b0JBQ2pELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDO2dCQUN4QyxDQUFDLENBQUM7cUJBQ0QsSUFBSSxDQUNILEtBQUssRUFBRSxDQUNSO3FCQUNBLFNBQVMsQ0FBQyxDQUFDLE9BQXdDLEVBQUUsRUFBRTtvQkFDdEQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUN6QixNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBQ2hDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQyxDQUNMLENBQUM7Z0JBRUYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ3ZCLEtBQUssQ0FBQyxTQUFTO3FCQUNaLE9BQU8sQ0FBQyxDQUFDLE1BQXFDLEVBQUUsRUFBRTtvQkFDakQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUM7Z0JBQ3hDLENBQUMsQ0FBQztxQkFDRCxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtpQkFDakM7cUJBQ0EsU0FBUyxDQUFDLENBQUMsT0FBd0MsRUFBRSxFQUFFO29CQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDLENBQUMsQ0FDTCxDQUFDO2dCQUVGLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUN2QixLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUM3QixHQUFHLElBQUksQ0FBQzt3QkFDTixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQzt3QkFDekQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDL0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztTQUM3QztJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0gsaUJBQWlCLENBQ2YsU0FBa0IsRUFDbEIsV0FBb0IsRUFDcEIsV0FBb0I7UUFFcEIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLFdBQVcsQ0FBQztZQUN4QyxZQUFZLEVBQUUsU0FBUztZQUN2QixrQkFBa0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCO1lBQ2pELGlCQUFpQixFQUFFLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDeEMsZ0JBQWdCLEVBQUUsc0JBQXNCLENBQ3RDLFNBQVMsRUFDVCxXQUFXLEVBQ1gsV0FBVyxDQUNaO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBRUQ7O09BRUc7SUFFSyxTQUFTLENBQUMsUUFBaUIsRUFBRSxVQUFvQjtRQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN2QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTO2FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLE1BQXFDLEVBQUUsRUFBRTtZQUNqRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQztRQUN4QyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQ0gsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLHdCQUF3QjtTQUNqQzthQUNBLFNBQVMsQ0FBQyxDQUFDLE9BQXdDLEVBQUUsRUFBRTtZQUN0RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUNMLENBQUM7UUFFRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FDdkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDeEMsR0FBRyxJQUFJLENBQUM7Z0JBQ04sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0JBQ3pELENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFSDs7T0FFRztJQUNELG9CQUFvQjtRQUNsQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsNkNBQTZDO1lBQzdDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUN0RCxZQUFZLEVBQUUsS0FBSztnQkFDbkIsSUFBSSxFQUFFO29CQUNKLFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFO29CQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7b0JBQ2pCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtpQkFDaEI7Z0JBQ0QsU0FBUyxFQUFFLEtBQUs7YUFDakIsQ0FBQyxDQUFDO1lBRUgsOERBQThEO1lBQzlELFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFvQixFQUFFLEVBQUU7Z0JBQ3pELGdDQUFnQztnQkFDaEMsSUFBSSxTQUFTLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFO29CQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3RFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDcEcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7aUJBQzNFO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBQyxVQUFVLEVBQUUsU0FBa0I7UUFDbkQsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLDBDQUEwQztZQUMxQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDckQsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2FBQy9DLENBQUMsQ0FBQztZQUVILDhEQUE4RDtZQUM5RCxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7Z0JBQ2xELGdDQUFnQztnQkFDaEMsSUFBSSxTQUFTLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFO29CQUMzQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7d0JBQ2pDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDL0Q7b0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO3dCQUNwQyxJQUFJLENBQUMsd0JBQXdCLENBQzNCLFVBQVUsRUFDVix1QkFBdUIsRUFDdkIsaUJBQWlCLENBQ2xCLENBQUM7cUJBQ0g7b0JBQ0QsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTt3QkFDL0QsSUFBSSxDQUFDLFlBQVksQ0FDZixVQUFVLEVBQ1YsQ0FBQyxFQUNELFVBQVUsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RDLENBQUM7cUJBQ0g7b0JBRUQsaUNBQWlDO29CQUNqQyxJQUFJLFNBQVMsRUFBRTt3QkFDYixJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3dCQUMzQiwrQkFBK0I7cUJBQ2hDO3lCQUFNO3dCQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUN0QztvQkFDRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztpQkFDMUI7Z0JBQ0Qsc0JBQXNCO3FCQUNqQjtvQkFDSCxJQUFJLENBQUMsd0JBQXdCO3lCQUMxQixXQUFXLEVBQUU7eUJBQ2IsT0FBTyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsRUFBRTt3QkFDL0IsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxFQUFTLENBQUM7d0JBQzFELElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRTs0QkFDM0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FDekMsbUJBQW1CLENBQ3BCLENBQUM7eUJBQ0g7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ047WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7O09BR0c7SUFDSyxTQUFTLENBQUMsVUFBc0IsRUFBRSxNQUFlO1FBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRU8sWUFBWSxDQUFDLFVBQVU7UUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUV4QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFFdEMsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztZQUV2QyxJQUFJLFFBQVEsS0FBSyxZQUFZLEVBQUU7Z0JBQzdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLHNCQUFzQixDQUN6QixVQUFVLEVBQ1YsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQzNELE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDbkMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FDN0MsQ0FDRixDQUFDO2dCQUNGLElBQUksQ0FBQyx3QkFBd0IsQ0FDM0IsVUFBVSxFQUNWLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksRUFDbkMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUN0QyxDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLENBQ2YsVUFBVSxFQUNWLE1BQU0sQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUN6QixNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FDMUIsQ0FBQztnQkFDRixJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sWUFBWSxDQUFDLFNBQWdDLEVBQUUsS0FBYTtRQUNsRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBRXhDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxXQUFXLEVBQVMsQ0FBQztRQUNsRCxVQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEMsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUMxQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQy9CLENBQUM7UUFFRixRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUIsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekUsSUFBSSxxQkFBcUIsS0FBSyxpQkFBaUIsRUFBRTtnQkFDL0MsTUFBTSxRQUFRLEdBQUcsU0FBUztxQkFDdkIsR0FBRyxDQUFDLFdBQVcsQ0FBQztxQkFDaEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDYixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUNyQixNQUFNLFNBQVMsR0FBRyxTQUFTO3FCQUN4QixHQUFHLENBQUMsV0FBVyxDQUFDO3FCQUNoQixTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBRTFELE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUNyRCxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFFekQsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDekMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFekMsTUFBTSxHQUFHLEdBQVcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHO29CQUN2QyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFHO29CQUN2QixDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUNkLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO2dCQUM3RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNoRCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsQ0FBQzthQUNyRDtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxpQkFBaUIsQ0FDdkIsVUFBVSxFQUNWLE1BQWUsRUFDZixPQUF5QjtRQUV6QixJQUFJLEdBQVcsQ0FBQztRQUNoQixJQUFJLFVBQXlCLENBQUM7UUFDOUIsSUFBSSxTQUF3QixDQUFDO1FBQzdCLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksT0FBZSxDQUFDO1FBQ3BCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFekQsTUFBTSxRQUFRLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUU7WUFDL0QsaUJBQWlCLEVBQUUsVUFBVTtZQUM3QixjQUFjLEVBQUUsVUFBVTtTQUMzQixDQUFRLENBQUM7UUFFVixJQUFJLFVBQVUsWUFBWSxRQUFRLElBQUksTUFBTSxFQUFFO1lBQzVDLElBQUksTUFBTSxFQUFFO2dCQUNWLEdBQUcsR0FBRyxNQUFNLENBQUM7YUFDZDtpQkFBTTtnQkFDTCxRQUFRLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztnQkFDeEIsUUFBUSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzlDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FDMUI7b0JBQ0UsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNsQyxVQUFVLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7aUJBQ25DLEVBQ0QsVUFBVSxFQUNWLFdBQVcsQ0FDWixDQUFDO2dCQUNGLFVBQVUsR0FBRyxTQUFTLENBQ3BCO29CQUNFLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQztvQkFDbEMsVUFBVSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNuQyxFQUNELFVBQVUsRUFDVixXQUFXLENBQ1osQ0FBQztnQkFDRixPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixHQUFHLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUMzQztTQUNGO1FBRUQsSUFBSSxVQUFVLFlBQVksT0FBTyxFQUFFO1lBQ2pDLFNBQVMsR0FBRyxTQUFTLENBQ25CLFVBQVUsQ0FBQyxrQkFBa0IsRUFBRSxFQUMvQixVQUFVLEVBQ1YsV0FBVyxDQUNaLENBQUM7WUFDRixPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUN0QixJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVE7WUFDUixVQUFVLEVBQUUsVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUNoQyxVQUFVLEVBQUU7Z0JBQ1YsRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsSUFBSSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO2dCQUM5QixTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUk7Z0JBQ25DLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSTtnQkFDbEMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUNyQixTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLFlBQVksRUFBRTtvQkFDWixJQUFJLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7b0JBQ2xDLE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQztpQkFDdkM7Z0JBQ0QsT0FBTyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO2dCQUNuQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7YUFDcEM7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osRUFBRSxFQUFFLFNBQVM7YUFDZDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUNqQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDVixNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUM7U0FDYixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sVUFBVSxDQUFDLFVBQW9CO1FBQ3BDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtnQkFDMUQsWUFBWSxFQUFFLEtBQUs7YUFDcEIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQWEsRUFBRSxFQUFFO2dCQUNsRCxJQUFJLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUU7b0JBQzNDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO29CQUNwRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksWUFBWSxDQUFrQixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7b0JBQzVFLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO29CQUNyRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUM3QyxJQUFJLENBQUMsU0FBUyxFQUNkLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7b0JBQ0YsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDOUQsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7b0JBQzdFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3BELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFDO3dCQUN2QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7cUJBQ3ZCO29CQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7aUJBQ3REO3FCQUFNO29CQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDNUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2lCQUMzRDtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsQ0FBQztJQUVELHlCQUF5QjtJQUV6Qjs7T0FFRztJQUNILGdCQUFnQjtRQUNkLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDdkMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUMvQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FDaEQsQ0FBQztZQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDdkQsSUFBSSxDQUFDLHdCQUF3QjtpQkFDMUIsV0FBVyxFQUFFO2lCQUNiLE9BQU8sQ0FBQyxDQUFDLG1CQUFtQixFQUFFLEVBQUU7Z0JBQy9CLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLFdBQVcsRUFBUyxDQUFDO2dCQUMxRCxJQUFJLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLFFBQVEsQ0FBQyxNQUFNLEVBQUU7b0JBQ3JELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztpQkFDbEU7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsY0FBYztRQUNaLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzNDLElBQUksQ0FBQyxJQUFJO1lBQ1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQ2YsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUNMO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQ2YsSUFBSSxDQUFDLGNBQWMsRUFDbkIsS0FBSyxDQUNOLENBQUM7UUFDTixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsbUJBQW1CLENBQUMsZUFBd0I7UUFDMUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDNUUsQ0FBQztJQUVELCtDQUErQztJQUUvQzs7T0FFRztJQUVJLGFBQWEsQ0FBQyxTQUF1QjtRQUMxQyxJQUFJLFNBQVMsRUFBRTtZQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztZQUNwQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBQztnQkFDdkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9GLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUM7WUFDNUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM5RCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLFdBQVcsQ0FBQyxRQUFTLEVBQUUsVUFBVztRQUN2QyxLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUM7WUFDakMsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxXQUFXLENBQUM7WUFDeEMsa0JBQWtCLEVBQUUsSUFBSTtZQUN4QixFQUFFLEVBQUUsZ0JBQWdCLEdBQUcsRUFBRSxJQUFJLENBQUMsY0FBYztZQUM1QyxLQUFLLEVBQUUsVUFBVTtnQkFDZixDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDO1lBQ2xFLE1BQU0sRUFBRSxHQUFHO1lBQ1gsTUFBTSxFQUFFLElBQUksaUJBQWlCLEVBQUU7WUFDL0IsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxFQUFFO2dCQUM3QixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw0QkFBNEIsQ0FDdkQsT0FBTyxFQUNQLFVBQVUsRUFDVixJQUFJLENBQUMsY0FBYyxFQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQ3RCLElBQUksQ0FBQyxJQUFJLENBQ1YsQ0FBQztZQUNKLENBQUM7WUFDRCxlQUFlLEVBQUUsSUFBSTtZQUNyQixVQUFVLEVBQUUsSUFBSTtZQUNoQixTQUFTLEVBQUUsS0FBSztZQUNoQixTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLEtBQUs7YUFDZjtTQUNGLENBQUMsQ0FBQztRQUVILGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFN0QscUJBQXFCLENBQ25CLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksMkJBQTJCLENBQUM7WUFDOUIsTUFBTSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1NBQzNCLENBQUMsQ0FDSCxDQUFDO1FBRUYsdUJBQXVCLENBQ3JCLElBQUksQ0FBQyxXQUFXLEVBQ2hCLElBQUksNkJBQTZCLENBQUM7WUFDaEMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsTUFBTSxFQUFFLGFBQWEsQ0FBQyxJQUFJO1lBQzFCLElBQUksRUFBRSxJQUFJO1NBQ1gsQ0FBQyxDQUNILENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQzNCLGVBQWUsRUFDZixDQUFDLEtBQXNDLEVBQUUsRUFBRTtZQUN6QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMzQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxhQUFhLENBQ1gsY0FBdUIsRUFDdkIsUUFBaUIsRUFDakIsU0FBaUIsRUFDakIsV0FBbUI7UUFFbkIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDeEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUN6QixPQUFPLEVBQ1AsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQ2hELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBRWpFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXO3FCQUM1QixHQUFHLEVBQUU7cUJBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQ2xFLE1BQU0sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsQyxDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOzs7OztPQUtHO0lBRUgsWUFBWSxDQUFDLGNBQXVCLEVBQUUsSUFBWSxFQUFFLEtBQWU7UUFDakUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDL0MsSUFBSSxTQUFTLEdBQUcsV0FBVyxDQUN6QixPQUFPLEVBQ1AsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQ2hELENBQUM7Z0JBQ0YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3BELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXO3FCQUM1QixHQUFHLEVBQUU7cUJBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDaEQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ2hDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hHLFNBQVMsQ0FBQyxhQUFhLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRSxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUV2QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUVILG1CQUFtQixDQUNqQixjQUF1QixFQUN2QixPQUFlLEVBQ2YsT0FBZTtRQUVmLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7Z0JBQy9DLElBQUksU0FBUyxHQUFHLFdBQVcsQ0FDekIsT0FBTyxFQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUNoRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVc7cUJBQzVCLEdBQUcsRUFBRTtxQkFDTCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNoRCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RCxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDaEMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2dCQUNwRyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ25DO0lBQ0gsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFNO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsb0JBQW9CLENBQUMsWUFBa0I7UUFDckMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQVksQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCwrQ0FBK0M7SUFFL0M7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLFVBQXNCLEVBQUUsS0FBYTtRQUNuRSxVQUFVLENBQUMsYUFBYSxDQUN0QjtZQUNFLE1BQU0sRUFBRSxLQUFLO1NBQ2QsRUFDRCxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFTyxzQkFBc0IsQ0FDNUIsU0FBZ0MsRUFDaEMsUUFBZ0IsRUFDaEIsU0FBaUI7UUFFakIsU0FBUyxDQUFDLGFBQWEsQ0FDckI7WUFDRSxVQUFVLEVBQUUsR0FBRyxRQUFRLE1BQU0sU0FBUyxFQUFFO1NBQ3pDLEVBQ0QsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRU8sd0JBQXdCLENBQzlCLFNBQWdDLEVBQ2hDLFNBQWlCLEVBQ2pCLFdBQW1CO1FBRW5CLFNBQVMsQ0FBQyxhQUFhLENBQ3JCO1lBQ0UsVUFBVSxFQUFFLFNBQVM7WUFDckIsWUFBWSxFQUFFLFdBQVc7U0FDMUIsRUFDRCxJQUFJLENBQ0wsQ0FBQztJQUNKLENBQUM7SUFFTyxZQUFZLENBQ2xCLFNBQWdDLEVBQ2hDLE9BQWUsRUFDZixPQUFlO1FBRWYsU0FBUyxDQUFDLGFBQWEsQ0FDckI7WUFDRSxRQUFRLEVBQUUsT0FBTztZQUNqQixRQUFRLEVBQUUsT0FBTztTQUNsQixFQUNELElBQUksQ0FDTCxDQUFDO0lBQ0osQ0FBQztJQUVELDBEQUEwRDtJQUUxRCxrQkFBa0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTO2lCQUNqRCxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNiLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDWCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDNUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQ3RFO1lBQ0gsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxJQUFJO1lBQzlELENBQUMsQ0FBQyx1QkFBdUIsQ0FBQztJQUM5QixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUM1QyxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLE1BQU07WUFDaEUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDO0lBQ3hCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDNUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU87WUFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQsaUJBQWlCO1FBQ2YsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzVDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPO1lBQ3BELENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDVixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQ3RDLEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsaUJBQWlCO1FBQ2YscURBQXFEO1FBRXJELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMzRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRTtZQUN4QixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7WUFDM0MsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUYsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsaUJBQWlCO0lBRWpCOztPQUVHO0lBQ0ssaUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7O09BR0c7SUFDSyx1QkFBdUIsQ0FBQyxVQUFVO1FBQ3hDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FDekMsQ0FBQyxTQUFnQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNuQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDdEM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRDs7OztPQUlHO0lBQ0sscUJBQXFCLENBQzNCLE1BQU0sRUFDTixVQUFzQixFQUN0QixNQUFlO1FBRWYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0sscUJBQXFCO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsT0FBTztTQUNSO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDOUI7UUFFRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssbUJBQW1CO1FBQ3pCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxLQUFLLENBQUM7UUFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUNwRCxDQUFDLFVBQXNCLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQ0YsQ0FBQztRQUVGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsVUFBc0IsRUFBRSxFQUFFO1lBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUMxRCxDQUFDLFNBQWdDLEVBQUUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDeEMsQ0FBQyxDQUNGLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWSxDQUFDLGNBQXVCLEVBQUUsUUFBUztRQUNyRCxJQUFJLFFBQVEsRUFBRTtZQUNaLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQ3pELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUN2RCxPQUFPLEVBQ1AsVUFBVSxFQUNWLGNBQWMsRUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQ3RCLElBQUksQ0FBQyxJQUFJLENBQ1YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUU7Z0JBQ3pELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLDRCQUE0QixDQUN2RCxPQUFPLEVBQ1AsVUFBVSxFQUNWLGNBQWMsRUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksRUFDaEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLEVBQ2xDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQ3ZCLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7MEVBdGhDVSxhQUFhO2dFQUFiLGFBQWE7Ozs7Ozs7UUM5RjFCLDJCQUFLLGFBQUEsaUNBQUE7UUFHQyxtSEFBVSxzQ0FBa0MsSUFBQztRQUM3Qyw0Q0FBZ0Q7UUFDOUMsWUFDRjs7UUFBQSxpQkFBb0I7UUFFcEIsNENBQXFEO1FBQ25ELFlBQ0Y7O1FBQUEsaUJBQW9CO1FBRXBCLDRDQUFrRDtRQUNoRCxhQUNGOztRQUFBLGlCQUFvQjtRQUVwQiw2Q0FBaUQ7UUFDL0MsYUFDRjs7UUFBQSxpQkFBb0IsRUFBQSxFQUFBO1FBSXhCLCtCQUF5QywyQkFBQTtRQUtyQyw2R0FBVSx1Q0FBbUMsSUFBQztRQUM5QyxhQUNGOztRQUFBLGlCQUFtQjtRQUVuQiw0Q0FJQztRQURDLHVHQUFVLG9CQUFnQixJQUFDO1FBRTNCLGFBQ0Y7O1FBQUEsaUJBQW1CLEVBQUE7UUFHckIsK0JBQTJCO1FBRTNCLDRCQUFLLHlCQUFBLGlCQUFBO1FBRVUsYUFBMEM7O1FBQUEsaUJBQVk7UUFDakUseUNBQWdIO1FBQXJGLDJLQUFtQixlQUFBLDRCQUFrQyxDQUFBLElBQUM7UUFDL0UsOEVBRWE7UUFDYix1Q0FBaUM7UUFDL0IsYUFDRjs7UUFBQSxpQkFBYSxFQUFBLEVBQUE7UUFHakIsdUVBY1M7UUFDWCxpQkFBTTtRQUNOLCtCQUEyQjtRQUMzQiw0QkFBSztRQUNILHVFQVdTO1FBRVQsNEJBQUssZ0NBQUE7UUFNRCwyR0FBWSxzQkFBa0IsSUFBQztRQUNqQyxpQkFBbUIsRUFBQSxFQUFBO1FBSXZCLGdDQUEwQjtRQUN4Qix3RkFrQmlCO1FBQ25CLGlCQUFNO1FBRU4sbUNBS0M7UUFEQywyRkFBUyx3QkFBb0IsSUFBQztRQUU5QixnQ0FPVzs7UUFDYixpQkFBUztRQUVULHVFQWNTO1FBQ1gsaUJBQU07O1FBbEo4QyxlQUE0QjtRQUE1Qiw4Q0FBNEI7UUFDdkQsZUFBNEI7UUFBNUIsOENBQTRCO1FBQzdDLGVBQ0Y7UUFERSxnR0FDRjtRQUVtQixlQUFpQztRQUFqQyxtREFBaUM7UUFDbEQsZUFDRjtRQURFLHFHQUNGO1FBRW1CLGVBQThCO1FBQTlCLGdEQUE4QjtRQUMvQyxlQUNGO1FBREUsbUdBQ0Y7UUFFbUIsZUFBNkI7UUFBN0IsK0NBQTZCO1FBQzlDLGVBQ0Y7UUFERSxrR0FDRjtRQU1BLGVBQWtDO1FBQWxDLG9EQUFrQyxvQ0FBQSwyQkFBQTtRQUlsQyxlQUNGO1FBREUsNEZBQ0Y7UUFHRSxlQUEwQjtRQUExQiw0Q0FBMEIsMkJBQUE7UUFJMUIsZUFDRjtRQURFLHlGQUNGO1FBT2EsZUFBMEM7UUFBMUMsd0VBQTBDO1FBQzZCLGVBQTZCO1FBQTdCLCtDQUE2QjtRQUMvRSxlQUFZO1FBQVosdUNBQVk7UUFJeEMsZUFDRjtRQURFLDRGQUNGO1FBSUQsZUFBd0I7UUFBeEIsNkNBQXdCO1FBa0J4QixlQUF1QztRQUF2Qyw0REFBdUM7UUFnQnRDLGVBQXFCO1FBQXJCLHVDQUFxQiwrQkFBQTtRQVFSLGVBQXVCO1FBQXZCLDRDQUF1QjtRQWdDdEMsZUFBbUQ7UUFBbkQsNkVBQW1EO1FBTXBELGVBQW9DO1FBQXBDLHlEQUFvQzt5OENEL0QzQjtZQUNWLE9BQU8sQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLEtBQUssQ0FDSCxNQUFNLEVBQ04sS0FBSyxDQUFDO29CQUNKLE9BQU8sRUFBRSxDQUFDO2lCQUNYLENBQUMsQ0FDSDtnQkFDRCxLQUFLLENBQ0gsUUFBUSxFQUNSLEtBQUssQ0FBQztvQkFDSixPQUFPLEVBQUUsQ0FBQztpQkFDWCxDQUFDLENBQ0g7Z0JBQ0QsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2FBQ3RELENBQUM7U0FDSDt1RkFLVSxhQUFhO2NBeEJ6QixTQUFTOzJCQUNFLFVBQVUsY0FDUjtvQkFDVixPQUFPLENBQUMsV0FBVyxFQUFFO3dCQUNuQixLQUFLLENBQ0gsTUFBTSxFQUNOLEtBQUssQ0FBQzs0QkFDSixPQUFPLEVBQUUsQ0FBQzt5QkFDWCxDQUFDLENBQ0g7d0JBQ0QsS0FBSyxDQUNILFFBQVEsRUFDUixLQUFLLENBQUM7NEJBQ0osT0FBTyxFQUFFLENBQUM7eUJBQ1gsQ0FBQyxDQUNIO3dCQUNELFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNyRCxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztxQkFDdEQsQ0FBQztpQkFDSCxtQkFHZ0IsdUJBQXVCLENBQUMsTUFBTTt3TEEyQnRDLEdBQUc7a0JBQVgsS0FBSztZQUdGLE1BQU07a0JBRFQsS0FBSztZQVVGLFlBQVk7a0JBRGYsS0FBSztZQVVGLGtCQUFrQjtrQkFEckIsS0FBSztZQVNJLGlCQUFpQjtrQkFBMUIsTUFBTTtZQUNHLGlCQUFpQjtrQkFBMUIsTUFBTTtZQUNHLGFBQWE7a0JBQXRCLE1BQU07WUFFRyxTQUFTO2tCQUFsQixNQUFNO1lBQ0csV0FBVztrQkFBcEIsTUFBTTtZQUNHLFdBQVc7a0JBQXBCLE1BQU07WUFFRyxRQUFRO2tCQUFqQixNQUFNO1lBQ0csU0FBUztrQkFBbEIsTUFBTTtZQTJCcUIsTUFBTTtrQkFBakMsU0FBUzttQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT25Jbml0LFxyXG4gIE9uRGVzdHJveSxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuaW1wb3J0IHtcclxuICBGRUFUVVJFLFxyXG4gIEZlYXR1cmVTdG9yZSxcclxuICBGZWF0dXJlU3RvcmVTZWxlY3Rpb25TdHJhdGVneSxcclxuICB0cnlCaW5kU3RvcmVMYXllcixcclxuICB0cnlBZGRMb2FkaW5nU3RyYXRlZ3ksXHJcbiAgdHJ5QWRkU2VsZWN0aW9uU3RyYXRlZ3ksXHJcbiAgRmVhdHVyZU1vdGlvbixcclxuICBGZWF0dXJlU3RvcmVMb2FkaW5nU3RyYXRlZ3ksXHJcbiAgZmVhdHVyZVRvT2xcclxufSBmcm9tICcuLi8uLi9mZWF0dXJlJztcclxuXHJcbmltcG9ydCB7IExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBGb250VHlwZSwgR2VvbWV0cnlUeXBlIH0gZnJvbSAnLi4vc2hhcmVkL2RyYXcuZW51bSc7XHJcbmltcG9ydCB7IElnb01hcCB9IGZyb20gJy4uLy4uL21hcC9zaGFyZWQvbWFwJztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgRHJhdywgRmVhdHVyZVdpdGhEcmF3IH0gZnJvbSAnLi4vc2hhcmVkL2RyYXcuaW50ZXJmYWNlJztcclxuaW1wb3J0IHsgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1CdWlsZGVyIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWZWN0b3JTb3VyY2VFdmVudCBhcyBPbFZlY3RvclNvdXJjZUV2ZW50IH0gZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCB7IFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy92ZWN0b3ItbGF5ZXInO1xyXG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2ZlYXR1cmUtZGF0YXNvdXJjZSc7XHJcbmltcG9ydCB7IERyYXdDb250cm9sIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvc2hhcmVkL2NvbnRyb2xzL2RyYXcnO1xyXG5pbXBvcnQge1xyXG4gIEVudGl0eVJlY29yZCxcclxuICBFbnRpdHlUYWJsZVRlbXBsYXRlXHJcbn0gZnJvbSAnQGlnbzIvY29tbW9uJztcclxuXHJcbmltcG9ydCAqIGFzIE9sU3R5bGUgZnJvbSAnb2wvc3R5bGUnO1xyXG5pbXBvcnQgT2xWZWN0b3JTb3VyY2UgZnJvbSAnb2wvc291cmNlL1ZlY3Rvcic7XHJcbmltcG9ydCBPbENpcmNsZSBmcm9tICdvbC9nZW9tL0NpcmNsZSc7XHJcbmltcG9ydCBPbFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xyXG5pbXBvcnQgT2xGZWF0dXJlIGZyb20gJ29sL0ZlYXR1cmUnO1xyXG5pbXBvcnQgT2xHZW9KU09OIGZyb20gJ29sL2Zvcm1hdC9HZW9KU09OJztcclxuaW1wb3J0IE9sT3ZlcmxheSBmcm9tICdvbC9PdmVybGF5JztcclxuaW1wb3J0IHR5cGUgeyBUeXBlIH0gZnJvbSAnb2wvZ2VvbS9HZW9tZXRyeSc7XHJcbmltcG9ydCB7IGRlZmF1bHQgYXMgT2xHZW9tZXRyeSB9IGZyb20gJ29sL2dlb20vR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBnZXREaXN0YW5jZSB9IGZyb20gJ29sL3NwaGVyZSc7XHJcbmltcG9ydCB7IERyYXdTdHlsZVNlcnZpY2UgfSBmcm9tICcuLi9zaGFyZWQvZHJhdy1zdHlsZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgZmlyc3QsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERyYXdQb3B1cENvbXBvbmVudCB9IGZyb20gJy4vZHJhdy1wb3B1cC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBEcmF3U2hvcmN1dHNDb21wb25lbnQgfSBmcm9tICcuL2RyYXctc2hvcmN1dHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgZ2V0VG9vbHRpcHNPZk9sR2VvbWV0cnkgfSBmcm9tICcuLi8uLi9tZWFzdXJlL3NoYXJlZC9tZWFzdXJlLnV0aWxzJztcclxuaW1wb3J0IHsgY3JlYXRlSW50ZXJhY3Rpb25TdHlsZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LnV0aWxzJztcclxuaW1wb3J0IHsgdHJhbnNmb3JtIH0gZnJvbSAnb2wvcHJvaic7XHJcbmltcG9ydCB7IERyYXdJY29uU2VydmljZSB9IGZyb20gJy4uL3NoYXJlZC9kcmF3LWljb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFN0eWxlTW9kYWxDb21wb25lbnQsIFN0eWxlTW9kYWxEYXRhIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc3R5bGUtbW9kYWwvc3R5bGUtbW9kYWwuY29tcG9uZW50JztcclxuXHJcbmltcG9ydCB7XHJcbiAgdHJpZ2dlcixcclxuICBzdGF0ZSxcclxuICBzdHlsZSxcclxuICBhbmltYXRlLFxyXG4gIHRyYW5zaXRpb25cclxufSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IFBvaW50IGZyb20gJ29sL2dlb20vUG9pbnQnO1xyXG5cclxuaW1wb3J0IHsgRHJhd0xheWVyUG9wdXBDb21wb25lbnQgfSBmcm9tICcuL2RyYXctbGF5ZXItcG9wdXAuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWdvLWRyYXcnLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIHRyaWdnZXIoJ29wZW5DbG9zZScsIFtcclxuICAgICAgc3RhdGUoXHJcbiAgICAgICAgJ29wZW4nLFxyXG4gICAgICAgIHN0eWxlKHtcclxuICAgICAgICAgIG9wYWNpdHk6IDFcclxuICAgICAgICB9KVxyXG4gICAgICApLFxyXG4gICAgICBzdGF0ZShcclxuICAgICAgICAnY2xvc2VkJyxcclxuICAgICAgICBzdHlsZSh7XHJcbiAgICAgICAgICBvcGFjaXR5OiAwXHJcbiAgICAgICAgfSlcclxuICAgICAgKSxcclxuICAgICAgdHJhbnNpdGlvbignb3BlbiA9PiBjbG9zZWQnLCBbYW5pbWF0ZSgnNjAwbXMgZWFzZScpXSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2Nsb3NlZCA9PiBvcGVuJywgW2FuaW1hdGUoJzgwMG1zIGVhc2UnKV0pXHJcbiAgICBdKVxyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RyYXcuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2RyYXcuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRHJhd0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKipcclxuICAgKiBUYWJsZSB0ZW1wbGF0ZVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHB1YmxpYyB0YWJsZVRlbXBsYXRlOiBFbnRpdHlUYWJsZVRlbXBsYXRlID0ge1xyXG4gICAgc2VsZWN0aW9uOiB0cnVlLFxyXG4gICAgc2VsZWN0TWFueTogdHJ1ZSxcclxuICAgIHNlbGVjdGlvbkNoZWNrYm94OiB0cnVlLFxyXG4gICAgc29ydDogdHJ1ZSxcclxuICAgIGZpeGVkSGVhZGVyOiB0cnVlLFxyXG4gICAgdGFibGVIZWlnaHQ6ICdhdXRvJyxcclxuICAgIGNvbHVtbnM6IFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdEcmF3aW5nJyxcclxuICAgICAgICB0aXRsZTogdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZHJhdy5sYWJlbHMnKSxcclxuICAgICAgICB0b29sdGlwOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kcmF3LmNoYW5nZUxhYmVsJyksXHJcbiAgICAgICAgdmFsdWVBY2Nlc3NvcjogKGZlYXR1cmU6IEZlYXR1cmVXaXRoRHJhdykgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIGZlYXR1cmUucHJvcGVydGllcy5kcmF3O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgXVxyXG4gIH07XHJcblxyXG4gIHB1YmxpYyBnZW9tZXRyeVR5cGUgPSBHZW9tZXRyeVR5cGU7IC8vIFJlZmVyZW5jZSB0byB0aGUgR2VvbWV0cnlUeXBlIGVudW1cclxuICBASW5wdXQoKSBtYXA6IElnb01hcDsgLy8gTWFwIHRvIGRyYXcgb25cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgc3RvcmVzKCk6IEZlYXR1cmVTdG9yZTxGZWF0dXJlV2l0aERyYXc+W10ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0b3JlcztcclxuICB9XHJcbiAgc2V0IHN0b3Jlcyh2YWx1ZTogRmVhdHVyZVN0b3JlPEZlYXR1cmVXaXRoRHJhdz5bXSkge1xyXG4gICAgdGhpcy5fc3RvcmVzID0gdmFsdWU7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3N0b3JlczpGZWF0dXJlU3RvcmU8RmVhdHVyZVdpdGhEcmF3PltdID0gW107XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IGRyYXdDb250cm9scygpOiBbc3RyaW5nLCBEcmF3Q29udHJvbF1bXXtcclxuICAgIHJldHVybiB0aGlzLl9kcmF3Q29udHJvbHM7XHJcbiAgfVxyXG4gIHNldCBkcmF3Q29udHJvbHModmFsdWU6IFtzdHJpbmcsIERyYXdDb250cm9sXVtdKXtcclxuICAgIHRoaXMuX2RyYXdDb250cm9scyA9IHZhbHVlO1xyXG4gIH1cclxuICBwcml2YXRlIF9kcmF3Q29udHJvbHMgPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgYWN0aXZlRHJhd2luZ0xheWVyKCk6IFZlY3RvckxheWVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hY3RpdmVEcmF3aW5nTGF5ZXI7XHJcbiAgfVxyXG4gIHNldCBhY3RpdmVEcmF3aW5nTGF5ZXIodmFsdWU6IFZlY3RvckxheWVyKSB7XHJcbiAgICB0aGlzLl9hY3RpdmVEcmF3aW5nTGF5ZXIgPSB2YWx1ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYWN0aXZlRHJhd2luZ0xheWVyOiBWZWN0b3JMYXllcjtcclxuXHJcbiAgQE91dHB1dCgpIGFjdGl2ZUxheWVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxWZWN0b3JMYXllcj4oKTtcclxuICBAT3V0cHV0KCkgZHJhd0NvbnRyb2xzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFtzdHJpbmcsIERyYXdDb250cm9sXVtdPigpO1xyXG4gIEBPdXRwdXQoKSBsYXllcnNJREV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBmaWxsQ29sb3I6IHN0cmluZztcclxuICBAT3V0cHV0KCkgc3Ryb2tlQ29sb3I6IHN0cmluZztcclxuICBAT3V0cHV0KCkgc3Ryb2tlV2lkdGg6IG51bWJlcjtcclxuXHJcbiAgQE91dHB1dCgpIGZvbnRTaXplOiBzdHJpbmc7XHJcbiAgQE91dHB1dCgpIGZvbnRTdHlsZTogc3RyaW5nO1xyXG5cclxuICBwdWJsaWMgYWN0aXZlU3RvcmU6IEZlYXR1cmVTdG9yZTxGZWF0dXJlV2l0aERyYXc+O1xyXG4gIHByaXZhdGUgbGF5ZXJDb3VudGVySUQ6IG51bWJlciA9IDA7XHJcbiAgcHVibGljIGRyYXckOiBCZWhhdmlvclN1YmplY3Q8RHJhdz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHt9KTsgLy8gT2JzZXJ2YWJsZSBvZiBkcmF3XHJcbiAgcHJpdmF0ZSBhY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UgPSBuZXcgT2xWZWN0b3JTb3VyY2UoKTtcclxuICBwcml2YXRlIGFjdGl2ZURyYXdDb250cm9sOiBEcmF3Q29udHJvbDtcclxuICBwcml2YXRlIGRyYXdFbmQkJDogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgZHJhd1NlbGVjdCQkOiBTdWJzY3JpcHRpb247XHJcbiAgcHVibGljIHNlbGVjdGVkRmVhdHVyZXMkOiBCZWhhdmlvclN1YmplY3Q8RmVhdHVyZVdpdGhEcmF3W10+ID1cclxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QoW10pO1xyXG4gIHB1YmxpYyBmaWxsRm9ybTogc3RyaW5nO1xyXG4gIHB1YmxpYyBzdHJva2VGb3JtOiBzdHJpbmc7XHJcbiAgcHVibGljIGRyYXdDb250cm9sSXNEaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XHJcbiAgcHVibGljIGRyYXdDb250cm9sSXNBY3RpdmU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgbGFiZWxzQXJlU2hvd246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zJCQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHB1YmxpYyBwb3NpdGlvbjogc3RyaW5nID0gJ2JvdHRvbSc7XHJcbiAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIGljb25zOiBBcnJheTxzdHJpbmc+O1xyXG4gIHB1YmxpYyBpY29uOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgbnVtYmVyT2ZEcmF3aW5nczogbnVtYmVyO1xyXG4gIHB1YmxpYyBpc0NyZWF0aW5nTmV3TGF5ZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGN1cnJHZW9tZXRyeVR5cGUgPSB0aGlzLmdlb21ldHJ5VHlwZS5Qb2ludCBhcyBhbnk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkTGF5ZXInKSBzZWxlY3Q7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgZHJhd1N0eWxlU2VydmljZTogRHJhd1N0eWxlU2VydmljZSxcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIGRyYXdJY29uU2VydmljZTogRHJhd0ljb25TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmJ1aWxkRm9ybSgpO1xyXG4gICAgdGhpcy5maWxsQ29sb3IgPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0RmlsbENvbG9yKCk7XHJcbiAgICB0aGlzLnN0cm9rZUNvbG9yID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldFN0cm9rZUNvbG9yKCk7XHJcbiAgICB0aGlzLnN0cm9rZVdpZHRoID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldFN0cm9rZVdpZHRoKCk7XHJcbiAgICB0aGlzLmxhYmVsc0FyZVNob3duID0gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmdldExhYmVsc0FyZVNob3duKCk7XHJcbiAgICB0aGlzLmljb25zID0gdGhpcy5kcmF3SWNvblNlcnZpY2UuZ2V0SWNvbnMoKTtcclxuICAgIHRoaXMuaWNvbiA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRJY29uKCk7XHJcblxyXG4gICAgdGhpcy5mb250U2l6ZSA9IHRoaXMuZHJhd1N0eWxlU2VydmljZS5nZXRGb250U2l6ZSgpO1xyXG4gICAgdGhpcy5mb250U3R5bGUgPSB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0Rm9udFN0eWxlKCk7XHJcbiAgfVxyXG5cclxuICAvLyBJbml0aWFsaXplIHRoZSBzdG9yZSB0aGF0IHdpbGwgY29udGFpbiB0aGUgZW50aXRpZXMgYW5kIGNyZWF0ZSB0aGUgRHJhdyBjb250cm9sXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMuc3RvcmVzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmFjdGl2ZVN0b3JlID0gbmV3IEZlYXR1cmVTdG9yZTxGZWF0dXJlV2l0aERyYXc+KFtdLCB7XHJcbiAgICAgICAgbWFwOiB0aGlzLm1hcFxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5pbml0U3RvcmUoKTtcclxuICAgICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbCA9IHRoaXMuY3JlYXRlRHJhd0NvbnRyb2woXHJcbiAgICAgICAgdGhpcy5maWxsQ29sb3IsXHJcbiAgICAgICAgdGhpcy5zdHJva2VDb2xvcixcclxuICAgICAgICB0aGlzLnN0cm9rZVdpZHRoXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2V0R2VvbWV0cnlUeXBlKHRoaXMuZ2VvbWV0cnlUeXBlLlBvaW50IGFzIGFueSk7XHJcbiAgICAgIHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKTtcclxuICAgICAgdGhpcy5zdG9yZXMucHVzaCh0aGlzLmFjdGl2ZVN0b3JlKTtcclxuICAgICAgdGhpcy5kcmF3Q29udHJvbHMucHVzaChbdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIuaWQsIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2xdKTtcclxuICAgICAgdGhpcy5kcmF3Q29udHJvbHNFdmVudC5lbWl0KHRoaXMuZHJhd0NvbnRyb2xzKTtcclxuICAgICAgdGhpcy5sYXllcnNJREV2ZW50LmVtaXQodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIuaWQpO1xyXG4gICAgICB0aGlzLm9uTGF5ZXJDaGFuZ2UodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVTdG9yZSA9IHRoaXMuc3RvcmVzLmZpbmQoc3RvcmUgPT4gc3RvcmUubGF5ZXIuaWQgPT09IHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkKTtcclxuICAgICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbCA9IHRoaXMuZHJhd0NvbnRyb2xzLmZpbmQoZGMgPT4gZGNbMF0gPT09IHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkKVsxXTtcclxuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuICAgICAgdGhpcy5hbGxMYXllcnMuZm9yRWFjaChsYXllciA9PiB7XHJcbiAgICAgICAgaWYgKGxheWVyLmlkICE9PSB0aGlzLmFjdGl2ZURyYXdpbmdMYXllci5pZCkge1xyXG4gICAgICAgICAgbGF5ZXIub3BhY2l0eSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzdG9yZSA9IHRoaXMuc3RvcmVzLmZpbmQocyA9PiBzLmxheWVyLmlkID09PSBsYXllci5pZCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXHJcbiAgICAgICAgICBzdG9yZS5zdGF0ZVZpZXdcclxuICAgICAgICAgICAgLm1hbnlCeSQoKHJlY29yZDogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz4pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICBmaXJzdCgpXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgocmVjb3JkczogRW50aXR5UmVjb3JkPEZlYXR1cmVXaXRoRHJhdz5bXSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJlY29yZHMuZm9yRWFjaCgocmVjb3JkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmQuc3RhdGUuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKFxyXG4gICAgICAgICAgc3RvcmUuc3RhdGVWaWV3XHJcbiAgICAgICAgICAgIC5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aERyYXc+KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5zZWxlY3RlZCA9PT0gdHJ1ZTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgc2tpcCgxKSAvLyBTa2lwIGluaXRpYWwgZW1pc3Npb25cclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PltdKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC5uZXh0KHJlY29yZHMubWFwKChyZWNvcmQpID0+IHJlY29yZC5lbnRpdHkpKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKFxyXG4gICAgICAgICAgc3RvcmUuY291bnQkLnN1YnNjcmliZSgoY250KSA9PiB7XHJcbiAgICAgICAgICAgIGNudCA+PSAxXHJcbiAgICAgICAgICAgICAgPyAodGhpcy5hY3RpdmVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IHRydWUpXHJcbiAgICAgICAgICAgICAgOiAodGhpcy5hY3RpdmVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMub25MYXllckNoYW5nZSh0aGlzLmFjdGl2ZURyYXdpbmdMYXllcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgdGhlIGRyYXdpbmcgbGF5ZXIgYW5kIHRoZSBpbnRlcmFjdGlvbnNcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuYWxsTGF5ZXJzLmZvckVhY2gobGF5ZXIgPT4gbGF5ZXIub3BhY2l0eSA9IDEpO1xyXG4gICAgdGhpcy5hY3RpdmVTdG9yZS5zdGF0ZS51cGRhdGVBbGwoe3NlbGVjdGVkOiBmYWxzZX0pO1xyXG4gICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLm1hcCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZSBhIERyYXcgQ29udHJvbFxyXG4gICAqIEBwYXJhbSBmaWxsQ29sb3IgdGhlIGZpbGwgY29sb3JcclxuICAgKiBAcGFyYW0gc3Ryb2tlQ29sb3IgdGhlIHN0cm9rZSBjb2xvclxyXG4gICAqIEBwYXJhbSBzdHJva2VXaWR0aCB0aGUgc3Ryb2tlIHdpZHRoXHJcbiAgICogQHJldHVybnMgYSBEcmF3IENvbnRyb2xcclxuICAgKi9cclxuICBjcmVhdGVEcmF3Q29udHJvbChcclxuICAgIGZpbGxDb2xvcj86IHN0cmluZyxcclxuICAgIHN0cm9rZUNvbG9yPzogc3RyaW5nLFxyXG4gICAgc3Ryb2tlV2lkdGg/OiBudW1iZXJcclxuICApIHtcclxuICAgIGNvbnN0IGFjdGl2ZURyYXdDb250cm9sID0gbmV3IERyYXdDb250cm9sKHtcclxuICAgICAgZ2VvbWV0cnlUeXBlOiB1bmRlZmluZWQsXHJcbiAgICAgIGRyYXdpbmdMYXllclNvdXJjZTogdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UsXHJcbiAgICAgIGRyYXdpbmdMYXllclN0eWxlOiBuZXcgT2xTdHlsZS5TdHlsZSh7fSksXHJcbiAgICAgIGludGVyYWN0aW9uU3R5bGU6IGNyZWF0ZUludGVyYWN0aW9uU3R5bGUoXHJcbiAgICAgICAgZmlsbENvbG9yLFxyXG4gICAgICAgIHN0cm9rZUNvbG9yLFxyXG4gICAgICAgIHN0cm9rZVdpZHRoXHJcbiAgICAgIClcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGFjdGl2ZURyYXdDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RvcmUgaW5pdGlhbGl6YXRpb24sIGluY2x1ZGluZyBkcmF3aW5nIGxheWVyIGNyZWF0aW9uXHJcbiAgICovXHJcblxyXG4gIHByaXZhdGUgaW5pdFN0b3JlKG5ld1RpdGxlPzogc3RyaW5nLCBpc05ld0xheWVyPzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5jcmVhdGVMYXllcihuZXdUaXRsZSwgaXNOZXdMYXllcik7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMkJC5wdXNoKFxyXG4gICAgICB0aGlzLmFjdGl2ZVN0b3JlLnN0YXRlVmlld1xyXG4gICAgICAgIC5tYW55QnkkKChyZWNvcmQ6IEVudGl0eVJlY29yZDxGZWF0dXJlV2l0aERyYXc+KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBza2lwKDEpIC8vIFNraXAgaW5pdGlhbCBlbWlzc2lvblxyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8RmVhdHVyZVdpdGhEcmF3PltdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLm5leHQocmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gcmVjb3JkLmVudGl0eSkpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyQkLnB1c2goXHJcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUuY291bnQkLnN1YnNjcmliZSgoY250KSA9PiB7XHJcbiAgICAgICAgY250ID49IDFcclxuICAgICAgICAgID8gKHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub3B0aW9ucy5zaG93SW5MYXllckxpc3QgPSB0cnVlKVxyXG4gICAgICAgICAgOiAodGhpcy5hY3RpdmVTdG9yZS5sYXllci5vcHRpb25zLnNob3dJbkxheWVyTGlzdCA9IGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuLyoqXHJcbiAqIE9wZW4gdGhlIHN0eWxlIG1vZGFsIGRpYWxvZyBib3hcclxuICovXHJcbiAgb3BlblN0eWxlTW9kYWxEaWFsb2coKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgLy8gb3BlbiB0aGUgZGlhbG9nIGJveCB1c2VkIHRvIHN0eWxlIGZlYXR1cmVzXHJcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oU3R5bGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgIGRpc2FibGVDbG9zZTogZmFsc2UsXHJcbiAgICAgICAgZGF0YToge1xyXG4gICAgICAgICAgZmVhdHVyZXM6IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgIGljb25zOiB0aGlzLmljb25zLFxyXG4gICAgICAgICAgaWNvbjogdGhpcy5pY29uXHJcbiAgICAgICAgfSxcclxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gd2hlbiBkaWFsb2cgYm94IGlzIGNsb3NlZCwgZ2V0IGxhYmVsIGFuZCBzZXQgaXQgdG8gZ2VvbWV0cnlcclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChkYXRhOiBTdHlsZU1vZGFsRGF0YSkgPT4ge1xyXG4gICAgICAgIC8vIGNoZWNrcyBpZiB0aGUgdXNlciBjbGlja2VkIG9rXHJcbiAgICAgICAgaWYgKGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtRmxhZykge1xyXG4gICAgICAgICAgdGhpcy5vbkZvbnRDaGFuZ2UodGhpcy5sYWJlbHNBcmVTaG93biwgZGF0YS5mb250U2l6ZSwgZGF0YS5mb250U3R5bGUpO1xyXG4gICAgICAgICAgdGhpcy5vbkNvbG9yQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIHRoaXMuaWNvbiA/IHRydWUgOiBmYWxzZSwgZGF0YS5maWxsQ29sb3IsIGRhdGEuc3Ryb2tlQ29sb3IpO1xyXG4gICAgICAgICAgdGhpcy5vbk9mZnNldExhYmVsQ2hhbmdlKHRoaXMubGFiZWxzQXJlU2hvd24sIGRhdGEub2Zmc2V0WCwgZGF0YS5vZmZzZXRZKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wZW4gYSBkaWFsb2cgYm94IHRvIGVudGVyIGxhYmVsIGFuZCBkbyBzb21ldGhpbmdcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBnZW9tZXRyeSBhdCBkcmF3IGVuZCBvciBzZWxlY3RlZCBnZW9tZXRyeVxyXG4gICAqIEBwYXJhbSBkcmF3RW5kIGV2ZW50IGZpcmVkIGF0IGRyYXdFbmQ/XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvcGVuRHJhd0RpYWxvZyhvbEdlb21ldHJ5LCBpc0RyYXdFbmQ6IGJvb2xlYW4pIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAvLyBvcGVuIHRoZSBkaWFsb2cgYm94IHVzZWQgdG8gZW50ZXIgbGFiZWxcclxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihEcmF3UG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICAgIGRhdGE6IHsgY3VycmVudExhYmVsOiBvbEdlb21ldHJ5LmdldCgnZHJhdycpIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyB3aGVuIGRpYWxvZyBib3ggaXMgY2xvc2VkLCBnZXQgbGFiZWwgYW5kIHNldCBpdCB0byBnZW9tZXRyeVxyXG4gICAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKGxhYmVsOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAvLyBjaGVja3MgaWYgdGhlIHVzZXIgY2xpY2tlZCBva1xyXG4gICAgICAgIGlmIChkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UuY29uZmlybUZsYWcpIHtcclxuICAgICAgICAgIHRoaXMudXBkYXRlTGFiZWxPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgbGFiZWwpO1xyXG4gICAgICAgICAgaWYgKCFvbEdlb21ldHJ5LnZhbHVlc18uZm9udFN0eWxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEdlb21ldHJ5LCAnMjAnLCBGb250VHlwZS5BcmlhbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIW9sR2VvbWV0cnkudmFsdWVzXy5kcmF3aW5nU3R5bGUpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVGaWxsQW5kU3Ryb2tlQ29sb3IoXHJcbiAgICAgICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgICAgICAncmdiYSgyNTUsMjU1LDI1NSwwLjQpJyxcclxuICAgICAgICAgICAgICAncmdiYSgxNDMsNyw3LDEpJ1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCEob2xHZW9tZXRyeS52YWx1ZXNfLm9mZnNldFggfHwgb2xHZW9tZXRyeS52YWx1ZXNfLm9mZnNldFkpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlT2Zmc2V0KFxyXG4gICAgICAgICAgICAgIG9sR2VvbWV0cnksXHJcbiAgICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgICBvbEdlb21ldHJ5IGluc3RhbmNlb2YgUG9pbnQgPyAtMTUgOiAwXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy8gaWYgZXZlbnQgd2FzIGZpcmVkIGF0IGRyYXcgZW5kXHJcbiAgICAgICAgICBpZiAoaXNEcmF3RW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMub25EcmF3RW5kKG9sR2VvbWV0cnkpO1xyXG4gICAgICAgICAgICAvLyBpZiBldmVudCB3YXMgZmlyZWQgYXQgc2VsZWN0XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0RHJhdyhvbEdlb21ldHJ5LCBsYWJlbCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZUhlaWdodFRhYmxlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZXMgdGhlIGZlYXR1cmVcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyU291cmNlXHJcbiAgICAgICAgICAgIC5nZXRGZWF0dXJlcygpXHJcbiAgICAgICAgICAgIC5mb3JFYWNoKChkcmF3aW5nTGF5ZXJGZWF0dXJlKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBkcmF3aW5nTGF5ZXJGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgYW55O1xyXG4gICAgICAgICAgICAgIGlmIChvbEdlb21ldHJ5ID09PSBnZW9tZXRyeSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UucmVtb3ZlRmVhdHVyZShcclxuICAgICAgICAgICAgICAgICAgZHJhd2luZ0xheWVyRmVhdHVyZVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9LCAyNTApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGRyYXcgc291cmNlIGFuZCB0cmFjayB0aGUgZ2VvbWV0cnkgYmVpbmcgZHJhd1xyXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IE9sIGxpbmVzdHJpbmcgb3IgcG9seWdvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25EcmF3RW5kKG9sR2VvbWV0cnk6IE9sR2VvbWV0cnksIHJhZGl1cz86IG51bWJlcikge1xyXG4gICAgdGhpcy5hZGRGZWF0dXJlVG9TdG9yZShvbEdlb21ldHJ5LCByYWRpdXMpO1xyXG4gICAgdGhpcy5jbGVhckxhYmVsc09mT2xHZW9tZXRyeShvbEdlb21ldHJ5KTtcclxuICAgIHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub2wuZ2V0U291cmNlKCkucmVmcmVzaCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vZGlmeURyYXcob2xHZW9tZXRyeSkge1xyXG4gICAgY29uc3QgZW50aXRpZXMgPSB0aGlzLmFjdGl2ZVN0b3JlLmFsbCgpO1xyXG5cclxuICAgIGVudGl0aWVzLmZvckVhY2goKGVudGl0eSkgPT4ge1xyXG4gICAgICBjb25zdCBlbnRpdHlJZCA9IGVudGl0eS5wcm9wZXJ0aWVzLmlkO1xyXG5cclxuICAgICAgY29uc3Qgb2xHZW9tZXRyeUlkID0gb2xHZW9tZXRyeS5vbF91aWQ7XHJcblxyXG4gICAgICBpZiAoZW50aXR5SWQgPT09IG9sR2VvbWV0cnlJZCkge1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGFiZWxPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgZW50aXR5LnByb3BlcnRpZXMuZHJhdyk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGb250U2l6ZUFuZFN0eWxlKFxyXG4gICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5zcGxpdCgnICcpWzBdLnJlcGxhY2UoJ3B4JywgJycpLFxyXG4gICAgICAgICAgZW50aXR5LnByb3BlcnRpZXMuZm9udFN0eWxlLnN1YnN0cmluZyhcclxuICAgICAgICAgICAgZW50aXR5LnByb3BlcnRpZXMuZm9udFN0eWxlLmluZGV4T2YoJyAnKSArIDFcclxuICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKFxyXG4gICAgICAgICAgb2xHZW9tZXRyeSxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmRyYXdpbmdTdHlsZS5maWxsLFxyXG4gICAgICAgICAgZW50aXR5LnByb3BlcnRpZXMuZHJhd2luZ1N0eWxlLnN0cm9rZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVPZmZzZXQoXHJcbiAgICAgICAgICBvbEdlb21ldHJ5LFxyXG4gICAgICAgICAgZW50aXR5LnByb3BlcnRpZXMub2Zmc2V0WCxcclxuICAgICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFlcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMucmVwbGFjZUZlYXR1cmVJblN0b3JlKGVudGl0eSwgb2xHZW9tZXRyeSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblNlbGVjdERyYXcob2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4sIGxhYmVsOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGVudGl0aWVzID0gdGhpcy5hY3RpdmVTdG9yZS5hbGwoKTtcclxuXHJcbiAgICBjb25zdCBvbEdlb21ldHJ5ID0gb2xGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgYW55O1xyXG4gICAgb2xHZW9tZXRyeS5vbF91aWQgPSBvbEZlYXR1cmUuZ2V0KCdpZCcpO1xyXG5cclxuICAgIGNvbnN0IG9sR2VvbWV0cnlDb29yZGluYXRlcyA9IEpTT04uc3RyaW5naWZ5KFxyXG4gICAgICBvbEdlb21ldHJ5LmdldENvb3JkaW5hdGVzKClbMF1cclxuICAgICk7XHJcblxyXG4gICAgZW50aXRpZXMuZm9yRWFjaCgoZW50aXR5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGVudGl0eUNvb3JkaW5hdGVzID0gSlNPTi5zdHJpbmdpZnkoZW50aXR5Lmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdKTtcclxuICAgICAgaWYgKG9sR2VvbWV0cnlDb29yZGluYXRlcyA9PT0gZW50aXR5Q29vcmRpbmF0ZXMpIHtcclxuICAgICAgICBjb25zdCBmb250U2l6ZSA9IG9sRmVhdHVyZVxyXG4gICAgICAgICAgLmdldCgnZm9udFN0eWxlJylcclxuICAgICAgICAgIC5zcGxpdCgnICcpWzBdXHJcbiAgICAgICAgICAucmVwbGFjZSgncHgnLCAnJyk7XHJcbiAgICAgICAgY29uc3QgZm9udFN0eWxlID0gb2xGZWF0dXJlXHJcbiAgICAgICAgICAuZ2V0KCdmb250U3R5bGUnKVxyXG4gICAgICAgICAgLnN1YnN0cmluZyhvbEZlYXR1cmUuZ2V0KCdmb250U3R5bGUnKS5pbmRleE9mKCcgJykgKyAxKTtcclxuXHJcbiAgICAgICAgY29uc3QgZmlsbENvbG9yID0gb2xGZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuZmlsbDtcclxuICAgICAgICBjb25zdCBzdHJva2VDb2xvciA9IG9sRmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLnN0cm9rZTtcclxuXHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0WCA9IG9sRmVhdHVyZS5nZXQoJ29mZnNldFgnKTtcclxuICAgICAgICBjb25zdCBvZmZzZXRZID0gb2xGZWF0dXJlLmdldCgnb2Zmc2V0WScpO1xyXG5cclxuICAgICAgICBjb25zdCByYWQ6IG51bWJlciA9IGVudGl0eS5wcm9wZXJ0aWVzLnJhZFxyXG4gICAgICAgICAgPyBlbnRpdHkucHJvcGVydGllcy5yYWRcclxuICAgICAgICAgIDogdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMudXBkYXRlTGFiZWxPZk9sR2VvbWV0cnkob2xHZW9tZXRyeSwgbGFiZWwpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlRm9udFNpemVBbmRTdHlsZShvbEdlb21ldHJ5LCBmb250U2l6ZSwgZm9udFN0eWxlKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihvbEdlb21ldHJ5LCBmaWxsQ29sb3IsIHN0cm9rZUNvbG9yKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldChvbEdlb21ldHJ5LCBvZmZzZXRYLCBvZmZzZXRZKTtcclxuICAgICAgICB0aGlzLnJlcGxhY2VGZWF0dXJlSW5TdG9yZShlbnRpdHksIG9sR2VvbWV0cnksIHJhZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkIGEgZmVhdHVyZSB3aXRoIGRyYXcgbGFiZWwgdG8gdGhlIHN0b3JlLiBUaGUgbG9hZGluZyBzdHJhZ2VneSBvZiB0aGUgc3RvcmVcclxuICAgKiB3aWxsIHRyaWdnZXIgYW5kIGFkZCB0aGUgZmVhdHVyZSB0byB0aGUgbWFwLlxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgYWRkRmVhdHVyZVRvU3RvcmUoXHJcbiAgICBvbEdlb21ldHJ5LFxyXG4gICAgcmFkaXVzPzogbnVtYmVyLFxyXG4gICAgZmVhdHVyZT86IEZlYXR1cmVXaXRoRHJhd1xyXG4gICkge1xyXG4gICAgbGV0IHJhZDogbnVtYmVyO1xyXG4gICAgbGV0IGNlbnRlcjQzMjY6IEFycmF5PG51bWJlcj47XHJcbiAgICBsZXQgcG9pbnQ0MzI2OiBBcnJheTxudW1iZXI+O1xyXG4gICAgbGV0IGxvbjQzMjY6IG51bWJlcjtcclxuICAgIGxldCBsYXQ0MzI2OiBudW1iZXI7XHJcbiAgICBjb25zdCBmZWF0dXJlSWQgPSBmZWF0dXJlID8gZmVhdHVyZS5wcm9wZXJ0aWVzLmlkIDogb2xHZW9tZXRyeS5vbF91aWQ7XHJcbiAgICBjb25zdCBwcm9qZWN0aW9uID0gdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKTtcclxuXHJcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBPbEdlb0pTT04oKS53cml0ZUdlb21ldHJ5T2JqZWN0KG9sR2VvbWV0cnksIHtcclxuICAgICAgZmVhdHVyZVByb2plY3Rpb246IHByb2plY3Rpb24sXHJcbiAgICAgIGRhdGFQcm9qZWN0aW9uOiBwcm9qZWN0aW9uXHJcbiAgICB9KSBhcyBhbnk7XHJcblxyXG4gICAgaWYgKG9sR2VvbWV0cnkgaW5zdGFuY2VvZiBPbENpcmNsZSB8fCByYWRpdXMpIHtcclxuICAgICAgaWYgKHJhZGl1cykge1xyXG4gICAgICAgIHJhZCA9IHJhZGl1cztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBnZW9tZXRyeS50eXBlID0gJ1BvaW50JztcclxuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IG9sR2VvbWV0cnkuZ2V0Q2VudGVyKCk7XHJcbiAgICAgICAgY29uc3QgZXh0ZW50NDMyNiA9IHRyYW5zZm9ybShcclxuICAgICAgICAgIFtcclxuICAgICAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKVsyXSxcclxuICAgICAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKVszXVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHByb2plY3Rpb24sXHJcbiAgICAgICAgICAnRVBTRzo0MzI2J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgY2VudGVyNDMyNiA9IHRyYW5zZm9ybShcclxuICAgICAgICAgIFtcclxuICAgICAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKVswXSxcclxuICAgICAgICAgICAgb2xHZW9tZXRyeS5nZXRGbGF0Q29vcmRpbmF0ZXMoKVsxXVxyXG4gICAgICAgICAgXSxcclxuICAgICAgICAgIHByb2plY3Rpb24sXHJcbiAgICAgICAgICAnRVBTRzo0MzI2J1xyXG4gICAgICAgICk7XHJcbiAgICAgICAgbG9uNDMyNiA9IGNlbnRlcjQzMjZbMF07XHJcbiAgICAgICAgbGF0NDMyNiA9IGNlbnRlcjQzMjZbMV07XHJcbiAgICAgICAgcmFkID0gZ2V0RGlzdGFuY2UoY2VudGVyNDMyNiwgZXh0ZW50NDMyNik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob2xHZW9tZXRyeSBpbnN0YW5jZW9mIE9sUG9pbnQpIHtcclxuICAgICAgcG9pbnQ0MzI2ID0gdHJhbnNmb3JtKFxyXG4gICAgICAgIG9sR2VvbWV0cnkuZ2V0RmxhdENvb3JkaW5hdGVzKCksXHJcbiAgICAgICAgcHJvamVjdGlvbixcclxuICAgICAgICAnRVBTRzo0MzI2J1xyXG4gICAgICApO1xyXG4gICAgICBsb240MzI2ID0gcG9pbnQ0MzI2WzBdO1xyXG4gICAgICBsYXQ0MzI2ID0gcG9pbnQ0MzI2WzFdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aXZlU3RvcmUudXBkYXRlKHtcclxuICAgICAgdHlwZTogRkVBVFVSRSxcclxuICAgICAgZ2VvbWV0cnksXHJcbiAgICAgIHByb2plY3Rpb246IHByb2plY3Rpb24uZ2V0Q29kZSgpLFxyXG4gICAgICBwcm9wZXJ0aWVzOiB7XHJcbiAgICAgICAgaWQ6IGZlYXR1cmVJZCxcclxuICAgICAgICBkcmF3OiBvbEdlb21ldHJ5LmdldCgnX2xhYmVsJyksXHJcbiAgICAgICAgbG9uZ2l0dWRlOiBsb240MzI2ID8gbG9uNDMyNiA6IG51bGwsXHJcbiAgICAgICAgbGF0aXR1ZGU6IGxhdDQzMjYgPyBsYXQ0MzI2IDogbnVsbCxcclxuICAgICAgICByYWQ6IHJhZCA/IHJhZCA6IG51bGwsXHJcbiAgICAgICAgZm9udFN0eWxlOiBvbEdlb21ldHJ5LmdldCgnZm9udFN0eWxlXycpLFxyXG4gICAgICAgIGRyYXdpbmdTdHlsZToge1xyXG4gICAgICAgICAgZmlsbDogb2xHZW9tZXRyeS5nZXQoJ2ZpbGxDb2xvcl8nKSxcclxuICAgICAgICAgIHN0cm9rZTogb2xHZW9tZXRyeS5nZXQoJ3N0cm9rZUNvbG9yXycpXHJcbiAgICAgICAgfSxcclxuICAgICAgICBvZmZzZXRYOiBvbEdlb21ldHJ5LmdldCgnb2Zmc2V0WF8nKSxcclxuICAgICAgICBvZmZzZXRZOiBvbEdlb21ldHJ5LmdldCgnb2Zmc2V0WV8nKVxyXG4gICAgICB9LFxyXG4gICAgICBtZXRhOiB7XHJcbiAgICAgICAgaWQ6IGZlYXR1cmVJZFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnVpbGRGb3JtKCkge1xyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIGZpbGw6IFsnJ10sXHJcbiAgICAgIHN0cm9rZTogWycnXVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0dXBMYXllcihpc05ld0xheWVyPzogYm9vbGVhbikge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRHJhd0xheWVyUG9wdXBDb21wb25lbnQsIHtcclxuICAgICAgICBkaXNhYmxlQ2xvc2U6IGZhbHNlLFxyXG4gICAgICB9KTtcclxuICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChsYWJlbDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGRpYWxvZ1JlZi5jb21wb25lbnRJbnN0YW5jZS5jb25maXJtRmxhZykge1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVTdG9yZS5zdGF0ZS51cGRhdGVBbGwoe3NlbGVjdGVkOiBmYWxzZX0pO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVTdG9yZSA9IG5ldyBGZWF0dXJlU3RvcmU8RmVhdHVyZVdpdGhEcmF3PihbXSwgeyBtYXA6IHRoaXMubWFwIH0pO1xyXG4gICAgICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UgPSBuZXcgT2xWZWN0b3JTb3VyY2UoKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLm9wYWNpdHkgPSAwO1xyXG4gICAgICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuICAgICAgICAgIHRoaXMuaW5pdFN0b3JlKGxhYmVsLCBpc05ld0xheWVyKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wgPSB0aGlzLmNyZWF0ZURyYXdDb250cm9sKFxyXG4gICAgICAgICAgICB0aGlzLmZpbGxDb2xvcixcclxuICAgICAgICAgICAgdGhpcy5zdHJva2VDb2xvcixcclxuICAgICAgICAgICAgdGhpcy5zdHJva2VXaWR0aFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2V0R2VvbWV0cnlUeXBlKHRoaXMuY3Vyckdlb21ldHJ5VHlwZSk7XHJcbiAgICAgICAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XHJcbiAgICAgICAgICB0aGlzLnN0b3Jlcy5wdXNoKHRoaXMuYWN0aXZlU3RvcmUpO1xyXG4gICAgICAgICAgdGhpcy5kcmF3Q29udHJvbHMucHVzaChbdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIuaWQsIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2xdKTtcclxuICAgICAgICAgIHRoaXMuZHJhd0NvbnRyb2xzRXZlbnQuZW1pdCh0aGlzLmRyYXdDb250cm9scyk7XHJcbiAgICAgICAgICB0aGlzLmxheWVyc0lERXZlbnQuZW1pdCh0aGlzLmFjdGl2ZURyYXdpbmdMYXllci5pZCk7XHJcbiAgICAgICAgICB0aGlzLmlzQ3JlYXRpbmdOZXdMYXllciA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmxhYmVsc0FyZVNob3duKXtcclxuICAgICAgICAgICAgdGhpcy5vblRvZ2dsZUxhYmVscygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5hY3RpdmVMYXllckNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3QudmFsdWUgPSB0aGlzLmFjdGl2ZURyYXdpbmdMYXllcjtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0LnNlbGVjdGlvbkNoYW5nZS5lbWl0KHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSwgMjUwKTtcclxuICB9XHJcblxyXG4gIC8vIEhUTUwgdXNlciBpbnRlcmFjdGlvbnNcclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgZG91YmxlLWNsaWNrcyB0aGUgc2VsZWN0ZWQgZHJhd2luZ1xyXG4gICAqL1xyXG4gIGVkaXRMYWJlbERyYXdpbmcoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGgpIHtcclxuICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGZlYXR1cmVUb09sKFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF0sXHJcbiAgICAgICAgdGhpcy5tYXAub2wuZ2V0VmlldygpLmdldFByb2plY3Rpb24oKS5nZXRDb2RlKClcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5vcGVuRHJhd0RpYWxvZyhvbEdlb21ldHJ5LCBmYWxzZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuU2hvcmN1dHNEaWFsb2coKSB7XHJcbiAgICB0aGlzLmRpYWxvZy5vcGVuKERyYXdTaG9yY3V0c0NvbXBvbmVudCk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVEcmF3aW5ncygpIHtcclxuICAgIHRoaXMuYWN0aXZlU3RvcmUuZGVsZXRlTWFueSh0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUuZm9yRWFjaCgoc2VsZWN0ZWRGZWF0dXJlKSA9PiB7XHJcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyU291cmNlXHJcbiAgICAgICAgLmdldEZlYXR1cmVzKClcclxuICAgICAgICAuZm9yRWFjaCgoZHJhd2luZ0xheWVyRmVhdHVyZSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgZ2VvbWV0cnkgPSBkcmF3aW5nTGF5ZXJGZWF0dXJlLmdldEdlb21ldHJ5KCkgYXMgYW55O1xyXG4gICAgICAgICAgaWYgKHNlbGVjdGVkRmVhdHVyZS5wcm9wZXJ0aWVzLmlkID09PSBnZW9tZXRyeS5vbF91aWQpIHtcclxuICAgICAgICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UucmVtb3ZlRmVhdHVyZShkcmF3aW5nTGF5ZXJGZWF0dXJlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy51cGRhdGVIZWlnaHRUYWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgdG9nZ2xlcyB0aGUgbGFiZWxzIHRvZ2dsZVxyXG4gICAqL1xyXG4gIG9uVG9nZ2xlTGFiZWxzKCkge1xyXG4gICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnRvZ2dsZUxhYmVsc0FyZVNob3duKCk7XHJcbiAgICB0aGlzLmxhYmVsc0FyZVNob3duID0gIXRoaXMubGFiZWxzQXJlU2hvd247XHJcbiAgICB0aGlzLmljb25cclxuICAgICAgPyB0aGlzLmVsZW1lbnRTdHlsZShcclxuICAgICAgICAgIHRoaXMubGFiZWxzQXJlU2hvd24sXHJcbiAgICAgICAgICB0cnVlXHJcbiAgICAgICAgKVxyXG4gICAgICA6IHRoaXMuZWxlbWVudFN0eWxlKFxyXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcclxuICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgKTtcclxuICAgIHRoaXMuY3JlYXRlRHJhd0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIHRvZ2dsZXMgdGhlIERyYXcgY29udHJvbCBpcyB0b2dnbGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgb25Ub2dnbGVEcmF3Q29udHJvbCh0b2dnbGVJc0NoZWNrZWQ6IGJvb2xlYW4pIHtcclxuICAgIHRvZ2dsZUlzQ2hlY2tlZCA/IHRoaXMudG9nZ2xlRHJhd0NvbnRyb2woKSA6IHRoaXMuZGVhY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvLyBVc2VyIGNoYW5nZXMgcHJvcGVydGllcyBvZiBhIGRyYXdpbmcgZWxlbWVudFxyXG5cclxuICAvKipcclxuICAgKiBEaXNwbGF5IHRoZSBjdXJyZW50IGxheWVyIHdpdGggdGhlIGN1cnJlbnQgc3RvcmUgYW5kIHRoZSBjdXJyZW50IGxheWVyU291cmNlXHJcbiAgICovXHJcblxyXG4gIHB1YmxpYyBvbkxheWVyQ2hhbmdlKGN1cnJMYXllcj86IFZlY3RvckxheWVyKSB7XHJcbiAgICBpZiAoY3VyckxheWVyKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUuc3RhdGUudXBkYXRlQWxsKHtzZWxlY3RlZDogZmFsc2V9KTtcclxuICAgICAgdGhpcy5pc0NyZWF0aW5nTmV3TGF5ZXIgPSBmYWxzZTtcclxuICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIub3BhY2l0eSA9IDA7XHJcbiAgICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyID0gY3VyckxheWVyO1xyXG4gICAgICB0aGlzLmFjdGl2ZURyYXdpbmdMYXllci5vcGFjaXR5ID0gMTtcclxuICAgICAgdGhpcy5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuICAgICAgaWYgKCF0aGlzLmxhYmVsc0FyZVNob3duKXtcclxuICAgICAgICB0aGlzLm9uVG9nZ2xlTGFiZWxzKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5hY3RpdmVTdG9yZSA9IHRoaXMuc3RvcmVzLmZpbmQoc3RvcmUgPT4gc3RvcmUubGF5ZXIuaWQgPT09IHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkKTtcclxuICAgICAgdGhpcy5hY3RpdmVEcmF3Q29udHJvbCA9IHRoaXMuZHJhd0NvbnRyb2xzLmZpbmQoZGMgPT4gZGNbMF0gPT09IHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyLmlkKVsxXTtcclxuICAgICAgdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXJTb3VyY2UgPSB0aGlzLmFjdGl2ZURyYXdDb250cm9sLm9sRHJhd2luZ0xheWVyU291cmNlO1xyXG4gICAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLnNldEdlb21ldHJ5VHlwZSh0aGlzLmN1cnJHZW9tZXRyeVR5cGUpO1xyXG4gICAgICB0aGlzLnRvZ2dsZURyYXdDb250cm9sKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNldHVwTGF5ZXIodHJ1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZUxheWVyQ2hhbmdlLmVtaXQodGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZUxheWVyKG5ld1RpdGxlPywgaXNOZXdMYXllcj8pIHtcclxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5hbGxMYXllcnMpe1xyXG4gICAgICBsZXQgbnVtYmVySWQgPSBOdW1iZXIobGF5ZXIuaWQucmVwbGFjZSgnaWdvLWRyYXctbGF5ZXInLCcnKSk7XHJcbiAgICAgIHRoaXMubGF5ZXJDb3VudGVySUQgPSBNYXRoLm1heChudW1iZXJJZCx0aGlzLmxheWVyQ291bnRlcklEKTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlRHJhd2luZ0xheWVyID0gbmV3IFZlY3RvckxheWVyKHtcclxuICAgICAgaXNJZ29JbnRlcm5hbExheWVyOiB0cnVlLFxyXG4gICAgICBpZDogJ2lnby1kcmF3LWxheWVyJyArICsrdGhpcy5sYXllckNvdW50ZXJJRCxcclxuICAgICAgdGl0bGU6IGlzTmV3TGF5ZXJcclxuICAgICAgICA/IG5ld1RpdGxlXHJcbiAgICAgICAgOiB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5kcmF3LmRyYXdpbmcnKSxcclxuICAgICAgekluZGV4OiAyMDAsXHJcbiAgICAgIHNvdXJjZTogbmV3IEZlYXR1cmVEYXRhU291cmNlKCksXHJcbiAgICAgIHN0eWxlOiAoZmVhdHVyZSwgcmVzb2x1dGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuY3JlYXRlSW5kaXZpZHVhbEVsZW1lbnRTdHlsZShcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgICAgdGhpcy5sYWJlbHNBcmVTaG93bixcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdmb250U3R5bGUnKSxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdkcmF3aW5nU3R5bGUnKS5maWxsLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLnN0cm9rZSxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRYJyksXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnb2Zmc2V0WScpLFxyXG4gICAgICAgICAgdGhpcy5pY29uXHJcbiAgICAgICAgKTtcclxuICAgICAgfSxcclxuICAgICAgc2hvd0luTGF5ZXJMaXN0OiB0cnVlLFxyXG4gICAgICBleHBvcnRhYmxlOiB0cnVlLFxyXG4gICAgICBicm93c2FibGU6IGZhbHNlLFxyXG4gICAgICB3b3Jrc3BhY2U6IHtcclxuICAgICAgICBlbmFibGVkOiBmYWxzZVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0cnlCaW5kU3RvcmVMYXllcih0aGlzLmFjdGl2ZVN0b3JlLCB0aGlzLmFjdGl2ZURyYXdpbmdMYXllcik7XHJcblxyXG4gICAgdHJ5QWRkTG9hZGluZ1N0cmF0ZWd5KFxyXG4gICAgICB0aGlzLmFjdGl2ZVN0b3JlLFxyXG4gICAgICBuZXcgRmVhdHVyZVN0b3JlTG9hZGluZ1N0cmF0ZWd5KHtcclxuICAgICAgICBtb3Rpb246IEZlYXR1cmVNb3Rpb24uTm9uZVxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuXHJcbiAgICB0cnlBZGRTZWxlY3Rpb25TdHJhdGVneShcclxuICAgICAgdGhpcy5hY3RpdmVTdG9yZSxcclxuICAgICAgbmV3IEZlYXR1cmVTdG9yZVNlbGVjdGlvblN0cmF0ZWd5KHtcclxuICAgICAgICBtYXA6IHRoaXMubWFwLFxyXG4gICAgICAgIG1vdGlvbjogRmVhdHVyZU1vdGlvbi5Ob25lLFxyXG4gICAgICAgIG1hbnk6IHRydWVcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICB0aGlzLmFjdGl2ZVN0b3JlLmxheWVyLnZpc2libGUgPSB0cnVlO1xyXG4gICAgdGhpcy5hY3RpdmVTdG9yZS5zb3VyY2Uub2wub24oXHJcbiAgICAgICdyZW1vdmVmZWF0dXJlJyxcclxuICAgICAgKGV2ZW50OiBPbFZlY3RvclNvdXJjZUV2ZW50PE9sR2VvbWV0cnk+KSA9PiB7XHJcbiAgICAgICAgY29uc3Qgb2xHZW9tZXRyeSA9IGV2ZW50LmZlYXR1cmUuZ2V0R2VvbWV0cnkoKTtcclxuICAgICAgICB0aGlzLmNsZWFyTGFiZWxzT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnkpO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyB0aGUgY29sb3IgaW4gYSBjb2xvciBwaWNrZXJcclxuICAgKiBAcGFyYW0gbGFiZWxzQXJlU2hvd24gd2hldGVyIHRoZSBsYWJlbHMgYXJlIHNob3duIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBpc0FuSWNvbiB3aGV0ZXIgdGhlIGZlYXR1cmUgaXMgYW4gaWNvbiBvciBub3RcclxuICAgKiBAcGFyYW0gZmlsbENvbG9yIHdoaWNoIGlzIHRoZSBmaWxsaW5nIGNvbG9yXHJcbiAgICogQHBhcmFtIHN0cm9rZUNvbG9yIHdoaWNoIGlzIHRoZSBzdHJva2UgY29sb3JcclxuICAgKi9cclxuICBvbkNvbG9yQ2hhbmdlKFxyXG4gICAgbGFiZWxzQXJlU2hvd246IGJvb2xlYW4sXHJcbiAgICBpc0FuSWNvbjogYm9vbGVhbixcclxuICAgIGZpbGxDb2xvcjogc3RyaW5nLFxyXG4gICAgc3Ryb2tlQ29sb3I6IHN0cmluZ1xyXG4gICkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoID4gMCAmJiAhaXNBbkljb24pIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XHJcbiAgICAgICAgbGV0IG9sRmVhdHVyZSA9IGZlYXR1cmVUb09sKFxyXG4gICAgICAgICAgZmVhdHVyZSxcclxuICAgICAgICAgIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZUZpbGxBbmRTdHJva2VDb2xvcihvbEZlYXR1cmUsIGZpbGxDb2xvciwgc3Ryb2tlQ29sb3IpO1xyXG5cclxuICAgICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmFjdGl2ZVN0b3JlXHJcbiAgICAgICAgICAuYWxsKClcclxuICAgICAgICAgIC5maW5kKChlKSA9PiBlLm1ldGEuaWQgPT09IG9sRmVhdHVyZS5nZXRJZCgpKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5kcmF3aW5nU3R5bGUuZmlsbCA9IG9sRmVhdHVyZS5nZXQoJ2ZpbGxDb2xvcl8nKTtcclxuICAgICAgICBlbnRpdHkucHJvcGVydGllcy5kcmF3aW5nU3R5bGUuc3Ryb2tlID0gb2xGZWF0dXJlLmdldCgnc3Ryb2tlQ29sb3JfJyk7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVTdG9yZS51cGRhdGUoZW50aXR5KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5lbGVtZW50U3R5bGUobGFiZWxzQXJlU2hvd24sIGlzQW5JY29uKTtcclxuICAgIHRoaXMuY3JlYXRlRHJhd0NvbnRyb2woKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIGZvbnQgc2l6ZSBvci9hbmQgc3R5bGVcclxuICAgKiBAcGFyYW0gbGFiZWxzQXJlU2hvd24gd2hldGVyIHRoZSBsYWJlbHMgYXJlIHNob3duIG9yIG5vdFxyXG4gICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBmb250XHJcbiAgICogQHBhcmFtIHN0eWxlIHRoZSBzdHlsZSBvZiB0aGUgZm9udFxyXG4gICAqL1xyXG5cclxuICBvbkZvbnRDaGFuZ2UobGFiZWxzQXJlU2hvd246IGJvb2xlYW4sIHNpemU6IHN0cmluZywgc3R5bGU6IEZvbnRUeXBlKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUuZm9yRWFjaCgoZmVhdHVyZSkgPT4ge1xyXG4gICAgICAgIGxldCBvbEZlYXR1cmUgPSBmZWF0dXJlVG9PbChcclxuICAgICAgICAgIGZlYXR1cmUsXHJcbiAgICAgICAgICB0aGlzLm1hcC5vbC5nZXRWaWV3KCkuZ2V0UHJvamVjdGlvbigpLmdldENvZGUoKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVGb250U2l6ZUFuZFN0eWxlKG9sRmVhdHVyZSwgc2l6ZSwgc3R5bGUpO1xyXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuYWN0aXZlU3RvcmVcclxuICAgICAgICAgIC5hbGwoKVxyXG4gICAgICAgICAgLmZpbmQoKGUpID0+IGUubWV0YS5pZCA9PT0gb2xGZWF0dXJlLmdldElkKCkpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZSA9IG9sRmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZV8nKTtcclxuICAgICAgICB0aGlzLmFjdGl2ZVN0b3JlLnVwZGF0ZShlbnRpdHkpO1xyXG4gICAgICAgIG9sRmVhdHVyZSA9IHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub2wuZ2V0U291cmNlKCkuZ2V0RmVhdHVyZXMoKS5maW5kKGYgPT4gZi5nZXRJZCgpID09PSBlbnRpdHkubWV0YS5pZCk7XHJcbiAgICAgICAgb2xGZWF0dXJlLnNldFByb3BlcnRpZXMoeyBmb250U3R5bGU6IGVudGl0eS5wcm9wZXJ0aWVzLmZvbnRTdHlsZSB9KTtcclxuICAgICAgICBvbEZlYXR1cmUuY2hhbmdlZCgpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHRoaXMuZm9udFNpemUgPSBzaXplO1xyXG4gICAgICB0aGlzLmZvbnRTdHlsZSA9IHN0eWxlO1xyXG5cclxuICAgICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEZvbnRTaXplKHNpemUpO1xyXG4gICAgICB0aGlzLmRyYXdTdHlsZVNlcnZpY2Uuc2V0Rm9udFN0eWxlKHN0eWxlKTtcclxuXHJcbiAgICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENhbGxlZCB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgdGhlIHZhbHVlIG9mIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsIG9mZnNldFxyXG4gICAqIEBwYXJhbSBsYWJlbHNBcmVTaG93biB3aGV0ZXIgdGhlIGxhYmVscyBhcmUgc2hvd24gb3Igbm90XHJcbiAgICogQHBhcmFtIG9mZnNldFggaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGxhYmVsXHJcbiAgICogQHBhcmFtIG9mZnNldFkgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBsYWJlbFxyXG4gICAqL1xyXG5cclxuICBvbk9mZnNldExhYmVsQ2hhbmdlKFxyXG4gICAgbGFiZWxzQXJlU2hvd246IGJvb2xlYW4sXHJcbiAgICBvZmZzZXRYOiBudW1iZXIsXHJcbiAgICBvZmZzZXRZOiBudW1iZXJcclxuICApIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5mb3JFYWNoKChmZWF0dXJlKSA9PiB7XHJcbiAgICAgICAgbGV0IG9sRmVhdHVyZSA9IGZlYXR1cmVUb09sKFxyXG4gICAgICAgICAgZmVhdHVyZSxcclxuICAgICAgICAgIHRoaXMubWFwLm9sLmdldFZpZXcoKS5nZXRQcm9qZWN0aW9uKCkuZ2V0Q29kZSgpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU9mZnNldChvbEZlYXR1cmUsIG9mZnNldFgsIG9mZnNldFkpO1xyXG4gICAgICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuYWN0aXZlU3RvcmVcclxuICAgICAgICAgIC5hbGwoKVxyXG4gICAgICAgICAgLmZpbmQoKGUpID0+IGUubWV0YS5pZCA9PT0gb2xGZWF0dXJlLmdldElkKCkpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFggPSBvbEZlYXR1cmUuZ2V0KCdvZmZzZXRYXycpO1xyXG4gICAgICAgIGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFkgPSBvbEZlYXR1cmUuZ2V0KCdvZmZzZXRZXycpO1xyXG4gICAgICAgIHRoaXMuYWN0aXZlU3RvcmUudXBkYXRlKGVudGl0eSk7XHJcbiAgICAgICAgb2xGZWF0dXJlID0gdGhpcy5hY3RpdmVTdG9yZS5sYXllci5vbC5nZXRTb3VyY2UoKS5nZXRGZWF0dXJlcygpLmZpbmQoZiA9PiBmLmdldElkKCkgPT09IGVudGl0eS5tZXRhLmlkKTtcclxuICAgICAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyh7IG9mZnNldFg6IGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFgsIG9mZnNldFk6IGVudGl0eS5wcm9wZXJ0aWVzLm9mZnNldFkgfSk7XHJcbiAgICAgICAgb2xGZWF0dXJlLmNoYW5nZWQoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZWxlbWVudFN0eWxlKGxhYmVsc0FyZVNob3duKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uSWNvbkNoYW5nZShldmVudD8pIHtcclxuICAgIHRoaXMuaWNvbiA9IGV2ZW50O1xyXG4gICAgdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLnNldEljb24odGhpcy5pY29uKTtcclxuICAgIHRoaXMuZWxlbWVudFN0eWxlKHRydWUsIHRoaXMuaWNvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBzZWxlY3RzIGEgbmV3IGdlb21ldHJ5IHR5cGVcclxuICAgKiBAcGFyYW0gZ2VvbWV0cnlUeXBlIHRoZSBnZW9tZXRyeSB0eXBlIHNlbGVjdGVkIGJ5IHRoZSB1c2VyXHJcbiAgICovXHJcbiAgb25HZW9tZXRyeVR5cGVDaGFuZ2UoZ2VvbWV0cnlUeXBlOiBUeXBlKSB7XHJcbiAgICB0aGlzLmN1cnJHZW9tZXRyeVR5cGUgPSBnZW9tZXRyeVR5cGU7XHJcbiAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLnNldEdlb21ldHJ5VHlwZShnZW9tZXRyeVR5cGUpO1xyXG4gICAgdGhpcy50b2dnbGVEcmF3Q29udHJvbCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gVXBkYXRlcyB0aGUgcHJvcGVydGllcyBvZiBvbEZlYXR1cmUgaW5wdXR0ZWRcclxuXHJcbiAgLyoqXHJcbiAgICogVXBkYXRlIHRoZSBsYWJlbCBvZiBhIGdlb21ldHJ5IHdoZW4gYSBsYWJlbCBpcyBlbnRlcmVkIGluIGEgZGlhbG9nIGJveFxyXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IHRoZSBnZW9tZXRyeVxyXG4gICAqIEBwYXJhbSBsYWJlbCB0aGUgbGFiZWxcclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZUxhYmVsT2ZPbEdlb21ldHJ5KG9sR2VvbWV0cnk6IE9sR2VvbWV0cnksIGxhYmVsOiBzdHJpbmcpIHtcclxuICAgIG9sR2VvbWV0cnkuc2V0UHJvcGVydGllcyhcclxuICAgICAge1xyXG4gICAgICAgIF9sYWJlbDogbGFiZWxcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9udFNpemVBbmRTdHlsZShcclxuICAgIG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+LFxyXG4gICAgZm9udFNpemU6IHN0cmluZyxcclxuICAgIGZvbnRTdHlsZTogc3RyaW5nXHJcbiAgKSB7XHJcbiAgICBvbEZlYXR1cmUuc2V0UHJvcGVydGllcyhcclxuICAgICAge1xyXG4gICAgICAgIGZvbnRTdHlsZV86IGAke2ZvbnRTaXplfXB4ICR7Zm9udFN0eWxlfWBcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRmlsbEFuZFN0cm9rZUNvbG9yKFxyXG4gICAgb2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4sXHJcbiAgICBmaWxsQ29sb3I6IHN0cmluZyxcclxuICAgIHN0cm9rZUNvbG9yOiBzdHJpbmdcclxuICApIHtcclxuICAgIG9sRmVhdHVyZS5zZXRQcm9wZXJ0aWVzKFxyXG4gICAgICB7XHJcbiAgICAgICAgZmlsbENvbG9yXzogZmlsbENvbG9yLFxyXG4gICAgICAgIHN0cm9rZUNvbG9yXzogc3Ryb2tlQ29sb3JcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlT2Zmc2V0KFxyXG4gICAgb2xGZWF0dXJlOiBPbEZlYXR1cmU8T2xHZW9tZXRyeT4sXHJcbiAgICBvZmZzZXRYOiBudW1iZXIsXHJcbiAgICBvZmZzZXRZOiBudW1iZXJcclxuICApIHtcclxuICAgIG9sRmVhdHVyZS5zZXRQcm9wZXJ0aWVzKFxyXG4gICAgICB7XHJcbiAgICAgICAgb2Zmc2V0WF86IG9mZnNldFgsXHJcbiAgICAgICAgb2Zmc2V0WV86IG9mZnNldFlcclxuICAgICAgfSxcclxuICAgICAgdHJ1ZVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8vIFVwZGF0ZXMgdmFsdWVzIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50IG9uIHRoZSBIVE1MIHZpZXdcclxuXHJcbiAgZ2V0RmVhdHVyZUZvbnRTaXplKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwXHJcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmZvbnRTdHlsZVxyXG4gICAgICAgICAgLnNwbGl0KCcgJylbMF1cclxuICAgICAgICAgIC5yZXBsYWNlKCdweCcsICcnKVxyXG4gICAgICA6ICcyMCc7XHJcbiAgfVxyXG5cclxuICBnZXRGZWF0dXJlRm9udFN0eWxlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWUubGVuZ3RoID4gMFxyXG4gICAgICA/IHRoaXMuc2VsZWN0ZWRGZWF0dXJlcyQudmFsdWVbMF0ucHJvcGVydGllcy5mb250U3R5bGUuc3Vic3RyaW5nKFxyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLmZvbnRTdHlsZS5pbmRleE9mKCcgJykgKyAxXHJcbiAgICAgICAgKVxyXG4gICAgICA6IEZvbnRUeXBlLkFyaWFsO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmVhdHVyZUZpbGxDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDBcclxuICAgICAgPyB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlWzBdLnByb3BlcnRpZXMuZHJhd2luZ1N0eWxlLmZpbGxcclxuICAgICAgOiAncmdiYSgyNTUsMjU1LDI1NSwwLjQpJztcclxuICB9XHJcblxyXG4gIGdldEZlYXR1cmVTdHJva2VDb2xvcigpIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aCA+IDBcclxuICAgICAgPyB0aGlzLnNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlWzBdLnByb3BlcnRpZXMuZHJhd2luZ1N0eWxlLnN0cm9rZVxyXG4gICAgICA6ICdyZ2JhKDE0Myw3LDcsMSknO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmVhdHVyZU9mZnNldFgoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwXHJcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLm9mZnNldFhcclxuICAgICAgOiB0aGlzLmRyYXdTdHlsZVNlcnZpY2UuZ2V0T2Zmc2V0WCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RmVhdHVyZU9mZnNldFkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGggPiAwXHJcbiAgICAgID8gdGhpcy5zZWxlY3RlZEZlYXR1cmVzJC52YWx1ZVswXS5wcm9wZXJ0aWVzLm9mZnNldFlcclxuICAgICAgOiAnMCc7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsRm9udFN0eWxlcygpOiBzdHJpbmdbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhGb250VHlwZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgYWxsTGF5ZXJzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWFwLmxheWVycy5maWx0ZXIoKGxheWVyKSA9PlxyXG4gICAgICBsYXllci5pZC5pbmNsdWRlcygnaWdvLWRyYXctbGF5ZXInKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUhlaWdodFRhYmxlKCkge1xyXG4gICAgLy8gQ2hlY2sgdGhlIGFtb3VudCBvZiByb3dzIGFzIGEgcG9zc2libGUgYWx0ZXJuYXRpdmVcclxuXHJcbiAgICB0aGlzLm51bWJlck9mRHJhd2luZ3MgPSB0aGlzLmFjdGl2ZVN0b3JlLmNvdW50JC5nZXRWYWx1ZSgpO1xyXG4gICAgdGhpcy5udW1iZXJPZkRyYXdpbmdzID4gMTBcclxuICAgICAgPyAodGhpcy50YWJsZVRlbXBsYXRlLnRhYmxlSGVpZ2h0ID0gJzM1dmgnKVxyXG4gICAgICA6ICh0aGlzLnRhYmxlVGVtcGxhdGUudGFibGVIZWlnaHQgPSAnYXV0bycpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQWN0aXZlTGF5ZXIoKSB7XHJcbiAgICBsZXQgY3VyckxheWVyID0gdGhpcy5hbGxMYXllcnMuZmluZChsYXllciA9PiBsYXllci50aXRsZSA9PT0gdGhpcy5hY3RpdmVEcmF3aW5nTGF5ZXIudGl0bGUpO1xyXG4gICAgcmV0dXJuIGN1cnJMYXllciA/IGN1cnJMYXllciA6IHRoaXMuYWxsTGF5ZXJzWzBdO1xyXG4gIH1cclxuXHJcbiAgLy8gSGVscGVyIG1ldGhvZHNcclxuXHJcbiAgLyoqXHJcbiAgICogQWN0aXZhdGUgdGhlIGNvcnJlY3QgY29udHJvbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgdG9nZ2xlRHJhd0NvbnRyb2woKSB7XHJcbiAgICB0aGlzLmRlYWN0aXZhdGVEcmF3Q29udHJvbCgpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZURyYXdDb250cm9sKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciB0aGUgdG9vbHRpcHMgb2YgYW4gT0wgZ2VvbWV0cnlcclxuICAgKiBAcGFyYW0gb2xHZW9tZXRyeSBPTCBnZW9tZXRyeSB3aXRoIHRvb2x0aXBzXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjbGVhckxhYmVsc09mT2xHZW9tZXRyeShvbEdlb21ldHJ5KSB7XHJcbiAgICBnZXRUb29sdGlwc09mT2xHZW9tZXRyeShvbEdlb21ldHJ5KS5mb3JFYWNoKFxyXG4gICAgICAob2xUb29sdGlwOiBPbE92ZXJsYXkgfCB1bmRlZmluZWQpID0+IHtcclxuICAgICAgICBpZiAob2xUb29sdGlwICYmIG9sVG9vbHRpcC5nZXRNYXAoKSkge1xyXG4gICAgICAgICAgdGhpcy5tYXAub2wucmVtb3ZlT3ZlcmxheShvbFRvb2x0aXApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmVwbGFjZSB0aGUgZmVhdHVyZSBpbiB0aGUgc3RvcmVcclxuICAgKiBAcGFyYW0gZW50aXR5IHRoZSBlbnRpdHkgdG8gcmVwbGFjZVxyXG4gICAqIEBwYXJhbSBvbEdlb21ldHJ5IHRoZSBuZXcgZ2VvbWV0cnkgdG8gaW5zZXJ0IGluIHRoZSBzdG9yZVxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVwbGFjZUZlYXR1cmVJblN0b3JlKFxyXG4gICAgZW50aXR5LFxyXG4gICAgb2xHZW9tZXRyeTogT2xHZW9tZXRyeSxcclxuICAgIHJhZGl1cz86IG51bWJlclxyXG4gICkge1xyXG4gICAgdGhpcy5hY3RpdmVTdG9yZS5kZWxldGUoZW50aXR5KTtcclxuICAgIHRoaXMub25EcmF3RW5kKG9sR2VvbWV0cnksIHJhZGl1cyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWFjdGl2YXRlIHRoZSBhY3RpdmUgZHJhdyBjb250cm9sXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZWFjdGl2YXRlRHJhd0NvbnRyb2woKSB7XHJcbiAgICBpZiAoIXRoaXMuYWN0aXZlRHJhd0NvbnRyb2wpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmRyYXdFbmQkJCkge1xyXG4gICAgICB0aGlzLmRyYXdFbmQkJC51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2V0T2xNYXAodW5kZWZpbmVkKTtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2xJc0FjdGl2ZSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWN0aXZhdGUgYSBnaXZlbiBjb250cm9sXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhY3RpdmF0ZURyYXdDb250cm9sKCkge1xyXG4gICAgdGhpcy5kcmF3Q29udHJvbElzRGlzYWJsZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuZHJhd0NvbnRyb2xJc0FjdGl2ZSA9IHRydWU7XHJcbiAgICB0aGlzLmRyYXdFbmQkJCA9IHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuZW5kJC5zdWJzY3JpYmUoXHJcbiAgICAgIChvbEdlb21ldHJ5OiBPbEdlb21ldHJ5KSA9PiB7XHJcbiAgICAgICAgdGhpcy5vcGVuRHJhd0RpYWxvZyhvbEdlb21ldHJ5LCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLm1vZGlmeSQuc3Vic2NyaWJlKChvbEdlb21ldHJ5OiBPbEdlb21ldHJ5KSA9PiB7XHJcbiAgICAgIHRoaXMub25Nb2RpZnlEcmF3KG9sR2VvbWV0cnkpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKCF0aGlzLmRyYXdTZWxlY3QkJCkge1xyXG4gICAgICB0aGlzLmRyYXdTZWxlY3QkJCA9IHRoaXMuYWN0aXZlRHJhd0NvbnRyb2wuc2VsZWN0JC5zdWJzY3JpYmUoXHJcbiAgICAgICAgKG9sRmVhdHVyZTogT2xGZWF0dXJlPE9sR2VvbWV0cnk+KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLm9wZW5EcmF3RGlhbG9nKG9sRmVhdHVyZSwgZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmFjdGl2ZURyYXdDb250cm9sLnNldE9sTWFwKHRoaXMubWFwLm9sLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlY3JlYXRlcyB0aGUgc3R5bGUgb2YgdGhlIGZlYXR1cmUgc3RvcmVkXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBlbGVtZW50U3R5bGUobGFiZWxzQXJlU2hvd246IGJvb2xlYW4sIGlzQW5JY29uPykge1xyXG4gICAgaWYgKGlzQW5JY29uKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub2wuc2V0U3R5bGUoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmNyZWF0ZUluZGl2aWR1YWxFbGVtZW50U3R5bGUoXHJcbiAgICAgICAgICBmZWF0dXJlLFxyXG4gICAgICAgICAgcmVzb2x1dGlvbixcclxuICAgICAgICAgIGxhYmVsc0FyZVNob3duLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZScpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLmZpbGwsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFgnKSxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRZJyksXHJcbiAgICAgICAgICB0aGlzLmljb25cclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlU3RvcmUubGF5ZXIub2wuc2V0U3R5bGUoKGZlYXR1cmUsIHJlc29sdXRpb24pID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kcmF3U3R5bGVTZXJ2aWNlLmNyZWF0ZUluZGl2aWR1YWxFbGVtZW50U3R5bGUoXHJcbiAgICAgICAgICBmZWF0dXJlLFxyXG4gICAgICAgICAgcmVzb2x1dGlvbixcclxuICAgICAgICAgIGxhYmVsc0FyZVNob3duLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2ZvbnRTdHlsZScpLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ2RyYXdpbmdTdHlsZScpLmZpbGwsXHJcbiAgICAgICAgICBmZWF0dXJlLmdldCgnZHJhd2luZ1N0eWxlJykuc3Ryb2tlLFxyXG4gICAgICAgICAgZmVhdHVyZS5nZXQoJ29mZnNldFgnKSxcclxuICAgICAgICAgIGZlYXR1cmUuZ2V0KCdvZmZzZXRZJylcclxuICAgICAgICApO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdj5cclxuICA8ZGl2IGNsYXNzPVwiZ2VvbWV0cnktdHlwZS10b2dnbGUgbWF0LXR5cG9ncmFwaHlcIj5cclxuICAgIDxtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFxyXG4gICAgICAoY2hhbmdlKT1cIm9uR2VvbWV0cnlUeXBlQ2hhbmdlKCRldmVudC52YWx1ZSlcIiBbdmFsdWVdPVwiZ2VvbWV0cnlUeXBlLlBvaW50XCI+XHJcbiAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSBbdmFsdWVdPVwiZ2VvbWV0cnlUeXBlLlBvaW50XCI+XHJcbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuUG9pbnQgfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuTGluZVN0cmluZ1wiPlxyXG4gICAgICAgIHt7J2lnby5nZW8uZHJhdy4nICsgZ2VvbWV0cnlUeXBlLkxpbmVTdHJpbmcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuUG9seWdvblwiPlxyXG4gICAgICAgIHt7J2lnby5nZW8uZHJhdy4nICsgZ2VvbWV0cnlUeXBlLlBvbHlnb24gfCB0cmFuc2xhdGV9fVxyXG4gICAgICA8L21hdC1idXR0b24tdG9nZ2xlPlxyXG5cclxuICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIFt2YWx1ZV09XCJnZW9tZXRyeVR5cGUuQ2lyY2xlXCI+XHJcbiAgICAgICAge3snaWdvLmdlby5kcmF3LicgKyBnZW9tZXRyeVR5cGUuQ2lyY2xlIHwgdHJhbnNsYXRlfX1cclxuICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgIDwvbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXA+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJkcmF3LW9wdGlvbnMgbWF0LXR5cG9ncmFwaHlcIj5cclxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgIFtkaXNhYmxlZF09XCJkcmF3Q29udHJvbElzRGlzYWJsZWRcIlxyXG4gICAgICBbY2hlY2tlZF09XCJkcmF3Q29udHJvbElzQWN0aXZlXCJcclxuICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlRHJhd0NvbnRyb2woJGV2ZW50LmNoZWNrZWQpXCI+XHJcbiAgICAgIHt7J2lnby5nZW8uc3BhdGlhbEZpbHRlci5kcmF3Q29udHJvbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cclxuICAgIDxtYXQtc2xpZGUtdG9nZ2xlXHJcbiAgICAgIFtjaGVja2VkXT1cImxhYmVsc0FyZVNob3duXCJcclxuICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIlxyXG4gICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlTGFiZWxzKClcIlxyXG4gICAgPlxyXG4gICAgICB7eyAnaWdvLmdlby5kcmF3LnRvZ2dsZU1hcFRvb2x0aXBzJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgPC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuXHJcbiAgPGRpdj5cclxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGNsYXNzPVwibGF5ZXItc2VsZWN0XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+e3snaWdvLmdlby5kcmF3LmxheWVyLnRpdGxlJyB8IHRyYW5zbGF0ZX19PC9tYXQtbGFiZWw+XHJcbiAgICAgIDxtYXQtc2VsZWN0ICNzZWxlY3RlZExheWVyIChzZWxlY3Rpb25DaGFuZ2UpPVwib25MYXllckNoYW5nZShzZWxlY3RlZExheWVyLnZhbHVlKVwiIFt2YWx1ZV09XCJ1cGRhdGVBY3RpdmVMYXllcigpXCI+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGxheWVyIG9mIGFsbExheWVyc1wiIFt2YWx1ZV09XCJsYXllclwiPlxyXG4gICAgICAgICAge3sgbGF5ZXIudGl0bGUgfX1cclxuICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgPG1hdC1vcHRpb24gaWQ9XCJjcmVhdGVOZXdMYXllclwiID5cclxuICAgICAgICAgIHt7J2lnby5nZW8uZHJhdy5sYXllci5jcmVhdGVOZXdMYXllcicgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nSWY9XCJhY3RpdmVEcmF3aW5nTGF5ZXJcIlxyXG4gICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgW2NvbG9yXT1cImFjdGl2ZURyYXdpbmdMYXllci52aXNpYmxlID8gJ3ByaW1hcnknIDogJ2RlZmF1bHQnXCJcclxuICAgICAgY29sbGFwc2libGVCdXR0b25cclxuICAgICAgdG9vbHRpcC1wb3NpdGlvbj1cImJlbG93XCJcclxuICAgICAgbWF0VG9vbHRpcFNob3dEZWxheT1cIjUwMFwiXHJcbiAgICAgIFttYXRUb29sdGlwXT1cImFjdGl2ZURyYXdpbmdMYXllci52aXNpYmxlID9cclxuICAgICAgICAgICAgICAgICAgICAoJ2lnby5nZW8ubGF5ZXIuaGlkZUxheWVyJyB8IHRyYW5zbGF0ZSkgOlxyXG4gICAgICAgICAgICAgICAgICAgICgnaWdvLmdlby5sYXllci5zaG93TGF5ZXInIHwgdHJhbnNsYXRlKVwiXHJcbiAgICAgIChjbGljayk9XCJhY3RpdmVEcmF3aW5nTGF5ZXIudmlzaWJsZSA9ICFhY3RpdmVEcmF3aW5nTGF5ZXIudmlzaWJsZVwiPlxyXG4gICAgICA8bWF0LWljb25cclxuICAgICAgICBbc3ZnSWNvbl09XCJhY3RpdmVEcmF3aW5nTGF5ZXIudmlzaWJsZSA/ICdleWUnIDogJ2V5ZS1vZmYnXCI+XHJcbiAgICAgIDwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuICA8bWF0LWRpdmlkZXI+PC9tYXQtZGl2aWRlcj5cclxuICA8ZGl2PlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cImFjdGl2ZVN0b3JlLmNvdW50JC5nZXRWYWx1ZSgpID4gMFwiXHJcbiAgICAgIGNsYXNzPVwiZGVsZXRlQnRuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXHJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kcmF3LmRlbGV0ZScgfCB0cmFuc2xhdGVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiKHNlbGVjdGVkRmVhdHVyZXMkIHwgYXN5bmMpLmxlbmd0aCA9PT0gMFwiXHJcbiAgICAgIChjbGljayk9XCJkZWxldGVEcmF3aW5ncygpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZGVsZXRlXCI+PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxkaXY+XHJcbiAgICAgIDxpZ28tZW50aXR5LXRhYmxlXHJcbiAgICAgICAgI3RhYmxlXHJcbiAgICAgICAgY2xhc3M9XCJ0YWJsZS1jb21wYWN0XCJcclxuICAgICAgICBbc3RvcmVdPVwiYWN0aXZlU3RvcmVcIlxyXG4gICAgICAgIFt0ZW1wbGF0ZV09XCJ0YWJsZVRlbXBsYXRlXCJcclxuICAgICAgICAoZGJsY2xpY2spPVwiZWRpdExhYmVsRHJhd2luZygpXCI+XHJcbiAgICAgIDwvaWdvLWVudGl0eS10YWJsZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiaWNvbi1vcHRpb25zXCI+XHJcbiAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJpY29ucy5sZW5ndGggPj0gMVwiPlxyXG4gICAgICA8bWF0LWxhYmVsPnt7ICdpZ28uZ2VvLmRyYXcuaWNvbicgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cclxuICAgICAgPG1hdC1zZWxlY3Q+XHJcbiAgICAgICAgPG1hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJpY29uXCIgY2xhc3M9XCJib3hcIj5cclxuICAgICAgICAgICAgPGltZyBzcmM9XCJ7eyBpY29uIH19XCI+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L21hdC1zZWxlY3QtdHJpZ2dlcj5cclxuICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiIChjbGljayk9XCJvbkljb25DaGFuZ2UoKVwiPnt7ICdpZ28uZ2VvLmRyYXcubm9JY29uJyB8IHRyYW5zbGF0ZSB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGljb25faHRtbCBvZiBpY29uc1wiXHJcbiAgICAgICAgICBbdmFsdWVdPVwiaWNvbl9odG1sXCJcclxuICAgICAgICAgIChjbGljayk9XCJvbkljb25DaGFuZ2UoaWNvbl9odG1sKVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJveFwiPlxyXG4gICAgICAgICAgICA8aW1nIHNyYz1cInt7IGljb25faHRtbCB9fVwiPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gIDwvZGl2PlxyXG5cclxuICA8YnV0dG9uXHJcbiAgICBtYXQtaWNvbi1idXR0b25cclxuICAgIGNvbG9yPVwiYWNjZW50XCJcclxuICAgIGRpc2FibGVSaXBwbGU9XCJ0cnVlXCJcclxuICAgIChjbGljayk9XCJvcGVuU2hvcmN1dHNEaWFsb2coKVwiXHJcbiAgPlxyXG4gICAgPG1hdC1pY29uXHJcbiAgICAgIGNsYXNzPVwic2hvcnRjdXRzLWljb25cIlxyXG4gICAgICBzdmdJY29uPVwia2V5Ym9hcmQtb3V0bGluZVwiXHJcbiAgICAgIHRvb2x0aXAtcG9zaXRpb249XCJiZWxvd1wiXHJcbiAgICAgIG1hdFRvb2x0aXBTaG93RGVsYXk9XCI1MDBcIlxyXG4gICAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5kcmF3LnNob3J0Y3V0cycgfCB0cmFuc2xhdGVcIlxyXG4gICAgPlxyXG4gICAgPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuXHJcbiAgPGJ1dHRvblxyXG4gICAgKm5nSWY9XCJzZWxlY3RlZEZlYXR1cmVzJC52YWx1ZS5sZW5ndGhcIlxyXG4gICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAoY2xpY2spPVwib3BlblN0eWxlTW9kYWxEaWFsb2coKVwiXHJcbiAgICBbbWF0VG9vbHRpcF09XCInaWdvLmdlby5sYXllci5zdHlsZS5zdHlsZU1vZGFsVG9vbHRpcCcgfCB0cmFuc2xhdGVcIj5cclxuICAgIHt7J2lnby5nZW8ubGF5ZXIuc3R5bGUuc3R5bGVNb2RhbCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgPG1hdC1pY29uXHJcbiAgICAgIGNsYXNzPVwic3R5bGUtaWNvblwiXHJcbiAgICAgIHN2Z0ljb249XCJwYWxldHRlXCJcclxuICAgICAgW21hdEJhZGdlXT1cInNlbGVjdGVkRmVhdHVyZXMkLnZhbHVlLmxlbmd0aFwiXHJcbiAgICAgIG1hdEJhZGdlQ29sb3I9XCJ3YXJuXCJcclxuICAgICAgbWF0QmFkZ2VTaXplPVwibWVkaXVtXCI+XHJcbiAgICA8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG48L2Rpdj5cclxuIl19