@bizdoc/core 1.14.13 → 1.14.16

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,9 +1,10 @@
1
1
  import { Component, ViewChild, HostListener } from '@angular/core';
2
- import { Subject } from 'rxjs';
2
+ import { first, Subject } from 'rxjs';
3
3
  import { takeUntil } from 'rxjs/operators';
4
- import { DiagramConstraints, SelectorConstraints, ConnectorDrawingTool, NodeConstraints, Diagram, UndoRedo, Node, DiagramTools, ConnectorConstraints, SymbolPalette, BpmnDiagrams, ConnectorEditing, ConnectorBridging, Snapping } from '@syncfusion/ej2-diagrams';
4
+ import { DiagramConstraints, SelectorConstraints, NodeConstraints, Diagram, UndoRedo, Node, DiagramTools, ConnectorConstraints, SymbolPalette, BpmnDiagrams, ConnectorEditing, ConnectorBridging, Snapping, Connector, PortConstraints, PortVisibility } from '@syncfusion/ej2-angular-diagrams';
5
5
  import { WorkflowNodeComponent } from './node.component';
6
6
  import { OpenPolicy } from '../../../core/configuration';
7
+ import { MATERIAL_PALETTES } from '../../../core/colors';
7
8
  import * as i0 from "@angular/core";
8
9
  import * as i1 from "../../../core/prompt.service";
9
10
  import * as i2 from "../form.service";
@@ -23,15 +24,12 @@ import * as i15 from "@angular/flex-layout/flex";
23
24
  import * as i16 from "../../../core/pipes/translate.pipe";
24
25
  Diagram.Inject(UndoRedo, ConnectorBridging, ConnectorEditing, Snapping);
25
26
  SymbolPalette.Inject(BpmnDiagrams);
26
- function getPorts() {
27
- const ports = [
28
- { id: 'port1', shape: 'Circle', offset: { x: 0, y: 0.5 } },
29
- { id: 'port2', shape: 'Circle', offset: { x: 0.5, y: 1 } },
30
- { id: 'port3', shape: 'Circle', offset: { x: 1, y: 0.5 } },
31
- { id: 'port4', shape: 'Circle', offset: { x: 0.5, y: 0 } }
32
- ];
33
- return ports;
34
- }
27
+ const ports = [
28
+ { id: 'port1', shape: 'Circle', offset: { x: 0, y: 0.5 }, visibility: PortVisibility.Connect | PortVisibility.Hover, constraints: PortConstraints.Default | PortConstraints.Draw },
29
+ { id: 'port2', shape: 'Circle', offset: { x: 0.5, y: 1 }, visibility: PortVisibility.Connect | PortVisibility.Hover, constraints: PortConstraints.Default | PortConstraints.Draw },
30
+ { id: 'port3', shape: 'Circle', offset: { x: 1, y: 0.5 }, visibility: PortVisibility.Connect | PortVisibility.Hover, constraints: PortConstraints.Default | PortConstraints.Draw },
31
+ { id: 'port4', shape: 'Circle', offset: { x: 0.5, y: 0 }, visibility: PortVisibility.Connect | PortVisibility.Hover, constraints: PortConstraints.Default | PortConstraints.Draw }
32
+ ];
35
33
  function showPaletteIcon() {
36
34
  const paletteSpace = document.getElementById('palette-space');
37
35
  const isMobile = window.matchMedia('(max-width:550px)').matches;
@@ -53,26 +51,6 @@ function paletteIconClick() {
53
51
  }
54
52
  }
55
53
  }
56
- //Defines the tool
57
- class DrawTool extends ConnectorDrawingTool {
58
- constructor(diagram, segments) {
59
- super(diagram.commandHandler, 'ConnectorSourceEnd', null);
60
- this.diagram = diagram;
61
- this.segments = segments;
62
- }
63
- mouseMove(args) {
64
- if (this.diagram.selectedItems.nodes.length) {
65
- this.diagram.drawingObject = {
66
- type: this.segments || 'Bezier',
67
- sourceID: this.diagram.selectedItems.nodes[0].id
68
- };
69
- this.inAction = true;
70
- }
71
- const ok = super.mouseMove(args);
72
- return ok;
73
- }
74
- }
75
- const LINK_PATH = 'M346.7,714.6l368.1-368.1c17.9-17.9,17.9-47.1,0-64.9c-17.9-17.9-47.1-17.9-64.9,0l-368,368c-17.9,17.9-17.9,47.1,0,64.9C299.6,732.5,328.9,732.5,346.7,714.6z M468.2,651c6.4,9,7.6,18.5,7.6,23.8c0,6.3-1.5,18.6-11.8,28.9L271,896.5c-10.3,10.3-22.5,11.8-28.9,11.8c-6.3,0-18.6-1.5-28.9-11.8L103.5,786.8c-10.3-10.3-11.8-22.5-11.8-28.9c0-6.4,1.5-18.6,11.8-28.9l192.9-192.9c10.3-10.3,22.5-11.8,28.9-11.8c4.5,0,11.8,0.8,19.3,4.8l58.6-58.6c-48-39.6-119.6-36.9-164.5,7.9L45.7,671.3c-47.7,47.7-47.7,125.5,0,173.2l109.7,109.7c47.7,47.7,125.5,47.7,173.2,0l192.9-192.9c46-46,47.6-120.4,4.6-168.4L468.2,651z M954.2,155.5L844.5,45.8C796.9-1.9,719-1.9,671.3,45.8L478.4,238.7c-44.8,44.8-47.5,116.5-7.9,164.5l58.6-58.6c-4-7.6-4.8-14.9-4.8-19.3c0-6.3,1.5-18.6,11.8-28.9l192.9-192.9c10.3-10.3,22.5-11.8,28.9-11.8c6.3,0,18.6,1.5,28.9,11.8l109.7,109.7c10.3,10.3,11.8,22.5,11.8,28.9c0,6.3-1.5,18.6-11.8,28.9L703.7,464c-10.3,10.3-22.5,11.8-28.9,11.8c-5.3,0-14.8-1.1-23.8-7.6l-58,58c48,43,122.3,41.5,168.4-4.6l192.9-192.9C1001.9,281.1,1001.9,203.1,954.2,155.5z';
76
54
  /** workflow component*/
