@bryntum/calendar-angular-thin 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +44 -0
- package/bryntum-calendar-angular-thin.d.ts +5 -0
- package/bundles/bryntum-calendar-angular-thin.umd.js +22195 -0
- package/bundles/bryntum-calendar-angular-thin.umd.js.map +1 -0
- package/esm2015/bryntum-calendar-angular-thin.js +5 -0
- package/esm2015/lib/bryntum-agenda-view.component.js +2503 -0
- package/esm2015/lib/bryntum-calendar-date-picker.component.js +1045 -0
- package/esm2015/lib/bryntum-calendar-project-model.component.js +369 -0
- package/esm2015/lib/bryntum-calendar.component.js +2355 -0
- package/esm2015/lib/bryntum-day-agenda-view.component.js +1338 -0
- package/esm2015/lib/bryntum-day-resource-view.component.js +1347 -0
- package/esm2015/lib/bryntum-day-view.component.js +1323 -0
- package/esm2015/lib/bryntum-event-list.component.js +2453 -0
- package/esm2015/lib/bryntum-mode-selector.component.js +702 -0
- package/esm2015/lib/bryntum-month-agenda-view.component.js +1201 -0
- package/esm2015/lib/bryntum-month-grid.component.js +1262 -0
- package/esm2015/lib/bryntum-month-view.component.js +1337 -0
- package/esm2015/lib/bryntum-range-menu.component.js +884 -0
- package/esm2015/lib/bryntum-resource-view.component.js +1068 -0
- package/esm2015/lib/bryntum-week-view.component.js +1323 -0
- package/esm2015/lib/bryntum-year-view.component.js +1163 -0
- package/esm2015/lib/calendar.module.js +99 -0
- package/esm2015/lib/wrapper.helper.js +74 -0
- package/esm2015/public-api.js +21 -0
- package/fesm2015/bryntum-calendar-angular-thin.js +21714 -0
- package/fesm2015/bryntum-calendar-angular-thin.js.map +1 -0
- package/lib/bryntum-agenda-view.component.d.ts +2953 -0
- package/lib/bryntum-calendar-date-picker.component.d.ts +1525 -0
- package/lib/bryntum-calendar-project-model.component.d.ts +399 -0
- package/lib/bryntum-calendar.component.d.ts +2577 -0
- package/lib/bryntum-day-agenda-view.component.d.ts +1960 -0
- package/lib/bryntum-day-resource-view.component.d.ts +2025 -0
- package/lib/bryntum-day-view.component.d.ts +1980 -0
- package/lib/bryntum-event-list.component.d.ts +2888 -0
- package/lib/bryntum-mode-selector.component.d.ts +851 -0
- package/lib/bryntum-month-agenda-view.component.d.ts +1765 -0
- package/lib/bryntum-month-grid.component.d.ts +1731 -0
- package/lib/bryntum-month-view.component.d.ts +1897 -0
- package/lib/bryntum-range-menu.component.d.ts +1130 -0
- package/lib/bryntum-resource-view.component.d.ts +1512 -0
- package/lib/bryntum-week-view.component.d.ts +1980 -0
- package/lib/bryntum-year-view.component.d.ts +1661 -0
- package/lib/calendar.module.d.ts +22 -0
- package/lib/wrapper.helper.d.ts +26 -0
- package/package.json +33 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,2453 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
|
+
/**
|
|
3
|
+
* Angular wrapper for Bryntum EventList
|
|
4
|
+
*/
|
|
5
|
+
import { Component, EventEmitter, Output, Input } from '@angular/core';
|
|
6
|
+
import WrapperHelper from './wrapper.helper';
|
|
7
|
+
import { Widget } from '@bryntum/core-thin';
|
|
8
|
+
import { EventList } from '@bryntum/calendar-thin';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
export class BryntumEventListComponent {
|
|
11
|
+
constructor(element) {
|
|
12
|
+
this.bryntumConfig = {
|
|
13
|
+
adopt: undefined,
|
|
14
|
+
appendTo: undefined,
|
|
15
|
+
href: undefined,
|
|
16
|
+
angularComponent: this,
|
|
17
|
+
features: {},
|
|
18
|
+
listeners: {}
|
|
19
|
+
};
|
|
20
|
+
// Events emitters
|
|
21
|
+
/**
|
|
22
|
+
* This event fires whenever the [autoCreate gesture](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) is detected
|
|
23
|
+
* and also when a [drag-create](https://bryntum.com/products/calendar/docs/api/Calendar/feature/CalendarDrag) gesture is detected.
|
|
24
|
+
* ...
|
|
25
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-beforeAutoCreate)
|
|
26
|
+
* @param {object} event Event object
|
|
27
|
+
* @param {Event} event.domEvent The DOM event which initiated the creation.
|
|
28
|
+
* @param {Date} event.date *DEPRECATED in favour of `startDate`.* The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
|
|
29
|
+
* @param {Date} event.startDate The starting time of the event to be created. If this is in a `DayView`, this will be snapped according to the specification in [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate)
|
|
30
|
+
* @param {Date} event.endDate The ending time of the event to be created.
|
|
31
|
+
* @param {Scheduler.model.ResourceModel} event.resourceRecord The resource if the UI includes a resource.
|
|
32
|
+
* @param {CalendarView} event.view This view.
|
|
33
|
+
*/
|
|
34
|
+
this.onBeforeAutoCreate = new EventEmitter();
|
|
35
|
+
/**
|
|
36
|
+
* Fires on the owning Grid before the cell editing is canceled, return `false` to prevent cancellation.
|
|
37
|
+
* @param {object} event Event object
|
|
38
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
39
|
+
* @param {Grid.util.GridLocation} event.editorContext Editing context
|
|
40
|
+
*/
|
|
41
|
+
this.onBeforeCancelCellEdit = new EventEmitter();
|
|
42
|
+
/**
|
|
43
|
+
* Fires on the owning Grid before the row editing is canceled, return false to signal that the value is invalid and editing should not be finalized.
|
|
44
|
+
* ...
|
|
45
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-beforeCancelRowEdit)
|
|
46
|
+
* @param {object} event Event object
|
|
47
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
48
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
49
|
+
*/
|
|
50
|
+
this.onBeforeCancelRowEdit = new EventEmitter();
|
|
51
|
+
/**
|
|
52
|
+
* Fires on the owning Grid before editing starts, return `false` to prevent editing
|
|
53
|
+
* @param {object} event Event object
|
|
54
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
55
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
56
|
+
*/
|
|
57
|
+
this.onBeforeCellEditStart = new EventEmitter();
|
|
58
|
+
/**
|
|
59
|
+
* Fires on the owning Grid before deleting a range of selected cell values by pressing `Backspace` or `Del`
|
|
60
|
+
* buttons while [autoEdit](https://bryntum.com/products/calendar/docs/api/Grid/feature/CellEdit#config-autoEdit) is set to `true`. Return `false` to prevent editing.
|
|
61
|
+
* @param {object} event Event object
|
|
62
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
63
|
+
* @param {(Grid.util.GridLocation|Core.data.Model)[]} event.gridSelection An array of cell selectors or records that will have their values deleted (the records themselves will not get deleted, only visible column values).
|
|
64
|
+
*/
|
|
65
|
+
this.onBeforeCellRangeDelete = new EventEmitter();
|
|
66
|
+
/**
|
|
67
|
+
* Fires for each selected record on the owning Grid before editing a range of selected cell values
|
|
68
|
+
* @param {object} event Event object
|
|
69
|
+
* @param {Core.data.Model} event.record Current selected record from the range
|
|
70
|
+
* @param {string} event.field The field being changed
|
|
71
|
+
* @param {any} event.value The value being set
|
|
72
|
+
*/
|
|
73
|
+
this.onBeforeCellRangeEdit = new EventEmitter();
|
|
74
|
+
/**
|
|
75
|
+
* Triggered before a view's orientating date changes.
|
|
76
|
+
* ...
|
|
77
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-beforeChangeDate)
|
|
78
|
+
* @param {object} event Event object
|
|
79
|
+
* @param {Date} event.oldDate The current orientating date of this view.
|
|
80
|
+
* @param {Date} event.date The new date to which this view is to be orientated.
|
|
81
|
+
*/
|
|
82
|
+
this.onBeforeChangeDate = new EventEmitter();
|
|
83
|
+
/**
|
|
84
|
+
* This event is fired prior to starting a column drag gesture. The drag is canceled if a listener returns `false`.
|
|
85
|
+
* @param {object} event Event object
|
|
86
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
87
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
88
|
+
* @param {Event} event.event The browser event.
|
|
89
|
+
*/
|
|
90
|
+
this.onBeforeColumnDragStart = new EventEmitter();
|
|
91
|
+
/**
|
|
92
|
+
* This event is fired when a column is dropped, and you can return false from a listener to abort the operation.
|
|
93
|
+
* @param {object} event Event object
|
|
94
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
95
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
96
|
+
* @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
|
|
97
|
+
* @param {Grid.column.Column} event.newParent The new parent column.
|
|
98
|
+
* @param {Event} event.event The browser event.
|
|
99
|
+
* @param {string} event.region The region where the column was dropped.
|
|
100
|
+
*/
|
|
101
|
+
this.onBeforeColumnDropFinalize = new EventEmitter();
|
|
102
|
+
/**
|
|
103
|
+
* This event is fired prior to starting a column resize gesture. The resize is canceled if a listener returns
|
|
104
|
+
* `false`.
|
|
105
|
+
* @param {object} event Event object
|
|
106
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
107
|
+
* @param {Grid.column.Column} event.column The column
|
|
108
|
+
* @param {Event} event.domEvent The browser event
|
|
109
|
+
*/
|
|
110
|
+
this.onBeforeColumnResize = new EventEmitter();
|
|
111
|
+
/**
|
|
112
|
+
* Fires on the owning Grid before a copy action is performed, return `false` to prevent the action
|
|
113
|
+
* @param {object} event Event object
|
|
114
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
115
|
+
* @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
|
|
116
|
+
* @param {string} event.data The string data about to be copied or cut
|
|
117
|
+
* @param {boolean} event.isCut `true` if this is a cut action
|
|
118
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other beforeCopy events
|
|
119
|
+
*/
|
|
120
|
+
this.onBeforeCopy = new EventEmitter();
|
|
121
|
+
/**
|
|
122
|
+
* Fires on the owning Grid before CSV export starts. Return `false` to cancel the export.
|
|
123
|
+
* @param {object} event Event object
|
|
124
|
+
* @param {ExportConfig} event.config Export config
|
|
125
|
+
* @param {Grid.column.Column[]} event.columns An array of columns to export
|
|
126
|
+
* @param {Core.data.Model[]} event.rows An array of records to export
|
|
127
|
+
* @param {string} event.lineDelimiter The CSV delimiter to separate lines
|
|
128
|
+
* @param {string} event.columnDelimiter The CSV delimiter to separate values on one line
|
|
129
|
+
*/
|
|
130
|
+
this.onBeforeCSVExport = new EventEmitter();
|
|
131
|
+
/**
|
|
132
|
+
* Fires before an object is destroyed.
|
|
133
|
+
* @param {object} event Event object
|
|
134
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
135
|
+
*/
|
|
136
|
+
this.onBeforeDestroy = new EventEmitter();
|
|
137
|
+
/**
|
|
138
|
+
* Fires on the owning Grid before Excel export starts. Return `false` to cancel the export.
|
|
139
|
+
* @param {object} event Event object
|
|
140
|
+
* @param {ExportConfig} event.config Export config
|
|
141
|
+
* @param {XLSColumn[]} event.columns An array of columns to export
|
|
142
|
+
* @param {any[][]} event.rows An array of records to export
|
|
143
|
+
*/
|
|
144
|
+
this.onBeforeExcelExport = new EventEmitter();
|
|
145
|
+
/**
|
|
146
|
+
* Fired before dragging of the FillHandle starts, return `false` to prevent the drag operation.
|
|
147
|
+
* @param {object} event Event object
|
|
148
|
+
* @param {Grid.util.GridLocation} event.cell Information about the column / record
|
|
149
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
150
|
+
*/
|
|
151
|
+
this.onBeforeFillHandleDragStart = new EventEmitter();
|
|
152
|
+
/**
|
|
153
|
+
* Fires on the owning Grid before the cell editing is finished, return false to signal that the value is invalid and editing should not be finalized.
|
|
154
|
+
* @param {object} event Event object
|
|
155
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
156
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
157
|
+
*/
|
|
158
|
+
this.onBeforeFinishCellEdit = new EventEmitter();
|
|
159
|
+
/**
|
|
160
|
+
* Fires on the owning Grid before the row editing is finished, return false to signal that the value is invalid and editing should not be finalized.
|
|
161
|
+
* ...
|
|
162
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-beforeFinishRowEdit)
|
|
163
|
+
* @param {object} event Event object
|
|
164
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
165
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
166
|
+
*/
|
|
167
|
+
this.onBeforeFinishRowEdit = new EventEmitter();
|
|
168
|
+
/**
|
|
169
|
+
* Triggered before a widget is hidden. Return `false` to prevent the action.
|
|
170
|
+
* @param {object} event Event object
|
|
171
|
+
* @param {Core.widget.Widget} event.source The widget being hidden.
|
|
172
|
+
*/
|
|
173
|
+
this.onBeforeHide = new EventEmitter();
|
|
174
|
+
/**
|
|
175
|
+
* Fires on the owning Grid before a paste action is performed, return `false` to prevent the action
|
|
176
|
+
* @param {object} event Event object
|
|
177
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
178
|
+
* @param {string} event.clipboardData The clipboardData about to be pasted
|
|
179
|
+
* @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
|
|
180
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other beforePaste events
|
|
181
|
+
* @param {string} event.text The raw text from clipboard
|
|
182
|
+
*/
|
|
183
|
+
this.onBeforePaste = new EventEmitter();
|
|
184
|
+
/**
|
|
185
|
+
* Fires on the owning Grid before export started. Return `false` to cancel the export.
|
|
186
|
+
* @param {object} event Event object
|
|
187
|
+
* @param {object} event.config Export config
|
|
188
|
+
*/
|
|
189
|
+
this.onBeforePdfExport = new EventEmitter();
|
|
190
|
+
/**
|
|
191
|
+
* Fires before a row is rendered.
|
|
192
|
+
* @param {object} event Event object
|
|
193
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
194
|
+
* @param {Grid.row.Row} event.row The row about to be rendered.
|
|
195
|
+
* @param {Core.data.Model} event.record The record for the row.
|
|
196
|
+
* @param {number} event.recordIndex The zero-based index of the record.
|
|
197
|
+
*/
|
|
198
|
+
this.onBeforeRenderRow = new EventEmitter();
|
|
199
|
+
/**
|
|
200
|
+
* Grid rows are about to be rendered
|
|
201
|
+
* @param {object} event Event object
|
|
202
|
+
* @param {Grid.view.Grid} event.source This grid.
|
|
203
|
+
*/
|
|
204
|
+
this.onBeforeRenderRows = new EventEmitter();
|
|
205
|
+
/**
|
|
206
|
+
* Triggered before a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
207
|
+
* @param {object} event Event object
|
|
208
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` is to be changed
|
|
209
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
210
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
211
|
+
*/
|
|
212
|
+
this.onBeforeResponsiveStateChange = new EventEmitter();
|
|
213
|
+
/**
|
|
214
|
+
* This event fires before row collapse is started.
|
|
215
|
+
* ...
|
|
216
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-beforeRowCollapse)
|
|
217
|
+
* @param {object} event Event object
|
|
218
|
+
* @param {Core.data.Model} event.record Record
|
|
219
|
+
*/
|
|
220
|
+
this.onBeforeRowCollapse = new EventEmitter();
|
|
221
|
+
/**
|
|
222
|
+
* This event fires before row expand is started.
|
|
223
|
+
* ...
|
|
224
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-beforeRowExpand)
|
|
225
|
+
* @param {object} event Event object
|
|
226
|
+
* @param {Core.data.Model} event.record Record
|
|
227
|
+
*/
|
|
228
|
+
this.onBeforeRowExpand = new EventEmitter();
|
|
229
|
+
/**
|
|
230
|
+
* Fires before the selection changes. Returning `false` from a listener prevents the change
|
|
231
|
+
* @param {object} event Event object
|
|
232
|
+
* @param {string} event.action `'select'`/`'deselect'`
|
|
233
|
+
* @param {'row','cell'} event.mode `'row'`/`'cell'`
|
|
234
|
+
* @param {Grid.view.Grid} event.source
|
|
235
|
+
* @param {Core.data.Model[]} event.deselected The records to be deselected in this operation.
|
|
236
|
+
* @param {Core.data.Model[]} event.selected The records to be selected in this operation.
|
|
237
|
+
* @param {Core.data.Model[]} event.selection The records in the current selection, before applying `selected` and `deselected`
|
|
238
|
+
* @param {Grid.util.GridLocation[]} event.deselectedCells The cells to be deselected in this operation.
|
|
239
|
+
* @param {Grid.util.GridLocation[]} event.selectedCells The cells to be selected in this operation.
|
|
240
|
+
* @param {Grid.util.GridLocation[]} event.cellSelection The cells in the current selection, before applying `selectedCells` and `deselectedCells`
|
|
241
|
+
*/
|
|
242
|
+
this.onBeforeSelectionChange = new EventEmitter();
|
|
243
|
+
/**
|
|
244
|
+
* Fired before this container will load record values into its child fields. This is useful if you
|
|
245
|
+
* want to modify the UI before data is loaded (e.g. set some input field to be readonly)
|
|
246
|
+
* @param {object} event Event object
|
|
247
|
+
* @param {Core.widget.Container} event.source The container
|
|
248
|
+
* @param {Core.data.Model} event.record The record
|
|
249
|
+
*/
|
|
250
|
+
this.onBeforeSetRecord = new EventEmitter();
|
|
251
|
+
/**
|
|
252
|
+
* Triggered before a widget is shown. Return `false` to prevent the action.
|
|
253
|
+
* @param {object} event Event object
|
|
254
|
+
* @param {Core.widget.Widget,any} event.source The widget being shown
|
|
255
|
+
*/
|
|
256
|
+
this.onBeforeShow = new EventEmitter();
|
|
257
|
+
/**
|
|
258
|
+
* Fires on the owning Grid before editing starts, return `false` to prevent editing
|
|
259
|
+
* @param {object} event Event object
|
|
260
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
261
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
262
|
+
*/
|
|
263
|
+
this.onBeforeStartRowEdit = new EventEmitter();
|
|
264
|
+
/**
|
|
265
|
+
* Fired before state is applied to the source. Allows editing the state object or preventing the operation.
|
|
266
|
+
* @param {object} event Event object
|
|
267
|
+
* @param {GridStateInfo} event.state State object config
|
|
268
|
+
*/
|
|
269
|
+
this.onBeforeStateApply = new EventEmitter();
|
|
270
|
+
/**
|
|
271
|
+
* Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
|
|
272
|
+
* @param {object} event Event object
|
|
273
|
+
* @param {GridStateInfo} event.state State object config
|
|
274
|
+
*/
|
|
275
|
+
this.onBeforeStateSave = new EventEmitter();
|
|
276
|
+
/**
|
|
277
|
+
* Fired when a group is going to be expanded or collapsed using the UI.
|
|
278
|
+
* Returning `false` from a listener prevents the operation
|
|
279
|
+
* @param {object} event Event object
|
|
280
|
+
* @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
|
|
281
|
+
* @param {Core.data.Model[]} event.groupRecords The group records being toggled
|
|
282
|
+
* @param {boolean} event.collapse Collapsed (true) or expanded (false)
|
|
283
|
+
* @param {Event} event.domEvent The user interaction event (eg a `click` event) if the toggle request was instigated by user interaction.
|
|
284
|
+
*/
|
|
285
|
+
this.onBeforeToggleGroup = new EventEmitter();
|
|
286
|
+
/**
|
|
287
|
+
* Fired before a parent node record toggles its collapsed state.
|
|
288
|
+
* @param {object} event Event object
|
|
289
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
290
|
+
* @param {Core.data.Model} event.record The record being toggled.
|
|
291
|
+
* @param {boolean} event.collapse `true` if the node is being collapsed.
|
|
292
|
+
*/
|
|
293
|
+
this.onBeforeToggleNode = new EventEmitter();
|
|
294
|
+
/**
|
|
295
|
+
* Fires on the owning Grid when editing is cancelled
|
|
296
|
+
* @param {object} event Event object
|
|
297
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
298
|
+
* @param {Grid.util.GridLocation} event.editorContext Editing context
|
|
299
|
+
* @param {Event} event.event Included if the cancellation was triggered by a DOM event
|
|
300
|
+
*/
|
|
301
|
+
this.onCancelCellEdit = new EventEmitter();
|
|
302
|
+
/**
|
|
303
|
+
* Fires when any other event is fired from the object.
|
|
304
|
+
* ...
|
|
305
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-catchAll)
|
|
306
|
+
* @param {object} event Event object
|
|
307
|
+
* @param {{[key: string]: any, type: string}} event.event The Object that contains event details
|
|
308
|
+
* @param {string} event.event.type The type of the event which is caught by the listener
|
|
309
|
+
*/
|
|
310
|
+
this.onCatchAll = new EventEmitter();
|
|
311
|
+
/**
|
|
312
|
+
* Fired when user clicks in a grid cell
|
|
313
|
+
* @param {object} event Event object
|
|
314
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
315
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
316
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
317
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
318
|
+
* @param {HTMLElement} event.target The target element
|
|
319
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
320
|
+
*/
|
|
321
|
+
this.onCellClick = new EventEmitter();
|
|
322
|
+
/**
|
|
323
|
+
* Fired when user activates contextmenu in a grid cell
|
|
324
|
+
* @param {object} event Event object
|
|
325
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
326
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
327
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
328
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
329
|
+
* @param {HTMLElement} event.target The target element
|
|
330
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
331
|
+
*/
|
|
332
|
+
this.onCellContextMenu = new EventEmitter();
|
|
333
|
+
/**
|
|
334
|
+
* Fired when user double clicks a grid cell
|
|
335
|
+
* @param {object} event Event object
|
|
336
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
337
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
338
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
339
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
340
|
+
* @param {HTMLElement} event.target The target element
|
|
341
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
342
|
+
*/
|
|
343
|
+
this.onCellDblClick = new EventEmitter();
|
|
344
|
+
/**
|
|
345
|
+
* Fired when a new set of events has been gathered for this view's date range.
|
|
346
|
+
* @param {object} event Event object
|
|
347
|
+
* @param {Map<any, any>} event.cellMap The map of date keys to [day cell](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DayCellCollecter#typedef-DayCell) data blocks.
|
|
348
|
+
*/
|
|
349
|
+
this.onCellMapPopulated = new EventEmitter();
|
|
350
|
+
/**
|
|
351
|
+
* This event fires on the owning grid before the context menu is shown for a cell.
|
|
352
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/calendar/docs/api/Grid/feature/CellMenu#config-processItems).
|
|
353
|
+
* ...
|
|
354
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-cellMenuBeforeShow)
|
|
355
|
+
* @param {object} event Event object
|
|
356
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
357
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
358
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
359
|
+
* @param {Grid.column.Column} event.column Column
|
|
360
|
+
* @param {Core.data.Model} event.record Record
|
|
361
|
+
*/
|
|
362
|
+
this.onCellMenuBeforeShow = new EventEmitter();
|
|
363
|
+
/**
|
|
364
|
+
* This event fires on the owning grid when an item is selected in the cell context menu.
|
|
365
|
+
* @param {object} event Event object
|
|
366
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
367
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
368
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
369
|
+
* @param {Grid.column.Column} event.column Column
|
|
370
|
+
* @param {Core.data.Model} event.record Record
|
|
371
|
+
*/
|
|
372
|
+
this.onCellMenuItem = new EventEmitter();
|
|
373
|
+
/**
|
|
374
|
+
* This event fires on the owning grid after the context menu is shown for a cell.
|
|
375
|
+
* @param {object} event Event object
|
|
376
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
377
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
378
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
379
|
+
* @param {Grid.column.Column} event.column Column
|
|
380
|
+
* @param {Core.data.Model} event.record Record
|
|
381
|
+
*/
|
|
382
|
+
this.onCellMenuShow = new EventEmitter();
|
|
383
|
+
/**
|
|
384
|
+
* This event fires on the owning grid when a check item is toggled in the cell context menu.
|
|
385
|
+
* @param {object} event Event object
|
|
386
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
387
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
388
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
389
|
+
* @param {Grid.column.Column} event.column Column
|
|
390
|
+
* @param {Core.data.Model} event.record Record
|
|
391
|
+
* @param {boolean} event.checked Checked or not
|
|
392
|
+
*/
|
|
393
|
+
this.onCellMenuToggleItem = new EventEmitter();
|
|
394
|
+
/**
|
|
395
|
+
* Fired when the mouse enters a cell
|
|
396
|
+
* @param {object} event Event object
|
|
397
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
398
|
+
* @param {Core.data.Model} event.record The record representing the hovered cell
|
|
399
|
+
* @param {Grid.column.Column} event.column The column currently hovered
|
|
400
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
401
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
402
|
+
*/
|
|
403
|
+
this.onCellMouseEnter = new EventEmitter();
|
|
404
|
+
/**
|
|
405
|
+
* Fired when the mouse leaves a cell
|
|
406
|
+
* @param {object} event Event object
|
|
407
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
408
|
+
* @param {Core.data.Model} event.record The record representing the cell that the mouse left
|
|
409
|
+
* @param {Grid.column.Column} event.column The column representing the cell that the mouse left
|
|
410
|
+
* @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
|
|
411
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
412
|
+
*/
|
|
413
|
+
this.onCellMouseLeave = new EventEmitter();
|
|
414
|
+
/**
|
|
415
|
+
* Fired when a user moves the mouse out of a grid cell
|
|
416
|
+
* @param {object} event Event object
|
|
417
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
418
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
419
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
420
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
421
|
+
* @param {HTMLElement} event.target The target element
|
|
422
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
423
|
+
*/
|
|
424
|
+
this.onCellMouseOut = new EventEmitter();
|
|
425
|
+
/**
|
|
426
|
+
* Fired when user moves the mouse over a grid cell
|
|
427
|
+
* @param {object} event Event object
|
|
428
|
+
* @param {Grid.view.Grid} event.grid The grid instance
|
|
429
|
+
* @param {Core.data.Model} event.record The record representing the row
|
|
430
|
+
* @param {Grid.column.Column} event.column The column to which the cell belongs
|
|
431
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
432
|
+
* @param {HTMLElement} event.target The target element
|
|
433
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
434
|
+
*/
|
|
435
|
+
this.onCellMouseOver = new EventEmitter();
|
|
436
|
+
/**
|
|
437
|
+
* Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
438
|
+
* @param {object} event Event object
|
|
439
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
440
|
+
*/
|
|
441
|
+
this.onCollapse = new EventEmitter();
|
|
442
|
+
/**
|
|
443
|
+
* Fired before a parent node record is collapsed.
|
|
444
|
+
* @param {object} event Event object
|
|
445
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
446
|
+
* @param {Core.data.Model} event.record The record which has been collapsed.
|
|
447
|
+
*/
|
|
448
|
+
this.onCollapseNode = new EventEmitter();
|
|
449
|
+
/**
|
|
450
|
+
* This event is fired when a column is being dragged, and you can set the `valid` flag on the `context` object
|
|
451
|
+
* to indicate whether the drop position is valid or not.
|
|
452
|
+
* @param {object} event Event object
|
|
453
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
454
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
455
|
+
* @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted (if not last).
|
|
456
|
+
* @param {Event} event.event The browser event.
|
|
457
|
+
* @param {object} event.context
|
|
458
|
+
* @param {boolean} event.context.valid Set this to `true` or `false` to indicate whether the drop position is valid.
|
|
459
|
+
*/
|
|
460
|
+
this.onColumnDrag = new EventEmitter();
|
|
461
|
+
/**
|
|
462
|
+
* This event is fired when a column drag gesture has started.
|
|
463
|
+
* @param {object} event Event object
|
|
464
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
465
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
466
|
+
* @param {Event} event.event The browser event.
|
|
467
|
+
*/
|
|
468
|
+
this.onColumnDragStart = new EventEmitter();
|
|
469
|
+
/**
|
|
470
|
+
* This event is always fired after a column is dropped. The `valid` param is `true` if the operation was not
|
|
471
|
+
* vetoed and the column was moved in the column store.
|
|
472
|
+
* @param {object} event Event object
|
|
473
|
+
* @param {Grid.view.Grid} event.source The grid instance.
|
|
474
|
+
* @param {Grid.column.Column} event.column The dragged column.
|
|
475
|
+
* @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
|
|
476
|
+
* @param {Grid.column.Column} event.newParent The new parent column.
|
|
477
|
+
* @param {boolean} event.valid `true` if the operation was not vetoed.
|
|
478
|
+
* @param {Event} event.event The browser event.
|
|
479
|
+
* @param {string} event.region The region where the column was dropped.
|
|
480
|
+
*/
|
|
481
|
+
this.onColumnDrop = new EventEmitter();
|
|
482
|
+
/**
|
|
483
|
+
* This event is fired after a resize gesture is completed.
|
|
484
|
+
* @param {object} event Event object
|
|
485
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
486
|
+
* @param {Grid.column.Column} event.column The resized column
|
|
487
|
+
* @param {Event} event.domEvent The browser event
|
|
488
|
+
*/
|
|
489
|
+
this.onColumnResize = new EventEmitter();
|
|
490
|
+
/**
|
|
491
|
+
* This event is fired when a column resize gesture starts.
|
|
492
|
+
* @param {object} event Event object
|
|
493
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
494
|
+
* @param {Grid.column.Column} event.column The column
|
|
495
|
+
* @param {Event} event.domEvent The browser event
|
|
496
|
+
*/
|
|
497
|
+
this.onColumnResizeStart = new EventEmitter();
|
|
498
|
+
/**
|
|
499
|
+
* This event fires on the owning widget when an item is selected in the context menu.
|
|
500
|
+
* @param {object} event Event object
|
|
501
|
+
* @param {Core.widget.Widget} event.source The owning widget
|
|
502
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
503
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
504
|
+
*/
|
|
505
|
+
this.onContextMenuItem = new EventEmitter();
|
|
506
|
+
/**
|
|
507
|
+
* This event fires on the owning widget when a check item is toggled in the context menu.
|
|
508
|
+
* @param {object} event Event object
|
|
509
|
+
* @param {Core.widget.Widget} event.source The owning widget
|
|
510
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
511
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
512
|
+
* @param {boolean} event.checked Checked or not
|
|
513
|
+
*/
|
|
514
|
+
this.onContextMenuToggleItem = new EventEmitter();
|
|
515
|
+
/**
|
|
516
|
+
* Fires on the owning Grid after a copy action is performed.
|
|
517
|
+
* @param {object} event Event object
|
|
518
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
519
|
+
* @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
|
|
520
|
+
* @param {string} event.copiedDataString The concatenated data string that was copied or cut
|
|
521
|
+
* @param {boolean} event.isCut `true` if this was a cut action
|
|
522
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other copy events
|
|
523
|
+
*/
|
|
524
|
+
this.onCopy = new EventEmitter();
|
|
525
|
+
/**
|
|
526
|
+
* Fired when data in the store changes.
|
|
527
|
+
* ...
|
|
528
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-dataChange)
|
|
529
|
+
* @param {object} event Event object
|
|
530
|
+
* @param {Grid.view.Grid} event.source Owning grid
|
|
531
|
+
* @param {Core.data.Store} event.store The originating store
|
|
532
|
+
* @param {'remove','removeAll','add','clearchanges','filter','update','dataset','replace'} event.action Name of action which triggered the change. May be one of: * `'remove'` * `'removeAll'` * `'add'` * `'clearchanges'` * `'filter'` * `'update'` * `'dataset'` * `'replace'`
|
|
533
|
+
* @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
|
|
534
|
+
* @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
|
|
535
|
+
* @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
|
|
536
|
+
*/
|
|
537
|
+
this.onDataChange = new EventEmitter();
|
|
538
|
+
/**
|
|
539
|
+
* Fired after one day cell's events are collected in sorted order according to the
|
|
540
|
+
* [eventSorter](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-eventSorter)
|
|
541
|
+
* ...
|
|
542
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-dayCellPopulated)
|
|
543
|
+
* @param {object} event Event object
|
|
544
|
+
* @param {Scheduler.model.EventModel[]} event.events The events to be shown for the passed date
|
|
545
|
+
* @param {Date} event.The date the events are to be shown in.
|
|
546
|
+
*/
|
|
547
|
+
this.onDayCellPopulated = new EventEmitter();
|
|
548
|
+
/**
|
|
549
|
+
* Fires when an object is destroyed.
|
|
550
|
+
* @param {object} event Event object
|
|
551
|
+
* @param {Core.Base} event.source The Object that is being destroyed.
|
|
552
|
+
*/
|
|
553
|
+
this.onDestroy = new EventEmitter();
|
|
554
|
+
/**
|
|
555
|
+
* Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/calendar/docs/api/Core/widget/Container#property-hasChanges) property changes
|
|
556
|
+
* @param {object} event Event object
|
|
557
|
+
* @param {Core.widget.Container} event.source The container.
|
|
558
|
+
* @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
|
|
559
|
+
*/
|
|
560
|
+
this.onDirtyStateChange = new EventEmitter();
|
|
561
|
+
/**
|
|
562
|
+
* Fires while drag selecting. UI will update with current range, but the cells will not be selected until
|
|
563
|
+
* mouse up. This event can be listened for to perform actions while drag selecting.
|
|
564
|
+
* @param {object} event Event object
|
|
565
|
+
* @param {Grid.view.Grid} event.source
|
|
566
|
+
* @param {GridLocationConfig[],Grid.util.GridLocation[]} event.selectedCells The cells that is currently being dragged over
|
|
567
|
+
* @param {Core.data.Model[]} event.selectedRecords The records that is currently being dragged over
|
|
568
|
+
*/
|
|
569
|
+
this.onDragSelecting = new EventEmitter();
|
|
570
|
+
/**
|
|
571
|
+
* Triggered when a widget's [element](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#property-element) is available.
|
|
572
|
+
* @param {object} event Event object
|
|
573
|
+
* @param {HTMLElement} event.element The Widget's element.
|
|
574
|
+
*/
|
|
575
|
+
this.onElementCreated = new EventEmitter();
|
|
576
|
+
/**
|
|
577
|
+
* Fired when an [autoCreate](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/CalendarMixin#config-autoCreate) gesture has created a new event
|
|
578
|
+
* and added it to the event store.
|
|
579
|
+
* ...
|
|
580
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-eventAutoCreated)
|
|
581
|
+
* @param {object} event Event object
|
|
582
|
+
* @param {CalendarView} event.source This Calendar view instance.
|
|
583
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The new event record.
|
|
584
|
+
*/
|
|
585
|
+
this.onEventAutoCreated = new EventEmitter();
|
|
586
|
+
/**
|
|
587
|
+
* Fires when a day spanning event is found, and the date to which its encapsulating event bar
|
|
588
|
+
* extends has been calculated.
|
|
589
|
+
* ...
|
|
590
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-eventPropagate)
|
|
591
|
+
* @param {object} event Event object
|
|
592
|
+
* @param {Date} event.eventEndDate The end date for which to calculate the propagate end date.
|
|
593
|
+
* @param {Date} event.propagateEndDate The system-calculated end point of the event bar.
|
|
594
|
+
* @param {boolean} event.isAllDay `true` if the event is an all day event, or spans multiple days.
|
|
595
|
+
* @param {boolean} event.isOverflow `true` if this is being called as part of further propagation.
|
|
596
|
+
* @param {boolean} event.overflows `true` if the event extends into future cells.
|
|
597
|
+
* @param {Scheduler.model.EventModel} event.eventRecord The event record being propagated.
|
|
598
|
+
* @param {Date} event.date The date from which the event is being propagated.
|
|
599
|
+
*/
|
|
600
|
+
this.onEventPropagate = new EventEmitter();
|
|
601
|
+
/**
|
|
602
|
+
* Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-collapsible) setting.
|
|
603
|
+
* @param {object} event Event object
|
|
604
|
+
* @param {Core.widget.Panel} event.source This Panel.
|
|
605
|
+
*/
|
|
606
|
+
this.onExpand = new EventEmitter();
|
|
607
|
+
/**
|
|
608
|
+
* Fired after a parent node record is expanded.
|
|
609
|
+
* @param {object} event Event object
|
|
610
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
611
|
+
* @param {Core.data.Model} event.record The record which has been expanded.
|
|
612
|
+
*/
|
|
613
|
+
this.onExpandNode = new EventEmitter();
|
|
614
|
+
/**
|
|
615
|
+
* Fired when a file is dropped on the widget element
|
|
616
|
+
* @param {object} event Event object
|
|
617
|
+
* @param {Grid.view.Grid} event.source The owning Grid instance
|
|
618
|
+
* @param {DataTransferItem} event.file The dropped file descriptor
|
|
619
|
+
* @param {DragEvent} event.domEvent The native DragEvent
|
|
620
|
+
*/
|
|
621
|
+
this.onFileDrop = new EventEmitter();
|
|
622
|
+
/**
|
|
623
|
+
* Fired before the FillHandle dragging is finalized and values are applied to cells, return `false` to prevent the
|
|
624
|
+
* drag operation from applying data changes.
|
|
625
|
+
* @param {object} event Event object
|
|
626
|
+
* @param {Grid.util.GridLocation} event.from The from cell
|
|
627
|
+
* @param {Grid.util.GridLocation} event.to The to cell
|
|
628
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
629
|
+
*/
|
|
630
|
+
this.onFillHandleBeforeDragFinalize = new EventEmitter();
|
|
631
|
+
/**
|
|
632
|
+
* Fired while dragging the FillHandle.
|
|
633
|
+
* @param {object} event Event object
|
|
634
|
+
* @param {Grid.util.GridLocation} event.from The from cell
|
|
635
|
+
* @param {Grid.util.GridLocation} event.to The to cell
|
|
636
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
637
|
+
*/
|
|
638
|
+
this.onFillHandleDrag = new EventEmitter();
|
|
639
|
+
/**
|
|
640
|
+
* Fired when a FillHandle drag operation is aborted.
|
|
641
|
+
*/
|
|
642
|
+
this.onFillHandleDragAbort = new EventEmitter();
|
|
643
|
+
/**
|
|
644
|
+
* Fired after a FillHandle drag operation.
|
|
645
|
+
* @param {object} event Event object
|
|
646
|
+
* @param {Grid.util.GridLocation} event.from The from cell
|
|
647
|
+
* @param {Grid.util.GridLocation} event.to The to cell
|
|
648
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
649
|
+
*/
|
|
650
|
+
this.onFillHandleDragEnd = new EventEmitter();
|
|
651
|
+
/**
|
|
652
|
+
* Fired when dragging of the FillHandle starts.
|
|
653
|
+
* @param {object} event Event object
|
|
654
|
+
* @param {Grid.util.GridLocation} event.cell Information about the column / record
|
|
655
|
+
* @param {MouseEvent} event.domEvent The raw DOM event
|
|
656
|
+
*/
|
|
657
|
+
this.onFillHandleDragStart = new EventEmitter();
|
|
658
|
+
/**
|
|
659
|
+
* Fires on the owning Grid when cell editing is finished
|
|
660
|
+
* @param {object} event Event object
|
|
661
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
662
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
663
|
+
*/
|
|
664
|
+
this.onFinishCellEdit = new EventEmitter();
|
|
665
|
+
/**
|
|
666
|
+
* Fires on the owning Grid before the row editing is finished, return false to signal that the value is invalid and editing should not be finalized.
|
|
667
|
+
* ...
|
|
668
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-finishRowEdit)
|
|
669
|
+
* @param {object} event Event object
|
|
670
|
+
* @param {Grid.view.Grid} event.grid Target grid
|
|
671
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
672
|
+
*/
|
|
673
|
+
this.onFinishRowEdit = new EventEmitter();
|
|
674
|
+
/**
|
|
675
|
+
* Fired when focus enters this Widget.
|
|
676
|
+
* @param {object} event Event object
|
|
677
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
678
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
679
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
680
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
681
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
682
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
683
|
+
*/
|
|
684
|
+
this.onFocusIn = new EventEmitter();
|
|
685
|
+
/**
|
|
686
|
+
* Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
|
|
687
|
+
* focus moving from within this Widget's ownership tree, even if there are floating widgets
|
|
688
|
+
* will not trigger this event. This is when focus exits this widget completely.
|
|
689
|
+
* @param {object} event Event object
|
|
690
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
691
|
+
* @param {HTMLElement} event.fromElement The element which lost focus.
|
|
692
|
+
* @param {HTMLElement} event.toElement The element which gained focus.
|
|
693
|
+
* @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
|
|
694
|
+
* @param {Core.widget.Widget} event.toWidget The widget which gained focus.
|
|
695
|
+
* @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
|
|
696
|
+
*/
|
|
697
|
+
this.onFocusOut = new EventEmitter();
|
|
698
|
+
/**
|
|
699
|
+
* Fired before dragging starts, return false to prevent the drag operation.
|
|
700
|
+
* @param {object} event Event object
|
|
701
|
+
* @param {Grid.view.GridBase} event.source
|
|
702
|
+
* @param {object} event.context
|
|
703
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
704
|
+
* @param {MouseEvent,TouchEvent} event.event
|
|
705
|
+
*/
|
|
706
|
+
this.onGridRowBeforeDragStart = new EventEmitter();
|
|
707
|
+
/**
|
|
708
|
+
* Fired before the row drop operation is finalized. You can return false to abort the drop operation, or a
|
|
709
|
+
* Promise yielding `true` / `false` which allows for asynchronous abort (e.g. first show user a confirmation dialog).
|
|
710
|
+
* @param {object} event Event object
|
|
711
|
+
* @param {Grid.view.GridBase} event.source
|
|
712
|
+
* @param {object} event.context
|
|
713
|
+
* @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid
|
|
714
|
+
* @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
|
|
715
|
+
* @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
|
|
716
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
717
|
+
* @param {RecordPositionContext[]} event.context.oldPositionContext An array of objects with information about the previous tree position. Objects contain the `record`, and its original `parentIndex` and `parentId` values
|
|
718
|
+
* @param {MouseEvent} event.event
|
|
719
|
+
*/
|
|
720
|
+
this.onGridRowBeforeDropFinalize = new EventEmitter();
|
|
721
|
+
/**
|
|
722
|
+
* Fired while the row is being dragged, in the listener function you have access to `context.insertBefore` a grid /
|
|
723
|
+
* tree record, and additionally `context.parent` (a TreeNode) for trees. You can signal that the drop position is
|
|
724
|
+
* valid or invalid by setting `context.valid = false;`
|
|
725
|
+
* @param {object} event Event object
|
|
726
|
+
* @param {Grid.view.GridBase} event.source
|
|
727
|
+
* @param {object} event.context
|
|
728
|
+
* @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid.
|
|
729
|
+
* @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
|
|
730
|
+
* @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
|
|
731
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
732
|
+
* @param {MouseEvent} event.event
|
|
733
|
+
*/
|
|
734
|
+
this.onGridRowDrag = new EventEmitter();
|
|
735
|
+
/**
|
|
736
|
+
* Fired when a row drag operation is aborted
|
|
737
|
+
* @param {object} event Event object
|
|
738
|
+
* @param {Grid.view.GridBase} event.source
|
|
739
|
+
* @param {object} event.context
|
|
740
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
741
|
+
* @param {MouseEvent} event.event
|
|
742
|
+
*/
|
|
743
|
+
this.onGridRowDragAbort = new EventEmitter();
|
|
744
|
+
/**
|
|
745
|
+
* Fired when dragging starts.
|
|
746
|
+
* @param {object} event Event object
|
|
747
|
+
* @param {Grid.view.GridBase} event.source
|
|
748
|
+
* @param {object} event.context
|
|
749
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
750
|
+
* @param {MouseEvent,TouchEvent} event.event
|
|
751
|
+
*/
|
|
752
|
+
this.onGridRowDragStart = new EventEmitter();
|
|
753
|
+
/**
|
|
754
|
+
* Fired after the row drop operation has completed, regardless of validity
|
|
755
|
+
* @param {object} event Event object
|
|
756
|
+
* @param {Grid.view.GridBase} event.source
|
|
757
|
+
* @param {object} event.context
|
|
758
|
+
* @param {boolean} event.context.valid true or false depending on whether the drop position was valid
|
|
759
|
+
* @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
|
|
760
|
+
* @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
|
|
761
|
+
* @param {Core.data.Model[]} event.context.records The dragged row records
|
|
762
|
+
* @param {RecordPositionContext[]} event.context.oldPositionContext An array of objects with information about the previous tree position. Objects contain the record, and its original `parentIndex` and `parentId` values
|
|
763
|
+
* @param {MouseEvent} event.event
|
|
764
|
+
*/
|
|
765
|
+
this.onGridRowDrop = new EventEmitter();
|
|
766
|
+
/**
|
|
767
|
+
* Fired when a grid header is clicked on.
|
|
768
|
+
* ...
|
|
769
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-headerClick)
|
|
770
|
+
* @param {object} event Event object
|
|
771
|
+
* @param {Event} event.domEvent The triggering DOM event.
|
|
772
|
+
* @param {Grid.column.Column} event.column The column clicked on.
|
|
773
|
+
*/
|
|
774
|
+
this.onHeaderClick = new EventEmitter();
|
|
775
|
+
/**
|
|
776
|
+
* This event fires on the owning Grid before the context menu is shown for a header.
|
|
777
|
+
* Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/calendar/docs/api/Grid/feature/HeaderMenu#config-processItems).
|
|
778
|
+
* ...
|
|
779
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-headerMenuBeforeShow)
|
|
780
|
+
* @param {object} event Event object
|
|
781
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
782
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
783
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
784
|
+
* @param {Grid.column.Column} event.column Column
|
|
785
|
+
*/
|
|
786
|
+
this.onHeaderMenuBeforeShow = new EventEmitter();
|
|
787
|
+
/**
|
|
788
|
+
* This event fires on the owning Grid when an item is selected in the header context menu.
|
|
789
|
+
* @param {object} event Event object
|
|
790
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
791
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
792
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
793
|
+
* @param {Grid.column.Column} event.column Column
|
|
794
|
+
*/
|
|
795
|
+
this.onHeaderMenuItem = new EventEmitter();
|
|
796
|
+
/**
|
|
797
|
+
* This event fires on the owning Grid after the context menu is shown for a header
|
|
798
|
+
* @param {object} event Event object
|
|
799
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
800
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
801
|
+
* @param {Record<string, MenuItemEntry>} event.items Menu item configs
|
|
802
|
+
* @param {Grid.column.Column} event.column Column
|
|
803
|
+
*/
|
|
804
|
+
this.onHeaderMenuShow = new EventEmitter();
|
|
805
|
+
/**
|
|
806
|
+
* This event fires on the owning Grid when a check item is toggled in the header context menu.
|
|
807
|
+
* @param {object} event Event object
|
|
808
|
+
* @param {Grid.view.Grid} event.source The grid
|
|
809
|
+
* @param {Core.widget.Menu} event.menu The menu
|
|
810
|
+
* @param {Core.widget.MenuItem} event.item Selected menu item
|
|
811
|
+
* @param {Grid.column.Column} event.column Column
|
|
812
|
+
* @param {boolean} event.checked Checked or not
|
|
813
|
+
*/
|
|
814
|
+
this.onHeaderMenuToggleItem = new EventEmitter();
|
|
815
|
+
/**
|
|
816
|
+
* Triggered after a widget was hidden
|
|
817
|
+
* @param {object} event Event object
|
|
818
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
819
|
+
*/
|
|
820
|
+
this.onHide = new EventEmitter();
|
|
821
|
+
/**
|
|
822
|
+
* Fires when row locking is enabled.
|
|
823
|
+
* @param {object} event Event object
|
|
824
|
+
* @param {Grid.view.GridBase} event.clone The created clone
|
|
825
|
+
*/
|
|
826
|
+
this.onLockRows = new EventEmitter();
|
|
827
|
+
/**
|
|
828
|
+
* Mouse moved out from element in grid
|
|
829
|
+
* @param {object} event Event object
|
|
830
|
+
* @param {MouseEvent} event.event The native browser event
|
|
831
|
+
*/
|
|
832
|
+
this.onMouseOut = new EventEmitter();
|
|
833
|
+
/**
|
|
834
|
+
* Mouse moved in over element in grid
|
|
835
|
+
* @param {object} event Event object
|
|
836
|
+
* @param {MouseEvent} event.event The native browser event
|
|
837
|
+
*/
|
|
838
|
+
this.onMouseOver = new EventEmitter();
|
|
839
|
+
/**
|
|
840
|
+
* Triggered when a widget which had been in a non-visible state for any reason
|
|
841
|
+
* achieves visibility.
|
|
842
|
+
* ...
|
|
843
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-paint)
|
|
844
|
+
* @param {object} event Event object
|
|
845
|
+
* @param {Core.widget.Widget} event.source The widget being painted.
|
|
846
|
+
* @param {boolean} event.firstPaint `true` if this is the first paint.
|
|
847
|
+
*/
|
|
848
|
+
this.onPaint = new EventEmitter();
|
|
849
|
+
/**
|
|
850
|
+
* Fires on the owning Grid after a paste action is performed.
|
|
851
|
+
* @param {object} event Event object
|
|
852
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
853
|
+
* @param {string} event.clipboardData The clipboardData that was pasted
|
|
854
|
+
* @param {Core.data.Model[]} event.modifiedRecords The records which have been modified due to the paste action
|
|
855
|
+
* @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
|
|
856
|
+
* @param {string} event.entityName 'cell' to distinguish this event from other paste events
|
|
857
|
+
*/
|
|
858
|
+
this.onPaste = new EventEmitter();
|
|
859
|
+
/**
|
|
860
|
+
* Fires on the owning Grid when export has finished
|
|
861
|
+
* @param {object} event Event object
|
|
862
|
+
* @param {Response} event.response Optional response, if received
|
|
863
|
+
* @param {Error} event.error Optional error, if exception occurred
|
|
864
|
+
*/
|
|
865
|
+
this.onPdfExport = new EventEmitter();
|
|
866
|
+
/**
|
|
867
|
+
* Fired when the range of dates encapsulated by this view changes.
|
|
868
|
+
* ...
|
|
869
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-rangeChange)
|
|
870
|
+
* @param {object} event Event object
|
|
871
|
+
* @param {typeof DateRangeOwner} event.source This calendar view instance.
|
|
872
|
+
* @param {object} event.old The old date range <strong>if any</strong>.
|
|
873
|
+
* @param {Date} event.old.startDate the old start date.
|
|
874
|
+
* @param {Date} event.old.endDate the old end date.
|
|
875
|
+
* @param {object} event.new The new date range
|
|
876
|
+
* @param {Date} event.new.startDate the new start date.
|
|
877
|
+
* @param {Date} event.new.endDate the new end date.
|
|
878
|
+
*/
|
|
879
|
+
this.onRangeChange = new EventEmitter();
|
|
880
|
+
/**
|
|
881
|
+
* Fired when a Widget's read only state is toggled
|
|
882
|
+
* @param {object} event Event object
|
|
883
|
+
* @param {boolean} event.readOnly Read only or not
|
|
884
|
+
*/
|
|
885
|
+
this.onReadOnly = new EventEmitter();
|
|
886
|
+
/**
|
|
887
|
+
* This event is fired after a widget's elements have been synchronized due to a direct or indirect call
|
|
888
|
+
* to [recompose](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
|
|
889
|
+
*/
|
|
890
|
+
this.onRecompose = new EventEmitter();
|
|
891
|
+
/**
|
|
892
|
+
* Fires after a row is rendered.
|
|
893
|
+
* @param {object} event Event object
|
|
894
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
895
|
+
* @param {Grid.row.Row} event.row The row that has been rendered.
|
|
896
|
+
* @param {Core.data.Model} event.record The record for the row.
|
|
897
|
+
* @param {number} event.recordIndex The zero-based index of the record.
|
|
898
|
+
*/
|
|
899
|
+
this.onRenderRow = new EventEmitter();
|
|
900
|
+
/**
|
|
901
|
+
* Grid rows have been rendered
|
|
902
|
+
* @param {object} event Event object
|
|
903
|
+
* @param {Grid.view.Grid} event.source This grid.
|
|
904
|
+
*/
|
|
905
|
+
this.onRenderRows = new EventEmitter();
|
|
906
|
+
/**
|
|
907
|
+
* Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/calendar/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
|
|
908
|
+
* @param {object} event Event object
|
|
909
|
+
* @param {Core.widget.Widget} event.source This Widget
|
|
910
|
+
* @param {number} event.width The new width
|
|
911
|
+
* @param {number} event.height The new height
|
|
912
|
+
* @param {number} event.oldWidth The old width
|
|
913
|
+
* @param {number} event.oldHeight The old height
|
|
914
|
+
*/
|
|
915
|
+
this.onResize = new EventEmitter();
|
|
916
|
+
/**
|
|
917
|
+
* Grid resize lead to a new responsive level being applied
|
|
918
|
+
* @param {object} event Event object
|
|
919
|
+
* @param {Grid.view.Grid} event.grid Grid that was resized
|
|
920
|
+
* @param {string} event.level New responsive level (small, large, etc)
|
|
921
|
+
* @param {number} event.width New width in px
|
|
922
|
+
* @param {string} event.oldLevel Old responsive level
|
|
923
|
+
* @param {number} event.oldWidth Old width in px
|
|
924
|
+
*/
|
|
925
|
+
this.onResponsive = new EventEmitter();
|
|
926
|
+
/**
|
|
927
|
+
* Triggered when a new [responsiveState](https://bryntum.com/products/calendar/docs/api/Core/widget/mixin/Responsive#config-responsiveState) is applied.
|
|
928
|
+
* @param {object} event Event object
|
|
929
|
+
* @param {Core.widget.Widget} event.source The widget whose `responsiveState` has changed
|
|
930
|
+
* @param {string} event.state The new value for the widget's `responsiveState`
|
|
931
|
+
* @param {string} event.oldState The previous value for the widget's `responsiveState`
|
|
932
|
+
*/
|
|
933
|
+
this.onResponsiveStateChange = new EventEmitter();
|
|
934
|
+
/**
|
|
935
|
+
* This event fires when a row has finished collapsing.
|
|
936
|
+
* @param {object} event Event object
|
|
937
|
+
* @param {Core.data.Model} event.record Record
|
|
938
|
+
*/
|
|
939
|
+
this.onRowCollapse = new EventEmitter();
|
|
940
|
+
/**
|
|
941
|
+
* This event fires when a row expand has finished expanding.
|
|
942
|
+
* ...
|
|
943
|
+
* [View online docs...](https://bryntum.com/products/calendar/docs/api/Calendar/widget/EventList#event-rowExpand)
|
|
944
|
+
* @param {object} event Event object
|
|
945
|
+
* @param {Core.data.Model} event.record Record
|
|
946
|
+
* @param {object} event.expandedElements An object with the Grid region name as property and the expanded body element as value
|
|
947
|
+
* @param {Core.widget.Widget} event.widget In case of expanding a Widget, this will be a reference to the instance created by the actual expansion. If there is multiple Grid regions, use the `widgets` param instead.
|
|
948
|
+
* @param {object} event.widgets In case of expanding a Widget, this will be an object with the Grid region name as property and the reference to the widget instance created by the actual expansion
|
|
949
|
+
*/
|
|
950
|
+
this.onRowExpand = new EventEmitter();
|
|
951
|
+
/**
|
|
952
|
+
* Fired when the mouse enters a row
|
|
953
|
+
* @param {object} event Event object
|
|
954
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
955
|
+
* @param {Core.data.Model} event.record The record representing the hovered row
|
|
956
|
+
* @param {Grid.column.Column} event.column The column currently hovered
|
|
957
|
+
* @param {HTMLElement} event.cellElement The cell HTML element
|
|
958
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
959
|
+
*/
|
|
960
|
+
this.onRowMouseEnter = new EventEmitter();
|
|
961
|
+
/**
|
|
962
|
+
* Fired when the mouse leaves a row
|
|
963
|
+
* @param {object} event Event object
|
|
964
|
+
* @param {Grid.view.Grid} event.source The grid instance
|
|
965
|
+
* @param {Core.data.Model} event.record The record representing the row that the mouse left
|
|
966
|
+
* @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
|
|
967
|
+
* @param {MouseEvent} event.event The native DOM event
|
|
968
|
+
*/
|
|
969
|
+
this.onRowMouseLeave = new EventEmitter();
|
|
970
|
+
/**
|
|
971
|
+
* Grid has scrolled vertically
|
|
972
|
+
* @param {object} event Event object
|
|
973
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance.
|
|
974
|
+
* @param {number} event.scrollTop The vertical scroll position.
|
|
975
|
+
*/
|
|
976
|
+
this.onScroll = new EventEmitter();
|
|
977
|
+
/**
|
|
978
|
+
* The selection has been changed.
|
|
979
|
+
* @param {object} event Event object
|
|
980
|
+
* @param {'select','deselect'} event.action `'select'`/`'deselect'`
|
|
981
|
+
* @param {'row','cell'} event.mode `'row'`/`'cell'`
|
|
982
|
+
* @param {Grid.view.Grid} event.source
|
|
983
|
+
* @param {Core.data.Model[]} event.deselected The records deselected in this operation.
|
|
984
|
+
* @param {Core.data.Model[]} event.selected The records selected in this operation.
|
|
985
|
+
* @param {Core.data.Model[]} event.selection The records in the new selection.
|
|
986
|
+
* @param {Grid.util.GridLocation[]} event.deselectedCells The cells deselected in this operation.
|
|
987
|
+
* @param {Grid.util.GridLocation[]} event.selectedCells The cells selected in this operation.
|
|
988
|
+
* @param {Grid.util.GridLocation[]} event.cellSelection The cells in the new selection.
|
|
989
|
+
*/
|
|
990
|
+
this.onSelectionChange = new EventEmitter();
|
|
991
|
+
/**
|
|
992
|
+
* The selectionMode configuration has been changed.
|
|
993
|
+
* @param {object} event Event object
|
|
994
|
+
* @param {object} event.selectionMode The new [selectionMode](https://bryntum.com/products/calendar/docs/api/Grid/view/mixin/GridSelection#config-selectionMode)
|
|
995
|
+
*/
|
|
996
|
+
this.onSelectionModeChange = new EventEmitter();
|
|
997
|
+
/**
|
|
998
|
+
* Fired when the [shiftIncrement](https://bryntum.com/products/calendar/docs/api/Calendar/widget/mixin/DateRangeOwner#property-shiftIncrement) of this view changes.
|
|
999
|
+
* @param {object} event Event object
|
|
1000
|
+
* @param {object} event.old The shift increment *if any*.
|
|
1001
|
+
* @param {object} event.new The shift increment
|
|
1002
|
+
*/
|
|
1003
|
+
this.onShiftIncrementChange = new EventEmitter();
|
|
1004
|
+
/**
|
|
1005
|
+
* Triggered after a widget is shown.
|
|
1006
|
+
* @param {object} event Event object
|
|
1007
|
+
* @param {Core.widget.Widget} event.source The widget
|
|
1008
|
+
*/
|
|
1009
|
+
this.onShow = new EventEmitter();
|
|
1010
|
+
/**
|
|
1011
|
+
* Fires when splitting the Grid.
|
|
1012
|
+
* @param {object} event Event object
|
|
1013
|
+
* @param {Grid.view.GridBase[]} event.subViews The sub views created by the split
|
|
1014
|
+
* @param {object} event.options The options passed to the split call
|
|
1015
|
+
* @param {'horizontal','vertical','both'} event.options.direction The direction of the split
|
|
1016
|
+
* @param {Grid.column.Column} event.options.atColumn The column to split at
|
|
1017
|
+
* @param {Core.data.Model} event.options.atRecord The record to split at
|
|
1018
|
+
*/
|
|
1019
|
+
this.onSplit = new EventEmitter();
|
|
1020
|
+
/**
|
|
1021
|
+
* Fired by the Grid when the collapse icon is clicked. Return `false` to prevent the default collapse action,
|
|
1022
|
+
* if you want to implement your own behavior.
|
|
1023
|
+
* @param {object} event Event object
|
|
1024
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1025
|
+
* @param {Grid.view.SubGrid} event.subGrid The subgrid
|
|
1026
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1027
|
+
*/
|
|
1028
|
+
this.onSplitterCollapseClick = new EventEmitter();
|
|
1029
|
+
/**
|
|
1030
|
+
* Fired by the Grid after a sub-grid has been resized using the splitter
|
|
1031
|
+
* @param {object} event Event object
|
|
1032
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1033
|
+
* @param {Grid.view.SubGrid} event.subGrid The resized subgrid
|
|
1034
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1035
|
+
*/
|
|
1036
|
+
this.onSplitterDragEnd = new EventEmitter();
|
|
1037
|
+
/**
|
|
1038
|
+
* Fired by the Grid when a sub-grid resize gesture starts
|
|
1039
|
+
* @param {object} event Event object
|
|
1040
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1041
|
+
* @param {Grid.view.SubGrid} event.subGrid The subgrid about to be resized
|
|
1042
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1043
|
+
*/
|
|
1044
|
+
this.onSplitterDragStart = new EventEmitter();
|
|
1045
|
+
/**
|
|
1046
|
+
* Fired by the Grid when the expand icon is clicked. Return `false` to prevent the default expand action,
|
|
1047
|
+
* if you want to implement your own behavior.
|
|
1048
|
+
* @param {object} event Event object
|
|
1049
|
+
* @param {Grid.view.Grid} event.source The Grid instance.
|
|
1050
|
+
* @param {Grid.view.SubGrid} event.subGrid The subgrid
|
|
1051
|
+
* @param {Event} event.domEvent The native DOM event
|
|
1052
|
+
*/
|
|
1053
|
+
this.onSplitterExpandClick = new EventEmitter();
|
|
1054
|
+
/**
|
|
1055
|
+
* Fires on the owning Grid when editing starts
|
|
1056
|
+
* @param {object} event Event object
|
|
1057
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
1058
|
+
* @param {CellEditorContext} event.editorContext Editing context
|
|
1059
|
+
*/
|
|
1060
|
+
this.onStartCellEdit = new EventEmitter();
|
|
1061
|
+
/**
|
|
1062
|
+
* Fires on the owning Grid when editing starts
|
|
1063
|
+
* @param {object} event Event object
|
|
1064
|
+
* @param {Grid.view.Grid} event.source Owner grid
|
|
1065
|
+
* @param {RowEditorContext} event.editorContext Editing context
|
|
1066
|
+
*/
|
|
1067
|
+
this.onStartRowEdit = new EventEmitter();
|
|
1068
|
+
/**
|
|
1069
|
+
* Fires after a sub grid is collapsed.
|
|
1070
|
+
* @param {object} event Event object
|
|
1071
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance
|
|
1072
|
+
* @param {Grid.view.SubGrid} event.subGrid The sub grid instance
|
|
1073
|
+
*/
|
|
1074
|
+
this.onSubGridCollapse = new EventEmitter();
|
|
1075
|
+
/**
|
|
1076
|
+
* Fires after a sub grid is expanded.
|
|
1077
|
+
* @param {object} event Event object
|
|
1078
|
+
* @param {Grid.view.Grid} event.source The firing Grid instance
|
|
1079
|
+
* @param {Grid.view.SubGrid} event.subGrid The sub grid instance
|
|
1080
|
+
*/
|
|
1081
|
+
this.onSubGridExpand = new EventEmitter();
|
|
1082
|
+
/**
|
|
1083
|
+
* Fired when one or more groups are expanded or collapsed
|
|
1084
|
+
* @param {object} event Event object
|
|
1085
|
+
* @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
|
|
1086
|
+
* @param {Core.data.Model[]} event.groupRecords The group records being toggled
|
|
1087
|
+
* @param {boolean} event.collapse Collapsed (true) or expanded (false)
|
|
1088
|
+
* @param {boolean} event.allRecords True if this event is part of toggling all groups
|
|
1089
|
+
*/
|
|
1090
|
+
this.onToggleGroup = new EventEmitter();
|
|
1091
|
+
/**
|
|
1092
|
+
* Fired after a parent node record toggles its collapsed state.
|
|
1093
|
+
* @param {object} event Event object
|
|
1094
|
+
* @param {Core.data.Model} event.record The record being toggled.
|
|
1095
|
+
* @param {boolean} event.collapse `true` if the node is being collapsed.
|
|
1096
|
+
*/
|
|
1097
|
+
this.onToggleNode = new EventEmitter();
|
|
1098
|
+
/**
|
|
1099
|
+
* A header [tool](https://bryntum.com/products/calendar/docs/api/Core/widget/Panel#config-tools) has been clicked.
|
|
1100
|
+
* @param {object} event Event object
|
|
1101
|
+
* @param {Core.widget.Tool} event.source This Panel.
|
|
1102
|
+
* @param {Core.widget.Tool} event.tool The tool which is being clicked.
|
|
1103
|
+
*/
|
|
1104
|
+
this.onToolClick = new EventEmitter();
|
|
1105
|
+
/**
|
|
1106
|
+
* Fires when row locking is disabled.
|
|
1107
|
+
* @param {object} event Event object
|
|
1108
|
+
* @param {Grid.view.GridBase} event.clone The locked clone that will be destroyed
|
|
1109
|
+
*/
|
|
1110
|
+
this.onUnlockRows = new EventEmitter();
|
|
1111
|
+
/**
|
|
1112
|
+
* Fires when un-splitting the Grid.
|
|
1113
|
+
*/
|
|
1114
|
+
this.onUnsplit = new EventEmitter();
|
|
1115
|
+
this.elementRef = element;
|
|
1116
|
+
}
|
|
1117
|
+
/**
|
|
1118
|
+
* Create and append the underlying widget
|
|
1119
|
+
*/
|
|
1120
|
+
ngOnInit() {
|
|
1121
|
+
const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumEventListComponent;
|
|
1122
|
+
bryntumConfigs.filter(prop => prop in this).forEach(prop => {
|
|
1123
|
+
// @ts-ignore
|
|
1124
|
+
WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
|
|
1125
|
+
if (['features', 'config'].includes(prop)) {
|
|
1126
|
+
WrapperHelper.devWarningConfigProp(instanceName, prop);
|
|
1127
|
+
}
|
|
1128
|
+
});
|
|
1129
|
+
// @ts-ignore
|
|
1130
|
+
bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
|
|
1131
|
+
const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
|
|
1132
|
+
// @ts-ignore
|
|
1133
|
+
bryntumConfig.listeners[eventName(event)] = e => {
|
|
1134
|
+
// @ts-ignore
|
|
1135
|
+
me[event].emit(e);
|
|
1136
|
+
// EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
|
|
1137
|
+
// in Angular listeners
|
|
1138
|
+
return e.returnValue;
|
|
1139
|
+
};
|
|
1140
|
+
});
|
|
1141
|
+
// If component has no container specified in config then use adopt to Wrapper's element
|
|
1142
|
+
const containerParam = [
|
|
1143
|
+
'adopt',
|
|
1144
|
+
'appendTo',
|
|
1145
|
+
'insertAfter',
|
|
1146
|
+
'insertBefore'
|
|
1147
|
+
// @ts-ignore
|
|
1148
|
+
].find(prop => bryntumConfig[prop]);
|
|
1149
|
+
if (!containerParam) {
|
|
1150
|
+
if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
|
|
1151
|
+
// Button should always be <a> or <button> inside owner element
|
|
1152
|
+
bryntumConfig.appendTo = elementRef.nativeElement;
|
|
1153
|
+
}
|
|
1154
|
+
else {
|
|
1155
|
+
bryntumConfig.adopt = elementRef.nativeElement;
|
|
1156
|
+
}
|
|
1157
|
+
}
|
|
1158
|
+
else {
|
|
1159
|
+
WrapperHelper.devWarningContainer(instanceName, containerParam);
|
|
1160
|
+
}
|
|
1161
|
+
// @ts-ignore
|
|
1162
|
+
me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
|
|
1163
|
+
}
|
|
1164
|
+
/**
|
|
1165
|
+
* Watch for changes
|
|
1166
|
+
* @param changes
|
|
1167
|
+
*/
|
|
1168
|
+
ngOnChanges(changes) {
|
|
1169
|
+
const { instance } = this, { instanceName } = BryntumEventListComponent;
|
|
1170
|
+
if (!instance) {
|
|
1171
|
+
return;
|
|
1172
|
+
}
|
|
1173
|
+
// Iterate over all changes
|
|
1174
|
+
Object.entries(changes).forEach(([prop, change]) => {
|
|
1175
|
+
const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumEventListComponent;
|
|
1176
|
+
if (bryntumProps.includes(prop)) {
|
|
1177
|
+
WrapperHelper.applyPropValue(instance, prop, newValue, false);
|
|
1178
|
+
if (bryntumConfigsOnly.includes(prop)) {
|
|
1179
|
+
WrapperHelper.devWarningUpdateProp(instanceName, prop);
|
|
1180
|
+
}
|
|
1181
|
+
}
|
|
1182
|
+
});
|
|
1183
|
+
}
|
|
1184
|
+
/**
|
|
1185
|
+
* Destroy the component
|
|
1186
|
+
*/
|
|
1187
|
+
ngOnDestroy() {
|
|
1188
|
+
// @ts-ignore
|
|
1189
|
+
if (this.instance && this.instance.destroy) {
|
|
1190
|
+
this.instance.destroy();
|
|
1191
|
+
}
|
|
1192
|
+
}
|
|
1193
|
+
}
|
|
1194
|
+
BryntumEventListComponent.instanceClass = EventList;
|
|
1195
|
+
BryntumEventListComponent.instanceName = 'EventList';
|
|
1196
|
+
BryntumEventListComponent.bryntumEvents = [
|
|
1197
|
+
'onBeforeAutoCreate',
|
|
1198
|
+
'onBeforeCancelCellEdit',
|
|
1199
|
+
'onBeforeCancelRowEdit',
|
|
1200
|
+
'onBeforeCellEditStart',
|
|
1201
|
+
'onBeforeCellRangeDelete',
|
|
1202
|
+
'onBeforeCellRangeEdit',
|
|
1203
|
+
'onBeforeChangeDate',
|
|
1204
|
+
'onBeforeColumnDragStart',
|
|
1205
|
+
'onBeforeColumnDropFinalize',
|
|
1206
|
+
'onBeforeColumnResize',
|
|
1207
|
+
'onBeforeCopy',
|
|
1208
|
+
'onBeforeCSVExport',
|
|
1209
|
+
'onBeforeDestroy',
|
|
1210
|
+
'onBeforeExcelExport',
|
|
1211
|
+
'onBeforeFillHandleDragStart',
|
|
1212
|
+
'onBeforeFinishCellEdit',
|
|
1213
|
+
'onBeforeFinishRowEdit',
|
|
1214
|
+
'onBeforeHide',
|
|
1215
|
+
'onBeforePaste',
|
|
1216
|
+
'onBeforePdfExport',
|
|
1217
|
+
'onBeforeRenderRow',
|
|
1218
|
+
'onBeforeRenderRows',
|
|
1219
|
+
'onBeforeResponsiveStateChange',
|
|
1220
|
+
'onBeforeRowCollapse',
|
|
1221
|
+
'onBeforeRowExpand',
|
|
1222
|
+
'onBeforeSelectionChange',
|
|
1223
|
+
'onBeforeSetRecord',
|
|
1224
|
+
'onBeforeShow',
|
|
1225
|
+
'onBeforeStartRowEdit',
|
|
1226
|
+
'onBeforeStateApply',
|
|
1227
|
+
'onBeforeStateSave',
|
|
1228
|
+
'onBeforeToggleGroup',
|
|
1229
|
+
'onBeforeToggleNode',
|
|
1230
|
+
'onCancelCellEdit',
|
|
1231
|
+
'onCatchAll',
|
|
1232
|
+
'onCellClick',
|
|
1233
|
+
'onCellContextMenu',
|
|
1234
|
+
'onCellDblClick',
|
|
1235
|
+
'onCellMapPopulated',
|
|
1236
|
+
'onCellMenuBeforeShow',
|
|
1237
|
+
'onCellMenuItem',
|
|
1238
|
+
'onCellMenuShow',
|
|
1239
|
+
'onCellMenuToggleItem',
|
|
1240
|
+
'onCellMouseEnter',
|
|
1241
|
+
'onCellMouseLeave',
|
|
1242
|
+
'onCellMouseOut',
|
|
1243
|
+
'onCellMouseOver',
|
|
1244
|
+
'onCollapse',
|
|
1245
|
+
'onCollapseNode',
|
|
1246
|
+
'onColumnDrag',
|
|
1247
|
+
'onColumnDragStart',
|
|
1248
|
+
'onColumnDrop',
|
|
1249
|
+
'onColumnResize',
|
|
1250
|
+
'onColumnResizeStart',
|
|
1251
|
+
'onContextMenuItem',
|
|
1252
|
+
'onContextMenuToggleItem',
|
|
1253
|
+
'onCopy',
|
|
1254
|
+
'onDataChange',
|
|
1255
|
+
'onDayCellPopulated',
|
|
1256
|
+
'onDestroy',
|
|
1257
|
+
'onDirtyStateChange',
|
|
1258
|
+
'onDragSelecting',
|
|
1259
|
+
'onElementCreated',
|
|
1260
|
+
'onEventAutoCreated',
|
|
1261
|
+
'onEventPropagate',
|
|
1262
|
+
'onExpand',
|
|
1263
|
+
'onExpandNode',
|
|
1264
|
+
'onFileDrop',
|
|
1265
|
+
'onFillHandleBeforeDragFinalize',
|
|
1266
|
+
'onFillHandleDrag',
|
|
1267
|
+
'onFillHandleDragAbort',
|
|
1268
|
+
'onFillHandleDragEnd',
|
|
1269
|
+
'onFillHandleDragStart',
|
|
1270
|
+
'onFinishCellEdit',
|
|
1271
|
+
'onFinishRowEdit',
|
|
1272
|
+
'onFocusIn',
|
|
1273
|
+
'onFocusOut',
|
|
1274
|
+
'onGridRowBeforeDragStart',
|
|
1275
|
+
'onGridRowBeforeDropFinalize',
|
|
1276
|
+
'onGridRowDrag',
|
|
1277
|
+
'onGridRowDragAbort',
|
|
1278
|
+
'onGridRowDragStart',
|
|
1279
|
+
'onGridRowDrop',
|
|
1280
|
+
'onHeaderClick',
|
|
1281
|
+
'onHeaderMenuBeforeShow',
|
|
1282
|
+
'onHeaderMenuItem',
|
|
1283
|
+
'onHeaderMenuShow',
|
|
1284
|
+
'onHeaderMenuToggleItem',
|
|
1285
|
+
'onHide',
|
|
1286
|
+
'onLockRows',
|
|
1287
|
+
'onMouseOut',
|
|
1288
|
+
'onMouseOver',
|
|
1289
|
+
'onPaint',
|
|
1290
|
+
'onPaste',
|
|
1291
|
+
'onPdfExport',
|
|
1292
|
+
'onRangeChange',
|
|
1293
|
+
'onReadOnly',
|
|
1294
|
+
'onRecompose',
|
|
1295
|
+
'onRenderRow',
|
|
1296
|
+
'onRenderRows',
|
|
1297
|
+
'onResize',
|
|
1298
|
+
'onResponsive',
|
|
1299
|
+
'onResponsiveStateChange',
|
|
1300
|
+
'onRowCollapse',
|
|
1301
|
+
'onRowExpand',
|
|
1302
|
+
'onRowMouseEnter',
|
|
1303
|
+
'onRowMouseLeave',
|
|
1304
|
+
'onScroll',
|
|
1305
|
+
'onSelectionChange',
|
|
1306
|
+
'onSelectionModeChange',
|
|
1307
|
+
'onShiftIncrementChange',
|
|
1308
|
+
'onShow',
|
|
1309
|
+
'onSplit',
|
|
1310
|
+
'onSplitterCollapseClick',
|
|
1311
|
+
'onSplitterDragEnd',
|
|
1312
|
+
'onSplitterDragStart',
|
|
1313
|
+
'onSplitterExpandClick',
|
|
1314
|
+
'onStartCellEdit',
|
|
1315
|
+
'onStartRowEdit',
|
|
1316
|
+
'onSubGridCollapse',
|
|
1317
|
+
'onSubGridExpand',
|
|
1318
|
+
'onToggleGroup',
|
|
1319
|
+
'onToggleNode',
|
|
1320
|
+
'onToolClick',
|
|
1321
|
+
'onUnlockRows',
|
|
1322
|
+
'onUnsplit'
|
|
1323
|
+
];
|
|
1324
|
+
BryntumEventListComponent.bryntumFeatureNames = [
|
|
1325
|
+
'aiFilterFeature',
|
|
1326
|
+
'cellCopyPasteFeature',
|
|
1327
|
+
'cellEditFeature',
|
|
1328
|
+
'cellMenuFeature',
|
|
1329
|
+
'cellTooltipFeature',
|
|
1330
|
+
'chartsFeature',
|
|
1331
|
+
'columnAutoWidthFeature',
|
|
1332
|
+
'columnDragToolbarFeature',
|
|
1333
|
+
'columnPickerFeature',
|
|
1334
|
+
'columnRenameFeature',
|
|
1335
|
+
'columnReorderFeature',
|
|
1336
|
+
'columnResizeFeature',
|
|
1337
|
+
'excelExporterFeature',
|
|
1338
|
+
'fileDropFeature',
|
|
1339
|
+
'fillHandleFeature',
|
|
1340
|
+
'filterFeature',
|
|
1341
|
+
'filterBarFeature',
|
|
1342
|
+
'groupFeature',
|
|
1343
|
+
'groupSummaryFeature',
|
|
1344
|
+
'headerMenuFeature',
|
|
1345
|
+
'lockRowsFeature',
|
|
1346
|
+
'mergeCellsFeature',
|
|
1347
|
+
'pdfExportFeature',
|
|
1348
|
+
'pinColumnsFeature',
|
|
1349
|
+
'printFeature',
|
|
1350
|
+
'quickFindFeature',
|
|
1351
|
+
'regionResizeFeature',
|
|
1352
|
+
'rowCopyPasteFeature',
|
|
1353
|
+
'rowEditFeature',
|
|
1354
|
+
'rowExpanderFeature',
|
|
1355
|
+
'rowReorderFeature',
|
|
1356
|
+
'rowResizeFeature',
|
|
1357
|
+
'searchFeature',
|
|
1358
|
+
'sortFeature',
|
|
1359
|
+
'splitFeature',
|
|
1360
|
+
'stickyCellsFeature',
|
|
1361
|
+
'stripeFeature',
|
|
1362
|
+
'summaryFeature',
|
|
1363
|
+
'treeFeature',
|
|
1364
|
+
'treeGroupFeature'
|
|
1365
|
+
];
|
|
1366
|
+
BryntumEventListComponent.bryntumConfigs = BryntumEventListComponent.bryntumFeatureNames.concat([
|
|
1367
|
+
'activationKey',
|
|
1368
|
+
'adopt',
|
|
1369
|
+
'alignSelf',
|
|
1370
|
+
'allowDragCreate',
|
|
1371
|
+
'allowDragMove',
|
|
1372
|
+
'allowDragResize',
|
|
1373
|
+
'animateFilterRemovals',
|
|
1374
|
+
'animateRemovingRows',
|
|
1375
|
+
'animateTimeShift',
|
|
1376
|
+
'animateTreeNodeToggle',
|
|
1377
|
+
'appendTo',
|
|
1378
|
+
'ariaDescription',
|
|
1379
|
+
'ariaLabel',
|
|
1380
|
+
'autoCreate',
|
|
1381
|
+
'autoHeight',
|
|
1382
|
+
'bbar',
|
|
1383
|
+
'bodyCls',
|
|
1384
|
+
'bubbleEvents',
|
|
1385
|
+
'callOnFunctions',
|
|
1386
|
+
'catchEventHandlerExceptions',
|
|
1387
|
+
'cellEllipsis',
|
|
1388
|
+
'cls',
|
|
1389
|
+
'collapsed',
|
|
1390
|
+
'collapsible',
|
|
1391
|
+
'color',
|
|
1392
|
+
'column',
|
|
1393
|
+
'columnLines',
|
|
1394
|
+
'columns',
|
|
1395
|
+
'config',
|
|
1396
|
+
'contentElementCls',
|
|
1397
|
+
'contextMenuTriggerEvent',
|
|
1398
|
+
'data',
|
|
1399
|
+
'dataField',
|
|
1400
|
+
'dataset',
|
|
1401
|
+
'date',
|
|
1402
|
+
'dateFormat',
|
|
1403
|
+
'dateSeparator',
|
|
1404
|
+
'defaultRegion',
|
|
1405
|
+
'defaultScrollOptions',
|
|
1406
|
+
'descriptionFormat',
|
|
1407
|
+
'descriptionRenderer',
|
|
1408
|
+
'destroyStore',
|
|
1409
|
+
'detectCSSCompatibilityIssues',
|
|
1410
|
+
'disabled',
|
|
1411
|
+
'disableGridColumnIdWarning',
|
|
1412
|
+
'disableGridRowModelWarning',
|
|
1413
|
+
'dock',
|
|
1414
|
+
'dragUnit',
|
|
1415
|
+
'drawer',
|
|
1416
|
+
'elementAttributes',
|
|
1417
|
+
'emptyText',
|
|
1418
|
+
'enableSticky',
|
|
1419
|
+
'enableTextSelection',
|
|
1420
|
+
'enableUndoRedoKeys',
|
|
1421
|
+
'endDate',
|
|
1422
|
+
'eventFilter',
|
|
1423
|
+
'eventHeaderRenderer',
|
|
1424
|
+
'eventHeight',
|
|
1425
|
+
'eventListTimeFormat',
|
|
1426
|
+
'eventRenderer',
|
|
1427
|
+
'eventSorter',
|
|
1428
|
+
'eventTimeRenderer',
|
|
1429
|
+
'extendAllDayEndDay',
|
|
1430
|
+
'extraData',
|
|
1431
|
+
'fillLastColumn',
|
|
1432
|
+
'filterEventResources',
|
|
1433
|
+
'fixedDuration',
|
|
1434
|
+
'fixedRowHeight',
|
|
1435
|
+
'flex',
|
|
1436
|
+
'footer',
|
|
1437
|
+
'formulaProviders',
|
|
1438
|
+
'fullRowRefresh',
|
|
1439
|
+
'getPrimaryResource',
|
|
1440
|
+
'getRowHeight',
|
|
1441
|
+
'header',
|
|
1442
|
+
'height',
|
|
1443
|
+
'hidden',
|
|
1444
|
+
'hideFooters',
|
|
1445
|
+
'hideHeaders',
|
|
1446
|
+
'hideHorizontalScrollbar',
|
|
1447
|
+
'hideNonWorkingDays',
|
|
1448
|
+
'hoverCls',
|
|
1449
|
+
'icon',
|
|
1450
|
+
'id',
|
|
1451
|
+
'ignoreParentReadOnly',
|
|
1452
|
+
'inputFieldAlign',
|
|
1453
|
+
'insertBefore',
|
|
1454
|
+
'insertFirst',
|
|
1455
|
+
'keyMap',
|
|
1456
|
+
'labelPosition',
|
|
1457
|
+
'listeners',
|
|
1458
|
+
'listRangeMenu',
|
|
1459
|
+
'loadMask',
|
|
1460
|
+
'loadMaskDefaults',
|
|
1461
|
+
'loadMaskError',
|
|
1462
|
+
'localizable',
|
|
1463
|
+
'longPressTime',
|
|
1464
|
+
'margin',
|
|
1465
|
+
'maskDefaults',
|
|
1466
|
+
'masked',
|
|
1467
|
+
'maxDate',
|
|
1468
|
+
'maxHeight',
|
|
1469
|
+
'maxWidth',
|
|
1470
|
+
'minDate',
|
|
1471
|
+
'minHeight',
|
|
1472
|
+
'minWidth',
|
|
1473
|
+
'monitorResize',
|
|
1474
|
+
'nonWorkingDays',
|
|
1475
|
+
'owner',
|
|
1476
|
+
'pastEventCls',
|
|
1477
|
+
'plugins',
|
|
1478
|
+
'preserveFocusOnDatasetChange',
|
|
1479
|
+
'preserveScroll',
|
|
1480
|
+
'preserveScrollOnDatasetChange',
|
|
1481
|
+
'preventTooltipOnTouch',
|
|
1482
|
+
'range',
|
|
1483
|
+
'readOnly',
|
|
1484
|
+
'relayStoreEvents',
|
|
1485
|
+
'rendition',
|
|
1486
|
+
'resizable',
|
|
1487
|
+
'resizeToFitIncludesHeader',
|
|
1488
|
+
'resourceImagePath',
|
|
1489
|
+
'responsive',
|
|
1490
|
+
'responsiveLevels',
|
|
1491
|
+
'responsiveRoot',
|
|
1492
|
+
'responsiveState',
|
|
1493
|
+
'responsiveTarget',
|
|
1494
|
+
'ripple',
|
|
1495
|
+
'rootElement',
|
|
1496
|
+
'rowHeight',
|
|
1497
|
+
'rowLines',
|
|
1498
|
+
'rtl',
|
|
1499
|
+
'scrollable',
|
|
1500
|
+
'scrollerClass',
|
|
1501
|
+
'scrollManager',
|
|
1502
|
+
'selectionMode',
|
|
1503
|
+
'selectorButton',
|
|
1504
|
+
'selectorMenuItem',
|
|
1505
|
+
'shiftIncrement',
|
|
1506
|
+
'shortDateFormat',
|
|
1507
|
+
'shortDateTimeFormat',
|
|
1508
|
+
'shortEventCls',
|
|
1509
|
+
'shortEventDuration',
|
|
1510
|
+
'showBullet',
|
|
1511
|
+
'showDirty',
|
|
1512
|
+
'showResourceAvatars',
|
|
1513
|
+
'span',
|
|
1514
|
+
'stackMultiDayEvents',
|
|
1515
|
+
'startDate',
|
|
1516
|
+
'stateful',
|
|
1517
|
+
'statefulEvents',
|
|
1518
|
+
'stateId',
|
|
1519
|
+
'stateProvider',
|
|
1520
|
+
'stateSettings',
|
|
1521
|
+
'store',
|
|
1522
|
+
'strips',
|
|
1523
|
+
'subGridConfigs',
|
|
1524
|
+
'syncCalendarDate',
|
|
1525
|
+
'syncMask',
|
|
1526
|
+
'syncViewDate',
|
|
1527
|
+
'tab',
|
|
1528
|
+
'tabBarItems',
|
|
1529
|
+
'tbar',
|
|
1530
|
+
'timeFormat',
|
|
1531
|
+
'title',
|
|
1532
|
+
'tools',
|
|
1533
|
+
'transition',
|
|
1534
|
+
'transitionDuration',
|
|
1535
|
+
'type',
|
|
1536
|
+
'ui',
|
|
1537
|
+
'weekStartDay',
|
|
1538
|
+
'weight',
|
|
1539
|
+
'width'
|
|
1540
|
+
]);
|
|
1541
|
+
BryntumEventListComponent.bryntumConfigsOnly = [
|
|
1542
|
+
'activationKey',
|
|
1543
|
+
'adopt',
|
|
1544
|
+
'animateFilterRemovals',
|
|
1545
|
+
'animateRemovingRows',
|
|
1546
|
+
'ariaDescription',
|
|
1547
|
+
'ariaLabel',
|
|
1548
|
+
'autoHeight',
|
|
1549
|
+
'bbar',
|
|
1550
|
+
'bodyCls',
|
|
1551
|
+
'bubbleEvents',
|
|
1552
|
+
'collapsible',
|
|
1553
|
+
'color',
|
|
1554
|
+
'config',
|
|
1555
|
+
'contentElementCls',
|
|
1556
|
+
'contextMenuTriggerEvent',
|
|
1557
|
+
'dataField',
|
|
1558
|
+
'defaultRegion',
|
|
1559
|
+
'descriptionRenderer',
|
|
1560
|
+
'destroyStore',
|
|
1561
|
+
'detectCSSCompatibilityIssues',
|
|
1562
|
+
'disableGridColumnIdWarning',
|
|
1563
|
+
'disableGridRowModelWarning',
|
|
1564
|
+
'dock',
|
|
1565
|
+
'drawer',
|
|
1566
|
+
'elementAttributes',
|
|
1567
|
+
'enableSticky',
|
|
1568
|
+
'enableTextSelection',
|
|
1569
|
+
'endDate',
|
|
1570
|
+
'eventFilter',
|
|
1571
|
+
'eventHeaderRenderer',
|
|
1572
|
+
'eventHeight',
|
|
1573
|
+
'eventListTimeFormat',
|
|
1574
|
+
'eventRenderer',
|
|
1575
|
+
'eventSorter',
|
|
1576
|
+
'fillLastColumn',
|
|
1577
|
+
'fixedRowHeight',
|
|
1578
|
+
'footer',
|
|
1579
|
+
'formulaProviders',
|
|
1580
|
+
'fullRowRefresh',
|
|
1581
|
+
'getPrimaryResource',
|
|
1582
|
+
'getRowHeight',
|
|
1583
|
+
'header',
|
|
1584
|
+
'hideHorizontalScrollbar',
|
|
1585
|
+
'hoverCls',
|
|
1586
|
+
'icon',
|
|
1587
|
+
'ignoreParentReadOnly',
|
|
1588
|
+
'listeners',
|
|
1589
|
+
'listRangeMenu',
|
|
1590
|
+
'loadMask',
|
|
1591
|
+
'loadMaskDefaults',
|
|
1592
|
+
'loadMaskError',
|
|
1593
|
+
'localizable',
|
|
1594
|
+
'maskDefaults',
|
|
1595
|
+
'masked',
|
|
1596
|
+
'monitorResize',
|
|
1597
|
+
'owner',
|
|
1598
|
+
'plugins',
|
|
1599
|
+
'preserveFocusOnDatasetChange',
|
|
1600
|
+
'preserveScrollOnDatasetChange',
|
|
1601
|
+
'preventTooltipOnTouch',
|
|
1602
|
+
'relayStoreEvents',
|
|
1603
|
+
'resizable',
|
|
1604
|
+
'resizeToFitIncludesHeader',
|
|
1605
|
+
'resourceImagePath',
|
|
1606
|
+
'responsive',
|
|
1607
|
+
'responsiveLevels',
|
|
1608
|
+
'responsiveRoot',
|
|
1609
|
+
'responsiveState',
|
|
1610
|
+
'responsiveTarget',
|
|
1611
|
+
'ripple',
|
|
1612
|
+
'rootElement',
|
|
1613
|
+
'scrollerClass',
|
|
1614
|
+
'scrollManager',
|
|
1615
|
+
'selectorButton',
|
|
1616
|
+
'selectorMenuItem',
|
|
1617
|
+
'shortEventCls',
|
|
1618
|
+
'shortEventDuration',
|
|
1619
|
+
'showBullet',
|
|
1620
|
+
'showDirty',
|
|
1621
|
+
'showResourceAvatars',
|
|
1622
|
+
'startDate',
|
|
1623
|
+
'stateful',
|
|
1624
|
+
'statefulEvents',
|
|
1625
|
+
'stateId',
|
|
1626
|
+
'stateProvider',
|
|
1627
|
+
'strips',
|
|
1628
|
+
'subGridConfigs',
|
|
1629
|
+
'syncMask',
|
|
1630
|
+
'tab',
|
|
1631
|
+
'tabBarItems',
|
|
1632
|
+
'tbar',
|
|
1633
|
+
'timeFormat',
|
|
1634
|
+
'type',
|
|
1635
|
+
'ui',
|
|
1636
|
+
'weekStartDay',
|
|
1637
|
+
'weight'
|
|
1638
|
+
];
|
|
1639
|
+
BryntumEventListComponent.bryntumProps = BryntumEventListComponent.bryntumFeatureNames.concat([
|
|
1640
|
+
'alignSelf',
|
|
1641
|
+
'allowDragCreate',
|
|
1642
|
+
'allowDragMove',
|
|
1643
|
+
'allowDragResize',
|
|
1644
|
+
'animateTimeShift',
|
|
1645
|
+
'animateTreeNodeToggle',
|
|
1646
|
+
'appendTo',
|
|
1647
|
+
'autoCreate',
|
|
1648
|
+
'callOnFunctions',
|
|
1649
|
+
'catchEventHandlerExceptions',
|
|
1650
|
+
'cellEllipsis',
|
|
1651
|
+
'cls',
|
|
1652
|
+
'collapsed',
|
|
1653
|
+
'column',
|
|
1654
|
+
'columnLines',
|
|
1655
|
+
'columns',
|
|
1656
|
+
'data',
|
|
1657
|
+
'dataset',
|
|
1658
|
+
'date',
|
|
1659
|
+
'dateFormat',
|
|
1660
|
+
'dateSeparator',
|
|
1661
|
+
'dayCellCls',
|
|
1662
|
+
'defaultScrollOptions',
|
|
1663
|
+
'descriptionFormat',
|
|
1664
|
+
'disabled',
|
|
1665
|
+
'dragUnit',
|
|
1666
|
+
'emptyText',
|
|
1667
|
+
'enableUndoRedoKeys',
|
|
1668
|
+
'eventTimeRenderer',
|
|
1669
|
+
'extendAllDayEndDay',
|
|
1670
|
+
'extraData',
|
|
1671
|
+
'filterEventResources',
|
|
1672
|
+
'firstVisibleCell',
|
|
1673
|
+
'firstVisibleDate',
|
|
1674
|
+
'fixedDuration',
|
|
1675
|
+
'flex',
|
|
1676
|
+
'focusVisible',
|
|
1677
|
+
'hasChanges',
|
|
1678
|
+
'height',
|
|
1679
|
+
'hidden',
|
|
1680
|
+
'hideFooters',
|
|
1681
|
+
'hideHeaders',
|
|
1682
|
+
'hideNonWorkingDays',
|
|
1683
|
+
'id',
|
|
1684
|
+
'inputFieldAlign',
|
|
1685
|
+
'insertBefore',
|
|
1686
|
+
'insertFirst',
|
|
1687
|
+
'keyMap',
|
|
1688
|
+
'labelPosition',
|
|
1689
|
+
'lastVisibleCell',
|
|
1690
|
+
'lastVisibleDate',
|
|
1691
|
+
'longPressTime',
|
|
1692
|
+
'margin',
|
|
1693
|
+
'maxDate',
|
|
1694
|
+
'maxHeight',
|
|
1695
|
+
'maxWidth',
|
|
1696
|
+
'minDate',
|
|
1697
|
+
'minHeight',
|
|
1698
|
+
'minWidth',
|
|
1699
|
+
'nonWorkingDays',
|
|
1700
|
+
'originalStore',
|
|
1701
|
+
'parent',
|
|
1702
|
+
'pastEventCls',
|
|
1703
|
+
'preserveScroll',
|
|
1704
|
+
'range',
|
|
1705
|
+
'readOnly',
|
|
1706
|
+
'rendition',
|
|
1707
|
+
'rowHeight',
|
|
1708
|
+
'rowLines',
|
|
1709
|
+
'rtl',
|
|
1710
|
+
'scrollable',
|
|
1711
|
+
'selectedCell',
|
|
1712
|
+
'selectedCells',
|
|
1713
|
+
'selectedRecord',
|
|
1714
|
+
'selectedRecords',
|
|
1715
|
+
'selectedRows',
|
|
1716
|
+
'selectionMode',
|
|
1717
|
+
'shiftIncrement',
|
|
1718
|
+
'shortDateFormat',
|
|
1719
|
+
'shortDateTimeFormat',
|
|
1720
|
+
'span',
|
|
1721
|
+
'stackMultiDayEvents',
|
|
1722
|
+
'state',
|
|
1723
|
+
'stateSettings',
|
|
1724
|
+
'store',
|
|
1725
|
+
'syncCalendarDate',
|
|
1726
|
+
'syncViewDate',
|
|
1727
|
+
'title',
|
|
1728
|
+
'tools',
|
|
1729
|
+
'tooltip',
|
|
1730
|
+
'transition',
|
|
1731
|
+
'transitionDuration',
|
|
1732
|
+
'width'
|
|
1733
|
+
]);
|
|
1734
|
+
BryntumEventListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumEventListComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
1735
|
+
BryntumEventListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumEventListComponent, selector: "bryntum-event-list", inputs: { activationKey: "activationKey", adopt: "adopt", animateFilterRemovals: "animateFilterRemovals", animateRemovingRows: "animateRemovingRows", ariaDescription: "ariaDescription", ariaLabel: "ariaLabel", autoHeight: "autoHeight", bbar: "bbar", bodyCls: "bodyCls", bubbleEvents: "bubbleEvents", collapsible: "collapsible", color: "color", config: "config", contentElementCls: "contentElementCls", contextMenuTriggerEvent: "contextMenuTriggerEvent", dataField: "dataField", defaultRegion: "defaultRegion", descriptionRenderer: "descriptionRenderer", destroyStore: "destroyStore", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", disableGridColumnIdWarning: "disableGridColumnIdWarning", disableGridRowModelWarning: "disableGridRowModelWarning", dock: "dock", drawer: "drawer", elementAttributes: "elementAttributes", enableSticky: "enableSticky", enableTextSelection: "enableTextSelection", endDate: "endDate", eventFilter: "eventFilter", eventHeaderRenderer: "eventHeaderRenderer", eventHeight: "eventHeight", eventListTimeFormat: "eventListTimeFormat", eventRenderer: "eventRenderer", eventSorter: "eventSorter", fillLastColumn: "fillLastColumn", fixedRowHeight: "fixedRowHeight", footer: "footer", formulaProviders: "formulaProviders", fullRowRefresh: "fullRowRefresh", getPrimaryResource: "getPrimaryResource", getRowHeight: "getRowHeight", header: "header", hideHorizontalScrollbar: "hideHorizontalScrollbar", hoverCls: "hoverCls", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", listeners: "listeners", listRangeMenu: "listRangeMenu", loadMask: "loadMask", loadMaskDefaults: "loadMaskDefaults", loadMaskError: "loadMaskError", localizable: "localizable", maskDefaults: "maskDefaults", masked: "masked", monitorResize: "monitorResize", owner: "owner", plugins: "plugins", preserveFocusOnDatasetChange: "preserveFocusOnDatasetChange", preserveScrollOnDatasetChange: "preserveScrollOnDatasetChange", preventTooltipOnTouch: "preventTooltipOnTouch", relayStoreEvents: "relayStoreEvents", resizable: "resizable", resizeToFitIncludesHeader: "resizeToFitIncludesHeader", resourceImagePath: "resourceImagePath", responsive: "responsive", responsiveLevels: "responsiveLevels", responsiveRoot: "responsiveRoot", responsiveState: "responsiveState", responsiveTarget: "responsiveTarget", ripple: "ripple", rootElement: "rootElement", scrollerClass: "scrollerClass", scrollManager: "scrollManager", selectorButton: "selectorButton", selectorMenuItem: "selectorMenuItem", shortEventCls: "shortEventCls", shortEventDuration: "shortEventDuration", showBullet: "showBullet", showDirty: "showDirty", showResourceAvatars: "showResourceAvatars", startDate: "startDate", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", subGridConfigs: "subGridConfigs", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", tbar: "tbar", timeFormat: "timeFormat", type: "type", ui: "ui", weekStartDay: "weekStartDay", weight: "weight", alignSelf: "alignSelf", allowDragCreate: "allowDragCreate", allowDragMove: "allowDragMove", allowDragResize: "allowDragResize", animateTimeShift: "animateTimeShift", animateTreeNodeToggle: "animateTreeNodeToggle", appendTo: "appendTo", autoCreate: "autoCreate", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cellEllipsis: "cellEllipsis", cls: "cls", collapsed: "collapsed", column: "column", columnLines: "columnLines", columns: "columns", data: "data", dataset: "dataset", date: "date", dateFormat: "dateFormat", dateSeparator: "dateSeparator", defaultScrollOptions: "defaultScrollOptions", descriptionFormat: "descriptionFormat", disabled: "disabled", dragUnit: "dragUnit", emptyText: "emptyText", enableUndoRedoKeys: "enableUndoRedoKeys", eventTimeRenderer: "eventTimeRenderer", extendAllDayEndDay: "extendAllDayEndDay", extraData: "extraData", filterEventResources: "filterEventResources", fixedDuration: "fixedDuration", flex: "flex", height: "height", hidden: "hidden", hideFooters: "hideFooters", hideHeaders: "hideHeaders", hideNonWorkingDays: "hideNonWorkingDays", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", keyMap: "keyMap", labelPosition: "labelPosition", longPressTime: "longPressTime", margin: "margin", maxDate: "maxDate", maxHeight: "maxHeight", maxWidth: "maxWidth", minDate: "minDate", minHeight: "minHeight", minWidth: "minWidth", nonWorkingDays: "nonWorkingDays", pastEventCls: "pastEventCls", preserveScroll: "preserveScroll", range: "range", readOnly: "readOnly", rendition: "rendition", rowHeight: "rowHeight", rowLines: "rowLines", rtl: "rtl", scrollable: "scrollable", selectionMode: "selectionMode", shiftIncrement: "shiftIncrement", shortDateFormat: "shortDateFormat", shortDateTimeFormat: "shortDateTimeFormat", span: "span", stackMultiDayEvents: "stackMultiDayEvents", stateSettings: "stateSettings", store: "store", syncCalendarDate: "syncCalendarDate", syncViewDate: "syncViewDate", title: "title", tools: "tools", transition: "transition", transitionDuration: "transitionDuration", width: "width", dayCellCls: "dayCellCls", firstVisibleCell: "firstVisibleCell", firstVisibleDate: "firstVisibleDate", focusVisible: "focusVisible", hasChanges: "hasChanges", lastVisibleCell: "lastVisibleCell", lastVisibleDate: "lastVisibleDate", originalStore: "originalStore", parent: "parent", selectedCell: "selectedCell", selectedCells: "selectedCells", selectedRecord: "selectedRecord", selectedRecords: "selectedRecords", selectedRows: "selectedRows", state: "state", tooltip: "tooltip", aiFilterFeature: "aiFilterFeature", cellCopyPasteFeature: "cellCopyPasteFeature", cellEditFeature: "cellEditFeature", cellMenuFeature: "cellMenuFeature", cellTooltipFeature: "cellTooltipFeature", chartsFeature: "chartsFeature", columnAutoWidthFeature: "columnAutoWidthFeature", columnDragToolbarFeature: "columnDragToolbarFeature", columnPickerFeature: "columnPickerFeature", columnRenameFeature: "columnRenameFeature", columnReorderFeature: "columnReorderFeature", columnResizeFeature: "columnResizeFeature", excelExporterFeature: "excelExporterFeature", fileDropFeature: "fileDropFeature", fillHandleFeature: "fillHandleFeature", filterFeature: "filterFeature", filterBarFeature: "filterBarFeature", groupFeature: "groupFeature", groupSummaryFeature: "groupSummaryFeature", headerMenuFeature: "headerMenuFeature", lockRowsFeature: "lockRowsFeature", mergeCellsFeature: "mergeCellsFeature", pdfExportFeature: "pdfExportFeature", pinColumnsFeature: "pinColumnsFeature", printFeature: "printFeature", quickFindFeature: "quickFindFeature", regionResizeFeature: "regionResizeFeature", rowCopyPasteFeature: "rowCopyPasteFeature", rowEditFeature: "rowEditFeature", rowExpanderFeature: "rowExpanderFeature", rowReorderFeature: "rowReorderFeature", rowResizeFeature: "rowResizeFeature", searchFeature: "searchFeature", sortFeature: "sortFeature", splitFeature: "splitFeature", stickyCellsFeature: "stickyCellsFeature", stripeFeature: "stripeFeature", summaryFeature: "summaryFeature", treeFeature: "treeFeature", treeGroupFeature: "treeGroupFeature" }, outputs: { onBeforeAutoCreate: "onBeforeAutoCreate", onBeforeCancelCellEdit: "onBeforeCancelCellEdit", onBeforeCancelRowEdit: "onBeforeCancelRowEdit", onBeforeCellEditStart: "onBeforeCellEditStart", onBeforeCellRangeDelete: "onBeforeCellRangeDelete", onBeforeCellRangeEdit: "onBeforeCellRangeEdit", onBeforeChangeDate: "onBeforeChangeDate", onBeforeColumnDragStart: "onBeforeColumnDragStart", onBeforeColumnDropFinalize: "onBeforeColumnDropFinalize", onBeforeColumnResize: "onBeforeColumnResize", onBeforeCopy: "onBeforeCopy", onBeforeCSVExport: "onBeforeCSVExport", onBeforeDestroy: "onBeforeDestroy", onBeforeExcelExport: "onBeforeExcelExport", onBeforeFillHandleDragStart: "onBeforeFillHandleDragStart", onBeforeFinishCellEdit: "onBeforeFinishCellEdit", onBeforeFinishRowEdit: "onBeforeFinishRowEdit", onBeforeHide: "onBeforeHide", onBeforePaste: "onBeforePaste", onBeforePdfExport: "onBeforePdfExport", onBeforeRenderRow: "onBeforeRenderRow", onBeforeRenderRows: "onBeforeRenderRows", onBeforeResponsiveStateChange: "onBeforeResponsiveStateChange", onBeforeRowCollapse: "onBeforeRowCollapse", onBeforeRowExpand: "onBeforeRowExpand", onBeforeSelectionChange: "onBeforeSelectionChange", onBeforeSetRecord: "onBeforeSetRecord", onBeforeShow: "onBeforeShow", onBeforeStartRowEdit: "onBeforeStartRowEdit", onBeforeStateApply: "onBeforeStateApply", onBeforeStateSave: "onBeforeStateSave", onBeforeToggleGroup: "onBeforeToggleGroup", onBeforeToggleNode: "onBeforeToggleNode", onCancelCellEdit: "onCancelCellEdit", onCatchAll: "onCatchAll", onCellClick: "onCellClick", onCellContextMenu: "onCellContextMenu", onCellDblClick: "onCellDblClick", onCellMapPopulated: "onCellMapPopulated", onCellMenuBeforeShow: "onCellMenuBeforeShow", onCellMenuItem: "onCellMenuItem", onCellMenuShow: "onCellMenuShow", onCellMenuToggleItem: "onCellMenuToggleItem", onCellMouseEnter: "onCellMouseEnter", onCellMouseLeave: "onCellMouseLeave", onCellMouseOut: "onCellMouseOut", onCellMouseOver: "onCellMouseOver", onCollapse: "onCollapse", onCollapseNode: "onCollapseNode", onColumnDrag: "onColumnDrag", onColumnDragStart: "onColumnDragStart", onColumnDrop: "onColumnDrop", onColumnResize: "onColumnResize", onColumnResizeStart: "onColumnResizeStart", onContextMenuItem: "onContextMenuItem", onContextMenuToggleItem: "onContextMenuToggleItem", onCopy: "onCopy", onDataChange: "onDataChange", onDayCellPopulated: "onDayCellPopulated", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onDragSelecting: "onDragSelecting", onElementCreated: "onElementCreated", onEventAutoCreated: "onEventAutoCreated", onEventPropagate: "onEventPropagate", onExpand: "onExpand", onExpandNode: "onExpandNode", onFileDrop: "onFileDrop", onFillHandleBeforeDragFinalize: "onFillHandleBeforeDragFinalize", onFillHandleDrag: "onFillHandleDrag", onFillHandleDragAbort: "onFillHandleDragAbort", onFillHandleDragEnd: "onFillHandleDragEnd", onFillHandleDragStart: "onFillHandleDragStart", onFinishCellEdit: "onFinishCellEdit", onFinishRowEdit: "onFinishRowEdit", onFocusIn: "onFocusIn", onFocusOut: "onFocusOut", onGridRowBeforeDragStart: "onGridRowBeforeDragStart", onGridRowBeforeDropFinalize: "onGridRowBeforeDropFinalize", onGridRowDrag: "onGridRowDrag", onGridRowDragAbort: "onGridRowDragAbort", onGridRowDragStart: "onGridRowDragStart", onGridRowDrop: "onGridRowDrop", onHeaderClick: "onHeaderClick", onHeaderMenuBeforeShow: "onHeaderMenuBeforeShow", onHeaderMenuItem: "onHeaderMenuItem", onHeaderMenuShow: "onHeaderMenuShow", onHeaderMenuToggleItem: "onHeaderMenuToggleItem", onHide: "onHide", onLockRows: "onLockRows", onMouseOut: "onMouseOut", onMouseOver: "onMouseOver", onPaint: "onPaint", onPaste: "onPaste", onPdfExport: "onPdfExport", onRangeChange: "onRangeChange", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRenderRow: "onRenderRow", onRenderRows: "onRenderRows", onResize: "onResize", onResponsive: "onResponsive", onResponsiveStateChange: "onResponsiveStateChange", onRowCollapse: "onRowCollapse", onRowExpand: "onRowExpand", onRowMouseEnter: "onRowMouseEnter", onRowMouseLeave: "onRowMouseLeave", onScroll: "onScroll", onSelectionChange: "onSelectionChange", onSelectionModeChange: "onSelectionModeChange", onShiftIncrementChange: "onShiftIncrementChange", onShow: "onShow", onSplit: "onSplit", onSplitterCollapseClick: "onSplitterCollapseClick", onSplitterDragEnd: "onSplitterDragEnd", onSplitterDragStart: "onSplitterDragStart", onSplitterExpandClick: "onSplitterExpandClick", onStartCellEdit: "onStartCellEdit", onStartRowEdit: "onStartRowEdit", onSubGridCollapse: "onSubGridCollapse", onSubGridExpand: "onSubGridExpand", onToggleGroup: "onToggleGroup", onToggleNode: "onToggleNode", onToolClick: "onToolClick", onUnlockRows: "onUnlockRows", onUnsplit: "onUnsplit" }, usesOnChanges: true, ngImport: i0, template: '', isInline: true });
|
|
1736
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumEventListComponent, decorators: [{
|
|
1737
|
+
type: Component,
|
|
1738
|
+
args: [{
|
|
1739
|
+
selector: 'bryntum-event-list',
|
|
1740
|
+
template: ''
|
|
1741
|
+
}]
|
|
1742
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { activationKey: [{
|
|
1743
|
+
type: Input
|
|
1744
|
+
}], adopt: [{
|
|
1745
|
+
type: Input
|
|
1746
|
+
}], animateFilterRemovals: [{
|
|
1747
|
+
type: Input
|
|
1748
|
+
}], animateRemovingRows: [{
|
|
1749
|
+
type: Input
|
|
1750
|
+
}], ariaDescription: [{
|
|
1751
|
+
type: Input
|
|
1752
|
+
}], ariaLabel: [{
|
|
1753
|
+
type: Input
|
|
1754
|
+
}], autoHeight: [{
|
|
1755
|
+
type: Input
|
|
1756
|
+
}], bbar: [{
|
|
1757
|
+
type: Input
|
|
1758
|
+
}], bodyCls: [{
|
|
1759
|
+
type: Input
|
|
1760
|
+
}], bubbleEvents: [{
|
|
1761
|
+
type: Input
|
|
1762
|
+
}], collapsible: [{
|
|
1763
|
+
type: Input
|
|
1764
|
+
}], color: [{
|
|
1765
|
+
type: Input
|
|
1766
|
+
}], config: [{
|
|
1767
|
+
type: Input
|
|
1768
|
+
}], contentElementCls: [{
|
|
1769
|
+
type: Input
|
|
1770
|
+
}], contextMenuTriggerEvent: [{
|
|
1771
|
+
type: Input
|
|
1772
|
+
}], dataField: [{
|
|
1773
|
+
type: Input
|
|
1774
|
+
}], defaultRegion: [{
|
|
1775
|
+
type: Input
|
|
1776
|
+
}], descriptionRenderer: [{
|
|
1777
|
+
type: Input
|
|
1778
|
+
}], destroyStore: [{
|
|
1779
|
+
type: Input
|
|
1780
|
+
}], detectCSSCompatibilityIssues: [{
|
|
1781
|
+
type: Input
|
|
1782
|
+
}], disableGridColumnIdWarning: [{
|
|
1783
|
+
type: Input
|
|
1784
|
+
}], disableGridRowModelWarning: [{
|
|
1785
|
+
type: Input
|
|
1786
|
+
}], dock: [{
|
|
1787
|
+
type: Input
|
|
1788
|
+
}], drawer: [{
|
|
1789
|
+
type: Input
|
|
1790
|
+
}], elementAttributes: [{
|
|
1791
|
+
type: Input
|
|
1792
|
+
}], enableSticky: [{
|
|
1793
|
+
type: Input
|
|
1794
|
+
}], enableTextSelection: [{
|
|
1795
|
+
type: Input
|
|
1796
|
+
}], endDate: [{
|
|
1797
|
+
type: Input
|
|
1798
|
+
}], eventFilter: [{
|
|
1799
|
+
type: Input
|
|
1800
|
+
}], eventHeaderRenderer: [{
|
|
1801
|
+
type: Input
|
|
1802
|
+
}], eventHeight: [{
|
|
1803
|
+
type: Input
|
|
1804
|
+
}], eventListTimeFormat: [{
|
|
1805
|
+
type: Input
|
|
1806
|
+
}], eventRenderer: [{
|
|
1807
|
+
type: Input
|
|
1808
|
+
}], eventSorter: [{
|
|
1809
|
+
type: Input
|
|
1810
|
+
}], fillLastColumn: [{
|
|
1811
|
+
type: Input
|
|
1812
|
+
}], fixedRowHeight: [{
|
|
1813
|
+
type: Input
|
|
1814
|
+
}], footer: [{
|
|
1815
|
+
type: Input
|
|
1816
|
+
}], formulaProviders: [{
|
|
1817
|
+
type: Input
|
|
1818
|
+
}], fullRowRefresh: [{
|
|
1819
|
+
type: Input
|
|
1820
|
+
}], getPrimaryResource: [{
|
|
1821
|
+
type: Input
|
|
1822
|
+
}], getRowHeight: [{
|
|
1823
|
+
type: Input
|
|
1824
|
+
}], header: [{
|
|
1825
|
+
type: Input
|
|
1826
|
+
}], hideHorizontalScrollbar: [{
|
|
1827
|
+
type: Input
|
|
1828
|
+
}], hoverCls: [{
|
|
1829
|
+
type: Input
|
|
1830
|
+
}], icon: [{
|
|
1831
|
+
type: Input
|
|
1832
|
+
}], ignoreParentReadOnly: [{
|
|
1833
|
+
type: Input
|
|
1834
|
+
}], listeners: [{
|
|
1835
|
+
type: Input
|
|
1836
|
+
}], listRangeMenu: [{
|
|
1837
|
+
type: Input
|
|
1838
|
+
}], loadMask: [{
|
|
1839
|
+
type: Input
|
|
1840
|
+
}], loadMaskDefaults: [{
|
|
1841
|
+
type: Input
|
|
1842
|
+
}], loadMaskError: [{
|
|
1843
|
+
type: Input
|
|
1844
|
+
}], localizable: [{
|
|
1845
|
+
type: Input
|
|
1846
|
+
}], maskDefaults: [{
|
|
1847
|
+
type: Input
|
|
1848
|
+
}], masked: [{
|
|
1849
|
+
type: Input
|
|
1850
|
+
}], monitorResize: [{
|
|
1851
|
+
type: Input
|
|
1852
|
+
}], owner: [{
|
|
1853
|
+
type: Input
|
|
1854
|
+
}], plugins: [{
|
|
1855
|
+
type: Input
|
|
1856
|
+
}], preserveFocusOnDatasetChange: [{
|
|
1857
|
+
type: Input
|
|
1858
|
+
}], preserveScrollOnDatasetChange: [{
|
|
1859
|
+
type: Input
|
|
1860
|
+
}], preventTooltipOnTouch: [{
|
|
1861
|
+
type: Input
|
|
1862
|
+
}], relayStoreEvents: [{
|
|
1863
|
+
type: Input
|
|
1864
|
+
}], resizable: [{
|
|
1865
|
+
type: Input
|
|
1866
|
+
}], resizeToFitIncludesHeader: [{
|
|
1867
|
+
type: Input
|
|
1868
|
+
}], resourceImagePath: [{
|
|
1869
|
+
type: Input
|
|
1870
|
+
}], responsive: [{
|
|
1871
|
+
type: Input
|
|
1872
|
+
}], responsiveLevels: [{
|
|
1873
|
+
type: Input
|
|
1874
|
+
}], responsiveRoot: [{
|
|
1875
|
+
type: Input
|
|
1876
|
+
}], responsiveState: [{
|
|
1877
|
+
type: Input
|
|
1878
|
+
}], responsiveTarget: [{
|
|
1879
|
+
type: Input
|
|
1880
|
+
}], ripple: [{
|
|
1881
|
+
type: Input
|
|
1882
|
+
}], rootElement: [{
|
|
1883
|
+
type: Input
|
|
1884
|
+
}], scrollerClass: [{
|
|
1885
|
+
type: Input
|
|
1886
|
+
}], scrollManager: [{
|
|
1887
|
+
type: Input
|
|
1888
|
+
}], selectorButton: [{
|
|
1889
|
+
type: Input
|
|
1890
|
+
}], selectorMenuItem: [{
|
|
1891
|
+
type: Input
|
|
1892
|
+
}], shortEventCls: [{
|
|
1893
|
+
type: Input
|
|
1894
|
+
}], shortEventDuration: [{
|
|
1895
|
+
type: Input
|
|
1896
|
+
}], showBullet: [{
|
|
1897
|
+
type: Input
|
|
1898
|
+
}], showDirty: [{
|
|
1899
|
+
type: Input
|
|
1900
|
+
}], showResourceAvatars: [{
|
|
1901
|
+
type: Input
|
|
1902
|
+
}], startDate: [{
|
|
1903
|
+
type: Input
|
|
1904
|
+
}], stateful: [{
|
|
1905
|
+
type: Input
|
|
1906
|
+
}], statefulEvents: [{
|
|
1907
|
+
type: Input
|
|
1908
|
+
}], stateId: [{
|
|
1909
|
+
type: Input
|
|
1910
|
+
}], stateProvider: [{
|
|
1911
|
+
type: Input
|
|
1912
|
+
}], strips: [{
|
|
1913
|
+
type: Input
|
|
1914
|
+
}], subGridConfigs: [{
|
|
1915
|
+
type: Input
|
|
1916
|
+
}], syncMask: [{
|
|
1917
|
+
type: Input
|
|
1918
|
+
}], tab: [{
|
|
1919
|
+
type: Input
|
|
1920
|
+
}], tabBarItems: [{
|
|
1921
|
+
type: Input
|
|
1922
|
+
}], tbar: [{
|
|
1923
|
+
type: Input
|
|
1924
|
+
}], timeFormat: [{
|
|
1925
|
+
type: Input
|
|
1926
|
+
}], type: [{
|
|
1927
|
+
type: Input
|
|
1928
|
+
}], ui: [{
|
|
1929
|
+
type: Input
|
|
1930
|
+
}], weekStartDay: [{
|
|
1931
|
+
type: Input
|
|
1932
|
+
}], weight: [{
|
|
1933
|
+
type: Input
|
|
1934
|
+
}], alignSelf: [{
|
|
1935
|
+
type: Input
|
|
1936
|
+
}], allowDragCreate: [{
|
|
1937
|
+
type: Input
|
|
1938
|
+
}], allowDragMove: [{
|
|
1939
|
+
type: Input
|
|
1940
|
+
}], allowDragResize: [{
|
|
1941
|
+
type: Input
|
|
1942
|
+
}], animateTimeShift: [{
|
|
1943
|
+
type: Input
|
|
1944
|
+
}], animateTreeNodeToggle: [{
|
|
1945
|
+
type: Input
|
|
1946
|
+
}], appendTo: [{
|
|
1947
|
+
type: Input
|
|
1948
|
+
}], autoCreate: [{
|
|
1949
|
+
type: Input
|
|
1950
|
+
}], callOnFunctions: [{
|
|
1951
|
+
type: Input
|
|
1952
|
+
}], catchEventHandlerExceptions: [{
|
|
1953
|
+
type: Input
|
|
1954
|
+
}], cellEllipsis: [{
|
|
1955
|
+
type: Input
|
|
1956
|
+
}], cls: [{
|
|
1957
|
+
type: Input
|
|
1958
|
+
}], collapsed: [{
|
|
1959
|
+
type: Input
|
|
1960
|
+
}], column: [{
|
|
1961
|
+
type: Input
|
|
1962
|
+
}], columnLines: [{
|
|
1963
|
+
type: Input
|
|
1964
|
+
}], columns: [{
|
|
1965
|
+
type: Input
|
|
1966
|
+
}], data: [{
|
|
1967
|
+
type: Input
|
|
1968
|
+
}], dataset: [{
|
|
1969
|
+
type: Input
|
|
1970
|
+
}], date: [{
|
|
1971
|
+
type: Input
|
|
1972
|
+
}], dateFormat: [{
|
|
1973
|
+
type: Input
|
|
1974
|
+
}], dateSeparator: [{
|
|
1975
|
+
type: Input
|
|
1976
|
+
}], defaultScrollOptions: [{
|
|
1977
|
+
type: Input
|
|
1978
|
+
}], descriptionFormat: [{
|
|
1979
|
+
type: Input
|
|
1980
|
+
}], disabled: [{
|
|
1981
|
+
type: Input
|
|
1982
|
+
}], dragUnit: [{
|
|
1983
|
+
type: Input
|
|
1984
|
+
}], emptyText: [{
|
|
1985
|
+
type: Input
|
|
1986
|
+
}], enableUndoRedoKeys: [{
|
|
1987
|
+
type: Input
|
|
1988
|
+
}], eventTimeRenderer: [{
|
|
1989
|
+
type: Input
|
|
1990
|
+
}], extendAllDayEndDay: [{
|
|
1991
|
+
type: Input
|
|
1992
|
+
}], extraData: [{
|
|
1993
|
+
type: Input
|
|
1994
|
+
}], filterEventResources: [{
|
|
1995
|
+
type: Input
|
|
1996
|
+
}], fixedDuration: [{
|
|
1997
|
+
type: Input
|
|
1998
|
+
}], flex: [{
|
|
1999
|
+
type: Input
|
|
2000
|
+
}], height: [{
|
|
2001
|
+
type: Input
|
|
2002
|
+
}], hidden: [{
|
|
2003
|
+
type: Input
|
|
2004
|
+
}], hideFooters: [{
|
|
2005
|
+
type: Input
|
|
2006
|
+
}], hideHeaders: [{
|
|
2007
|
+
type: Input
|
|
2008
|
+
}], hideNonWorkingDays: [{
|
|
2009
|
+
type: Input
|
|
2010
|
+
}], id: [{
|
|
2011
|
+
type: Input
|
|
2012
|
+
}], inputFieldAlign: [{
|
|
2013
|
+
type: Input
|
|
2014
|
+
}], insertBefore: [{
|
|
2015
|
+
type: Input
|
|
2016
|
+
}], insertFirst: [{
|
|
2017
|
+
type: Input
|
|
2018
|
+
}], keyMap: [{
|
|
2019
|
+
type: Input
|
|
2020
|
+
}], labelPosition: [{
|
|
2021
|
+
type: Input
|
|
2022
|
+
}], longPressTime: [{
|
|
2023
|
+
type: Input
|
|
2024
|
+
}], margin: [{
|
|
2025
|
+
type: Input
|
|
2026
|
+
}], maxDate: [{
|
|
2027
|
+
type: Input
|
|
2028
|
+
}], maxHeight: [{
|
|
2029
|
+
type: Input
|
|
2030
|
+
}], maxWidth: [{
|
|
2031
|
+
type: Input
|
|
2032
|
+
}], minDate: [{
|
|
2033
|
+
type: Input
|
|
2034
|
+
}], minHeight: [{
|
|
2035
|
+
type: Input
|
|
2036
|
+
}], minWidth: [{
|
|
2037
|
+
type: Input
|
|
2038
|
+
}], nonWorkingDays: [{
|
|
2039
|
+
type: Input
|
|
2040
|
+
}], pastEventCls: [{
|
|
2041
|
+
type: Input
|
|
2042
|
+
}], preserveScroll: [{
|
|
2043
|
+
type: Input
|
|
2044
|
+
}], range: [{
|
|
2045
|
+
type: Input
|
|
2046
|
+
}], readOnly: [{
|
|
2047
|
+
type: Input
|
|
2048
|
+
}], rendition: [{
|
|
2049
|
+
type: Input
|
|
2050
|
+
}], rowHeight: [{
|
|
2051
|
+
type: Input
|
|
2052
|
+
}], rowLines: [{
|
|
2053
|
+
type: Input
|
|
2054
|
+
}], rtl: [{
|
|
2055
|
+
type: Input
|
|
2056
|
+
}], scrollable: [{
|
|
2057
|
+
type: Input
|
|
2058
|
+
}], selectionMode: [{
|
|
2059
|
+
type: Input
|
|
2060
|
+
}], shiftIncrement: [{
|
|
2061
|
+
type: Input
|
|
2062
|
+
}], shortDateFormat: [{
|
|
2063
|
+
type: Input
|
|
2064
|
+
}], shortDateTimeFormat: [{
|
|
2065
|
+
type: Input
|
|
2066
|
+
}], span: [{
|
|
2067
|
+
type: Input
|
|
2068
|
+
}], stackMultiDayEvents: [{
|
|
2069
|
+
type: Input
|
|
2070
|
+
}], stateSettings: [{
|
|
2071
|
+
type: Input
|
|
2072
|
+
}], store: [{
|
|
2073
|
+
type: Input
|
|
2074
|
+
}], syncCalendarDate: [{
|
|
2075
|
+
type: Input
|
|
2076
|
+
}], syncViewDate: [{
|
|
2077
|
+
type: Input
|
|
2078
|
+
}], title: [{
|
|
2079
|
+
type: Input
|
|
2080
|
+
}], tools: [{
|
|
2081
|
+
type: Input
|
|
2082
|
+
}], transition: [{
|
|
2083
|
+
type: Input
|
|
2084
|
+
}], transitionDuration: [{
|
|
2085
|
+
type: Input
|
|
2086
|
+
}], width: [{
|
|
2087
|
+
type: Input
|
|
2088
|
+
}], dayCellCls: [{
|
|
2089
|
+
type: Input
|
|
2090
|
+
}], firstVisibleCell: [{
|
|
2091
|
+
type: Input
|
|
2092
|
+
}], firstVisibleDate: [{
|
|
2093
|
+
type: Input
|
|
2094
|
+
}], focusVisible: [{
|
|
2095
|
+
type: Input
|
|
2096
|
+
}], hasChanges: [{
|
|
2097
|
+
type: Input
|
|
2098
|
+
}], lastVisibleCell: [{
|
|
2099
|
+
type: Input
|
|
2100
|
+
}], lastVisibleDate: [{
|
|
2101
|
+
type: Input
|
|
2102
|
+
}], originalStore: [{
|
|
2103
|
+
type: Input
|
|
2104
|
+
}], parent: [{
|
|
2105
|
+
type: Input
|
|
2106
|
+
}], selectedCell: [{
|
|
2107
|
+
type: Input
|
|
2108
|
+
}], selectedCells: [{
|
|
2109
|
+
type: Input
|
|
2110
|
+
}], selectedRecord: [{
|
|
2111
|
+
type: Input
|
|
2112
|
+
}], selectedRecords: [{
|
|
2113
|
+
type: Input
|
|
2114
|
+
}], selectedRows: [{
|
|
2115
|
+
type: Input
|
|
2116
|
+
}], state: [{
|
|
2117
|
+
type: Input
|
|
2118
|
+
}], tooltip: [{
|
|
2119
|
+
type: Input
|
|
2120
|
+
}], aiFilterFeature: [{
|
|
2121
|
+
type: Input
|
|
2122
|
+
}], cellCopyPasteFeature: [{
|
|
2123
|
+
type: Input
|
|
2124
|
+
}], cellEditFeature: [{
|
|
2125
|
+
type: Input
|
|
2126
|
+
}], cellMenuFeature: [{
|
|
2127
|
+
type: Input
|
|
2128
|
+
}], cellTooltipFeature: [{
|
|
2129
|
+
type: Input
|
|
2130
|
+
}], chartsFeature: [{
|
|
2131
|
+
type: Input
|
|
2132
|
+
}], columnAutoWidthFeature: [{
|
|
2133
|
+
type: Input
|
|
2134
|
+
}], columnDragToolbarFeature: [{
|
|
2135
|
+
type: Input
|
|
2136
|
+
}], columnPickerFeature: [{
|
|
2137
|
+
type: Input
|
|
2138
|
+
}], columnRenameFeature: [{
|
|
2139
|
+
type: Input
|
|
2140
|
+
}], columnReorderFeature: [{
|
|
2141
|
+
type: Input
|
|
2142
|
+
}], columnResizeFeature: [{
|
|
2143
|
+
type: Input
|
|
2144
|
+
}], excelExporterFeature: [{
|
|
2145
|
+
type: Input
|
|
2146
|
+
}], fileDropFeature: [{
|
|
2147
|
+
type: Input
|
|
2148
|
+
}], fillHandleFeature: [{
|
|
2149
|
+
type: Input
|
|
2150
|
+
}], filterFeature: [{
|
|
2151
|
+
type: Input
|
|
2152
|
+
}], filterBarFeature: [{
|
|
2153
|
+
type: Input
|
|
2154
|
+
}], groupFeature: [{
|
|
2155
|
+
type: Input
|
|
2156
|
+
}], groupSummaryFeature: [{
|
|
2157
|
+
type: Input
|
|
2158
|
+
}], headerMenuFeature: [{
|
|
2159
|
+
type: Input
|
|
2160
|
+
}], lockRowsFeature: [{
|
|
2161
|
+
type: Input
|
|
2162
|
+
}], mergeCellsFeature: [{
|
|
2163
|
+
type: Input
|
|
2164
|
+
}], pdfExportFeature: [{
|
|
2165
|
+
type: Input
|
|
2166
|
+
}], pinColumnsFeature: [{
|
|
2167
|
+
type: Input
|
|
2168
|
+
}], printFeature: [{
|
|
2169
|
+
type: Input
|
|
2170
|
+
}], quickFindFeature: [{
|
|
2171
|
+
type: Input
|
|
2172
|
+
}], regionResizeFeature: [{
|
|
2173
|
+
type: Input
|
|
2174
|
+
}], rowCopyPasteFeature: [{
|
|
2175
|
+
type: Input
|
|
2176
|
+
}], rowEditFeature: [{
|
|
2177
|
+
type: Input
|
|
2178
|
+
}], rowExpanderFeature: [{
|
|
2179
|
+
type: Input
|
|
2180
|
+
}], rowReorderFeature: [{
|
|
2181
|
+
type: Input
|
|
2182
|
+
}], rowResizeFeature: [{
|
|
2183
|
+
type: Input
|
|
2184
|
+
}], searchFeature: [{
|
|
2185
|
+
type: Input
|
|
2186
|
+
}], sortFeature: [{
|
|
2187
|
+
type: Input
|
|
2188
|
+
}], splitFeature: [{
|
|
2189
|
+
type: Input
|
|
2190
|
+
}], stickyCellsFeature: [{
|
|
2191
|
+
type: Input
|
|
2192
|
+
}], stripeFeature: [{
|
|
2193
|
+
type: Input
|
|
2194
|
+
}], summaryFeature: [{
|
|
2195
|
+
type: Input
|
|
2196
|
+
}], treeFeature: [{
|
|
2197
|
+
type: Input
|
|
2198
|
+
}], treeGroupFeature: [{
|
|
2199
|
+
type: Input
|
|
2200
|
+
}], onBeforeAutoCreate: [{
|
|
2201
|
+
type: Output
|
|
2202
|
+
}], onBeforeCancelCellEdit: [{
|
|
2203
|
+
type: Output
|
|
2204
|
+
}], onBeforeCancelRowEdit: [{
|
|
2205
|
+
type: Output
|
|
2206
|
+
}], onBeforeCellEditStart: [{
|
|
2207
|
+
type: Output
|
|
2208
|
+
}], onBeforeCellRangeDelete: [{
|
|
2209
|
+
type: Output
|
|
2210
|
+
}], onBeforeCellRangeEdit: [{
|
|
2211
|
+
type: Output
|
|
2212
|
+
}], onBeforeChangeDate: [{
|
|
2213
|
+
type: Output
|
|
2214
|
+
}], onBeforeColumnDragStart: [{
|
|
2215
|
+
type: Output
|
|
2216
|
+
}], onBeforeColumnDropFinalize: [{
|
|
2217
|
+
type: Output
|
|
2218
|
+
}], onBeforeColumnResize: [{
|
|
2219
|
+
type: Output
|
|
2220
|
+
}], onBeforeCopy: [{
|
|
2221
|
+
type: Output
|
|
2222
|
+
}], onBeforeCSVExport: [{
|
|
2223
|
+
type: Output
|
|
2224
|
+
}], onBeforeDestroy: [{
|
|
2225
|
+
type: Output
|
|
2226
|
+
}], onBeforeExcelExport: [{
|
|
2227
|
+
type: Output
|
|
2228
|
+
}], onBeforeFillHandleDragStart: [{
|
|
2229
|
+
type: Output
|
|
2230
|
+
}], onBeforeFinishCellEdit: [{
|
|
2231
|
+
type: Output
|
|
2232
|
+
}], onBeforeFinishRowEdit: [{
|
|
2233
|
+
type: Output
|
|
2234
|
+
}], onBeforeHide: [{
|
|
2235
|
+
type: Output
|
|
2236
|
+
}], onBeforePaste: [{
|
|
2237
|
+
type: Output
|
|
2238
|
+
}], onBeforePdfExport: [{
|
|
2239
|
+
type: Output
|
|
2240
|
+
}], onBeforeRenderRow: [{
|
|
2241
|
+
type: Output
|
|
2242
|
+
}], onBeforeRenderRows: [{
|
|
2243
|
+
type: Output
|
|
2244
|
+
}], onBeforeResponsiveStateChange: [{
|
|
2245
|
+
type: Output
|
|
2246
|
+
}], onBeforeRowCollapse: [{
|
|
2247
|
+
type: Output
|
|
2248
|
+
}], onBeforeRowExpand: [{
|
|
2249
|
+
type: Output
|
|
2250
|
+
}], onBeforeSelectionChange: [{
|
|
2251
|
+
type: Output
|
|
2252
|
+
}], onBeforeSetRecord: [{
|
|
2253
|
+
type: Output
|
|
2254
|
+
}], onBeforeShow: [{
|
|
2255
|
+
type: Output
|
|
2256
|
+
}], onBeforeStartRowEdit: [{
|
|
2257
|
+
type: Output
|
|
2258
|
+
}], onBeforeStateApply: [{
|
|
2259
|
+
type: Output
|
|
2260
|
+
}], onBeforeStateSave: [{
|
|
2261
|
+
type: Output
|
|
2262
|
+
}], onBeforeToggleGroup: [{
|
|
2263
|
+
type: Output
|
|
2264
|
+
}], onBeforeToggleNode: [{
|
|
2265
|
+
type: Output
|
|
2266
|
+
}], onCancelCellEdit: [{
|
|
2267
|
+
type: Output
|
|
2268
|
+
}], onCatchAll: [{
|
|
2269
|
+
type: Output
|
|
2270
|
+
}], onCellClick: [{
|
|
2271
|
+
type: Output
|
|
2272
|
+
}], onCellContextMenu: [{
|
|
2273
|
+
type: Output
|
|
2274
|
+
}], onCellDblClick: [{
|
|
2275
|
+
type: Output
|
|
2276
|
+
}], onCellMapPopulated: [{
|
|
2277
|
+
type: Output
|
|
2278
|
+
}], onCellMenuBeforeShow: [{
|
|
2279
|
+
type: Output
|
|
2280
|
+
}], onCellMenuItem: [{
|
|
2281
|
+
type: Output
|
|
2282
|
+
}], onCellMenuShow: [{
|
|
2283
|
+
type: Output
|
|
2284
|
+
}], onCellMenuToggleItem: [{
|
|
2285
|
+
type: Output
|
|
2286
|
+
}], onCellMouseEnter: [{
|
|
2287
|
+
type: Output
|
|
2288
|
+
}], onCellMouseLeave: [{
|
|
2289
|
+
type: Output
|
|
2290
|
+
}], onCellMouseOut: [{
|
|
2291
|
+
type: Output
|
|
2292
|
+
}], onCellMouseOver: [{
|
|
2293
|
+
type: Output
|
|
2294
|
+
}], onCollapse: [{
|
|
2295
|
+
type: Output
|
|
2296
|
+
}], onCollapseNode: [{
|
|
2297
|
+
type: Output
|
|
2298
|
+
}], onColumnDrag: [{
|
|
2299
|
+
type: Output
|
|
2300
|
+
}], onColumnDragStart: [{
|
|
2301
|
+
type: Output
|
|
2302
|
+
}], onColumnDrop: [{
|
|
2303
|
+
type: Output
|
|
2304
|
+
}], onColumnResize: [{
|
|
2305
|
+
type: Output
|
|
2306
|
+
}], onColumnResizeStart: [{
|
|
2307
|
+
type: Output
|
|
2308
|
+
}], onContextMenuItem: [{
|
|
2309
|
+
type: Output
|
|
2310
|
+
}], onContextMenuToggleItem: [{
|
|
2311
|
+
type: Output
|
|
2312
|
+
}], onCopy: [{
|
|
2313
|
+
type: Output
|
|
2314
|
+
}], onDataChange: [{
|
|
2315
|
+
type: Output
|
|
2316
|
+
}], onDayCellPopulated: [{
|
|
2317
|
+
type: Output
|
|
2318
|
+
}], onDestroy: [{
|
|
2319
|
+
type: Output
|
|
2320
|
+
}], onDirtyStateChange: [{
|
|
2321
|
+
type: Output
|
|
2322
|
+
}], onDragSelecting: [{
|
|
2323
|
+
type: Output
|
|
2324
|
+
}], onElementCreated: [{
|
|
2325
|
+
type: Output
|
|
2326
|
+
}], onEventAutoCreated: [{
|
|
2327
|
+
type: Output
|
|
2328
|
+
}], onEventPropagate: [{
|
|
2329
|
+
type: Output
|
|
2330
|
+
}], onExpand: [{
|
|
2331
|
+
type: Output
|
|
2332
|
+
}], onExpandNode: [{
|
|
2333
|
+
type: Output
|
|
2334
|
+
}], onFileDrop: [{
|
|
2335
|
+
type: Output
|
|
2336
|
+
}], onFillHandleBeforeDragFinalize: [{
|
|
2337
|
+
type: Output
|
|
2338
|
+
}], onFillHandleDrag: [{
|
|
2339
|
+
type: Output
|
|
2340
|
+
}], onFillHandleDragAbort: [{
|
|
2341
|
+
type: Output
|
|
2342
|
+
}], onFillHandleDragEnd: [{
|
|
2343
|
+
type: Output
|
|
2344
|
+
}], onFillHandleDragStart: [{
|
|
2345
|
+
type: Output
|
|
2346
|
+
}], onFinishCellEdit: [{
|
|
2347
|
+
type: Output
|
|
2348
|
+
}], onFinishRowEdit: [{
|
|
2349
|
+
type: Output
|
|
2350
|
+
}], onFocusIn: [{
|
|
2351
|
+
type: Output
|
|
2352
|
+
}], onFocusOut: [{
|
|
2353
|
+
type: Output
|
|
2354
|
+
}], onGridRowBeforeDragStart: [{
|
|
2355
|
+
type: Output
|
|
2356
|
+
}], onGridRowBeforeDropFinalize: [{
|
|
2357
|
+
type: Output
|
|
2358
|
+
}], onGridRowDrag: [{
|
|
2359
|
+
type: Output
|
|
2360
|
+
}], onGridRowDragAbort: [{
|
|
2361
|
+
type: Output
|
|
2362
|
+
}], onGridRowDragStart: [{
|
|
2363
|
+
type: Output
|
|
2364
|
+
}], onGridRowDrop: [{
|
|
2365
|
+
type: Output
|
|
2366
|
+
}], onHeaderClick: [{
|
|
2367
|
+
type: Output
|
|
2368
|
+
}], onHeaderMenuBeforeShow: [{
|
|
2369
|
+
type: Output
|
|
2370
|
+
}], onHeaderMenuItem: [{
|
|
2371
|
+
type: Output
|
|
2372
|
+
}], onHeaderMenuShow: [{
|
|
2373
|
+
type: Output
|
|
2374
|
+
}], onHeaderMenuToggleItem: [{
|
|
2375
|
+
type: Output
|
|
2376
|
+
}], onHide: [{
|
|
2377
|
+
type: Output
|
|
2378
|
+
}], onLockRows: [{
|
|
2379
|
+
type: Output
|
|
2380
|
+
}], onMouseOut: [{
|
|
2381
|
+
type: Output
|
|
2382
|
+
}], onMouseOver: [{
|
|
2383
|
+
type: Output
|
|
2384
|
+
}], onPaint: [{
|
|
2385
|
+
type: Output
|
|
2386
|
+
}], onPaste: [{
|
|
2387
|
+
type: Output
|
|
2388
|
+
}], onPdfExport: [{
|
|
2389
|
+
type: Output
|
|
2390
|
+
}], onRangeChange: [{
|
|
2391
|
+
type: Output
|
|
2392
|
+
}], onReadOnly: [{
|
|
2393
|
+
type: Output
|
|
2394
|
+
}], onRecompose: [{
|
|
2395
|
+
type: Output
|
|
2396
|
+
}], onRenderRow: [{
|
|
2397
|
+
type: Output
|
|
2398
|
+
}], onRenderRows: [{
|
|
2399
|
+
type: Output
|
|
2400
|
+
}], onResize: [{
|
|
2401
|
+
type: Output
|
|
2402
|
+
}], onResponsive: [{
|
|
2403
|
+
type: Output
|
|
2404
|
+
}], onResponsiveStateChange: [{
|
|
2405
|
+
type: Output
|
|
2406
|
+
}], onRowCollapse: [{
|
|
2407
|
+
type: Output
|
|
2408
|
+
}], onRowExpand: [{
|
|
2409
|
+
type: Output
|
|
2410
|
+
}], onRowMouseEnter: [{
|
|
2411
|
+
type: Output
|
|
2412
|
+
}], onRowMouseLeave: [{
|
|
2413
|
+
type: Output
|
|
2414
|
+
}], onScroll: [{
|
|
2415
|
+
type: Output
|
|
2416
|
+
}], onSelectionChange: [{
|
|
2417
|
+
type: Output
|
|
2418
|
+
}], onSelectionModeChange: [{
|
|
2419
|
+
type: Output
|
|
2420
|
+
}], onShiftIncrementChange: [{
|
|
2421
|
+
type: Output
|
|
2422
|
+
}], onShow: [{
|
|
2423
|
+
type: Output
|
|
2424
|
+
}], onSplit: [{
|
|
2425
|
+
type: Output
|
|
2426
|
+
}], onSplitterCollapseClick: [{
|
|
2427
|
+
type: Output
|
|
2428
|
+
}], onSplitterDragEnd: [{
|
|
2429
|
+
type: Output
|
|
2430
|
+
}], onSplitterDragStart: [{
|
|
2431
|
+
type: Output
|
|
2432
|
+
}], onSplitterExpandClick: [{
|
|
2433
|
+
type: Output
|
|
2434
|
+
}], onStartCellEdit: [{
|
|
2435
|
+
type: Output
|
|
2436
|
+
}], onStartRowEdit: [{
|
|
2437
|
+
type: Output
|
|
2438
|
+
}], onSubGridCollapse: [{
|
|
2439
|
+
type: Output
|
|
2440
|
+
}], onSubGridExpand: [{
|
|
2441
|
+
type: Output
|
|
2442
|
+
}], onToggleGroup: [{
|
|
2443
|
+
type: Output
|
|
2444
|
+
}], onToggleNode: [{
|
|
2445
|
+
type: Output
|
|
2446
|
+
}], onToolClick: [{
|
|
2447
|
+
type: Output
|
|
2448
|
+
}], onUnlockRows: [{
|
|
2449
|
+
type: Output
|
|
2450
|
+
}], onUnsplit: [{
|
|
2451
|
+
type: Output
|
|
2452
|
+
}] } });
|
|
2453
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1ldmVudC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudC9zcmMvbGliL2JyeW50dW0tZXZlbnQtbGlzdC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBQ3REOztHQUVHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBa0QsTUFBTSxlQUFlLENBQUM7QUFFbkksT0FBTyxhQUFhLE1BQU0sa0JBQWtCLENBQUM7QUFFN0MsT0FBTyxFQUE4ZSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUd4aEIsT0FBTyxFQUF1RSxTQUFTLEVBQTZELE1BQU0sd0JBQXdCLENBQUM7O0FBaTRDbkwsTUFBTSxPQUFPLHlCQUF5QjtJQWlqQmxDLFlBQVksT0FBbUI7UUFUdkIsa0JBQWEsR0FBRztZQUNwQixLQUFLLEVBQWMsU0FBUztZQUM1QixRQUFRLEVBQVcsU0FBUztZQUM1QixJQUFJLEVBQWUsU0FBUztZQUM1QixnQkFBZ0IsRUFBRyxJQUFJO1lBQ3ZCLFFBQVEsRUFBVyxFQUFFO1lBQ3JCLFNBQVMsRUFBVSxFQUFFO1NBQ3hCLENBQUM7UUF1UkYsa0JBQWtCO1FBQ2xCOzs7Ozs7Ozs7Ozs7V0FZRztRQUNPLHVCQUFrQixHQUFRLElBQUksWUFBWSxFQUF5SyxDQUFDO1FBQzlOOzs7OztXQUtHO1FBQ08sMkJBQXNCLEdBQVEsSUFBSSxZQUFZLEVBQW9HLENBQUM7UUFDN0o7Ozs7Ozs7V0FPRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFzRyxDQUFDO1FBQzlKOzs7OztXQUtHO1FBQ08sMEJBQXFCLEdBQVEsSUFBSSxZQUFZLEVBQXlHLENBQUM7UUFDaks7Ozs7OztXQU1HO1FBQ08sNEJBQXVCLEdBQVEsSUFBSSxZQUFZLEVBQThHLENBQUM7UUFDeEs7Ozs7OztXQU1HO1FBQ08sMEJBQXFC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QkFjRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQU9HLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFNRyxNQUFNO3NCQUFmLE1BQU07Z0JBVUcsT0FBTztzQkFBaEIsTUFBTTtnQkFTRyx1QkFBdUI7c0JBQWhDLE1BQU07Z0JBUUcsaUJBQWlCO3NCQUExQixNQUFNO2dCQVFHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFTRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBT0csZUFBZTtzQkFBeEIsTUFBTTtnQkFPRyxjQUFjO3NCQUF2QixNQUFNO2dCQU9HLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFPRyxlQUFlO3NCQUF4QixNQUFNO2dCQVNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBT0csWUFBWTtzQkFBckIsTUFBTTtnQkFPRyxXQUFXO3NCQUFwQixNQUFNO2dCQU1HLFlBQVk7c0JBQXJCLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBBbmd1bGFyIHdyYXBwZXIgZm9yIEJyeW50dW0gRXZlbnRMaXN0XG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgSW5wdXQsIFNpbXBsZUNoYW5nZSwgU2ltcGxlQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IFdyYXBwZXJIZWxwZXIgZnJvbSAnLi93cmFwcGVyLmhlbHBlcic7XG5cbmltcG9ydCB7IEFqYXhTdG9yZSwgQWpheFN0b3JlQ29uZmlnLCBCYXNlLCBCcnludHVtU2Nyb2xsT3B0aW9ucywgQnV0dG9uQ29uZmlnLCBDb250YWluZXIsIERvbUNvbmZpZywgRHVyYXRpb25Db25maWcsIEZvcm11bGFQcm92aWRlckNvbmZpZywgS2V5TWFwQ29uZmlnLCBNYXNrLCBNYXNrQ29uZmlnLCBNZW51LCBNZW51SXRlbSwgTWVudUl0ZW1Db25maWcsIE1lbnVJdGVtRW50cnksIE1vZGVsLCBNb2RlbENvbmZpZywgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBTY3JvbGxNYW5hZ2VyLCBTY3JvbGxNYW5hZ2VyQ29uZmlnLCBTY3JvbGxlciwgU2Nyb2xsZXJDb25maWcsIFN0YXRlUHJvdmlkZXIsIFN0b3JlLCBTdG9yZUNvbmZpZywgVGFiQ29uZmlnLCBUb29sLCBUb29sQ29uZmlnLCBUb29sYmFyQ29uZmlnLCBUb29sYmFySXRlbXMsIFRvb2x0aXBDb25maWcsIFdpZGdldCB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5pbXBvcnQgeyBBSUZpbHRlciwgQUlGaWx0ZXJDb25maWcsIENlbGxDb3B5UGFzdGUsIENlbGxDb3B5UGFzdGVDb25maWcsIENlbGxFZGl0LCBDZWxsRWRpdENvbmZpZywgQ2VsbEVkaXRvckNvbnRleHQsIENlbGxNZW51LCBDZWxsTWVudUNvbmZpZywgQ2VsbFRvb2x0aXAsIENlbGxUb29sdGlwQ29uZmlnLCBDaGFydHMsIENoYXJ0c0NvbmZpZywgQ29sdW1uLCBDb2x1bW5BdXRvV2lkdGgsIENvbHVtbkF1dG9XaWR0aENvbmZpZywgQ29sdW1uRHJhZ1Rvb2xiYXIsIENvbHVtbkRyYWdUb29sYmFyQ29uZmlnLCBDb2x1bW5QaWNrZXIsIENvbHVtblBpY2tlckNvbmZpZywgQ29sdW1uUmVuYW1lLCBDb2x1bW5SZW5hbWVDb25maWcsIENvbHVtblJlb3JkZXIsIENvbHVtblJlb3JkZXJDb25maWcsIENvbHVtblJlc2l6ZSwgQ29sdW1uUmVzaXplQ29uZmlnLCBDb2x1bW5TdG9yZSwgQ29sdW1uU3RvcmVDb25maWcsIEVtcHR5VGV4dERvbUNvbmZpZywgRXhjZWxFeHBvcnRlciBhcyBHcmlkRXhjZWxFeHBvcnRlciwgRXhjZWxFeHBvcnRlckNvbmZpZyBhcyBHcmlkRXhjZWxFeHBvcnRlckNvbmZpZywgRXhwb3J0Q29uZmlnLCBGaWxlRHJvcCwgRmlsZURyb3BDb25maWcsIEZpbGxIYW5kbGUsIEZpbGxIYW5kbGVDb25maWcsIEZpbHRlciwgRmlsdGVyQmFyLCBGaWx0ZXJCYXJDb25maWcsIEZpbHRlckNvbmZpZywgR3JpZCwgR3JpZEJhc2UsIEdyaWRMb2NhdGlvbiwgR3JpZExvY2F0aW9uQ29uZmlnLCBHcmlkU2VsZWN0aW9uTW9kZSwgR3JpZFN0YXRlSW5mbywgR3JvdXAsIEdyb3VwQ29uZmlnLCBHcm91cFN1bW1hcnkgYXMgR3JpZEdyb3VwU3VtbWFyeSwgR3JvdXBTdW1tYXJ5Q29uZmlnIGFzIEdyaWRHcm91cFN1bW1hcnlDb25maWcsIEhlYWRlck1lbnUsIEhlYWRlck1lbnVDb25maWcsIExvY2tSb3dzIGFzIEdyaWRMb2NrUm93cywgTG9ja1Jvd3NDb25maWcgYXMgR3JpZExvY2tSb3dzQ29uZmlnLCBNZXJnZUNlbGxzLCBNZXJnZUNlbGxzQ29uZmlnLCBQZGZFeHBvcnQgYXMgR3JpZFBkZkV4cG9ydCwgUGRmRXhwb3J0Q29uZmlnIGFzIEdyaWRQZGZFeHBvcnRDb25maWcsIFBpbkNvbHVtbnMsIFBpbkNvbHVtbnNDb25maWcsIFByZXNlcnZlU2Nyb2xsT3B0aW9ucywgUHJpbnQgYXMgR3JpZFByaW50LCBQcmludENvbmZpZyBhcyBHcmlkUHJpbnRDb25maWcsIFF1aWNrRmluZCwgUXVpY2tGaW5kQ29uZmlnLCBSZWNvcmRQb3NpdGlvbkNvbnRleHQsIFJlZ2lvblJlc2l6ZSwgUmVnaW9uUmVzaXplQ29uZmlnLCBSZXNwb25zaXZlTGV2ZWxDb25maWcsIFJvdywgUm93Q29weVBhc3RlLCBSb3dDb3B5UGFzdGVDb25maWcsIFJvd0VkaXQsIFJvd0VkaXRDb25maWcsIFJvd0VkaXRvckNvbnRleHQsIFJvd0V4cGFuZGVyLCBSb3dFeHBhbmRlckNvbmZpZywgUm93UmVvcmRlciBhcyBHcmlkUm93UmVvcmRlciwgUm93UmVvcmRlckNvbmZpZyBhcyBHcmlkUm93UmVvcmRlckNvbmZpZywgUm93UmVzaXplIGFzIEdyaWRSb3dSZXNpemUsIFJvd1Jlc2l6ZUNvbmZpZyBhcyBHcmlkUm93UmVzaXplQ29uZmlnLCBTZWFyY2gsIFNlYXJjaENvbmZpZywgU29ydCwgU29ydENvbmZpZywgU3BsaXQgYXMgR3JpZFNwbGl0LCBTcGxpdENvbmZpZyBhcyBHcmlkU3BsaXRDb25maWcsIFN0aWNreUNlbGxzLCBTdGlja3lDZWxsc0NvbmZpZywgU3RyaXBlLCBTdHJpcGVDb25maWcsIFN1YkdyaWQsIFN1YkdyaWRDb25maWcsIFN1bW1hcnkgYXMgR3JpZFN1bW1hcnksIFN1bW1hcnlDb25maWcgYXMgR3JpZFN1bW1hcnlDb25maWcsIFRyZWUsIFRyZWVDb25maWcsIFRyZWVHcm91cCwgVHJlZUdyb3VwQ29uZmlnLCBYTFNDb2x1bW4gfSBmcm9tICdAYnJ5bnR1bS9ncmlkLXRoaW4nO1xuaW1wb3J0IHsgRXZlbnRNb2RlbCwgUmVzb3VyY2VNb2RlbCB9IGZyb20gJ0BicnludHVtL3NjaGVkdWxlci10aGluJztcbmltcG9ydCB7IENhbGVuZGFyVmlldywgQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnLCBEYXRlUmFuZ2VPd25lciwgRXZlbnRCYXIsIEV2ZW50TGlzdCwgRXZlbnRMaXN0TGlzdGVuZXJzLCBDYWxlbmRhckNvbHVtbkNvbmZpZywgUmFuZ2VNZW51Q29uZmlnIH0gZnJvbSAnQGJyeW50dW0vY2FsZW5kYXItdGhpbic7XG5cbmltcG9ydCB7IFN0cmluZ0hlbHBlciB9IGZyb20gJ0BicnludHVtL2NvcmUtdGhpbic7XG5cbmV4cG9ydCB0eXBlIEJyeW50dW1FdmVudExpc3RQcm9wcyA9IHtcbiAgICAvLyBDb25maWdzXG4gICAgLyoqXG4gICAgICogQSBrZXkgdG8gdXNlIHRvIGFjdGl2YXRlIHRoaXMgdmlldy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1hY3RpdmF0aW9uS2V5KVxuICAgICAqL1xuICAgIGFjdGl2YXRpb25LZXkgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFkb3B0IGFzIHRoaXMgV2lkZ2V0J3MgZW5jYXBzdWxhdGluZyBlbGVtZW50LiBUaGUgd2lkZ2V0J3NcbiAgICAgKiBjb250ZW50IHdpbGwgYmUgcGxhY2VkIGluc2lkZSB0aGlzIGVsZW1lbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctYWRvcHQpXG4gICAgICovXG4gICAgYWRvcHQgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2FsaWduLXNlbGZdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9hbGlnbi1zZWxmKSBzdHlsZS5cbiAgICAgKi9cbiAgICBhbGlnblNlbGYgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnLWNyZWF0aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnQ3JlYXRlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoaXMgYXMgYGZhbHNlYCB0byBkaXNhYmxlIGRyYWctbW92aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnTW92ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSB0aGlzIGFzIGBmYWxzZWAgdG8gZGlzYWJsZSBkcmFnLXJlc2l6aW5nIGV2ZW50cyBpbiB0aGlzIHZpZXcuXG4gICAgICovXG4gICAgYWxsb3dEcmFnUmVzaXplID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhbmltYXRlIHJvdyByZW1vdmFscyBjYXVzZWQgYnkgZmlsdGVyaW5nLlxuICAgICAqIEBkZXByZWNhdGVkIDcuMC4wIERlcHJlY2F0ZWQgYGFuaW1hdGVGaWx0ZXJSZW1vdmFsc2AuIFVzZSBgdHJhbnNpdGlvbi5maWx0ZXJSZW1vdmFsYCBpbnN0ZWFkXG4gICAgICovXG4gICAgYW5pbWF0ZUZpbHRlclJlbW92YWxzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaWYgcmVtb3ZpbmcgYW5kIGluc2VydGluZyByb3dzIHNob3VsZCBiZSBhbmltYXRlZC4gU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCB0aG9zZSBhbmltYXRpb25zLFxuICAgICAqIHJlbW92aW5nIHRoZSByZWxhdGVkIGRlbGF5cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBhbmltYXRlUmVtb3ZpbmdSb3dzYC4gVXNlIGB0cmFuc2l0aW9uLnJlbW92ZVJlY29yZGAgaW5zdGVhZFxuICAgICAqL1xuICAgIGFuaW1hdGVSZW1vdmluZ1Jvd3MgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCB3aGVuIG5hdmlnYXRpbmcgdGhyb3VnaCB0aW1lLCB0aGUgbmV4dCB0aW1lXG4gICAgICogYmxvY2sgd2lsbCBiZSBhbmltYXRlZCBpbiBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctYW5pbWF0ZVRpbWVTaGlmdClcbiAgICAgKi9cbiAgICBhbmltYXRlVGltZVNoaWZ0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGUgW1RyZWVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1RyZWUpIGZlYXR1cmUgaXMgaW4gdXNlIGFuZCB0aGUgU3RvcmUgaXMgYSB0cmVlIHN0b3JlLCB0aGlzXG4gICAgICogY29uZmlnIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIHZpc3VhbGx5IGFuaW1hdGUgYnJhbmNoIG5vZGUgZXhwYW5kIGFuZCBjb2xsYXBzZSBvcGVyYXRpb25zLlxuICAgICAqICpUaGlzIGlzIG5vdCBzdXBwb3J0ZWQgaW4gU2NoZWR1bGVyIGFuZCBHYW50dCpcbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBhbmltYXRlVHJlZU5vZGVUb2dnbGVgLiBVc2UgYHRyYW5zaXRpb24udG9nZ2xlVHJlZU5vZGVgIGluc3RlYWRcbiAgICAgKi9cbiAgICBhbmltYXRlVHJlZU5vZGVUb2dnbGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciB0aGUgaWQgb2YgYW4gZWxlbWVudCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0J3MgZWxlbWVudCB0by4gQ2FuIGJlIGNvbmZpZ3VyZWQsIG9yIHNldCBvbmNlIGF0XG4gICAgICogcnVudGltZS4gVG8gYWNjZXNzIHRoZSBlbGVtZW50IG9mIGEgcmVuZGVyZWQgd2lkZ2V0LCBzZWUgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpLlxuICAgICAqL1xuICAgIGFwcGVuZFRvID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdFxuICAgICAqIGludG8gYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIGxpbmtlZCB1c2luZyB0aGUgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1hcmlhRGVzY3JpcHRpb24pXG4gICAgICovXG4gICAgYXJpYURlc2NyaXB0aW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdCBhc1xuICAgICAqIHRoZSBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWFyaWFMYWJlbClcbiAgICAgKi9cbiAgICBhcmlhTGFiZWwgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIElmIHRoaXMgY29uZmlnIGlzIHNldCwgdGhlbiB0aGUgYGdlc3R1cmVgIGNvbmZpZ3VyZWQgKHdoaWNoIGRlZmF1bHRzIHRvIGBkYmxjbGlja2ApIGNyZWF0ZXMgYVxuICAgICAqIG5ldyBldmVudCBhdCB0aGUgbW91c2Ugb3IgdG91Y2ggZXZlbnQncyB0aW1lIHBvaW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICovXG4gICAgYXV0b0NyZWF0ZSA/IDoge1xuICAgICAgICBnZXN0dXJlPzogc3RyaW5nXG4gICAgICAgIG5ld05hbWU/OiBGdW5jdGlvbnxzdHJpbmdcbiAgICAgICAgc3RlcD86IHN0cmluZ1xuICAgICAgICBzbmFwVHlwZT86ICdyb3VuZCd8J2NlaWwnfCdmbG9vcidcbiAgICAgICAgZHVyYXRpb24/OiBzdHJpbmdcbiAgICAgICAgc3RhcnRIb3VyPzogbnVtYmVyXG4gICAgfXxzdHJpbmd8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIEF1dG9tYXRpY2FsbHkgc2V0IGdyaWRzIGhlaWdodCB0byBmaXQgYWxsIHJvd3MgKG5vIHNjcm9sbGluZyBpbiB0aGUgZ3JpZCkuIEluIGdlbmVyYWwgeW91IHNob3VsZCBhdm9pZFxuICAgICAqIHVzaW5nIGBhdXRvSGVpZ2h0OiB0cnVlYCwgc2luY2UgaXQgd2lsbCBieXBhc3MgR3JpZHMgdmlydHVhbCByZW5kZXJpbmcgYW5kIHJlbmRlciBhbGwgcm93cyBhdCBvbmNlLCB3aGljaFxuICAgICAqIGluIGEgbGFyZ2VyIGdyaWQgaXMgcmVhbGx5IGJhZCBmb3IgcGVyZm9ybWFuY2UuXG4gICAgICovXG4gICAgYXV0b0hlaWdodCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgQ29uZmlnIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBbVG9vbGJhcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKSxcbiAgICAgKiBvciBhcnJheSBvZiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkIGl0ZW1zIG9mIGEgVG9vbGJhci4gQW5vdGhlciB3YXkgdG8gYWRkIGEgYmJhciBpcyB0byB1c2UgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1iYmFyKVxuICAgICAqL1xuICAgIGJiYXIgPyA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgcGFuZWwncyBib2R5IGVsZW1lbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctYm9keUNscylcbiAgICAgKi9cbiAgICBib2R5Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1idWJibGVFdmVudHMpXG4gICAgICovXG4gICAgYnViYmxlRXZlbnRzID8gOiBvYmplY3RcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3QgY2FsbCBvblhYWCBtZXRob2QgbmFtZXMgKGUuZy4gYG9uU2hvd2AsIGBvbkNsaWNrYCksIGFzIGFuIGVhc3kgd2F5IHRvIGxpc3RlbiBmb3IgZXZlbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWNhbGxPbkZ1bmN0aW9ucylcbiAgICAgKi9cbiAgICBjYWxsT25GdW5jdGlvbnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBpZiBhbiBldmVudCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24sIHRoZSBlcnJvciBwcm9wYWdhdGVzIHVwIHRoZSBzdGFjayBhbmQgdGhlXG4gICAgICogYXBwbGljYXRpb24gc3RhdGUgaXMgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGZvbGxvd3MgdGhlIGV2ZW50IGhhbmRsZXIgd2lsbCAqbm90KiBiZSBleGVjdXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1jYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMpXG4gICAgICovXG4gICAgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gY3JvcCB0ZXh0IGluIGdyaWQgY2VsbHMgd2l0aG91dCBlbGxpcHNpcyAoLi4uKS4gV2hlbiBlbmFibGVkLCBjZWxscyBjb250YWluaW5nIHB1cmVcbiAgICAgKiB1c2UgYGRpc3BsYXkgOiBibG9ja2AsIGluc3RlYWQgb2YgYGRpc3BsYXkgOiBmbGV4YCB0byBhbGxvdyBlbGxpcHNpcyB0byB3b3JrLlxuICAgICAqIDxzdHJvbmc+Tk9URTwvc3Ryb25nPiBPbmx5IHN1cHBvcnRlZCBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgYDpoYXMoKWAgQ1NTIHNlbGVjdG9yXG4gICAgICovXG4gICAgY2VsbEVsbGlwc2lzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50LlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWNscylcbiAgICAgKi9cbiAgICBjbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBDb250cm9scyB3aGV0aGVyIHRoZSBwYW5lbCBpcyBjb2xsYXBzZWQgKHRoZSBib2R5IG9mIHRoZSBwYW5lbCBpcyBoaWRkZW4gd2hpbGUgb25seSB0aGUgaGVhZGVyIGlzXG4gICAgICogdmlzaWJsZSkuIE9ubHkgdmFsaWQgaWYgdGhlIHBhbmVsIGlzIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpLlxuICAgICAqL1xuICAgIGNvbGxhcHNlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIGVuYWJsZXMgY29sbGFwc2liaWxpdHkgZm9yIHRoZSBwYW5lbC4gU2VlIFtjb2xsYXBzZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNlZCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctY29sbGFwc2libGUpXG4gICAgICovXG4gICAgY29sbGFwc2libGUgPyA6IGJvb2xlYW58UGFuZWxDb2xsYXBzZXJDb25maWd8UGFuZWxDb2xsYXBzZXJPdmVybGF5Q29uZmlnXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbG9yIHRvIHRoZSB3aWRnZXQsIGJ5IHNldHRpbmcgdGhlIGAtLWItcHJpbWFyeWAgQ1NTIHZhcmlhYmxlIGluIHRoZSB3aWRnZXRzXG4gICAgICogYHN0eWxlYCBibG9jay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1jb2xvcilcbiAgICAgKi9cbiAgICBjb2xvciA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciB3aGljaCBjb2x1bW4gdG8gc3RhcnQgaW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgY29sdW1uID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBub3Qgc2hvdyBjb2x1bW4gbGluZXMuIEVuZCByZXN1bHQgbWlnaHQgYmUgb3ZlcnJ1bGVkIGJ5L2RpZmZlciBiZXR3ZWVuIHRoZW1lcy5cbiAgICAgKi9cbiAgICBjb2x1bW5MaW5lcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbHVtbiBkZWZpbml0aW9ucyB0byBhZGQgdG8gdGhlIGRlZmF1bHQgY29sdW1ucywgb3IgY29sdW1uIGRlZmluaXRpb25zIHdoaWNoIG92ZXJyaWRlXG4gICAgICogdGhlIHByb3ZpZGVkLCBkZWZhdWx0IGNvbHVtbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctY29sdW1ucylcbiAgICAgKi9cbiAgICBjb2x1bW5zID8gOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbHVtbkNvbmZpZz58Q2FsZW5kYXJDb2x1bW5Db25maWdbXVxuICAgIGNvbmZpZyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNwcm9wZXJ0eS1jb250ZW50RWxlbWVudCkuXG4gICAgICogTWF5IGJlIHNwZWNpZmllZCBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lc1xuICAgICAqIHdpdGggdHJ1dGh5IHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXM6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGljaCBpcyB1c2VkIHRvIHNob3cgY29udGV4dCBtZW51cy5cbiAgICAgKiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICdjb250ZXh0bWVudScsICdjbGljaycsICdkYmxjbGljaycuXG4gICAgICovXG4gICAgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgPyA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVudCBzaG9ydGN1dCB0byBzZXQgZGF0YSBpbiBncmlkcyBzdG9yZSBib3RoIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgYXQgcnVudGltZS4gQ2FuIGFsc28gYmVcbiAgICAgKiB1c2VkIHRvIHJldHJpZXZlIGRhdGEgYXQgcnVudGltZSwgYWx0aG91Z2ggd2UgZG8gcmVjb21tZW5kIGludGVyYWN0aW5nIHdpdGggR3JpZHMgc3RvcmUgaW5zdGVhZCB1c2luZ1xuICAgICAqIHRoZSBbc3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI3Byb3BlcnR5LXN0b3JlKSBwcm9wZXJ0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1kYXRhKVxuICAgICAqL1xuICAgIGRhdGEgPyA6IG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBXaWRnZXQgY29uZmlndXJhdGlvbiBpcyB1c2VkIGluIHRoZSBHcmlkJ3MgUm93RXhwYW5kZXIgZmVhdHVyZSdzIGB3aWRnZXRgIGNvbmZpZywgcHJvdmlkZSB0aGVcbiAgICAgKiBmaWVsZCBvbiB0aGUgZXhwYW5kZWQgcmVjb3JkIHRvIHVzZSBmb3IgcG9wdWxhdGluZyB0aGlzIHdpZGdldCdzIHN0b3JlIChpZiBhcHBsaWNhYmxlKVxuICAgICAqL1xuICAgIGRhdGFGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHRvIGFwcGx5IHRvIGVsZW1lbnRzIGRhdGFzZXQgKGVhY2gga2V5IHdpbGwgYmUgdXNlZCBhcyBhIGRhdGEtYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50KVxuICAgICAqL1xuICAgIGRhdGFzZXQgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0byBvcmllbnQgdGhpcyB2aWV3J3MgW3JhbmdlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXRlUmFuZ2VPd25lciNjb25maWctcmFuZ2UpIGFyb3VuZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1kYXRlKVxuICAgICAqL1xuICAgIGRhdGUgPyA6IERhdGVcbiAgICAvKipcbiAgICAgKiBBIFtEYXRlSGVscGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RhdGVIZWxwZXIpIGZvcm1hdCBzdHJpbmcvZnVuY3Rpb24gdG8gdXNlIHRvIGNyZWF0ZSBkYXRlIG91dHB1dCBmb3IgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgZGF0ZUZvcm1hdCA/IDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKVxuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHVzZWQgdG8gc2VwYXJhdGUgc3RhcnQgYW5kIGVuZCBkYXRlcyBpbiB0aGUgW2Rlc2NyaXB0aW9uRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdCkuXG4gICAgICovXG4gICAgZGF0ZVNlcGFyYXRvciA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogUmVnaW9uIHRvIHdoaWNoIGNvbHVtbnMgYXJlIGFkZGVkIHdoZW4gdGhleSBoYXZlIG5vbmUgc3BlY2lmaWVkXG4gICAgICovXG4gICAgZGVmYXVsdFJlZ2lvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogT3B0aW9ucyB0byBhZGQgaW50byBzY3JvbGwgb3B0aW9ucyB3aGVuIHRoZSBbc2Nyb2xsVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jZnVuY3Rpb24tc2Nyb2xsVG8pIG1ldGhvZCBpcyBjYWxsZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZGVmYXVsdFNjcm9sbE9wdGlvbnMpXG4gICAgICovXG4gICAgZGVmYXVsdFNjcm9sbE9wdGlvbnMgPyA6IEJyeW50dW1TY3JvbGxPcHRpb25zXG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgZm9ybWF0IHVzZWQgYnkgdGhlIGRlZmF1bHQgW2Rlc2NyaXB0aW9uUmVuZGVyZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRlc2NyaXB0aW9uUmVuZGVyZXIpIGZvciByZW5kZXJpbmcgdGhlIHZpZXcncyBkZXNjcmlwdGlvbi5cbiAgICAgKiBJZiB0aGlzIHZhbHVlIGlzIGBudWxsYCwgdGhlIFtkYXRlRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kYXRlRm9ybWF0KSAoYW5kIHBvdGVudGlhbGx5IFtkYXRlU2VwYXJhdG9yXSgjU2NoZWR1bGVyL3ZpZXcvbWl4aW4vRGVzY3JpYmFibGUjY29uZmlnLWRhdGVTZXBhcmF0b3IpKSB3aWxsXG4gICAgICogYmUgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdClcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbkZvcm1hdCA/IDogc3RyaW5nfHN0cmluZ1tdfGJvb2xlYW5bXXwoKGRhdGU6IERhdGUpID0+IHN0cmluZyl8RnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgdGV4dHVhbCBkZXNjcmlwdGlvbiBmb3IgdGhpcyB2aWV3LiBJZiBwcm92aWRlZCwgdGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlXG4gICAgICogW2Rlc2NyaXB0aW9uRm9ybWF0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci92aWV3L21peGluL0Rlc2NyaWJhYmxlI2NvbmZpZy1kZXNjcmlwdGlvbkZvcm1hdCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZGVzY3JpcHRpb25SZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gdmlldyBUaGUgYWN0aXZlIHZpZXcgaW4gY2FzZSB0aGUgZnVuY3Rpb24gaXMgaW4gYW5vdGhlciBzY29wZS5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBEZXNjcmlwdGlvbiBzdHJpbmdcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvblJlbmRlcmVyID8gOiAodmlldzogV2lkZ2V0KSA9PiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGRlc3Ryb3kgdGhlIHN0b3JlIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIGRlc3Ryb3lTdG9yZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBDU1MgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2hlbiB1cGdyYWRpbmcgdG8gdjcuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY2hlY2tzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMpXG4gICAgICovXG4gICAgZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIERpc2FibGUgb3IgZW5hYmxlIHRoZSB3aWRnZXQuIEl0IGlzIHNpbWlsYXIgdG8gW3JlYWRPbmx5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctcmVhZE9ubHkpIGV4Y2VwdCBhIGRpc2FibGVkIHdpZGdldFxuICAgICAqIGNhbm5vdCBiZSBmb2N1c2VkLCB1c2VzIGEgZGlmZmVyZW50IHJlbmRpdGlvbiAodXN1YWxseSBncmV5aXNoKSBhbmQgZG9lcyBub3QgYWxsb3cgc2VsZWN0aW5nIGl0cyB2YWx1ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1kaXNhYmxlZClcbiAgICAgKi9cbiAgICBkaXNhYmxlZCA/IDogYm9vbGVhbnwnaW5lcnQnXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBub3QgZ2V0IGEgd2FybmluZyB3aGVuIGNhbGxpbmcgW2dldFN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNmdW5jdGlvbi1nZXRTdGF0ZSkgd2hlbiB0aGVyZSBpcyBhIGNvbHVtblxuICAgICAqIGNvbmZpZ3VyZWQgd2l0aG91dCBhbiBgaWRgLiBCdXQgdGhlIHJlY29tbWVuZGVkIGFjdGlvbiBpcyB0byBhbHdheXMgY29uZmlndXJlIGNvbHVtbnMgd2l0aCBhbiBgaWRgIHdoZW5cbiAgICAgKiB1c2luZyBzdGF0ZXMuXG4gICAgICovXG4gICAgZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG5vdCBnZXQgYSB3YXJuaW5nIHdoZW4gdXNpbmcgYW5vdGhlciBiYXNlIGNsYXNzIHRoYW4gR3JpZFJvd01vZGVsIGZvciB5b3VyIGdyaWQgZGF0YS4gSWZcbiAgICAgKiB5b3UgZG8sIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgZnVsbCBmZWF0dXJlIHNldCBvZiB0aGUgZ3JpZCB0aGVuIGluY2x1ZGUgdGhlIGZpZWxkcyBmcm9tIEdyaWRSb3dNb2RlbFxuICAgICAqIGluIHlvdXIgbW9kZWwgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBhZGRlZCB0byBhIFtwYW5lbCdzIF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbClcbiAgICAgKiBbc3RyaXBzIGNvbGxlY3Rpb25dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLXN0cmlwcykuIFR5cGljYWwgdmFsdWVzIGZvciB0aGlzIGNvbmZpZyBhcmUgYCd0b3AnYCxcbiAgICAgKiBgJ2JvdHRvbSdgLCBgJ2xlZnQnYCwgb3IgYCdyaWdodCdgLCB3aGljaCBjYXVzZSB0aGUgd2lkZ2V0IHRvIGJlIHBsYWNlZCBvbiB0aGF0IHNpZGUgb2YgdGhlIHBhbmVsJ3NcbiAgICAgKiBib2R5LiBTdWNoIHdpZGdldHMgYXJlIGNhbGxlZCBcImVkZ2Ugc3RyaXBzXCIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZG9jaylcbiAgICAgKi9cbiAgICBkb2NrID8gOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBUaGUgW2R1cmF0aW9uVW5pdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvRXZlbnRNb2RlbCNmaWVsZC1kdXJhdGlvblVuaXQpIHRvIHVzZSB3aGVuIGRyYWctY3JlYXRpbmcgZXZlbnRzXG4gICAgICogaW4gdGhpcyB2aWV3LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWRyYWdVbml0KVxuICAgICAqL1xuICAgIGRyYWdVbml0ID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBNYWtlIHRoaXMgUGFuZWwgYSBkb2NrZWQgZHJhd2VyIHdoaWNoIHNsaWRlcyBvdXQgZnJvbSBvbmUgc2lkZSBvZiB0aGUgYnJvd3NlciB2aWV3cG9ydCBieSBkZWZhdWx0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWRyYXdlcilcbiAgICAgKiBAcGFyYW0geydzdGFydCcsJ2xlZnQnLCdlbmQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSd9IHNpZGUgVGhlIHNpZGUgb2YgdGhlIHZpZXdwb3J0IHRvIGRvY2sgdGhlIGRyYXdlciB0by4gICogYCdzdGFydCdgIG1lYW5zIHRoZSBgaW5saW5lLXN0YXJ0YCBzaWRlLiAqIGAnZW5kJ2AgbWVhbnMgdGhlIGBpbmxpbmUtZW5kYCBzaWRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcn0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZHJhd2VyIGluIGl0cyBjb2xsYXBzaWJsZSBheGlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5saW5lIElmIHVzaW5nIHRoZSBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgdG8gcGxhY2UgdGhlIGRyYXdlciBpbnNpZGUgYSBob3N0IHdpZGdldCwgdGhpcyBtYXkgYmUgc2V0IHRvIGB0cnVlYCB0byBtYWtlIHRoZSBkcmF3ZXIgaW5saW5lIHdpdGhpbiB0aGF0IGhvc3QuIE5vdGUgdGhhdCwgaWYgdXNpbmcgdGhpcywgdGhlIGxheW91dCBvZiB0aGUgaG9zdCBlbGVtZW50IG11c3QgaGF2ZSBgZmxleC1kaXJlY3Rpb25gIHNldCBhcHByb3ByaWF0ZWx5LlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixvYmplY3R9IGF1dG9DbG9zZSBTcGVjaWZpZXMgd2hhdCB1c2VyIGFjdGlvbnMgc2hvdWxkIGF1dG9tYXRpY2FsbHkgY2xvc2UgdGhlIGRyYXdlci4gRGVmYXVsdHMgdG8gY2xvc2luZyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIgb3Igd2hlbiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLm1vdXNlZG93biBJZiB0aGUgdXNlciBjbGlja3Mgb3V0c2lkZSBvZiB0aGUgZHJhd2VyLCB0aGUgZHJhd2VyIHdpbGwgYXV0b21hdGljYWxseSBiZSBoaWRkZW4uIElmIHRoZSB2YWx1ZSBpcyBhIHN0cmluZywgaXQgaXMgdXNlZCBhcyBhIENTUyBzZWxlY3RvciB0byBmaWx0ZXIgY2xpY2tzIHdoaWNoIHNob3VsZCBjbG9zZSB0aGUgZHJhd2VyLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbixzdHJpbmd9IGF1dG9DbG9zZS5mb2N1c291dCBJZiBmb2N1cyBtb3ZlcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXV0b0Nsb3NlLm1vdXNlb3V0IEhpZGVzIHRoZSBkcmF3ZXIgd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBkcmF3ZXIgYWZ0ZXIgdGhlIGBhdXRvQ2xvc2VEZWxheWAgcGVyaW9kLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdXRvQ2xvc2VEZWxheSBXaGVuIHVzaW5nIGBtb3VzZW91dGAsIHRoaXMgaXMgdGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuICAgICAqL1xuICAgIGRyYXdlciA/IDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfVxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIGF0dHJpYnV0ZXMgdG8gYXNzaWduIHRvIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyB3aWRnZXQuXG4gICAgICogU2V0IGBudWxsYCB2YWx1ZSB0byBhdHRyaWJ1dGUgdG8gcmVtb3ZlIGl0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBUZXh0IG9yIEhUTUwsIG9yIGEgW0VtcHR5VGV4dERvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjdHlwZWRlZi1FbXB0eVRleHREb21Db25maWcpIGJsb2NrIHRvIGRpc3BsYXkgd2hlbiB0aGVyZSBpcyBubyBkYXRhIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQuXG4gICAgICogV2hlbiB1c2luZyBtdWx0aXBsZSBHcmlkIHJlZ2lvbnMsIHByb3ZpZGUgdGhlIGByZWdpb25gIHByb3BlcnR5IHRvIGRlY2lkZSB3aGVyZSB0aGUgdGV4dCBpcyBzaG93bi5cbiAgICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBzaG93biBpbiB0aGUgZmlyc3QgcmVnaW9uLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWVtcHR5VGV4dClcbiAgICAgKi9cbiAgICBlbXB0eVRleHQgPyA6IHN0cmluZ3xFbXB0eVRleHREb21Db25maWdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyBgdHJ1ZWAgdG8gYWxsb3cgZWxlbWVudHMgd2l0aGluIGNlbGxzIHRvIGJlIHN0eWxlZCBhcyBgcG9zaXRpb246IHN0aWNreWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZW5hYmxlU3RpY2t5KVxuICAgICAqL1xuICAgIGVuYWJsZVN0aWNreSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYWxsb3cgdGV4dCBzZWxlY3Rpb24gaW4gdGhlIGdyaWQgY2VsbHMuIE5vdGUsIHRoaXMgY2Fubm90IGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCB0aGVcbiAgICAgKiBgUm93UmVvcmRlcmAgZmVhdHVyZS5cbiAgICAgKi9cbiAgICBlbmFibGVUZXh0U2VsZWN0aW9uID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBsaXN0ZW4gZm9yIENUUkwtWiAoQ01ELVogb24gTWFjIE9TKSBrZXlib2FyZCBldmVudCBhbmQgdHJpZ2dlciB1bmRvIChyZWRvIHdoZW4gU0hJRlQgaXNcbiAgICAgKiBwcmVzc2VkKS4gT25seSBhcHBsaWNhYmxlIHdoZW4gdXNpbmcgYSBbU3RhdGVUcmFja2luZ01hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9kYXRhL3N0bS9TdGF0ZVRyYWNraW5nTWFuYWdlcikuXG4gICAgICovXG4gICAgZW5hYmxlVW5kb1JlZG9LZXlzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIChUaW1lIGNvbXBvbmVudCBpcyB6ZXJvZWQpIG9mIHRoaXMgdmlldy4gTm90ZSB0aGF0IGluIHRlcm1zIG9mIGZ1bGwgZGF5cyxcbiAgICAgKiB0aGlzIGlzIGV4Y2x1c2l2ZSwgaWU6IDIwMjAtMDEtMDEyIHRvIDIwMjAtMDEtMDggaXMgKnNldmVuKiBkYXlzLiBUaGUgZW5kIGlzIDAwOjAwOjAwIG9uXG4gICAgICogdGhlIDh0aC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1lbmREYXRlKVxuICAgICAqL1xuICAgIGVuZERhdGUgPyA6IERhdGVcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uLCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5IHRvIGZpbHRlciB3aGljaCBldmVudHNcbiAgICAgKiBhcmUgY29sbGVjdGVkIGludG8gdGhlIGRheSBjZWxsIGRhdGEgYmxvY2tzLlxuICAgICAqIFJldHVybiBgdHJ1ZWAgdG8gaW5jbHVkZSB0aGUgcGFzc2VkIGV2ZW50LCBvciBhICpmYWxzeSogdmFsdWUgdG8gZXhjbHVkZSB0aGUgZXZlbnQuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQgdGhlIHBhc3NlZCBldmVudFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIGV2ZW50RmlsdGVyID8gOiAoKGV2ZW50OiBFdmVudE1vZGVsKSA9PiBib29sZWFuKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uLCBvciB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5IHdoaWNoIHlvdVxuICAgICAqIGNhbiBzcGVjaWZ5IHRvIGN1c3RvbWl6ZSBldmVudCBET00gY29udGVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1ldmVudEhlYWRlclJlbmRlcmVyKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwgQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgZGF0YSBhYm91dCB0aGUgZXZlbnQgYmVpbmcgcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZGV0YWlsLnZpZXcgVGhlIHZpZXcgcmVuZGVyaW5nIHRoZSBldmVudFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGRldGFpbC5ldmVudFJlY29yZCBUaGUgZXZlbnQgcmVjb3JkXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuUmVzb3VyY2VNb2RlbH0gZGV0YWlsLnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSByZWNvcmRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEgQSBkYXRhIG9iamVjdCBjb250YWluaW5nIHByb3BlcnRpZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBldmVudCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLnN0eWxlIFRoZSBzdHlsZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBzdHlsZSBwcm9wZXJ0aWVzIGZvciB0aGUgZXZlbnQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5jbHMgVGhlIGNscyBwcm9wZXJ0eSBpcyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgZXZlbnQgZWxlbWVudCBpZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMgdHJ1dGh5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmljb25TdHlsZSBUaGUgaWNvblN0eWxlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBjb250YWluaW5nIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBpY29uIGVsZW1lbnQgaWYgYW4gaWNvbiBlbGVtZW50IGlzIHRvIGJlIHVzZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuaWNvbkNscyBUaGUgaWNvbkNscyBwcm9wZXJ0eSBpcyBhbiBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgd2lsbCBiZSBhZGRlZCB0byB0aGUgaWNvbiBlbGVtZW50LiBJbml0aWFsbHkgc2V0IGZyb20gdGhlIGV2ZW50IHJlY29yZCdzIFtpY29uQ2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL1NjaGVkdWxlci9tb2RlbC9FdmVudE1vZGVsI2ZpZWxkLWljb25DbHMpLiBDYW4gYmUgbXV0YXRlZCBieSB0aGUgcmVuZGVyZXIuIElmIG51bGwsIG9yIG5vIHByb3BlcnRpZXMgYXJlIHNldCwgbm8gaWNvbiB3aWxsIGJlIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmV2ZW50Q29sb3IgQ29sb3IgdG8gYmUgYXBwbGllZCB0byB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuZGF0YXNldCBBbiBvYmplY3Qgd2hpY2ggcHJvZHVjZXMgdGhlIGBkYXRhc2V0YCBvZiB0aGUgcmVzdWx0aW5nIGV2ZW50IGJhclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsLnJlbmRlckRhdGEuc29saWRCYXIgVGhpcyBpcyB2YWxpZCBmb3Igdmlld3Mgd2hpY2ggY3JlYXRlIGV2ZW50IGJhcnMuIFRoaXMgaXMgc2V0IHRvIGB0cnVlYCBieSBkZWZhdWx0IGZvciBhbGwgZGF5IGFuZCBpbnRlcmRheSBldmVudHMgc28gdGhhdCB0aGVzZSBhcHBlYXIgYXMgYSBzb2xpZCBibG9jayBvZiBiYWNrZ3JvdW5kIGNvbG9yLiBBbiBldmVudFJlbmRlcmVyIG1heSBtdXRhdGUgdGhpcyBmbGFnIHRvIGNoYW5nZSBpbiB3aGF0IG1hbm5lciB0aGUgZXZlbnQgYmFyIGlzIGNvbG9yZWQgLSBhcyBhIHNvbGlkIGJhciBvZiBjb2xvciwgb3IgdXNpbmcgdGhlIGZvcmVncm91bmQgY29sb3IgKHRleHQgYW5kIGljb25zKSBzdWNoIGFzIHRoZSBNb250aFZpZXcsIHRoZSBDYWxlbmRhclJvdyAoYWxsIGRheSBldmVudHMgaW4gYSBEYXlWaWV3KSwgYW5kIE92ZXJmbG93UG9wdXBzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmJvZHlDb2xvciBXaGVuIHVzZWQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgY29sb3IgaXMgYXBwbGllZCB0byB0aGUgYm9keSBvZiB0aGUgZXZlbnQgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBsaWdodCBlbm91Z2ggdGhhdCB0aGUgdGV4dCBjb2xvciAoRnJvbSB0aGUgU0FTUyB2YXJpYWJsZSBgJGRheXZpZXctZXZlbnQtY29sb3JgKSBpcyB2aXNpYmxlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWwuc2hvd0J1bGxldCBJZiB0aGVyZSBpcyBubyBgaWNvbkNsc2AsIGFuZCB0aGUgZXZlbnQgaXMgbm90IHJlY3VycmluZywgdGhlbiBieSBkZWZhdWx0IGEgXCJidWxsZXRcIiBjaXJjdWxhciBpY29uIGlzIHNob3duIGlmIHRoZSB2aWV3J3MgW3Nob3dCdWxsZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLXNob3dCdWxsZXQpIGlmIHNldC4gU2V0dGluZyB0aGlzIHByb3BlcnR5IGluIGFuIGV2ZW50IHJlbmRlcmVyIG92ZXJyaWRlcyB0aGlzIGJlaGF2aW91ci5cbiAgICAgKiBAcmV0dXJucyB7RG9tQ29uZmlnLERvbUNvbmZpZ1tdLHN0cmluZyx2b2lkfVxuICAgICAqL1xuICAgIGV2ZW50SGVhZGVyUmVuZGVyZXIgPyA6ICgoZGV0YWlsOiB7IHZpZXc6IENhbGVuZGFyVmlldywgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIHJlc291cmNlUmVjb3JkOiBSZXNvdXJjZU1vZGVsLCByZW5kZXJEYXRhOiB7IHN0eWxlOiBvYmplY3QsIGNsczogb2JqZWN0LCBpY29uU3R5bGU6IG9iamVjdCwgaWNvbkNsczogb2JqZWN0LCBldmVudENvbG9yOiBzdHJpbmcsIGRhdGFzZXQ6IG9iamVjdCwgc29saWRCYXI6IGJvb2xlYW4sIGJvZHlDb2xvcjogc3RyaW5nIH0sIHNob3dCdWxsZXQ6IGJvb2xlYW4gfSkgPT4gRG9tQ29uZmlnfERvbUNvbmZpZ1tdfHN0cmluZ3x2b2lkKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgaGVpZ2h0IG9mIGV2ZW50IGJhcnMgaWYgdGhpcyB2aWV3IGNyZWF0ZXMgZXZlbnQgYmFycy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1ldmVudEhlaWdodClcbiAgICAgKi9cbiAgICBldmVudEhlaWdodCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgW0RhdGVIZWxwZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvRGF0ZUhlbHBlcikgZm9ybWF0IHN0cmluZy9mdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCB0aGUgdGltZSBkaXNwbGF5ZWRcbiAgICAgKiBuZXh0IHRvIGV2ZW50IGJhcnMgaW4gdGhlIGN1c3RvbSBjb2x1bW5zIHdoaWNoIFtFdmVudExpc3RdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdClcbiAgICAgKiBiYXNlZCB2aWV3cyB1c2UgLSBbRXZlbnRMaXN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QpIGFuZCBbQWdlbmRhVmlld10oI0NhbGVuZGFyL3dpZGdldC9BZ2VuZGFWaWV3KS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICBldmVudExpc3RUaW1lRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSBmdW5jdGlvbiwgb3IgdGhlIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiB0aGUgb3duZXJzaGlwIGhpZXJhcmNoeSB3aGljaCB5b3VcbiAgICAgKiBjYW4gc3BlY2lmeSB0byBjdXN0b21pemUgZXZlbnQgRE9NIGNvbnRlbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZXZlbnRSZW5kZXJlcilcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsIEFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGRhdGEgYWJvdXQgdGhlIGV2ZW50IGJlaW5nIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGRldGFpbC52aWV3IFRoZSB2aWV3IHJlbmRlcmluZyB0aGUgZXZlbnRcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsfSBkZXRhaWwuZXZlbnRSZWNvcmQgVGhlIGV2ZW50IHJlY29yZFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGRldGFpbC5yZXNvdXJjZVJlY29yZCBUaGUgUmVzb3VyY2UgcmVjb3JkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhIEEgZGF0YSBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSB0aGUgZXZlbnQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5zdHlsZSBUaGUgc3R5bGUgcHJvcGVydHkgaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgc3R5bGUgcHJvcGVydGllcyBmb3IgdGhlIGV2ZW50IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuY2xzIFRoZSBjbHMgcHJvcGVydHkgaXMgYW4gb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGV2ZW50IGVsZW1lbnQgaWYgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHRydXRoeVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBkZXRhaWwucmVuZGVyRGF0YS5pY29uU3R5bGUgVGhlIGljb25TdHlsZSBwcm9wZXJ0eSBpcyBhbiBvYmplY3QgY29udGFpbmluZyBzdHlsZSBwcm9wZXJ0aWVzIGZvciB0aGUgaWNvbiBlbGVtZW50IGlmIGFuIGljb24gZWxlbWVudCBpcyB0byBiZSB1c2VkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmljb25DbHMgVGhlIGljb25DbHMgcHJvcGVydHkgaXMgYW4gb2JqZWN0IHdob3NlIHByb3BlcnR5IG5hbWVzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGljb24gZWxlbWVudC4gSW5pdGlhbGx5IHNldCBmcm9tIHRoZSBldmVudCByZWNvcmQncyBbaWNvbkNsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvRXZlbnRNb2RlbCNmaWVsZC1pY29uQ2xzKS4gQ2FuIGJlIG11dGF0ZWQgYnkgdGhlIHJlbmRlcmVyLiBJZiBudWxsLCBvciBubyBwcm9wZXJ0aWVzIGFyZSBzZXQsIG5vIGljb24gd2lsbCBiZSByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwucmVuZGVyRGF0YS5ldmVudENvbG9yIENvbG9yIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGV2ZW50LiBUaGlzIG1heSBiZSBhIENTUyBjb2xvciBuYW1lIG9yIGEgQ1NTIGNvbG9yIHZhbHVlIGluIGFueSBvZiB0aGUgc3VwcG9ydGVkIENTUyBjb2xvciBmb3JtYXRzIHN1Y2ggYXMgYCNSUkdHQkJgLCBgcmdiKDI1NSwgMCwgMClgLCBvciBgcmdiYSgyNTUsIDAsIDAsIDAuNSlgLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwucmVuZGVyRGF0YS5ldmVudEJhY2tncm91bmQgQSBDU1MgYmFja2dyb3VuZCBzdHlsZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBldmVudC4gVGhpcyBpcyBub3Qgc2V0IGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgc2V0IGJ5IHRoZSByZW5kZXJlciB0byBwcm92aWRlIGEgYmFja2dyb3VuZCBpbWFnZSBvciBncmFkaWVudCBmb3IgdGhlIGV2ZW50IGJhci4gVGhpcyBvdmVycmlkZXMgdGhlIGBldmVudENvbG9yYCBwcm9wZXJ0eSBpZiBwcmVzZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwucmVuZGVyRGF0YS50ZXh0Q29sb3IgQSBDU1MgY29sb3IgdG8gYmUgYXBwbGllZCB0byB0aGUgZXZlbnQgdGV4dC4gVGhpcyBpcyBub3Qgc2V0IGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgc2V0IGJ5IHRoZSByZW5kZXJlciB0byBwcm92aWRlIGEgY3VzdG9tIGNvbG9yIGZvciB0aGUgZXZlbnQgbmFtZSB0ZXh0IGluIHRoZSBldmVudCBiYXIuIFRoaXMgbWF5IGJlIGEgQ1NTIGNvbG9yIG5hbWUgb3IgYSBDU1MgY29sb3IgdmFsdWUgaW4gYW55IG9mIHRoZSBzdXBwb3J0ZWQgQ1NTIGNvbG9yIGZvcm1hdHMgc3VjaCBhcyBgI1JSR0dCQmAsIGByZ2IoMjU1LCAwLCAwKWAsIG9yIGByZ2JhKDI1NSwgMCwgMCwgMC41KWAuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGRldGFpbC5yZW5kZXJEYXRhLmV2ZW50SW5uZXJTdHlsZSBUaGUgZXZlbnRJbm5lclN0eWxlIHByb3BlcnR5IGlzIGFuIG9iamVjdCBjb250YWluaW5nIHN0eWxlIHByb3BlcnRpZXMgZm9yIHRoZSBpbm5lciBwYXJ0IG9mIHRoZSBldmVudCBlbGVtZW50LCB0aGUgYC5iLWNhbC1ldmVudGAgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZGV0YWlsLnJlbmRlckRhdGEuZGF0YXNldCBBbiBvYmplY3Qgd2hpY2ggcHJvZHVjZXMgdGhlIGBkYXRhc2V0YCBvZiB0aGUgcmVzdWx0aW5nIGV2ZW50IGJhclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGV0YWlsLnJlbmRlckRhdGEuc29saWRCYXIgVGhpcyBpcyB2YWxpZCBmb3Igdmlld3Mgd2hpY2ggY3JlYXRlIGV2ZW50IGJhcnMuIFRoaXMgaXMgc2V0IHRvIGB0cnVlYCBieSBkZWZhdWx0IGZvciBhbGwgZGF5IGFuZCBpbnRlcmRheSBldmVudHMgc28gdGhhdCB0aGVzZSBhcHBlYXIgYXMgYSBzb2xpZCBibG9jayBvZiBiYWNrZ3JvdW5kIGNvbG9yLiBBbiBldmVudFJlbmRlcmVyIG1heSBtdXRhdGUgdGhpcyBmbGFnIHRvIGNoYW5nZSBpbiB3aGF0IG1hbm5lciB0aGUgZXZlbnQgYmFyIGlzIGNvbG9yZWQgLSBhcyBhIHNvbGlkIGJhciBvZiBjb2xvciwgb3IgdXNpbmcgdGhlIGZvcmVncm91bmQgY29sb3IgKHRleHQgYW5kIGljb25zKSBzdWNoIGFzIHRoZSBNb250aFZpZXcsIHRoZSBDYWxlbmRhclJvdyAoYWxsIGRheSBldmVudHMgaW4gYSBEYXlWaWV3KSwgYW5kIE92ZXJmbG93UG9wdXBzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGRldGFpbC5yZW5kZXJEYXRhLmJvZHlDb2xvciBXaGVuIHVzZWQgaW4gYSBbRGF5Vmlld10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRGF5VmlldyksIHRoaXMgY29sb3IgaXMgYXBwbGllZCB0byB0aGUgYm9keSBvZiB0aGUgZXZlbnQgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMgbXVzdCBiZSBsaWdodCBlbm91Z2ggdGhhdCB0aGUgdGV4dCBjb2xvciAoRnJvbSB0aGUgU0FTUyB2YXJpYWJsZSBgJGRheXZpZXctZXZlbnQtY29sb3JgKSBpcyB2aXNpYmxlXG4gICAgICogQHBhcmFtIHtib29sZWFufSBkZXRhaWwucmVuZGVyRGF0YS5zaG93QnVsbGV0IElmIHRoZXJlIGlzIG5vIGBpY29uQ2xzYCwgYW5kIHRoZSBldmVudCBpcyBub3QgcmVjdXJyaW5nLCB0aGVuIGJ5IGRlZmF1bHQgYSBcImJ1bGxldFwiIGNpcmN1bGFyIGljb24gaXMgc2hvd24gaWYgdGhlIHZpZXcncyBbc2hvd0J1bGxldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctc2hvd0J1bGxldCkgaWYgc2V0LiBTZXR0aW5nIHRoaXMgcHJvcGVydHkgaW4gYW4gZXZlbnQgcmVuZGVyZXIgb3ZlcnJpZGVzIHRoaXMgYmVoYXZpb3VyLlxuICAgICAqIEByZXR1cm5zIHtEb21Db25maWcsRG9tQ29uZmlnW10sc3RyaW5nLHZvaWR9IFRoZSBjb250ZW50IHRvIGJlIHVzZWQgYXMgdGhlIGV2ZW50IGJvZHkuXG4gICAgICovXG4gICAgZXZlbnRSZW5kZXJlciA/IDogKChkZXRhaWw6IHsgdmlldzogQ2FsZW5kYXJWaWV3LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCwgcmVzb3VyY2VSZWNvcmQ6IFJlc291cmNlTW9kZWwsIHJlbmRlckRhdGE6IHsgc3R5bGU6IG9iamVjdCwgY2xzOiBvYmplY3QsIGljb25TdHlsZTogb2JqZWN0LCBpY29uQ2xzOiBvYmplY3QsIGV2ZW50Q29sb3I6IHN0cmluZywgZXZlbnRCYWNrZ3JvdW5kOiBzdHJpbmcsIHRleHRDb2xvcjogc3RyaW5nLCBldmVudElubmVyU3R5bGU6IG9iamVjdCwgZGF0YXNldDogb2JqZWN0LCBzb2xpZEJhcjogYm9vbGVhbiwgYm9keUNvbG9yOiBzdHJpbmcsIHNob3dCdWxsZXQ6IGJvb2xlYW4gfSB9KSA9PiBEb21Db25maWd8RG9tQ29uZmlnW118c3RyaW5nfHZvaWQpfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24gd2hpY2ggY29tcGFyZXMgZXZlbnRzIHdoaWNoIHNvbWUgdmlld3MgdXNlIHRvIGRlY2lkZSB1cG9uIHJlbmRlcmluZyBvcmRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1ldmVudFNvcnRlcilcbiAgICAgKiBAcGFyYW0ge1NjaGVkdWxlci5tb2RlbC5FdmVudE1vZGVsLEV2ZW50QmFyfSBsaHMgVGhlIGxlZnQgc2lkZSB2YWx1ZSB0byBjb25wYXJlXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbCxFdmVudEJhcn0gcmhzIFRoZSByaWdodCBzaWRlIHZhbHVlIHRvIGNvbnBhcmVcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIGV2ZW50U29ydGVyID8gOiAobGhzOiBFdmVudE1vZGVsfEV2ZW50QmFyLCByaHM6IEV2ZW50TW9kZWx8RXZlbnRCYXIpID0+IG51bWJlclxuICAgIC8qKlxuICAgICAqIEEgZnVuY3Rpb24sIG9yIG5hbWUgb2YgYSBmdW5jdGlvbiBpbiB0aGUgb3duZXJzaGlwIGhpZXJhcmNoeSB3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZVxuICAgICAqIHRoZSB0aW1lIG91dHB1dCBuZXh0IHRvIGV2ZW50IGJhcnMgaW4gYW4gYWdlbmRhIGNlbGwuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZXZlbnRUaW1lUmVuZGVyZXIpXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnRSZWNvcmQgVGhlIGV2ZW50IHJlY29yZCBmb3Igd2hpY2ggdG8gY3JlYXRlIGEgdGltZSBzdHJpbmcuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIG9mIHRoZSBjZWxsIGluIHdoaWNoIHRoZSBldmVudCBpcyBiZWluZyByZW5kZXJlZC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nLERvbUNvbmZpZyxEb21Db25maWdbXX1cbiAgICAgKi9cbiAgICBldmVudFRpbWVSZW5kZXJlciA/IDogKChldmVudFJlY29yZDogRXZlbnRNb2RlbCwgZGF0ZTogRGF0ZSkgPT4gc3RyaW5nfERvbUNvbmZpZ3xEb21Db25maWdbXSl8c3RyaW5nXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGVuZCBkYXRlIG9mIGFuIGFsbCBkYXkgZXZlbnQgaXMgZGlzcGxheWVkIGluIHRoZSBVSSBhc1xuICAgICAqIHRoZSBsYXN0IGNhbGVuZGFyIGRhdGUgb24gd2hpY2ggdGhlIGV2ZW50IGZhbGxzLiBGb3IgbW9zdCBlbmQgdXNlcnMsIHRoaXMgaXMgdGhlXG4gICAgICogZXhwZWN0ZWQgdmFsdWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZXh0ZW5kQWxsRGF5RW5kRGF5KVxuICAgICAqL1xuICAgIGV4dGVuZEFsbERheUVuZERheSA/IDogYm9vbGVhblxuICAgIGV4dHJhRGF0YSA/IDogYW55XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBzdHJldGNoIHRoZSBsYXN0IGNvbHVtbiBpbiBhIGdyaWQgd2l0aCBhbGwgZml4ZWQgd2lkdGggY29sdW1uc1xuICAgICAqIHRvIGZpbGwgZXh0cmEgYXZhaWxhYmxlIHNwYWNlIGlmIHRoZSBncmlkJ3Mgd2lkdGggaXMgd2lkZXIgdGhhbiB0aGUgc3VtIG9mIGFsbFxuICAgICAqIGNvbmZpZ3VyZWQgY29sdW1uIHdpZHRocy5cbiAgICAgKi9cbiAgICBmaWxsTGFzdENvbHVtbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIElmIHRoaXMgaXMgc2V0IHRvIGB0cnVlYCwgdGhlbiB3aGVuIGRldGVybWluaW5nIHdoaWNoIGFzc2lnbmVkIHJlc291cmNlIG9mIGEgbXVsdGkgYXNzaWduZWQgZXZlbnRcbiAgICAgKiB0byB1c2UgdG8gY3JlYXRlIHRoZSBldmVudCBVSSwgdGhlIGZpcnN0IHJlc291cmNlIHdoaWNoIGlzIHN0aWxsIHNlbGVjdGVkIGluIHRoZVxuICAgICAqIFtyZXNvdXJjZUZpbHRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvU2lkZWJhciNwcm9wZXJ0eS1yZXNvdXJjZUZpbHRlcikgaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1maWx0ZXJFdmVudFJlc291cmNlcylcbiAgICAgKi9cbiAgICBmaWx0ZXJFdmVudFJlc291cmNlcyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdXNpbmcgdGhlIFtDYWxlbmRhcidzIGRhdGUgcGlja2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3ZpZXcvQ2FsZW5kYXIjY29uZmlnLWRhdGVQaWNrZXIpIHdpdGggdGhlXG4gICAgICogW211bHRpU2VsZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0RhdGVQaWNrZXIjY29uZmlnLW11bHRpU2VsZWN0KSBwcm9wZXJ0eSBgdHJ1ZWAsIHRoZSBzZWxlY3RlZCByYW5nZSBpcyB1c3VhbGx5XG4gICAgICogYXBwbGllZCB0byB2aWV3cyBvZiB0aGlzIHR5cGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctZml4ZWREdXJhdGlvbilcbiAgICAgKi9cbiAgICBmaXhlZER1cmF0aW9uID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVXNlIGZpeGVkIHJvdyBoZWlnaHQuIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbCBjb25maWd1cmUgdGhlIHVuZGVybHlpbmcgUm93TWFuYWdlciB0byB1c2UgZml4ZWQgcm93XG4gICAgICogaGVpZ2h0LCB3aGljaCBzYWNyaWZpY2VzIHRoZSBhYmlsaXR5IHRvIHVzZSByb3dzIHdpdGggdmFyaWFibGUgaGVpZ2h0IHRvIGdhaW4gYSBmcmFjdGlvbiBiZXR0ZXJcbiAgICAgKiBwZXJmb3JtYW5jZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1maXhlZFJvd0hlaWdodClcbiAgICAgKi9cbiAgICBmaXhlZFJvd0hlaWdodCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1mb290ZXIpXG4gICAgICovXG4gICAgZm9vdGVyID8gOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hpY2ggbmFtZXMgZm9ybXVsYSBwcmVmaXhlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNvbHVtbnMgY29uZmlndXJlZCB3aXRoXG4gICAgICogYGZvcm11bGEgOiB0cnVlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1mb3JtdWxhUHJvdmlkZXJzKVxuICAgICAqL1xuICAgIGZvcm11bGFQcm92aWRlcnMgPyA6IFJlY29yZDxzdHJpbmcsIEZvcm11bGFQcm92aWRlckNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBSZWZyZXNoIGVudGlyZSByb3cgd2hlbiBhIHJlY29yZCBjaGFuZ2VzIChgdHJ1ZWApIG9yLCBpZiBwb3NzaWJsZSwgb25seSB0aGUgY2VsbHMgYWZmZWN0ZWQgKGBmYWxzZWApLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWZ1bGxSb3dSZWZyZXNoKVxuICAgICAqL1xuICAgIGZ1bGxSb3dSZWZyZXNoID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBGdW5jdGlvbiAob3IgbmFtZSBvZiBhIGZ1bmN0aW9uIGluIHRoZSBvd25lcnNoaXAgaGllcmFyY2h5KSB3aGljaCByZXR1cm5zIHRoZVxuICAgICAqIFtyZXNvdXJjZSByZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwpIHRvIHVzZSB0byBjcmVhdGUgdGhlIFVJIGZvciBhbiBldmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1nZXRQcmltYXJ5UmVzb3VyY2UpXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnRSZWNvcmQgVGhlIGV2ZW50IGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgcHJpbWFyeSByZXNvdXJjZS5cbiAgICAgKiBAcmV0dXJucyB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IFRoZSByZXNvdXJjZSB0byBiZSB1c2VkIHRvIHJlbmRlciB0aGUgZXZlbnQuXG4gICAgICovXG4gICAgZ2V0UHJpbWFyeVJlc291cmNlID8gOiAoKGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsKSA9PiBSZXNvdXJjZU1vZGVsKXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZWFjaCByb3cgdG8gZGV0ZXJtaW5lIGl0cyBoZWlnaHQuIEl0IGlzIHBhc3NlZCBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9kYXRhL01vZGVsKSBhbmRcbiAgICAgKiBleHBlY3RlZCB0byByZXR1cm4gdGhlIGRlc2lyZWQgaGVpZ2h0IG9mIHRoYXQgcmVjb3JkcyByb3cuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgZmFsc3kgdmFsdWUsIEdyaWRzXG4gICAgICogY29uZmlndXJlZCBbcm93SGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctcm93SGVpZ2h0KSBpcyB1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWdldFJvd0hlaWdodClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZ2V0Um93SGVpZ2h0LnJlY29yZCBSZWNvcmQgdG8gZGV0ZXJtaW5lIHJvdyBoZWlnaHQgZm9yXG4gICAgICogQHJldHVybnMge251bWJlcn0gRGVzaXJlZCByb3cgaGVpZ2h0XG4gICAgICovXG4gICAgZ2V0Um93SGVpZ2h0ID8gOiAoZ2V0Um93SGVpZ2h0OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSBjb25maWcgW29iamVjdF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCN0eXBlZGVmLVBhbmVsSGVhZGVyKSBmb3IgdGhlIHBhbmVsJ3MgaGVhZGVyIG9yIGEgc3RyaW5nIGluIHBsYWNlIG9mIGEgYHRpdGxlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1oZWFkZXIpXG4gICAgICovXG4gICAgaGVhZGVyID8gOiBzdHJpbmd8Ym9vbGVhbnxQYW5lbEhlYWRlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIGhlaWdodCwgdXNlZCB0byBzZXQgZWxlbWVudCBgc3R5bGUuaGVpZ2h0YC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCBoZWlnaHQgc3RyaW5nIG9yIGEgbnVtYmVyLFxuICAgICAqIHdoaWNoIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgaGVpZ2h0LCBidXQgaW4gc29tZVxuICAgICAqIGNhc2VzIHRoaXMgY29uZmlnIGlzIGNvbnZlbmllbnQuXG4gICAgICovXG4gICAgaGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHdpdGggdHJ1ZSB0byBtYWtlIHdpZGdldCBpbml0aWFsbHkgaGlkZGVuLlxuICAgICAqL1xuICAgIGhpZGRlbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgZm9vdGVyIGVsZW1lbnRzXG4gICAgICovXG4gICAgaGlkZUZvb3RlcnMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGhpZGUgdGhlIGNvbHVtbiBoZWFkZXIgZWxlbWVudHNcbiAgICAgKi9cbiAgICBoaWRlSGVhZGVycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgR3JpZCdzIGhvcml6b250YWwgc2Nyb2xsYmFyKHMpXG4gICAgICovXG4gICAgaGlkZUhvcml6b250YWxTY3JvbGxiYXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhpZGUgW25vbldvcmtpbmdEYXlzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1ub25Xb3JraW5nRGF5cylcbiAgICAgKi9cbiAgICBoaWRlTm9uV29ya2luZ0RheXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIENTUyBjbGFzcyB0byBhZGQgdG8gaG92ZXJlZCByb3cgZWxlbWVudHNcbiAgICAgKi9cbiAgICBob3ZlckNscyA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQW4gaWNvbiB0byBzaG93IGJlZm9yZSB0aGUgW3RpdGxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10aXRsZSkuIEVpdGhlciBwYXNzIGEgQ1NTIGNsYXNzIGFzIGEgc3RyaW5nLCBvciBwYXNzIGFcbiAgICAgKiBbRG9tQ29uZmlnXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RvbUhlbHBlciN0eXBlZGVmLURvbUNvbmZpZykgb2JqZWN0IGRlc2NyaWJpbmcgYW4gZWxlbWVudCB0byByZXByZXNlbnQgdGhlIGljb24uXG4gICAgICovXG4gICAgaWNvbiA/IDogc3RyaW5nfERvbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCBpZCwgaWYgbm90IHNwZWNpZmllZCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuIEFsc28gdXNlZCBmb3IgbG9va3VwcyB0aHJvdWdoIFdpZGdldC5nZXRCeUlkXG4gICAgICovXG4gICAgaWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHdpZGdldHMgcmVhZC1vbmx5IHN0YXRlIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGl0cyBwYXJlbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctaWdub3JlUGFyZW50UmVhZE9ubHkpXG4gICAgICovXG4gICAgaWdub3JlUGFyZW50UmVhZE9ubHkgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzZXR0aW5nIHRvIGFsaWduIGlucHV0IGZpZWxkcyBvZiBjaGlsZCB3aWRnZXRzLiBCeSBkZWZhdWx0LCB0aGUgRmllbGQgaW5wdXQgZWxlbWVudCBpc1xuICAgICAqIHBsYWNlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGBsYWJlbGAuIElmIHlvdSBwcmVmZXIgdG8gaGF2ZSBhbGwgaW5wdXQgZmllbGRzIGFsaWduZWQgdG8gdGhlXG4gICAgICogcmlnaHQsIHNldCB0aGlzIGNvbmZpZyB0byBgJ2VuZCdgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWlucHV0RmllbGRBbGlnbilcbiAgICAgKi9cbiAgICBpbnB1dEZpZWxkQWxpZ24gPyA6ICdzdGFydCd8J2VuZCdcbiAgICAvKipcbiAgICAgKiBFbGVtZW50IChvciBlbGVtZW50IGlkKSB0byBpbnNlcnQgdGhpcyB3aWRnZXQgYmVmb3JlLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyBpcyBpZ25vcmVkLlxuICAgICAqL1xuICAgIGluc2VydEJlZm9yZSA/IDogSFRNTEVsZW1lbnR8c3RyaW5nXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYXBwZW5kIHRoaXMgd2lkZ2V0IGVsZW1lbnQgdG8sIGFzIGEgZmlyc3QgY2hpbGQuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1hcHBlbmRUbykgY29uZmlnIGlzIGlnbm9yZWQuXG4gICAgICovXG4gICAgaW5zZXJ0Rmlyc3QgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNlZSBbS2V5Ym9hcmQgc2hvcnRjdXRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkI2tleWJvYXJkLXNob3J0Y3V0cykgZm9yIGRldGFpbHNcbiAgICAgKi9cbiAgICBrZXlNYXAgPyA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzZXR0aW5nIHRvIHVzZSBzYW1lIGxhYmVsIHBsYWNlbWVudCBvbiBhbGwgY2hpbGQgd2lkZ2V0cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1sYWJlbFBvc2l0aW9uKVxuICAgICAqL1xuICAgIGxhYmVsUG9zaXRpb24gPyA6ICdiZWZvcmUnfCdhYm92ZSd8J2FsaWduLWJlZm9yZSd8J2F1dG8nfG51bGxcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdGVuZXIgc2V0IGZvciB0aGlzIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1saXN0ZW5lcnMpXG4gICAgICovXG4gICAgbGlzdGVuZXJzID8gOiBFdmVudExpc3RMaXN0ZW5lcnNcbiAgICAvKipcbiAgICAgKiBBIFtSYW5nZU1lbnVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L1JhbmdlTWVudSkgY29uZmlndXJhdGlvbiBibG9jayB3aGljaCBjb25maWd1cmVzIHRoZSByYW5nZSBjaG9vc2luZyBtZW51IHByb3ZpZGVkIHdoaWNoXG4gICAgICogYnkgZGVmYXVsdCBzZWxlY3RzIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLWxpc3RSYW5nZU1lbnUpXG4gICAgICovXG4gICAgbGlzdFJhbmdlTWVudSA/IDogUmFuZ2VNZW51Q29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L01hc2spIGNvbmZpZyBvYmplY3QsIG9yIGEgbWVzc2FnZSB0byBiZSBzaG93biB3aGVuIGEgc3RvcmUgaXMgcGVyZm9ybWluZyBhIHJlbW90ZVxuICAgICAqIG9wZXJhdGlvbiwgb3IgQ3J1ZCBNYW5hZ2VyIGlzIGxvYWRpbmcgZGF0YSBmcm9tIHRoZSBzZXZlci4gU2V0IHRvIGBudWxsYCB0byBkaXNhYmxlIGRlZmF1bHQgbG9hZCBtYXNrLlxuICAgICAqL1xuICAgIGxvYWRNYXNrID8gOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gZGF0YSBpcyBsb2FkaW5nLiBUaGUgbWVzc2FnZSBhbmQgb3B0aW9uYWwgY29uZmlndXJhdGlvbiBmcm9tIHRoZVxuICAgICAqIFtsb2FkTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL0xvYWRNYXNrYWJsZSNjb25maWctbG9hZE1hc2spIGNvbmZpZyB0YWtlIHByaW9yaXR5IG92ZXIgdGhlc2Ugb3B0aW9ucywganVzdCBhcyB0aGV5IGRvXG4gICAgICogZm9yIGBtYXNrRGVmYXVsdHNgLCByZXNwZWN0aXZlbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctbG9hZE1hc2tEZWZhdWx0cylcbiAgICAgKi9cbiAgICBsb2FkTWFza0RlZmF1bHRzID8gOiBNYXNrQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1sb2FkTWFza0Vycm9yKVxuICAgICAqL1xuICAgIGxvYWRNYXNrRXJyb3IgPyA6IE1hc2tDb25maWd8TWFza3xib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gZGlzYWJsZSBsb2NhbGl6YXRpb24gb2YgdGhpcyBvYmplY3QuXG4gICAgICovXG4gICAgbG9jYWxpemFibGUgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaW1lIGluIG1zIHVudGlsIGEgbG9uZ3ByZXNzIGlzIHRyaWdnZXJlZFxuICAgICAqL1xuICAgIGxvbmdQcmVzc1RpbWUgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIG1hcmdpbi4gVGhpcyBtYXkgYmUgY29uZmlndXJlZCBhcyBhIHNpbmdsZSBudW1iZXIgb3IgYSBgVFJCTGAgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBwaXhlbHMuXG4gICAgICovXG4gICAgbWFyZ2luID8gOiBudW1iZXJ8c3RyaW5nXG4gICAgLyoqXG4gICAgICogR3JpZHMgY2hhbmdlIHRoZSBgbWFza0RlZmF1bHRzYCB0byBjb3ZlciBvbmx5IHRoZWlyIGBib2R5YCBlbGVtZW50LlxuICAgICAqL1xuICAgIG1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gYXBwbHkgdGhlIGRlZmF1bHQgbWFzayB0byB0aGUgd2lkZ2V0LiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSB0aGUgbWFzayBtZXNzYWdlIG9yIGFcbiAgICAgKiBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIG1hc2tlZCA/IDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIGRhdGUgdG8gd2hpY2ggdGhlIGBlbmREYXRlYCBvZiB0aGlzIHZpZXcgbWF5IGJlIG5hdmlnYXRlZC5cbiAgICAgKi9cbiAgICBtYXhEYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50J3MgbWF4SGVpZ2h0LiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW2hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWhlaWdodCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heEhlaWdodCA/IDogc3RyaW5nfG51bWJlclxuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50cyBtYXhXaWR0aC4gQ2FuIGJlIGVpdGhlciBhIFN0cmluZyBvciBhIE51bWJlciAod2hpY2ggd2lsbCBoYXZlICdweCcgYXBwZW5kZWQpLiBOb3RlIHRoYXRcbiAgICAgKiBsaWtlIFt3aWR0aF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXdpZHRoKSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4V2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBkYXRlIHRvIHdoaWNoIHRoZSBgc3RhcnREYXRlYCBvZiB0aGlzIHZpZXcgbWF5IGJlIG5hdmlnYXRlZC5cbiAgICAgKi9cbiAgICBtaW5EYXRlID8gOiBEYXRlfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEdyaWQncyBgbWluLWhlaWdodGAuIERlZmF1bHRzIHRvIGAxMGVtYCB0byBiZSBzdXJlIHRoYXQgdGhlIEdyaWQgYWx3YXlzIGhhcyBhIGhlaWdodCB3aGVyZXZlciBpdCBpc1xuICAgICAqIGluc2VydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLW1pbkhlaWdodClcbiAgICAgKi9cbiAgICBtaW5IZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWluV2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1pbldpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogR3JpZCBtb25pdG9ycyB3aW5kb3cgcmVzaXplIGJ5IGRlZmF1bHQuXG4gICAgICovXG4gICAgbW9uaXRvclJlc2l6ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIE5vbi13b3JraW5nIGRheXMgYXMgYW4gb2JqZWN0IHdoZXJlIGtleXMgYXJlIGRheSBpbmRpY2VzLCAwLTYgKFN1bmRheS1TYXR1cmRheSksIGFuZCB0aGUgdmFsdWUgaXMgYHRydWVgLlxuICAgICAqIERlZmF1bHRzIHRvIFtub25Xb3JraW5nRGF5c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyI3Byb3BlcnR5LW5vbldvcmtpbmdEYXlzLXN0YXRpYykuXG4gICAgICovXG4gICAgbm9uV29ya2luZ0RheXMgPyA6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+XG4gICAgLyoqXG4gICAgICogVGhlIG93bmluZyBXaWRnZXQgb2YgdGhpcyBXaWRnZXQuIElmIHRoaXMgV2lkZ2V0IGlzIGRpcmVjdGx5IGNvbnRhaW5lZCAodGhhdCBpcywgaXQgaXMgb25lIG9mIHRoZVxuICAgICAqIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaXRlbXMpIG9mIGEgQ29udGFpbmVyKSwgdGhpcyBjb25maWcgd2lsbCBiZSBpZ25vcmVkLiBJbiB0aGlzIGNhc2VcbiAgICAgKiB0aGUgb3duZXIgaXMgPHN0cm9uZz5hbHdheXM8L3N0cm9uZz4gdGhlIGVuY2Fwc3VsYXRpbmcgQ29udGFpbmVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLW93bmVyKVxuICAgICAqL1xuICAgIG93bmVyID8gOiBXaWRnZXR8YW55XG4gICAgLyoqXG4gICAgICogVGhlIGNsYXNzIG5hbWUgdG8gYWRkIHRvIGV2ZW50cyB3aGljaCBoYXZlIGFuIGVuZCBkYXRlIGluIHRoZSBwYXN0LiBEZWZhdWx0cyB0byBgJ2ItcGFzdC1ldmVudCdgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXBhc3RFdmVudENscylcbiAgICAgKi9cbiAgICBwYXN0RXZlbnRDbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgcGx1Z2lucyAoYW4gYXJyYXkgb2YgY2xhc3NlcykgaW4gY29uZmlnXG4gICAgICovXG4gICAgcGx1Z2lucyA/IDogRnVuY3Rpb25bXVxuICAgIC8qKlxuICAgICAqIFRydWUgdG8gcHJlc2VydmUgZm9jdXNlZCBjZWxsIGFmdGVyIGxvYWRpbmcgbmV3IGRhdGFcbiAgICAgKi9cbiAgICBwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJlc2VydmUgdGhlIGdyaWQncyB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gd2hlbiBjaGFuZ2VzZXRzIGFyZSBhcHBsaWVkLCBhcyBpbiB0aGUgY2FzZSBvZiByZW1vdGVcbiAgICAgKiBjaGFuZ2VzLCBvciB3aGVuIHN0b3JlcyBhcmUgY29uZmlndXJlZCB3aXRoIFtzeW5jRGF0YU9uTG9hZF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUjY29uZmlnLXN5bmNEYXRhT25Mb2FkKS5cbiAgICAgKi9cbiAgICBwcmVzZXJ2ZVNjcm9sbCA/IDogUHJlc2VydmVTY3JvbGxPcHRpb25zfGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGB0cnVlYCB0byBwcmVzZXJ2ZSB2ZXJ0aWNhbCBzY3JvbGwgcG9zaXRpb24gYWZ0ZXIgc3RvcmUgYWN0aW9ucyB0aGF0IHRyaWdnZXIgYSBgcmVmcmVzaGAgZXZlbnQsXG4gICAgICogc3VjaCBhcyBsb2FkaW5nIG5ldyBkYXRhIGFuZCBmaWx0ZXJpbmcuXG4gICAgICovXG4gICAgcHJlc2VydmVTY3JvbGxPbkRhdGFzZXRDaGFuZ2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcmV2ZW50IHRvb2x0aXAgZnJvbSBiZWluZyBkaXNwbGF5ZWQgb24gdG91Y2ggZGV2aWNlcy4gVXNlZnVsIGZvciBleGFtcGxlIGZvciBidXR0b25zIHRoYXQgZGlzcGxheSBhXG4gICAgICogbWVudSBvbiBjbGljayBldGMsIHNpbmNlIHRoZSB0b29sdGlwIHdvdWxkIGJlIGRpc3BsYXllZCBhdCB0aGUgc2FtZSB0aW1lLlxuICAgICAqL1xuICAgIHByZXZlbnRUb29sdGlwT25Ub3VjaCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHJhbmdlIGFyb3VuZCB0aGUgW2RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0RhdGVSYW5nZU93bmVyI2NvbmZpZy1kYXRlKSB0byBkaXNwbGF5IGV2ZW50cyBmb3IuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctcmFuZ2UpXG4gICAgICovXG4gICAgcmFuZ2UgPyA6IHN0cmluZ3xEdXJhdGlvbkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbWFrZSB0aGUgZ3JpZCByZWFkLW9ubHksIGJ5IGRpc2FibGluZyBhbnkgVUlzIGZvciBtb2RpZnlpbmcgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1yZWFkT25seSlcbiAgICAgKi9cbiAgICByZWFkT25seSA/IDogYm9vbGVhblxuICAgIHJlbGF5U3RvcmVFdmVudHMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSBkZWZhdWx0IGByZW5kaXRpb25gIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCB3aWRnZXRzLCBvciBhIG1hcCBvZiByZW5kaXRpb25zIGtleWVkIGJ5IGNoaWxkIHdpZGdldFxuICAgICAqIGB0eXBlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1yZW5kaXRpb24pXG4gICAgICovXG4gICAgcmVuZGl0aW9uID8gOiBzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nPnxudWxsXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoaXMgcHJvcGVydHkgdG8gYWxsb3cgdGhlIHdpZGdldC9jb21wb25lbnQgdG8gYmUgcmVzaXplZC4gUHJlc3NpbmcgPGtiZD5TaGlmdDwva2JkPiB3aGlsZSByZXNpemluZyB3aWxsXG4gICAgICogY29uc3RyYWluIHRoZSBhc3BlY3QgcmF0aW8uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctcmVzaXphYmxlKVxuICAgICAqL1xuICAgIHJlc2l6YWJsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIG1pbldpZHRoPzogbnVtYmVyXG4gICAgICAgIG1heFdpZHRoPzogbnVtYmVyXG4gICAgICAgIG1pbkhlaWdodD86IG51bWJlclxuICAgICAgICBtYXhIZWlnaHQ/OiBudW1iZXJcbiAgICAgICAgaGFuZGxlcz86IG9iamVjdFxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvbmx5IG1lYXN1cmUgY2VsbCBjb250ZW50cyB3aGVuIGRvdWJsZS1jbGlja2luZyB0aGUgZWRnZSBiZXR3ZWVuIGNvbHVtbiBoZWFkZXJzLlxuICAgICAqL1xuICAgIHJlc2l6ZVRvRml0SW5jbHVkZXNIZWFkZXIgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQYXRoIHRvIGxvYWQgcmVzb3VyY2UgaW1hZ2VzIGZyb20uIFVzZWQgYnkgdGhlIFtzaG93UmVzb3VyY2VBdmF0YXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1zaG93UmVzb3VyY2VBdmF0YXJzKSBjb25maWdcbiAgICAgKiB0byBjcmVhdGUgVVJMcyB1c2luZyB0aGUgcmVzb3VyY2Unc1xuICAgICAqIFtpbWFnZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9TY2hlZHVsZXIvbW9kZWwvUmVzb3VyY2VNb2RlbCNmaWVsZC1pbWFnZSkgb3JcbiAgICAgKiBbaW1hZ2VVcmxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvU2NoZWR1bGVyL21vZGVsL1Jlc291cmNlTW9kZWwjZmllbGQtaW1hZ2VVcmwpIGZpZWxkczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1yZXNvdXJjZUltYWdlUGF0aClcbiAgICAgKi9cbiAgICByZXNvdXJjZUltYWdlUGF0aCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSB2YXJpb3VzIHJlc3BvbnNpdmUgc3RhdGUgb2JqZWN0cyBrZXllZCBieSB0aGVpciBuYW1lLiBFYWNoIGtleSAoZXhjZXB0IGAnKidgLCBzZWUgYmVsb3cpIGluXG4gICAgICogdGhpcyBvYmplY3QgaXMgYSBzdGF0ZSBuYW1lIChzZWUgW3Jlc3BvbnNpdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlU3RhdGUpKSBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgdGhlXG4gICAgICogYXNzb2NpYXRlZCBbUmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjdHlwZWRlZi1SZXNwb25zaXZlU3RhdGUpIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1yZXNwb25zaXZlKVxuICAgICAqL1xuICAgIHJlc3BvbnNpdmUgPyA6IG9iamVjdFxuICAgIC8qKlxuICAgICAqIFwiQnJlYWsgcG9pbnRzXCIgZm9yIHdoaWNoIHJlc3BvbnNpdmUgY29uZmlnIHRvIHVzZSBmb3IgY29sdW1ucyBhbmQgY3NzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXJlc3BvbnNpdmVMZXZlbHMpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZUxldmVscyA/IDogUmVjb3JkPHN0cmluZywgbnVtYmVyfHN0cmluZ3xSZXNwb25zaXZlTGV2ZWxDb25maWc+XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBtYXJrIHRoaXMgaW5zdGFuY2UgYXMgdGhlIGRlZmF1bHQgW3Jlc3BvbnNpdmVUYXJnZXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvbWl4aW4vUmVzcG9uc2l2ZSNjb25maWctcmVzcG9uc2l2ZVRhcmdldCkgZm9yIGRlc2NlbmRhbnRzIHRoYXQgZG9cbiAgICAgKiBub3Qgc3BlY2lmeSBhbiBleHBsaWNpdCBbcmVzcG9uc2l2ZVRhcmdldF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlVGFyZ2V0KSBvZiB0aGVpciBvd24uXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZVJvb3QgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZSBbcmVzcG9uc2l2ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlKSBjb25maWcuIFRoaXMgaXMgYXNzaWduZWQgaW50ZXJuYWxseVxuICAgICAqIGFuZCBzaG91bGQgbm90IGJlIGFzc2lnbmVkIGRpcmVjdGx5LlxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVTdGF0ZSA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogVGhlIHdpZGdldCB3aG9zZSBzaXplIGFuZCBvdGhlciBwcm9wZXJ0aWVzIGRyaXZlIHRoaXMgb2JqZWN0J3MgcmVzcG9uc2l2ZSBiZWhhdmlvci4gSWYgdGhpcyBjb25maWcgaXMgbm90XG4gICAgICogc3BlY2lmaWVkLCB0aGUgY2xvc2VzdCBhbmNlc3RvciB0aGF0IHNwZWNpZmllZCBbcmVzcG9uc2l2ZVJvb3Q9dHJ1ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9SZXNwb25zaXZlI2NvbmZpZy1yZXNwb25zaXZlUm9vdCkgd2lsbCBiZVxuICAgICAqIHVzZWQuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYW5jZXN0b3IsIHRoZW4gdGhlIGluc3RhbmNlIHVzaW5nIHRoaXMgbWl4aW4gaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1yZXNwb25zaXZlVGFyZ2V0KVxuICAgICAqL1xuICAgIHJlc3BvbnNpdmVUYXJnZXQgPyA6IHN0cmluZ3xXaWRnZXRcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgYXMgYHRydWVgIHRvIGhhdmUgdGhlIGNvbXBvbmVudCBkaXNwbGF5IGEgdHJhbnNsdWNlbnQgcmlwcGxlIHdoZW4gaXRzXG4gICAgICogW2ZvY3VzRWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZm9jdXNFbGVtZW50KSwgb3IgW2VsZW1lbnRdKCNDb3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgdGFwcGVkIDxlbT5pZiB0aGVcbiAgICAgKiBjdXJyZW50IHRoZW1lIHN1cHBvcnRzIHJpcHBsZXM8L2VtPi4gT3V0IG9mIHRoZSBib3gsIG9ubHkgdGhlIE1hdGVyaWFsIHRoZW1lIHN1cHBvcnRzIHJpcHBsZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctcmlwcGxlKVxuICAgICAqL1xuICAgIHJpcHBsZSA/IDogYm9vbGVhbnx7XG4gICAgICAgIGRlbGVnYXRlPzogc3RyaW5nXG4gICAgICAgIGNvbG9yPzogc3RyaW5nXG4gICAgICAgIHJhZGl1cz86IG51bWJlclxuICAgICAgICBjbGlwPzogc3RyaW5nXG4gICAgfVxuICAgIC8qKlxuICAgICAqIElmIHlvdSBhcmUgcmVuZGVyaW5nIHRoaXMgd2lkZ2V0IHRvIGEgc2hhZG93IHJvb3QgaW5zaWRlIGEgd2ViIGNvbXBvbmVudCwgc2V0IHRoaXMgY29uZmlnIHRvIHRoZSBzaGFkb3dSb290LiBJZiBub3QgaW5zaWRlIGEgd2ViIGNvbXBvbmVudCwgc2V0IGl0IHRvIGBkb2N1bWVudC5ib2R5YFxuICAgICAqL1xuICAgIHJvb3RFbGVtZW50ID8gOiBTaGFkb3dSb290fEhUTUxFbGVtZW50XG4gICAgLyoqXG4gICAgICogUm93IGhlaWdodCBpbiBwaXhlbHMuIFRoaXMgYWxsb3dzIHRoZSBkZWZhdWx0IGhlaWdodCBmb3Igcm93cyB0byBiZSBjb250cm9sbGVkLiBOb3RlIHRoYXQgaXQgbWF5IGJlXG4gICAgICogb3ZlcnJpZGVuIGJ5IHNwZWNpZnlpbmcgYSBbcm93SGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZGF0YS9HcmlkUm93TW9kZWwjZmllbGQtcm93SGVpZ2h0KSBvbiBhIHBlciByZWNvcmQgYmFzaXMsIG9yIGZyb21cbiAgICAgKiBhIGNvbHVtbiBbcmVuZGVyZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9jb2x1bW4vQ29sdW1uI2NvbmZpZy1yZW5kZXJlcikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctcm93SGVpZ2h0KVxuICAgICAqL1xuICAgIHJvd0hlaWdodCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgcm93IGxpbmVzLiBFbmQgcmVzdWx0IG1pZ2h0IGJlIG92ZXJydWxlZCBieS9kaWZmZXIgYmV0d2VlbiB0aGVtZXMuXG4gICAgICovXG4gICAgcm93TGluZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXJ0bClcbiAgICAgKi9cbiAgICBydGwgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHdoZXRoZXIgdGhlIGdyaWQgaXMgc2Nyb2xsYWJsZSBpbiB0aGUgYFlgIGF4aXMuIFRoaXMgaXMgdXNlZCB0byBjb25maWd1cmUgYSBbU2Nyb2xsZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9oZWxwZXIvdXRpbC9TY3JvbGxlcikuXG4gICAgICogU2VlIHRoZSBbc2Nyb2xsZXJDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXNjcm9sbGVyQ2xhc3MpIGNvbmZpZyBvcHRpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc2Nyb2xsYWJsZSlcbiAgICAgKi9cbiAgICBzY3JvbGxhYmxlID8gOiBib29sZWFufFNjcm9sbGVyQ29uZmlnfFNjcm9sbGVyXG4gICAgLyoqXG4gICAgICogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlIHRvIHVzZSBhcyB0aGUgW3Njcm9sbGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1zY3JvbGxhYmxlKS4gRGVmYXVsdHMgdG8gW1Njcm9sbGVyXSgjQ29yZS9oZWxwZXIvdXRpbC9TY3JvbGxlcikuXG4gICAgICovXG4gICAgc2Nyb2xsZXJDbGFzcyA/IDogdHlwZW9mIFNjcm9sbGVyXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIHRoZSBbU2Nyb2xsTWFuYWdlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3V0aWwvU2Nyb2xsTWFuYWdlcikgY2xhc3Mgb24gaW5pdGlhbGl6YXRpb24uIFJldHVybnMgdGhlXG4gICAgICogW1Njcm9sbE1hbmFnZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS91dGlsL1Njcm9sbE1hbmFnZXIpIGF0IHJ1bnRpbWUuXG4gICAgICovXG4gICAgc2Nyb2xsTWFuYWdlciA/IDogU2Nyb2xsTWFuYWdlckNvbmZpZ3xTY3JvbGxNYW5hZ2VyXG4gICAgLyoqXG4gICAgICogU2VsZWN0aW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIGNoYW5nZSB0aGVzZSBwcm9wZXJ0aWVzIHRvIGNvbnRyb2wgaG93IHNlbGVjdGlvbiB3b3JrcyBhbmQgd2hhdCBjYW4gYmVcbiAgICAgKiBzZWxlY3RlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zZWxlY3Rpb25Nb2RlKVxuICAgICAqL1xuICAgIHNlbGVjdGlvbk1vZGUgPyA6IEdyaWRTZWxlY3Rpb25Nb2RlXG4gICAgLyoqXG4gICAgICogQSBidXR0b24gY29uZmlndXJhdGlvbiBvYmplY3QgdG8gdXNlIGZvciB0aGUgYXV0b21hdGljYWxseSBjcmVhdGVkIG1vZGUgc2VsZWN0b3IgYnV0dG9uIGZvciB0aGlzIG1vZGUuXG4gICAgICovXG4gICAgc2VsZWN0b3JCdXR0b24gPyA6IEJ1dHRvbkNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgbWVudSBpdGVtIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRvIHVzZSBmb3IgdGhlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBtb2RlIHNlbGVjdG9yIG1lbnUgaXRlbSBmb3IgdGhpcyBtb2RlLlxuICAgICAqL1xuICAgIHNlbGVjdG9yTWVudUl0ZW0gPyA6IE1lbnVJdGVtQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgcmFuZ2UgdG8gbW92ZSBieSB3aGVuIFtuZXh0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXRlUmFuZ2VPd25lciNmdW5jdGlvbi1uZXh0KSBvciBbcHJldmlvdXNdKCNDYWxlbmRhci93aWRnZXQvbWl4aW4vRGF0ZVJhbmdlT3duZXIjZnVuY3Rpb24tcHJldmlvdXMpIGlzIGNhbGxlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zaGlmdEluY3JlbWVudClcbiAgICAgKi9cbiAgICBzaGlmdEluY3JlbWVudCA/IDogc3RyaW5nfER1cmF0aW9uQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgZGF0ZSBvdXRwdXQgZm9yXG4gICAgICogYWJicmV2aWF0ZWQgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgc2hvcnREYXRlRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHRvIHVzZSB0byBjcmVhdGUgZGF0ZSBhbmQgdGltZSBvdXRwdXQgZm9yXG4gICAgICogYWJicmV2aWF0ZWQgdmlldyBkZXNjcmlwdGlvbnMuXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlIFRoZSBkYXRlIHRvIGZvcm1hdC5cbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0dGVkIGRhdGUuXG4gICAgICovXG4gICAgc2hvcnREYXRlVGltZUZvcm1hdCA/IDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKVxuICAgIC8qKlxuICAgICAqIFRoZSBjbGFzcyBuYW1lIHRvIGFkZCB0byBldmVudHMgd2hpY2ggaGF2ZSBkdXJhdGlvbiBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAgICAgKiBbc2hvcnRFdmVudER1cmF0aW9uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1zaG9ydEV2ZW50RHVyYXRpb24pLlxuICAgICAqL1xuICAgIHNob3J0RXZlbnRDbHMgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBhdCB3aGljaCBiZWxvdyBhbmQgZXF1YWwgdG8gdGhpcyB2YWx1ZSwgYW4gZXZlbnQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgZ2V0c1xuICAgICAqIHRoZSBbc2hvcnRFdmVudENsc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctc2hvcnRFdmVudENscykgYWRkZWQgdG8gaXQgc28gdGhhdCBzbWFsbCBldmVudCBiYXJzIGNhbiBoYXZlIHN0eWxlIHJlYXJyYW5nZW1lbnRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXNob3J0RXZlbnREdXJhdGlvbilcbiAgICAgKi9cbiAgICBzaG9ydEV2ZW50RHVyYXRpb24gPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiA8c3Ryb25nPk5vdCBhcHBsaWNhYmxlIGluIGEgYERheVZpZXdgPC9zdHJvbmc+XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc2hvd0J1bGxldClcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJhciBUaGlzIGlzIGBmYWxzZWAgYnkgZGVmYXVsdC4gU2V0IHRoaXMgdG8gYHRydWVgIGluIG1vZGVzIHdoZXJlIGEgc29saWQgZXZlbnQgYmFyIHNob3VsZCBzaG93IGEgYnVsbGV0IGljb25cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5vQmFyIFRoaXMgaXMgYHRydWVgIGJ5IGRlZmF1bHQuIEV2ZW50cyB3aXRoIG5vIGJhY2tncm91bmQgY29sb3VyLCB1c2UgdGhpcyB0byBzaG93IHRoZSBldmVudCdzIGRlZmluZWQgYGV2ZW50Q29sb3JgXG4gICAgICovXG4gICAgc2hvd0J1bGxldCA/IDogYm9vbGVhbnx7YmFyPzogYm9vbGVhbiwgbm9CYXI/OiBib29sZWFufVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGF2ZSB0aGUgZ3JpZCBzaG93IGEgcmVkIFwiY2hhbmdlZFwiIHRhZyBpbiBjZWxscyB3aG9zZVxuICAgICAqIGZpZWxkIHZhbHVlIGhhcyBjaGFuZ2VkIGFuZCBub3QgeWV0IGJlZW4gY29tbWl0dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXNob3dEaXJ0eSlcbiAgICAgKi9cbiAgICBzaG93RGlydHkgPyA6IGJvb2xlYW58e1xuICAgICAgICBkdXJpbmdFZGl0PzogYm9vbGVhblxuICAgICAgICBuZXdSZWNvcmQ/OiBib29sZWFuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gc2hvdyBhdmF0YXJzIG9mIHRoZSBhc3NpZ25lZCByZXNvdXJjZXMgKGNhbGVuZGFycykgYXQgdGhlXG4gICAgICogc3RhcnQgb2YgdGhlIGV2ZW50IGJhci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zaG93UmVzb3VyY2VBdmF0YXJzKVxuICAgICAqL1xuICAgIHNob3dSZXNvdXJjZUF2YXRhcnMgPyA6IGJvb2xlYW58c3RyaW5nXG4gICAgLyoqXG4gICAgICogUHJvZ3JhbW1hdGljIGNvbnRyb2wgb3ZlciBob3cgbWFueSBjb2x1bW5zIHRvIHNwYW4gd2hlbiB1c2VkIGluIGEgZ3JpZCBsYXlvdXQuXG4gICAgICovXG4gICAgc3BhbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBzdGFjayBtdWx0aS1kYXkgZXZlbnRzIHdpdGhpbiBlYWNoIGNlbGwgaW4gdGhlIG9yZGVyIG9mIHRoZWlyIHN0YXJ0IHRpbWUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc3RhY2tNdWx0aURheUV2ZW50cylcbiAgICAgKi9cbiAgICBzdGFja011bHRpRGF5RXZlbnRzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgKFRpbWUgY29tcG9uZW50IGlzIHplcm9lZCkgb2YgdGhpcyB2aWV3LlxuICAgICAqL1xuICAgIHN0YXJ0RGF0ZSA/IDogRGF0ZVxuICAgIC8qKlxuICAgICAqIFRoaXMgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXN0YXRlZnVsKVxuICAgICAqL1xuICAgIHN0YXRlZnVsID8gOiBib29sZWFufG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBldmVudHMgdGhhdCwgd2hlbiBmaXJlZCBieSB0aGlzIGNvbXBvbmVudCwgc2hvdWxkIHRyaWdnZXIgaXQgdG8gc2F2ZSBpdHMgc3RhdGUgYnkgY2FsbGluZ1xuICAgICAqIFtzYXZlU3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNmdW5jdGlvbi1zYXZlU3RhdGUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXN0YXRlZnVsRXZlbnRzKVxuICAgICAqL1xuICAgIHN0YXRlZnVsRXZlbnRzID8gOiBvYmplY3R8c3RyaW5nW11cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IHRvIHVzZSB3aGVuIHNhdmluZyB0aGlzIG9iamVjdCdzIHN0YXRlIGluIHRoZSBbc3RhdGVQcm92aWRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL21peGluL1N0YXRlI2NvbmZpZy1zdGF0ZVByb3ZpZGVyKS4gSWYgdGhpcyBjb25maWcgaXNcbiAgICAgKiBub3QgYXNzaWduZWQsIGFuZCBbc3RhdGVmdWxdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNjb25maWctc3RhdGVmdWwpIGlzIG5vdCBzZXQgdG8gYGZhbHNlYCwgdGhlIFtpZF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaWQpXG4gICAgICogKGlmIGV4cGxpY2l0bHkgc3BlY2lmaWVkKSB3aWxsIGJlIHVzZWQgYXMgdGhlIGBzdGF0ZUlkYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zdGF0ZUlkKVxuICAgICAqL1xuICAgIHN0YXRlSWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBgU3RhdGVQcm92aWRlcmAgdG8gdXNlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhpcyBvYmplY3QncyBbc3RhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNwcm9wZXJ0eS1zdGF0ZSkuIEJ5IGRlZmF1bHQsIGBzdGF0ZWBcbiAgICAgKiB3aWxsIGJlIHNhdmVkIHVzaW5nIHRoZSBbZGVmYXVsdCBzdGF0ZSBwcm92aWRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3N0YXRlL1N0YXRlUHJvdmlkZXIjcHJvcGVydHktaW5zdGFuY2Utc3RhdGljKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zdGF0ZVByb3ZpZGVyKVxuICAgICAqL1xuICAgIHN0YXRlUHJvdmlkZXIgPyA6IFN0YXRlUHJvdmlkZXJcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGlzIHNldHRpbmdzIG9iamVjdCBjb250cm9scyBob3cgZ3JpZCBpcyByZXN0b3JlZCBmcm9tIHN0YXRlIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc3RhdGVTZXR0aW5ncylcbiAgICAgKi9cbiAgICBzdGF0ZVNldHRpbmdzID8gOiB7XG4gICAgICAgIHJlc3RvcmVVbmNvbmZpZ3VyZWRDb2x1bW5zPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdG9yZSB0aGF0IGhvbGRzIHJlY29yZHMgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZCwgb3IgYSBzdG9yZSBjb25maWcgb2JqZWN0LiBJZiB0aGUgY29uZmlndXJhdGlvbiBjb250YWluc1xuICAgICAqIGEgYHJlYWRVcmxgLCBhbiBgQWpheFN0b3JlYCB3aWxsIGJlIGNyZWF0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc3RvcmUpXG4gICAgICovXG4gICAgc3RvcmUgPyA6IFN0b3JlfFN0b3JlQ29uZmlnfEFqYXhTdG9yZXxBamF4U3RvcmVDb25maWdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB3aWRnZXRzIGtleWVkIGJ5IG5hbWUuIEJ5IGRlZmF1bHQgKHdoZW4gbm8gYHR5cGVgIGlzIGdpdmVuKSwgc3RyaXBzIGFyZVxuICAgICAqIFt0b29sYmFyc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKS4gSWYgeW91IHdhbnQgdG8gcGFzcyBhbiBhcnJheSwgeW91IGNhbiB1c2VcbiAgICAgKiB0aGUgdG9vbGJhcidzIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zdHJpcHMpXG4gICAgICovXG4gICAgc3RyaXBzID8gOiBSZWNvcmQ8c3RyaW5nLCBDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWc+XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgc3ViIGdyaWQgY29uZmlndXJhdGlvbiBvYmplY3RzIGtleWVkIGJ5IGEgYHJlZ2lvbmAgcHJvcGVydHkuXG4gICAgICogQnkgZGVmYXVsdCwgZ3JpZCBoYXMgYSAnbG9ja2VkJyByZWdpb24gKGlmIGNvbmZpZ3VyZWQgd2l0aCBsb2NrZWQgY29sdW1ucykgYW5kIGEgJ25vcm1hbCcgcmVnaW9uLlxuICAgICAqIFRoZSAnbm9ybWFsJyByZWdpb24gZGVmYXVsdHMgdG8gdXNlIGBmbGV4OiAxYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy1zdWJHcmlkQ29uZmlncylcbiAgICAgKi9cbiAgICBzdWJHcmlkQ29uZmlncyA/IDogUmVjb3JkPHN0cmluZywgU3ViR3JpZENvbmZpZz5cbiAgICAvKipcbiAgICAgKiBUaGUgY29udmVyc2Ugb2YgW3N5bmNWaWV3RGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNwcm9wZXJ0eS1zeW5jVmlld0RhdGUpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc3luY0NhbGVuZGFyRGF0ZSlcbiAgICAgKi9cbiAgICBzeW5jQ2FsZW5kYXJEYXRlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBbTWFza10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LCBvciBhIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2hlbiBDcnVkIE1hbmFnZXJcbiAgICAgKiBpcyBwZXJzaXN0aW5nIGNoYW5nZXMgb24gdGhlIHNlcnZlci4gU2V0IHRvIGBudWxsYCB0byBkaXNhYmxlIGRlZmF1bHQgc3luYyBtYXNrLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXN5bmNNYXNrKVxuICAgICAqL1xuICAgIHN5bmNNYXNrID8gOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogVGhlIGNvbnZlcnNlIG9mIFtzeW5jQ2FsZW5kYXJEYXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI3Byb3BlcnR5LXN5bmNDYWxlbmRhckRhdGUpXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNjb25maWctc3luY1ZpZXdEYXRlKVxuICAgICAqL1xuICAgIHN5bmNWaWV3RGF0ZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgY29uZmlndXJhdGlvbiBmb3IgdGhlIFt0YWJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiKSBjcmVhdGVkIGZvciB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIHBsYWNlZCBpbiBhXG4gICAgICogW1RhYlBhbmVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYlBhbmVsKS4gRm9yIGV4YW1wbGUsIHRoaXMgY29uZmlnIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGljb24gb2YgdGhlIGB0YWJgIGZvclxuICAgICAqIHRoaXMgd2lkZ2V0OlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXRhYilcbiAgICAgKi9cbiAgICB0YWIgPyA6IGJvb2xlYW58VGFiQ29uZmlnXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGNvbnRhaW5lciBpcyB1c2VkIGFzIGEgdGFiIGluIGEgVGFiUGFuZWwsIHRoZXNlIGl0ZW1zIGFyZSBhZGRlZCB0byB0aGVcbiAgICAgKiBbVGFiQmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1RhYkJhcikgd2hlbiB0aGlzIGNvbnRhaW5lciBpcyB0aGUgYWN0aXZlIHRhYi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy10YWJCYXJJdGVtcylcbiAgICAgKi9cbiAgICB0YWJCYXJJdGVtcyA/IDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W11cbiAgICAvKipcbiAgICAgKiBBIENvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgW1Rvb2xiYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuXG4gICAgICogVGhpcyBjcmVhdGVzIGEgdG9vbGJhciBkb2NrZWQgdG8gdGhlIHRvcCBvZiB0aGUgcGFuZWwgaW1tZWRpYXRlbHkgYmVsb3cgdGhlIGhlYWRlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2NvbmZpZy10YmFyKVxuICAgICAqL1xuICAgIHRiYXIgPyA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsXG4gICAgLyoqXG4gICAgICogQSBbRGF0ZUhlbHBlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyKSBmb3JtYXQgc3RyaW5nL2Z1bmN0aW9uIHVzZWQgdG8gZm9ybWF0IHRoZSB0aW1lIGRpc3BsYXllZCBpbiBldmVudHNcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGRhdGUgVGhlIGRhdGUgdG8gZm9ybWF0LlxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBmb3JtYXR0ZWQgZGF0ZS5cbiAgICAgKi9cbiAgICB0aW1lRm9ybWF0ID8gOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpXG4gICAgLyoqXG4gICAgICogQSB0aXRsZSB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgb3Igb3duaW5nIFRhYlBhbmVsLiBDYXVzZXMgY3JlYXRpb24gYW5kIGRvY2tpbmcgb2YgYSBoZWFkZXJcbiAgICAgKiB0byB0aGUgdG9wIGlmIG5vIGhlYWRlciBpcyBjb25maWd1cmVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXRpdGxlKVxuICAgICAqL1xuICAgIHRpdGxlID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgW3Rvb2xzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1Rvb2wpIHRvIGFkZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBgdGl0bGVgIGluIHRoZSBQYW5lbCBoZWFkZXIuIEVhY2hcbiAgICAgKiBwcm9wZXJ0eSBuYW1lIGlzIHRoZSByZWZlcmVuY2UgYnkgd2hpY2ggYW4gaW5zdGFudGlhdGVkIHRvb2wgbWF5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBsaXZlXG4gICAgICogYFt0b29sc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9Ub29sYWJsZSNwcm9wZXJ0eS10b29scylgIHByb3BlcnR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXRvb2xzKVxuICAgICAqL1xuICAgIHRvb2xzID8gOiBSZWNvcmQ8c3RyaW5nLCBUb29sQ29uZmlnPnxudWxsXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIFVJIHRyYW5zaXRpb25zIGZvciB2YXJpb3VzIGFjdGlvbnMgaW4gdGhlIGdyaWQuXG4gICAgICovXG4gICAgdHJhbnNpdGlvbiA/IDoge1xuICAgICAgICBpbnNlcnRSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHJlbW92ZVJlY29yZD86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlQ29sdW1uPzogYm9vbGVhblxuICAgICAgICBleHBhbmRDb2xsYXBzZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlUmVnaW9uPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVUcmVlTm9kZT86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlR3JvdXA/OiBib29sZWFuXG4gICAgICAgIGZpbHRlclJlbW92YWw/OiBib29sZWFuXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEFuaW1hdGlvbiB0cmFuc2l0aW9uIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy5cbiAgICAgKi9cbiAgICB0cmFuc2l0aW9uRHVyYXRpb24gPyA6IG51bWJlclxuICAgIHR5cGUgPyA6ICdldmVudGxpc3QnXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzcyBuYW1lIHN1ZmZpeGVzIHRvIGFwcGx5IHRvIHRoZSBlbGVtZW50cyByZW5kZXJlZCBieSB0aGlzIHdpZGdldC4gVGhpcyBtYXkgYmUgc3BlY2lmaWVkXG4gICAgICogYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBhbiBhcnJheSBvZiBzdHJpbmdzLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXMgd2l0aCB0cnV0aHlcbiAgICAgKiB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogVGhlIHdlZWsgc3RhcnQgZGF5LCAwIG1lYW5pbmcgU3VuZGF5LCA2IG1lYW5pbmcgU2F0dXJkYXkuXG4gICAgICogRGVmYXVsdHMgdG8gW3dlZWtTdGFydERheV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2hlbHBlci9EYXRlSGVscGVyI3Byb3BlcnR5LXdlZWtTdGFydERheS1zdGF0aWMpLlxuICAgICAqL1xuICAgIHdlZWtTdGFydERheSA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLlxuICAgICAqIEhpZ2hlciB3ZWlnaHRzIGdvIGZ1cnRoZXIgZG93bi5cbiAgICAgKi9cbiAgICB3ZWlnaHQgPyA6IG51bWJlclxuICAgIC8qKlxuICAgICAqIFdpZGdldCdzIHdpZHRoLCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS53aWR0aGAuIEVpdGhlciBzcGVjaWZ5IGEgdmFsaWQgd2lkdGggc3RyaW5nIG9yIGEgbnVtYmVyLCB3aGljaFxuICAgICAqIHdpbGwgZ2V0ICdweCcgYXBwZW5kZWQuIFdlIHJlY29tbWVuZCB1c2luZyBDU1MgYXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnRyb2wgd2lkdGgsIGJ1dCBpbiBzb21lIGNhc2VzXG4gICAgICogdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICB3aWR0aCA/IDogc3RyaW5nfG51bWJlclxuXG4gICAgLy8gRmVhdHVyZXNcbiAgICAvKipcbiAgICAgKiBBSS1wb3dlcmVkIGZpbHRlciBmZWF0dXJlIGZvciBHcmlkLiBBbGxvd3MgdXNlcnMgdG8gdHlwZSBuYXR1cmFsIGxhbmd1YWdlIHF1ZXJpZXMgdG8gZmlsdGVyIGdyaWQgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvYWkvQUlGaWx0ZXIpXG4gICAgICovXG4gICAgYWlGaWx0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8QUlGaWx0ZXJ8QUlGaWx0ZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgdXNpbmcgYFtDdHJsL0NNRCArIENdYCwgYFtDdHJsL0NNRCArIFhdYCBhbmQgYFtDdHJsL0NNRCArIFZdYCB0byBjdXQsIGNvcHkgYW5kIHBhc3RlIGNlbGwgb3IgY2VsbCByYW5nZXMuIEFsc29cbiAgICAgKiBtYWtlcyBjdXQsIGNvcHkgYW5kIHBhc3RlIGFjdGlvbnMgYXZhaWxhYmxlIHZpYSB0aGUgY2VsbCBjb250ZXh0IG1lbnUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxDb3B5UGFzdGUpXG4gICAgICovXG4gICAgY2VsbENvcHlQYXN0ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsQ29weVBhc3RlfENlbGxDb3B5UGFzdGVDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRpbmcgdGhpcyBmZWF0dXJlIHRvIHRoZSBncmlkIGFuZCBvdGhlciBCcnludHVtIHByb2R1Y3RzIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgR3JpZCAoaS5lLiBTY2hlZHVsZXIsIFNjaGVkdWxlclBybywgYW5kIEdhbnR0KVxuICAgICAqIGVuYWJsZXMgY2VsbCBlZGl0aW5nLiBBbnkgc3ViY2xhc3Mgb2YgW0ZpZWxkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0ZpZWxkKSBjYW4gYmUgdXNlZFxuICAgICAqIGFzIGVkaXRvciBmb3IgdGhlIFtDb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9jb2x1bW4vQ29sdW1uKS4gVGhlIG1vc3QgcG9wdWxhciBhcmU6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxFZGl0KVxuICAgICAqL1xuICAgIGNlbGxFZGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxFZGl0fENlbGxFZGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogUmlnaHQgY2xpY2sgdG8gZGlzcGxheSBjb250ZXh0IG1lbnUgZm9yIGNlbGxzLiBUbyBpbnZva2UgdGhlIGNlbGwgbWVudSBpbiBhIGtleWJvYXJkLWFjY2Vzc2libGUgbWFubmVyLCB1c2UgdGhlXG4gICAgICogYFNQQUNFYCBrZXkgd2hlbiB0aGUgY2VsbCBpcyBmb2N1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DZWxsTWVudSlcbiAgICAgKi9cbiAgICBjZWxsTWVudUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsTWVudXxDZWxsTWVudUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgdG9vbHRpcCB3aGVuIGhvdmVyaW5nIGNlbGxzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DZWxsVG9vbHRpcClcbiAgICAgKi9cbiAgICBjZWxsVG9vbHRpcEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsVG9vbHRpcHxDZWxsVG9vbHRpcENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFkZHMgaW50ZXJhY3RpdmUgY2hhcnRpbmcgdG8gYSBHcmlkLiBbQ2hhcnRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NoYXJ0L3dpZGdldC9DaGFydCkgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIHNlbGVjdGlvbiBvZiBHcmlkIGRhdGFcbiAgICAgKiBhbmQgdXBkYXRlZCBpbiByZWFsdGltZSBhcyBkYXRhIGNoYW5nZXMuIFN1cHBvcnRzIG1hbnkgY29tbW9uIGNoYXJ0IHR5cGVzIHdpdGggZXh0ZW5zaXZlIHN0eWxpbmcgYW5kIGN1c3RvbWl6YXRpb25cbiAgICAgKiBvcHRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DaGFydHMpXG4gICAgICovXG4gICAgY2hhcnRzRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENoYXJ0c3xDaGFydHNDb25maWdcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHRoZSBbYXV0b1dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbiNjb25maWctYXV0b1dpZHRoKSBjb25maWcgZm9yIGEgZ3JpZCdzIGNvbHVtbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtbkF1dG9XaWR0aClcbiAgICAgKi9cbiAgICBjb2x1bW5BdXRvV2lkdGhGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uQXV0b1dpZHRofENvbHVtbkF1dG9XaWR0aENvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgdG9vbGJhciB3aGlsZSBkcmFnZ2luZyBjb2x1bW4gaGVhZGVycy4gRHJvcCBvbiBhIGJ1dHRvbiBpbiB0aGUgdG9vbGJhciB0byBhY3RpdmF0ZSBhIGNlcnRhaW4gZnVuY3Rpb24sXG4gICAgICogZm9yIGV4YW1wbGUgdG8gZ3JvdXAgYnkgdGhhdCBjb2x1bW4uIFRoaXMgZmVhdHVyZSBzaW1wbGlmaWVzIGNlcnRhaW4gb3BlcmF0aW9ucyBvbiB0b3VjaCBkZXZpY2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Db2x1bW5EcmFnVG9vbGJhcilcbiAgICAgKi9cbiAgICBjb2x1bW5EcmFnVG9vbGJhckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5EcmFnVG9vbGJhcnxDb2x1bW5EcmFnVG9vbGJhckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgY29sdW1uIHBpY2tlciAodG8gc2hvdy9oaWRlIGNvbHVtbnMpIGluIHRoZSBoZWFkZXIgY29udGV4dCBtZW51LiBDb2x1bW5zIGNhbiBiZSBkaXNwbGF5ZWQgaW4gc3ViIG1lbnVzXG4gICAgICogYnkgcmVnaW9uIG9yIHRhZy4gR3JvdXBlZCBoZWFkZXJzIGFyZSBkaXNwbGF5ZWQgYXMgbWVudSBoaWVyYXJjaGllcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUGlja2VyKVxuICAgICAqL1xuICAgIGNvbHVtblBpY2tlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5QaWNrZXJ8Q29sdW1uUGlja2VyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzZXIgdG8gcmVuYW1lIGNvbHVtbnMgYnkgZWl0aGVyIHJpZ2h0LWNsaWNraW5nIGNvbHVtbiBoZWFkZXIgb3IgdXNpbmcga2V5Ym9hcmQgc2hvcnRjdXRzIHdoZW4gY29sdW1uIGhlYWRlclxuICAgICAqIGlzIGZvY3VzZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblJlbmFtZSlcbiAgICAgKi9cbiAgICBjb2x1bW5SZW5hbWVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVuYW1lfENvbHVtblJlbmFtZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIHJlb3JkZXIgY29sdW1ucyBieSBkcmFnZ2luZyBoZWFkZXJzLiBUbyBnZXQgbm90aWZpZWQgYWJvdXQgY29sdW1uIHJlb3JkZXIgbGlzdGVuIHRvIGBjaGFuZ2VgIGV2ZW50XG4gICAgICogb24gW2NvbHVtbnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9kYXRhL0NvbHVtblN0b3JlKSBzdG9yZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUmVvcmRlcilcbiAgICAgKi9cbiAgICBjb2x1bW5SZW9yZGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlb3JkZXJ8Q29sdW1uUmVvcmRlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdXNlciB0byByZXNpemUgY29sdW1ucyBieSBkcmFnZ2luZyBhIGhhbmRsZSBvbiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSBoZWFkZXIuIFRvIGdldCBub3RpZmllZCBhYm91dCBjb2x1bW5cbiAgICAgKiByZXNpemUgbGlzdGVuIHRvIGBjaGFuZ2VgIGV2ZW50IG9uIFtjb2x1bW5zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZGF0YS9Db2x1bW5TdG9yZSkgc3RvcmUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblJlc2l6ZSlcbiAgICAgKi9cbiAgICBjb2x1bW5SZXNpemVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVzaXplfENvbHVtblJlc2l6ZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgZmVhdHVyZSB0aGF0IGFsbG93cyBleHBvcnRpbmcgR3JpZCBkYXRhIHRvIEV4Y2VsIG9yIENTViB3aXRob3V0IGludm9sdmluZyB0aGUgc2VydmVyLiBJdCB1c2VzXG4gICAgICogW1RhYmxlRXhwb3J0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC91dGlsL1RhYmxlRXhwb3J0ZXIpIGNsYXNzIGFzIGRhdGEgcHJvdmlkZXIsIDNyZCBwYXJ0eSBwcm92aWRlciB0byBnZW5lcmF0ZSBYTFMgZmlsZXMsIGFuZFxuICAgICAqIFtNaWNyb3NvZnQgWE1MIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvb2ZmaWNlL2RvY3VtZW50Zm9ybWF0Lm9wZW54bWwuc3ByZWFkc2hlZXQuYXNweCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL2V4cGVyaW1lbnRhbC9FeGNlbEV4cG9ydGVyKVxuICAgICAqL1xuICAgIGV4Y2VsRXhwb3J0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZEV4Y2VsRXhwb3J0ZXJ8R3JpZEV4Y2VsRXhwb3J0ZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbiBleHBlcmltZW50YWwgZmVhdHVyZSB0aGF0IGxldHMgdXNlcnMgZHJvcCBmaWxlcyBvbiBhIFdpZGdldC4gVGhlIHdpZGdldCBmaXJlcyBhbiBldmVudCB3aGVuIGEgZmlsZSBpcyBkcm9wcGVkIG9udG8gaXQuXG4gICAgICogSW4gdGhlIGV2ZW50LCB5b3UgZ2V0IGFjY2VzcyB0byB0aGUgcmF3IGZpbGVzIGFzIHN0cmluZ3MsIHRoYXQgd2VyZSBwYXJzZWQgYnkgY2FsbGluZyBgcmVhZEFzQmluYXJ5U3RyaW5nYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwZXJpbWVudGFsL0ZpbGVEcm9wKVxuICAgICAqL1xuICAgIGZpbGVEcm9wRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGVEcm9wfEZpbGVEcm9wQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFkZHMgYSBmaWxsIGhhbmRsZSB0byBhIEdyaWQgcmFuZ2Ugc2VsZWN0aW9uLCB3aGljaCB3aGVuIGRyYWdnZWQsIGZpbGxzIHRoZSBjZWxscyBiZWluZyBkcmFnZ2VkIG92ZXJcbiAgICAgKiB3aXRoIHZhbHVlcyBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIHRoZSBvcmlnaW5hbCBzZWxlY3RlZCByYW5nZS4gVGhpcyBpcyBzaW1pbGFyIHRvIGZ1bmN0aW9uYWxpdHkgbm9ybWFsbHkgc2VlbiBpblxuICAgICAqIHZhcmlvdXMgc3ByZWFkc2hlZXQgYXBwbGljYXRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9GaWxsSGFuZGxlKVxuICAgICAqL1xuICAgIGZpbGxIYW5kbGVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RmlsbEhhbmRsZXxGaWxsSGFuZGxlQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdyaWQgYnkgc2V0dGluZ3MgZmlsdGVycyBvbiBjb2x1bW5zLiBUaGUgYWN0dWFsIGZpbHRlcmluZyBpcyBkb25lIGJ5IHRoZSBzdG9yZS5cbiAgICAgKiBGb3IgaW5mbyBvbiBwcm9ncmFtbWF0aWNhbGx5IGhhbmRsaW5nIGZpbHRlcnMsIHNlZSBbU3RvcmVGaWx0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1N0b3JlRmlsdGVyKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsdGVyKVxuICAgICAqL1xuICAgIGZpbHRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJ8RmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdyaWQgYnkgZW50ZXJpbmcgZmlsdGVycyBvbiBjb2x1bW4gaGVhZGVycy5cbiAgICAgKiBUaGUgYWN0dWFsIGZpbHRlcmluZyBpcyBkb25lIGJ5IHRoZSBzdG9yZS5cbiAgICAgKiBGb3IgaW5mbyBvbiBwcm9ncmFtbWF0aWNhbGx5IGhhbmRsaW5nIGZpbHRlcnMsIHNlZSBbU3RvcmVGaWx0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1N0b3JlRmlsdGVyKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsdGVyQmFyKVxuICAgICAqL1xuICAgIGZpbHRlckJhckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyByZW5kZXJpbmcgYW5kIGhhbmRsaW5nIG9mIHJvdyBncm91cHMuIFRoZSBhY3R1YWwgZ3JvdXBpbmcgaXMgZG9uZSBpbiB0aGUgc3RvcmUsIGJ1dCB0cmlnZ2VyZWQgYnlcbiAgICAgKiA8a2JkPnNoaWZ0PC9rYmQ+ICsgY2xpY2tpbmcgaGVhZGVycywgb3IgYnkgdXNpbmcgdGhlIGNvbnRleHQgbWVudSwgb3IgYnkgdXNpbmcgdHdvIGZpbmdlciB0YXAgKG9uZSBvbiBoZWFkZXIsXG4gICAgICogb25lIGFueXdoZXJlIG9uIGdyaWQpLiBVc2UgPGtiZD5zaGlmdDwva2JkPiArIDxrYmQ+YWx0PC9rYmQ+ICsgY2xpY2ssIG9yIHRoZSBjb250ZXh0IG1lbnUsIHRvIHJlbW92ZSBhIGNvbHVtblxuICAgICAqIGdyb3VwZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0dyb3VwKVxuICAgICAqL1xuICAgIGdyb3VwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyb3VwfEdyb3VwQ29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBzdW1tYXJ5IHJvdyBhcyBhIGdyb3VwIGZvb3RlciBpbiBhIGdyb3VwZWQgZ3JpZC4gVXNlcyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gY29sdW1ucyBhc1xuICAgICAqIFtTdW1tYXJ5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TdW1tYXJ5KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvR3JvdXBTdW1tYXJ5KVxuICAgICAqL1xuICAgIGdyb3VwU3VtbWFyeUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkR3JvdXBTdW1tYXJ5fEdyaWRHcm91cFN1bW1hcnlDb25maWdcbiAgICAvKipcbiAgICAgKiBSaWdodCBjbGljayBjb2x1bW4gaGVhZGVyIG9yIGZvY3VzIGl0IGFuZCBwcmVzcyBTUEFDRSBrZXkgdG8gc2hvdyB0aGUgY29udGV4dCBtZW51IGZvciBoZWFkZXJzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9IZWFkZXJNZW51KVxuICAgICAqL1xuICAgIGhlYWRlck1lbnVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8SGVhZGVyTWVudXxIZWFkZXJNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyByZWNvcmRzIHdoaWNoIHNhdGlzZnkgYSBjZXJ0YWluIGNvbmRpdGlvbiB0byBiZSBsb2NrZWQgYXQgdGhlIHRvcCBvZiB0aGUgZ3JpZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvTG9ja1Jvd3MpXG4gICAgICovXG4gICAgbG9ja1Jvd3NGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZExvY2tSb3dzfEdyaWRMb2NrUm93c0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBtZXJnZXMgY2VsbHMgdGhhdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGluIHNvcnRlZCAob3IgW29wdGlvbmFsbHldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL01lcmdlQ2VsbHMjY29uZmlnLXNvcnRlZE9ubHkpIGFueSkgY29sdW1uc1xuICAgICAqIGNvbmZpZ3VyZWQgdG8gW21lcmdlQ2VsbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9jb2x1bW4vQ29sdW1uI2NvbmZpZy1tZXJnZUNlbGxzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvTWVyZ2VDZWxscylcbiAgICAgKi9cbiAgICBtZXJnZUNlbGxzRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfE1lcmdlQ2VsbHN8TWVyZ2VDZWxsc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBQREYvUE5HIGZpbGVzIGZyb20gdGhlIEdyaWQgY29tcG9uZW50LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9leHBvcnQvUGRmRXhwb3J0KVxuICAgICAqL1xuICAgIHBkZkV4cG9ydEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkUGRmRXhwb3J0fEdyaWRQZGZFeHBvcnRDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgcGlubmluZyBjb2x1bW5zIHRvIHRoZSBzdGFydCBvciBlbmQgcmVnaW9uIG9mIHRoZSBncmlkIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc3ViR3JpZCBjb25maWd1cmF0aW9ucy5cbiAgICAgKiBXaGVuIHBpbm5pbmcgdG8gYSByZWdpb24gdGhhdCBkb2VzIG5vdCB5ZXQgZXhpc3QsIHRoZSBmZWF0dXJlIGNyZWF0ZXMgdGhlIHJlcXVpcmVkIHN1YkdyaWQgb24gdGhlIGZseS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUGluQ29sdW1ucylcbiAgICAgKi9cbiAgICBwaW5Db2x1bW5zRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBpbkNvbHVtbnN8UGluQ29sdW1uc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyBwcmludGluZyBHcmlkIGNvbnRlbnRzIHVzaW5nIGJyb3dzZXIgcHJpbnQgZGlhbG9nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9leHBvcnQvR3JpZFByaW50KVxuICAgICAqL1xuICAgIHByaW50RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRQcmludHxHcmlkUHJpbnRDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvIHNlYXJjaCBpbiBhIGNvbHVtbiBieSBmb2N1c2luZyBhIGNlbGwgYW5kIHR5cGluZy4gTmF2aWdhdGUgYmV0d2VlbiBoaXRzIHVzaW5nIHRoZVxuICAgICAqIGtleWJvYXJkLCBbZjNdIG9yIFtjdHJsXS9bY21kXSArIFtnXSBtb3ZlcyB0byBuZXh0LCBhbHNvIHByZXNzaW5nIFtzaGlmdF0gbW92ZXMgdG8gcHJldmlvdXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1F1aWNrRmluZClcbiAgICAgKi9cbiAgICBxdWlja0ZpbmRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UXVpY2tGaW5kfFF1aWNrRmluZENvbmZpZ1xuICAgIC8qKlxuICAgICAqIE1ha2VzIHRoZSBzcGxpdHRlciBiZXR3ZWVuIGdyaWQgW3NlY3Rpb25zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvdmlldy9TdWJHcmlkKSBkcmFnZ2FibGUsIHRvIGxldCB1c2VycyByZXNpemUsIGFuZFxuICAgICAqIGNvbGxhcHNlL2V4cGFuZCB0aGUgc2VjdGlvbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1JlZ2lvblJlc2l6ZSlcbiAgICAgKi9cbiAgICByZWdpb25SZXNpemVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8UmVnaW9uUmVzaXplfFJlZ2lvblJlc2l6ZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93IHVzaW5nIFtDdHJsL0NNRCArIEMvWF0gYW5kIFtDdHJsL0NNRCArIFZdIHRvIGNvcHkvY3V0LWFuZC1wYXN0ZSByb3dzLiBBbHNvIG1ha2VzIGN1dCwgY29weSBhbmQgcGFzdGUgYWN0aW9uc1xuICAgICAqIGF2YWlsYWJsZSB2aWEgdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dDb3B5UGFzdGUpXG4gICAgICovXG4gICAgcm93Q29weVBhc3RlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0NvcHlQYXN0ZXxSb3dDb3B5UGFzdGVDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgYWxsb3dzIGVkaXRpbmcgb2YgZW50aXJlIHJvd3MgaW4gYSBncmlkIGluIGEgZG9ja2VkIHBhbmVsIHdoaWNoIGJ5IGRlZmF1bHQgc2xpZGVzIG91dCBmcm9tIHRoZSByaWdodC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93RWRpdClcbiAgICAgKi9cbiAgICByb3dFZGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0VkaXR8Um93RWRpdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgZXhwYW5kaW5nIG9mIEdyaWQgcm93cyBieSBlaXRoZXIgcm93IGNsaWNrIG9yIGRvdWJsZSBjbGljaywgb3IgYnkgYWRkaW5nIGEgc2VwYXJhdGUgR3JpZCBjb2x1bW4gd2hpY2ggcmVuZGVyc1xuICAgICAqIGEgYnV0dG9uIHRoYXQgZXhwYW5kcyBvciBjb2xsYXBzZXMgdGhlIHJvdy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93RXhwYW5kZXIpXG4gICAgICovXG4gICAgcm93RXhwYW5kZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93RXhwYW5kZXJ8Um93RXhwYW5kZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgdXNlciB0byByZW9yZGVyIHJvd3MgYnkgZHJhZ2dpbmcgdGhlbS4gVG8gZ2V0IG5vdGlmaWVkIGFib3V0IHJvdyByZW9yZGVyIGxpc3RlbiB0byBgY2hhbmdlYCBldmVudFxuICAgICAqIG9uIHRoZSBncmlkIFtzdG9yZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL2RhdGEvU3RvcmUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dSZW9yZGVyKVxuICAgICAqL1xuICAgIHJvd1Jlb3JkZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZFJvd1Jlb3JkZXJ8R3JpZFJvd1Jlb3JkZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHVzZXIgdG8gY2hhbmdlIHJvdyBoZWlnaHQgYnkgZHJhZ2dpbmcgdGhlIGJvdHRvbSByb3cgYm9yZGVyLiBBZnRlciBhIHJlc2l6ZSBvcGVyYXRpb24sIHRoZSBbcm93SGVpZ2h0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZGF0YS9HcmlkUm93TW9kZWwjZmllbGQtcm93SGVpZ2h0KVxuICAgICAqIGZpZWxkIG9mIHRoZSByZWNvcmQgaXMgdXBkYXRlZCAod2hlbiBbYXBwbHlUb0FsbFJvd3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1Jvd1Jlc2l6ZSNjb25maWctYXBwbHlUb0FsbFJvd3MpIGlzIGBmYWxzZWApLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dSZXNpemUpXG4gICAgICovXG4gICAgcm93UmVzaXplRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRSb3dSZXNpemV8R3JpZFJvd1Jlc2l6ZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIDxkaXYgY2xhc3M9XCJleHRlcm5hbC1leGFtcGxlIHZlcnRpY2FsXCIgZGF0YS1maWxlPVwiR3JpZC9mZWF0dXJlL1NlYXJjaC5qc1wiPjwvZGl2PlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TZWFyY2gpXG4gICAgICovXG4gICAgc2VhcmNoRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNlYXJjaHxTZWFyY2hDb25maWdcbiAgICAvKipcbiAgICAgKiBBbGxvd3Mgc29ydGluZyBvZiBncmlkIGJ5IGNsaWNraW5nIChvciB0YXBwaW5nKSBoZWFkZXJzLCBhbHNvIGRpc3BsYXlzIHdoaWNoIGNvbHVtbnMgZ3JpZCBpcyBzb3J0ZWQgYnkgKG51bWJlcmVkIGlmXG4gICAgICogdXNpbmcgbXVsdGlzb3J0KS4gVXNlIG1vZGlmaWVyIGtleXMgZm9yIG11bHRpc29ydGluZzogW0N0cmwvQ01EICsgY2xpY2tdIHRvIGFkZCBzb3J0ZXIsIFtDdHJsL0NNRCArIEFsdCArIGNsaWNrXSB0byByZW1vdmUgc29ydGVyLlxuICAgICAqIFRoZSBhY3R1YWwgc29ydGluZyBpcyBkb25lIGJ5IHRoZSBzdG9yZSwgc2VlIFtTdG9yZS5zb3J0KCldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1N0b3JlU29ydCNmdW5jdGlvbi1zb3J0KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU29ydClcbiAgICAgKi9cbiAgICBzb3J0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNvcnR8U29ydENvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBhbGxvd3Mgc3BsaXR0aW5nIHRoZSBHcmlkIGludG8gbXVsdGlwbGUgdmlld3MsIGVpdGhlciBieSB1c2luZyB0aGUgY2VsbCBjb250ZXh0IG1lbnUsIG9yXG4gICAgICogcHJvZ3JhbW1hdGljYWxseSBieSBjYWxsaW5nIFtzcGxpdCgpXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TcGxpdCNmdW5jdGlvbi1zcGxpdCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1NwbGl0KVxuICAgICAqL1xuICAgIHNwbGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRTcGxpdHxHcmlkU3BsaXRDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgd2hpY2ggcGlucyBjb25maWd1cmFibGUgY29udGVudCBmcm9tIGEgZ3JpZCByb3cgdG8gdGhlIHRvcCBvZiB0aGUgZ3JpZFxuICAgICAqIHdoaWxlIHRoZSByb3cgc2Nyb2xscyBvZmYgdGhlIHRvcCBidXQgaXMgc3RpbGwgdmlzaWJsZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3RpY2t5Q2VsbHMpXG4gICAgICovXG4gICAgc3RpY2t5Q2VsbHNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3RpY2t5Q2VsbHN8U3RpY2t5Q2VsbHNDb25maWdcbiAgICAvKipcbiAgICAgKiBTdHJpcGVzIHJvd3MgYnkgYWRkaW5nIGFsdGVybmF0aW5nIENTUyBjbGFzc2VzIHRvIGFsbCByb3cgZWxlbWVudHMgKGBiLWV2ZW5gIGFuZCBgYi1vZGRgKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3RyaXBlKVxuICAgICAqL1xuICAgIHN0cmlwZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdHJpcGV8U3RyaXBlQ29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBzdW1tYXJ5IHJvdyBpbiB0aGUgZ3JpZCBmb290ZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1N1bW1hcnkpXG4gICAgICovXG4gICAgc3VtbWFyeUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkU3VtbWFyeXxHcmlkU3VtbWFyeUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgdGhhdCBtYWtlcyB0aGUgZ3JpZCB3b3JrIG1vcmUgbGlrZSBhIHRyZWUuIEluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gW1RyZWVHcmlkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvdmlldy9UcmVlR3JpZCkuIFJlcXVpcmVzXG4gICAgICogZXhhY3RseSBvbmUgW1RyZWVDb2x1bW5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9jb2x1bW4vVHJlZUNvbHVtbikgYW1vbmcgZ3JpZHMgY29sdW1ucy4gVGhhdCBjb2x1bW4gd2lsbCBoYXZlIGl0cyByZW5kZXJlciByZXBsYWNlZCB3aXRoIGFcbiAgICAgKiB0cmVlIHJlbmRlcmVyIHRoYXQgYWRkcyBwYWRkaW5nIGFuZCBpY29uIHRvIGdpdmUgdGhlIGFwcGVhcmFuY2Ugb2YgYSB0cmVlLiBUaGUgb3JpZ2luYWwgcmVuZGVyZXIgaXMgcHJlc2VydmVkIGFuZFxuICAgICAqIGFsc28gY2FsbGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9UcmVlKVxuICAgICAqL1xuICAgIHRyZWVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VHJlZXxUcmVlQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBmZWF0dXJlIHRoYXQgYWxsb3dzIHRyYW5zZm9ybWluZyBhIGZsYXQgZGF0YXNldCAob3IgdGhlIGxlYXZlcyBvZiBhIGhpZXJhcmNoaWNhbCkgaW50byBhIHRyZWUgYnkgc3BlY2lmeWluZyBhXG4gICAgICogcmVjb3JkIGZpZWxkIHBlciBwYXJlbnQgbGV2ZWwuIFBhcmVudHMgYXJlIGdlbmVyYXRlZCBiYXNlZCBvbiBlYWNoIGxlYWYncyB2YWx1ZSBmb3IgdGhvc2UgZmllbGRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9UcmVlR3JvdXApXG4gICAgICovXG4gICAgdHJlZUdyb3VwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRyZWVHcm91cHxUcmVlR3JvdXBDb25maWdcblxufVxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvciA6ICdicnludHVtLWV2ZW50LWxpc3QnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bUV2ZW50TGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VDbGFzcyA9IEV2ZW50TGlzdDtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5zdGFuY2VOYW1lID0gJ0V2ZW50TGlzdCc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlQXV0b0NyZWF0ZScsXG4gICAgICAgICdvbkJlZm9yZUNhbmNlbENlbGxFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlQ2FuY2VsUm93RWRpdCcsXG4gICAgICAgICdvbkJlZm9yZUNlbGxFZGl0U3RhcnQnLFxuICAgICAgICAnb25CZWZvcmVDZWxsUmFuZ2VEZWxldGUnLFxuICAgICAgICAnb25CZWZvcmVDZWxsUmFuZ2VFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlQ2hhbmdlRGF0ZScsXG4gICAgICAgICdvbkJlZm9yZUNvbHVtbkRyYWdTdGFydCcsXG4gICAgICAgICdvbkJlZm9yZUNvbHVtbkRyb3BGaW5hbGl6ZScsXG4gICAgICAgICdvbkJlZm9yZUNvbHVtblJlc2l6ZScsXG4gICAgICAgICdvbkJlZm9yZUNvcHknLFxuICAgICAgICAnb25CZWZvcmVDU1ZFeHBvcnQnLFxuICAgICAgICAnb25CZWZvcmVEZXN0cm95JyxcbiAgICAgICAgJ29uQmVmb3JlRXhjZWxFeHBvcnQnLFxuICAgICAgICAnb25CZWZvcmVGaWxsSGFuZGxlRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uQmVmb3JlRmluaXNoQ2VsbEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVGaW5pc2hSb3dFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlSGlkZScsXG4gICAgICAgICdvbkJlZm9yZVBhc3RlJyxcbiAgICAgICAgJ29uQmVmb3JlUGRmRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlUmVuZGVyUm93JyxcbiAgICAgICAgJ29uQmVmb3JlUmVuZGVyUm93cycsXG4gICAgICAgICdvbkJlZm9yZVJlc3BvbnNpdmVTdGF0ZUNoYW5nZScsXG4gICAgICAgICdvbkJlZm9yZVJvd0NvbGxhcHNlJyxcbiAgICAgICAgJ29uQmVmb3JlUm93RXhwYW5kJyxcbiAgICAgICAgJ29uQmVmb3JlU2VsZWN0aW9uQ2hhbmdlJyxcbiAgICAgICAgJ29uQmVmb3JlU2V0UmVjb3JkJyxcbiAgICAgICAgJ29uQmVmb3JlU2hvdycsXG4gICAgICAgICdvbkJlZm9yZVN0YXJ0Um93RWRpdCcsXG4gICAgICAgICdvbkJlZm9yZVN0YXRlQXBwbHknLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZVNhdmUnLFxuICAgICAgICAnb25CZWZvcmVUb2dnbGVHcm91cCcsXG4gICAgICAgICdvbkJlZm9yZVRvZ2dsZU5vZGUnLFxuICAgICAgICAnb25DYW5jZWxDZWxsRWRpdCcsXG4gICAgICAgICdvbkNhdGNoQWxsJyxcbiAgICAgICAgJ29uQ2VsbENsaWNrJyxcbiAgICAgICAgJ29uQ2VsbENvbnRleHRNZW51JyxcbiAgICAgICAgJ29uQ2VsbERibENsaWNrJyxcbiAgICAgICAgJ29uQ2VsbE1hcFBvcHVsYXRlZCcsXG4gICAgICAgICdvbkNlbGxNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkNlbGxNZW51SXRlbScsXG4gICAgICAgICdvbkNlbGxNZW51U2hvdycsXG4gICAgICAgICdvbkNlbGxNZW51VG9nZ2xlSXRlbScsXG4gICAgICAgICdvbkNlbGxNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uQ2VsbE1vdXNlTGVhdmUnLFxuICAgICAgICAnb25DZWxsTW91c2VPdXQnLFxuICAgICAgICAnb25DZWxsTW91c2VPdmVyJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25Db2xsYXBzZU5vZGUnLFxuICAgICAgICAnb25Db2x1bW5EcmFnJyxcbiAgICAgICAgJ29uQ29sdW1uRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uQ29sdW1uRHJvcCcsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZScsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZVN0YXJ0JyxcbiAgICAgICAgJ29uQ29udGV4dE1lbnVJdGVtJyxcbiAgICAgICAgJ29uQ29udGV4dE1lbnVUb2dnbGVJdGVtJyxcbiAgICAgICAgJ29uQ29weScsXG4gICAgICAgICdvbkRhdGFDaGFuZ2UnLFxuICAgICAgICAnb25EYXlDZWxsUG9wdWxhdGVkJyxcbiAgICAgICAgJ29uRGVzdHJveScsXG4gICAgICAgICdvbkRpcnR5U3RhdGVDaGFuZ2UnLFxuICAgICAgICAnb25EcmFnU2VsZWN0aW5nJyxcbiAgICAgICAgJ29uRWxlbWVudENyZWF0ZWQnLFxuICAgICAgICAnb25FdmVudEF1dG9DcmVhdGVkJyxcbiAgICAgICAgJ29uRXZlbnRQcm9wYWdhdGUnLFxuICAgICAgICAnb25FeHBhbmQnLFxuICAgICAgICAnb25FeHBhbmROb2RlJyxcbiAgICAgICAgJ29uRmlsZURyb3AnLFxuICAgICAgICAnb25GaWxsSGFuZGxlQmVmb3JlRHJhZ0ZpbmFsaXplJyxcbiAgICAgICAgJ29uRmlsbEhhbmRsZURyYWcnLFxuICAgICAgICAnb25GaWxsSGFuZGxlRHJhZ0Fib3J0JyxcbiAgICAgICAgJ29uRmlsbEhhbmRsZURyYWdFbmQnLFxuICAgICAgICAnb25GaWxsSGFuZGxlRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uRmluaXNoQ2VsbEVkaXQnLFxuICAgICAgICAnb25GaW5pc2hSb3dFZGl0JyxcbiAgICAgICAgJ29uRm9jdXNJbicsXG4gICAgICAgICdvbkZvY3VzT3V0JyxcbiAgICAgICAgJ29uR3JpZFJvd0JlZm9yZURyYWdTdGFydCcsXG4gICAgICAgICdvbkdyaWRSb3dCZWZvcmVEcm9wRmluYWxpemUnLFxuICAgICAgICAnb25HcmlkUm93RHJhZycsXG4gICAgICAgICdvbkdyaWRSb3dEcmFnQWJvcnQnLFxuICAgICAgICAnb25HcmlkUm93RHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uR3JpZFJvd0Ryb3AnLFxuICAgICAgICAnb25IZWFkZXJDbGljaycsXG4gICAgICAgICdvbkhlYWRlck1lbnVCZWZvcmVTaG93JyxcbiAgICAgICAgJ29uSGVhZGVyTWVudUl0ZW0nLFxuICAgICAgICAnb25IZWFkZXJNZW51U2hvdycsXG4gICAgICAgICdvbkhlYWRlck1lbnVUb2dnbGVJdGVtJyxcbiAgICAgICAgJ29uSGlkZScsXG4gICAgICAgICdvbkxvY2tSb3dzJyxcbiAgICAgICAgJ29uTW91c2VPdXQnLFxuICAgICAgICAnb25Nb3VzZU92ZXInLFxuICAgICAgICAnb25QYWludCcsXG4gICAgICAgICdvblBhc3RlJyxcbiAgICAgICAgJ29uUGRmRXhwb3J0JyxcbiAgICAgICAgJ29uUmFuZ2VDaGFuZ2UnLFxuICAgICAgICAnb25SZWFkT25seScsXG4gICAgICAgICdvblJlY29tcG9zZScsXG4gICAgICAgICdvblJlbmRlclJvdycsXG4gICAgICAgICdvblJlbmRlclJvd3MnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25SZXNwb25zaXZlJyxcbiAgICAgICAgJ29uUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlJyxcbiAgICAgICAgJ29uUm93Q29sbGFwc2UnLFxuICAgICAgICAnb25Sb3dFeHBhbmQnLFxuICAgICAgICAnb25Sb3dNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uUm93TW91c2VMZWF2ZScsXG4gICAgICAgICdvblNjcm9sbCcsXG4gICAgICAgICdvblNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAgICdvblNlbGVjdGlvbk1vZGVDaGFuZ2UnLFxuICAgICAgICAnb25TaGlmdEluY3JlbWVudENoYW5nZScsXG4gICAgICAgICdvblNob3cnLFxuICAgICAgICAnb25TcGxpdCcsXG4gICAgICAgICdvblNwbGl0dGVyQ29sbGFwc2VDbGljaycsXG4gICAgICAgICdvblNwbGl0dGVyRHJhZ0VuZCcsXG4gICAgICAgICdvblNwbGl0dGVyRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uU3BsaXR0ZXJFeHBhbmRDbGljaycsXG4gICAgICAgICdvblN0YXJ0Q2VsbEVkaXQnLFxuICAgICAgICAnb25TdGFydFJvd0VkaXQnLFxuICAgICAgICAnb25TdWJHcmlkQ29sbGFwc2UnLFxuICAgICAgICAnb25TdWJHcmlkRXhwYW5kJyxcbiAgICAgICAgJ29uVG9nZ2xlR3JvdXAnLFxuICAgICAgICAnb25Ub2dnbGVOb2RlJyxcbiAgICAgICAgJ29uVG9vbENsaWNrJyxcbiAgICAgICAgJ29uVW5sb2NrUm93cycsXG4gICAgICAgICdvblVuc3BsaXQnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1GZWF0dXJlTmFtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAnYWlGaWx0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2NlbGxDb3B5UGFzdGVGZWF0dXJlJyxcbiAgICAgICAgJ2NlbGxFZGl0RmVhdHVyZScsXG4gICAgICAgICdjZWxsTWVudUZlYXR1cmUnLFxuICAgICAgICAnY2VsbFRvb2x0aXBGZWF0dXJlJyxcbiAgICAgICAgJ2NoYXJ0c0ZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uQXV0b1dpZHRoRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5EcmFnVG9vbGJhckZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uUGlja2VyRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZW5hbWVGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblJlb3JkZXJGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblJlc2l6ZUZlYXR1cmUnLFxuICAgICAgICAnZXhjZWxFeHBvcnRlckZlYXR1cmUnLFxuICAgICAgICAnZmlsZURyb3BGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbGxIYW5kbGVGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbHRlckZlYXR1cmUnLFxuICAgICAgICAnZmlsdGVyQmFyRmVhdHVyZScsXG4gICAgICAgICdncm91cEZlYXR1cmUnLFxuICAgICAgICAnZ3JvdXBTdW1tYXJ5RmVhdHVyZScsXG4gICAgICAgICdoZWFkZXJNZW51RmVhdHVyZScsXG4gICAgICAgICdsb2NrUm93c0ZlYXR1cmUnLFxuICAgICAgICAnbWVyZ2VDZWxsc0ZlYXR1cmUnLFxuICAgICAgICAncGRmRXhwb3J0RmVhdHVyZScsXG4gICAgICAgICdwaW5Db2x1bW5zRmVhdHVyZScsXG4gICAgICAgICdwcmludEZlYXR1cmUnLFxuICAgICAgICAncXVpY2tGaW5kRmVhdHVyZScsXG4gICAgICAgICdyZWdpb25SZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd0NvcHlQYXN0ZUZlYXR1cmUnLFxuICAgICAgICAncm93RWRpdEZlYXR1cmUnLFxuICAgICAgICAncm93RXhwYW5kZXJGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd1Jlb3JkZXJGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd1Jlc2l6ZUZlYXR1cmUnLFxuICAgICAgICAnc2VhcmNoRmVhdHVyZScsXG4gICAgICAgICdzb3J0RmVhdHVyZScsXG4gICAgICAgICdzcGxpdEZlYXR1cmUnLFxuICAgICAgICAnc3RpY2t5Q2VsbHNGZWF0dXJlJyxcbiAgICAgICAgJ3N0cmlwZUZlYXR1cmUnLFxuICAgICAgICAnc3VtbWFyeUZlYXR1cmUnLFxuICAgICAgICAndHJlZUZlYXR1cmUnLFxuICAgICAgICAndHJlZUdyb3VwRmVhdHVyZSdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3M6IHN0cmluZ1tdID0gQnJ5bnR1bUV2ZW50TGlzdENvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhY3RpdmF0aW9uS2V5JyxcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FsaWduU2VsZicsXG4gICAgICAgICdhbGxvd0RyYWdDcmVhdGUnLFxuICAgICAgICAnYWxsb3dEcmFnTW92ZScsXG4gICAgICAgICdhbGxvd0RyYWdSZXNpemUnLFxuICAgICAgICAnYW5pbWF0ZUZpbHRlclJlbW92YWxzJyxcbiAgICAgICAgJ2FuaW1hdGVSZW1vdmluZ1Jvd3MnLFxuICAgICAgICAnYW5pbWF0ZVRpbWVTaGlmdCcsXG4gICAgICAgICdhbmltYXRlVHJlZU5vZGVUb2dnbGUnLFxuICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvQ3JlYXRlJyxcbiAgICAgICAgJ2F1dG9IZWlnaHQnLFxuICAgICAgICAnYmJhcicsXG4gICAgICAgICdib2R5Q2xzJyxcbiAgICAgICAgJ2J1YmJsZUV2ZW50cycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NlbGxFbGxpcHNpcycsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb2x1bW5MaW5lcycsXG4gICAgICAgICdjb2x1bW5zJyxcbiAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICdjb250ZW50RWxlbWVudENscycsXG4gICAgICAgICdjb250ZXh0TWVudVRyaWdnZXJFdmVudCcsXG4gICAgICAgICdkYXRhJyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RhdGUnLFxuICAgICAgICAnZGF0ZUZvcm1hdCcsXG4gICAgICAgICdkYXRlU2VwYXJhdG9yJyxcbiAgICAgICAgJ2RlZmF1bHRSZWdpb24nLFxuICAgICAgICAnZGVmYXVsdFNjcm9sbE9wdGlvbnMnLFxuICAgICAgICAnZGVzY3JpcHRpb25Gb3JtYXQnLFxuICAgICAgICAnZGVzY3JpcHRpb25SZW5kZXJlcicsXG4gICAgICAgICdkZXN0cm95U3RvcmUnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkaXNhYmxlR3JpZENvbHVtbklkV2FybmluZycsXG4gICAgICAgICdkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZycsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYWdVbml0JyxcbiAgICAgICAgJ2RyYXdlcicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAnZW5hYmxlU3RpY2t5JyxcbiAgICAgICAgJ2VuYWJsZVRleHRTZWxlY3Rpb24nLFxuICAgICAgICAnZW5hYmxlVW5kb1JlZG9LZXlzJyxcbiAgICAgICAgJ2VuZERhdGUnLFxuICAgICAgICAnZXZlbnRGaWx0ZXInLFxuICAgICAgICAnZXZlbnRIZWFkZXJSZW5kZXJlcicsXG4gICAgICAgICdldmVudEhlaWdodCcsXG4gICAgICAgICdldmVudExpc3RUaW1lRm9ybWF0JyxcbiAgICAgICAgJ2V2ZW50UmVuZGVyZXInLFxuICAgICAgICAnZXZlbnRTb3J0ZXInLFxuICAgICAgICAnZXZlbnRUaW1lUmVuZGVyZXInLFxuICAgICAgICAnZXh0ZW5kQWxsRGF5RW5kRGF5JyxcbiAgICAgICAgJ2V4dHJhRGF0YScsXG4gICAgICAgICdmaWxsTGFzdENvbHVtbicsXG4gICAgICAgICdmaWx0ZXJFdmVudFJlc291cmNlcycsXG4gICAgICAgICdmaXhlZER1cmF0aW9uJyxcbiAgICAgICAgJ2ZpeGVkUm93SGVpZ2h0JyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ2Zvcm11bGFQcm92aWRlcnMnLFxuICAgICAgICAnZnVsbFJvd1JlZnJlc2gnLFxuICAgICAgICAnZ2V0UHJpbWFyeVJlc291cmNlJyxcbiAgICAgICAgJ2dldFJvd0hlaWdodCcsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlRm9vdGVycycsXG4gICAgICAgICdoaWRlSGVhZGVycycsXG4gICAgICAgICdoaWRlSG9yaXpvbnRhbFNjcm9sbGJhcicsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaG92ZXJDbHMnLFxuICAgICAgICAnaWNvbicsXG4gICAgICAgICdpZCcsXG4gICAgICAgICdpZ25vcmVQYXJlbnRSZWFkT25seScsXG4gICAgICAgICdpbnB1dEZpZWxkQWxpZ24nLFxuICAgICAgICAnaW5zZXJ0QmVmb3JlJyxcbiAgICAgICAgJ2luc2VydEZpcnN0JyxcbiAgICAgICAgJ2tleU1hcCcsXG4gICAgICAgICdsYWJlbFBvc2l0aW9uJyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsaXN0UmFuZ2VNZW51JyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb25nUHJlc3NUaW1lJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21pbkRhdGUnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnbm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnb3duZXInLFxuICAgICAgICAncGFzdEV2ZW50Q2xzJyxcbiAgICAgICAgJ3BsdWdpbnMnLFxuICAgICAgICAncHJlc2VydmVGb2N1c09uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbCcsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbE9uRGF0YXNldENoYW5nZScsXG4gICAgICAgICdwcmV2ZW50VG9vbHRpcE9uVG91Y2gnLFxuICAgICAgICAncmFuZ2UnLFxuICAgICAgICAncmVhZE9ubHknLFxuICAgICAgICAncmVsYXlTdG9yZUV2ZW50cycsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncmVzaXphYmxlJyxcbiAgICAgICAgJ3Jlc2l6ZVRvRml0SW5jbHVkZXNIZWFkZXInLFxuICAgICAgICAncmVzb3VyY2VJbWFnZVBhdGgnLFxuICAgICAgICAncmVzcG9uc2l2ZScsXG4gICAgICAgICdyZXNwb25zaXZlTGV2ZWxzJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVSb290JyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVTdGF0ZScsXG4gICAgICAgICdyZXNwb25zaXZlVGFyZ2V0JyxcbiAgICAgICAgJ3JpcHBsZScsXG4gICAgICAgICdyb290RWxlbWVudCcsXG4gICAgICAgICdyb3dIZWlnaHQnLFxuICAgICAgICAncm93TGluZXMnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2Nyb2xsZXJDbGFzcycsXG4gICAgICAgICdzY3JvbGxNYW5hZ2VyJyxcbiAgICAgICAgJ3NlbGVjdGlvbk1vZGUnLFxuICAgICAgICAnc2VsZWN0b3JCdXR0b24nLFxuICAgICAgICAnc2VsZWN0b3JNZW51SXRlbScsXG4gICAgICAgICdzaGlmdEluY3JlbWVudCcsXG4gICAgICAgICdzaG9ydERhdGVGb3JtYXQnLFxuICAgICAgICAnc2hvcnREYXRlVGltZUZvcm1hdCcsXG4gICAgICAgICdzaG9ydEV2ZW50Q2xzJyxcbiAgICAgICAgJ3Nob3J0RXZlbnREdXJhdGlvbicsXG4gICAgICAgICdzaG93QnVsbGV0JyxcbiAgICAgICAgJ3Nob3dEaXJ0eScsXG4gICAgICAgICdzaG93UmVzb3VyY2VBdmF0YXJzJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhY2tNdWx0aURheUV2ZW50cycsXG4gICAgICAgICdzdGFydERhdGUnLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0YXRlU2V0dGluZ3MnLFxuICAgICAgICAnc3RvcmUnLFxuICAgICAgICAnc3RyaXBzJyxcbiAgICAgICAgJ3N1YkdyaWRDb25maWdzJyxcbiAgICAgICAgJ3N5bmNDYWxlbmRhckRhdGUnLFxuICAgICAgICAnc3luY01hc2snLFxuICAgICAgICAnc3luY1ZpZXdEYXRlJyxcbiAgICAgICAgJ3RhYicsXG4gICAgICAgICd0YWJCYXJJdGVtcycsXG4gICAgICAgICd0YmFyJyxcbiAgICAgICAgJ3RpbWVGb3JtYXQnLFxuICAgICAgICAndGl0bGUnLFxuICAgICAgICAndG9vbHMnLFxuICAgICAgICAndHJhbnNpdGlvbicsXG4gICAgICAgICd0cmFuc2l0aW9uRHVyYXRpb24nLFxuICAgICAgICAndHlwZScsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWVrU3RhcnREYXknLFxuICAgICAgICAnd2VpZ2h0JyxcbiAgICAgICAgJ3dpZHRoJ1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FjdGl2YXRpb25LZXknLFxuICAgICAgICAnYWRvcHQnLFxuICAgICAgICAnYW5pbWF0ZUZpbHRlclJlbW92YWxzJyxcbiAgICAgICAgJ2FuaW1hdGVSZW1vdmluZ1Jvd3MnLFxuICAgICAgICAnYXJpYURlc2NyaXB0aW9uJyxcbiAgICAgICAgJ2FyaWFMYWJlbCcsXG4gICAgICAgICdhdXRvSGVpZ2h0JyxcbiAgICAgICAgJ2JiYXInLFxuICAgICAgICAnYm9keUNscycsXG4gICAgICAgICdidWJibGVFdmVudHMnLFxuICAgICAgICAnY29sbGFwc2libGUnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2NvbnRleHRNZW51VHJpZ2dlckV2ZW50JyxcbiAgICAgICAgJ2RhdGFGaWVsZCcsXG4gICAgICAgICdkZWZhdWx0UmVnaW9uJyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uUmVuZGVyZXInLFxuICAgICAgICAnZGVzdHJveVN0b3JlJyxcbiAgICAgICAgJ2RldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMnLFxuICAgICAgICAnZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcnLFxuICAgICAgICAnZGlzYWJsZUdyaWRSb3dNb2RlbFdhcm5pbmcnLFxuICAgICAgICAnZG9jaycsXG4gICAgICAgICdkcmF3ZXInLFxuICAgICAgICAnZWxlbWVudEF0dHJpYnV0ZXMnLFxuICAgICAgICAnZW5hYmxlU3RpY2t5JyxcbiAgICAgICAgJ2VuYWJsZVRleHRTZWxlY3Rpb24nLFxuICAgICAgICAnZW5kRGF0ZScsXG4gICAgICAgICdldmVudEZpbHRlcicsXG4gICAgICAgICdldmVudEhlYWRlclJlbmRlcmVyJyxcbiAgICAgICAgJ2V2ZW50SGVpZ2h0JyxcbiAgICAgICAgJ2V2ZW50TGlzdFRpbWVGb3JtYXQnLFxuICAgICAgICAnZXZlbnRSZW5kZXJlcicsXG4gICAgICAgICdldmVudFNvcnRlcicsXG4gICAgICAgICdmaWxsTGFzdENvbHVtbicsXG4gICAgICAgICdmaXhlZFJvd0hlaWdodCcsXG4gICAgICAgICdmb290ZXInLFxuICAgICAgICAnZm9ybXVsYVByb3ZpZGVycycsXG4gICAgICAgICdmdWxsUm93UmVmcmVzaCcsXG4gICAgICAgICdnZXRQcmltYXJ5UmVzb3VyY2UnLFxuICAgICAgICAnZ2V0Um93SGVpZ2h0JyxcbiAgICAgICAgJ2hlYWRlcicsXG4gICAgICAgICdoaWRlSG9yaXpvbnRhbFNjcm9sbGJhcicsXG4gICAgICAgICdob3ZlckNscycsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2xpc3RlbmVycycsXG4gICAgICAgICdsaXN0UmFuZ2VNZW51JyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnb3duZXInLFxuICAgICAgICAncGx1Z2lucycsXG4gICAgICAgICdwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ3ByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ3ByZXZlbnRUb29sdGlwT25Ub3VjaCcsXG4gICAgICAgICdyZWxheVN0b3JlRXZlbnRzJyxcbiAgICAgICAgJ3Jlc2l6YWJsZScsXG4gICAgICAgICdyZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyJyxcbiAgICAgICAgJ3Jlc291cmNlSW1hZ2VQYXRoJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmUnLFxuICAgICAgICAncmVzcG9uc2l2ZUxldmVscycsXG4gICAgICAgICdyZXNwb25zaXZlUm9vdCcsXG4gICAgICAgICdyZXNwb25zaXZlU3RhdGUnLFxuICAgICAgICAncmVzcG9uc2l2ZVRhcmdldCcsXG4gICAgICAgICdyaXBwbGUnLFxuICAgICAgICAncm9vdEVsZW1lbnQnLFxuICAgICAgICAnc2Nyb2xsZXJDbGFzcycsXG4gICAgICAgICdzY3JvbGxNYW5hZ2VyJyxcbiAgICAgICAgJ3NlbGVjdG9yQnV0dG9uJyxcbiAgICAgICAgJ3NlbGVjdG9yTWVudUl0ZW0nLFxuICAgICAgICAnc2hvcnRFdmVudENscycsXG4gICAgICAgICdzaG9ydEV2ZW50RHVyYXRpb24nLFxuICAgICAgICAnc2hvd0J1bGxldCcsXG4gICAgICAgICdzaG93RGlydHknLFxuICAgICAgICAnc2hvd1Jlc291cmNlQXZhdGFycycsXG4gICAgICAgICdzdGFydERhdGUnLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0cmlwcycsXG4gICAgICAgICdzdWJHcmlkQ29uZmlncycsXG4gICAgICAgICdzeW5jTWFzaycsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiQmFySXRlbXMnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd0aW1lRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAndWknLFxuICAgICAgICAnd2Vla1N0YXJ0RGF5JyxcbiAgICAgICAgJ3dlaWdodCdcbiAgICBdO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bVByb3BzOiBzdHJpbmdbXSA9IEJyeW50dW1FdmVudExpc3RDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FsbG93RHJhZ0NyZWF0ZScsXG4gICAgICAgICdhbGxvd0RyYWdNb3ZlJyxcbiAgICAgICAgJ2FsbG93RHJhZ1Jlc2l6ZScsXG4gICAgICAgICdhbmltYXRlVGltZVNoaWZ0JyxcbiAgICAgICAgJ2FuaW1hdGVUcmVlTm9kZVRvZ2dsZScsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdhdXRvQ3JlYXRlJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2VsbEVsbGlwc2lzJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzZWQnLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NvbHVtbkxpbmVzJyxcbiAgICAgICAgJ2NvbHVtbnMnLFxuICAgICAgICAnZGF0YScsXG4gICAgICAgICdkYXRhc2V0JyxcbiAgICAgICAgJ2RhdGUnLFxuICAgICAgICAnZGF0ZUZvcm1hdCcsXG4gICAgICAgICdkYXRlU2VwYXJhdG9yJyxcbiAgICAgICAgJ2RheUNlbGxDbHMnLFxuICAgICAgICAnZGVmYXVsdFNjcm9sbE9wdGlvbnMnLFxuICAgICAgICAnZGVzY3JpcHRpb25Gb3JtYXQnLFxuICAgICAgICAnZGlzYWJsZWQnLFxuICAgICAgICAnZHJhZ1VuaXQnLFxuICAgICAgICAnZW1wdHlUZXh0JyxcbiAgICAgICAgJ2VuYWJsZVVuZG9SZWRvS2V5cycsXG4gICAgICAgICdldmVudFRpbWVSZW5kZXJlcicsXG4gICAgICAgICdleHRlbmRBbGxEYXlFbmREYXknLFxuICAgICAgICAnZXh0cmFEYXRhJyxcbiAgICAgICAgJ2ZpbHRlckV2ZW50UmVzb3VyY2VzJyxcbiAgICAgICAgJ2ZpcnN0VmlzaWJsZUNlbGwnLFxuICAgICAgICAnZmlyc3RWaXNpYmxlRGF0ZScsXG4gICAgICAgICdmaXhlZER1cmF0aW9uJyxcbiAgICAgICAgJ2ZsZXgnLFxuICAgICAgICAnZm9jdXNWaXNpYmxlJyxcbiAgICAgICAgJ2hhc0NoYW5nZXMnLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlRm9vdGVycycsXG4gICAgICAgICdoaWRlSGVhZGVycycsXG4gICAgICAgICdoaWRlTm9uV29ya2luZ0RheXMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsYXN0VmlzaWJsZUNlbGwnLFxuICAgICAgICAnbGFzdFZpc2libGVEYXRlJyxcbiAgICAgICAgJ2xvbmdQcmVzc1RpbWUnLFxuICAgICAgICAnbWFyZ2luJyxcbiAgICAgICAgJ21heERhdGUnLFxuICAgICAgICAnbWF4SGVpZ2h0JyxcbiAgICAgICAgJ21heFdpZHRoJyxcbiAgICAgICAgJ21pbkRhdGUnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ25vbldvcmtpbmdEYXlzJyxcbiAgICAgICAgJ29yaWdpbmFsU3RvcmUnLFxuICAgICAgICAncGFyZW50JyxcbiAgICAgICAgJ3Bhc3RFdmVudENscycsXG4gICAgICAgICdwcmVzZXJ2ZVNjcm9sbCcsXG4gICAgICAgICdyYW5nZScsXG4gICAgICAgICdyZWFkT25seScsXG4gICAgICAgICdyZW5kaXRpb24nLFxuICAgICAgICAncm93SGVpZ2h0JyxcbiAgICAgICAgJ3Jvd0xpbmVzJyxcbiAgICAgICAgJ3J0bCcsXG4gICAgICAgICdzY3JvbGxhYmxlJyxcbiAgICAgICAgJ3NlbGVjdGVkQ2VsbCcsXG4gICAgICAgICdzZWxlY3RlZENlbGxzJyxcbiAgICAgICAgJ3NlbGVjdGVkUmVjb3JkJyxcbiAgICAgICAgJ3NlbGVjdGVkUmVjb3JkcycsXG4gICAgICAgICdzZWxlY3RlZFJvd3MnLFxuICAgICAgICAnc2VsZWN0aW9uTW9kZScsXG4gICAgICAgICdzaGlmdEluY3JlbWVudCcsXG4gICAgICAgICdzaG9ydERhdGVGb3JtYXQnLFxuICAgICAgICAnc2hvcnREYXRlVGltZUZvcm1hdCcsXG4gICAgICAgICdzcGFuJyxcbiAgICAgICAgJ3N0YWNrTXVsdGlEYXlFdmVudHMnLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAnc3RhdGVTZXR0aW5ncycsXG4gICAgICAgICdzdG9yZScsXG4gICAgICAgICdzeW5jQ2FsZW5kYXJEYXRlJyxcbiAgICAgICAgJ3N5bmNWaWV3RGF0ZScsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd0b29sdGlwJyxcbiAgICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAgICAndHJhbnNpdGlvbkR1cmF0aW9uJyxcbiAgICAgICAgJ3dpZHRoJ1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IEV2ZW50TGlzdDtcblxuICAgIHByaXZhdGUgYnJ5bnR1bUNvbmZpZyA9IHtcbiAgICAgICAgYWRvcHQgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYXBwZW5kVG8gICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgaHJlZiAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgYW5ndWxhckNvbXBvbmVudCA6IHRoaXMsXG4gICAgICAgIGZlYXR1cmVzICAgICAgICAgOiB7fSxcbiAgICAgICAgbGlzdGVuZXJzICAgICAgICA6IHt9XG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyBDb25maWdzIG9ubHlcbiAgICBASW5wdXQoKSBhY3RpdmF0aW9uS2V5ICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGFkb3B0ICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYW5pbWF0ZUZpbHRlclJlbW92YWxzICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYW5pbWF0ZVJlbW92aW5nUm93cyAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXJpYURlc2NyaXB0aW9uICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGF1dG9IZWlnaHQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ2FsZW5kYXJDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbDtcbiAgICBASW5wdXQoKSBib2R5Q2xzICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBidWJibGVFdmVudHMgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNpYmxlICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFBhbmVsQ29sbGFwc2VyQ29uZmlnfFBhbmVsQ29sbGFwc2VyT3ZlcmxheUNvbmZpZztcbiAgICBASW5wdXQoKSBjb2xvciAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgY29udGVudEVsZW1lbnRDbHMgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgICAgICAgISA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snO1xuICAgIEBJbnB1dCgpIGRhdGFGaWVsZCAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdFJlZ2lvbiAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBkZXNjcmlwdGlvblJlbmRlcmVyICAgICAgICAgICAhIDogKHZpZXc6IFdpZGdldCkgPT4gc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlc3Ryb3lTdG9yZSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVHcmlkQ29sdW1uSWRXYXJuaW5nICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRpc2FibGVHcmlkUm93TW9kZWxXYXJuaW5nICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGRvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAndG9wJ3wnYm90dG9tJ3wnbGVmdCd8J3JpZ2h0J3wnc3RhcnQnfCdlbmQnfCdoZWFkZXInfCdwcmUtaGVhZGVyJ3xvYmplY3Q7XG4gICAgQElucHV0KCkgZHJhd2VyICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e3NpZGU/OiAnc3RhcnQnfCdsZWZ0J3wnZW5kJ3wncmlnaHQnfCd0b3AnfCdib3R0b20nLCBzaXplPzogc3RyaW5nfG51bWJlciwgaW5saW5lPzogYm9vbGVhbiwgYXV0b0Nsb3NlOiB7IG1vdXNlZG93bj86IGJvb2xlYW58c3RyaW5nLCBmb2N1c291dD86IGJvb2xlYW58c3RyaW5nLCBtb3VzZW91dD86IHN0cmluZyB9LCBhdXRvQ2xvc2VEZWxheT86IG51bWJlcn07XG4gICAgQElucHV0KCkgZWxlbWVudEF0dHJpYnV0ZXMgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIHN0cmluZ3xudWxsPjtcbiAgICBASW5wdXQoKSBlbmFibGVTdGlja3kgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmFibGVUZXh0U2VsZWN0aW9uICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBlbmREYXRlICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBldmVudEZpbHRlciAgICAgICAgICAgICAgICAgICAhIDogKChldmVudDogRXZlbnRNb2RlbCkgPT4gYm9vbGVhbil8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50SGVhZGVyUmVuZGVyZXIgICAgICAgICAgICEgOiAoKGRldGFpbDogeyB2aWV3OiBDYWxlbmRhclZpZXcsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgcmVuZGVyRGF0YTogeyBzdHlsZTogb2JqZWN0LCBjbHM6IG9iamVjdCwgaWNvblN0eWxlOiBvYmplY3QsIGljb25DbHM6IG9iamVjdCwgZXZlbnRDb2xvcjogc3RyaW5nLCBkYXRhc2V0OiBvYmplY3QsIHNvbGlkQmFyOiBib29sZWFuLCBib2R5Q29sb3I6IHN0cmluZyB9LCBzaG93QnVsbGV0OiBib29sZWFuIH0pID0+IERvbUNvbmZpZ3xEb21Db25maWdbXXxzdHJpbmd8dm9pZCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50SGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50TGlzdFRpbWVGb3JtYXQgICAgICAgICAgICEgOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpO1xuICAgIEBJbnB1dCgpIGV2ZW50UmVuZGVyZXIgICAgICAgICAgICAgICAgICEgOiAoKGRldGFpbDogeyB2aWV3OiBDYWxlbmRhclZpZXcsIGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgcmVuZGVyRGF0YTogeyBzdHlsZTogb2JqZWN0LCBjbHM6IG9iamVjdCwgaWNvblN0eWxlOiBvYmplY3QsIGljb25DbHM6IG9iamVjdCwgZXZlbnRDb2xvcjogc3RyaW5nLCBldmVudEJhY2tncm91bmQ6IHN0cmluZywgdGV4dENvbG9yOiBzdHJpbmcsIGV2ZW50SW5uZXJTdHlsZTogb2JqZWN0LCBkYXRhc2V0OiBvYmplY3QsIHNvbGlkQmFyOiBib29sZWFuLCBib2R5Q29sb3I6IHN0cmluZywgc2hvd0J1bGxldDogYm9vbGVhbiB9IH0pID0+IERvbUNvbmZpZ3xEb21Db25maWdbXXxzdHJpbmd8dm9pZCl8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGV2ZW50U29ydGVyICAgICAgICAgICAgICAgICAgICEgOiAobGhzOiBFdmVudE1vZGVsfEV2ZW50QmFyLCByaHM6IEV2ZW50TW9kZWx8RXZlbnRCYXIpID0+IG51bWJlcjtcbiAgICBASW5wdXQoKSBmaWxsTGFzdENvbHVtbiAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmaXhlZFJvd0hlaWdodCAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmb290ZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBkb2NrPzogJ3RvcCd8J3JpZ2h0J3wnYm90dG9tJ3wnbGVmdCd8J3N0YXJ0J3wnZW5kJ1xuICAgICAgICBodG1sPzogc3RyaW5nXG4gICAgICAgIGNscz86IHN0cmluZ1xuICAgIH18c3RyaW5nO1xuICAgIEBJbnB1dCgpIGZvcm11bGFQcm92aWRlcnMgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBGb3JtdWxhUHJvdmlkZXJDb25maWc+O1xuICAgIEBJbnB1dCgpIGZ1bGxSb3dSZWZyZXNoICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGdldFByaW1hcnlSZXNvdXJjZSAgICAgICAgICAgICEgOiAoKGV2ZW50UmVjb3JkOiBFdmVudE1vZGVsKSA9PiBSZXNvdXJjZU1vZGVsKXxzdHJpbmc7XG4gICAgQElucHV0KCkgZ2V0Um93SGVpZ2h0ICAgICAgICAgICAgICAgICAgISA6IChnZXRSb3dIZWlnaHQ6IHsgcmVjb3JkOiBNb2RlbCB9KSA9PiBudW1iZXI7XG4gICAgQElucHV0KCkgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyO1xuICAgIEBJbnB1dCgpIGhpZGVIb3Jpem9udGFsU2Nyb2xsYmFyICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhvdmVyQ2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xEb21Db25maWc7XG4gICAgQElucHV0KCkgaWdub3JlUGFyZW50UmVhZE9ubHkgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGlzdGVuZXJzICAgICAgICAgICAgICAgICAgICAgISA6IEV2ZW50TGlzdExpc3RlbmVycztcbiAgICBASW5wdXQoKSBsaXN0UmFuZ2VNZW51ICAgICAgICAgICAgICAgICAhIDogUmFuZ2VNZW51Q29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgbG9hZE1hc2sgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgbG9hZE1hc2tEZWZhdWx0cyAgICAgICAgICAgICAgISA6IE1hc2tDb25maWc7XG4gICAgQElucHV0KCkgbG9hZE1hc2tFcnJvciAgICAgICAgICAgICAgICAgISA6IE1hc2tDb25maWd8TWFza3xib29sZWFuO1xuICAgIEBJbnB1dCgpIGxvY2FsaXphYmxlICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIG1hc2tEZWZhdWx0cyAgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1hc2tlZCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHN0cmluZ3xNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIG1vbml0b3JSZXNpemUgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIG93bmVyICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBXaWRnZXR8YW55O1xuICAgIEBJbnB1dCgpIHBsdWdpbnMgICAgICAgICAgICAgICAgICAgICAgICEgOiBGdW5jdGlvbltdO1xuICAgIEBJbnB1dCgpIHByZXNlcnZlRm9jdXNPbkRhdGFzZXRDaGFuZ2UgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHByZXZlbnRUb29sdGlwT25Ub3VjaCAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbGF5U3RvcmVFdmVudHMgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlc2l6YWJsZSAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgbWluV2lkdGg/OiBudW1iZXJcbiAgICAgICAgbWF4V2lkdGg/OiBudW1iZXJcbiAgICAgICAgbWluSGVpZ2h0PzogbnVtYmVyXG4gICAgICAgIG1heEhlaWdodD86IG51bWJlclxuICAgICAgICBoYW5kbGVzPzogb2JqZWN0XG4gICAgfTtcbiAgICBASW5wdXQoKSByZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNvdXJjZUltYWdlUGF0aCAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmUgICAgICAgICAgICAgICAgICAgICEgOiBvYmplY3Q7XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZUxldmVscyAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIG51bWJlcnxzdHJpbmd8UmVzcG9uc2l2ZUxldmVsQ29uZmlnPjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlUm9vdCAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNwb25zaXZlU3RhdGUgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJlc3BvbnNpdmVUYXJnZXQgICAgICAgICAgICAgICEgOiBzdHJpbmd8V2lkZ2V0O1xuICAgIEBJbnB1dCgpIHJpcHBsZSAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZGVsZWdhdGU/OiBzdHJpbmdcbiAgICAgICAgY29sb3I/OiBzdHJpbmdcbiAgICAgICAgcmFkaXVzPzogbnVtYmVyXG4gICAgICAgIGNsaXA/OiBzdHJpbmdcbiAgICB9O1xuICAgIEBJbnB1dCgpIHJvb3RFbGVtZW50ICAgICAgICAgICAgICAgICAgICEgOiBTaGFkb3dSb290fEhUTUxFbGVtZW50O1xuICAgIEBJbnB1dCgpIHNjcm9sbGVyQ2xhc3MgICAgICAgICAgICAgICAgICEgOiB0eXBlb2YgU2Nyb2xsZXI7XG4gICAgQElucHV0KCkgc2Nyb2xsTWFuYWdlciAgICAgICAgICAgICAgICAgISA6IFNjcm9sbE1hbmFnZXJDb25maWd8U2Nyb2xsTWFuYWdlcjtcbiAgICBASW5wdXQoKSBzZWxlY3RvckJ1dHRvbiAgICAgICAgICAgICAgICAhIDogQnV0dG9uQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNlbGVjdG9yTWVudUl0ZW0gICAgICAgICAgICAgICEgOiBNZW51SXRlbUNvbmZpZztcbiAgICBASW5wdXQoKSBzaG9ydEV2ZW50Q2xzICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHNob3J0RXZlbnREdXJhdGlvbiAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIHNob3dCdWxsZXQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtiYXI/OiBib29sZWFuLCBub0Jhcj86IGJvb2xlYW59O1xuICAgIEBJbnB1dCgpIHNob3dEaXJ0eSAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufHtcbiAgICAgICAgZHVyaW5nRWRpdD86IGJvb2xlYW5cbiAgICAgICAgbmV3UmVjb3JkPzogYm9vbGVhblxuICAgIH07XG4gICAgQElucHV0KCkgc2hvd1Jlc291cmNlQXZhdGFycyAgICAgICAgICAgISA6IGJvb2xlYW58c3RyaW5nO1xuICAgIEBJbnB1dCgpIHN0YXJ0RGF0ZSAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlO1xuICAgIEBJbnB1dCgpIHN0YXRlZnVsICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZWZ1bEV2ZW50cyAgICAgICAgICAgICAgICAhIDogb2JqZWN0fHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHN0YXRlSWQgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgc3RhdGVQcm92aWRlciAgICAgICAgICAgICAgICAgISA6IFN0YXRlUHJvdmlkZXI7XG4gICAgQElucHV0KCkgc3RyaXBzICAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29udGFpbmVySXRlbUNvbmZpZz47XG4gICAgQElucHV0KCkgc3ViR3JpZENvbmZpZ3MgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIFN1YkdyaWRDb25maWc+O1xuICAgIEBJbnB1dCgpIHN5bmNNYXNrICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHRhYiAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufFRhYkNvbmZpZztcbiAgICBASW5wdXQoKSB0YWJCYXJJdGVtcyAgICAgICAgICAgICAgICAgICAhIDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W107XG4gICAgQElucHV0KCkgdGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IChDYWxlbmRhckNvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHRpbWVGb3JtYXQgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpO1xuICAgIEBJbnB1dCgpIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAnZXZlbnRsaXN0JztcbiAgICBASW5wdXQoKSB1aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogJ3BsYWluJ3wndG9vbGJhcid8c3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSB3ZWVrU3RhcnREYXkgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYWxpZ25TZWxmICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYWxsb3dEcmFnQ3JlYXRlICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFsbG93RHJhZ01vdmUgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhbGxvd0RyYWdSZXNpemUgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYW5pbWF0ZVRpbWVTaGlmdCAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFuaW1hdGVUcmVlTm9kZVRvZ2dsZSAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBhcHBlbmRUbyAgICAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBhdXRvQ3JlYXRlICAgICAgICAgICAgICAgICAgISA6IHtcbiAgICAgICAgZ2VzdHVyZT86IHN0cmluZ1xuICAgICAgICBuZXdOYW1lPzogRnVuY3Rpb258c3RyaW5nXG4gICAgICAgIHN0ZXA/OiBzdHJpbmdcbiAgICAgICAgc25hcFR5cGU/OiAncm91bmQnfCdjZWlsJ3wnZmxvb3InXG4gICAgICAgIGR1cmF0aW9uPzogc3RyaW5nXG4gICAgICAgIHN0YXJ0SG91cj86IG51bWJlclxuICAgIH18c3RyaW5nfGJvb2xlYW47XG4gICAgQElucHV0KCkgY2FsbE9uRnVuY3Rpb25zICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNhdGNoRXZlbnRIYW5kbGVyRXhjZXB0aW9ucyAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjZWxsRWxsaXBzaXMgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2xzICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbGxhcHNlZCAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjb2x1bW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBjb2x1bW5MaW5lcyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sdW1ucyAgICAgICAgICAgICAgICAgICAgICEgOiBDb2x1bW5TdG9yZXxDYWxlbmRhckNvbHVtbkNvbmZpZ1tdfENvbHVtblN0b3JlQ29uZmlnfFJlY29yZDxzdHJpbmcsIENhbGVuZGFyQ29sdW1uQ29uZmlnPjtcbiAgICBASW5wdXQoKSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXTtcbiAgICBASW5wdXQoKSBkYXRhc2V0ICAgICAgICAgICAgICAgICAgICAgISA6IG9iamVjdHxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIEBJbnB1dCgpIGRhdGUgICAgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBkYXRlRm9ybWF0ICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZyk7XG4gICAgQElucHV0KCkgZGF0ZVNlcGFyYXRvciAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVmYXVsdFNjcm9sbE9wdGlvbnMgICAgICAgICEgOiBCcnludHVtU2Nyb2xsT3B0aW9ucztcbiAgICBASW5wdXQoKSBkZXNjcmlwdGlvbkZvcm1hdCAgICAgICAgICAgISA6IHN0cmluZ3xzdHJpbmdbXXxib29sZWFuW118KChkYXRlOiBEYXRlKSA9PiBzdHJpbmcpfEZ1bmN0aW9uW107XG4gICAgQElucHV0KCkgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufCdpbmVydCc7XG4gICAgQElucHV0KCkgZHJhZ1VuaXQgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZW1wdHlUZXh0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8RW1wdHlUZXh0RG9tQ29uZmlnO1xuICAgIEBJbnB1dCgpIGVuYWJsZVVuZG9SZWRvS2V5cyAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBldmVudFRpbWVSZW5kZXJlciAgICAgICAgICAgISA6ICgoZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIGRhdGU6IERhdGUpID0+IHN0cmluZ3xEb21Db25maWd8RG9tQ29uZmlnW10pfHN0cmluZztcbiAgICBASW5wdXQoKSBleHRlbmRBbGxEYXlFbmREYXkgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZXh0cmFEYXRhICAgICAgICAgICAgICAgICAgICEgOiBhbnk7XG4gICAgQElucHV0KCkgZmlsdGVyRXZlbnRSZXNvdXJjZXMgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGZpeGVkRHVyYXRpb24gICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlRm9vdGVycyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlkZUhlYWRlcnMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhpZGVOb25Xb3JraW5nRGF5cyAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBpbnB1dEZpZWxkQWxpZ24gICAgICAgICAgICAgISA6ICdzdGFydCd8J2VuZCc7XG4gICAgQElucHV0KCkgaW5zZXJ0QmVmb3JlICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgaW5zZXJ0Rmlyc3QgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkga2V5TWFwICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBLZXlNYXBDb25maWc+O1xuICAgIEBJbnB1dCgpIGxhYmVsUG9zaXRpb24gICAgICAgICAgICAgICAhIDogJ2JlZm9yZSd8J2Fib3ZlJ3wnYWxpZ24tYmVmb3JlJ3wnYXV0byd8bnVsbDtcbiAgICBASW5wdXQoKSBsb25nUHJlc3NUaW1lICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSBtYXJnaW4gICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgbWF4RGF0ZSAgICAgICAgICAgICAgICAgICAgICEgOiBEYXRlfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWF4V2lkdGggICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkRhdGUgICAgICAgICAgICAgICAgICAgICAhIDogRGF0ZXxzdHJpbmc7XG4gICAgQElucHV0KCkgbWluSGVpZ2h0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbldpZHRoICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBub25Xb3JraW5nRGF5cyAgICAgICAgICAgICAgISA6IFJlY29yZDxudW1iZXIsIGJvb2xlYW4+O1xuICAgIEBJbnB1dCgpIHBhc3RFdmVudENscyAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHByZXNlcnZlU2Nyb2xsICAgICAgICAgICAgICAhIDogUHJlc2VydmVTY3JvbGxPcHRpb25zfGJvb2xlYW47XG4gICAgQElucHV0KCkgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8RHVyYXRpb25Db25maWc7XG4gICAgQElucHV0KCkgcmVhZE9ubHkgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHJlbmRpdGlvbiAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfFJlY29yZDxzdHJpbmcsIHN0cmluZz58bnVsbDtcbiAgICBASW5wdXQoKSByb3dIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSByb3dMaW5lcyAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcnRsICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHNjcm9sbGFibGUgICAgICAgICAgICAgICAgICAhIDogU2Nyb2xsZXJ8Ym9vbGVhbnxTY3JvbGxlckNvbmZpZztcbiAgICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlICAgICAgICAgICAgICAgISA6IEdyaWRTZWxlY3Rpb25Nb2RlO1xuICAgIEBJbnB1dCgpIHNoaWZ0SW5jcmVtZW50ICAgICAgICAgICAgICAhIDogc3RyaW5nfER1cmF0aW9uQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNob3J0RGF0ZUZvcm1hdCAgICAgICAgICAgICAhIDogc3RyaW5nfCgoZGF0ZTogRGF0ZSkgPT4gc3RyaW5nKTtcbiAgICBASW5wdXQoKSBzaG9ydERhdGVUaW1lRm9ybWF0ICAgICAgICAgISA6IHN0cmluZ3woKGRhdGU6IERhdGUpID0+IHN0cmluZyk7XG4gICAgQElucHV0KCkgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgc3RhY2tNdWx0aURheUV2ZW50cyAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHN0YXRlU2V0dGluZ3MgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICByZXN0b3JlVW5jb25maWd1cmVkQ29sdW1ucz86IGJvb2xlYW5cbiAgICB9O1xuICAgIEBJbnB1dCgpIHN0b3JlICAgICAgICAgICAgICAgICAgICAgICAhIDogU3RvcmV8U3RvcmVDb25maWd8QWpheFN0b3JlfEFqYXhTdG9yZUNvbmZpZztcbiAgICBASW5wdXQoKSBzeW5jQ2FsZW5kYXJEYXRlICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc3luY1ZpZXdEYXRlICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRvb2xzICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgVG9vbHxUb29sQ29uZmlnPnxudWxsfFJlY29yZDxzdHJpbmcsIFRvb2w+fFJlY29yZDxzdHJpbmcsIFRvb2xDb25maWc+O1xuICAgIEBJbnB1dCgpIHRyYW5zaXRpb24gICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBpbnNlcnRSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHJlbW92ZVJlY29yZD86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlQ29sdW1uPzogYm9vbGVhblxuICAgICAgICBleHBhbmRDb2xsYXBzZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlUmVnaW9uPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVUcmVlTm9kZT86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlR3JvdXA/OiBib29sZWFuXG4gICAgICAgIGZpbHRlclJlbW92YWw/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSB0cmFuc2l0aW9uRHVyYXRpb24gICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG5cbiAgICAvLyBQcm9wZXJ0aWVzIG9ubHlcbiAgICBASW5wdXQoKSBkYXlDZWxsQ2xzICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZmlyc3RWaXNpYmxlQ2VsbCAhIDogSFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgZmlyc3RWaXNpYmxlRGF0ZSAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBmb2N1c1Zpc2libGUgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhhc0NoYW5nZXMgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGFzdFZpc2libGVDZWxsICAhIDogSFRNTEVsZW1lbnQ7XG4gICAgQElucHV0KCkgbGFzdFZpc2libGVEYXRlICAhIDogRGF0ZTtcbiAgICBASW5wdXQoKSBvcmlnaW5hbFN0b3JlICAgICEgOiBTdG9yZTtcbiAgICBASW5wdXQoKSBwYXJlbnQgICAgICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgc2VsZWN0ZWRDZWxsICAgICAhIDogR3JpZExvY2F0aW9ufEdyaWRMb2NhdGlvbkNvbmZpZztcbiAgICBASW5wdXQoKSBzZWxlY3RlZENlbGxzICAgICEgOiBHcmlkTG9jYXRpb25bXXxHcmlkTG9jYXRpb25Db25maWdbXTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJlY29yZCAgICEgOiBNb2RlbDtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJlY29yZHMgICEgOiBNb2RlbFtdfG51bWJlcltdO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkUm93cyAgICAgISA6IE1vZGVsW118bnVtYmVyW107XG4gICAgQElucHV0KCkgc3RhdGUgICAgICAgICAgICAhIDogR3JpZFN0YXRlSW5mbztcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgICEgOiBzdHJpbmd8VG9vbHRpcENvbmZpZztcblxuICAgIC8vIEZlYXR1cmVzXG4gICAgQElucHV0KCkgYWlGaWx0ZXJGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEFJRmlsdGVyfEFJRmlsdGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNlbGxDb3B5UGFzdGVGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsQ29weVBhc3RlfENlbGxDb3B5UGFzdGVDb25maWc7XG4gICAgQElucHV0KCkgY2VsbEVkaXRGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxFZGl0fENlbGxFZGl0Q29uZmlnO1xuICAgIEBJbnB1dCgpIGNlbGxNZW51RmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsTWVudXxDZWxsTWVudUNvbmZpZztcbiAgICBASW5wdXQoKSBjZWxsVG9vbHRpcEZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbFRvb2x0aXB8Q2VsbFRvb2x0aXBDb25maWc7XG4gICAgQElucHV0KCkgY2hhcnRzRmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENoYXJ0c3xDaGFydHNDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uQXV0b1dpZHRoRmVhdHVyZSAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkF1dG9XaWR0aHxDb2x1bW5BdXRvV2lkdGhDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uRHJhZ1Rvb2xiYXJGZWF0dXJlICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkRyYWdUb29sYmFyfENvbHVtbkRyYWdUb29sYmFyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblBpY2tlckZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5QaWNrZXJ8Q29sdW1uUGlja2VyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblJlbmFtZUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW5hbWV8Q29sdW1uUmVuYW1lQ29uZmlnO1xuICAgIEBJbnB1dCgpIGNvbHVtblJlb3JkZXJGZWF0dXJlICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW9yZGVyfENvbHVtblJlb3JkZXJDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVzaXplRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlc2l6ZXxDb2x1bW5SZXNpemVDb25maWc7XG4gICAgQElucHV0KCkgZXhjZWxFeHBvcnRlckZlYXR1cmUgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRFeGNlbEV4cG9ydGVyfEdyaWRFeGNlbEV4cG9ydGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbGVEcm9wRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWxlRHJvcHxGaWxlRHJvcENvbmZpZztcbiAgICBASW5wdXQoKSBmaWxsSGFuZGxlRmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RmlsbEhhbmRsZXxGaWxsSGFuZGxlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbHRlckZlYXR1cmUgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJ8RmlsdGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbHRlckJhckZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGdyb3VwRmVhdHVyZSAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcm91cHxHcm91cENvbmZpZztcbiAgICBASW5wdXQoKSBncm91cFN1bW1hcnlGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZEdyb3VwU3VtbWFyeXxHcmlkR3JvdXBTdW1tYXJ5Q29uZmlnO1xuICAgIEBJbnB1dCgpIGhlYWRlck1lbnVGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xIZWFkZXJNZW51fEhlYWRlck1lbnVDb25maWc7XG4gICAgQElucHV0KCkgbG9ja1Jvd3NGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRMb2NrUm93c3xHcmlkTG9ja1Jvd3NDb25maWc7XG4gICAgQElucHV0KCkgbWVyZ2VDZWxsc0ZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfE1lcmdlQ2VsbHN8TWVyZ2VDZWxsc0NvbmZpZztcbiAgICBASW5wdXQoKSBwZGZFeHBvcnRGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZFBkZkV4cG9ydHxHcmlkUGRmRXhwb3J0Q29uZmlnO1xuICAgIEBJbnB1dCgpIHBpbkNvbHVtbnNGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQaW5Db2x1bW5zfFBpbkNvbHVtbnNDb25maWc7XG4gICAgQElucHV0KCkgcHJpbnRGZWF0dXJlICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRQcmludHxHcmlkUHJpbnRDb25maWc7XG4gICAgQElucHV0KCkgcXVpY2tGaW5kRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFF1aWNrRmluZHxRdWlja0ZpbmRDb25maWc7XG4gICAgQElucHV0KCkgcmVnaW9uUmVzaXplRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJlZ2lvblJlc2l6ZXxSZWdpb25SZXNpemVDb25maWc7XG4gICAgQElucHV0KCkgcm93Q29weVBhc3RlRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0NvcHlQYXN0ZXxSb3dDb3B5UGFzdGVDb25maWc7XG4gICAgQElucHV0KCkgcm93RWRpdEZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0VkaXR8Um93RWRpdENvbmZpZztcbiAgICBASW5wdXQoKSByb3dFeHBhbmRlckZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93RXhwYW5kZXJ8Um93RXhwYW5kZXJDb25maWc7XG4gICAgQElucHV0KCkgcm93UmVvcmRlckZlYXR1cmUgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRSb3dSZW9yZGVyfEdyaWRSb3dSZW9yZGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd1Jlc2l6ZUZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcmlkUm93UmVzaXplfEdyaWRSb3dSZXNpemVDb25maWc7XG4gICAgQElucHV0KCkgc2VhcmNoRmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNlYXJjaHxTZWFyY2hDb25maWc7XG4gICAgQElucHV0KCkgc29ydEZlYXR1cmUgICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNvcnR8U29ydENvbmZpZztcbiAgICBASW5wdXQoKSBzcGxpdEZlYXR1cmUgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JpZFNwbGl0fEdyaWRTcGxpdENvbmZpZztcbiAgICBASW5wdXQoKSBzdGlja3lDZWxsc0ZlYXR1cmUgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3RpY2t5Q2VsbHN8U3RpY2t5Q2VsbHNDb25maWc7XG4gICAgQElucHV0KCkgc3RyaXBlRmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN0cmlwZXxTdHJpcGVDb25maWc7XG4gICAgQElucHV0KCkgc3VtbWFyeUZlYXR1cmUgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyaWRTdW1tYXJ5fEdyaWRTdW1tYXJ5Q29uZmlnO1xuICAgIEBJbnB1dCgpIHRyZWVGZWF0dXJlICAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlfFRyZWVDb25maWc7XG4gICAgQElucHV0KCkgdHJlZUdyb3VwRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRyZWVHcm91cHxUcmVlR3JvdXBDb25maWc7XG5cbiAgICAvLyBFdmVudHMgZW1pdHRlcnNcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW5ldmVyIHRoZSBbYXV0b0NyZWF0ZSBnZXN0dXJlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1hdXRvQ3JlYXRlKSBpcyBkZXRlY3RlZFxuICAgICAqIGFuZCBhbHNvIHdoZW4gYSBbZHJhZy1jcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvZmVhdHVyZS9DYWxlbmRhckRyYWcpIGdlc3R1cmUgaXMgZGV0ZWN0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1iZWZvcmVBdXRvQ3JlYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgRE9NIGV2ZW50IHdoaWNoIGluaXRpYXRlZCB0aGUgY3JlYXRpb24uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlICpERVBSRUNBVEVEIGluIGZhdm91ciBvZiBgc3RhcnREYXRlYC4qIFRoZSBzdGFydGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLiBJZiB0aGlzIGlzIGluIGEgYERheVZpZXdgLCB0aGlzIHdpbGwgYmUgc25hcHBlZCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gaW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5zdGFydERhdGUgVGhlIHN0YXJ0aW5nIHRpbWUgb2YgdGhlIGV2ZW50IHRvIGJlIGNyZWF0ZWQuIElmIHRoaXMgaXMgaW4gYSBgRGF5Vmlld2AsIHRoaXMgd2lsbCBiZSBzbmFwcGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBpbiBbYXV0b0NyZWF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vQ2FsZW5kYXJNaXhpbiNjb25maWctYXV0b0NyZWF0ZSlcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmVuZERhdGUgVGhlIGVuZGluZyB0aW1lIG9mIHRoZSBldmVudCB0byBiZSBjcmVhdGVkLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLlJlc291cmNlTW9kZWx9IGV2ZW50LnJlc291cmNlUmVjb3JkIFRoZSByZXNvdXJjZSBpZiB0aGUgVUkgaW5jbHVkZXMgYSByZXNvdXJjZS5cbiAgICAgKiBAcGFyYW0ge0NhbGVuZGFyVmlld30gZXZlbnQudmlldyBUaGlzIHZpZXcuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQXV0b0NyZWF0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGRvbUV2ZW50OiBFdmVudCwgZGF0ZTogRGF0ZSwgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlLCByZXNvdXJjZVJlY29yZDogUmVzb3VyY2VNb2RlbCwgdmlldzogQ2FsZW5kYXJWaWV3IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSB0aGUgY2VsbCBlZGl0aW5nIGlzIGNhbmNlbGVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGNhbmNlbGxhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2FuY2VsQ2VsbEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IEdyaWRMb2NhdGlvbiB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIHJvdyBlZGl0aW5nIGlzIGNhbmNlbGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1iZWZvcmVDYW5jZWxSb3dFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNhbmNlbFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBSb3dFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBlZGl0aW5nIHN0YXJ0cywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBlZGl0aW5nXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtDZWxsRWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDZWxsRWRpdFN0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgZGVsZXRpbmcgYSByYW5nZSBvZiBzZWxlY3RlZCBjZWxsIHZhbHVlcyBieSBwcmVzc2luZyBgQmFja3NwYWNlYCBvciBgRGVsYFxuICAgICAqIGJ1dHRvbnMgd2hpbGUgW2F1dG9FZGl0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DZWxsRWRpdCNjb25maWctYXV0b0VkaXQpIGlzIHNldCB0byBgdHJ1ZWAuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgZWRpdGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0geyhHcmlkLnV0aWwuR3JpZExvY2F0aW9ufENvcmUuZGF0YS5Nb2RlbClbXX0gZXZlbnQuZ3JpZFNlbGVjdGlvbiBBbiBhcnJheSBvZiBjZWxsIHNlbGVjdG9ycyBvciByZWNvcmRzIHRoYXQgd2lsbCBoYXZlIHRoZWlyIHZhbHVlcyBkZWxldGVkICh0aGUgcmVjb3JkcyB0aGVtc2VsdmVzIHdpbGwgbm90IGdldCBkZWxldGVkLCBvbmx5IHZpc2libGUgY29sdW1uIHZhbHVlcykuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2VsbFJhbmdlRGVsZXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBncmlkU2VsZWN0aW9uOiAoR3JpZExvY2F0aW9ufE1vZGVsKVtdIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgZm9yIGVhY2ggc2VsZWN0ZWQgcmVjb3JkIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgZWRpdGluZyBhIHJhbmdlIG9mIHNlbGVjdGVkIGNlbGwgdmFsdWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgQ3VycmVudCBzZWxlY3RlZCByZWNvcmQgZnJvbSB0aGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZmllbGQgVGhlIGZpZWxkIGJlaW5nIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0ge2FueX0gZXZlbnQudmFsdWUgVGhlIHZhbHVlIGJlaW5nIHNldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNlbGxSYW5nZUVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWNvcmQ6IE1vZGVsLCBmaWVsZDogc3RyaW5nLCB2YWx1ZTogYW55IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIHZpZXcncyBvcmllbnRhdGluZyBkYXRlIGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1iZWZvcmVDaGFuZ2VEYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZERhdGUgVGhlIGN1cnJlbnQgb3JpZW50YXRpbmcgZGF0ZSBvZiB0aGlzIHZpZXcuXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5kYXRlIFRoZSBuZXcgZGF0ZSB0byB3aGljaCB0aGlzIHZpZXcgaXMgdG8gYmUgb3JpZW50YXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDaGFuZ2VEYXRlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgb2xkRGF0ZTogRGF0ZSwgZGF0ZTogRGF0ZSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgcHJpb3IgdG8gc3RhcnRpbmcgYSBjb2x1bW4gZHJhZyBnZXN0dXJlLiBUaGUgZHJhZyBpcyBjYW5jZWxlZCBpZiBhIGxpc3RlbmVyIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvbHVtbkRyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGV2ZW50OiBFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiBpcyBkcm9wcGVkLCBhbmQgeW91IGNhbiByZXR1cm4gZmFsc2UgZnJvbSBhIGxpc3RlbmVyIHRvIGFib3J0IHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBkcmFnZ2VkIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuaW5zZXJ0QmVmb3JlIFRoZSBjb2x1bW4gYmVmb3JlIHdoaWNoIHRoZSBkcmFnZ2VkIGNvbHVtbiB3aWxsIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5uZXdQYXJlbnQgVGhlIG5ldyBwYXJlbnQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5yZWdpb24gVGhlIHJlZ2lvbiB3aGVyZSB0aGUgY29sdW1uIHdhcyBkcm9wcGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvbHVtbkRyb3BGaW5hbGl6ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGluc2VydEJlZm9yZTogQ29sdW1uLCBuZXdQYXJlbnQ6IENvbHVtbiwgZXZlbnQ6IEV2ZW50LCByZWdpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgcHJpb3IgdG8gc3RhcnRpbmcgYSBjb2x1bW4gcmVzaXplIGdlc3R1cmUuIFRoZSByZXNpemUgaXMgY2FuY2VsZWQgaWYgYSBsaXN0ZW5lciByZXR1cm5zXG4gICAgICogYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGEgY29weSBhY3Rpb24gaXMgcGVyZm9ybWVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbHMgVGhlIGNlbGxzIGFib3V0IHRvIGJlIGNvcGllZCBvciBjdXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZGF0YSBUaGUgc3RyaW5nIGRhdGEgYWJvdXQgdG8gYmUgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2NlbGwnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBiZWZvcmVDb3B5IGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvcHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNlbGxzOiBHcmlkTG9jYXRpb25bXSwgZGF0YTogc3RyaW5nLCBpc0N1dDogYm9vbGVhbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBDU1YgZXhwb3J0IHN0YXJ0cy4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBleHBvcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXhwb3J0Q29uZmlnfSBldmVudC5jb25maWcgRXhwb3J0IGNvbmZpZ1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1uW119IGV2ZW50LmNvbHVtbnMgQW4gYXJyYXkgb2YgY29sdW1ucyB0byBleHBvcnRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yb3dzIEFuIGFycmF5IG9mIHJlY29yZHMgdG8gZXhwb3J0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmxpbmVEZWxpbWl0ZXIgVGhlIENTViBkZWxpbWl0ZXIgdG8gc2VwYXJhdGUgbGluZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY29sdW1uRGVsaW1pdGVyIFRoZSBDU1YgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIHZhbHVlcyBvbiBvbmUgbGluZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNTVkV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNvbmZpZzogRXhwb3J0Q29uZmlnLCBjb2x1bW5zOiBDb2x1bW5bXSwgcm93czogTW9kZWxbXSwgbGluZURlbGltaXRlcjogc3RyaW5nLCBjb2x1bW5EZWxpbWl0ZXI6IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBFeGNlbCBleHBvcnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFeHBvcnRDb25maWd9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICogQHBhcmFtIHtYTFNDb2x1bW5bXX0gZXZlbnQuY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7YW55W11bXX0gZXZlbnQucm93cyBBbiBhcnJheSBvZiByZWNvcmRzIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV4Y2VsRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBFeHBvcnRDb25maWcsIGNvbHVtbnM6IFhMU0NvbHVtbltdLCByb3dzOiBhbnlbXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBkcmFnZ2luZyBvZiB0aGUgRmlsbEhhbmRsZSBzdGFydHMsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGRyYWcgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmNlbGwgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbHVtbiAvIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHJhdyBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVGaWxsSGFuZGxlRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2VsbDogR3JpZExvY2F0aW9uLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIGNlbGwgZWRpdGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkIGFuZCBlZGl0aW5nIHNob3VsZCBub3QgYmUgZmluYWxpemVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtDZWxsRWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVGaW5pc2hDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSByb3cgZWRpdGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkIGFuZCBlZGl0aW5nIHNob3VsZCBub3QgYmUgZmluYWxpemVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjZXZlbnQtYmVmb3JlRmluaXNoUm93RWRpdClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUYXJnZXQgZ3JpZFxuICAgICAqIEBwYXJhbSB7Um93RWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVGaW5pc2hSb3dFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgaGlkZGVuLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBoaWRkZW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBhIHBhc3RlIGFjdGlvbiBpcyBwZXJmb3JtZWQsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvblxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jbGlwYm9hcmREYXRhIFRoZSBjbGlwYm9hcmREYXRhIGFib3V0IHRvIGJlIHBhc3RlZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQudGFyZ2V0Q2VsbCBUaGUgY2VsbCBmcm9tIHdoaWNoIHRoZSBwYXN0ZSB3aWxsIGJlIHN0YXJ0ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnY2VsbCcgdG8gZGlzdGluZ3Vpc2ggdGhpcyBldmVudCBmcm9tIG90aGVyIGJlZm9yZVBhc3RlIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC50ZXh0IFRoZSByYXcgdGV4dCBmcm9tIGNsaXBib2FyZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVBhc3RlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjbGlwYm9hcmREYXRhOiBzdHJpbmcsIHRhcmdldENlbGw6IEdyaWRMb2NhdGlvbiwgZW50aXR5TmFtZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGV4cG9ydCBzdGFydGVkLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUGRmRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBvYmplY3QgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgYSByb3cgaXMgcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnJvdy5Sb3d9IGV2ZW50LnJvdyBUaGUgcm93IGFib3V0IHRvIGJlIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCBmb3IgdGhlIHJvdy5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQucmVjb3JkSW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggb2YgdGhlIHJlY29yZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVSZW5kZXJSb3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJvdzogUm93LCByZWNvcmQ6IE1vZGVsLCByZWNvcmRJbmRleDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcmlkIHJvd3MgYXJlIGFib3V0IHRvIGJlIHJlbmRlcmVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGlzIGdyaWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVuZGVyUm93czogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGJlZm9yZSBhIG5ldyBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGlzIHRvIGJlIGNoYW5nZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuc3RhdGUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHdpZGdldCdzIGByZXNwb25zaXZlU3RhdGVgXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50Lm9sZFN0YXRlIFRoZSBwcmV2aW91cyB2YWx1ZSBmb3IgdGhlIHdpZGdldCdzIGByZXNwb25zaXZlU3RhdGVgXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVzcG9uc2l2ZVN0YXRlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHN0YXRlOiBzdHJpbmcsIG9sZFN0YXRlOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgYmVmb3JlIHJvdyBjb2xsYXBzZSBpcyBzdGFydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjZXZlbnQtYmVmb3JlUm93Q29sbGFwc2UpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUm93Q29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBiZWZvcmUgcm93IGV4cGFuZCBpcyBzdGFydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjZXZlbnQtYmVmb3JlUm93RXhwYW5kKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJvd0V4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBiZWZvcmUgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLiBSZXR1cm5pbmcgYGZhbHNlYCBmcm9tIGEgbGlzdGVuZXIgcHJldmVudHMgdGhlIGNoYW5nZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuYWN0aW9uIGAnc2VsZWN0J2AvYCdkZXNlbGVjdCdgXG4gICAgICogQHBhcmFtIHsncm93JywnY2VsbCd9IGV2ZW50Lm1vZGUgYCdyb3cnYC9gJ2NlbGwnYFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmRlc2VsZWN0ZWQgVGhlIHJlY29yZHMgdG8gYmUgZGVzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5zZWxlY3RlZCBUaGUgcmVjb3JkcyB0byBiZSBzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5zZWxlY3Rpb24gVGhlIHJlY29yZHMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkYCBhbmQgYGRlc2VsZWN0ZWRgXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LmRlc2VsZWN0ZWRDZWxscyBUaGUgY2VsbHMgdG8gYmUgZGVzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuc2VsZWN0ZWRDZWxscyBUaGUgY2VsbHMgdG8gYmUgc2VsZWN0ZWQgaW4gdGhpcyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9uW119IGV2ZW50LmNlbGxTZWxlY3Rpb24gVGhlIGNlbGxzIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYmVmb3JlIGFwcGx5aW5nIGBzZWxlY3RlZENlbGxzYCBhbmQgYGRlc2VsZWN0ZWRDZWxsc2BcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTZWxlY3Rpb25DaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBhY3Rpb246IHN0cmluZywgbW9kZTogJ3Jvdyd8J2NlbGwnLCBzb3VyY2U6IEdyaWQsIGRlc2VsZWN0ZWQ6IE1vZGVsW10sIHNlbGVjdGVkOiBNb2RlbFtdLCBzZWxlY3Rpb246IE1vZGVsW10sIGRlc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uW10sIHNlbGVjdGVkQ2VsbHM6IEdyaWRMb2NhdGlvbltdLCBjZWxsU2VsZWN0aW9uOiBHcmlkTG9jYXRpb25bXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGlzIGNvbnRhaW5lciB3aWxsIGxvYWQgcmVjb3JkIHZhbHVlcyBpbnRvIGl0cyBjaGlsZCBmaWVsZHMuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdVxuICAgICAqIHdhbnQgdG8gbW9kaWZ5IHRoZSBVSSBiZWZvcmUgZGF0YSBpcyBsb2FkZWQgKGUuZy4gc2V0IHNvbWUgaW5wdXQgZmllbGQgdG8gYmUgcmVhZG9ubHkpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuQ29udGFpbmVyfSBldmVudC5zb3VyY2UgVGhlIGNvbnRhaW5lclxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNldFJlY29yZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCByZWNvcmQ6IE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIHNob3duLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0LGFueX0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgc2hvd25cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXR8YW55IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBlZGl0aW5nIHN0YXJ0cywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBlZGl0aW5nXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXJ0Um93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBzdGF0ZSBpcyBhcHBsaWVkIHRvIHRoZSBzb3VyY2UuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWRTdGF0ZUluZm99IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZUFwcGx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3RhdGU6IEdyaWRTdGF0ZUluZm8gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgc3RhdGUgaXMgc2F2ZWQgYnkgdGhlIFN0YXRlUHJvdmlkZXIuIEFsbG93cyBlZGl0aW5nIHRoZSBzdGF0ZSBvYmplY3Qgb3IgcHJldmVudGluZyB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWRTdGF0ZUluZm99IGV2ZW50LnN0YXRlIFN0YXRlIG9iamVjdCBjb25maWdcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVTdGF0ZVNhdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzdGF0ZTogR3JpZFN0YXRlSW5mbyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBncm91cCBpcyBnb2luZyB0byBiZSBleHBhbmRlZCBvciBjb2xsYXBzZWQgdXNpbmcgdGhlIFVJLlxuICAgICAqIFJldHVybmluZyBgZmFsc2VgIGZyb20gYSBsaXN0ZW5lciBwcmV2ZW50cyB0aGUgb3BlcmF0aW9uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5ncm91cFJlY29yZCBbREVQUkVDQVRFRF0gVXNlIGBncm91cFJlY29yZHNgIHBhcmFtIGluc3RlYWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5ncm91cFJlY29yZHMgVGhlIGdyb3VwIHJlY29yZHMgYmVpbmcgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgQ29sbGFwc2VkICh0cnVlKSBvciBleHBhbmRlZCAoZmFsc2UpXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHVzZXIgaW50ZXJhY3Rpb24gZXZlbnQgKGVnIGEgYGNsaWNrYCBldmVudCkgaWYgdGhlIHRvZ2dsZSByZXF1ZXN0IHdhcyBpbnN0aWdhdGVkIGJ5IHVzZXIgaW50ZXJhY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVG9nZ2xlR3JvdXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncm91cFJlY29yZDogTW9kZWwsIGdyb3VwUmVjb3JkczogTW9kZWxbXSwgY29sbGFwc2U6IGJvb2xlYW4sIGRvbUV2ZW50OiBFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhIHBhcmVudCBub2RlIHJlY29yZCB0b2dnbGVzIGl0cyBjb2xsYXBzZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIGJlaW5nIHRvZ2dsZWQuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBgdHJ1ZWAgaWYgdGhlIG5vZGUgaXMgYmVpbmcgY29sbGFwc2VkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVRvZ2dsZU5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBlZGl0aW5nIGlzIGNhbmNlbGxlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBJbmNsdWRlZCBpZiB0aGUgY2FuY2VsbGF0aW9uIHdhcyB0cmlnZ2VyZWQgYnkgYSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYW5jZWxDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogR3JpZExvY2F0aW9uLCBldmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW55IG90aGVyIGV2ZW50IGlzIGZpcmVkIGZyb20gdGhlIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2V2ZW50LWNhdGNoQWxsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3tba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ319IGV2ZW50LmV2ZW50IFRoZSBPYmplY3QgdGhhdCBjb250YWlucyBldmVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGlzIGNhdWdodCBieSB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYXRjaEFsbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB1c2VyIGNsaWNrcyBpbiBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgYWN0aXZhdGVzIGNvbnRleHRtZW51IGluIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbENvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBkb3VibGUgY2xpY2tzIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbERibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBuZXcgc2V0IG9mIGV2ZW50cyBoYXMgYmVlbiBnYXRoZXJlZCBmb3IgdGhpcyB2aWV3J3MgZGF0ZSByYW5nZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtNYXA8YW55LCBhbnk+fSBldmVudC5jZWxsTWFwIFRoZSBtYXAgb2YgZGF0ZSBrZXlzIHRvIFtkYXkgY2VsbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvbWl4aW4vRGF5Q2VsbENvbGxlY3RlciN0eXBlZGVmLURheUNlbGwpIGRhdGEgYmxvY2tzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNYXBQb3B1bGF0ZWQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsTWFwOiBNYXA8YW55LCBhbnk+IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgZ3JpZCBiZWZvcmUgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBjZWxsLlxuICAgICAqIEFsbG93cyBtYW5pcHVsYXRpb24gb2YgdGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHRoZSBbcHJvY2Vzc0l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9DZWxsTWVudSNjb25maWctcHJvY2Vzc0l0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2V2ZW50LWNlbGxNZW51QmVmb3JlU2hvdylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1lbnVCZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGNvbHVtbjogQ29sdW1uLCByZWNvcmQ6IE1vZGVsIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIGdyaWQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBjZWxsIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1lbnVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uOiBDb2x1bW4sIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIGFmdGVyIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGEgY2VsbC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1lbnVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGNvbHVtbjogQ29sdW1uLCByZWNvcmQ6IE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgZ3JpZCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSBjZWxsIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkIENoZWNrZWQgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uOiBDb2x1bW4sIHJlY29yZDogTW9kZWwsIGNoZWNrZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdGhlIG1vdXNlIGVudGVycyBhIGNlbGxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgaG92ZXJlZCBjZWxsXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIGN1cnJlbnRseSBob3ZlcmVkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNb3VzZUVudGVyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjb2x1bW46IENvbHVtbiwgY2VsbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgbGVhdmVzIGEgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSBjZWxsIHRoYXQgdGhlIG1vdXNlIGxlZnRcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gcmVwcmVzZW50aW5nIHRoZSBjZWxsIHRoYXQgdGhlIG1vdXNlIGxlZnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnQgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTW91c2VMZWF2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSB1c2VyIG1vdmVzIHRoZSBtb3VzZSBvdXQgb2YgYSBncmlkIGNlbGxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIHJvd1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtbiB0byB3aGljaCB0aGUgY2VsbCBiZWxvbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTW91c2VPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjb2x1bW46IENvbHVtbiwgY2VsbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCB0YXJnZXQ6IEhUTUxFbGVtZW50LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB1c2VyIG1vdmVzIHRoZSBtb3VzZSBvdmVyIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1vdXNlT3ZlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgUGFuZWwgaXMgY29sbGFwc2VkIHVzaW5nIHRoZSBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogUGFuZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBhIHBhcmVudCBub2RlIHJlY29yZCBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHdoaWNoIGhhcyBiZWVuIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2xsYXBzZU5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiBpcyBiZWluZyBkcmFnZ2VkLCBhbmQgeW91IGNhbiBzZXQgdGhlIGB2YWxpZGAgZmxhZyBvbiB0aGUgYGNvbnRleHRgIG9iamVjdFxuICAgICAqIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQgb3Igbm90LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgZHJhZ2dlZCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lmluc2VydEJlZm9yZSBUaGUgY29sdW1uIGJlZm9yZSB3aGljaCB0aGUgZHJhZ2dlZCBjb2x1bW4gd2lsbCBiZSBpbnNlcnRlZCAoaWYgbm90IGxhc3QpLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIFNldCB0aGlzIHRvIGB0cnVlYCBvciBgZmFsc2VgIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGluc2VydEJlZm9yZTogQ29sdW1uLCBldmVudDogRXZlbnQsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4gfSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBmaXJlZCB3aGVuIGEgY29sdW1uIGRyYWcgZ2VzdHVyZSBoYXMgc3RhcnRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkRyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBpcyBhbHdheXMgZmlyZWQgYWZ0ZXIgYSBjb2x1bW4gaXMgZHJvcHBlZC4gVGhlIGB2YWxpZGAgcGFyYW0gaXMgYHRydWVgIGlmIHRoZSBvcGVyYXRpb24gd2FzIG5vdFxuICAgICAqIHZldG9lZCBhbmQgdGhlIGNvbHVtbiB3YXMgbW92ZWQgaW4gdGhlIGNvbHVtbiBzdG9yZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5pbnNlcnRCZWZvcmUgVGhlIGNvbHVtbiBiZWZvcmUgd2hpY2ggdGhlIGRyYWdnZWQgY29sdW1uIHdpbGwgYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50Lm5ld1BhcmVudCBUaGUgbmV3IHBhcmVudCBjb2x1bW4uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC52YWxpZCBgdHJ1ZWAgaWYgdGhlIG9wZXJhdGlvbiB3YXMgbm90IHZldG9lZC5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQucmVnaW9uIFRoZSByZWdpb24gd2hlcmUgdGhlIGNvbHVtbiB3YXMgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5Ecm9wOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgaW5zZXJ0QmVmb3JlOiBDb2x1bW4sIG5ld1BhcmVudDogQ29sdW1uLCB2YWxpZDogYm9vbGVhbiwgZXZlbnQ6IEV2ZW50LCByZWdpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSByZXNpemUgZ2VzdHVyZSBpcyBjb21wbGV0ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIHJlc2l6ZWQgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiByZXNpemUgZ2VzdHVyZSBzdGFydHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uUmVzaXplU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyB3aWRnZXQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIG93bmluZyB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbnRleHRNZW51SXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIHdpZGdldCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSBjb250ZXh0IG1lbnUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIG93bmluZyB3aWRnZXRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbnRleHRNZW51VG9nZ2xlSXRlbTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIGEgY29weSBhY3Rpb24gaXMgcGVyZm9ybWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5jZWxscyBUaGUgY2VsbHMgYWJvdXQgdG8gYmUgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5jb3BpZWREYXRhU3RyaW5nIFRoZSBjb25jYXRlbmF0ZWQgZGF0YSBzdHJpbmcgdGhhdCB3YXMgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgd2FzIGEgY3V0IGFjdGlvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgY29weSBldmVudHNcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db3B5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjZWxsczogR3JpZExvY2F0aW9uW10sIGNvcGllZERhdGFTdHJpbmc6IHN0cmluZywgaXNDdXQ6IGJvb2xlYW4sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkYXRhIGluIHRoZSBzdG9yZSBjaGFuZ2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjZXZlbnQtZGF0YUNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmluZyBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuU3RvcmV9IGV2ZW50LnN0b3JlIFRoZSBvcmlnaW5hdGluZyBzdG9yZVxuICAgICAqIEBwYXJhbSB7J3JlbW92ZScsJ3JlbW92ZUFsbCcsJ2FkZCcsJ2NsZWFyY2hhbmdlcycsJ2ZpbHRlcicsJ3VwZGF0ZScsJ2RhdGFzZXQnLCdyZXBsYWNlJ30gZXZlbnQuYWN0aW9uIE5hbWUgb2YgYWN0aW9uIHdoaWNoIHRyaWdnZXJlZCB0aGUgY2hhbmdlLiBNYXkgYmUgb25lIG9mOiAgKiBgJ3JlbW92ZSdgICogYCdyZW1vdmVBbGwnYCAqIGAnYWRkJ2AgKiBgJ2NsZWFyY2hhbmdlcydgICogYCdmaWx0ZXInYCAqIGAndXBkYXRlJ2AgKiBgJ2RhdGFzZXQnYCAqIGAncmVwbGFjZSdgXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBDaGFuZ2VkIHJlY29yZCwgZm9yIGFjdGlvbnMgdGhhdCBhZmZlY3RzIGV4YWN0bHkgb25lIHJlY29yZCAoYCd1cGRhdGUnYClcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yZWNvcmRzIENoYW5nZWQgcmVjb3JkcywgcGFzc2VkIGZvciBhbGwgYWN0aW9ucyBleGNlcHQgYCdyZW1vdmVBbGwnYFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jaGFuZ2VzIFBhc3NlZCBmb3IgdGhlIGAndXBkYXRlJ2AgYWN0aW9uLCBpbmZvIG9uIHdoaWNoIHJlY29yZCBmaWVsZHMgY2hhbmdlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRhdGFDaGFuZ2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHN0b3JlOiBTdG9yZSwgYWN0aW9uOiAncmVtb3ZlJ3wncmVtb3ZlQWxsJ3wnYWRkJ3wnY2xlYXJjaGFuZ2VzJ3wnZmlsdGVyJ3wndXBkYXRlJ3wnZGF0YXNldCd8J3JlcGxhY2UnLCByZWNvcmQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBjaGFuZ2VzOiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIG9uZSBkYXkgY2VsbCdzIGV2ZW50cyBhcmUgY29sbGVjdGVkIGluIHNvcnRlZCBvcmRlciBhY2NvcmRpbmcgdG8gdGhlXG4gICAgICogW2V2ZW50U29ydGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9DYWxlbmRhck1peGluI2NvbmZpZy1ldmVudFNvcnRlcilcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2V2ZW50LWRheUNlbGxQb3B1bGF0ZWQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWxbXX0gZXZlbnQuZXZlbnRzIFRoZSBldmVudHMgdG8gYmUgc2hvd24gZm9yIHRoZSBwYXNzZWQgZGF0ZVxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQuVGhlIGRhdGUgdGhlIGV2ZW50cyBhcmUgdG8gYmUgc2hvd24gaW4uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF5Q2VsbFBvcHVsYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50czogRXZlbnRNb2RlbFtdLCBUaGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYW4gb2JqZWN0IGlzIGRlc3Ryb3llZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLkJhc2V9IGV2ZW50LnNvdXJjZSBUaGUgT2JqZWN0IHRoYXQgaXMgYmVpbmcgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRlc3Ryb3k6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEJhc2UgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWVsZCBpcyBtdXRhdGVkIGFuZCB0aGUgc3RhdGUgb2YgdGhlIFtoYXNDaGFuZ2VzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNwcm9wZXJ0eS1oYXNDaGFuZ2VzKSBwcm9wZXJ0eSBjaGFuZ2VzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuQ29udGFpbmVyfSBldmVudC5zb3VyY2UgVGhlIGNvbnRhaW5lci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmRpcnR5IFRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgQ29udGFpbmVyIC0gYHRydWVgIGlmIHRoZXJlIGFyZSBhbnkgZmllbGRzIHdoaWNoIGhhdmUgYmVlbiBjaGFuZ2VkIHNpbmNlIGluaXRpYWwgbG9hZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25EaXJ0eVN0YXRlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDb250YWluZXIsIGRpcnR5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGlsZSBkcmFnIHNlbGVjdGluZy4gVUkgd2lsbCB1cGRhdGUgd2l0aCBjdXJyZW50IHJhbmdlLCBidXQgdGhlIGNlbGxzIHdpbGwgbm90IGJlIHNlbGVjdGVkIHVudGlsXG4gICAgICogbW91c2UgdXAuIFRoaXMgZXZlbnQgY2FuIGJlIGxpc3RlbmVkIGZvciB0byBwZXJmb3JtIGFjdGlvbnMgd2hpbGUgZHJhZyBzZWxlY3RpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7R3JpZExvY2F0aW9uQ29uZmlnW10sR3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5zZWxlY3RlZENlbGxzIFRoZSBjZWxscyB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBkcmFnZ2VkIG92ZXJcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5zZWxlY3RlZFJlY29yZHMgVGhlIHJlY29yZHMgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZHJhZ2dlZCBvdmVyXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRHJhZ1NlbGVjdGluZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uQ29uZmlnW118R3JpZExvY2F0aW9uW10sIHNlbGVjdGVkUmVjb3JkczogTW9kZWxbXSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQncyBbZWxlbWVudF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYW4gW2F1dG9DcmVhdGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L21peGluL0NhbGVuZGFyTWl4aW4jY29uZmlnLWF1dG9DcmVhdGUpIGdlc3R1cmUgaGFzIGNyZWF0ZWQgYSBuZXcgZXZlbnRcbiAgICAgKiBhbmQgYWRkZWQgaXQgdG8gdGhlIGV2ZW50IHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjZXZlbnQtZXZlbnRBdXRvQ3JlYXRlZClcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDYWxlbmRhclZpZXd9IGV2ZW50LnNvdXJjZSBUaGlzIENhbGVuZGFyIHZpZXcgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtTY2hlZHVsZXIubW9kZWwuRXZlbnRNb2RlbH0gZXZlbnQuZXZlbnRSZWNvcmQgVGhlIG5ldyBldmVudCByZWNvcmQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXZlbnRBdXRvQ3JlYXRlZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ2FsZW5kYXJWaWV3LCBldmVudFJlY29yZDogRXZlbnRNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGRheSBzcGFubmluZyBldmVudCBpcyBmb3VuZCwgYW5kIHRoZSBkYXRlIHRvIHdoaWNoIGl0cyBlbmNhcHN1bGF0aW5nIGV2ZW50IGJhclxuICAgICAqIGV4dGVuZHMgaGFzIGJlZW4gY2FsY3VsYXRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2V2ZW50LWV2ZW50UHJvcGFnYXRlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmV2ZW50RW5kRGF0ZSBUaGUgZW5kIGRhdGUgZm9yIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgcHJvcGFnYXRlIGVuZCBkYXRlLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQucHJvcGFnYXRlRW5kRGF0ZSBUaGUgc3lzdGVtLWNhbGN1bGF0ZWQgZW5kIHBvaW50IG9mIHRoZSBldmVudCBiYXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc0FsbERheSBgdHJ1ZWAgaWYgdGhlIGV2ZW50IGlzIGFuIGFsbCBkYXkgZXZlbnQsIG9yIHNwYW5zIG11bHRpcGxlIGRheXMuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5pc092ZXJmbG93IGB0cnVlYCBpZiB0aGlzIGlzIGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIGZ1cnRoZXIgcHJvcGFnYXRpb24uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5vdmVyZmxvd3MgYHRydWVgIGlmIHRoZSBldmVudCBleHRlbmRzIGludG8gZnV0dXJlIGNlbGxzLlxuICAgICAqIEBwYXJhbSB7U2NoZWR1bGVyLm1vZGVsLkV2ZW50TW9kZWx9IGV2ZW50LmV2ZW50UmVjb3JkIFRoZSBldmVudCByZWNvcmQgYmVpbmcgcHJvcGFnYXRlZC5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50LmRhdGUgVGhlIGRhdGUgZnJvbSB3aGljaCB0aGUgZXZlbnQgaXMgYmVpbmcgcHJvcGFnYXRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FdmVudFByb3BhZ2F0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50RW5kRGF0ZTogRGF0ZSwgcHJvcGFnYXRlRW5kRGF0ZTogRGF0ZSwgaXNBbGxEYXk6IGJvb2xlYW4sIGlzT3ZlcmZsb3c6IGJvb2xlYW4sIG92ZXJmbG93czogYm9vbGVhbiwgZXZlbnRSZWNvcmQ6IEV2ZW50TW9kZWwsIGRhdGU6IERhdGUgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBleHBhbmRlZCB1c2luZyB0aGUgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5QYW5lbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBQYW5lbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYSBwYXJlbnQgbm9kZSByZWNvcmQgaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHdoaWNoIGhhcyBiZWVuIGV4cGFuZGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkV4cGFuZE5vZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBmaWxlIGlzIGRyb3BwZWQgb24gdGhlIHdpZGdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgb3duaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0RhdGFUcmFuc2Zlckl0ZW19IGV2ZW50LmZpbGUgVGhlIGRyb3BwZWQgZmlsZSBkZXNjcmlwdG9yXG4gICAgICogQHBhcmFtIHtEcmFnRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRHJhZ0V2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsZURyb3A6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGZpbGU6IERhdGFUcmFuc2Zlckl0ZW0sIGRvbUV2ZW50OiBEcmFnRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGUgRmlsbEhhbmRsZSBkcmFnZ2luZyBpcyBmaW5hbGl6ZWQgYW5kIHZhbHVlcyBhcmUgYXBwbGllZCB0byBjZWxscywgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGVcbiAgICAgKiBkcmFnIG9wZXJhdGlvbiBmcm9tIGFwcGx5aW5nIGRhdGEgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVCZWZvcmVEcmFnRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBmcm9tOiBHcmlkTG9jYXRpb24sIHRvOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hpbGUgZHJhZ2dpbmcgdGhlIEZpbGxIYW5kbGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuZnJvbSBUaGUgZnJvbSBjZWxsXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC50byBUaGUgdG8gY2VsbFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHJhdyBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25GaWxsSGFuZGxlRHJhZzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGZyb206IEdyaWRMb2NhdGlvbiwgdG86IEdyaWRMb2NhdGlvbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBGaWxsSGFuZGxlIGRyYWcgb3BlcmF0aW9uIGlzIGFib3J0ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsbEhhbmRsZURyYWdBYm9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKCkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGFmdGVyIGEgRmlsbEhhbmRsZSBkcmFnIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnRW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZnJvbTogR3JpZExvY2F0aW9uLCB0bzogR3JpZExvY2F0aW9uLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBkcmFnZ2luZyBvZiB0aGUgRmlsbEhhbmRsZSBzdGFydHMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQuY2VsbCBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29sdW1uIC8gcmVjb3JkXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBjZWxsOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gY2VsbCBlZGl0aW5nIGlzIGZpbmlzaGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge0NlbGxFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbmlzaENlbGxFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIHJvdyBlZGl0aW5nIGlzIGZpbmlzaGVkLCByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIHRoYXQgdGhlIHZhbHVlIGlzIGludmFsaWQgYW5kIGVkaXRpbmcgc2hvdWxkIG5vdCBiZSBmaW5hbGl6ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1maW5pc2hSb3dFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbmlzaFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBSb3dFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBlbnRlcnMgdGhpcyBXaWRnZXQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c0luOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGBibHVyYCBldmVudC5cbiAgICAgKiBmb2N1cyBtb3ZpbmcgZnJvbSB3aXRoaW4gdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZSwgZXZlbiBpZiB0aGVyZSBhcmUgZmxvYXRpbmcgd2lkZ2V0c1xuICAgICAqIHdpbGwgbm90IHRyaWdnZXIgdGhpcyBldmVudC4gVGhpcyBpcyB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgd2lkZ2V0IGNvbXBsZXRlbHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c091dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgZHJhZ2dpbmcgc3RhcnRzLCByZXR1cm4gZmFsc2UgdG8gcHJldmVudCB0aGUgZHJhZyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmNvbnRleHQucmVjb3JkcyBUaGUgZHJhZ2dlZCByb3cgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudCxUb3VjaEV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dCZWZvcmVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHJlY29yZHM6IE1vZGVsW10gfSwgZXZlbnQ6IE1vdXNlRXZlbnR8VG91Y2hFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGUgcm93IGRyb3Agb3BlcmF0aW9uIGlzIGZpbmFsaXplZC4gWW91IGNhbiByZXR1cm4gZmFsc2UgdG8gYWJvcnQgdGhlIGRyb3Agb3BlcmF0aW9uLCBvciBhXG4gICAgICogUHJvbWlzZSB5aWVsZGluZyBgdHJ1ZWAgLyBgZmFsc2VgIHdoaWNoIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIGFib3J0IChlLmcuIGZpcnN0IHNob3cgdXNlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cpLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkQmFzZX0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbnRleHQudmFsaWQgU2V0IHRoaXMgdG8gdHJ1ZSBvciBmYWxzZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkcm9wIHBvc2l0aW9uIGlzIHZhbGlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtSZWNvcmRQb3NpdGlvbkNvbnRleHRbXX0gZXZlbnQuY29udGV4dC5vbGRQb3NpdGlvbkNvbnRleHQgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyB0cmVlIHBvc2l0aW9uLiBPYmplY3RzIGNvbnRhaW4gdGhlIGByZWNvcmRgLCBhbmQgaXRzIG9yaWdpbmFsIGBwYXJlbnRJbmRleGAgYW5kIGBwYXJlbnRJZGAgdmFsdWVzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dCZWZvcmVEcm9wRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHZhbGlkOiBib29sZWFuLCBpbnNlcnRCZWZvcmU6IE1vZGVsLCBwYXJlbnQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBvbGRQb3NpdGlvbkNvbnRleHQ6IFJlY29yZFBvc2l0aW9uQ29udGV4dFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hpbGUgdGhlIHJvdyBpcyBiZWluZyBkcmFnZ2VkLCBpbiB0aGUgbGlzdGVuZXIgZnVuY3Rpb24geW91IGhhdmUgYWNjZXNzIHRvIGBjb250ZXh0Lmluc2VydEJlZm9yZWAgYSBncmlkIC9cbiAgICAgKiB0cmVlIHJlY29yZCwgYW5kIGFkZGl0aW9uYWxseSBgY29udGV4dC5wYXJlbnRgIChhIFRyZWVOb2RlKSBmb3IgdHJlZXMuIFlvdSBjYW4gc2lnbmFsIHRoYXQgdGhlIGRyb3AgcG9zaXRpb24gaXNcbiAgICAgKiB2YWxpZCBvciBpbnZhbGlkIGJ5IHNldHRpbmcgYGNvbnRleHQudmFsaWQgPSBmYWxzZTtgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC52YWxpZCBTZXQgdGhpcyB0byB0cnVlIG9yIGZhbHNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dEcmFnOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyB2YWxpZDogYm9vbGVhbiwgaW5zZXJ0QmVmb3JlOiBNb2RlbCwgcGFyZW50OiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHJvdyBkcmFnIG9wZXJhdGlvbiBpcyBhYm9ydGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmNvbnRleHQucmVjb3JkcyBUaGUgZHJhZ2dlZCByb3cgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJhZ0Fib3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyByZWNvcmRzOiBNb2RlbFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50LFRvdWNoRXZlbnR9IGV2ZW50LmV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uR3JpZFJvd0RyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudHxUb3VjaEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciB0aGUgcm93IGRyb3Agb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQsIHJlZ2FyZGxlc3Mgb2YgdmFsaWRpdHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gd2FzIHZhbGlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtSZWNvcmRQb3NpdGlvbkNvbnRleHRbXX0gZXZlbnQuY29udGV4dC5vbGRQb3NpdGlvbkNvbnRleHQgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyB0cmVlIHBvc2l0aW9uLiBPYmplY3RzIGNvbnRhaW4gdGhlIHJlY29yZCwgYW5kIGl0cyBvcmlnaW5hbCBgcGFyZW50SW5kZXhgIGFuZCBgcGFyZW50SWRgIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4sIGluc2VydEJlZm9yZTogTW9kZWwsIHBhcmVudDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIG9sZFBvc2l0aW9uQ29udGV4dDogUmVjb3JkUG9zaXRpb25Db250ZXh0W10gfSwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBncmlkIGhlYWRlciBpcyBjbGlja2VkIG9uLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9FdmVudExpc3QjZXZlbnQtaGVhZGVyQ2xpY2spXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSB0cmlnZ2VyaW5nIERPTSBldmVudC5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gY2xpY2tlZCBvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGRvbUV2ZW50OiBFdmVudCwgY29sdW1uOiBDb2x1bW4gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBoZWFkZXIuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0hlYWRlck1lbnUjY29uZmlnLXByb2Nlc3NJdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1oZWFkZXJNZW51QmVmb3JlU2hvdylcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhlYWRlck1lbnVCZWZvcmVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGNvbHVtbjogQ29sdW1uIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBhbiBpdGVtIGlzIHNlbGVjdGVkIGluIHRoZSBoZWFkZXIgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGVhZGVyTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW46IENvbHVtbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYWZ0ZXIgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBoZWFkZXJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5Pn0gZXZlbnQuaXRlbXMgTWVudSBpdGVtIGNvbmZpZ3NcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhlYWRlck1lbnVTaG93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtczogUmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT4sIGNvbHVtbjogQ29sdW1uIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGEgY2hlY2sgaXRlbSBpcyB0b2dnbGVkIGluIHRoZSBoZWFkZXIgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jaGVja2VkIENoZWNrZWQgb3Igbm90XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGVhZGVyTWVudVRvZ2dsZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW46IENvbHVtbiwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIGFmdGVyIGEgd2lkZ2V0IHdhcyBoaWRkZW5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGlkZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHJvdyBsb2NraW5nIGlzIGVuYWJsZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5jbG9uZSBUaGUgY3JlYXRlZCBjbG9uZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkxvY2tSb3dzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2xvbmU6IEdyaWRCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBNb3VzZSBtb3ZlZCBvdXQgZnJvbSBlbGVtZW50IGluIGdyaWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Nb3VzZU91dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBNb3VzZSBtb3ZlZCBpbiBvdmVyIGVsZW1lbnQgaW4gZ3JpZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgYnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbk1vdXNlT3ZlcjogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIHdpZGdldCB3aGljaCBoYWQgYmVlbiBpbiBhIG5vbi12aXNpYmxlIHN0YXRlIGZvciBhbnkgcmVhc29uXG4gICAgICogYWNoaWV2ZXMgdmlzaWJpbGl0eS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9DYWxlbmRhci93aWRnZXQvRXZlbnRMaXN0I2V2ZW50LXBhaW50KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgcGFpbnRlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmZpcnN0UGFpbnQgYHRydWVgIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHBhaW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBhaW50OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZpcnN0UGFpbnQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBhZnRlciBhIHBhc3RlIGFjdGlvbiBpcyBwZXJmb3JtZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmNsaXBib2FyZERhdGEgVGhlIGNsaXBib2FyZERhdGEgdGhhdCB3YXMgcGFzdGVkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQubW9kaWZpZWRSZWNvcmRzIFRoZSByZWNvcmRzIHdoaWNoIGhhdmUgYmVlbiBtb2RpZmllZCBkdWUgdG8gdGhlIHBhc3RlIGFjdGlvblxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQudGFyZ2V0Q2VsbCBUaGUgY2VsbCBmcm9tIHdoaWNoIHRoZSBwYXN0ZSB3aWxsIGJlIHN0YXJ0ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnY2VsbCcgdG8gZGlzdGluZ3Vpc2ggdGhpcyBldmVudCBmcm9tIG90aGVyIHBhc3RlIGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBhc3RlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjbGlwYm9hcmREYXRhOiBzdHJpbmcsIG1vZGlmaWVkUmVjb3JkczogTW9kZWxbXSwgdGFyZ2V0Q2VsbDogR3JpZExvY2F0aW9uLCBlbnRpdHlOYW1lOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGV4cG9ydCBoYXMgZmluaXNoZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtSZXNwb25zZX0gZXZlbnQucmVzcG9uc2UgT3B0aW9uYWwgcmVzcG9uc2UsIGlmIHJlY2VpdmVkXG4gICAgICogQHBhcmFtIHtFcnJvcn0gZXZlbnQuZXJyb3IgT3B0aW9uYWwgZXJyb3IsIGlmIGV4Y2VwdGlvbiBvY2N1cnJlZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblBkZkV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlc3BvbnNlPzogYW55LCBlcnJvcj86IEVycm9yIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSByYW5nZSBvZiBkYXRlcyBlbmNhcHN1bGF0ZWQgYnkgdGhpcyB2aWV3IGNoYW5nZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1yYW5nZUNoYW5nZSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHt0eXBlb2YgRGF0ZVJhbmdlT3duZXJ9IGV2ZW50LnNvdXJjZSBUaGlzIGNhbGVuZGFyIHZpZXcgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm9sZCBUaGUgb2xkIGRhdGUgcmFuZ2UgPHN0cm9uZz5pZiBhbnk8L3N0cm9uZz4uXG4gICAgICogQHBhcmFtIHtEYXRlfSBldmVudC5vbGQuc3RhcnREYXRlIHRoZSBvbGQgc3RhcnQgZGF0ZS5cbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm9sZC5lbmREYXRlIHRoZSBvbGQgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50Lm5ldyBUaGUgbmV3IGRhdGUgcmFuZ2VcbiAgICAgKiBAcGFyYW0ge0RhdGV9IGV2ZW50Lm5ldy5zdGFydERhdGUgdGhlIG5ldyBzdGFydCBkYXRlLlxuICAgICAqIEBwYXJhbSB7RGF0ZX0gZXZlbnQubmV3LmVuZERhdGUgdGhlIG5ldyBlbmQgZGF0ZS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SYW5nZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogdHlwZW9mIERhdGVSYW5nZU93bmVyLCBvbGQ6IHsgc3RhcnREYXRlOiBEYXRlLCBlbmREYXRlOiBEYXRlIH0sIG5ldzogeyBzdGFydERhdGU6IERhdGUsIGVuZERhdGU6IERhdGUgfSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIFdpZGdldCdzIHJlYWQgb25seSBzdGF0ZSBpcyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQucmVhZE9ubHkgUmVhZCBvbmx5IG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlYWRPbmx5OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVhZE9ubHk6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgYSB3aWRnZXQncyBlbGVtZW50cyBoYXZlIGJlZW4gc3luY2hyb25pemVkIGR1ZSB0byBhIGRpcmVjdCBvciBpbmRpcmVjdCBjYWxsXG4gICAgICogdG8gW3JlY29tcG9zZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9jYWxlbmRhci9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tcmVjb21wb3NlKSwgaWYgdGhpcyByZXN1bHRzIGluIHNvbWUgY2hhbmdlIHRvIHRoZSB3aWRnZXQncyByZW5kZXJlZCBET00gZWxlbWVudHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVjb21wb3NlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSByb3cgaXMgcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnJvdy5Sb3d9IGV2ZW50LnJvdyBUaGUgcm93IHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIGZvciB0aGUgcm93LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5yZWNvcmRJbmRleCBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgcmVjb3JkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlbmRlclJvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcm93OiBSb3csIHJlY29yZDogTW9kZWwsIHJlY29yZEluZGV4OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEdyaWQgcm93cyBoYXZlIGJlZW4gcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoaXMgZ3JpZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW5kZXJSb3dzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgb2YgYSBXaWRnZXQgcmVzaXplcyAqb25seSB3aGVuIFttb25pdG9yUmVzaXplXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbW9uaXRvclJlc2l6ZSkgaXMgYHRydWVgKi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGlzIFdpZGdldFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC53aWR0aCBUaGUgbmV3IHdpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LmhlaWdodCBUaGUgbmV3IGhlaWdodFxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5vbGRXaWR0aCBUaGUgb2xkIHdpZHRoXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZEhlaWdodCBUaGUgb2xkIGhlaWdodFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc2l6ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgb2xkV2lkdGg6IG51bWJlciwgb2xkSGVpZ2h0OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEdyaWQgcmVzaXplIGxlYWQgdG8gYSBuZXcgcmVzcG9uc2l2ZSBsZXZlbCBiZWluZyBhcHBsaWVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgR3JpZCB0aGF0IHdhcyByZXNpemVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmxldmVsIE5ldyByZXNwb25zaXZlIGxldmVsIChzbWFsbCwgbGFyZ2UsIGV0YylcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQud2lkdGggTmV3IHdpZHRoIGluIHB4XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50Lm9sZExldmVsIE9sZCByZXNwb25zaXZlIGxldmVsXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIE9sZCB3aWR0aCBpbiBweFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBsZXZlbDogc3RyaW5nLCB3aWR0aDogbnVtYmVyLCBvbGRMZXZlbDogc3RyaW5nLCBvbGRXaWR0aDogbnVtYmVyIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgd2hlbiBhIG5ldyBbcmVzcG9uc2l2ZVN0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L21peGluL1Jlc3BvbnNpdmUjY29uZmlnLXJlc3BvbnNpdmVTdGF0ZSkgaXMgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0IHdob3NlIGByZXNwb25zaXZlU3RhdGVgIGhhcyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnN0YXRlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5vbGRTdGF0ZSBUaGUgcHJldmlvdXMgdmFsdWUgZm9yIHRoZSB3aWRnZXQncyBgcmVzcG9uc2l2ZVN0YXRlYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlc3BvbnNpdmVTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBzdGF0ZTogc3RyaW5nLCBvbGRTdGF0ZTogc3RyaW5nIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW4gYSByb3cgaGFzIGZpbmlzaGVkIGNvbGxhcHNpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUm93Q29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyByZWNvcmQ6IE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIHdoZW4gYSByb3cgZXhwYW5kIGhhcyBmaW5pc2hlZCBleHBhbmRpbmcuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvQ2FsZW5kYXIvd2lkZ2V0L0V2ZW50TGlzdCNldmVudC1yb3dFeHBhbmQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmV4cGFuZGVkRWxlbWVudHMgQW4gb2JqZWN0IHdpdGggdGhlIEdyaWQgcmVnaW9uIG5hbWUgYXMgcHJvcGVydHkgYW5kIHRoZSBleHBhbmRlZCBib2R5IGVsZW1lbnQgYXMgdmFsdWVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQud2lkZ2V0IEluIGNhc2Ugb2YgZXhwYW5kaW5nIGEgV2lkZ2V0LCB0aGlzIHdpbGwgYmUgYSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIGNyZWF0ZWQgYnkgdGhlIGFjdHVhbCBleHBhbnNpb24uIElmIHRoZXJlIGlzIG11bHRpcGxlIEdyaWQgcmVnaW9ucywgdXNlIHRoZSBgd2lkZ2V0c2AgcGFyYW0gaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQud2lkZ2V0cyBJbiBjYXNlIG9mIGV4cGFuZGluZyBhIFdpZGdldCwgdGhpcyB3aWxsIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBHcmlkIHJlZ2lvbiBuYW1lIGFzIHByb3BlcnR5IGFuZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSB3aWRnZXQgaW5zdGFuY2UgY3JlYXRlZCBieSB0aGUgYWN0dWFsIGV4cGFuc2lvblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd0V4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGV4cGFuZGVkRWxlbWVudHM6IG9iamVjdCwgd2lkZ2V0OiBXaWRnZXQsIHdpZGdldHM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGEgcm93XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIGhvdmVyZWQgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIGN1cnJlbnRseSBob3ZlcmVkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd01vdXNlRW50ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSByb3dcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93IHRoYXQgdGhlIG1vdXNlIGxlZnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnQgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcmlkIGhhcyBzY3JvbGxlZCB2ZXJ0aWNhbGx5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnNjcm9sbFRvcCBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjcm9sbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc2Nyb2xsVG9wOiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHsnc2VsZWN0JywnZGVzZWxlY3QnfSBldmVudC5hY3Rpb24gYCdzZWxlY3QnYC9gJ2Rlc2VsZWN0J2BcbiAgICAgKiBAcGFyYW0geydyb3cnLCdjZWxsJ30gZXZlbnQubW9kZSBgJ3JvdydgL2AnY2VsbCdgXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBUaGUgcmVjb3JkcyBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGVkIFRoZSByZWNvcmRzIHNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBUaGUgcmVjb3JkcyBpbiB0aGUgbmV3IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuZGVzZWxlY3RlZENlbGxzIFRoZSBjZWxscyBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5zZWxlY3RlZENlbGxzIFRoZSBjZWxscyBzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbFNlbGVjdGlvbiBUaGUgY2VsbHMgaW4gdGhlIG5ldyBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgYWN0aW9uOiAnc2VsZWN0J3wnZGVzZWxlY3QnLCBtb2RlOiAncm93J3wnY2VsbCcsIHNvdXJjZTogR3JpZCwgZGVzZWxlY3RlZDogTW9kZWxbXSwgc2VsZWN0ZWQ6IE1vZGVsW10sIHNlbGVjdGlvbjogTW9kZWxbXSwgZGVzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25bXSwgc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uW10sIGNlbGxTZWxlY3Rpb246IEdyaWRMb2NhdGlvbltdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VsZWN0aW9uTW9kZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5zZWxlY3Rpb25Nb2RlIFRoZSBuZXcgW3NlbGVjdGlvbk1vZGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvY2FsZW5kYXIvZG9jcy9hcGkvR3JpZC92aWV3L21peGluL0dyaWRTZWxlY3Rpb24jY29uZmlnLXNlbGVjdGlvbk1vZGUpXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uTW9kZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNlbGVjdGlvbk1vZGU6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgW3NoaWZ0SW5jcmVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NhbGVuZGFyL3dpZGdldC9taXhpbi9EYXRlUmFuZ2VPd25lciNwcm9wZXJ0eS1zaGlmdEluY3JlbWVudCkgb2YgdGhpcyB2aWV3IGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vbGQgVGhlIHNoaWZ0IGluY3JlbWVudCAqaWYgYW55Ki5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQubmV3IFRoZSBzaGlmdCBpbmNyZW1lbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TaGlmdEluY3JlbWVudENoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IG9sZD86IG9iamVjdCwgbmV3OiBvYmplY3QgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCBpcyBzaG93bi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LnNvdXJjZSBUaGUgd2lkZ2V0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHNwbGl0dGluZyB0aGUgR3JpZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2VbXX0gZXZlbnQuc3ViVmlld3MgVGhlIHN1YiB2aWV3cyBjcmVhdGVkIGJ5IHRoZSBzcGxpdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5vcHRpb25zIFRoZSBvcHRpb25zIHBhc3NlZCB0byB0aGUgc3BsaXQgY2FsbFxuICAgICAqIEBwYXJhbSB7J2hvcml6b250YWwnLCd2ZXJ0aWNhbCcsJ2JvdGgnfSBldmVudC5vcHRpb25zLmRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBzcGxpdFxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5vcHRpb25zLmF0Q29sdW1uIFRoZSBjb2x1bW4gdG8gc3BsaXQgYXRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQub3B0aW9ucy5hdFJlY29yZCBUaGUgcmVjb3JkIHRvIHNwbGl0IGF0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzdWJWaWV3czogR3JpZEJhc2VbXSwgb3B0aW9uczogeyBkaXJlY3Rpb246ICdob3Jpem9udGFsJ3wndmVydGljYWwnfCdib3RoJywgYXRDb2x1bW46IENvbHVtbiwgYXRSZWNvcmQ6IE1vZGVsIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBHcmlkIHdoZW4gdGhlIGNvbGxhcHNlIGljb24gaXMgY2xpY2tlZC4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgZGVmYXVsdCBjb2xsYXBzZSBhY3Rpb24sXG4gICAgICogaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IHlvdXIgb3duIGJlaGF2aW9yLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgc3ViZ3JpZFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXR0ZXJDb2xsYXBzZUNsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCBhZnRlciBhIHN1Yi1ncmlkIGhhcyBiZWVuIHJlc2l6ZWQgdXNpbmcgdGhlIHNwbGl0dGVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSByZXNpemVkIHN1YmdyaWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyRHJhZ0VuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCB3aGVuIGEgc3ViLWdyaWQgcmVzaXplIGdlc3R1cmUgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWJncmlkIGFib3V0IHRvIGJlIHJlc2l6ZWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJ5IHRoZSBHcmlkIHdoZW4gdGhlIGV4cGFuZCBpY29uIGlzIGNsaWNrZWQuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgZXhwYW5kIGFjdGlvbixcbiAgICAgKiBpZiB5b3Ugd2FudCB0byBpbXBsZW1lbnQgeW91ciBvd24gYmVoYXZpb3IuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWJncmlkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TcGxpdHRlckV4cGFuZENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBzdWJHcmlkOiBTdWJHcmlkLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBlZGl0aW5nIHN0YXJ0c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q2VsbEVkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3RhcnRDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogQ2VsbEVkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGVkaXRpbmcgc3RhcnRzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN0YXJ0Um93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZWRpdG9yQ29udGV4dDogUm93RWRpdG9yQ29udGV4dCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBzdWIgZ3JpZCBpcyBjb2xsYXBzZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWIgZ3JpZCBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN1YkdyaWRDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSBzdWIgZ3JpZCBpcyBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBmaXJpbmcgR3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LlN1YkdyaWR9IGV2ZW50LnN1YkdyaWQgVGhlIHN1YiBncmlkIGluc3RhbmNlXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3ViR3JpZEV4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBvbmUgb3IgbW9yZSBncm91cHMgYXJlIGV4cGFuZGVkIG9yIGNvbGxhcHNlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQuZ3JvdXBSZWNvcmQgW0RFUFJFQ0FURURdIFVzZSBgZ3JvdXBSZWNvcmRzYCBwYXJhbSBpbnN0ZWFkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZ3JvdXBSZWNvcmRzIFRoZSBncm91cCByZWNvcmRzIGJlaW5nIHRvZ2dsZWRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIENvbGxhcHNlZCAodHJ1ZSkgb3IgZXhwYW5kZWQgKGZhbHNlKVxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuYWxsUmVjb3JkcyBUcnVlIGlmIHRoaXMgZXZlbnQgaXMgcGFydCBvZiB0b2dnbGluZyBhbGwgZ3JvdXBzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9nZ2xlR3JvdXA6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncm91cFJlY29yZDogTW9kZWwsIGdyb3VwUmVjb3JkczogTW9kZWxbXSwgY29sbGFwc2U6IGJvb2xlYW4sIGFsbFJlY29yZHM/OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBhIHBhcmVudCBub2RlIHJlY29yZCB0b2dnbGVzIGl0cyBjb2xsYXBzZWQgc3RhdGUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCBiZWluZyB0b2dnbGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29sbGFwc2UgYHRydWVgIGlmIHRoZSBub2RlIGlzIGJlaW5nIGNvbGxhcHNlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ub2dnbGVOb2RlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCwgY29sbGFwc2U6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEEgaGVhZGVyIFt0b29sXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2NhbGVuZGFyL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10b29scykgaGFzIGJlZW4gY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Ub29sfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnRvb2wgVGhlIHRvb2wgd2hpY2ggaXMgYmVpbmcgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ub29sQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRvb2wsIHRvb2w6IFRvb2wgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gcm93IGxvY2tpbmcgaXMgZGlzYWJsZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5jbG9uZSBUaGUgbG9ja2VkIGNsb25lIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25VbmxvY2tSb3dzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2xvbmU6IEdyaWRCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHVuLXNwbGl0dGluZyB0aGUgR3JpZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25VbnNwbGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIGFwcGVuZCB0aGUgdW5kZXJseWluZyB3aWRnZXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIG1lID0gdGhpcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdcbiAgICAgICAgICAgIH0gPSBtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNsYXNzLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlncyxcbiAgICAgICAgICAgICAgICBicnludHVtRXZlbnRzXG4gICAgICAgICAgICB9ID0gQnJ5bnR1bUV2ZW50TGlzdENvbXBvbmVudDtcblxuICAgICAgICBicnludHVtQ29uZmlncy5maWx0ZXIocHJvcCA9PiBwcm9wIGluIHRoaXMpLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGJyeW50dW1Db25maWcsIHByb3AsIHRoaXNbcHJvcF0pO1xuICAgICAgICAgICAgaWYgKFsnZmVhdHVyZXMnLCAnY29uZmlnJ10uaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb25maWdQcm9wKGluc3RhbmNlTmFtZSwgcHJvcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGJyeW50dW1FdmVudHMuZmlsdGVyKGV2ZW50ID0+IHRoaXNbZXZlbnRdICYmIHRoaXNbZXZlbnRdLm9ic2VydmVycy5sZW5ndGggPiAwKS5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgIGNvbnN0XG4gICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gKHN0cjogc3RyaW5nKSA9PiBzdHIuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSksXG4gICAgICAgICAgICAgICAgZXZlbnROYW1lID0gKHN0cjogc3RyaW5nKSA9PiB1bmNhcGl0YWxpemUoc3RyLnNsaWNlKDIpKTtcblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5saXN0ZW5lcnNbZXZlbnROYW1lKGV2ZW50KV0gPSBlID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbWVbZXZlbnRdLmVtaXQoZSk7XG4gICAgICAgICAgICAgICAgLy8gRXZlbnRFbWl0dGVyIGRvZXMgbm90IHJldHVybiB2YWx1ZXMgaW4gdGhlIG5vcm1hbCB3YXksIHdvcmsgYXJvdW5kIGl0IGJ5IHNldHRpbmcgYHJldHVyblZhbHVlYCBmbGFnXG4gICAgICAgICAgICAgICAgLy8gaW4gQW5ndWxhciBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIGNvbXBvbmVudCBoYXMgbm8gY29udGFpbmVyIHNwZWNpZmllZCBpbiBjb25maWcgdGhlbiB1c2UgYWRvcHQgdG8gV3JhcHBlcidzIGVsZW1lbnRcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIGNvbnRhaW5lclBhcmFtID0gW1xuICAgICAgICAgICAgICAgICdhZG9wdCcsXG4gICAgICAgICAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgICAgICAgICAnaW5zZXJ0QWZ0ZXInLFxuICAgICAgICAgICAgICAgICdpbnNlcnRCZWZvcmUnXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgXS5maW5kKHByb3AgPT4gYnJ5bnR1bUNvbmZpZ1twcm9wXSk7XG4gICAgICAgIGlmICghY29udGFpbmVyUGFyYW0pIHtcbiAgICAgICAgICAgIGlmIChpbnN0YW5jZU5hbWUgPT09ICdCdXR0b24nIHx8IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRSb290Tm9kZSgpIGluc3RhbmNlb2YgU2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIC8vIEJ1dHRvbiBzaG91bGQgYWx3YXlzIGJlIDxhPiBvciA8YnV0dG9uPiBpbnNpZGUgb3duZXIgZWxlbWVudFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYXBwZW5kVG8gPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlnLmFkb3B0ID0gZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nQ29udGFpbmVyKGluc3RhbmNlTmFtZSwgY29udGFpbmVyUGFyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZS5pbnN0YW5jZSA9IGluc3RhbmNlTmFtZSA9PT0gJ1dpZGdldCcgPyBXaWRnZXQuY3JlYXRlKGJyeW50dW1Db25maWcpIDogbmV3IGluc3RhbmNlQ2xhc3MoYnJ5bnR1bUNvbmZpZyk7XG5cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXYXRjaCBmb3IgY2hhbmdlc1xuICAgICAqIEBwYXJhbSBjaGFuZ2VzXG4gICAgICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBjb25zdFxuICAgICAgICAgICAgeyBpbnN0YW5jZSB9ID0gdGhpcyxcbiAgICAgICAgICAgIHsgaW5zdGFuY2VOYW1lIH0gPSBCcnludHVtRXZlbnRMaXN0Q29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1FdmVudExpc3RDb21wb25lbnQ7XG4gICAgICAgICAgICBpZiAoYnJ5bnR1bVByb3BzLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5hcHBseVByb3BWYWx1ZShpbnN0YW5jZSwgcHJvcCwgbmV3VmFsdWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAoYnJ5bnR1bUNvbmZpZ3NPbmx5LmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ1VwZGF0ZVByb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICh0aGlzLmluc3RhbmNlICYmIHRoaXMuaW5zdGFuY2UuZGVzdHJveSkge1xuICAgICAgICAgICAgdGhpcy5pbnN0YW5jZS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|