77
55
  export class WorkflowComponent {
78
56
  /** workflow ctor */
@@ -83,7 +61,7 @@ export class WorkflowComponent {
83
61
  this._router = _router;
84
62
  this._session = _session;
85
63
  this._translate = _translate;
86
- this.tools = true;
64
+ this.fontSizes = [9, 11, 12, 13, 15, 21, 31, 41];
87
65
  this.connectorType = 'Bezier';
88
66
  this.alignment = 'Center';
89
67
  this.fontSize = 12;
@@ -91,71 +69,53 @@ export class WorkflowComponent {
91
69
  this.dirty = false;
92
70
  this.palettes = [];
93
71
  this.diagramConstraints = DiagramConstraints.Default | DiagramConstraints.Bridging | DiagramConstraints.UserInteraction | DiagramConstraints.Zoom;
94
- this.diagramTool = DiagramTools.Default;
95
- //Defines the user handle collection for nodes in diagram
96
- this._userHandles = [
97
- {
98
- name: 'connect',
99
- pathData: LINK_PATH,
100
- visible: true,
101
- offset: 0,
102
- side: 'Right',
103
- displacement: 20,
104
- margin: { top: 0, bottom: 0, left: 0, right: 0 }
105
- }
106
- ];
107
72
  //SymbolPalette Properties
108
73
  this.symbolMargin = { left: 10, right: 10, top: 10, bottom: 10 };
109
- this.snapSettings = {};
110
- this.selectedItems = {};
74
+ this.snapSettings = {
75
+ snapLineColor: this._session.getAccent(100)
76
+ };
77
+ this.selectedItems = {
78
+ constraints: SelectorConstraints.All & ~SelectorConstraints.Rotate,
79
+ };
111
80
  this.scrollSettings = {
112
81
  minZoom: .5,
113
- maxZoom: 2.5
114
- };
115
- this._rulerColor = this._session.getAccent(100);
116
- this.rulerSettings = {
117
- horizontalRuler: { markerColor: this._rulerColor },
118
- verticalRuler: { markerColor: this._rulerColor }
82
+ maxZoom: 2.5,
119
83
  };
84
+ this.rulerSettings = {};
120
85
  this._destroy = new Subject();
121
- this.nodeDefaults = () => {
122
- const obj = {
123
- style: {
124
- fill: 'transparent',
125
- strokeColor: this._session.theme.dark ? 'white' : 'black',
126
- strokeWidth: 1
127
- },
128
- annotations: [{
129
- style: {
130
- color: this._session.theme.dark ? 'white' : 'black',
131
- fill: 'transparent',
132
- opacity: .8
133
- }
134
- }]
135
- };
136
- if (obj.width === undefined) {
137
- obj.width = 145;
138
- }
139
- else {
140
- const ratio = 100 / obj.width;
141
- obj.width = 100;
142
- obj.height *= ratio;
86
+ this._nodedestroy = new Subject();
87
+ this.nodeDefaults = (obj) => {
88
+ switch (obj.shape.type) {
89
+ case 'SwimLane':
90
+ break;
91
+ case 'Text':
92
+ if (obj.id !== 'version')
93
+ obj.constraints = NodeConstraints.Default & ~NodeConstraints.InConnect & ~NodeConstraints.OutConnect;
94
+ break;
95
+ default:
96
+ if (obj.addInfo && obj.addInfo['nodeType']) {
97
+ obj.constraints = NodeConstraints.Default | NodeConstraints.AspectRatio;
98
+ obj.style.strokeColor = this._session.theme.dark ? 'white' : 'black';
99
+ obj.ports = ports;
100
+ }
101
+ break;
143
102
  }
144
- obj.constraints = NodeConstraints.Default | NodeConstraints.AspectRatio;
145
- obj.ports = getPorts();
146
103
  return obj;
147
104
  };
148
105
  this.connDefaults = (obj) => {
149
- obj.constraints = ConnectorConstraints.Default | ConnectorConstraints.Bridging | ConnectorConstraints.DragSegmentThumb;
106
+ obj.constraints = ConnectorConstraints.Default | ConnectorConstraints.Bridging;
150
107
  obj.style.strokeColor = this._session.theme.dark ? 'white' : 'black';
108
+ if (!obj.type)
109
+ obj.type = this.connectorType;
110
+ return obj;
151
111
  };
112
+ this._tools = localStorage.getItem('diagram_tools') === '1';
152
113
  this._palettes();
153
114
  }
154
- getTool(action) {
155
- let tool = null;
156
- if (action === 'connect')
157
- tool = new DrawTool(this.diagram, this.connectorType);
158
- return tool;
115
+ get tools() { return this._tools; }
116
+ set tools(val) {
117
+ localStorage.setItem('diagram_tools', val ? '1' : '0');
118
+ this._tools = val;
159
119
  }
160
120
  ngAfterViewInit() {
161
121
  }
@@ -163,11 +123,15 @@ export class WorkflowComponent {
163
123
  this.symbolPalette = new SymbolPalette({
164
124
  expandMode: 'Multiple',
165
125
  palettes: this.palettes,
166
- width: "100%", height: "100%", symbolHeight: 80,
167
- enableRtl: false, enableAnimation: false, symbolWidth: 80,
126
+ width: "100%",
127
+ height: "100%",
128
+ enableRtl: false,
129
+ enableAnimation: false,
130
+ symbolHeight: 80,
131
+ symbolWidth: 80,
168
132
  symbolMargin: this.symbolMargin,
169
133
  getSymbolInfo: this.getSymbolInfo.bind(this),
170
- getNodeDefaults: this.getSymbolDefaults.bind(this)
134
+ getNodeDefaults: this.getSymbolDefaults.bind(this),
171
135
  });
172
136
  this.symbolPalette.appendTo(this.symbolPaletteEl.nativeElement);
173
137
  this.diagram = new Diagram({
@@ -175,15 +139,13 @@ export class WorkflowComponent {
175
139
  snapSettings: this.snapSettings,
176
140
  getConnectorDefaults: this.connDefaults.bind(this),
177
141
  constraints: this.diagramConstraints,
178
- tool: this.diagramTool,
179
142
  getNodeDefaults: this.nodeDefaults.bind(this),
180
- getCustomTool: this.getTool.bind(this),
181
143
  scrollSettings: this.scrollSettings,
182
144
  selectedItems: this.selectedItems,
183
145
  rulerSettings: this.rulerSettings,
184
146
  dragEnter: this.dragEnter.bind(this),
185
147
  connectionChange: this.change.bind(this),
186
- collectionChange: this.change.bind(this),
148
+ collectionChange: this.collectionChange.bind(this),
187
149
  propertyChange: this.propertyChange.bind(this),
188
150
  selectionChange: this.selectionChange.bind(this),
189
151
  }, this.diagramEl.nativeElement);
@@ -204,7 +166,6 @@ export class WorkflowComponent {
204
166
  this.diagram.fitToPage();
205
167
  this.dirty = false;
206
168
  });
207
- this._pane.resized.pipe(takeUntil(this._destroy)).subscribe(() => this.diagram.refresh());
208
169
  }
209
170
  _palettes() {
210
171
  this._session.profile.nodes.forEach(n => {
@@ -215,6 +176,8 @@ export class WorkflowComponent {
215
176
  nodeType: n.name,
216
177
  title: n.title
217
178
  },
179
+ width: 145,
180
+ height: 145,
218
181
  };
219
182
  node.node = n.name;
220
183
  let palette = this.palettes.find(p => p.title === (n.palette || ''));
@@ -224,8 +187,131 @@ export class WorkflowComponent {
224
187
  }
225
188
  palette.symbols.push(node);
226
189
  });
227
- //this.palettes.push({ id: 'design', title: this._translation.get('Design'), symbols: [{ id: 'text', shape: { type: 'Text', textContent: 'T' }, addInfo: { title: this._translation.get('Text') } }] });
228
- /*this.palettes.push(swimlane );*/
190
+ this.palettes.push({
191
+ id: 'design',
192
+ title: this._translate.get('Design'),
193
+ symbols: [{
194
+ id: 'Link22',
195
+ type: 'Straight',
196
+ sourcePoint: { x: 0, y: 0 },
197
+ targetPoint: { x: 60, y: 60 },
198
+ targetDecorator: {
199
+ shape: 'Arrow',
200
+ style: { strokeColor: '#757575', fill: '#757575' },
201
+ },
202
+ style: {
203
+ strokeWidth: 1,
204
+ strokeDashArray: '4 4',
205
+ strokeColor: '#757575',
206
+ }
207
+ },
208
+ {
209
+ id: 'text', shape: { type: 'Text', content: 'T' },
210
+ style: {
211
+ fill: 'transparent'
212
+ },
213
+ constraints: NodeConstraints.Default & ~NodeConstraints.InConnect & ~NodeConstraints.OutConnect,
214
+ addInfo: { title: this._translate.get('Text') }
215
+ }]
216
+ });
217
+ const color = MATERIAL_PALETTES['grey'][200];
218
+ this.palettes.push({
219
+ id: 'swimlaneShapes',
220
+ expanded: true,
221
+ title: this._translate.get('Swimlane Shapes'),
222
+ symbols: [
223
+ {
224
+ id: 'swimlane',
225
+ addInfo: {
226
+ title: this._translate.get('Horizontal')
227
+ },
228
+ shape: {
229
+ header: {
230
+ annotation: { content: 'Plan' }
231
+ },
232
+ type: 'SwimLane',
233
+ lanes: [
234
+ {
235
+ id: 'lane1',
236
+ header: {
237
+ annotation: { content: 'Lane' },
238
+ style: { fill: color }
239
+ }
240
+ }
241
+ ],
242
+ orientation: 'Horizontal',
243
+ isLane: true
244
+ },
245
+ height: 60,
246
+ width: 140,
247
+ offsetX: 70,
248
+ offsetY: 30,
249
+ }, {
250
+ id: 'vswimlane',
251
+ addInfo: {
252
+ title: this._translate.get('Vertical')
253
+ },
254
+ shape: {
255
+ type: 'SwimLane',
256
+ header: {
257
+ annotation: { content: 'Plan' }
258
+ },
259
+ lanes: [
260
+ {
261
+ id: 'lane1',
262
+ header: {
263
+ annotation: { content: 'Lane' },
264
+ style: { fill: color }
265
+ }
266
+ }
267
+ ],
268
+ orientation: 'Vertical', isLane: true
269
+ },
270
+ height: 140,
271
+ width: 60,
272
+ offsetX: 70,
273
+ offsetY: 30,
274
+ }, {
275
+ id: 'vphase',
276
+ addInfo: {
277
+ title: this._translate.get('Phase')
278
+ },
279
+ shape: {
280
+ type: 'SwimLane',
281
+ phases: [
282
+ {
283
+ style: { strokeWidth: 1, strokeDashArray: '3,3', strokeColor: color },
284
+ header: {
285
+ annotation: { text: 'Phase' }
286
+ }
287
+ }
288
+ ],
289
+ orientation: 'Vertical', isPhase: true
290
+ },
291
+ height: 60,
292
+ width: 140,
293
+ style: { strokeColor: color }
294
+ }, {
295
+ id: 'hphase',
296
+ addInfo: {
297
+ title: this._translate.get('Phase')
298
+ },
299
+ shape: {
300
+ type: 'SwimLane',
301
+ phases: [{
302
+ style: { strokeWidth: 1, strokeDashArray: '3,3', strokeColor: color },
303
+ header: {
304
+ annotation: { text: 'Phase' }
305
+ }
306
+ }],
307
+ orientation: 'Horizontal', isPhase: true
308
+ },
309
+ height: 60,
310
+ width: 140,
311
+ style: { strokeColor: color }
312
+ }
313
+ ]
314
+ });
229
315
  }
230
316
  _versionNode(version) {
231
317
  return {
@@ -246,15 +332,14 @@ export class WorkflowComponent {
246
332
  };
247
333
  }
248
334
  getSymbolInfo(symbol) {
249
- return {
335
+ return symbol.addInfo ? {
250
336
  fit: true,
251
337
  tooltip: symbol.addInfo.title,
252
338
  description: { text: symbol.addInfo.title, overflow: 'Wrap', wrap: 'WrapWithOverflow' }
253
- };
339
+ } : null;
254
340
  }
255
341
  getSymbolDefaults(symbol) {
256
342
  symbol.width = symbol.height = 40;
257
- symbol.constraints = NodeConstraints.Default | NodeConstraints.AspectRatio;
258
343
  }
259
344
  pan() {
260
345
  this.diagram.constraints = this.diagram.constraints | DiagramConstraints.Pan;
@@ -265,51 +350,45 @@ export class WorkflowComponent {
265
350
  this.diagram.tool = DiagramTools.Default;
266
351
  }
267
352
  selectionChange(evt) {
268
- const { nodes, connectors } = this.diagram.selectedItems;
269
- if (connectors.length || nodes.length) {
270
- if (nodes.length === 1 && nodes[0].addInfo) {
271
- this.diagram.selectedItems.constraints = SelectorConstraints.All | SelectorConstraints.UserHandle;
272
- this.diagram.selectedItems.userHandles = this._userHandles;
273
- }
274
- else
275
- this.diagram.selectedItems.constraints = SelectorConstraints.All ^ SelectorConstraints.UserHandle;
276
- if (connectors.length) {
277
- const connector = connectors[0];
278
- connectors.forEach(c => { if (!c.addInfo)
279
- c.addInfo = {}; });
280
- const type = connector.type;
281
- this.connectorType = connectors.length === 1 || connectors.every(c => c.type === type) ? type : null;
282
- if (connector.annotations.length)
283
- this.fontSize = connector.annotations[0].style.fontSize;
284
- this.connectorType = connectors.length === 1 || connectors.every(c => c.type === type) ? type : null;
285
- }
286
- if (nodes.length) {
287
- const node = nodes[0], addInfo = node.addInfo;
288
- if (addInfo && addInfo.nodeType) {
289
- if (node.annotations.length)
290
- this.fontSize = node.annotations[0].style.fontSize;
291
- }
292
- }
293
- this._router.navigate(WorkflowNodeComponent, {
294
- state: {
295
- nodes, connectors
296
- },
297
- policy: OpenPolicy.Tab,
298
- expandable: false,
299
- group: ''
300
- }).then(p => {
301
- p.instance.change.
302
- pipe(takeUntil(this._destroy)).subscribe(() => {
303
- this.dirty = true;
304
- this.diagram.dataBind();
305
- });
306
- });
353
+ const { newValue, state } = evt;
354
+ if (state !== 'Changing' || !newValue.length) {
355
+ this._nodedestroy.next();
356
+ return;
357
+ }
358
+ const connectors = newValue.filter(n => n instanceof Connector).map(n => n);
359
+ if (connectors.length) {
360
+ const connector = connectors[0], type = connector.type;
361
+ this.connectorType = connectors.length === 1 ||
362
+ connectors.every(c => c.type === type) ? type : null;
363
+ if (connector.annotations.length && connector.annotations[0].style)
364
+ this.fontSize = connector.annotations[0].style.fontSize;
365
+ this.connectorType = connectors.length === 1 ||
366
+ connectors.every(c => c.type === type) ? type : null;
307
367
  }
308
- else
309
- this._router.collapse();
368
+ const nodes = newValue.filter(n => n instanceof Node);
369
+ if (nodes.length) {
370
+ const node = nodes[0], addInfo = node.addInfo;
371
+ if (!addInfo || !addInfo['nodeType'])
372
+ return;
373
+ if (node.annotations.length && node.annotations[0].style)
374
+ this.fontSize = node.annotations[0].style.fontSize;
375
+ }
376
+ this._router.navigate(WorkflowNodeComponent, {
377
+ state: {
378
+ diagram: this.diagram,
379
+ nodes,
380
+ connectors
381
+ },
382
+ policy: OpenPolicy.Tab,
383
+ expandable: false,
384
+ group: ''
385
+ }).then(p => {
386
+ p.instance.change.pipe(takeUntil(this._nodedestroy)).subscribe(() => this.change());
387
+ this._nodedestroy.pipe(first()).subscribe(() => p.close());
388
+ });
310
389
  }
311
390
  align(value) {
312
- function align(n) {
391
+ this.diagram.selectedItems.nodes.forEach(n => {
313
392
  n.annotations.length && Object.assign(n.annotations[0], {
314
393
  offset: {
315
394
  x: value === 'Right' ? 1 : value === 'Left' ? 0 : .5,
@@ -318,21 +397,51 @@ export class WorkflowComponent {
318
397
  verticalAlignment: value === 'Top' ? 'Bottom' : value === 'Bottom' ? 'Top' : 'Center',
319
398
  horizontalAlignment: value === 'Right' ? 'Left' : value === 'Left' ? 'Right' : 'Center'
320
399
  });
321
- }
322
- this.diagram.selectedItems.nodes.forEach(align);
323
- this.diagram.selectedItems.connectors.forEach(align);
400
+ });
401
+ this.diagram.selectedItems.connectors.forEach(c => c.annotations.forEach(a => Object.assign(a, {
402
+ verticalAlignment: value === 'Top' ? 'Bottom' : value === 'Bottom' ? 'Top' : 'Center',
403
+ horizontalAlignment: value === 'Left' ? 'Left' : value === 'Right' ? 'Right' : 'Center',
404
+ // displacement: {
405
+ // x: value === 'Right' ? 10 : value === 'Left' ? -10 : 0,
406
+ // y: value === 'Top' ? -10 : value === 'Bottom' ? 10 : 0
407
+ // }
408
+ })));
324
409
  this.alignment = value;
325
410
  this.dirty = true;
326
411
  }
327
412
  dragEnter(args) {
328
- const obj = args.element;
329
- if (obj instanceof Node) {
330
- const { width, height } = obj;
331
- obj.width = 100;
332
- obj.height *= 100 / width;
333
- obj.offsetX += (obj.width - width) / 2;
334
- obj.offsetY += (obj.height - height) / 2;
335
- obj.style = { fill: 'white', strokeColor: 'black' };
413
+ if (args.element instanceof Node) {
414
+ switch (args.element.shape.type) {
415
+ case 'SwimLane':
416
+ {
417
+ const shape = args.element.shape;
418
+ switch (shape.orientation) {
419
+ case 'Horizontal':
420
+ shape.lanes[0].width = 400;
421
+ break;
422
+ case 'Vertical':
423
+ shape.lanes[0].height = 400;
424
+ break;
425
+ }
426
+ break;
427
+ }
428
+ case 'Text':
429
+ //(args.element.style as TextStyleModel).fontSize = 20;
430
+ break;
431
+ default:
432
+ {
433
+ const { width, height } = args.element;
434
+ args.element.width = 100;
435
+ args.element.height *= 100 / width;
436
+ args.element.offsetX += (args.element.width - width) / 2;
437
+ args.element.offsetY += (args.element.height - height) / 2;
438
+ args.element.style = {
439
+ fill: 'transparent',
440
+ strokeColor: this._session.theme.dark ? 'white' : 'black',
441
+ strokeWidth: 1
442
+ };
443
+ }
444
+ }
336
445
  }
337
446
  }
338
447
  propertyChange(e) {
@@ -342,14 +451,9 @@ export class WorkflowComponent {
342
451
  change() {
343
452
  this.dirty = true;
344
453
  }
345
- addText() {
346
- this.diagram.drawingObject = {
347
- shape: {
348
- type: 'Text',
349
- },
350
- constraints: NodeConstraints.Default & ~NodeConstraints.InConnect & ~NodeConstraints.OutConnect
351
- };
352
- this.diagram.tool = DiagramTools.DrawOnce;
454
+ collectionChange() {
455
+ this._router.collapse();
456
+ this.dirty = true;
353
457
  }
354
458
  /**
355
459
  * Ctrl-s save
@@ -375,8 +479,54 @@ export class WorkflowComponent {
375
479
  this.connectorType = type;
376
480
  this.dirty = true;
377
481
  }
378
- sizeChange(val) {
379
- this.diagram.selectedItems.nodes.forEach(n => n.annotations.forEach(a => a.style.fontSize = parseInt(val)));
482
+ boldChange() {
483
+ const val = !this.diagram.selectedItems.nodes[0].annotations[0]?.style?.bold;
484
+ function change(node) {
485
+ if (node.shape.type === 'Text')
486
+ node.style.bold = val;
487
+ else
488
+ node.annotations.forEach(a => {
489
+ if (!a.style)
490
+ a.style = { bold: val };
491
+ else
492
+ a.style.bold = val;
493
+ });
494
+ }
495
+ this.diagram.selectedItems.nodes.forEach(change);
496
+ this.diagram.selectedItems.connectors.forEach(change);
497
+ this.diagram.dataBind();
498
+ }
499
+ italicChange() {
500
+ const val = !this.diagram.selectedItems.nodes[0].annotations[0]?.style?.italic;
501
+ function change(node) {
502
+ if (node.shape.type === 'Text')
503
+ node.style.italic = val;
504
+ else
505
+ node.annotations.forEach(a => {
506
+ if (!a.style)
507
+ a.style = { italic: val };
508
+ else
509
+ a.style.italic = val;
510
+ });
511
+ }
512
+ this.diagram.selectedItems.nodes.forEach(change);
513
+ this.diagram.selectedItems.connectors.forEach(change);
514
+ this.diagram.dataBind();
515
+ }
516
+ fontSizeChange(val) {
517
+ function change(node) {
518
+ if (node.shape.type === 'Text')
519
+ node.style.fontSize = val;
520
+ else
521
+ node.annotations?.forEach(a => {
522
+ if (!a.style)
523
+ a.style = { fontSize: val };
524
+ else
525
+ a.style.fontSize = val;
526
+ });
527
+ }
528
+ this.diagram.selectedItems.nodes.forEach(change);
529
+ this.diagram.selectedItems.connectors.forEach(change);
380
530
  this.diagram.dataBind();
381
531
  }
382
532
  strokeChange(val) {
@@ -392,11 +542,7 @@ export class WorkflowComponent {
392
542
  this.diagram.serializationSettings = { preventDefaults: true };
393
543
  const obj = JSON.parse(this.diagram.saveDiagram());
394
544
  this._form.workflow.connectors = obj.connectors;
395
- this._form.workflow.nodes = obj.nodes.filter(n => n.id !== 'version').map((n) => {
396
- n.offsetX = Math.round(n.offsetX);
397
- n.offsetY = Math.round(n.offsetY);
398
- return n;
399
- });
545
+ this._form.workflow.nodes = obj.nodes.filter(n => n.id !== 'version');
400
546
  this.saving = true;
401
547
  return this._service.save(this._form).toPromise().then(v => {
402
548
  this.ps.toast('ChangesSaved');
@@ -419,15 +565,17 @@ export class WorkflowComponent {
419
565
  this.diagram?.destroy();
420
566
  this._destroy.next();
421
567
  this._destroy.complete();
568
+ this._nodedestroy.next();
569
+ this._nodedestroy.complete();
422
570
  }
423
571
  }
424
572
  WorkflowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: WorkflowComponent, deps: [{ token: i1.PromptService }, { token: i2.FormService }, { token: i3.PaneRef }, { token: i4.PanesRouter }, { token: i5.SessionService }, { token: i6.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
425
- WorkflowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: WorkflowComponent, selector: "bizdoc-workflow", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" }, classAttribute: "pane" }, viewQueries: [{ propertyName: "symbolPaletteEl", first: true, predicate: ["symbolPaletteEl"], descendants: true, static: true }, { propertyName: "diagramEl", first: true, predicate: ["diagramEl"], descendants: true, static: true }], ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty || saving\">{{'SaveChanges' | translate}}</button>\r\n <button mat-icon-button (click)=\"diagram.fitToPage()\" [bizdocTooltip]=\"'FitToPage' | translate\"><mat-icon>fullscreen_exit</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"!diagram.historyManager?.canUndo\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"!diagram.historyManager?.canRedo\"><mat-icon>redo</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"diagram.copy()\" [bizdocTooltip]=\"'Copy' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>copy</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.paste()\" [bizdocTooltip]=\"'Paste' | translate\"><mat-icon>paste</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"pan()\" [bizdocTooltip]=\"'Pan' | translate\"><span class=\"e-icons sf-icon-pan\"></span></button>\r\n <button mat-icon-button (click)=\"cursor()\" [bizdocTooltip]=\"'Cursor' | translate\"><span class=\"e-icons sf-icon-cursor\"></span></button>\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"addText()\" [bizdocTooltip]=\"'Text' | translate\"><mat-icon>title</mat-icon></button>\r\n <button mat-button [matMenuTriggerFor]=\"lineMenu\" [disabled]=\"diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'ConnectorMode'|translate\">\r\n <span class=\"e-menu-icon\" [ngClass]=\"{'sf-icon-straight-line': connectorType === 'Straight',\r\n 'sf-icon-orthogonal-line': connectorType === 'Orthogonal',\r\n 'sf-icon-beizer-line': connectorType === 'Bezier'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #lineMenu panelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"connectorTypeChange('Straight')\">\r\n <span class=\"e-menu-icon sf-icon-straight-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Orthogonal')\">\r\n <span class=\"e-menu-icon sf-icon-orthogonal-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Bezier')\">\r\n <span class=\"e-menu-icon sf-icon-beizer-line\"></span>\r\n </button>\r\n </mat-menu>\r\n &nbsp;\r\n <button mat-button [matMenuTriggerFor]=\"alignMenu\" [disabled]=\"diagram.selectedItems?.nodes.length === 0 && diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'Align'|translate\">\r\n <span class=\"e-icons\" [ngClass]=\"{'sf-icon-top': alignment === 'Top',\r\n 'sf-icon-left': alignment === 'Left',\r\n 'sf-icon-center': alignment === 'Center',\r\n 'sf-icon-bottom': alignment === 'Bottom',\r\n 'sf-icon-right': alignment === 'Right'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #alignMenu panelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"align('Top')\">\r\n <span class=\"e-icons sf-icon-top\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Left')\">\r\n <span class=\"e-icons sf-icon-left\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Center')\">\r\n <span class=\"e-icons sf-icon-center\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Bottom')\">\r\n <span class=\"e-icons sf-icon-bottom\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Right')\">\r\n <span class=\"e-icons sf-icon-right\"></span>\r\n </button>\r\n </mat-menu>\r\n</mat-toolbar>\r\n<div class=\"row container\">\r\n <div id=\"symbolpalette\" [style.display]=\"tools?'':'none'\">\r\n <div dir=\"ltr\" #symbolPaletteEl>\r\n </div>\r\n </div>\r\n <div #diagramEl id=\"diagram\" fxFlex dir=\"ltr\">\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;height:100%}.container{flex-grow:1;overflow-y:auto}#diagram{flex-grow:1}#symbolpalette{width:210px}::ng-deep .e-rtl{direction:ltr}::ng-deep .mat-toolbar .mat-button-toggle{background:transparent!important}.e-menu-icon{font-family:diagram-icons!important;speak:none;font-size:18px;font-style:normal;font-weight:400;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::ng-deep .icon-menu-panel{min-width:0}.tools-divider:after{content:\"|\";opacity:.6;margin:0 2px}\n"], components: [{ type: i7.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { type: i8.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i11.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i14.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { type: i15.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "translate": i16.TranslatePipe } });
573
+ WorkflowComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.9", type: WorkflowComponent, selector: "bizdoc-workflow", host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" }, classAttribute: "pane" }, viewQueries: [{ propertyName: "symbolPaletteEl", first: true, predicate: ["symbolPaletteEl"], descendants: true, static: true }, { propertyName: "diagramEl", first: true, predicate: ["diagramEl"], descendants: true, static: true }], ngImport: i0, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty || saving\">{{'SaveChanges' | translate}}</button>\r\n <button mat-icon-button (click)=\"diagram.fitToPage()\" [bizdocTooltip]=\"'FitToPage' | translate\"><mat-icon>fullscreen_exit</mat-icon></button>\r\n <button mat-icon-button (click)=\"pan()\" [bizdocTooltip]=\"'Pan' | translate\"><span class=\"e-icons sf-icon-pan\"></span></button>\r\n <button mat-icon-button (click)=\"cursor()\" [bizdocTooltip]=\"'Cursor' | translate\"><span class=\"e-icons sf-icon-cursor\"></span></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"diagram.undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"!diagram.historyManager?.canUndo\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"!diagram.historyManager?.canRedo\"><mat-icon>redo</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"diagram.copy()\" [bizdocTooltip]=\"'Copy' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>copy</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.paste()\" [bizdocTooltip]=\"'Paste' | translate\"><mat-icon>paste</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.remove()\" [bizdocTooltip]=\"'Remove' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>delete</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-button [matMenuTriggerFor]=\"lineMenu\" [disabled]=\"diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'ConnectorMode'|translate\">\r\n <span class=\"e-menu-icon\" [ngClass]=\"{'sf-icon-straight-line': connectorType === 'Straight',\r\n 'sf-icon-orthogonal-line': connectorType === 'Orthogonal',\r\n 'sf-icon-beizer-line': connectorType === 'Bezier'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #lineMenu overlayPanelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"connectorTypeChange('Straight')\">\r\n <span class=\"e-menu-icon sf-icon-straight-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Orthogonal')\">\r\n <span class=\"e-menu-icon sf-icon-orthogonal-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Bezier')\">\r\n <span class=\"e-menu-icon sf-icon-beizer-line\"></span>\r\n </button>\r\n <!--<ng-container *ngIf=\"connectors.length\">\r\n < bizdoc-color-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ bizdoc-color-picker>\r\n <ng-container *ngIf=\"nodes[0].annotations.length\">\r\n < bizdoc-color-picker (valueChanges)='colorChange($event)' [label]=\"'Color'|translate\"></ bizdoc-color-picker>\r\n </ng-container>\r\n < bizdoc-color-picker (valueChanges)='bgChange($event)' [label]=\"'Background'|translate\"></ bizdoc-color-picker>\r\n < bizdoc-color-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ bizdoc-color-picker>\r\n </ng-container>-->\r\n </mat-menu>\r\n &nbsp;\r\n <button mat-button [matMenuTriggerFor]=\"alignMenu\" [disabled]=\"diagram.selectedItems?.nodes.length === 0 && diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'Align'|translate\">\r\n <span class=\"e-icons\" [ngClass]=\"{'sf-icon-top': alignment === 'Top',\r\n 'sf-icon-left': alignment === 'Left',\r\n 'sf-icon-center': alignment === 'Center',\r\n 'sf-icon-bottom': alignment === 'Bottom',\r\n 'sf-icon-right': alignment === 'Right'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #alignMenu overlayPanelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"align('Top')\">\r\n <span class=\"e-icons sf-icon-top\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Left')\">\r\n <span class=\"e-icons sf-icon-left\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Center')\">\r\n <span class=\"e-icons sf-icon-center\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Right')\">\r\n <span class=\"e-icons sf-icon-right\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Bottom')\">\r\n <span class=\"e-icons sf-icon-bottom\"></span>\r\n </button>\r\n </mat-menu>\r\n <button mat-icon-button (click)=\"boldChange()\" [bizdocTooltip]=\"'Bold' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>format_bold</mat-icon></button>\r\n <button mat-icon-button (click)=\"italicChange()\" [bizdocTooltip]=\"'Italic' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>format_italic</mat-icon></button>\r\n <button mat-icon-button [matMenuTriggerFor]=\"sizeMenu\"\r\n [disabled]=\"diagram.selectedItems?.nodes.length === 0 && diagram.selectedItems?.connectors.length === 0\"\r\n [bizdocTooltip]=\"'FontSize'|translate\">\r\n <mat-icon>format_size</mat-icon>\r\n </button>\r\n <mat-menu #sizeMenu overlayPanelClass=\"icon-menu-panel\">\r\n <button mat-menu-item *ngFor=\"let size of fontSizes\" (click)=\"fontSizeChange(size)\">\r\n {{size}}\r\n </button>\r\n </mat-menu>\r\n <span class=\"divider\"></span>\r\n</mat-toolbar>\r\n<div class=\"row container\">\r\n <div id=\"symbolpalette\" [style.display]=\"tools?'':'none'\">\r\n <div dir=\"ltr\" #symbolPaletteEl>\r\n </div>\r\n </div>\r\n <div #diagramEl id=\"diagram\" fxFlex dir=\"ltr\">\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;height:100%}.container{flex-grow:1;overflow-y:auto}#diagram{flex-grow:1}#symbolpalette{width:210px}::ng-deep .e-rtl{direction:ltr}::ng-deep .mat-toolbar .mat-button-toggle{background:transparent!important}.e-menu-icon{font-family:diagram-icons!important;speak:none;font-size:18px;font-style:normal;font-weight:400;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::ng-deep .mat-menu-panel{min-width:0!important}.tools-divider:after{content:\"|\";opacity:.6;margin:0 2px}\n"], components: [{ type: i7.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { type: i8.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i10.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i10.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }], directives: [{ type: i11.TooltipDirective, selector: "[bizdocTooltip]", inputs: ["bizdocTooltip", "bizdocTooltipTemplate", "bizdocTooltipContext", "bizdocTooltipPosition", "bizdocTooltipDuration", "bizdocTooltipDisabled"] }, { type: i10.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i12.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i13.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i12.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i14.Dir, selector: "[dir]", inputs: ["dir"], outputs: ["dirChange"], exportAs: ["dir"] }, { type: i15.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "translate": i16.TranslatePipe } });
426
574
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImport: i0, type: WorkflowComponent, decorators: [{
427
575
  type: Component,
428
576
  args: [{ selector: 'bizdoc-workflow', host: {
429
577
  class: 'pane'
430
- }, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty || saving\">{{'SaveChanges' | translate}}</button>\r\n <button mat-icon-button (click)=\"diagram.fitToPage()\" [bizdocTooltip]=\"'FitToPage' | translate\"><mat-icon>fullscreen_exit</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"!diagram.historyManager?.canUndo\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"!diagram.historyManager?.canRedo\"><mat-icon>redo</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"diagram.copy()\" [bizdocTooltip]=\"'Copy' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>copy</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.paste()\" [bizdocTooltip]=\"'Paste' | translate\"><mat-icon>paste</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"pan()\" [bizdocTooltip]=\"'Pan' | translate\"><span class=\"e-icons sf-icon-pan\"></span></button>\r\n <button mat-icon-button (click)=\"cursor()\" [bizdocTooltip]=\"'Cursor' | translate\"><span class=\"e-icons sf-icon-cursor\"></span></button>\r\n <span class=\"divider\"></span>\r\n <button mat-icon-button (click)=\"addText()\" [bizdocTooltip]=\"'Text' | translate\"><mat-icon>title</mat-icon></button>\r\n <button mat-button [matMenuTriggerFor]=\"lineMenu\" [disabled]=\"diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'ConnectorMode'|translate\">\r\n <span class=\"e-menu-icon\" [ngClass]=\"{'sf-icon-straight-line': connectorType === 'Straight',\r\n 'sf-icon-orthogonal-line': connectorType === 'Orthogonal',\r\n 'sf-icon-beizer-line': connectorType === 'Bezier'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #lineMenu panelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"connectorTypeChange('Straight')\">\r\n <span class=\"e-menu-icon sf-icon-straight-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Orthogonal')\">\r\n <span class=\"e-menu-icon sf-icon-orthogonal-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Bezier')\">\r\n <span class=\"e-menu-icon sf-icon-beizer-line\"></span>\r\n </button>\r\n </mat-menu>\r\n &nbsp;\r\n <button mat-button [matMenuTriggerFor]=\"alignMenu\" [disabled]=\"diagram.selectedItems?.nodes.length === 0 && diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'Align'|translate\">\r\n <span class=\"e-icons\" [ngClass]=\"{'sf-icon-top': alignment === 'Top',\r\n 'sf-icon-left': alignment === 'Left',\r\n 'sf-icon-center': alignment === 'Center',\r\n 'sf-icon-bottom': alignment === 'Bottom',\r\n 'sf-icon-right': alignment === 'Right'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #alignMenu panelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"align('Top')\">\r\n <span class=\"e-icons sf-icon-top\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Left')\">\r\n <span class=\"e-icons sf-icon-left\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Center')\">\r\n <span class=\"e-icons sf-icon-center\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Bottom')\">\r\n <span class=\"e-icons sf-icon-bottom\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Right')\">\r\n <span class=\"e-icons sf-icon-right\"></span>\r\n </button>\r\n </mat-menu>\r\n</mat-toolbar>\r\n<div class=\"row container\">\r\n <div id=\"symbolpalette\" [style.display]=\"tools?'':'none'\">\r\n <div dir=\"ltr\" #symbolPaletteEl>\r\n </div>\r\n </div>\r\n <div #diagramEl id=\"diagram\" fxFlex dir=\"ltr\">\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;height:100%}.container{flex-grow:1;overflow-y:auto}#diagram{flex-grow:1}#symbolpalette{width:210px}::ng-deep .e-rtl{direction:ltr}::ng-deep .mat-toolbar .mat-button-toggle{background:transparent!important}.e-menu-icon{font-family:diagram-icons!important;speak:none;font-size:18px;font-style:normal;font-weight:400;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::ng-deep .icon-menu-panel{min-width:0}.tools-divider:after{content:\"|\";opacity:.6;margin:0 2px}\n"] }]
578
+ }, template: "<mat-toolbar>\r\n <button mat-icon-button (click)=\"tools = !tools\" [bizdocTooltip]=\"'Collapse' | translate\"><mat-icon>view_sidebar</mat-icon></button>\r\n <button mat-button (click)=\"save()\" color=\"primary\" [disabled]=\"!dirty || saving\">{{'SaveChanges' | translate}}</button>\r\n <button mat-icon-button (click)=\"diagram.fitToPage()\" [bizdocTooltip]=\"'FitToPage' | translate\"><mat-icon>fullscreen_exit</mat-icon></button>\r\n <button mat-icon-button (click)=\"pan()\" [bizdocTooltip]=\"'Pan' | translate\"><span class=\"e-icons sf-icon-pan\"></span></button>\r\n <button mat-icon-button (click)=\"cursor()\" [bizdocTooltip]=\"'Cursor' | translate\"><span class=\"e-icons sf-icon-cursor\"></span></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"diagram.undo()\" [bizdocTooltip]=\"'Undo' | translate\" [disabled]=\"!diagram.historyManager?.canUndo\"><mat-icon>undo</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.redo()\" [bizdocTooltip]=\"'Redo' | translate\" [disabled]=\"!diagram.historyManager?.canRedo\"><mat-icon>redo</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-icon-button (click)=\"diagram.copy()\" [bizdocTooltip]=\"'Copy' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>copy</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.paste()\" [bizdocTooltip]=\"'Paste' | translate\"><mat-icon>paste</mat-icon></button>\r\n <button mat-icon-button (click)=\"diagram.remove()\" [bizdocTooltip]=\"'Remove' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>delete</mat-icon></button>\r\n <span class=\"tools-divider\"></span>\r\n <button mat-button [matMenuTriggerFor]=\"lineMenu\" [disabled]=\"diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'ConnectorMode'|translate\">\r\n <span class=\"e-menu-icon\" [ngClass]=\"{'sf-icon-straight-line': connectorType === 'Straight',\r\n 'sf-icon-orthogonal-line': connectorType === 'Orthogonal',\r\n 'sf-icon-beizer-line': connectorType === 'Bezier'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #lineMenu overlayPanelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"connectorTypeChange('Straight')\">\r\n <span class=\"e-menu-icon sf-icon-straight-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Orthogonal')\">\r\n <span class=\"e-menu-icon sf-icon-orthogonal-line\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"connectorTypeChange('Bezier')\">\r\n <span class=\"e-menu-icon sf-icon-beizer-line\"></span>\r\n </button>\r\n <!--<ng-container *ngIf=\"connectors.length\">\r\n < bizdoc-color-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ bizdoc-color-picker>\r\n <ng-container *ngIf=\"nodes[0].annotations.length\">\r\n < bizdoc-color-picker (valueChanges)='colorChange($event)' [label]=\"'Color'|translate\"></ bizdoc-color-picker>\r\n </ng-container>\r\n < bizdoc-color-picker (valueChanges)='bgChange($event)' [label]=\"'Background'|translate\"></ bizdoc-color-picker>\r\n < bizdoc-color-picker (valueChanges)='strokeChange($event)' [label]=\"'Stroke'|translate\"></ bizdoc-color-picker>\r\n </ng-container>-->\r\n </mat-menu>\r\n &nbsp;\r\n <button mat-button [matMenuTriggerFor]=\"alignMenu\" [disabled]=\"diagram.selectedItems?.nodes.length === 0 && diagram.selectedItems?.connectors.length === 0\" [bizdocTooltip]=\"'Align'|translate\">\r\n <span class=\"e-icons\" [ngClass]=\"{'sf-icon-top': alignment === 'Top',\r\n 'sf-icon-left': alignment === 'Left',\r\n 'sf-icon-center': alignment === 'Center',\r\n 'sf-icon-bottom': alignment === 'Bottom',\r\n 'sf-icon-right': alignment === 'Right'}\"></span>\r\n <mat-icon>arrow_drop_down</mat-icon>\r\n </button>\r\n <mat-menu #alignMenu overlayPanelClass=\"icon-menu-panel\">\r\n <button mat-menu-item (click)=\"align('Top')\">\r\n <span class=\"e-icons sf-icon-top\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Left')\">\r\n <span class=\"e-icons sf-icon-left\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Center')\">\r\n <span class=\"e-icons sf-icon-center\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Right')\">\r\n <span class=\"e-icons sf-icon-right\"></span>\r\n </button>\r\n <button mat-menu-item (click)=\"align('Bottom')\">\r\n <span class=\"e-icons sf-icon-bottom\"></span>\r\n </button>\r\n </mat-menu>\r\n <button mat-icon-button (click)=\"boldChange()\" [bizdocTooltip]=\"'Bold' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>format_bold</mat-icon></button>\r\n <button mat-icon-button (click)=\"italicChange()\" [bizdocTooltip]=\"'Italic' | translate\" [disabled]=\"diagram.selectedItems?.connectors.length === 0 && diagram.selectedItems?.nodes.length === 0\"><mat-icon>format_italic</mat-icon></button>\r\n <button mat-icon-button [matMenuTriggerFor]=\"sizeMenu\"\r\n [disabled]=\"diagram.selectedItems?.nodes.length === 0 && diagram.selectedItems?.connectors.length === 0\"\r\n [bizdocTooltip]=\"'FontSize'|translate\">\r\n <mat-icon>format_size</mat-icon>\r\n </button>\r\n <mat-menu #sizeMenu overlayPanelClass=\"icon-menu-panel\">\r\n <button mat-menu-item *ngFor=\"let size of fontSizes\" (click)=\"fontSizeChange(size)\">\r\n {{size}}\r\n </button>\r\n </mat-menu>\r\n <span class=\"divider\"></span>\r\n</mat-toolbar>\r\n<div class=\"row container\">\r\n <div id=\"symbolpalette\" [style.display]=\"tools?'':'none'\">\r\n <div dir=\"ltr\" #symbolPaletteEl>\r\n </div>\r\n </div>\r\n <div #diagramEl id=\"diagram\" fxFlex dir=\"ltr\">\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;height:100%}.container{flex-grow:1;overflow-y:auto}#diagram{flex-grow:1}#symbolpalette{width:210px}::ng-deep .e-rtl{direction:ltr}::ng-deep .mat-toolbar .mat-button-toggle{background:transparent!important}.e-menu-icon{font-family:diagram-icons!important;speak:none;font-size:18px;font-style:normal;font-weight:400;font-feature-settings:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::ng-deep .mat-menu-panel{min-width:0!important}.tools-divider:after{content:\"|\";opacity:.6;margin:0 2px}\n"] }]
431
579
  }], ctorParameters: function () { return [{ type: i1.PromptService }, { type: i2.FormService }, { type: i3.PaneRef }, { type: i4.PanesRouter }, { type: i5.SessionService }, { type: i6.TranslateService }]; }, propDecorators: { symbolPaletteEl: [{
432
580
  type: ViewChild,
433
581
  args: ['symbolPaletteEl', { static: true }]
@@ -438,4 +586,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.9", ngImpor
438
586
  type: HostListener,
439
587
  args: ['document:keydown', ['$event']]
440
588
  }] } });
441
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9hZG1pbi9mb3JtL3dvcmtmbG93L3dvcmtmbG93LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vZm9ybS93b3JrZmxvdy93b3JrZmxvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBYSxZQUFZLEVBQXFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxrQkFBa0IsRUFBbUIsbUJBQW1CLEVBQTRDLG9CQUFvQixFQUE2QixlQUFlLEVBQ3BLLE9BQU8sRUFBYSxRQUFRLEVBQW1FLElBQUksRUFBMEIsWUFBWSxFQUFFLG9CQUFvQixFQUF1RSxhQUFhLEVBQUUsWUFBWSxFQUNqUSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxRQUFRLEVBQzlDLE1BQU0sMEJBQTBCLENBQUM7QUFRbEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDZCQUE2QixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFDeEUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUVuQyxTQUFTLFFBQVE7SUFDZixNQUFNLEtBQUssR0FBcUI7UUFDOUIsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFF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QUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNOLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDM0IsQ0FBQzs7OEdBaldVLGlCQUFpQjtrR0FBakIsaUJBQWlCLG9ZQ25GOUIsZ3NJQWtFQTsyRkRpQmEsaUJBQWlCO2tCQVQ3QixTQUFTOytCQUNFLGlCQUFpQixRQUdyQjt3QkFDSixLQUFLLEVBQUUsTUFBTTtxQkFDZDswT0FNK0MsZUFBZTtzQkFBOUQsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ0osU0FBUztzQkFBbEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQThSeEMsbUJBQW1CO3NCQURsQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBWaWV3Q2hpbGQsIE9uRGVzdHJveSwgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBPbkluaXQsIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7XHJcbiAgRGlhZ3JhbUNvbnN0cmFpbnRzLCBVc2VySGFuZGxlTW9kZWwsIFNlbGVjdG9yQ29uc3RyYWludHMsIFRvb2xCYXNlLCBNb3VzZUV2ZW50QXJncywgQ29ubmVjdG9yTW9kZWwsIENvbm5lY3RvckRyYXdpbmdUb29sLCBUZXh0TW9kZWwsIFBvaW50UG9ydE1vZGVsLCBOb2RlQ29uc3RyYWludHMsIFNjcm9sbFNldHRpbmdzTW9kZWwsXHJcbiAgRGlhZ3JhbSwgTm9kZU1vZGVsLCBVbmRvUmVkbywgU3ltYm9sSW5mbywgSURyYWdFbnRlckV2ZW50QXJncywgU25hcFNldHRpbmdzTW9kZWwsIE1hcmdpbk1vZGVsLCBOb2RlLCBQYWxldHRlTW9kZWwsIFNlZ21lbnRzLCBEaWFncmFtVG9vbHMsIENvbm5lY3RvckNvbnN0cmFpbnRzLCBTZWxlY3Rvck1vZGVsLCBSdWxlclNldHRpbmdzTW9kZWwsIEFsaWdubWVudE9wdGlvbnMsIFRleHRTdHlsZU1vZGVsLCBTeW1ib2xQYWxldHRlLCBCcG1uRGlhZ3JhbXMsIERhdGFCaW5kaW5nLFxyXG4gIENvbm5lY3RvckVkaXRpbmcsIENvbm5lY3RvckJyaWRnaW5nLCBTbmFwcGluZ1xyXG59IGZyb20gJ0BzeW5jZnVzaW9uL2VqMi1kaWFncmFtcyc7XHJcbmltcG9ydCB7IEZvcm0gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uL2Zvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Byb21wdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYW5lUmVmIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zbG90cy9wYW5lLXJlZic7XHJcbmltcG9ydCB7IFBhbmVzUm91dGVyIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zbG90cy9yb3V0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93Tm9kZUNvbXBvbmVudCB9IGZyb20gJy4vbm9kZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBZG1pbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2FkbWluLWRpc21pc3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE9wZW5Qb2xpY3kgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBJU2VsZWN0aW9uQ2hhbmdlRXZlbnRBcmdzIH0gZnJvbSAnQHN5bmNmdXNpb24vZWoyLWFuZ3VsYXItZGlhZ3JhbXMnO1xyXG5cclxuRGlhZ3JhbS5JbmplY3QoVW5kb1JlZG8sIENvbm5lY3RvckJyaWRnaW5nLCBDb25uZWN0b3JFZGl0aW5nLCBTbmFwcGluZyk7XHJcblN5bWJvbFBhbGV0dGUuSW5qZWN0KEJwbW5EaWFncmFtcyk7XHJcblxyXG5mdW5jdGlvbiBnZXRQb3J0cygpOiBQb2ludFBvcnRNb2RlbFtdIHtcclxuICBjb25zdCBwb3J0czogUG9pbnRQb3J0TW9kZWxbXSA9IFtcclxuICAgIHsgaWQ6ICdwb3J0MScsIHNoYXBlOiAnQ2lyY2xlJywgb2Zmc2V0OiB7IHg6IDAsIHk6IDAuNSB9IH0sXHJcbiAgICB7IGlkOiAncG9ydDInLCBzaGFwZTogJ0NpcmNsZScsIG9mZnNldDogeyB4OiAwLjUsIHk6IDEgfSB9LFxyXG4gICAgeyBpZDogJ3BvcnQzJywgc2hhcGU6ICdDaXJjbGUnLCBvZmZzZXQ6IHsgeDogMSwgeTogMC41IH0gfSxcclxuICAgIHsgaWQ6ICdwb3J0NCcsIHNoYXBlOiAnQ2lyY2xlJywgb2Zmc2V0OiB7IHg6IDAuNSwgeTogMCB9IH1cclxuICBdO1xyXG4gIHJldHVybiBwb3J0cztcclxufVxyXG5cclxuZnVuY3Rpb24gc2hvd1BhbGV0dGVJY29uKCk6IHZvaWQge1xyXG4gIGNvbnN0IHBhbGV0dGVTcGFjZTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFsZXR0ZS1zcGFjZScpO1xyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6NTUwcHgpJykubWF0Y2hlcztcclxuICBpZiAoaXNNb2JpbGUpIHtcclxuICAgIGlmICghcGFsZXR0ZVNwYWNlLmNsYXNzTGlzdC5jb250YWlucygnc2ItbW9iaWxlLXBhbGV0dGUtb3BlbicpKSB7XHJcbiAgICAgIHBhbGV0dGVTcGFjZS5jbGFzc0xpc3QuYWRkKCdzYi1tb2JpbGUtcGFsZXR0ZS1vcGVuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYWxldHRlU3BhY2UuY2xhc3NMaXN0LnJlbW92ZSgnc2ItbW9iaWxlLXBhbGV0dGUtb3BlbicpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcGFsZXR0ZUljb25DbGljaygpIHtcclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOjU1MHB4KScpLm1hdGNoZXM7XHJcbiAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICBjb25zdCBwYWxldHRlSWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWxldHRlLWljb24nKTtcclxuICAgIGlmIChwYWxldHRlSWNvbikge1xyXG4gICAgICBwYWxldHRlSWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dQYWxldHRlSWNvbiwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuLy9EZWZpbmVzIHRoZSB0b29sXHJcbmNsYXNzIERyYXdUb29sIGV4dGVuZHMgQ29ubmVjdG9yRHJhd2luZ1Rvb2wge1xyXG4gIHB1YmxpYyBtb3VzZU1vdmUoYXJnczogTW91c2VFdmVudEFyZ3MpOiBib29sZWFuIHtcclxuICAgIGlmICh0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5ub2Rlcy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5kaWFncmFtLmRyYXdpbmdPYmplY3QgPSB7XHJcbiAgICAgICAgdHlwZTogdGhpcy5zZWdtZW50cyB8fCAnQmV6aWVyJyxcclxuICAgICAgICBzb3VyY2VJRDogdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMubm9kZXNbMF0uaWRcclxuICAgICAgfTtcclxuICAgICAgdGhpcy5pbkFjdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBjb25zdCBvayA9IHN1cGVyLm1vdXNlTW92ZShhcmdzKTtcclxuICAgIHJldHVybiBvaztcclxuICB9XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWFncmFtOiBEaWFncmFtLCBwcml2YXRlIHNlZ21lbnRzOiBTZWdtZW50cykge1xyXG4gICAgc3VwZXIoZGlhZ3JhbS5jb21tYW5kSGFuZGxlciwgJ0Nvbm5lY3RvclNvdXJjZUVuZCcsIG51bGwpO1xyXG4gIH1cclxufVxyXG5jb25zdCBMSU5LX1BBVEggPSAnTTM0Ni43LDcxNC42bDM2OC4xLTM2OC4xYzE3LjktMTcuOSwxNy45LTQ3LjEsMC02NC45Yy0xNy45LTE3LjktNDcuMS0xNy45LTY0LjksMGwtMzY4LDM2OGMtMTcuOSwxNy45LTE3LjksNDcuMSwwLDY0LjlDMjk5LjYsNzMyLjUsMzI4LjksNzMyLjUsMzQ2LjcsNzE0LjZ6IE00NjguMiw2NTFjNi40LDksNy42LDE4LjUsNy42LDIzLjhjMCw2LjMtMS41LDE4LjYtMTEuOCwyOC45TDI3MSw4OTYuNWMtMTAuMywxMC4zLTIyLjUsMTEuOC0yOC45LDExLjhjLTYuMywwLTE4LjYtMS41LTI4LjktMTEuOEwxMDMuNSw3ODYuOGMtMTAuMy0xMC4zLTExLjgtMjIuNS0xMS44LTI4LjljMC02LjQsMS41LTE4LjYsMTEuOC0yOC45bDE5Mi45LTE5Mi45YzEwLjMtMTAuMywyMi41LTExLjgsMjguOS0xMS44YzQuNSwwLDExLjgsMC44LDE5LjMsNC44bDU4LjYtNTguNmMtNDgtMzkuNi0xMTkuNi0zNi45LTE2NC41LDcuOUw0NS43LDY3MS4zYy00Ny43LDQ3LjctNDcuNywxMjUuNSwwLDE3My4ybDEwOS43LDEwOS43YzQ3LjcsNDcuNywxMjUuNSw0Ny43LDE3My4yLDBsMTkyLjktMTkyLjljNDYtNDYsNDcuNi0xMjAuNCw0LjYtMTY4LjRMNDY4LjIsNjUxeiBNOTU0LjIsMTU1LjVMODQ0LjUsNDUuOEM3OTYuOS0xLjksNzE5LTEuOSw2NzEuMyw0NS44TDQ3OC40LDIzOC43Yy00NC44LDQ0LjgtNDcuNSwxMTYuNS03LjksMTY0LjVsNTguNi01OC42Yy00LTcuNi00LjgtMTQuOS00LjgtMTkuM2MwLTYuMywxLjUtMTguNiwxMS44LTI4LjlsMTkyLjktMTkyLjljMTAuMy0xMC4zLDIyLjUtMTEuOCwyOC45LTExLjhjNi4zLDAsMTguNiwxLjUsMjguOSwxMS44bDEwOS43LDEwOS43YzEwLjMsMTAuMywxMS44LDIyLjUsMTEuOCwyOC45YzAsNi4zLTEuNSwxOC42LTExLjgsMjguOUw3MDMuNyw0NjRjLTEwLjMsMTAuMy0yMi41LDExLjgtMjguOSwxMS44Yy01LjMsMC0xNC44LTEuMS0yMy44LTcuNmwtNTgsNThjNDgsNDMsMTIyLjMsNDEuNSwxNjguNC00LjZsMTkyLjktMTkyLjlDMTAwMS45LDI4MS4xLDEwMDEuOSwyMDMuMSw5NTQuMiwxNTUuNXonO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiaXpkb2Mtd29ya2Zsb3cnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JrZmxvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vd29ya2Zsb3cuY29tcG9uZW50LnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICBjbGFzczogJ3BhbmUnXHJcbiAgfVxyXG59KVxyXG4vKiogd29ya2Zsb3cgY29tcG9uZW50Ki9cclxuZXhwb3J0IGNsYXNzIFdvcmtmbG93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIEFkbWluQ29tcG9uZW50IHtcclxuICBzeW1ib2xQYWxldHRlOiBTeW1ib2xQYWxldHRlO1xyXG4gIGRpYWdyYW06IERpYWdyYW07XHJcbiAgQFZpZXdDaGlsZCgnc3ltYm9sUGFsZXR0ZUVsJywgeyBzdGF0aWM6IHRydWUgfSkgc3ltYm9sUGFsZXR0ZUVsOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ2RpYWdyYW1FbCcsIHsgc3RhdGljOiB0cnVlIH0pIGRpYWdyYW1FbDogRWxlbWVudFJlZjtcclxuICB0b29scyA9IHRydWU7XHJcbiAgY29ubmVjdG9yVHlwZTogU2VnbWVudHMgPSAnQmV6aWVyJztcclxuICBhbGlnbm1lbnQ6IEFsaWdubWVudE9wdGlvbnMgPSAnQ2VudGVyJztcclxuICBmb250U2l6ZSA9IDEyO1xyXG4gIHB1YmxpYyBnZXRUb29sKGFjdGlvbjogc3RyaW5nKTogVG9vbEJhc2Uge1xyXG4gICAgbGV0IHRvb2w6IFRvb2xCYXNlID0gbnVsbDtcclxuICAgIGlmIChhY3Rpb24gPT09ICdjb25uZWN0JylcclxuICAgICAgdG9vbCA9IG5ldyBEcmF3VG9vbCh0aGlzLmRpYWdyYW0sIHRoaXMuY29ubmVjdG9yVHlwZSk7XHJcbiAgICByZXR1cm4gdG9vbDtcclxuICB9XHJcbiAgc2F2aW5nID0gZmFsc2U7XHJcbiAgZWxlbWVudD86IGFueTtcclxuICBkaXJ0eSA9IGZhbHNlO1xyXG4gIHBhcmFtczoge307XHJcbiAgcGFsZXR0ZXM6IFBhbGV0dGVNb2RlbFtdID0gW107XHJcbiAgZGlhZ3JhbUNvbnN0cmFpbnRzOiBEaWFncmFtQ29uc3RyYWludHMgPSBEaWFncmFtQ29uc3RyYWludHMuRGVmYXVsdCB8IERpYWdyYW1Db25zdHJhaW50cy5CcmlkZ2luZyB8IERpYWdyYW1Db25zdHJhaW50cy5Vc2VySW50ZXJhY3Rpb24gfCBEaWFncmFtQ29uc3RyYWludHMuWm9vbTtcclxuICBkaWFncmFtVG9vbDogRGlhZ3JhbVRvb2xzID0gRGlhZ3JhbVRvb2xzLkRlZmF1bHQ7XHJcbiAgLy9EZWZpbmVzIHRoZSB1c2VyIGhhbmRsZSBjb2xsZWN0aW9uIGZvciBub2RlcyBpbiBkaWFncmFtXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfdXNlckhhbmRsZXM6IFVzZXJIYW5kbGVNb2RlbFtdID0gW1xyXG4gICAge1xyXG4gICAgICBuYW1lOiAnY29ubmVjdCcsXHJcbiAgICAgIHBhdGhEYXRhOiBMSU5LX1BBVEgsXHJcbiAgICAgIHZpc2libGU6IHRydWUsXHJcbiAgICAgIG9mZnNldDogMCxcclxuICAgICAgc2lkZTogJ1JpZ2h0JyxcclxuICAgICAgZGlzcGxhY2VtZW50OiAyMCxcclxuICAgICAgbWFyZ2luOiB7IHRvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCB9XHJcbiAgICB9XHJcbiAgXTtcclxuICAvL1N5bWJvbFBhbGV0dGUgUHJvcGVydGllc1xyXG4gIHJlYWRvbmx5IHN5bWJvbE1hcmdpbjogTWFyZ2luTW9kZWwgPSB7IGxlZnQ6IDEwLCByaWdodDogMTAsIHRvcDogMTAsIGJvdHRvbTogMTAgfTtcclxuICByZWFkb25seSBzbmFwU2V0dGluZ3M6IFNuYXBTZXR0aW5nc01vZGVsID0ge1xyXG4gIH07XHJcbiAgcmVhZG9ubHkgc2VsZWN0ZWRJdGVtczogU2VsZWN0b3JNb2RlbCA9IHtcclxuICB9O1xyXG4gIHJlYWRvbmx5IHNjcm9sbFNldHRpbmdzOiBTY3JvbGxTZXR0aW5nc01vZGVsID0ge1xyXG4gICAgbWluWm9vbTogLjUsXHJcbiAgICBtYXhab29tOiAyLjVcclxuICB9O1xyXG4gIHByaXZhdGUgX3J1bGVyQ29sb3IgPSB0aGlzLl9zZXNzaW9uLmdldEFjY2VudCgxMDApO1xyXG4gIHJlYWRvbmx5IHJ1bGVyU2V0dGluZ3M6IFJ1bGVyU2V0dGluZ3NNb2RlbCA9IHtcclxuICAgIGhvcml6b250YWxSdWxlcjogeyBtYXJrZXJDb2xvcjogdGhpcy5fcnVsZXJDb2xvciB9LFxyXG4gICAgdmVydGljYWxSdWxlcjogeyBtYXJrZXJDb2xvcjogdGhpcy5fcnVsZXJDb2xvciB9XHJcbiAgfTtcclxuICBwcml2YXRlIF9mb3JtOiBGb3JtO1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIC8qKiB3b3JrZmxvdyBjdG9yICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwczogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IEZvcm1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGFuZTogUGFuZVJlZjxXb3JrZmxvd0NvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFBhbmVzUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgIHRoaXMuX3BhbGV0dGVzKCk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnN5bWJvbFBhbGV0dGUgPSBuZXcgU3ltYm9sUGFsZXR0ZSh7XHJcbiAgICAgIGV4cGFuZE1vZGU6ICdNdWx0aXBsZScsXHJcbiAgICAgIHBhbGV0dGVzOiB0aGlzLnBhbGV0dGVzLFxyXG4gICAgICB3aWR0aDogXCIxMDAlXCIsIGhlaWdodDogXCIxMDAlXCIsIHN5bWJvbEhlaWdodDogODAsXHJcbiAgICAgIGVuYWJsZVJ0bDogZmFsc2UsIGVuYWJsZUFuaW1hdGlvbjogZmFsc2UsIHN5bWJvbFdpZHRoOiA4MCxcclxuICAgICAgc3ltYm9sTWFyZ2luOiB0aGlzLnN5bWJvbE1hcmdpbixcclxuICAgICAgZ2V0U3ltYm9sSW5mbzogdGhpcy5nZXRTeW1ib2xJbmZvLmJpbmQodGhpcyksXHJcbiAgICAgIGdldE5vZGVEZWZhdWx0czogdGhpcy5nZXRTeW1ib2xEZWZhdWx0cy5iaW5kKHRoaXMpXHJcbiAgICB9KTtcclxuICAgIHRoaXMuc3ltYm9sUGFsZXR0ZS5hcHBlbmRUbyh0aGlzLnN5bWJvbFBhbGV0dGVFbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMuZGlhZ3JhbSA9IG5ldyBEaWFncmFtKHtcclxuICAgICAgd2lkdGg6IFwiMTAwJVwiLCBoZWlnaHQ6IFwiMTAwJVwiLFxyXG4gICAgICBzbmFwU2V0dGluZ3M6IHRoaXMuc25hcFNldHRpbmdzLFxyXG4gICAgICBnZXRDb25uZWN0b3JEZWZhdWx0czogdGhpcy5jb25uRGVmYXVsdHMuYmluZCh0aGlzKSxcclxuICAgICAgY29uc3RyYWludHM6IHRoaXMuZGlhZ3JhbUNvbnN0cmFpbnRzLFxyXG4gICAgICB0b29sOiB0aGlzLmRpYWdyYW1Ub29sLFxyXG4gICAgICBnZXROb2RlRGVmYXVsdHM6IHRoaXMubm9kZURlZmF1bHRzLmJpbmQodGhpcyksXHJcbiAgICAgIGdldEN1c3RvbVRvb2w6IHRoaXMuZ2V0VG9vbC5iaW5kKHRoaXMpLFxyXG4gICAgICBzY3JvbGxTZXR0aW5nczogdGhpcy5zY3JvbGxTZXR0aW5ncyxcclxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5zZWxlY3RlZEl0ZW1zLFxyXG4gICAgICBydWxlclNldHRpbmdzOiB0aGlzLnJ1bGVyU2V0dGluZ3MsXHJcbiAgICAgIGRyYWdFbnRlcjogdGhpcy5kcmFnRW50ZXIuYmluZCh0aGlzKSxcclxuICAgICAgY29ubmVjdGlvbkNoYW5nZTogdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgICAgY29sbGVjdGlvbkNoYW5nZTogdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgICAgcHJvcGVydHlDaGFuZ2U6IHRoaXMucHJvcGVydHlDaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgICAgc2VsZWN0aW9uQ2hhbmdlOiB0aGlzLnNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpLFxyXG4gICAgfSwgdGhpcy5kaWFncmFtRWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICBwYWxldHRlSWNvbkNsaWNrKCk7XHJcbiAgICB0aGlzLl9wYW5lLnBhcmFtc0NoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKHAgPT4ge1xyXG4gICAgICBjb25zdCBpZCA9IHBbJ2lkJ107XHJcbiAgICAgIHRoaXMuX2Zvcm0gPSB0aGlzLl9zZXNzaW9uLnByb2ZpbGUuZm9ybXMuZmluZChmID0+IGYubmFtZSA9PT0gaWQpO1xyXG4gICAgICB0aGlzLl9wYW5lLnRpdGxlID0gdGhpcy5fZm9ybS50aXRsZTtcclxuICAgICAgdGhpcy5wYXJhbXMgPSB7IGlkOiB0aGlzLl9mb3JtLm5hbWUgfTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fcGFuZS5kYXRhQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoZCA9PiB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fZm9ybSwgZC5mb3JtKTtcclxuICAgICAgY29uc3QgZmxvdyA9IHRoaXMuX2Zvcm0ud29ya2Zsb3c7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5ub2RlcyA9IGZsb3cubm9kZXM7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5jb25uZWN0b3JzID0gZmxvdy5jb25uZWN0b3JzO1xyXG4gICAgICB0aGlzLmRpYWdyYW0uZGF0YUJpbmQoKTtcclxuICAgICAgdGhpcy5kaWFncmFtLmFkZCh0aGlzLl92ZXJzaW9uTm9kZShmbG93LnZlcnNpb24pKTtcclxuICAgICAgdGhpcy5kaWFncmFtLmZpdFRvUGFnZSgpO1xyXG4gICAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3BhbmUucmVzaXplZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5yZWZyZXNoKCkpO1xyXG4gIH1cclxuICBwcml2YXRlIF9wYWxldHRlcygpIHtcclxuICAgIHRoaXMuX3Nlc3Npb24ucHJvZmlsZS5ub2Rlcy5mb3JFYWNoKG4gPT4ge1xyXG4gICAgICBjb25zdCBub2RlOiBOb2RlTW9kZWwgPSB7XHJcbiAgICAgICAgaWQ6IG4ubmFtZSxcclxuICAgICAgICBzaGFwZTogbi5zaGFwZSxcclxuICAgICAgICBhZGRJbmZvOiB7XHJcbiAgICAgICAgICBub2RlVHlwZTogbi5uYW1lLFxyXG4gICAgICAgICAgdGl0bGU6IG4udGl0bGVcclxuICAgICAgICB9LFxyXG4gICAgICB9O1xyXG4gICAgICAobm9kZSBhcyBhbnkpLm5vZGUgPSBuLm5hbWU7XHJcbiAgICAgIGxldCBwYWxldHRlID0gdGhpcy5wYWxldHRlcy5maW5kKHAgPT4gcC50aXRsZSA9PT0gKG4ucGFsZXR0ZSB8fCAnJykpO1xyXG4gICAgICBpZiAoIXBhbGV0dGUpIHtcclxuICAgICAgICBwYWxldHRlID0geyBpZDogYF8ke24ucGFsZXR0ZX1gLCBleHBhbmRlZDogdHJ1ZSwgdGl0bGU6IG4ucGFsZXR0ZSB8fCAnJywgc3ltYm9sczogW10gfTtcclxuICAgICAgICB0aGlzLnBhbGV0dGVzLnB1c2gocGFsZXR0ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcGFsZXR0ZS5zeW1ib2xzLnB1c2gobm9kZSk7XHJcbiAgICB9KTtcclxuICAgIC8vdGhpcy5wYWxldHRlcy5wdXNoKHsgaWQ6ICdkZXNpZ24nLCB0aXRsZTogdGhpcy5fdHJhbnNsYXRpb24uZ2V0KCdEZXNpZ24nKSwgc3ltYm9sczogW3sgaWQ6ICd0ZXh0Jywgc2hhcGU6IHsgdHlwZTogJ1RleHQnLCB0ZXh0Q29udGVudDogJ1QnIH0sIGFkZEluZm86IHsgdGl0bGU6IHRoaXMuX3RyYW5zbGF0aW9uLmdldCgnVGV4dCcpIH0gfV0gfSk7XHJcbiAgICAvKnRoaXMucGFsZXR0ZXMucHVzaChzd2ltbGFuZSApOyovXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF92ZXJzaW9uTm9kZSh2ZXJzaW9uOiBudW1iZXIpOiBOb2RlTW9kZWwge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6ICd2ZXJzaW9uJyxcclxuICAgICAgc2hhcGU6IHtcclxuICAgICAgICB0eXBlOiAnVGV4dCcsXHJcbiAgICAgICAgY29udGVudDogdGhpcy5fdHJhbnNsYXRlLmdldCgnRGlhZ3JhbVZlcnNpb24nLCB2ZXJzaW9uIHx8IDApXHJcbiAgICAgIH0sXHJcbiAgICAgIG9mZnNldFk6IDUsXHJcbiAgICAgIG9mZnNldFg6IDUsXHJcbiAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgZm9udFNpemU6IDUwLFxyXG4gICAgICAgIGNvbG9yOiB0aGlzLl9zZXNzaW9uLnRoZW1lLmRhcmsgPyAnd2hpdGUnIDogJ2JsYWNrJyxcclxuICAgICAgICBvcGFjaXR5OiAuMVxyXG4gICAgICB9IGFzIFRleHRTdHlsZU1vZGVsLFxyXG4gICAgICBjb25zdHJhaW50czogTm9kZUNvbnN0cmFpbnRzLlJlYWRPbmx5LFxyXG4gICAgICB6SW5kZXg6IC0xXHJcbiAgICB9IGFzIFRleHRNb2RlbDtcclxuICB9XHJcbiAgbm9kZURlZmF1bHRzID0gKCk6IE5vZGVNb2RlbCA9PiB7XHJcbiAgICBjb25zdCBvYmo6IE5vZGVNb2RlbCA9IHtcclxuICAgICAgc3R5bGU6IHtcclxuICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLl9zZXNzaW9uLnRoZW1lLmRhcmsgPyAnd2hpdGUnIDogJ2JsYWNrJyxcclxuICAgICAgICBzdHJva2VXaWR0aDogMVxyXG4gICAgICB9LFxyXG4gICAgICBhbm5vdGF0aW9uczogW3tcclxuICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgY29sb3I6IHRoaXMuX3Nlc3Npb24udGhlbWUuZGFyayA/ICd3aGl0ZScgOiAnYmxhY2snLFxyXG4gICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50JyxcclxuICAgICAgICAgIG9wYWNpdHk6IC44XHJcbiAgICAgICAgfVxyXG4gICAgICB9XVxyXG4gICAgfTtcclxuICAgIGlmIChvYmoud2lkdGggPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBvYmoud2lkdGggPSAxNDU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCByYXRpbzogbnVtYmVyID0gMTAwIC8gb2JqLndpZHRoO1xyXG4gICAgICBvYmoud2lkdGggPSAxMDA7XHJcbiAgICAgIG9iai5oZWlnaHQgKj0gcmF0aW87XHJcbiAgICB9XHJcbiAgICBvYmouY29uc3RyYWludHMgPSBOb2RlQ29uc3RyYWludHMuRGVmYXVsdCB8IE5vZGVDb25zdHJhaW50cy5Bc3BlY3RSYXRpbztcclxuICAgIG9iai5wb3J0cyA9IGdldFBvcnRzKCk7XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuICBwdWJsaWMgY29ubkRlZmF1bHRzID0gKG9iajogQ29ubmVjdG9yTW9kZWwpOiB2b2lkID0+IHtcclxuICAgIG9iai5jb25zdHJhaW50cyA9IENvbm5lY3RvckNvbnN0cmFpbnRzLkRlZmF1bHQgfCBDb25uZWN0b3JDb25zdHJhaW50cy5CcmlkZ2luZyB8IENvbm5lY3RvckNvbnN0cmFpbnRzLkRyYWdTZWdtZW50VGh1bWI7XHJcbiAgICBvYmouc3R5bGUuc3Ryb2tlQ29sb3IgPSB0aGlzLl9zZXNzaW9uLnRoZW1lLmRhcmsgPyAnd2hpdGUnIDogJ2JsYWNrJztcclxuICB9XHJcbiAgcHVibGljIGdldFN5bWJvbEluZm8oc3ltYm9sOiBOb2RlTW9kZWwpOiBTeW1ib2xJbmZvIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZpdDogdHJ1ZSxcclxuICAgICAgdG9vbHRpcDogKHN5bWJvbC5hZGRJbmZvIGFzIGFueSkudGl0bGUsXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB7IHRleHQ6IChzeW1ib2wuYWRkSW5mbyBhcyBhbnkpLnRpdGxlLCBvdmVyZmxvdzogJ1dyYXAnLCB3cmFwOiAnV3JhcFdpdGhPdmVyZmxvdycgfVxyXG4gICAgfTtcclxuICB9XHJcbiAgcHVibGljIGdldFN5bWJvbERlZmF1bHRzKHN5bWJvbDogTm9kZU1vZGVsKTogdm9pZCB7XHJcbiAgICBzeW1ib2wud2lkdGggPSBzeW1ib2wuaGVpZ2h0ID0gNDA7XHJcbiAgICBzeW1ib2wuY29uc3RyYWludHMgPSBOb2RlQ29uc3RyYWludHMuRGVmYXVsdCB8IE5vZGVDb25zdHJhaW50cy5Bc3BlY3RSYXRpbztcclxuICB9XHJcbiAgcGFuKCkge1xyXG4gICAgdGhpcy5kaWFncmFtLmNvbnN0cmFpbnRzID0gdGhpcy5kaWFncmFtLmNvbnN0cmFpbnRzIHwgRGlhZ3JhbUNvbnN0cmFpbnRzLlBhbjtcclxuICAgIHRoaXMuZGlhZ3JhbS50b29sID0gRGlhZ3JhbVRvb2xzLlpvb21QYW47XHJcbiAgfVxyXG4gIGN1cnNvcigpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5jb25zdHJhaW50cyA9IHRoaXMuZGlhZ3JhbS5jb25zdHJhaW50cyAmIH5EaWFncmFtQ29uc3RyYWludHMuUGFuO1xyXG4gICAgdGhpcy5kaWFncmFtLnRvb2wgPSBEaWFncmFtVG9vbHMuRGVmYXVsdDtcclxuICB9XHJcbiAgc2VsZWN0aW9uQ2hhbmdlKGV2dDogSVNlbGVjdGlvbkNoYW5nZUV2ZW50QXJncykge1xyXG4gICAgY29uc3QgeyBub2RlcywgY29ubmVjdG9ycyB9ID0gdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXM7XHJcbiAgICBpZiAoY29ubmVjdG9ycy5sZW5ndGggfHwgbm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIGlmIChub2Rlcy5sZW5ndGggPT09IDEgJiYgbm9kZXNbMF0uYWRkSW5mbykge1xyXG4gICAgICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLmNvbnN0cmFpbnRzID0gU2VsZWN0b3JDb25zdHJhaW50cy5BbGwgfCBTZWxlY3RvckNvbnN0cmFpbnRzLlVzZXJIYW5kbGU7XHJcbiAgICAgICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMudXNlckhhbmRsZXMgPSB0aGlzLl91c2VySGFuZGxlcztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLmNvbnN0cmFpbnRzID0gU2VsZWN0b3JDb25zdHJhaW50cy5BbGwgXiBTZWxlY3RvckNvbnN0cmFpbnRzLlVzZXJIYW5kbGU7XHJcblxyXG4gICAgICBpZiAoY29ubmVjdG9ycy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBjb25uZWN0b3IgPSBjb25uZWN0b3JzWzBdO1xyXG4gICAgICAgIGNvbm5lY3RvcnMuZm9yRWFjaChjID0+IHsgaWYgKCFjLmFkZEluZm8pIGMuYWRkSW5mbyA9IHt9IH0pO1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSBjb25uZWN0b3IudHlwZTtcclxuICAgICAgICB0aGlzLmNvbm5lY3RvclR5cGUgPSBjb25uZWN0b3JzLmxlbmd0aCA9PT0gMSB8fCBjb25uZWN0b3JzLmV2ZXJ5KGMgPT4gYy50eXBlID09PSB0eXBlKSA/IHR5cGUgOiBudWxsO1xyXG4gICAgICAgIGlmIChjb25uZWN0b3IuYW5ub3RhdGlvbnMubGVuZ3RoKVxyXG4gICAgICAgICAgdGhpcy5mb250U2l6ZSA9IGNvbm5lY3Rvci5hbm5vdGF0aW9uc1swXS5zdHlsZS5mb250U2l6ZTtcclxuICAgICAgICB0aGlzLmNvbm5lY3RvclR5cGUgPSBjb25uZWN0b3JzLmxlbmd0aCA9PT0gMSB8fCBjb25uZWN0b3JzLmV2ZXJ5KGMgPT4gYy50eXBlID09PSB0eXBlKSA/IHR5cGUgOiBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChub2Rlcy5sZW5ndGgpIHtcclxuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbMF0sXHJcbiAgICAgICAgICBhZGRJbmZvID0gbm9kZS5hZGRJbmZvIGFzIGFueTtcclxuICAgICAgICBpZiAoYWRkSW5mbyAmJiBhZGRJbmZvLm5vZGVUeXBlKSB7XHJcbiAgICAgICAgICBpZiAobm9kZS5hbm5vdGF0aW9ucy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHRoaXMuZm9udFNpemUgPSBub2RlLmFubm90YXRpb25zWzBdLnN0eWxlLmZvbnRTaXplO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoV29ya2Zsb3dOb2RlQ29tcG9uZW50LCB7XHJcbiAgICAgICAgc3RhdGU6IHtcclxuICAgICAgICAgIG5vZGVzLCBjb25uZWN0b3JzXHJcbiAgICAgICAgfSxcclxuICAgICAgICBwb2xpY3k6IE9wZW5Qb2xpY3kuVGFiLFxyXG4gICAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxyXG4gICAgICAgIGdyb3VwOiAnJ1xyXG4gICAgICB9KS50aGVuKHAgPT4ge1xyXG4gICAgICAgIChwLmluc3RhbmNlIGFzIFdvcmtmbG93Tm9kZUNvbXBvbmVudCkuY2hhbmdlLlxyXG4gICAgICAgICAgcGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmRpYWdyYW0uZGF0YUJpbmQoKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGVsc2VcclxuICAgICAgdGhpcy5fcm91dGVyLmNvbGxhcHNlKCk7XHJcbiAgfVxyXG4gIGFsaWduKHZhbHVlOiBBbGlnbm1lbnRPcHRpb25zKSB7XHJcbiAgICBmdW5jdGlvbiBhbGlnbihuOiBOb2RlTW9kZWwgfCBDb25uZWN0b3JNb2RlbCkge1xyXG4gICAgICBuLmFubm90YXRpb25zLmxlbmd0aCAmJiBPYmplY3QuYXNzaWduKG4uYW5ub3RhdGlvbnNbMF0sIHtcclxuICAgICAgICBvZmZzZXQ6IHtcclxuICAgICAgICAgIHg6IHZhbHVlID09PSAnUmlnaHQnID8gMSA6IHZhbHVlID09PSAnTGVmdCcgPyAwIDogLjUsXHJcbiAgICAgICAgICB5OiB2YWx1ZSA9PT0gJ1RvcCcgPyAwIDogdmFsdWUgPT09ICdCb3R0b20nID8gMSA6IC41XHJcbiAgICAgICAgfSxcclxuICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogdmFsdWUgPT09ICdUb3AnID8gJ0JvdHRvbScgOiB2YWx1ZSA9PT0gJ0JvdHRvbScgPyAnVG9wJyA6ICdDZW50ZXInLFxyXG4gICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6IHZhbHVlID09PSAnUmlnaHQnID8gJ0xlZnQnIDogdmFsdWUgPT09ICdMZWZ0JyA/ICdSaWdodCcgOiAnQ2VudGVyJ1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLm5vZGVzLmZvckVhY2goYWxpZ24pO1xyXG4gICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMuY29ubmVjdG9ycy5mb3JFYWNoKGFsaWduKTtcclxuICAgIHRoaXMuYWxpZ25tZW50ID0gdmFsdWU7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgcHVibGljIGRyYWdFbnRlcihhcmdzOiBJRHJhZ0VudGVyRXZlbnRBcmdzKTogdm9pZCB7XHJcbiAgICBjb25zdCBvYmo6IE5vZGVNb2RlbCA9IGFyZ3MuZWxlbWVudCBhcyBOb2RlTW9kZWw7XHJcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgTm9kZSkge1xyXG4gICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IG9iajtcclxuICAgICAgb2JqLndpZHRoID0gMTAwO1xyXG4gICAgICBvYmouaGVpZ2h0ICo9IDEwMCAvIHdpZHRoO1xyXG4gICAgICBvYmoub2Zmc2V0WCArPSAob2JqLndpZHRoIC0gd2lkdGgpIC8gMjtcclxuICAgICAgb2JqLm9mZnNldFkgKz0gKG9iai5oZWlnaHQgLSBoZWlnaHQpIC8gMjtcclxuICAgICAgb2JqLnN0eWxlID0geyBmaWxsOiAnd2hpdGUnLCBzdHJva2VDb2xvcjogJ2JsYWNrJyB9O1xyXG4gICAgfVxyXG4gIH1cclxuICBwcm9wZXJ0eUNoYW5nZShlKSB7XHJcbiAgICBpZiAoZS5jYXVzZSAhPT0gMikgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgfVxyXG4gIGNoYW5nZSgpIHtcclxuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuICBhZGRUZXh0KCkge1xyXG4gICAgdGhpcy5kaWFncmFtLmRyYXdpbmdPYmplY3QgPSB7XHJcbiAgICAgIHNoYXBlOiB7XHJcbiAgICAgICAgdHlwZTogJ1RleHQnLFxyXG4gICAgICB9LFxyXG4gICAgICBjb25zdHJhaW50czogTm9kZUNvbnN0cmFpbnRzLkRlZmF1bHQgJiB+Tm9kZUNvbnN0cmFpbnRzLkluQ29ubmVjdCAmIH5Ob2RlQ29uc3RyYWludHMuT3V0Q29ubmVjdFxyXG4gICAgfSBhcyBOb2RlTW9kZWw7XHJcbiAgICB0aGlzLmRpYWdyYW0udG9vbCA9IERpYWdyYW1Ub29scy5EcmF3T25jZTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQ3RybC1zIHNhdmVcclxuICAgKiBAcGFyYW0gZXZlbnRcclxuICAgKi9cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5kaXJ0eSAmJiBldmVudC5jdHJsS2V5ICYmIChldmVudC53aGljaCA9PT0gODMgfHwgZXZlbnQud2hpY2ggPT09IDExNSkpIHtcclxuICAgICAgdGhpcy5zYXZlKCk7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGJnQ2hhbmdlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5ub2Rlcy5mb3JFYWNoKG4gPT4gbi5zdHlsZS5maWxsID0gdmFsKTtcclxuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuICBjb2xvckNoYW5nZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMubm9kZXMuZm9yRWFjaChuID0+IG4uYW5ub3RhdGlvbnMuZm9yRWFjaChhID0+IGEuc3R5bGUuY29sb3IgPSB2YWwpKTtcclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLmNvbm5lY3RvcnMuZm9yRWFjaChjID0+IGMuYW5ub3RhdGlvbnMuZm9yRWFjaChhID0+IGEuc3R5bGUuY29sb3IgPSB2YWwpKTtcclxuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuICBjb25uZWN0b3JUeXBlQ2hhbmdlKHR5cGU6IFNlZ21lbnRzKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5jb25uZWN0b3JzLmZvckVhY2goYyA9PiBjLnR5cGUgPSB0eXBlKTtcclxuICAgIHRoaXMuY29ubmVjdG9yVHlwZSA9IHR5cGU7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgc2l6ZUNoYW5nZSh2YWw6IHN0cmluZykge1xyXG4gICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMubm9kZXMuZm9yRWFjaChuID0+IG4uYW5ub3RhdGlvbnMuZm9yRWFjaChhID0+IGEuc3R5bGUuZm9udFNpemUgPSBwYXJzZUludCh2YWwpKSk7XHJcbiAgICB0aGlzLmRpYWdyYW0uZGF0YUJpbmQoKTtcclxuICB9XHJcbiAgc3Ryb2tlQ2hhbmdlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5jb25uZWN0b3JzLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGMuc3R5bGUuc3Ryb2tlQ29sb3IgPSB2YWw7XHJcbiAgICAgIGlmIChjLmFubm90YXRpb25zKSBjLmFubm90YXRpb25zWzBdLnN0eWxlLmNvbG9yID0gdmFsO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5ub2Rlcy5mb3JFYWNoKG4gPT4gbi5zdHlsZS5zdHJva2VDb2xvciA9IHZhbCk7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5kaWFncmFtLnNlcmlhbGl6YXRpb25TZXR0aW5ncyA9IHtwcmV2ZW50RGVmYXVsdHM6IHRydWV9O1xyXG4gICAgY29uc3Qgb2JqID0gSlNPTi5wYXJzZSh0aGlzLmRpYWdyYW0uc2F2ZURpYWdyYW0oKSk7XHJcbiAgICB0aGlzLl9mb3JtLndvcmtmbG93LmNvbm5lY3RvcnMgPSBvYmouY29ubmVjdG9ycztcclxuICAgIHRoaXMuX2Zvcm0ud29ya2Zsb3cubm9kZXMgPSBvYmoubm9kZXMuZmlsdGVyKG4gPT4gbi5pZCAhPT0gJ3ZlcnNpb24nKS5tYXAoKG46IE5vZGVNb2RlbCkgPT4ge1xyXG4gICAgICBuLm9mZnNldFggPSBNYXRoLnJvdW5kKG4ub2Zmc2V0WCk7XHJcbiAgICAgIG4ub2Zmc2V0WSA9IE1hdGgucm91bmQobi5vZmZzZXRZKTtcclxuICAgICAgcmV0dXJuIG47XHJcbiAgICB9KTtcclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnNhdmUodGhpcy5fZm9ybSkudG9Qcm9taXNlKCkudGhlbih2ID0+IHtcclxuICAgICAgdGhpcy5wcy50b2FzdCgnQ2hhbmdlc1NhdmVkJyk7XHJcbiAgICAgIGlmICh0aGlzLl9mb3JtLndvcmtmbG93LnZlcnNpb24gPCB2KSB7XHJcbiAgICAgICAgdGhpcy5wcy50b2FzdCgnRGlhZ3JhbVZlcnNpb24nLCB2KTtcclxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5kaWFncmFtLmdldE5vZGVPYmplY3QoJ3ZlcnNpb24nKTtcclxuICAgICAgICAobm9kZS5zaGFwZSBhcyBUZXh0TW9kZWwpLmNvbnRlbnQgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdEaWFncmFtVmVyc2lvbicsIHYpO1xyXG4gICAgICAgIHRoaXMuZGlhZ3JhbS5kYXRhQmluZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2Zvcm0ud29ya2Zsb3cudmVyc2lvbiA9IHY7XHJcbiAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgIH0sICgpID0+IHtcclxuICAgICAgdGhpcy5wcy5lcnJvcigpO1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zeW1ib2xQYWxldHRlPy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLmRpYWdyYW0/LmRlc3Ryb3koKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8bWF0LXRvb2xiYXI+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInRvb2xzID0gIXRvb2xzXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0NvbGxhcHNlJyB8IHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj52aWV3X3NpZGViYXI8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwic2F2ZSgpXCIgY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cIiFkaXJ0eSB8fCBzYXZpbmdcIj57eydTYXZlQ2hhbmdlcycgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkaWFncmFtLmZpdFRvUGFnZSgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0ZpdFRvUGFnZScgfCB0cmFuc2xhdGVcIj48bWF0LWljb24+ZnVsbHNjcmVlbl9leGl0PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGlhZ3JhbS51bmRvKClcIiBbYml6ZG9jVG9vbHRpcF09XCInVW5kbycgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiIWRpYWdyYW0uaGlzdG9yeU1hbmFnZXI/LmNhblVuZG9cIj48bWF0LWljb24+dW5kbzwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImRpYWdyYW0ucmVkbygpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1JlZG8nIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cIiFkaWFncmFtLmhpc3RvcnlNYW5hZ2VyPy5jYW5SZWRvXCI+PG1hdC1pY29uPnJlZG88L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxzcGFuIGNsYXNzPVwidG9vbHMtZGl2aWRlclwiPjwvc3Bhbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGlhZ3JhbS5jb3B5KClcIiBbYml6ZG9jVG9vbHRpcF09XCInQ29weScgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zPy5jb25uZWN0b3JzLmxlbmd0aCA9PT0gMCAmJiBkaWFncmFtLnNlbGVjdGVkSXRlbXM/Lm5vZGVzLmxlbmd0aCA9PT0gMFwiPjxtYXQtaWNvbj5jb3B5PC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGlhZ3JhbS5wYXN0ZSgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1Bhc3RlJyB8IHRyYW5zbGF0ZVwiPjxtYXQtaWNvbj5wYXN0ZTwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPHNwYW4gY2xhc3M9XCJ0b29scy1kaXZpZGVyXCI+PC9zcGFuPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwYW4oKVwiIFtiaXpkb2NUb29sdGlwXT1cIidQYW4nIHwgdHJhbnNsYXRlXCI+PHNwYW4gY2xhc3M9XCJlLWljb25zIHNmLWljb24tcGFuXCI+PC9zcGFuPjwvYnV0dG9uPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJjdXJzb3IoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidDdXJzb3InIHwgdHJhbnNsYXRlXCI+PHNwYW4gY2xhc3M9XCJlLWljb25zIHNmLWljb24tY3Vyc29yXCI+PC9zcGFuPjwvYnV0dG9uPlxyXG4gIDxzcGFuIGNsYXNzPVwiZGl2aWRlclwiPjwvc3Bhbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYWRkVGV4dCgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1RleHQnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPnRpdGxlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cImxpbmVNZW51XCIgW2Rpc2FibGVkXT1cImRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8uY29ubmVjdG9ycy5sZW5ndGggPT09IDBcIiBbYml6ZG9jVG9vbHRpcF09XCInQ29ubmVjdG9yTW9kZSd8dHJhbnNsYXRlXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImUtbWVudS1pY29uXCIgW25nQ2xhc3NdPVwieydzZi1pY29uLXN0cmFpZ2h0LWxpbmUnOiBjb25uZWN0b3JUeXBlID09PSAnU3RyYWlnaHQnLFxyXG4gICAgICAgICAgJ3NmLWljb24tb3J0aG9nb25hbC1saW5lJzogY29ubmVjdG9yVHlwZSA9PT0gJ09ydGhvZ29uYWwnLFxyXG4gICAgICAgICAgJ3NmLWljb24tYmVpemVyLWxpbmUnOiBjb25uZWN0b3JUeXBlID09PSAnQmV6aWVyJ31cIj48L3NwYW4+XHJcbiAgICA8bWF0LWljb24+YXJyb3dfZHJvcF9kb3duPC9tYXQtaWNvbj5cclxuICA8L2J1dHRvbj5cclxuICA8bWF0LW1lbnUgI2xpbmVNZW51IHBhbmVsQ2xhc3M9XCJpY29uLW1lbnUtcGFuZWxcIj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiY29ubmVjdG9yVHlwZUNoYW5nZSgnU3RyYWlnaHQnKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUtbWVudS1pY29uIHNmLWljb24tc3RyYWlnaHQtbGluZVwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjb25uZWN0b3JUeXBlQ2hhbmdlKCdPcnRob2dvbmFsJylcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlLW1lbnUtaWNvbiBzZi1pY29uLW9ydGhvZ29uYWwtbGluZVwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjb25uZWN0b3JUeXBlQ2hhbmdlKCdCZXppZXInKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUtbWVudS1pY29uIHNmLWljb24tYmVpemVyLWxpbmVcIj48L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L21hdC1tZW51PlxyXG4gICZuYnNwO1xyXG4gIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiYWxpZ25NZW51XCIgW2Rpc2FibGVkXT1cImRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8ubm9kZXMubGVuZ3RoID09PSAwICYmIGRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8uY29ubmVjdG9ycy5sZW5ndGggPT09IDBcIiBbYml6ZG9jVG9vbHRpcF09XCInQWxpZ24nfHRyYW5zbGF0ZVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJlLWljb25zXCIgW25nQ2xhc3NdPVwieydzZi1pY29uLXRvcCc6IGFsaWdubWVudCA9PT0gJ1RvcCcsXHJcbiAgICAgICAgICAnc2YtaWNvbi1sZWZ0JzogYWxpZ25tZW50ID09PSAnTGVmdCcsXHJcbiAgICAgICAgICAnc2YtaWNvbi1jZW50ZXInOiBhbGlnbm1lbnQgPT09ICdDZW50ZXInLFxyXG4gICAgICAgICAgJ3NmLWljb24tYm90dG9tJzogYWxpZ25tZW50ID09PSAnQm90dG9tJyxcclxuICAgICAgICAgICdzZi1pY29uLXJpZ2h0JzogYWxpZ25tZW50ID09PSAnUmlnaHQnfVwiPjwvc3Bhbj5cclxuICAgIDxtYXQtaWNvbj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG4gIDxtYXQtbWVudSAjYWxpZ25NZW51IHBhbmVsQ2xhc3M9XCJpY29uLW1lbnUtcGFuZWxcIj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWxpZ24oJ1RvcCcpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLXRvcFwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhbGlnbignTGVmdCcpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLWxlZnRcIj48L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWxpZ24oJ0NlbnRlcicpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLWNlbnRlclwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhbGlnbignQm90dG9tJylcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlLWljb25zIHNmLWljb24tYm90dG9tXCI+PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImFsaWduKCdSaWdodCcpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLXJpZ2h0XCI+PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9tYXQtbWVudT5cclxuPC9tYXQtdG9vbGJhcj5cclxuPGRpdiBjbGFzcz1cInJvdyBjb250YWluZXJcIj5cclxuICA8ZGl2IGlkPVwic3ltYm9scGFsZXR0ZVwiIFtzdHlsZS5kaXNwbGF5XT1cInRvb2xzPycnOidub25lJ1wiPlxyXG4gICAgPGRpdiBkaXI9XCJsdHJcIiAjc3ltYm9sUGFsZXR0ZUVsPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAjZGlhZ3JhbUVsIGlkPVwiZGlhZ3JhbVwiIGZ4RmxleCBkaXI9XCJsdHJcIj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyaWVzL2NvcmUvc3JjL2xpYi9hZG1pbi9mb3JtL3dvcmtmbG93L3dvcmtmbG93LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcmllcy9jb3JlL3NyYy9saWIvYWRtaW4vZm9ybS93b3JrZmxvdy93b3JrZmxvdy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBYSxZQUFZLEVBQXFDLE1BQU0sZUFBZSxDQUFDO0FBQ2pILE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFPLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQ1osZUFBZSxFQUMxQyxPQUFPLEVBQWEsUUFBUSxFQUM1QixJQUFJLEVBQTBCLFlBQVksRUFBRSxvQkFBb0IsRUFDaEUsYUFBYSxFQUFFLFlBQVksRUFDM0IsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBaUIsZUFBZSxFQUFlLGNBQWMsRUFDdEgsTUFBTSxrQ0FBa0MsQ0FBQztBQVExQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDekQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6RCxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUN4RSxhQUFhLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRW5DLE1BQU0sS0FBSyxHQUFxQjtJQUM5QixFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUU7SUFDbEwsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLGNBQWMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsZUFBZSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFO0lBQ2xMLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFVBQVUsRUFBRSxjQUFjLENBQUMsT0FBTyxHQUFHLGNBQWMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRTtJQUNsTCxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxlQUFlLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUU7Q0FDbkwsQ0FBQztBQUVGLFNBQVMsZUFBZTtJQUN0QixNQUFNLFlBQVksR0FBZ0IsUUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMzRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUFDO0lBQ2hFLElBQUksUUFBUSxFQUFFO1FBQ1osSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLHdCQUF3QixDQUFDLEVBQUU7WUFDOUQsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUN0RDthQUFNO1lBQ0wsWUFBWSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUN6RDtLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsZ0JBQWdCO0lBQ3ZCLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFDaEUsSUFBSSxRQUFRLEVBQUU7UUFDWixNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVELElBQUksV0FBVyxFQUFFO1lBQ2YsV0FBVyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDL0Q7S0FDRjtBQUNILENBQUM7QUFVRCx3QkFBd0I7QUFDeEIsTUFBTSxPQUFPLGlCQUFpQjtJQXNDNUIsb0JBQW9CO0lBQ3BCLFlBQW9CLEVBQWlCLEVBQzNCLFFBQXFCLEVBQ3JCLEtBQWlDLEVBQ2pDLE9BQW9CLEVBQ3BCLFFBQXdCLEVBQ3hCLFVBQTRCO1FBTGxCLE9BQUUsR0FBRixFQUFFLENBQWU7UUFDM0IsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixVQUFLLEdBQUwsS0FBSyxDQUE0QjtRQUNqQyxZQUFPLEdBQVAsT0FBTyxDQUFhO1FBQ3BCLGFBQVEsR0FBUixRQUFRLENBQWdCO1FBQ3hCLGVBQVUsR0FBVixVQUFVLENBQWtCO1FBMUM3QixjQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFVckQsa0JBQWEsR0FBYSxRQUFRLENBQUM7UUFDbkMsY0FBUyxHQUFxQixRQUFRLENBQUM7UUFDdkMsYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNkLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFZixVQUFLLEdBQUcsS0FBSyxDQUFDO1FBRUwsYUFBUSxHQUFtQixFQUFFLENBQUM7UUFDdkMsdUJBQWtCLEdBQXVCLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxRQUFRLEdBQUcsa0JBQWtCLENBQUMsZUFBZSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNqSywwQkFBMEI7UUFDakIsaUJBQVksR0FBZ0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDekUsaUJBQVksR0FBc0I7WUFDekMsYUFBYSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQztTQUM1QyxDQUFDO1FBQ08sa0JBQWEsR0FBa0I7WUFDdEMsV0FBVyxFQUFFLG1CQUFtQixDQUFDLEdBQUcsR0FBRyxDQUFDLG1CQUFtQixDQUFDLE1BQU07U0FDbkUsQ0FBQztRQUNPLG1CQUFjLEdBQXdCO1lBQzdDLE9BQU8sRUFBRSxFQUFFO1lBQ1gsT0FBTyxFQUFFLEdBQUc7U0FDYixDQUFDO1FBQ08sa0JBQWEsR0FBdUIsRUFDNUMsQ0FBQztRQUVlLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQWdPcEQsaUJBQVksR0FBRyxDQUFDLEdBQWMsRUFBYSxFQUFFO1lBQzNDLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7Z0JBQ3RCLEtBQUssVUFBVTtvQkFDYixNQUFNO2dCQUNSLEtBQUssTUFBTTtvQkFDVCxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUzt3QkFDdEIsR0FBRyxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLFNBQVMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUM7b0JBQ3ZHLE1BQU07Z0JBQ1I7b0JBQ0UsSUFBSSxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQzFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLE9BQU8sR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO3dCQUN4RSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO3dCQUNyRSxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztxQkFDbkI7b0JBQ0QsTUFBTTthQUNUO1lBQ0QsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUE7UUFDTSxpQkFBWSxHQUFHLENBQUMsR0FBbUIsRUFBRSxFQUFFO1lBQzVDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsT0FBTyxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztZQUMvRSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3JFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSTtnQkFBRSxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDN0MsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUE7UUEvT0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUU1RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQXpDRCxJQUFJLEtBQUssS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25DLElBQUksS0FBSyxDQUFDLEdBQVk7UUFDcEIsWUFBWSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO0lBQ3BCLENBQUM7SUFzQ0QsZUFBZTtJQUNmLENBQUM7SUFDRCxRQUFRO1FBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBQztZQUNyQyxVQUFVLEVBQUUsVUFBVTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLE1BQU07WUFDYixNQUFNLEVBQUUsTUFBTTtZQUNkLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDNUMsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1NBQ25ELENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBQztZQUN6QixLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNO1lBQzdCLFlBQVksRUFBRSxJQUFJLENBQUMsWUFBWTtZQUMvQixvQkFBb0IsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDbEQsV0FBVyxFQUFFLElBQUksQ0FBQyxrQkFBa0I7WUFDcEMsZUFBZSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUM3QyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7WUFDbkMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1lBQ2pDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3BDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUN4QyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQzlDLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakQsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLGdCQUFnQixFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDbkUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDcEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUNqQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDMUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ08sU0FBUztRQUNmLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEdBQWM7Z0JBQ3RCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSTtnQkFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsT0FBTyxFQUFFO29CQUNQLFFBQVEsRUFBRSxDQUFDLENBQUMsSUFBSTtvQkFDaEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2lCQUNmO2dCQUNELEtBQUssRUFBRSxHQUFHO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2FBQ1osQ0FBQztZQUNELElBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM1QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDWixPQUFPLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxDQUFDO2dCQUN2RixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QjtZQUNELE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDakIsRUFBRSxFQUFFLFFBQVE7WUFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1lBQ3BDLE9BQU8sRUFBRSxDQUFDO29CQUNSLEVBQUUsRUFBRSxRQUFRO29CQUNaLElBQUksRUFBRSxVQUFVO29CQUNoQixXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUU7b0JBQzNCLFdBQVcsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDN0IsZUFBZSxFQUFFO3dCQUNmLEtBQUssRUFBRSxPQUFPO3dCQUNkLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRTtxQkFDbkQ7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLFdBQVcsRUFBRSxDQUFDO3dCQUNkLGVBQWUsRUFBRSxLQUFLO3dCQUN0QixXQUFXLEVBQUUsU0FBUztxQkFDdkI7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUU7b0JBQ2pELEtBQUssRUFBRTt3QkFDTCxJQUFJLEVBQUUsYUFBYTtxQkFDcEI7b0JBQ0QsV0FBVyxFQUFFLGVBQWUsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxlQUFlLENBQUMsU0FBUyxHQUFHLENBQUMsZUFBZSxDQUFDLFVBQVU7b0JBQy9GLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRTtpQkFDaEQsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQ2pCLEVBQUUsRUFBRSxnQkFBZ0I7WUFDcEIsUUFBUSxFQUFFLElBQUk7WUFDZCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUM7WUFDN0MsT0FBTyxFQUFFO2dCQUNQO29CQUNFLEVBQUUsRUFBRSxVQUFVO29CQUNkLE9BQU8sRUFBRTt3QkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO3FCQUN6QztvQkFDRCxLQUFLLEVBQUU7d0JBQ0wsTUFBTSxFQUFFOzRCQUNOLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7eUJBQ2hDO3dCQUNELElBQUksRUFBRSxVQUFVO3dCQUNoQixLQUFLLEVBQUU7NEJBQ0w7Z0NBQ0UsRUFBRSxFQUFFLE9BQU87Z0NBQ1gsTUFBTSxFQUFFO29DQUNOLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7b0NBQy9CLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7aUNBQ3ZCOzZCQUNGO3lCQUNGO3dCQUNELFdBQVcsRUFBRSxZQUFZO3dCQUN6QixNQUFNLEVBQUUsSUFBSTtxQkFDYjtvQkFDRCxNQUFNLEVBQUUsRUFBRTtvQkFDVixLQUFLLEVBQUUsR0FBRztvQkFDVixPQUFPLEVBQUUsRUFBRTtvQkFDWCxPQUFPLEVBQUUsRUFBRTtpQkFDWixFQUFFO29CQUNELEVBQUUsRUFBRSxXQUFXO29CQUNmLE9BQU8sRUFBRTt3QkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDO3FCQUN2QztvQkFDRCxLQUFLLEVBQUU7d0JBQ0wsSUFBSSxFQUFFLFVBQVU7d0JBQ2hCLE1BQU0sRUFBRTs0QkFDTixVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFO3lCQUNoQzt3QkFDRCxLQUFLLEVBQUU7NEJBQ0w7Z0NBQ0UsRUFBRSxFQUFFLE9BQU87Z0NBQ1gsTUFBTSxFQUFFO29DQUNOLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7b0NBQy9CLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUU7aUNBQ3ZCOzZCQUNGO3lCQUNGO3dCQUNELFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUk7cUJBQ3RDO29CQUNELE1BQU0sRUFBRSxHQUFHO29CQUNYLEtBQUssRUFBRSxFQUFFO29CQUNULE9BQU8sRUFBRSxFQUFFO29CQUNYLE9BQU8sRUFBRSxFQUFFO2lCQUNaLEVBQUU7b0JBQ0QsRUFBRSxFQUFFLFFBQVE7b0JBQ1osT0FBTyxFQUFFO3dCQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7cUJBQ3BDO29CQUNELEtBQUssRUFBRTt3QkFDTCxJQUFJLEVBQUUsVUFBVTt3QkFDaEIsTUFBTSxFQUFFOzRCQUNOO2dDQUNFLEtBQUssRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFO2dDQUNyRSxNQUFNLEVBQUU7b0NBQ04sVUFBVSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtpQ0FDOUI7NkJBQ0Y7eUJBQUM7d0JBQ0osV0FBVyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsSUFBSTtxQkFDdkM7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLEdBQUc7b0JBQ1YsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtpQkFDOUIsRUFBRTtvQkFDRCxFQUFFLEVBQUUsUUFBUTtvQkFDWixPQUFPLEVBQUU7d0JBQ1AsS0FBSyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztxQkFDcEM7b0JBQ0QsS0FBSyxFQUFFO3dCQUNMLElBQUksRUFBRSxVQUFVO3dCQUNoQixNQUFNLEVBQUUsQ0FBQztnQ0FDUCxLQUFLLEVBQUUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtnQ0FDckUsTUFBTSxFQUFFO29DQUNOLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7aUNBQzlCOzZCQUNGLENBQUM7d0JBQ0YsV0FBVyxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsSUFBSTtxQkFDekM7b0JBQ0QsTUFBTSxFQUFFLEVBQUU7b0JBQ1YsS0FBSyxFQUFFLEdBQUc7b0JBQ1YsS0FBSyxFQUFFLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRTtpQkFDOUI7YUFBQztTQUNXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBQ08sWUFBWSxDQUFDLE9BQWU7UUFDbEMsT0FBTztZQUNMLEVBQUUsRUFBRSxTQUFTO1lBQ2IsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxNQUFNO2dCQUNaLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxPQUFPLElBQUksQ0FBQyxDQUFDO2FBQzdEO1lBQ0QsT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztZQUNWLEtBQUssRUFBRTtnQkFDTCxRQUFRLEVBQUUsRUFBRTtnQkFDWixLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87Z0JBQ25ELE9BQU8sRUFBRSxFQUFFO2FBQ007WUFDbkIsV0FBVyxFQUFFLGVBQWUsQ0FBQyxRQUFRO1lBQ3JDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDWCxDQUFDO0lBQ0osQ0FBQztJQXlCTSxhQUFhLENBQUMsTUFBaUI7UUFDcEMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN0QixHQUFHLEVBQUUsSUFBSTtZQUNULE9BQU8sRUFBRyxNQUFNLENBQUMsT0FBZSxDQUFDLEtBQUs7WUFDdEMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFHLE1BQU0sQ0FBQyxPQUFlLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1NBQ2pHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNYLENBQUM7SUFDTSxpQkFBaUIsQ0FBQyxNQUFpQjtRQUN4QyxNQUFNLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxHQUFHO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDO1FBQzdFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7SUFDM0MsQ0FBQztJQUNELE1BQU07UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQztRQUM5RSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBQzNDLENBQUM7SUFDRCxlQUFlLENBQUMsR0FBOEI7UUFDNUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUM7UUFDaEMsSUFBSSxLQUFLLEtBQUssVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRTtZQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLE9BQU87U0FDUjtRQUNELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksU0FBUyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBbUIsQ0FBQyxDQUFDO1FBQzlGLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNyQixNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQzdCLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDdkQsSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2hFLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzFELElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUMxQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7U0FDeEQ7UUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNoQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFjLENBQUM7WUFDckQsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7Z0JBQ2xDLE9BQU87WUFDVCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7U0FDdEQ7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxxQkFBcUIsRUFBRTtZQUMzQyxLQUFLLEVBQUU7Z0JBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixLQUFLO2dCQUNMLFVBQVU7YUFDWDtZQUNELE1BQU0sRUFBRSxVQUFVLENBQUMsR0FBRztZQUN0QixVQUFVLEVBQUUsS0FBSztZQUNqQixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDVixDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUNwRixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUM1RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxLQUFLLENBQUMsS0FBdUI7UUFDM0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMzQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sRUFBRTtvQkFDTixDQUFDLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ3BELENBQUMsRUFBRSxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtpQkFDckQ7Z0JBQ0QsaUJBQWlCLEVBQUUsS0FBSyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQ3JGLG1CQUFtQixFQUFFLEtBQUssS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRO2FBQ3hGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUNoRCxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1lBQzFDLGlCQUFpQixFQUFFLEtBQUssS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRO1lBQ3JGLG1CQUFtQixFQUFFLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRO1lBQ3ZGLG1CQUFtQjtZQUNuQiw2REFBNkQ7WUFDN0QsNERBQTREO1lBQzVELEtBQUs7U0FDTixDQUFDLENBQUMsQ0FDSixDQUFDO1FBQ0YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUNNLFNBQVMsQ0FBQyxJQUF5QjtRQUN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLFlBQVksSUFBSSxFQUFFO1lBQ2hDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUMvQixLQUFLLFVBQVU7b0JBQ2I7d0JBQ0UsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFzQixDQUFDO3dCQUNsRCxRQUFRLEtBQUssQ0FBQyxXQUFXLEVBQUU7NEJBQ3pCLEtBQUssWUFBWTtnQ0FDZixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7Z0NBQzNCLE1BQU07NEJBQ1IsS0FBSyxVQUFVO2dDQUNiLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQ0FDNUIsTUFBTTt5QkFDVDt3QkFDRCxNQUFNO3FCQUNQO2dCQUNILEtBQUssTUFBTTtvQkFDVCx1REFBdUQ7b0JBQ3ZELE1BQU07Z0JBQ1I7b0JBQ0U7d0JBQ0UsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO3dCQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7d0JBQ3pCLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUM7d0JBQ25DLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUc7NEJBQ25CLElBQUksRUFBRSxhQUFhOzRCQUNuQixXQUFXLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU87NEJBQ3pELFdBQVcsRUFBRSxDQUFDO3lCQUNmLENBQUM7cUJBQ0g7YUFDSjtTQUNGO0lBQ0gsQ0FBQztJQUNELGNBQWMsQ0FBQyxDQUFDO1FBQ2QsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLENBQUM7WUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTTtRQUNKLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFDRDs7O09BR0c7SUFFSCxtQkFBbUIsQ0FBQyxLQUFvQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUU7WUFDOUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1osS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3hCO0lBQ0gsQ0FBQztJQUNELFFBQVEsQ0FBQyxHQUFXO1FBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBQ0QsV0FBVyxDQUFDLEdBQVc7UUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFjO1FBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxVQUFVO1FBQ1IsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDN0UsU0FBUyxNQUFNLENBQUMsSUFBa0M7WUFDaEQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNO2dCQUMzQixJQUFJLENBQUMsS0FBd0IsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDOztnQkFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQ2hDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSzt3QkFDVixDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDOzt3QkFFeEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO2dCQUN2QixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBQ0QsWUFBWTtRQUNWLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQy9FLFNBQVMsTUFBTSxDQUFDLElBQWtDO1lBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFDM0IsSUFBSSxDQUFDLEtBQXdCLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzs7Z0JBQ3pDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7d0JBQ1YsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQzs7d0JBRTFCLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDekIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNELGNBQWMsQ0FBQyxHQUFXO1FBQ3hCLFNBQVMsTUFBTSxDQUFDLElBQWtDO1lBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTTtnQkFDM0IsSUFBSSxDQUFDLEtBQXdCLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQzs7Z0JBQzFDLElBQWtCLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtvQkFDaEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLO3dCQUNWLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7O3dCQUU1QixDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFDRCxZQUFZLENBQUMsR0FBVztRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hELENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztZQUMxQixJQUFJLENBQUMsQ0FBQyxXQUFXO2dCQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUk7UUFDRixJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixHQUFHLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9ELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBaUIsQ0FBQztRQUNuRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQztRQUNoRCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN6RCxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUM5QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEQsSUFBSSxDQUFDLEtBQW1CLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUM3RSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ3pCO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLEVBQUUsR0FBRyxFQUFFO1lBQ04sSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDL0IsQ0FBQzs7OEdBeGdCVSxpQkFBaUI7a0dBQWpCLGlCQUFpQixvWUNoRTlCLHUrTEF1RkE7MkZEdkJhLGlCQUFpQjtrQkFUN0IsU0FBUzsrQkFDRSxpQkFBaUIsUUFHckI7d0JBQ0osS0FBSyxFQUFFLE1BQU07cUJBQ2Q7ME9BTytDLGVBQWU7c0JBQTlELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNKLFNBQVM7c0JBQWxELFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkEyWnhDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0NoaWxkLCBPbkRlc3Ryb3ksIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT25Jbml0LCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGZpcnN0LCBTdWJqZWN0LCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1xyXG4gIERpYWdyYW1Db25zdHJhaW50cywgU2VsZWN0b3JDb25zdHJhaW50cywgQ29ubmVjdG9yTW9kZWwsXHJcbiAgVGV4dE1vZGVsLCBQb2ludFBvcnRNb2RlbCwgTm9kZUNvbnN0cmFpbnRzLCBTY3JvbGxTZXR0aW5nc01vZGVsLFxyXG4gIERpYWdyYW0sIE5vZGVNb2RlbCwgVW5kb1JlZG8sIFN5bWJvbEluZm8sIElEcmFnRW50ZXJFdmVudEFyZ3MsIFNuYXBTZXR0aW5nc01vZGVsLCBNYXJnaW5Nb2RlbCxcclxuICBOb2RlLCBQYWxldHRlTW9kZWwsIFNlZ21lbnRzLCBEaWFncmFtVG9vbHMsIENvbm5lY3RvckNvbnN0cmFpbnRzLCBTZWxlY3Rvck1vZGVsLCBSdWxlclNldHRpbmdzTW9kZWwsIEFsaWdubWVudE9wdGlvbnMsIFRleHRTdHlsZU1vZGVsLFxyXG4gIFN5bWJvbFBhbGV0dGUsIEJwbW5EaWFncmFtcywgRGF0YUJpbmRpbmcsIElTZWxlY3Rpb25DaGFuZ2VFdmVudEFyZ3MsXHJcbiAgQ29ubmVjdG9yRWRpdGluZywgQ29ubmVjdG9yQnJpZGdpbmcsIFNuYXBwaW5nLCBDb25uZWN0b3IsIFN3aW1MYW5lTW9kZWwsIFBvcnRDb25zdHJhaW50cywgSGVhZGVyTW9kZWwsIFBvcnRWaXNpYmlsaXR5LCBTbmFwQ29uc3RyYWludHMsIFNoYXBlQW5ub3RhdGlvbk1vZGVsLCBQYXRoQW5ub3RhdGlvbk1vZGVsLCBEaWFncmFtTW9kZWxcclxufSBmcm9tICdAc3luY2Z1c2lvbi9lajItYW5ndWxhci1kaWFncmFtcyc7XHJcbmltcG9ydCB7IEZvcm0gfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscyc7XHJcbmltcG9ydCB7IFNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXNzaW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uL2Zvcm0uc2VydmljZSc7XHJcbmltcG9ydCB7IFByb21wdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3Byb21wdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvdHJhbnNsYXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQYW5lUmVmIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zbG90cy9wYW5lLXJlZic7XHJcbmltcG9ydCB7IFBhbmVzUm91dGVyIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zbG90cy9yb3V0ZXIuc2VydmljZSc7XHJcbmltcG9ydCB7IFdvcmtmbG93Tm9kZUNvbXBvbmVudCB9IGZyb20gJy4vbm9kZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBZG1pbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2FkbWluLWRpc21pc3Muc2VydmljZSc7XHJcbmltcG9ydCB7IE9wZW5Qb2xpY3kgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2NvbmZpZ3VyYXRpb24nO1xyXG5pbXBvcnQgeyBNQVRFUklBTF9QQUxFVFRFUyB9IGZyb20gJy4uLy4uLy4uL2NvcmUvY29sb3JzJztcclxuXHJcbkRpYWdyYW0uSW5qZWN0KFVuZG9SZWRvLCBDb25uZWN0b3JCcmlkZ2luZywgQ29ubmVjdG9yRWRpdGluZywgU25hcHBpbmcpO1xyXG5TeW1ib2xQYWxldHRlLkluamVjdChCcG1uRGlhZ3JhbXMpO1xyXG5cclxuY29uc3QgcG9ydHM6IFBvaW50UG9ydE1vZGVsW10gPSBbXHJcbiAgeyBpZDogJ3BvcnQxJywgc2hhcGU6ICdDaXJjbGUnLCBvZmZzZXQ6IHsgeDogMCwgeTogMC41IH0sIHZpc2liaWxpdHk6IFBvcnRWaXNpYmlsaXR5LkNvbm5lY3QgfCBQb3J0VmlzaWJpbGl0eS5Ib3ZlciwgY29uc3RyYWludHM6IFBvcnRDb25zdHJhaW50cy5EZWZhdWx0IHwgUG9ydENvbnN0cmFpbnRzLkRyYXcgfSxcclxuICB7IGlkOiAncG9ydDInLCBzaGFwZTogJ0NpcmNsZScsIG9mZnNldDogeyB4OiAwLjUsIHk6IDEgfSwgdmlzaWJpbGl0eTogUG9ydFZpc2liaWxpdHkuQ29ubmVjdCB8IFBvcnRWaXNpYmlsaXR5LkhvdmVyLCBjb25zdHJhaW50czogUG9ydENvbnN0cmFpbnRzLkRlZmF1bHQgfCBQb3J0Q29uc3RyYWludHMuRHJhdyB9LFxyXG4gIHsgaWQ6ICdwb3J0MycsIHNoYXBlOiAnQ2lyY2xlJywgb2Zmc2V0OiB7IHg6IDEsIHk6IDAuNSB9LCB2aXNpYmlsaXR5OiBQb3J0VmlzaWJpbGl0eS5Db25uZWN0IHwgUG9ydFZpc2liaWxpdHkuSG92ZXIsIGNvbnN0cmFpbnRzOiBQb3J0Q29uc3RyYWludHMuRGVmYXVsdCB8IFBvcnRDb25zdHJhaW50cy5EcmF3IH0sXHJcbiAgeyBpZDogJ3BvcnQ0Jywgc2hhcGU6ICdDaXJjbGUnLCBvZmZzZXQ6IHsgeDogMC41LCB5OiAwIH0sIHZpc2liaWxpdHk6IFBvcnRWaXNpYmlsaXR5LkNvbm5lY3QgfCBQb3J0VmlzaWJpbGl0eS5Ib3ZlciwgY29uc3RyYWludHM6IFBvcnRDb25zdHJhaW50cy5EZWZhdWx0IHwgUG9ydENvbnN0cmFpbnRzLkRyYXcgfVxyXG5dO1xyXG5cclxuZnVuY3Rpb24gc2hvd1BhbGV0dGVJY29uKCk6IHZvaWQge1xyXG4gIGNvbnN0IHBhbGV0dGVTcGFjZTogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGFsZXR0ZS1zcGFjZScpO1xyXG4gIGNvbnN0IGlzTW9iaWxlID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6NTUwcHgpJykubWF0Y2hlcztcclxuICBpZiAoaXNNb2JpbGUpIHtcclxuICAgIGlmICghcGFsZXR0ZVNwYWNlLmNsYXNzTGlzdC5jb250YWlucygnc2ItbW9iaWxlLXBhbGV0dGUtb3BlbicpKSB7XHJcbiAgICAgIHBhbGV0dGVTcGFjZS5jbGFzc0xpc3QuYWRkKCdzYi1tb2JpbGUtcGFsZXR0ZS1vcGVuJyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwYWxldHRlU3BhY2UuY2xhc3NMaXN0LnJlbW92ZSgnc2ItbW9iaWxlLXBhbGV0dGUtb3BlbicpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcGFsZXR0ZUljb25DbGljaygpIHtcclxuICBjb25zdCBpc01vYmlsZSA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOjU1MHB4KScpLm1hdGNoZXM7XHJcbiAgaWYgKGlzTW9iaWxlKSB7XHJcbiAgICBjb25zdCBwYWxldHRlSWNvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYWxldHRlLWljb24nKTtcclxuICAgIGlmIChwYWxldHRlSWNvbikge1xyXG4gICAgICBwYWxldHRlSWNvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHNob3dQYWxldHRlSWNvbiwgZmFsc2UpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdiaXpkb2Mtd29ya2Zsb3cnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi93b3JrZmxvdy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vd29ya2Zsb3cuY29tcG9uZW50LnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICBjbGFzczogJ3BhbmUnXHJcbiAgfVxyXG59KVxyXG4vKiogd29ya2Zsb3cgY29tcG9uZW50Ki9cclxuZXhwb3J0IGNsYXNzIFdvcmtmbG93Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIEFkbWluQ29tcG9uZW50IHtcclxuICBzeW1ib2xQYWxldHRlOiBTeW1ib2xQYWxldHRlO1xyXG4gIHJlYWRvbmx5IGZvbnRTaXplcyA9IFs5LCAxMSwgMTIsIDEzLCAxNSwgMjEsIDMxLCA0MV07XHJcbiAgZGlhZ3JhbTogRGlhZ3JhbTtcclxuICBAVmlld0NoaWxkKCdzeW1ib2xQYWxldHRlRWwnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzeW1ib2xQYWxldHRlRWw6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnZGlhZ3JhbUVsJywgeyBzdGF0aWM6IHRydWUgfSkgZGlhZ3JhbUVsOiBFbGVtZW50UmVmO1xyXG4gIHByaXZhdGUgX3Rvb2xzOiBib29sZWFuO1xyXG4gIGdldCB0b29scygpIHsgcmV0dXJuIHRoaXMuX3Rvb2xzOyB9XHJcbiAgc2V0IHRvb2xzKHZhbDogYm9vbGVhbikge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2RpYWdyYW1fdG9vbHMnLCB2YWwgPyAnMScgOiAnMCcpO1xyXG4gICAgdGhpcy5fdG9vbHMgPSB2YWw7XHJcbiAgfVxyXG4gIGNvbm5lY3RvclR5cGU6IFNlZ21lbnRzID0gJ0Jlemllcic7XHJcbiAgYWxpZ25tZW50OiBBbGlnbm1lbnRPcHRpb25zID0gJ0NlbnRlcic7XHJcbiAgZm9udFNpemUgPSAxMjtcclxuICBzYXZpbmcgPSBmYWxzZTtcclxuICBlbGVtZW50PzogYW55O1xyXG4gIGRpcnR5ID0gZmFsc2U7XHJcbiAgcGFyYW1zOiB7fTtcclxuICByZWFkb25seSBwYWxldHRlczogUGFsZXR0ZU1vZGVsW10gPSBbXTtcclxuICBkaWFncmFtQ29uc3RyYWludHM6IERpYWdyYW1Db25zdHJhaW50cyA9IERpYWdyYW1Db25zdHJhaW50cy5EZWZhdWx0IHwgRGlhZ3JhbUNvbnN0cmFpbnRzLkJyaWRnaW5nIHwgRGlhZ3JhbUNvbnN0cmFpbnRzLlVzZXJJbnRlcmFjdGlvbiB8IERpYWdyYW1Db25zdHJhaW50cy5ab29tO1xyXG4gIC8vU3ltYm9sUGFsZXR0ZSBQcm9wZXJ0aWVzXHJcbiAgcmVhZG9ubHkgc3ltYm9sTWFyZ2luOiBNYXJnaW5Nb2RlbCA9IHsgbGVmdDogMTAsIHJpZ2h0OiAxMCwgdG9wOiAxMCwgYm90dG9tOiAxMCB9O1xyXG4gIHJlYWRvbmx5IHNuYXBTZXR0aW5nczogU25hcFNldHRpbmdzTW9kZWwgPSB7XHJcbiAgICBzbmFwTGluZUNvbG9yOiB0aGlzLl9zZXNzaW9uLmdldEFjY2VudCgxMDApXHJcbiAgfTtcclxuICByZWFkb25seSBzZWxlY3RlZEl0ZW1zOiBTZWxlY3Rvck1vZGVsID0ge1xyXG4gICAgY29uc3RyYWludHM6IFNlbGVjdG9yQ29uc3RyYWludHMuQWxsICYgflNlbGVjdG9yQ29uc3RyYWludHMuUm90YXRlLFxyXG4gIH07XHJcbiAgcmVhZG9ubHkgc2Nyb2xsU2V0dGluZ3M6IFNjcm9sbFNldHRpbmdzTW9kZWwgPSB7XHJcbiAgICBtaW5ab29tOiAuNSxcclxuICAgIG1heFpvb206IDIuNSxcclxuICB9O1xyXG4gIHJlYWRvbmx5IHJ1bGVyU2V0dGluZ3M6IFJ1bGVyU2V0dGluZ3NNb2RlbCA9IHtcclxuICB9O1xyXG4gIHByaXZhdGUgX2Zvcm06IEZvcm07XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfbm9kZWRlc3Ryb3kgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gIC8qKiB3b3JrZmxvdyBjdG9yICovXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwczogUHJvbXB0U2VydmljZSxcclxuICAgIHByaXZhdGUgX3NlcnZpY2U6IEZvcm1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGFuZTogUGFuZVJlZjxXb3JrZmxvd0NvbXBvbmVudD4sXHJcbiAgICBwcml2YXRlIF9yb3V0ZXI6IFBhbmVzUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBfc2Vzc2lvbjogU2Vzc2lvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF90cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UpIHtcclxuICAgIHRoaXMuX3Rvb2xzID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2RpYWdyYW1fdG9vbHMnKSA9PT0gJzEnO1xyXG5cclxuICAgIHRoaXMuX3BhbGV0dGVzKCk7XHJcbiAgfVxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICB9XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnN5bWJvbFBhbGV0dGUgPSBuZXcgU3ltYm9sUGFsZXR0ZSh7XHJcbiAgICAgIGV4cGFuZE1vZGU6ICdNdWx0aXBsZScsXHJcbiAgICAgIHBhbGV0dGVzOiB0aGlzLnBhbGV0dGVzLFxyXG4gICAgICB3aWR0aDogXCIxMDAlXCIsXHJcbiAgICAgIGhlaWdodDogXCIxMDAlXCIsXHJcbiAgICAgIGVuYWJsZVJ0bDogZmFsc2UsXHJcbiAgICAgIGVuYWJsZUFuaW1hdGlvbjogZmFsc2UsXHJcbiAgICAgIHN5bWJvbEhlaWdodDogODAsXHJcbiAgICAgIHN5bWJvbFdpZHRoOiA4MCxcclxuICAgICAgc3ltYm9sTWFyZ2luOiB0aGlzLnN5bWJvbE1hcmdpbixcclxuICAgICAgZ2V0U3ltYm9sSW5mbzogdGhpcy5nZXRTeW1ib2xJbmZvLmJpbmQodGhpcyksXHJcbiAgICAgIGdldE5vZGVEZWZhdWx0czogdGhpcy5nZXRTeW1ib2xEZWZhdWx0cy5iaW5kKHRoaXMpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnN5bWJvbFBhbGV0dGUuYXBwZW5kVG8odGhpcy5zeW1ib2xQYWxldHRlRWwubmF0aXZlRWxlbWVudCk7XHJcbiAgICB0aGlzLmRpYWdyYW0gPSBuZXcgRGlhZ3JhbSh7XHJcbiAgICAgIHdpZHRoOiBcIjEwMCVcIiwgaGVpZ2h0OiBcIjEwMCVcIixcclxuICAgICAgc25hcFNldHRpbmdzOiB0aGlzLnNuYXBTZXR0aW5ncyxcclxuICAgICAgZ2V0Q29ubmVjdG9yRGVmYXVsdHM6IHRoaXMuY29ubkRlZmF1bHRzLmJpbmQodGhpcyksXHJcbiAgICAgIGNvbnN0cmFpbnRzOiB0aGlzLmRpYWdyYW1Db25zdHJhaW50cyxcclxuICAgICAgZ2V0Tm9kZURlZmF1bHRzOiB0aGlzLm5vZGVEZWZhdWx0cy5iaW5kKHRoaXMpLFxyXG4gICAgICBzY3JvbGxTZXR0aW5nczogdGhpcy5zY3JvbGxTZXR0aW5ncyxcclxuICAgICAgc2VsZWN0ZWRJdGVtczogdGhpcy5zZWxlY3RlZEl0ZW1zLFxyXG4gICAgICBydWxlclNldHRpbmdzOiB0aGlzLnJ1bGVyU2V0dGluZ3MsXHJcbiAgICAgIGRyYWdFbnRlcjogdGhpcy5kcmFnRW50ZXIuYmluZCh0aGlzKSxcclxuICAgICAgY29ubmVjdGlvbkNoYW5nZTogdGhpcy5jaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgICAgY29sbGVjdGlvbkNoYW5nZTogdGhpcy5jb2xsZWN0aW9uQ2hhbmdlLmJpbmQodGhpcyksXHJcbiAgICAgIHByb3BlcnR5Q2hhbmdlOiB0aGlzLnByb3BlcnR5Q2hhbmdlLmJpbmQodGhpcyksXHJcbiAgICAgIHNlbGVjdGlvbkNoYW5nZTogdGhpcy5zZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgIH0sIHRoaXMuZGlhZ3JhbUVsLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgcGFsZXR0ZUljb25DbGljaygpO1xyXG4gICAgdGhpcy5fcGFuZS5wYXJhbXNDaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZShwID0+IHtcclxuICAgICAgY29uc3QgaWQgPSBwWydpZCddO1xyXG4gICAgICB0aGlzLl9mb3JtID0gdGhpcy5fc2Vzc2lvbi5wcm9maWxlLmZvcm1zLmZpbmQoZiA9PiBmLm5hbWUgPT09IGlkKTtcclxuICAgICAgdGhpcy5fcGFuZS50aXRsZSA9IHRoaXMuX2Zvcm0udGl0bGU7XHJcbiAgICAgIHRoaXMucGFyYW1zID0geyBpZDogdGhpcy5fZm9ybS5uYW1lIH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3BhbmUuZGF0YUNoYW5nZS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95KSkuc3Vic2NyaWJlKGQgPT4ge1xyXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2Zvcm0sIGQuZm9ybSk7XHJcbiAgICAgIGNvbnN0IGZsb3cgPSB0aGlzLl9mb3JtLndvcmtmbG93O1xyXG4gICAgICB0aGlzLmRpYWdyYW0ubm9kZXMgPSBmbG93Lm5vZGVzO1xyXG4gICAgICB0aGlzLmRpYWdyYW0uY29ubmVjdG9ycyA9IGZsb3cuY29ubmVjdG9ycztcclxuICAgICAgdGhpcy5kaWFncmFtLmRhdGFCaW5kKCk7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5hZGQodGhpcy5fdmVyc2lvbk5vZGUoZmxvdy52ZXJzaW9uKSk7XHJcbiAgICAgIHRoaXMuZGlhZ3JhbS5maXRUb1BhZ2UoKTtcclxuICAgICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHByaXZhdGUgX3BhbGV0dGVzKCkge1xyXG4gICAgdGhpcy5fc2Vzc2lvbi5wcm9maWxlLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgIGNvbnN0IG5vZGU6IE5vZGVNb2RlbCA9IHtcclxuICAgICAgICBpZDogbi5uYW1lLFxyXG4gICAgICAgIHNoYXBlOiBuLnNoYXBlLFxyXG4gICAgICAgIGFkZEluZm86IHtcclxuICAgICAgICAgIG5vZGVUeXBlOiBuLm5hbWUsXHJcbiAgICAgICAgICB0aXRsZTogbi50aXRsZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgd2lkdGg6IDE0NSxcclxuICAgICAgICBoZWlnaHQ6IDE0NSxcclxuICAgICAgfTtcclxuICAgICAgKG5vZGUgYXMgYW55KS5ub2RlID0gbi5uYW1lO1xyXG4gICAgICBsZXQgcGFsZXR0ZSA9IHRoaXMucGFsZXR0ZXMuZmluZChwID0+IHAudGl0bGUgPT09IChuLnBhbGV0dGUgfHwgJycpKTtcclxuICAgICAgaWYgKCFwYWxldHRlKSB7XHJcbiAgICAgICAgcGFsZXR0ZSA9IHsgaWQ6IGBfJHtuLnBhbGV0dGV9YCwgZXhwYW5kZWQ6IHRydWUsIHRpdGxlOiBuLnBhbGV0dGUgfHwgJycsIHN5bWJvbHM6IFtdIH07XHJcbiAgICAgICAgdGhpcy5wYWxldHRlcy5wdXNoKHBhbGV0dGUpO1xyXG4gICAgICB9XHJcbiAgICAgIHBhbGV0dGUuc3ltYm9scy5wdXNoKG5vZGUpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhbGV0dGVzLnB1c2goe1xyXG4gICAgICBpZDogJ2Rlc2lnbicsXHJcbiAgICAgIHRpdGxlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdEZXNpZ24nKSxcclxuICAgICAgc3ltYm9sczogW3tcclxuICAgICAgICBpZDogJ0xpbmsyMicsXHJcbiAgICAgICAgdHlwZTogJ1N0cmFpZ2h0JyxcclxuICAgICAgICBzb3VyY2VQb2ludDogeyB4OiAwLCB5OiAwIH0sXHJcbiAgICAgICAgdGFyZ2V0UG9pbnQ6IHsgeDogNjAsIHk6IDYwIH0sXHJcbiAgICAgICAgdGFyZ2V0RGVjb3JhdG9yOiB7XHJcbiAgICAgICAgICBzaGFwZTogJ0Fycm93JyxcclxuICAgICAgICAgIHN0eWxlOiB7IHN0cm9rZUNvbG9yOiAnIzc1NzU3NScsIGZpbGw6ICcjNzU3NTc1JyB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAxLFxyXG4gICAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiAnNCA0JyxcclxuICAgICAgICAgIHN0cm9rZUNvbG9yOiAnIzc1NzU3NScsXHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgaWQ6ICd0ZXh0Jywgc2hhcGU6IHsgdHlwZTogJ1RleHQnLCBjb250ZW50OiAnVCcgfSxcclxuICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50J1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY29uc3RyYWludHM6IE5vZGVDb25zdHJhaW50cy5EZWZhdWx0ICYgfk5vZGVDb25zdHJhaW50cy5JbkNvbm5lY3QgJiB+Tm9kZUNvbnN0cmFpbnRzLk91dENvbm5lY3QsXHJcbiAgICAgICAgYWRkSW5mbzogeyB0aXRsZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnVGV4dCcpIH1cclxuICAgICAgfV1cclxuICAgIH0pO1xyXG4gICAgY29uc3QgY29sb3IgPSBNQVRFUklBTF9QQUxFVFRFU1snZ3JleSddWzIwMF07XHJcbiAgICB0aGlzLnBhbGV0dGVzLnB1c2goe1xyXG4gICAgICBpZDogJ3N3aW1sYW5lU2hhcGVzJyxcclxuICAgICAgZXhwYW5kZWQ6IHRydWUsXHJcbiAgICAgIHRpdGxlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdTd2ltbGFuZSBTaGFwZXMnKSxcclxuICAgICAgc3ltYm9sczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIGlkOiAnc3dpbWxhbmUnLFxyXG4gICAgICAgICAgYWRkSW5mbzoge1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnSG9yaXpvbnRhbCcpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2hhcGU6IHtcclxuICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbjogeyBjb250ZW50OiAnUGxhbicgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0eXBlOiAnU3dpbUxhbmUnLFxyXG4gICAgICAgICAgICBsYW5lczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiAnbGFuZTEnLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgIGFubm90YXRpb246IHsgY29udGVudDogJ0xhbmUnIH0sXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IGZpbGw6IGNvbG9yIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnSG9yaXpvbnRhbCcsXHJcbiAgICAgICAgICAgIGlzTGFuZTogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGhlaWdodDogNjAsXHJcbiAgICAgICAgICB3aWR0aDogMTQwLFxyXG4gICAgICAgICAgb2Zmc2V0WDogNzAsXHJcbiAgICAgICAgICBvZmZzZXRZOiAzMCxcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICBpZDogJ3Zzd2ltbGFuZScsXHJcbiAgICAgICAgICBhZGRJbmZvOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdWZXJ0aWNhbCcpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2hhcGU6IHtcclxuICAgICAgICAgICAgdHlwZTogJ1N3aW1MYW5lJyxcclxuICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgYW5ub3RhdGlvbjogeyBjb250ZW50OiAnUGxhbicgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBsYW5lczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGlkOiAnbGFuZTEnLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyOiB7XHJcbiAgICAgICAgICAgICAgICAgIGFubm90YXRpb246IHsgY29udGVudDogJ0xhbmUnIH0sXHJcbiAgICAgICAgICAgICAgICAgIHN0eWxlOiB7IGZpbGw6IGNvbG9yIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIG9yaWVudGF0aW9uOiAnVmVydGljYWwnLCBpc0xhbmU6IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBoZWlnaHQ6IDE0MCxcclxuICAgICAgICAgIHdpZHRoOiA2MCxcclxuICAgICAgICAgIG9mZnNldFg6IDcwLFxyXG4gICAgICAgICAgb2Zmc2V0WTogMzAsXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgaWQ6ICd2cGhhc2UnLFxyXG4gICAgICAgICAgYWRkSW5mbzoge1xyXG4gICAgICAgICAgICB0aXRsZTogdGhpcy5fdHJhbnNsYXRlLmdldCgnUGhhc2UnKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHNoYXBlOiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdTd2ltTGFuZScsXHJcbiAgICAgICAgICAgIHBoYXNlczogW1xyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7IHN0cm9rZVdpZHRoOiAxLCBzdHJva2VEYXNoQXJyYXk6ICczLDMnLCBzdHJva2VDb2xvcjogY29sb3IgfSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcjoge1xyXG4gICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uOiB7IHRleHQ6ICdQaGFzZScgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1dLFxyXG4gICAgICAgICAgICBvcmllbnRhdGlvbjogJ1ZlcnRpY2FsJywgaXNQaGFzZTogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGhlaWdodDogNjAsXHJcbiAgICAgICAgICB3aWR0aDogMTQwLFxyXG4gICAgICAgICAgc3R5bGU6IHsgc3Ryb2tlQ29sb3I6IGNvbG9yIH1cclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICBpZDogJ2hwaGFzZScsXHJcbiAgICAgICAgICBhZGRJbmZvOiB7XHJcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl90cmFuc2xhdGUuZ2V0KCdQaGFzZScpXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgc2hhcGU6IHtcclxuICAgICAgICAgICAgdHlwZTogJ1N3aW1MYW5lJyxcclxuICAgICAgICAgICAgcGhhc2VzOiBbe1xyXG4gICAgICAgICAgICAgIHN0eWxlOiB7IHN0cm9rZVdpZHRoOiAxLCBzdHJva2VEYXNoQXJyYXk6ICczLDMnLCBzdHJva2VDb2xvcjogY29sb3IgfSxcclxuICAgICAgICAgICAgICBoZWFkZXI6IHtcclxuICAgICAgICAgICAgICAgIGFubm90YXRpb246IHsgdGV4dDogJ1BoYXNlJyB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XSxcclxuICAgICAgICAgICAgb3JpZW50YXRpb246ICdIb3Jpem9udGFsJywgaXNQaGFzZTogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGhlaWdodDogNjAsXHJcbiAgICAgICAgICB3aWR0aDogMTQwLFxyXG4gICAgICAgICAgc3R5bGU6IHsgc3Ryb2tlQ29sb3I6IGNvbG9yIH1cclxuICAgICAgICB9XVxyXG4gICAgfSBhcyBQYWxldHRlTW9kZWwpO1xyXG4gIH1cclxuICBwcml2YXRlIF92ZXJzaW9uTm9kZSh2ZXJzaW9uOiBudW1iZXIpOiBOb2RlTW9kZWwge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgaWQ6ICd2ZXJzaW9uJyxcclxuICAgICAgc2hhcGU6IHtcclxuICAgICAgICB0eXBlOiAnVGV4dCcsXHJcbiAgICAgICAgY29udGVudDogdGhpcy5fdHJhbnNsYXRlLmdldCgnRGlhZ3JhbVZlcnNpb24nLCB2ZXJzaW9uIHx8IDApXHJcbiAgICAgIH0sXHJcbiAgICAgIG9mZnNldFk6IDUsXHJcbiAgICAgIG9mZnNldFg6IDUsXHJcbiAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgZm9udFNpemU6IDUwLFxyXG4gICAgICAgIGNvbG9yOiB0aGlzLl9zZXNzaW9uLnRoZW1lLmRhcmsgPyAnd2hpdGUnIDogJ2JsYWNrJyxcclxuICAgICAgICBvcGFjaXR5OiAuMVxyXG4gICAgICB9IGFzIFRleHRTdHlsZU1vZGVsLFxyXG4gICAgICBjb25zdHJhaW50czogTm9kZUNvbnN0cmFpbnRzLlJlYWRPbmx5LFxyXG4gICAgICB6SW5kZXg6IC0xXHJcbiAgICB9O1xyXG4gIH1cclxuICBub2RlRGVmYXVsdHMgPSAob2JqOiBOb2RlTW9kZWwpOiBOb2RlTW9kZWwgPT4ge1xyXG4gICAgc3dpdGNoIChvYmouc2hhcGUudHlwZSkge1xyXG4gICAgICBjYXNlICdTd2ltTGFuZSc6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1RleHQnOlxyXG4gICAgICAgIGlmIChvYmouaWQgIT09ICd2ZXJzaW9uJylcclxuICAgICAgICAgIG9iai5jb25zdHJhaW50cyA9IE5vZGVDb25zdHJhaW50cy5EZWZhdWx0ICYgfk5vZGVDb25zdHJhaW50cy5JbkNvbm5lY3QgJiB+Tm9kZUNvbnN0cmFpbnRzLk91dENvbm5lY3Q7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgaWYgKG9iai5hZGRJbmZvICYmIG9iai5hZGRJbmZvWydub2RlVHlwZSddKSB7XHJcbiAgICAgICAgICBvYmouY29uc3RyYWludHMgPSBOb2RlQ29uc3RyYWludHMuRGVmYXVsdCB8IE5vZGVDb25zdHJhaW50cy5Bc3BlY3RSYXRpbztcclxuICAgICAgICAgIG9iai5zdHlsZS5zdHJva2VDb2xvciA9IHRoaXMuX3Nlc3Npb24udGhlbWUuZGFyayA/ICd3aGl0ZScgOiAnYmxhY2snO1xyXG4gICAgICAgICAgb2JqLnBvcnRzID0gcG9ydHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbiAgcHVibGljIGNvbm5EZWZhdWx0cyA9IChvYmo6IENvbm5lY3Rvck1vZGVsKSA9PiB7XHJcbiAgICBvYmouY29uc3RyYWludHMgPSBDb25uZWN0b3JDb25zdHJhaW50cy5EZWZhdWx0IHwgQ29ubmVjdG9yQ29uc3RyYWludHMuQnJpZGdpbmc7XHJcbiAgICBvYmouc3R5bGUuc3Ryb2tlQ29sb3IgPSB0aGlzLl9zZXNzaW9uLnRoZW1lLmRhcmsgPyAnd2hpdGUnIDogJ2JsYWNrJztcclxuICAgIGlmICghb2JqLnR5cGUpIG9iai50eXBlID0gdGhpcy5jb25uZWN0b3JUeXBlO1xyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcbiAgcHVibGljIGdldFN5bWJvbEluZm8oc3ltYm9sOiBOb2RlTW9kZWwpOiBTeW1ib2xJbmZvIHtcclxuICAgIHJldHVybiBzeW1ib2wuYWRkSW5mbyA/IHtcclxuICAgICAgZml0OiB0cnVlLFxyXG4gICAgICB0b29sdGlwOiAoc3ltYm9sLmFkZEluZm8gYXMgYW55KS50aXRsZSxcclxuICAgICAgZGVzY3JpcHRpb246IHsgdGV4dDogKHN5bWJvbC5hZGRJbmZvIGFzIGFueSkudGl0bGUsIG92ZXJmbG93OiAnV3JhcCcsIHdyYXA6ICdXcmFwV2l0aE92ZXJmbG93JyB9XHJcbiAgICB9IDogbnVsbDtcclxuICB9XHJcbiAgcHVibGljIGdldFN5bWJvbERlZmF1bHRzKHN5bWJvbDogTm9kZU1vZGVsKTogdm9pZCB7XHJcbiAgICBzeW1ib2wud2lkdGggPSBzeW1ib2wuaGVpZ2h0ID0gNDA7XHJcbiAgfVxyXG4gIHBhbigpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5jb25zdHJhaW50cyA9IHRoaXMuZGlhZ3JhbS5jb25zdHJhaW50cyB8IERpYWdyYW1Db25zdHJhaW50cy5QYW47XHJcbiAgICB0aGlzLmRpYWdyYW0udG9vbCA9IERpYWdyYW1Ub29scy5ab29tUGFuO1xyXG4gIH1cclxuICBjdXJzb3IoKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uY29uc3RyYWludHMgPSB0aGlzLmRpYWdyYW0uY29uc3RyYWludHMgJiB+RGlhZ3JhbUNvbnN0cmFpbnRzLlBhbjtcclxuICAgIHRoaXMuZGlhZ3JhbS50b29sID0gRGlhZ3JhbVRvb2xzLkRlZmF1bHQ7XHJcbiAgfVxyXG4gIHNlbGVjdGlvbkNoYW5nZShldnQ6IElTZWxlY3Rpb25DaGFuZ2VFdmVudEFyZ3MpIHtcclxuICAgIGNvbnN0IHsgbmV3VmFsdWUsIHN0YXRlIH0gPSBldnQ7XHJcbiAgICBpZiAoc3RhdGUgIT09ICdDaGFuZ2luZycgfHwgIW5ld1ZhbHVlLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLl9ub2RlZGVzdHJveS5uZXh0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGNvbm5lY3RvcnMgPSBuZXdWYWx1ZS5maWx0ZXIobiA9PiBuIGluc3RhbmNlb2YgQ29ubmVjdG9yKS5tYXAobiA9PiBuIGFzIENvbm5lY3Rvck1vZGVsKTtcclxuICAgIGlmIChjb25uZWN0b3JzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBjb25uZWN0b3IgPSBjb25uZWN0b3JzWzBdLFxyXG4gICAgICAgIHR5cGUgPSBjb25uZWN0b3IudHlwZTtcclxuICAgICAgdGhpcy5jb25uZWN0b3JUeXBlID0gY29ubmVjdG9ycy5sZW5ndGggPT09IDEgfHxcclxuICAgICAgICBjb25uZWN0b3JzLmV2ZXJ5KGMgPT4gYy50eXBlID09PSB0eXBlKSA/IHR5cGUgOiBudWxsO1xyXG4gICAgICBpZiAoY29ubmVjdG9yLmFubm90YXRpb25zLmxlbmd0aCAmJiBjb25uZWN0b3IuYW5ub3RhdGlvbnNbMF0uc3R5bGUpXHJcbiAgICAgICAgdGhpcy5mb250U2l6ZSA9IGNvbm5lY3Rvci5hbm5vdGF0aW9uc1swXS5zdHlsZS5mb250U2l6ZTtcclxuICAgICAgdGhpcy5jb25uZWN0b3JUeXBlID0gY29ubmVjdG9ycy5sZW5ndGggPT09IDEgfHxcclxuICAgICAgICBjb25uZWN0b3JzLmV2ZXJ5KGMgPT4gYy50eXBlID09PSB0eXBlKSA/IHR5cGUgOiBudWxsO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgbm9kZXMgPSBuZXdWYWx1ZS5maWx0ZXIobiA9PiBuIGluc3RhbmNlb2YgTm9kZSk7XHJcbiAgICBpZiAobm9kZXMubGVuZ3RoKSB7XHJcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1swXSwgYWRkSW5mbyA9IG5vZGUuYWRkSW5mbyBhcyBhbnk7XHJcbiAgICAgIGlmICghYWRkSW5mbyB8fCAhYWRkSW5mb1snbm9kZVR5cGUnXSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIGlmIChub2RlLmFubm90YXRpb25zLmxlbmd0aCAmJiBub2RlLmFubm90YXRpb25zWzBdLnN0eWxlKVxyXG4gICAgICAgIHRoaXMuZm9udFNpemUgPSBub2RlLmFubm90YXRpb25zWzBdLnN0eWxlLmZvbnRTaXplO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFdvcmtmbG93Tm9kZUNvbXBvbmVudCwge1xyXG4gICAgICBzdGF0ZToge1xyXG4gICAgICAgIGRpYWdyYW06IHRoaXMuZGlhZ3JhbSxcclxuICAgICAgICBub2RlcyxcclxuICAgICAgICBjb25uZWN0b3JzXHJcbiAgICAgIH0sXHJcbiAgICAgIHBvbGljeTogT3BlblBvbGljeS5UYWIsXHJcbiAgICAgIGV4cGFuZGFibGU6IGZhbHNlLFxyXG4gICAgICBncm91cDogJydcclxuICAgIH0pLnRoZW4ocCA9PiB7XHJcbiAgICAgIHAuaW5zdGFuY2UuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX25vZGVkZXN0cm95KSkuc3Vic2NyaWJlKCgpID0+IHRoaXMuY2hhbmdlKCkpO1xyXG4gICAgICB0aGlzLl9ub2RlZGVzdHJveS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoKSA9PiBwLmNsb3NlKCkpXHJcbiAgICB9KTtcclxuICB9XHJcbiAgYWxpZ24odmFsdWU6IEFsaWdubWVudE9wdGlvbnMpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLm5vZGVzLmZvckVhY2gobiA9PiB7XHJcbiAgICAgIG4uYW5ub3RhdGlvbnMubGVuZ3RoICYmIE9iamVjdC5hc3NpZ24obi5hbm5vdGF0aW9uc1swXSwge1xyXG4gICAgICAgIG9mZnNldDoge1xyXG4gICAgICAgICAgeDogdmFsdWUgPT09ICdSaWdodCcgPyAxIDogdmFsdWUgPT09ICdMZWZ0JyA/IDAgOiAuNSxcclxuICAgICAgICAgIHk6IHZhbHVlID09PSAnVG9wJyA/IDAgOiB2YWx1ZSA9PT0gJ0JvdHRvbScgPyAxIDogLjVcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiB2YWx1ZSA9PT0gJ1RvcCcgPyAnQm90dG9tJyA6IHZhbHVlID09PSAnQm90dG9tJyA/ICdUb3AnIDogJ0NlbnRlcicsXHJcbiAgICAgICAgaG9yaXpvbnRhbEFsaWdubWVudDogdmFsdWUgPT09ICdSaWdodCcgPyAnTGVmdCcgOiB2YWx1ZSA9PT0gJ0xlZnQnID8gJ1JpZ2h0JyA6ICdDZW50ZXInXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5jb25uZWN0b3JzLmZvckVhY2goYyA9PlxyXG4gICAgICBjLmFubm90YXRpb25zLmZvckVhY2goYSA9PiBPYmplY3QuYXNzaWduKGEsIHtcclxuICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogdmFsdWUgPT09ICdUb3AnID8gJ0JvdHRvbScgOiB2YWx1ZSA9PT0gJ0JvdHRvbScgPyAnVG9wJyA6ICdDZW50ZXInLFxyXG4gICAgICAgIGhvcml6b250YWxBbGlnbm1lbnQ6IHZhbHVlID09PSAnTGVmdCcgPyAnTGVmdCcgOiB2YWx1ZSA9PT0gJ1JpZ2h0JyA/ICdSaWdodCcgOiAnQ2VudGVyJyxcclxuICAgICAgICAvLyAgZGlzcGxhY2VtZW50OiB7XHJcbiAgICAgICAgLy8gICAgeDogdmFsdWUgPT09ICdSaWdodCcgPyAxMCA6IHZhbHVlID09PSAnTGVmdCcgPyAtMTAgOiAwLFxyXG4gICAgICAgIC8vICAgIHk6IHZhbHVlID09PSAnVG9wJyA/IC0xMCA6IHZhbHVlID09PSAnQm90dG9tJyA/IDEwIDogMFxyXG4gICAgICAgIC8vICB9XHJcbiAgICAgIH0pKVxyXG4gICAgKTtcclxuICAgIHRoaXMuYWxpZ25tZW50ID0gdmFsdWU7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgcHVibGljIGRyYWdFbnRlcihhcmdzOiBJRHJhZ0VudGVyRXZlbnRBcmdzKTogdm9pZCB7XHJcbiAgICBpZiAoYXJncy5lbGVtZW50IGluc3RhbmNlb2YgTm9kZSkge1xyXG4gICAgICBzd2l0Y2ggKGFyZ3MuZWxlbWVudC5zaGFwZS50eXBlKSB7XHJcbiAgICAgICAgY2FzZSAnU3dpbUxhbmUnOlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBjb25zdCBzaGFwZSA9IGFyZ3MuZWxlbWVudC5zaGFwZSBhcyBTd2ltTGFuZU1vZGVsO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKHNoYXBlLm9yaWVudGF0aW9uKSB7XHJcbiAgICAgICAgICAgICAgY2FzZSAnSG9yaXpvbnRhbCc6XHJcbiAgICAgICAgICAgICAgICBzaGFwZS5sYW5lc1swXS53aWR0aCA9IDQwMDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIGNhc2UgJ1ZlcnRpY2FsJzpcclxuICAgICAgICAgICAgICAgIHNoYXBlLmxhbmVzWzBdLmhlaWdodCA9IDQwMDtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIGNhc2UgJ1RleHQnOlxyXG4gICAgICAgICAgLy8oYXJncy5lbGVtZW50LnN0eWxlIGFzIFRleHRTdHlsZU1vZGVsKS5mb250U2l6ZSA9IDIwO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBhcmdzLmVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGFyZ3MuZWxlbWVudC53aWR0aCA9IDEwMDtcclxuICAgICAgICAgICAgYXJncy5lbGVtZW50LmhlaWdodCAqPSAxMDAgLyB3aWR0aDtcclxuICAgICAgICAgICAgYXJncy5lbGVtZW50Lm9mZnNldFggKz0gKGFyZ3MuZWxlbWVudC53aWR0aCAtIHdpZHRoKSAvIDI7XHJcbiAgICAgICAgICAgIGFyZ3MuZWxlbWVudC5vZmZzZXRZICs9IChhcmdzLmVsZW1lbnQuaGVpZ2h0IC0gaGVpZ2h0KSAvIDI7XHJcbiAgICAgICAgICAgIGFyZ3MuZWxlbWVudC5zdHlsZSA9IHtcclxuICAgICAgICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxyXG4gICAgICAgICAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLl9zZXNzaW9uLnRoZW1lLmRhcmsgPyAnd2hpdGUnIDogJ2JsYWNrJyxcclxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHByb3BlcnR5Q2hhbmdlKGUpIHtcclxuICAgIGlmIChlLmNhdXNlICE9PSAyKSB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgY2hhbmdlKCkge1xyXG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgfVxyXG4gIGNvbGxlY3Rpb25DaGFuZ2UoKSB7XHJcbiAgICB0aGlzLl9yb3V0ZXIuY29sbGFwc2UoKTtcclxuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBDdHJsLXMgc2F2ZVxyXG4gICAqIEBwYXJhbSBldmVudFxyXG4gICAqL1xyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG4gIGhhbmRsZUtleWJvYXJkRXZlbnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRpcnR5ICYmIGV2ZW50LmN0cmxLZXkgJiYgKGV2ZW50LndoaWNoID09PSA4MyB8fCBldmVudC53aGljaCA9PT0gMTE1KSkge1xyXG4gICAgICB0aGlzLnNhdmUoKTtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9XHJcbiAgYmdDaGFuZ2UodmFsOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLm5vZGVzLmZvckVhY2gobiA9PiBuLnN0eWxlLmZpbGwgPSB2YWwpO1xyXG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgfVxyXG4gIGNvbG9yQ2hhbmdlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5ub2Rlcy5mb3JFYWNoKG4gPT4gbi5hbm5vdGF0aW9ucy5mb3JFYWNoKGEgPT4gYS5zdHlsZS5jb2xvciA9IHZhbCkpO1xyXG4gICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMuY29ubmVjdG9ycy5mb3JFYWNoKGMgPT4gYy5hbm5vdGF0aW9ucy5mb3JFYWNoKGEgPT4gYS5zdHlsZS5jb2xvciA9IHZhbCkpO1xyXG4gICAgdGhpcy5kaXJ0eSA9IHRydWU7XHJcbiAgfVxyXG4gIGNvbm5lY3RvclR5cGVDaGFuZ2UodHlwZTogU2VnbWVudHMpIHtcclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLmNvbm5lY3RvcnMuZm9yRWFjaChjID0+IGMudHlwZSA9IHR5cGUpO1xyXG4gICAgdGhpcy5jb25uZWN0b3JUeXBlID0gdHlwZTtcclxuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xyXG4gIH1cclxuICBib2xkQ2hhbmdlKCkge1xyXG4gICAgY29uc3QgdmFsID0gIXRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLm5vZGVzWzBdLmFubm90YXRpb25zWzBdPy5zdHlsZT8uYm9sZDtcclxuICAgIGZ1bmN0aW9uIGNoYW5nZShub2RlOiAoTm9kZU1vZGVsIHwgQ29ubmVjdG9yTW9kZWwpKSB7XHJcbiAgICAgIGlmIChub2RlLnNoYXBlLnR5cGUgPT09ICdUZXh0JylcclxuICAgICAgICAobm9kZS5zdHlsZSBhcyBUZXh0U3R5bGVNb2RlbCkuYm9sZCA9IHZhbDtcclxuICAgICAgZWxzZSBub2RlLmFubm90YXRpb25zLmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgaWYgKCFhLnN0eWxlKVxyXG4gICAgICAgICAgYS5zdHlsZSA9IHsgYm9sZDogdmFsIH07XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgYS5zdHlsZS5ib2xkID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLm5vZGVzLmZvckVhY2goY2hhbmdlKTtcclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLmNvbm5lY3RvcnMuZm9yRWFjaChjaGFuZ2UpO1xyXG4gICAgdGhpcy5kaWFncmFtLmRhdGFCaW5kKCk7XHJcbiAgfVxyXG4gIGl0YWxpY0NoYW5nZSgpIHtcclxuICAgIGNvbnN0IHZhbCA9ICF0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5ub2Rlc1swXS5hbm5vdGF0aW9uc1swXT8uc3R5bGU/Lml0YWxpYztcclxuICAgIGZ1bmN0aW9uIGNoYW5nZShub2RlOiAoTm9kZU1vZGVsIHwgQ29ubmVjdG9yTW9kZWwpKSB7XHJcbiAgICAgIGlmIChub2RlLnNoYXBlLnR5cGUgPT09ICdUZXh0JylcclxuICAgICAgICAobm9kZS5zdHlsZSBhcyBUZXh0U3R5bGVNb2RlbCkuaXRhbGljID0gdmFsO1xyXG4gICAgICBlbHNlIG5vZGUuYW5ub3RhdGlvbnMuZm9yRWFjaChhID0+IHtcclxuICAgICAgICBpZiAoIWEuc3R5bGUpXHJcbiAgICAgICAgICBhLnN0eWxlID0geyBpdGFsaWM6IHZhbCB9O1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGEuc3R5bGUuaXRhbGljID0gdmFsO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLm5vZGVzLmZvckVhY2goY2hhbmdlKTtcclxuICAgIHRoaXMuZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zLmNvbm5lY3RvcnMuZm9yRWFjaChjaGFuZ2UpO1xyXG4gICAgdGhpcy5kaWFncmFtLmRhdGFCaW5kKCk7XHJcbiAgfVxyXG4gIGZvbnRTaXplQ2hhbmdlKHZhbDogbnVtYmVyKSB7XHJcbiAgICBmdW5jdGlvbiBjaGFuZ2Uobm9kZTogKE5vZGVNb2RlbCB8IENvbm5lY3Rvck1vZGVsKSkge1xyXG4gICAgICBpZiAobm9kZS5zaGFwZS50eXBlID09PSAnVGV4dCcpXHJcbiAgICAgICAgKG5vZGUuc3R5bGUgYXMgVGV4dFN0eWxlTW9kZWwpLmZvbnRTaXplID0gdmFsO1xyXG4gICAgICBlbHNlIChub2RlIGFzIE5vZGVNb2RlbCkuYW5ub3RhdGlvbnM/LmZvckVhY2goYSA9PiB7XHJcbiAgICAgICAgaWYgKCFhLnN0eWxlKVxyXG4gICAgICAgICAgYS5zdHlsZSA9IHsgZm9udFNpemU6IHZhbCB9O1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIGEuc3R5bGUuZm9udFNpemUgPSB2YWw7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMubm9kZXMuZm9yRWFjaChjaGFuZ2UpO1xyXG4gICAgdGhpcy5kaWFncmFtLnNlbGVjdGVkSXRlbXMuY29ubmVjdG9ycy5mb3JFYWNoKGNoYW5nZSk7XHJcbiAgICB0aGlzLmRpYWdyYW0uZGF0YUJpbmQoKTtcclxuICB9XHJcbiAgc3Ryb2tlQ2hhbmdlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5jb25uZWN0b3JzLmZvckVhY2goYyA9PiB7XHJcbiAgICAgIGMuc3R5bGUuc3Ryb2tlQ29sb3IgPSB2YWw7XHJcbiAgICAgIGlmIChjLmFubm90YXRpb25zKSBjLmFubm90YXRpb25zWzBdLnN0eWxlLmNvbG9yID0gdmFsO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmRpYWdyYW0uc2VsZWN0ZWRJdGVtcy5ub2Rlcy5mb3JFYWNoKG4gPT4gbi5zdHlsZS5zdHJva2VDb2xvciA9IHZhbCk7XHJcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcclxuICB9XHJcbiAgc2F2ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5kaWFncmFtLnNlcmlhbGl6YXRpb25TZXR0aW5ncyA9IHsgcHJldmVudERlZmF1bHRzOiB0cnVlIH07XHJcbiAgICBjb25zdCBvYmogPSBKU09OLnBhcnNlKHRoaXMuZGlhZ3JhbS5zYXZlRGlhZ3JhbSgpKSBhcyBEaWFncmFtTW9kZWw7XHJcbiAgICB0aGlzLl9mb3JtLndvcmtmbG93LmNvbm5lY3RvcnMgPSBvYmouY29ubmVjdG9ycztcclxuICAgIHRoaXMuX2Zvcm0ud29ya2Zsb3cubm9kZXMgPSBvYmoubm9kZXMuZmlsdGVyKG4gPT4gbi5pZCAhPT0gJ3ZlcnNpb24nKTtcclxuICAgIHRoaXMuc2F2aW5nID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLl9zZXJ2aWNlLnNhdmUodGhpcy5fZm9ybSkudG9Qcm9taXNlKCkudGhlbih2ID0+IHtcclxuICAgICAgdGhpcy5wcy50b2FzdCgnQ2hhbmdlc1NhdmVkJyk7XHJcbiAgICAgIGlmICh0aGlzLl9mb3JtLndvcmtmbG93LnZlcnNpb24gPCB2KSB7XHJcbiAgICAgICAgdGhpcy5wcy50b2FzdCgnRGlhZ3JhbVZlcnNpb24nLCB2KTtcclxuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5kaWFncmFtLmdldE5vZGVPYmplY3QoJ3ZlcnNpb24nKTtcclxuICAgICAgICAobm9kZS5zaGFwZSBhcyBUZXh0TW9kZWwpLmNvbnRlbnQgPSB0aGlzLl90cmFuc2xhdGUuZ2V0KCdEaWFncmFtVmVyc2lvbicsIHYpO1xyXG4gICAgICAgIHRoaXMuZGlhZ3JhbS5kYXRhQmluZCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2Zvcm0ud29ya2Zsb3cudmVyc2lvbiA9IHY7XHJcbiAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zYXZpbmcgPSBmYWxzZTtcclxuICAgIH0sICgpID0+IHtcclxuICAgICAgdGhpcy5wcy5lcnJvcigpO1xyXG4gICAgICB0aGlzLnNhdmluZyA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zeW1ib2xQYWxldHRlPy5kZXN0cm95KCk7XHJcbiAgICB0aGlzLmRpYWdyYW0/LmRlc3Ryb3koKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5fZGVzdHJveS5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5fbm9kZWRlc3Ryb3kubmV4dCgpO1xyXG4gICAgdGhpcy5fbm9kZWRlc3Ryb3kuY29tcGxldGUoKTtcclxuICB9XHJcbn1cclxuIiwiPG1hdC10b29sYmFyPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJ0b29scyA9ICF0b29sc1wiIFtiaXpkb2NUb29sdGlwXT1cIidDb2xsYXBzZScgfCB0cmFuc2xhdGVcIj48bWF0LWljb24+dmlld19zaWRlYmFyPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1idXR0b24gKGNsaWNrKT1cInNhdmUoKVwiIGNvbG9yPVwicHJpbWFyeVwiIFtkaXNhYmxlZF09XCIhZGlydHkgfHwgc2F2aW5nXCI+e3snU2F2ZUNoYW5nZXMnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGlhZ3JhbS5maXRUb1BhZ2UoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidGaXRUb1BhZ2UnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPmZ1bGxzY3JlZW5fZXhpdDwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInBhbigpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ1BhbicgfCB0cmFuc2xhdGVcIj48c3BhbiBjbGFzcz1cImUtaWNvbnMgc2YtaWNvbi1wYW5cIj48L3NwYW4+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImN1cnNvcigpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0N1cnNvcicgfCB0cmFuc2xhdGVcIj48c3BhbiBjbGFzcz1cImUtaWNvbnMgc2YtaWNvbi1jdXJzb3JcIj48L3NwYW4+PC9idXR0b24+XHJcbiAgPHNwYW4gY2xhc3M9XCJ0b29scy1kaXZpZGVyXCI+PC9zcGFuPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkaWFncmFtLnVuZG8oKVwiIFtiaXpkb2NUb29sdGlwXT1cIidVbmRvJyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCIhZGlhZ3JhbS5oaXN0b3J5TWFuYWdlcj8uY2FuVW5kb1wiPjxtYXQtaWNvbj51bmRvPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGlhZ3JhbS5yZWRvKClcIiBbYml6ZG9jVG9vbHRpcF09XCInUmVkbycgfCB0cmFuc2xhdGVcIiBbZGlzYWJsZWRdPVwiIWRpYWdyYW0uaGlzdG9yeU1hbmFnZXI/LmNhblJlZG9cIj48bWF0LWljb24+cmVkbzwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPHNwYW4gY2xhc3M9XCJ0b29scy1kaXZpZGVyXCI+PC9zcGFuPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkaWFncmFtLmNvcHkoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidDb3B5JyB8IHRyYW5zbGF0ZVwiIFtkaXNhYmxlZF09XCJkaWFncmFtLnNlbGVjdGVkSXRlbXM/LmNvbm5lY3RvcnMubGVuZ3RoID09PSAwICYmIGRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8ubm9kZXMubGVuZ3RoID09PSAwXCI+PG1hdC1pY29uPmNvcHk8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJkaWFncmFtLnBhc3RlKClcIiBbYml6ZG9jVG9vbHRpcF09XCInUGFzdGUnIHwgdHJhbnNsYXRlXCI+PG1hdC1pY29uPnBhc3RlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiZGlhZ3JhbS5yZW1vdmUoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidSZW1vdmUnIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cImRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8uY29ubmVjdG9ycy5sZW5ndGggPT09IDAgJiYgZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zPy5ub2Rlcy5sZW5ndGggPT09IDBcIj48bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj48L2J1dHRvbj5cclxuICA8c3BhbiBjbGFzcz1cInRvb2xzLWRpdmlkZXJcIj48L3NwYW4+XHJcbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJsaW5lTWVudVwiIFtkaXNhYmxlZF09XCJkaWFncmFtLnNlbGVjdGVkSXRlbXM/LmNvbm5lY3RvcnMubGVuZ3RoID09PSAwXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0Nvbm5lY3Rvck1vZGUnfHRyYW5zbGF0ZVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJlLW1lbnUtaWNvblwiIFtuZ0NsYXNzXT1cInsnc2YtaWNvbi1zdHJhaWdodC1saW5lJzogY29ubmVjdG9yVHlwZSA9PT0gJ1N0cmFpZ2h0JyxcclxuICAgICAgICAgICdzZi1pY29uLW9ydGhvZ29uYWwtbGluZSc6IGNvbm5lY3RvclR5cGUgPT09ICdPcnRob2dvbmFsJyxcclxuICAgICAgICAgICdzZi1pY29uLWJlaXplci1saW5lJzogY29ubmVjdG9yVHlwZSA9PT0gJ0Jlemllcid9XCI+PC9zcGFuPlxyXG4gICAgPG1hdC1pY29uPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgPG1hdC1tZW51ICNsaW5lTWVudSBvdmVybGF5UGFuZWxDbGFzcz1cImljb24tbWVudS1wYW5lbFwiPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJjb25uZWN0b3JUeXBlQ2hhbmdlKCdTdHJhaWdodCcpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1tZW51LWljb24gc2YtaWNvbi1zdHJhaWdodC1saW5lXCI+PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNvbm5lY3RvclR5cGVDaGFuZ2UoJ09ydGhvZ29uYWwnKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUtbWVudS1pY29uIHNmLWljb24tb3J0aG9nb25hbC1saW5lXCI+PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImNvbm5lY3RvclR5cGVDaGFuZ2UoJ0JlemllcicpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1tZW51LWljb24gc2YtaWNvbi1iZWl6ZXItbGluZVwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPCEtLTxuZy1jb250YWluZXIgKm5nSWY9XCJjb25uZWN0b3JzLmxlbmd0aFwiPlxyXG4gICAgICA8IGJpemRvYy1jb2xvci1waWNrZXIgKHZhbHVlQ2hhbmdlcyk9J3N0cm9rZUNoYW5nZSgkZXZlbnQpJyBbbGFiZWxdPVwiJ1N0cm9rZSd8dHJhbnNsYXRlXCI+PC8gYml6ZG9jLWNvbG9yLXBpY2tlcj5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vZGVzWzBdLmFubm90YXRpb25zLmxlbmd0aFwiPlxyXG4gICAgICAgIDwgYml6ZG9jLWNvbG9yLXBpY2tlciAodmFsdWVDaGFuZ2VzKT0nY29sb3JDaGFuZ2UoJGV2ZW50KScgW2xhYmVsXT1cIidDb2xvcid8dHJhbnNsYXRlXCI+PC8gYml6ZG9jLWNvbG9yLXBpY2tlcj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwgYml6ZG9jLWNvbG9yLXBpY2tlciAodmFsdWVDaGFuZ2VzKT0nYmdDaGFuZ2UoJGV2ZW50KScgW2xhYmVsXT1cIidCYWNrZ3JvdW5kJ3x0cmFuc2xhdGVcIj48LyBiaXpkb2MtY29sb3ItcGlja2VyPlxyXG4gICAgICA8IGJpemRvYy1jb2xvci1waWNrZXIgKHZhbHVlQ2hhbmdlcyk9J3N0cm9rZUNoYW5nZSgkZXZlbnQpJyBbbGFiZWxdPVwiJ1N0cm9rZSd8dHJhbnNsYXRlXCI+PC8gYml6ZG9jLWNvbG9yLXBpY2tlcj5cclxuICAgIDwvbmctY29udGFpbmVyPi0tPlxyXG4gIDwvbWF0LW1lbnU+XHJcbiAgJm5ic3A7XHJcbiAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJhbGlnbk1lbnVcIiBbZGlzYWJsZWRdPVwiZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zPy5ub2Rlcy5sZW5ndGggPT09IDAgJiYgZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zPy5jb25uZWN0b3JzLmxlbmd0aCA9PT0gMFwiIFtiaXpkb2NUb29sdGlwXT1cIidBbGlnbid8dHJhbnNsYXRlXCI+XHJcbiAgICA8c3BhbiBjbGFzcz1cImUtaWNvbnNcIiBbbmdDbGFzc109XCJ7J3NmLWljb24tdG9wJzogYWxpZ25tZW50ID09PSAnVG9wJyxcclxuICAgICAgICAgICdzZi1pY29uLWxlZnQnOiBhbGlnbm1lbnQgPT09ICdMZWZ0JyxcclxuICAgICAgICAgICdzZi1pY29uLWNlbnRlcic6IGFsaWdubWVudCA9PT0gJ0NlbnRlcicsXHJcbiAgICAgICAgICAnc2YtaWNvbi1ib3R0b20nOiBhbGlnbm1lbnQgPT09ICdCb3R0b20nLFxyXG4gICAgICAgICAgJ3NmLWljb24tcmlnaHQnOiBhbGlnbm1lbnQgPT09ICdSaWdodCd9XCI+PC9zcGFuPlxyXG4gICAgPG1hdC1pY29uPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+XHJcbiAgPC9idXR0b24+XHJcbiAgPG1hdC1tZW51ICNhbGlnbk1lbnUgb3ZlcmxheVBhbmVsQ2xhc3M9XCJpY29uLW1lbnUtcGFuZWxcIj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWxpZ24oJ1RvcCcpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLXRvcFwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhbGlnbignTGVmdCcpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLWxlZnRcIj48L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiYWxpZ24oJ0NlbnRlcicpXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZS1pY29ucyBzZi1pY29uLWNlbnRlclwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhbGlnbignUmlnaHQnKVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImUtaWNvbnMgc2YtaWNvbi1yaWdodFwiPjwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJhbGlnbignQm90dG9tJylcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJlLWljb25zIHNmLWljb24tYm90dG9tXCI+PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9tYXQtbWVudT5cclxuICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiYm9sZENoYW5nZSgpXCIgW2JpemRvY1Rvb2x0aXBdPVwiJ0JvbGQnIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cImRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8uY29ubmVjdG9ycy5sZW5ndGggPT09IDAgJiYgZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zPy5ub2Rlcy5sZW5ndGggPT09IDBcIj48bWF0LWljb24+Zm9ybWF0X2JvbGQ8L21hdC1pY29uPjwvYnV0dG9uPlxyXG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJpdGFsaWNDaGFuZ2UoKVwiIFtiaXpkb2NUb29sdGlwXT1cIidJdGFsaWMnIHwgdHJhbnNsYXRlXCIgW2Rpc2FibGVkXT1cImRpYWdyYW0uc2VsZWN0ZWRJdGVtcz8uY29ubmVjdG9ycy5sZW5ndGggPT09IDAgJiYgZGlhZ3JhbS5zZWxlY3RlZEl0ZW1zPy5ub2Rlcy5sZW5ndGggPT09IDBcIj48bWF0LWljb24+Zm9ybWF0X2l0YWxpYzwvbWF0LWljb24+PC9idXR0b24+XHJcbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNpemVNZW51XCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJkaWFncmFtLnNlbGVjdGVkSXRlbXM/Lm5vZGVzLmxlbmd0aCA9PT0gMCAmJiBkaWFncmFtLnNlbGVjdGVkSXRlbXM/LmNvbm5lY3RvcnMubGVuZ3RoID09PSAwXCJcclxuICAgICAgICAgIFtiaXpkb2NUb29sdGlwXT1cIidGb250U2l6ZSd8dHJhbnNsYXRlXCI+XHJcbiAgICA8bWF0LWljb24+Zm9ybWF0X3NpemU8L21hdC1pY29uPlxyXG4gIDwvYnV0dG9uPlxyXG4gIDxtYXQtbWVudSAjc2l6ZU1lbnUgb3ZlcmxheVBhbmVsQ2xhc3M9XCJpY29uLW1lbnUtcGFuZWxcIj5cclxuICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgc2l6ZSBvZiBmb250U2l6ZXNcIiAoY2xpY2spPVwiZm9udFNpemVDaGFuZ2Uoc2l6ZSlcIj5cclxuICAgICAge3tzaXplfX1cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvbWF0LW1lbnU+XHJcbiAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyXCI+PC9zcGFuPlxyXG48L21hdC10b29sYmFyPlxyXG48ZGl2IGNsYXNzPVwicm93IGNvbnRhaW5lclwiPlxyXG4gIDxkaXYgaWQ9XCJzeW1ib2xwYWxldHRlXCIgW3N0eWxlLmRpc3BsYXldPVwidG9vbHM/Jyc6J25vbmUnXCI+XHJcbiAgICA8ZGl2IGRpcj1cImx0clwiICNzeW1ib2xQYWxldHRlRWw+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2ICNkaWFncmFtRWwgaWQ9XCJkaWFncmFtXCIgZnhGbGV4IGRpcj1cImx0clwiPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19