@bryntum/grid-angular 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.
Files changed (132) hide show
  1. package/README.md +44 -0
  2. package/bryntum-grid-angular.d.ts +5 -0
  3. package/bundles/bryntum-grid-angular.umd.js +49212 -0
  4. package/bundles/bryntum-grid-angular.umd.js.map +1 -0
  5. package/esm2015/bryntum-grid-angular.js +5 -0
  6. package/esm2015/lib/bryntum-a-i-filter-field.component.js +791 -0
  7. package/esm2015/lib/bryntum-button-group.component.js +725 -0
  8. package/esm2015/lib/bryntum-button.component.js +715 -0
  9. package/esm2015/lib/bryntum-chat-panel.component.js +839 -0
  10. package/esm2015/lib/bryntum-checkbox-group.component.js +854 -0
  11. package/esm2015/lib/bryntum-checkbox.component.js +805 -0
  12. package/esm2015/lib/bryntum-checklist-filter-combo.component.js +943 -0
  13. package/esm2015/lib/bryntum-chip-view.component.js +727 -0
  14. package/esm2015/lib/bryntum-code-editor.component.js +818 -0
  15. package/esm2015/lib/bryntum-color-field.component.js +794 -0
  16. package/esm2015/lib/bryntum-combo.component.js +932 -0
  17. package/esm2015/lib/bryntum-container.component.js +681 -0
  18. package/esm2015/lib/bryntum-date-field.component.js +831 -0
  19. package/esm2015/lib/bryntum-date-picker.component.js +1008 -0
  20. package/esm2015/lib/bryntum-date-range-field.component.js +835 -0
  21. package/esm2015/lib/bryntum-date-time-field.component.js +752 -0
  22. package/esm2015/lib/bryntum-demo-code-editor.component.js +830 -0
  23. package/esm2015/lib/bryntum-demo-header.component.js +171 -0
  24. package/esm2015/lib/bryntum-display-field.component.js +772 -0
  25. package/esm2015/lib/bryntum-duration-field.component.js +815 -0
  26. package/esm2015/lib/bryntum-editor.component.js +823 -0
  27. package/esm2015/lib/bryntum-field-filter-picker-group.component.js +758 -0
  28. package/esm2015/lib/bryntum-field-filter-picker.component.js +740 -0
  29. package/esm2015/lib/bryntum-field-set.component.js +810 -0
  30. package/esm2015/lib/bryntum-file-field.component.js +776 -0
  31. package/esm2015/lib/bryntum-file-picker.component.js +709 -0
  32. package/esm2015/lib/bryntum-filter-field.component.js +803 -0
  33. package/esm2015/lib/bryntum-fullscreen-button.component.js +53 -0
  34. package/esm2015/lib/bryntum-grid-base.component.js +2099 -0
  35. package/esm2015/lib/bryntum-grid-chart-designer.component.js +588 -0
  36. package/esm2015/lib/bryntum-grid-field-filter-picker-group.component.js +754 -0
  37. package/esm2015/lib/bryntum-grid-field-filter-picker.component.js +744 -0
  38. package/esm2015/lib/bryntum-grid.component.js +2103 -0
  39. package/esm2015/lib/bryntum-group-bar.component.js +727 -0
  40. package/esm2015/lib/bryntum-hint.component.js +856 -0
  41. package/esm2015/lib/bryntum-label.component.js +584 -0
  42. package/esm2015/lib/bryntum-list.component.js +715 -0
  43. package/esm2015/lib/bryntum-menu.component.js +883 -0
  44. package/esm2015/lib/bryntum-month-picker.component.js +818 -0
  45. package/esm2015/lib/bryntum-number-field.component.js +800 -0
  46. package/esm2015/lib/bryntum-paging-toolbar.component.js +736 -0
  47. package/esm2015/lib/bryntum-panel.component.js +794 -0
  48. package/esm2015/lib/bryntum-password-field.component.js +768 -0
  49. package/esm2015/lib/bryntum-radio-group.component.js +826 -0
  50. package/esm2015/lib/bryntum-radio.component.js +805 -0
  51. package/esm2015/lib/bryntum-slide-toggle.component.js +805 -0
  52. package/esm2015/lib/bryntum-slider.component.js +661 -0
  53. package/esm2015/lib/bryntum-splitter.component.js +618 -0
  54. package/esm2015/lib/bryntum-tab-panel.component.js +842 -0
  55. package/esm2015/lib/bryntum-text-area-field.component.js +776 -0
  56. package/esm2015/lib/bryntum-text-area-picker-field.component.js +798 -0
  57. package/esm2015/lib/bryntum-text-field.component.js +783 -0
  58. package/esm2015/lib/bryntum-time-field.component.js +819 -0
  59. package/esm2015/lib/bryntum-time-picker.component.js +709 -0
  60. package/esm2015/lib/bryntum-toolbar.component.js +732 -0
  61. package/esm2015/lib/bryntum-tree-combo.component.js +932 -0
  62. package/esm2015/lib/bryntum-tree-grid.component.js +2103 -0
  63. package/esm2015/lib/bryntum-widget.component.js +580 -0
  64. package/esm2015/lib/bryntum-year-picker.component.js +827 -0
  65. package/esm2015/lib/grid.module.js +314 -0
  66. package/esm2015/lib/wrapper.helper.js +74 -0
  67. package/esm2015/public-api.js +64 -0
  68. package/fesm2015/bryntum-grid-angular.js +48622 -0
  69. package/fesm2015/bryntum-grid-angular.js.map +1 -0
  70. package/lib/bryntum-a-i-filter-field.component.d.ts +968 -0
  71. package/lib/bryntum-button-group.component.d.ts +860 -0
  72. package/lib/bryntum-button.component.d.ts +845 -0
  73. package/lib/bryntum-chat-panel.component.d.ts +1060 -0
  74. package/lib/bryntum-checkbox-group.component.d.ts +1094 -0
  75. package/lib/bryntum-checkbox.component.d.ts +968 -0
  76. package/lib/bryntum-checklist-filter-combo.component.d.ts +1210 -0
  77. package/lib/bryntum-chip-view.component.d.ts +872 -0
  78. package/lib/bryntum-code-editor.component.d.ts +1045 -0
  79. package/lib/bryntum-color-field.component.d.ts +965 -0
  80. package/lib/bryntum-combo.component.d.ts +1199 -0
  81. package/lib/bryntum-container.component.d.ts +822 -0
  82. package/lib/bryntum-date-field.component.d.ts +1025 -0
  83. package/lib/bryntum-date-picker.component.d.ts +1338 -0
  84. package/lib/bryntum-date-range-field.component.d.ts +1027 -0
  85. package/lib/bryntum-date-time-field.component.d.ts +912 -0
  86. package/lib/bryntum-demo-code-editor.component.d.ts +1061 -0
  87. package/lib/bryntum-demo-header.component.d.ts +29 -0
  88. package/lib/bryntum-display-field.component.d.ts +949 -0
  89. package/lib/bryntum-duration-field.component.d.ts +1008 -0
  90. package/lib/bryntum-editor.component.d.ts +969 -0
  91. package/lib/bryntum-field-filter-picker-group.component.d.ts +935 -0
  92. package/lib/bryntum-field-filter-picker.component.d.ts +903 -0
  93. package/lib/bryntum-field-set.component.d.ts +1038 -0
  94. package/lib/bryntum-file-field.component.d.ts +952 -0
  95. package/lib/bryntum-file-picker.component.d.ts +847 -0
  96. package/lib/bryntum-filter-field.component.d.ts +993 -0
  97. package/lib/bryntum-fullscreen-button.component.d.ts +20 -0
  98. package/lib/bryntum-grid-base.component.d.ts +2271 -0
  99. package/lib/bryntum-grid-chart-designer.component.d.ts +691 -0
  100. package/lib/bryntum-grid-field-filter-picker-group.component.d.ts +929 -0
  101. package/lib/bryntum-grid-field-filter-picker.component.d.ts +916 -0
  102. package/lib/bryntum-grid.component.d.ts +2273 -0
  103. package/lib/bryntum-group-bar.component.d.ts +872 -0
  104. package/lib/bryntum-hint.component.d.ts +1117 -0
  105. package/lib/bryntum-label.component.d.ts +683 -0
  106. package/lib/bryntum-list.component.d.ts +849 -0
  107. package/lib/bryntum-menu.component.d.ts +1129 -0
  108. package/lib/bryntum-month-picker.component.d.ts +1034 -0
  109. package/lib/bryntum-number-field.component.d.ts +995 -0
  110. package/lib/bryntum-paging-toolbar.component.d.ts +886 -0
  111. package/lib/bryntum-panel.component.d.ts +1015 -0
  112. package/lib/bryntum-password-field.component.d.ts +939 -0
  113. package/lib/bryntum-radio-group.component.d.ts +1068 -0
  114. package/lib/bryntum-radio.component.d.ts +968 -0
  115. package/lib/bryntum-slide-toggle.component.d.ts +968 -0
  116. package/lib/bryntum-slider.component.d.ts +776 -0
  117. package/lib/bryntum-splitter.component.d.ts +714 -0
  118. package/lib/bryntum-tab-panel.component.d.ts +1065 -0
  119. package/lib/bryntum-text-area-field.component.d.ts +951 -0
  120. package/lib/bryntum-text-area-picker-field.component.d.ts +972 -0
  121. package/lib/bryntum-text-field.component.d.ts +957 -0
  122. package/lib/bryntum-time-field.component.d.ts +1006 -0
  123. package/lib/bryntum-time-picker.component.d.ts +853 -0
  124. package/lib/bryntum-toolbar.component.d.ts +879 -0
  125. package/lib/bryntum-tree-combo.component.d.ts +1199 -0
  126. package/lib/bryntum-tree-grid.component.d.ts +2273 -0
  127. package/lib/bryntum-widget.component.d.ts +678 -0
  128. package/lib/bryntum-year-picker.component.d.ts +1049 -0
  129. package/lib/grid.module.d.ts +65 -0
  130. package/lib/wrapper.helper.d.ts +26 -0
  131. package/package.json +33 -0
  132. package/public-api.d.ts +60 -0
@@ -0,0 +1,2099 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /**
3
+ * Angular wrapper for Bryntum GridBase
4
+ */
5
+ import { Component, EventEmitter, Output, Input } from '@angular/core';
6
+ import WrapperHelper from './wrapper.helper';
7
+ import { GridBase, Widget } from '@bryntum/grid';
8
+ import { StringHelper } from '@bryntum/grid';
9
+ import * as i0 from "@angular/core";
10
+ export class BryntumGridBaseComponent {
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
+ * Fires on the owning Grid before the cell editing is canceled, return `false` to prevent cancellation.
23
+ * @param {object} event Event object
24
+ * @param {Grid.view.Grid} event.source Owner grid
25
+ * @param {Grid.util.GridLocation} event.editorContext Editing context
26
+ */
27
+ this.onBeforeCancelCellEdit = new EventEmitter();
28
+ /**
29
+ * 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.
30
+ * ...
31
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-beforeCancelRowEdit)
32
+ * @param {object} event Event object
33
+ * @param {Grid.view.Grid} event.grid Target grid
34
+ * @param {RowEditorContext} event.editorContext Editing context
35
+ */
36
+ this.onBeforeCancelRowEdit = new EventEmitter();
37
+ /**
38
+ * Fires on the owning Grid before editing starts, return `false` to prevent editing
39
+ * @param {object} event Event object
40
+ * @param {Grid.view.Grid} event.source Owner grid
41
+ * @param {CellEditorContext} event.editorContext Editing context
42
+ */
43
+ this.onBeforeCellEditStart = new EventEmitter();
44
+ /**
45
+ * Fires on the owning Grid before deleting a range of selected cell values by pressing `Backspace` or `Del`
46
+ * buttons while [autoEdit](https://bryntum.com/products/grid/docs/api/Grid/feature/CellEdit#config-autoEdit) is set to `true`. Return `false` to prevent editing.
47
+ * @param {object} event Event object
48
+ * @param {Grid.view.Grid} event.source Owner grid
49
+ * @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).
50
+ */
51
+ this.onBeforeCellRangeDelete = new EventEmitter();
52
+ /**
53
+ * Fires for each selected record on the owning Grid before editing a range of selected cell values
54
+ * @param {object} event Event object
55
+ * @param {Core.data.Model} event.record Current selected record from the range
56
+ * @param {string} event.field The field being changed
57
+ * @param {any} event.value The value being set
58
+ */
59
+ this.onBeforeCellRangeEdit = new EventEmitter();
60
+ /**
61
+ * This event is fired prior to starting a column drag gesture. The drag is canceled if a listener returns `false`.
62
+ * @param {object} event Event object
63
+ * @param {Grid.view.Grid} event.source The grid instance.
64
+ * @param {Grid.column.Column} event.column The dragged column.
65
+ * @param {Event} event.event The browser event.
66
+ */
67
+ this.onBeforeColumnDragStart = new EventEmitter();
68
+ /**
69
+ * This event is fired when a column is dropped, and you can return false from a listener to abort the operation.
70
+ * @param {object} event Event object
71
+ * @param {Grid.view.Grid} event.source The grid instance.
72
+ * @param {Grid.column.Column} event.column The dragged column.
73
+ * @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
74
+ * @param {Grid.column.Column} event.newParent The new parent column.
75
+ * @param {Event} event.event The browser event.
76
+ * @param {string} event.region The region where the column was dropped.
77
+ */
78
+ this.onBeforeColumnDropFinalize = new EventEmitter();
79
+ /**
80
+ * This event is fired prior to starting a column resize gesture. The resize is canceled if a listener returns
81
+ * `false`.
82
+ * @param {object} event Event object
83
+ * @param {Grid.view.Grid} event.source The grid instance
84
+ * @param {Grid.column.Column} event.column The column
85
+ * @param {Event} event.domEvent The browser event
86
+ */
87
+ this.onBeforeColumnResize = new EventEmitter();
88
+ /**
89
+ * Fires on the owning Grid before a copy action is performed, return `false` to prevent the action
90
+ * @param {object} event Event object
91
+ * @param {Grid.view.Grid} event.source Owner grid
92
+ * @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
93
+ * @param {string} event.data The string data about to be copied or cut
94
+ * @param {boolean} event.isCut `true` if this is a cut action
95
+ * @param {string} event.entityName 'cell' to distinguish this event from other beforeCopy events
96
+ */
97
+ this.onBeforeCopy = new EventEmitter();
98
+ /**
99
+ * Fires on the owning Grid before CSV export starts. Return `false` to cancel the export.
100
+ * @param {object} event Event object
101
+ * @param {ExportConfig} event.config Export config
102
+ * @param {Grid.column.Column[]} event.columns An array of columns to export
103
+ * @param {Core.data.Model[]} event.rows An array of records to export
104
+ * @param {string} event.lineDelimiter The CSV delimiter to separate lines
105
+ * @param {string} event.columnDelimiter The CSV delimiter to separate values on one line
106
+ */
107
+ this.onBeforeCSVExport = new EventEmitter();
108
+ /**
109
+ * Fires before an object is destroyed.
110
+ * @param {object} event Event object
111
+ * @param {Core.Base} event.source The Object that is being destroyed.
112
+ */
113
+ this.onBeforeDestroy = new EventEmitter();
114
+ /**
115
+ * Fires on the owning Grid before Excel export starts. Return `false` to cancel the export.
116
+ * @param {object} event Event object
117
+ * @param {ExportConfig} event.config Export config
118
+ * @param {XLSColumn[]} event.columns An array of columns to export
119
+ * @param {any[][]} event.rows An array of records to export
120
+ */
121
+ this.onBeforeExcelExport = new EventEmitter();
122
+ /**
123
+ * Fired before dragging of the FillHandle starts, return `false` to prevent the drag operation.
124
+ * @param {object} event Event object
125
+ * @param {Grid.util.GridLocation} event.cell Information about the column / record
126
+ * @param {MouseEvent} event.domEvent The raw DOM event
127
+ */
128
+ this.onBeforeFillHandleDragStart = new EventEmitter();
129
+ /**
130
+ * 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.
131
+ * @param {object} event Event object
132
+ * @param {Grid.view.Grid} event.grid Target grid
133
+ * @param {CellEditorContext} event.editorContext Editing context
134
+ */
135
+ this.onBeforeFinishCellEdit = new EventEmitter();
136
+ /**
137
+ * 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.
138
+ * ...
139
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-beforeFinishRowEdit)
140
+ * @param {object} event Event object
141
+ * @param {Grid.view.Grid} event.grid Target grid
142
+ * @param {RowEditorContext} event.editorContext Editing context
143
+ */
144
+ this.onBeforeFinishRowEdit = new EventEmitter();
145
+ /**
146
+ * Triggered before a widget is hidden. Return `false` to prevent the action.
147
+ * @param {object} event Event object
148
+ * @param {Core.widget.Widget} event.source The widget being hidden.
149
+ */
150
+ this.onBeforeHide = new EventEmitter();
151
+ /**
152
+ * Fires on the owning Grid before a paste action is performed, return `false` to prevent the action
153
+ * @param {object} event Event object
154
+ * @param {Grid.view.Grid} event.source Owner grid
155
+ * @param {string} event.clipboardData The clipboardData about to be pasted
156
+ * @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
157
+ * @param {string} event.entityName 'cell' to distinguish this event from other beforePaste events
158
+ * @param {string} event.text The raw text from clipboard
159
+ */
160
+ this.onBeforePaste = new EventEmitter();
161
+ /**
162
+ * Fires on the owning Grid before export started. Return `false` to cancel the export.
163
+ * @param {object} event Event object
164
+ * @param {object} event.config Export config
165
+ */
166
+ this.onBeforePdfExport = new EventEmitter();
167
+ /**
168
+ * Fires before a row is rendered.
169
+ * @param {object} event Event object
170
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
171
+ * @param {Grid.row.Row} event.row The row about to be rendered.
172
+ * @param {Core.data.Model} event.record The record for the row.
173
+ * @param {number} event.recordIndex The zero-based index of the record.
174
+ */
175
+ this.onBeforeRenderRow = new EventEmitter();
176
+ /**
177
+ * Grid rows are about to be rendered
178
+ * @param {object} event Event object
179
+ * @param {Grid.view.Grid} event.source This grid.
180
+ */
181
+ this.onBeforeRenderRows = new EventEmitter();
182
+ /**
183
+ * This event fires before row collapse is started.
184
+ * ...
185
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-beforeRowCollapse)
186
+ * @param {object} event Event object
187
+ * @param {Core.data.Model} event.record Record
188
+ */
189
+ this.onBeforeRowCollapse = new EventEmitter();
190
+ /**
191
+ * This event fires before row expand is started.
192
+ * ...
193
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-beforeRowExpand)
194
+ * @param {object} event Event object
195
+ * @param {Core.data.Model} event.record Record
196
+ */
197
+ this.onBeforeRowExpand = new EventEmitter();
198
+ /**
199
+ * Fires before the selection changes. Returning `false` from a listener prevents the change
200
+ * @param {object} event Event object
201
+ * @param {string} event.action `'select'`/`'deselect'`
202
+ * @param {'row','cell'} event.mode `'row'`/`'cell'`
203
+ * @param {Grid.view.Grid} event.source
204
+ * @param {Core.data.Model[]} event.deselected The records to be deselected in this operation.
205
+ * @param {Core.data.Model[]} event.selected The records to be selected in this operation.
206
+ * @param {Core.data.Model[]} event.selection The records in the current selection, before applying `selected` and `deselected`
207
+ * @param {Grid.util.GridLocation[]} event.deselectedCells The cells to be deselected in this operation.
208
+ * @param {Grid.util.GridLocation[]} event.selectedCells The cells to be selected in this operation.
209
+ * @param {Grid.util.GridLocation[]} event.cellSelection The cells in the current selection, before applying `selectedCells` and `deselectedCells`
210
+ */
211
+ this.onBeforeSelectionChange = new EventEmitter();
212
+ /**
213
+ * Fired before this container will load record values into its child fields. This is useful if you
214
+ * want to modify the UI before data is loaded (e.g. set some input field to be readonly)
215
+ * @param {object} event Event object
216
+ * @param {Core.widget.Container} event.source The container
217
+ * @param {Core.data.Model} event.record The record
218
+ */
219
+ this.onBeforeSetRecord = new EventEmitter();
220
+ /**
221
+ * Triggered before a widget is shown. Return `false` to prevent the action.
222
+ * @param {object} event Event object
223
+ * @param {Core.widget.Widget,any} event.source The widget being shown
224
+ */
225
+ this.onBeforeShow = new EventEmitter();
226
+ /**
227
+ * Fires on the owning Grid before editing starts, return `false` to prevent editing
228
+ * @param {object} event Event object
229
+ * @param {Grid.view.Grid} event.source Owner grid
230
+ * @param {RowEditorContext} event.editorContext Editing context
231
+ */
232
+ this.onBeforeStartRowEdit = new EventEmitter();
233
+ /**
234
+ * Fired before state is applied to the source. Allows editing the state object or preventing the operation.
235
+ * @param {object} event Event object
236
+ * @param {GridStateInfo} event.state State object config
237
+ */
238
+ this.onBeforeStateApply = new EventEmitter();
239
+ /**
240
+ * Fired before state is saved by the StateProvider. Allows editing the state object or preventing the operation.
241
+ * @param {object} event Event object
242
+ * @param {GridStateInfo} event.state State object config
243
+ */
244
+ this.onBeforeStateSave = new EventEmitter();
245
+ /**
246
+ * Fired when a group is going to be expanded or collapsed using the UI.
247
+ * Returning `false` from a listener prevents the operation
248
+ * @param {object} event Event object
249
+ * @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
250
+ * @param {Core.data.Model[]} event.groupRecords The group records being toggled
251
+ * @param {boolean} event.collapse Collapsed (true) or expanded (false)
252
+ * @param {Event} event.domEvent The user interaction event (eg a `click` event) if the toggle request was instigated by user interaction.
253
+ */
254
+ this.onBeforeToggleGroup = new EventEmitter();
255
+ /**
256
+ * Fired before a parent node record toggles its collapsed state.
257
+ * @param {object} event Event object
258
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
259
+ * @param {Core.data.Model} event.record The record being toggled.
260
+ * @param {boolean} event.collapse `true` if the node is being collapsed.
261
+ */
262
+ this.onBeforeToggleNode = new EventEmitter();
263
+ /**
264
+ * Fires on the owning Grid when editing is cancelled
265
+ * @param {object} event Event object
266
+ * @param {Grid.view.Grid} event.source Owner grid
267
+ * @param {Grid.util.GridLocation} event.editorContext Editing context
268
+ * @param {Event} event.event Included if the cancellation was triggered by a DOM event
269
+ */
270
+ this.onCancelCellEdit = new EventEmitter();
271
+ /**
272
+ * Fires when any other event is fired from the object.
273
+ * ...
274
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-catchAll)
275
+ * @param {object} event Event object
276
+ * @param {{[key: string]: any, type: string}} event.event The Object that contains event details
277
+ * @param {string} event.event.type The type of the event which is caught by the listener
278
+ */
279
+ this.onCatchAll = new EventEmitter();
280
+ /**
281
+ * Fired when user clicks in a grid cell
282
+ * @param {object} event Event object
283
+ * @param {Grid.view.Grid} event.grid The grid instance
284
+ * @param {Core.data.Model} event.record The record representing the row
285
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
286
+ * @param {HTMLElement} event.cellElement The cell HTML element
287
+ * @param {HTMLElement} event.target The target element
288
+ * @param {MouseEvent} event.event The native DOM event
289
+ */
290
+ this.onCellClick = new EventEmitter();
291
+ /**
292
+ * Fired when user activates contextmenu in a grid cell
293
+ * @param {object} event Event object
294
+ * @param {Grid.view.Grid} event.grid The grid instance
295
+ * @param {Core.data.Model} event.record The record representing the row
296
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
297
+ * @param {HTMLElement} event.cellElement The cell HTML element
298
+ * @param {HTMLElement} event.target The target element
299
+ * @param {MouseEvent} event.event The native DOM event
300
+ */
301
+ this.onCellContextMenu = new EventEmitter();
302
+ /**
303
+ * Fired when user double clicks a grid cell
304
+ * @param {object} event Event object
305
+ * @param {Grid.view.Grid} event.grid The grid instance
306
+ * @param {Core.data.Model} event.record The record representing the row
307
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
308
+ * @param {HTMLElement} event.cellElement The cell HTML element
309
+ * @param {HTMLElement} event.target The target element
310
+ * @param {MouseEvent} event.event The native DOM event
311
+ */
312
+ this.onCellDblClick = new EventEmitter();
313
+ /**
314
+ * This event fires on the owning grid before the context menu is shown for a cell.
315
+ * Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/grid/docs/api/Grid/feature/CellMenu#config-processItems).
316
+ * ...
317
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-cellMenuBeforeShow)
318
+ * @param {object} event Event object
319
+ * @param {Grid.view.Grid} event.source The grid
320
+ * @param {Core.widget.Menu} event.menu The menu
321
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
322
+ * @param {Grid.column.Column} event.column Column
323
+ * @param {Core.data.Model} event.record Record
324
+ */
325
+ this.onCellMenuBeforeShow = new EventEmitter();
326
+ /**
327
+ * This event fires on the owning grid when an item is selected in the cell context menu.
328
+ * @param {object} event Event object
329
+ * @param {Grid.view.Grid} event.source The grid
330
+ * @param {Core.widget.Menu} event.menu The menu
331
+ * @param {Core.widget.MenuItem} event.item Selected menu item
332
+ * @param {Grid.column.Column} event.column Column
333
+ * @param {Core.data.Model} event.record Record
334
+ */
335
+ this.onCellMenuItem = new EventEmitter();
336
+ /**
337
+ * This event fires on the owning grid after the context menu is shown for a cell.
338
+ * @param {object} event Event object
339
+ * @param {Grid.view.Grid} event.source The grid
340
+ * @param {Core.widget.Menu} event.menu The menu
341
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
342
+ * @param {Grid.column.Column} event.column Column
343
+ * @param {Core.data.Model} event.record Record
344
+ */
345
+ this.onCellMenuShow = new EventEmitter();
346
+ /**
347
+ * This event fires on the owning grid when a check item is toggled in the cell context menu.
348
+ * @param {object} event Event object
349
+ * @param {Grid.view.Grid} event.source The grid
350
+ * @param {Core.widget.Menu} event.menu The menu
351
+ * @param {Core.widget.MenuItem} event.item Selected menu item
352
+ * @param {Grid.column.Column} event.column Column
353
+ * @param {Core.data.Model} event.record Record
354
+ * @param {boolean} event.checked Checked or not
355
+ */
356
+ this.onCellMenuToggleItem = new EventEmitter();
357
+ /**
358
+ * Fired when the mouse enters a cell
359
+ * @param {object} event Event object
360
+ * @param {Grid.view.Grid} event.source The grid instance
361
+ * @param {Core.data.Model} event.record The record representing the hovered cell
362
+ * @param {Grid.column.Column} event.column The column currently hovered
363
+ * @param {HTMLElement} event.cellElement The cell HTML element
364
+ * @param {MouseEvent} event.event The native DOM event
365
+ */
366
+ this.onCellMouseEnter = new EventEmitter();
367
+ /**
368
+ * Fired when the mouse leaves a cell
369
+ * @param {object} event Event object
370
+ * @param {Grid.view.Grid} event.source The grid instance
371
+ * @param {Core.data.Model} event.record The record representing the cell that the mouse left
372
+ * @param {Grid.column.Column} event.column The column representing the cell that the mouse left
373
+ * @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
374
+ * @param {MouseEvent} event.event The native DOM event
375
+ */
376
+ this.onCellMouseLeave = new EventEmitter();
377
+ /**
378
+ * Fired when a user moves the mouse out of a grid cell
379
+ * @param {object} event Event object
380
+ * @param {Grid.view.Grid} event.grid The grid instance
381
+ * @param {Core.data.Model} event.record The record representing the row
382
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
383
+ * @param {HTMLElement} event.cellElement The cell HTML element
384
+ * @param {HTMLElement} event.target The target element
385
+ * @param {MouseEvent} event.event The native DOM event
386
+ */
387
+ this.onCellMouseOut = new EventEmitter();
388
+ /**
389
+ * Fired when user moves the mouse over a grid cell
390
+ * @param {object} event Event object
391
+ * @param {Grid.view.Grid} event.grid The grid instance
392
+ * @param {Core.data.Model} event.record The record representing the row
393
+ * @param {Grid.column.Column} event.column The column to which the cell belongs
394
+ * @param {HTMLElement} event.cellElement The cell HTML element
395
+ * @param {HTMLElement} event.target The target element
396
+ * @param {MouseEvent} event.event The native DOM event
397
+ */
398
+ this.onCellMouseOver = new EventEmitter();
399
+ /**
400
+ * Fires when a Panel is collapsed using the [collapsible](https://bryntum.com/products/grid/docs/api/Core/widget/Panel#config-collapsible) setting.
401
+ * @param {object} event Event object
402
+ * @param {Core.widget.Panel} event.source This Panel.
403
+ */
404
+ this.onCollapse = new EventEmitter();
405
+ /**
406
+ * Fired before a parent node record is collapsed.
407
+ * @param {object} event Event object
408
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
409
+ * @param {Core.data.Model} event.record The record which has been collapsed.
410
+ */
411
+ this.onCollapseNode = new EventEmitter();
412
+ /**
413
+ * This event is fired when a column is being dragged, and you can set the `valid` flag on the `context` object
414
+ * to indicate whether the drop position is valid or not.
415
+ * @param {object} event Event object
416
+ * @param {Grid.view.Grid} event.source The grid instance.
417
+ * @param {Grid.column.Column} event.column The dragged column.
418
+ * @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted (if not last).
419
+ * @param {Event} event.event The browser event.
420
+ * @param {object} event.context
421
+ * @param {boolean} event.context.valid Set this to `true` or `false` to indicate whether the drop position is valid.
422
+ */
423
+ this.onColumnDrag = new EventEmitter();
424
+ /**
425
+ * This event is fired when a column drag gesture has started.
426
+ * @param {object} event Event object
427
+ * @param {Grid.view.Grid} event.source The grid instance.
428
+ * @param {Grid.column.Column} event.column The dragged column.
429
+ * @param {Event} event.event The browser event.
430
+ */
431
+ this.onColumnDragStart = new EventEmitter();
432
+ /**
433
+ * This event is always fired after a column is dropped. The `valid` param is `true` if the operation was not
434
+ * vetoed and the column was moved in the column store.
435
+ * @param {object} event Event object
436
+ * @param {Grid.view.Grid} event.source The grid instance.
437
+ * @param {Grid.column.Column} event.column The dragged column.
438
+ * @param {Grid.column.Column} event.insertBefore The column before which the dragged column will be inserted.
439
+ * @param {Grid.column.Column} event.newParent The new parent column.
440
+ * @param {boolean} event.valid `true` if the operation was not vetoed.
441
+ * @param {Event} event.event The browser event.
442
+ * @param {string} event.region The region where the column was dropped.
443
+ */
444
+ this.onColumnDrop = new EventEmitter();
445
+ /**
446
+ * This event is fired after a resize gesture is completed.
447
+ * @param {object} event Event object
448
+ * @param {Grid.view.Grid} event.source The grid instance
449
+ * @param {Grid.column.Column} event.column The resized column
450
+ * @param {Event} event.domEvent The browser event
451
+ */
452
+ this.onColumnResize = new EventEmitter();
453
+ /**
454
+ * This event is fired when a column resize gesture starts.
455
+ * @param {object} event Event object
456
+ * @param {Grid.view.Grid} event.source The grid instance
457
+ * @param {Grid.column.Column} event.column The column
458
+ * @param {Event} event.domEvent The browser event
459
+ */
460
+ this.onColumnResizeStart = new EventEmitter();
461
+ /**
462
+ * This event fires on the owning widget when an item is selected in the context menu.
463
+ * @param {object} event Event object
464
+ * @param {Core.widget.Widget} event.source The owning widget
465
+ * @param {Core.widget.Menu} event.menu The menu
466
+ * @param {Core.widget.MenuItem} event.item Selected menu item
467
+ */
468
+ this.onContextMenuItem = new EventEmitter();
469
+ /**
470
+ * This event fires on the owning widget when a check item is toggled in the context menu.
471
+ * @param {object} event Event object
472
+ * @param {Core.widget.Widget} event.source The owning widget
473
+ * @param {Core.widget.Menu} event.menu The menu
474
+ * @param {Core.widget.MenuItem} event.item Selected menu item
475
+ * @param {boolean} event.checked Checked or not
476
+ */
477
+ this.onContextMenuToggleItem = new EventEmitter();
478
+ /**
479
+ * Fires on the owning Grid after a copy action is performed.
480
+ * @param {object} event Event object
481
+ * @param {Grid.view.Grid} event.source Owner grid
482
+ * @param {Grid.util.GridLocation[]} event.cells The cells about to be copied or cut
483
+ * @param {string} event.copiedDataString The concatenated data string that was copied or cut
484
+ * @param {boolean} event.isCut `true` if this was a cut action
485
+ * @param {string} event.entityName 'cell' to distinguish this event from other copy events
486
+ */
487
+ this.onCopy = new EventEmitter();
488
+ /**
489
+ * Fired when data in the store changes.
490
+ * ...
491
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-dataChange)
492
+ * @param {object} event Event object
493
+ * @param {Grid.view.Grid} event.source Owning grid
494
+ * @param {Core.data.Store} event.store The originating store
495
+ * @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'`
496
+ * @param {Core.data.Model} event.record Changed record, for actions that affects exactly one record (`'update'`)
497
+ * @param {Core.data.Model[]} event.records Changed records, passed for all actions except `'removeAll'`
498
+ * @param {object} event.changes Passed for the `'update'` action, info on which record fields changed
499
+ */
500
+ this.onDataChange = new EventEmitter();
501
+ /**
502
+ * Fires when an object is destroyed.
503
+ * @param {object} event Event object
504
+ * @param {Core.Base} event.source The Object that is being destroyed.
505
+ */
506
+ this.onDestroy = new EventEmitter();
507
+ /**
508
+ * Fires when a field is mutated and the state of the [hasChanges](https://bryntum.com/products/grid/docs/api/Core/widget/Container#property-hasChanges) property changes
509
+ * @param {object} event Event object
510
+ * @param {Core.widget.Container} event.source The container.
511
+ * @param {boolean} event.dirty The dirty state of the Container - `true` if there are any fields which have been changed since initial load.
512
+ */
513
+ this.onDirtyStateChange = new EventEmitter();
514
+ /**
515
+ * Fires while drag selecting. UI will update with current range, but the cells will not be selected until
516
+ * mouse up. This event can be listened for to perform actions while drag selecting.
517
+ * @param {object} event Event object
518
+ * @param {Grid.view.Grid} event.source
519
+ * @param {GridLocationConfig[],Grid.util.GridLocation[]} event.selectedCells The cells that is currently being dragged over
520
+ * @param {Core.data.Model[]} event.selectedRecords The records that is currently being dragged over
521
+ */
522
+ this.onDragSelecting = new EventEmitter();
523
+ /**
524
+ * Triggered when a widget's [element](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#property-element) is available.
525
+ * @param {object} event Event object
526
+ * @param {HTMLElement} event.element The Widget's element.
527
+ */
528
+ this.onElementCreated = new EventEmitter();
529
+ /**
530
+ * Fires when a Panel is expanded using the [collapsible](https://bryntum.com/products/grid/docs/api/Core/widget/Panel#config-collapsible) setting.
531
+ * @param {object} event Event object
532
+ * @param {Core.widget.Panel} event.source This Panel.
533
+ */
534
+ this.onExpand = new EventEmitter();
535
+ /**
536
+ * Fired after a parent node record is expanded.
537
+ * @param {object} event Event object
538
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
539
+ * @param {Core.data.Model} event.record The record which has been expanded.
540
+ */
541
+ this.onExpandNode = new EventEmitter();
542
+ /**
543
+ * Fired when a file is dropped on the widget element
544
+ * @param {object} event Event object
545
+ * @param {Grid.view.Grid} event.source The owning Grid instance
546
+ * @param {DataTransferItem} event.file The dropped file descriptor
547
+ * @param {DragEvent} event.domEvent The native DragEvent
548
+ */
549
+ this.onFileDrop = new EventEmitter();
550
+ /**
551
+ * Fired before the FillHandle dragging is finalized and values are applied to cells, return `false` to prevent the
552
+ * drag operation from applying data changes.
553
+ * @param {object} event Event object
554
+ * @param {Grid.util.GridLocation} event.from The from cell
555
+ * @param {Grid.util.GridLocation} event.to The to cell
556
+ * @param {MouseEvent} event.domEvent The raw DOM event
557
+ */
558
+ this.onFillHandleBeforeDragFinalize = new EventEmitter();
559
+ /**
560
+ * Fired while dragging the FillHandle.
561
+ * @param {object} event Event object
562
+ * @param {Grid.util.GridLocation} event.from The from cell
563
+ * @param {Grid.util.GridLocation} event.to The to cell
564
+ * @param {MouseEvent} event.domEvent The raw DOM event
565
+ */
566
+ this.onFillHandleDrag = new EventEmitter();
567
+ /**
568
+ * Fired when a FillHandle drag operation is aborted.
569
+ */
570
+ this.onFillHandleDragAbort = new EventEmitter();
571
+ /**
572
+ * Fired after a FillHandle drag operation.
573
+ * @param {object} event Event object
574
+ * @param {Grid.util.GridLocation} event.from The from cell
575
+ * @param {Grid.util.GridLocation} event.to The to cell
576
+ * @param {MouseEvent} event.domEvent The raw DOM event
577
+ */
578
+ this.onFillHandleDragEnd = new EventEmitter();
579
+ /**
580
+ * Fired when dragging of the FillHandle starts.
581
+ * @param {object} event Event object
582
+ * @param {Grid.util.GridLocation} event.cell Information about the column / record
583
+ * @param {MouseEvent} event.domEvent The raw DOM event
584
+ */
585
+ this.onFillHandleDragStart = new EventEmitter();
586
+ /**
587
+ * Fires on the owning Grid when cell editing is finished
588
+ * @param {object} event Event object
589
+ * @param {Grid.view.Grid} event.grid Target grid
590
+ * @param {CellEditorContext} event.editorContext Editing context
591
+ */
592
+ this.onFinishCellEdit = new EventEmitter();
593
+ /**
594
+ * 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.
595
+ * ...
596
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-finishRowEdit)
597
+ * @param {object} event Event object
598
+ * @param {Grid.view.Grid} event.grid Target grid
599
+ * @param {RowEditorContext} event.editorContext Editing context
600
+ */
601
+ this.onFinishRowEdit = new EventEmitter();
602
+ /**
603
+ * Fired when focus enters this Widget.
604
+ * @param {object} event Event object
605
+ * @param {Core.widget.Widget} event.source This Widget
606
+ * @param {HTMLElement} event.fromElement The element which lost focus.
607
+ * @param {HTMLElement} event.toElement The element which gained focus.
608
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
609
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
610
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
611
+ */
612
+ this.onFocusIn = new EventEmitter();
613
+ /**
614
+ * Fired when focus exits this Widget's ownership tree. This is different from a `blur` event.
615
+ * focus moving from within this Widget's ownership tree, even if there are floating widgets
616
+ * will not trigger this event. This is when focus exits this widget completely.
617
+ * @param {object} event Event object
618
+ * @param {Core.widget.Widget} event.source This Widget
619
+ * @param {HTMLElement} event.fromElement The element which lost focus.
620
+ * @param {HTMLElement} event.toElement The element which gained focus.
621
+ * @param {Core.widget.Widget} event.fromWidget The widget which lost focus.
622
+ * @param {Core.widget.Widget} event.toWidget The widget which gained focus.
623
+ * @param {boolean} event.backwards `true` if the `toElement` is before the `fromElement` in document order.
624
+ */
625
+ this.onFocusOut = new EventEmitter();
626
+ /**
627
+ * Fired before dragging starts, return false to prevent the drag operation.
628
+ * @param {object} event Event object
629
+ * @param {Grid.view.GridBase} event.source
630
+ * @param {object} event.context
631
+ * @param {Core.data.Model[]} event.context.records The dragged row records
632
+ * @param {MouseEvent,TouchEvent} event.event
633
+ */
634
+ this.onGridRowBeforeDragStart = new EventEmitter();
635
+ /**
636
+ * Fired before the row drop operation is finalized. You can return false to abort the drop operation, or a
637
+ * Promise yielding `true` / `false` which allows for asynchronous abort (e.g. first show user a confirmation dialog).
638
+ * @param {object} event Event object
639
+ * @param {Grid.view.GridBase} event.source
640
+ * @param {object} event.context
641
+ * @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid
642
+ * @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
643
+ * @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
644
+ * @param {Core.data.Model[]} event.context.records The dragged row records
645
+ * @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
646
+ * @param {MouseEvent} event.event
647
+ */
648
+ this.onGridRowBeforeDropFinalize = new EventEmitter();
649
+ /**
650
+ * Fired while the row is being dragged, in the listener function you have access to `context.insertBefore` a grid /
651
+ * tree record, and additionally `context.parent` (a TreeNode) for trees. You can signal that the drop position is
652
+ * valid or invalid by setting `context.valid = false;`
653
+ * @param {object} event Event object
654
+ * @param {Grid.view.GridBase} event.source
655
+ * @param {object} event.context
656
+ * @param {boolean} event.context.valid Set this to true or false to indicate whether the drop position is valid.
657
+ * @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
658
+ * @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
659
+ * @param {Core.data.Model[]} event.context.records The dragged row records
660
+ * @param {MouseEvent} event.event
661
+ */
662
+ this.onGridRowDrag = new EventEmitter();
663
+ /**
664
+ * Fired when a row drag operation is aborted
665
+ * @param {object} event Event object
666
+ * @param {Grid.view.GridBase} event.source
667
+ * @param {object} event.context
668
+ * @param {Core.data.Model[]} event.context.records The dragged row records
669
+ * @param {MouseEvent} event.event
670
+ */
671
+ this.onGridRowDragAbort = new EventEmitter();
672
+ /**
673
+ * Fired when dragging starts.
674
+ * @param {object} event Event object
675
+ * @param {Grid.view.GridBase} event.source
676
+ * @param {object} event.context
677
+ * @param {Core.data.Model[]} event.context.records The dragged row records
678
+ * @param {MouseEvent,TouchEvent} event.event
679
+ */
680
+ this.onGridRowDragStart = new EventEmitter();
681
+ /**
682
+ * Fired after the row drop operation has completed, regardless of validity
683
+ * @param {object} event Event object
684
+ * @param {Grid.view.GridBase} event.source
685
+ * @param {object} event.context
686
+ * @param {boolean} event.context.valid true or false depending on whether the drop position was valid
687
+ * @param {Core.data.Model} event.context.insertBefore The record to insert before (`null` if inserting at last position of a parent node)
688
+ * @param {Core.data.Model} event.context.parent The parent record of the current drop position (only applicable for trees)
689
+ * @param {Core.data.Model[]} event.context.records The dragged row records
690
+ * @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
691
+ * @param {MouseEvent} event.event
692
+ */
693
+ this.onGridRowDrop = new EventEmitter();
694
+ /**
695
+ * Fired when a grid header is clicked on.
696
+ * ...
697
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-headerClick)
698
+ * @param {object} event Event object
699
+ * @param {Event} event.domEvent The triggering DOM event.
700
+ * @param {Grid.column.Column} event.column The column clicked on.
701
+ */
702
+ this.onHeaderClick = new EventEmitter();
703
+ /**
704
+ * This event fires on the owning Grid before the context menu is shown for a header.
705
+ * Allows manipulation of the items to show in the same way as in the [processItems](https://bryntum.com/products/grid/docs/api/Grid/feature/HeaderMenu#config-processItems).
706
+ * ...
707
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-headerMenuBeforeShow)
708
+ * @param {object} event Event object
709
+ * @param {Grid.view.Grid} event.source The grid
710
+ * @param {Core.widget.Menu} event.menu The menu
711
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
712
+ * @param {Grid.column.Column} event.column Column
713
+ */
714
+ this.onHeaderMenuBeforeShow = new EventEmitter();
715
+ /**
716
+ * This event fires on the owning Grid when an item is selected in the header context menu.
717
+ * @param {object} event Event object
718
+ * @param {Grid.view.Grid} event.source The grid
719
+ * @param {Core.widget.Menu} event.menu The menu
720
+ * @param {Core.widget.MenuItem} event.item Selected menu item
721
+ * @param {Grid.column.Column} event.column Column
722
+ */
723
+ this.onHeaderMenuItem = new EventEmitter();
724
+ /**
725
+ * This event fires on the owning Grid after the context menu is shown for a header
726
+ * @param {object} event Event object
727
+ * @param {Grid.view.Grid} event.source The grid
728
+ * @param {Core.widget.Menu} event.menu The menu
729
+ * @param {Record<string, MenuItemEntry>} event.items Menu item configs
730
+ * @param {Grid.column.Column} event.column Column
731
+ */
732
+ this.onHeaderMenuShow = new EventEmitter();
733
+ /**
734
+ * This event fires on the owning Grid when a check item is toggled in the header context menu.
735
+ * @param {object} event Event object
736
+ * @param {Grid.view.Grid} event.source The grid
737
+ * @param {Core.widget.Menu} event.menu The menu
738
+ * @param {Core.widget.MenuItem} event.item Selected menu item
739
+ * @param {Grid.column.Column} event.column Column
740
+ * @param {boolean} event.checked Checked or not
741
+ */
742
+ this.onHeaderMenuToggleItem = new EventEmitter();
743
+ /**
744
+ * Triggered after a widget was hidden
745
+ * @param {object} event Event object
746
+ * @param {Core.widget.Widget} event.source The widget
747
+ */
748
+ this.onHide = new EventEmitter();
749
+ /**
750
+ * Fires when row locking is enabled.
751
+ * @param {object} event Event object
752
+ * @param {Grid.view.GridBase} event.clone The created clone
753
+ */
754
+ this.onLockRows = new EventEmitter();
755
+ /**
756
+ * Mouse moved out from element in grid
757
+ * @param {object} event Event object
758
+ * @param {MouseEvent} event.event The native browser event
759
+ */
760
+ this.onMouseOut = new EventEmitter();
761
+ /**
762
+ * Mouse moved in over element in grid
763
+ * @param {object} event Event object
764
+ * @param {MouseEvent} event.event The native browser event
765
+ */
766
+ this.onMouseOver = new EventEmitter();
767
+ /**
768
+ * Triggered when a widget which had been in a non-visible state for any reason
769
+ * achieves visibility.
770
+ * ...
771
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-paint)
772
+ * @param {object} event Event object
773
+ * @param {Core.widget.Widget} event.source The widget being painted.
774
+ * @param {boolean} event.firstPaint `true` if this is the first paint.
775
+ */
776
+ this.onPaint = new EventEmitter();
777
+ /**
778
+ * Fires on the owning Grid after a paste action is performed.
779
+ * @param {object} event Event object
780
+ * @param {Grid.view.Grid} event.source Owner grid
781
+ * @param {string} event.clipboardData The clipboardData that was pasted
782
+ * @param {Core.data.Model[]} event.modifiedRecords The records which have been modified due to the paste action
783
+ * @param {Grid.util.GridLocation} event.targetCell The cell from which the paste will be started
784
+ * @param {string} event.entityName 'cell' to distinguish this event from other paste events
785
+ */
786
+ this.onPaste = new EventEmitter();
787
+ /**
788
+ * Fires on the owning Grid when export has finished
789
+ * @param {object} event Event object
790
+ * @param {Response} event.response Optional response, if received
791
+ * @param {Error} event.error Optional error, if exception occurred
792
+ */
793
+ this.onPdfExport = new EventEmitter();
794
+ /**
795
+ * Fired when a Widget's read only state is toggled
796
+ * @param {object} event Event object
797
+ * @param {boolean} event.readOnly Read only or not
798
+ */
799
+ this.onReadOnly = new EventEmitter();
800
+ /**
801
+ * This event is fired after a widget's elements have been synchronized due to a direct or indirect call
802
+ * to [recompose](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#function-recompose), if this results in some change to the widget's rendered DOM elements.
803
+ */
804
+ this.onRecompose = new EventEmitter();
805
+ /**
806
+ * Fires after a row is rendered.
807
+ * @param {object} event Event object
808
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
809
+ * @param {Grid.row.Row} event.row The row that has been rendered.
810
+ * @param {Core.data.Model} event.record The record for the row.
811
+ * @param {number} event.recordIndex The zero-based index of the record.
812
+ */
813
+ this.onRenderRow = new EventEmitter();
814
+ /**
815
+ * Grid rows have been rendered
816
+ * @param {object} event Event object
817
+ * @param {Grid.view.Grid} event.source This grid.
818
+ */
819
+ this.onRenderRows = new EventEmitter();
820
+ /**
821
+ * Fired when the encapsulating element of a Widget resizes *only when [monitorResize](https://bryntum.com/products/grid/docs/api/Core/widget/Widget#config-monitorResize) is `true`*.
822
+ * @param {object} event Event object
823
+ * @param {Core.widget.Widget} event.source This Widget
824
+ * @param {number} event.width The new width
825
+ * @param {number} event.height The new height
826
+ * @param {number} event.oldWidth The old width
827
+ * @param {number} event.oldHeight The old height
828
+ */
829
+ this.onResize = new EventEmitter();
830
+ /**
831
+ * Grid resize lead to a new responsive level being applied
832
+ * @param {object} event Event object
833
+ * @param {Grid.view.Grid} event.grid Grid that was resized
834
+ * @param {string} event.level New responsive level (small, large, etc)
835
+ * @param {number} event.width New width in px
836
+ * @param {string} event.oldLevel Old responsive level
837
+ * @param {number} event.oldWidth Old width in px
838
+ */
839
+ this.onResponsive = new EventEmitter();
840
+ /**
841
+ * This event fires when a row has finished collapsing.
842
+ * @param {object} event Event object
843
+ * @param {Core.data.Model} event.record Record
844
+ */
845
+ this.onRowCollapse = new EventEmitter();
846
+ /**
847
+ * This event fires when a row expand has finished expanding.
848
+ * ...
849
+ * [View online docs...](https://bryntum.com/products/grid/docs/api/Grid/view/GridBase#event-rowExpand)
850
+ * @param {object} event Event object
851
+ * @param {Core.data.Model} event.record Record
852
+ * @param {object} event.expandedElements An object with the Grid region name as property and the expanded body element as value
853
+ * @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.
854
+ * @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
855
+ */
856
+ this.onRowExpand = new EventEmitter();
857
+ /**
858
+ * Fired when the mouse enters a row
859
+ * @param {object} event Event object
860
+ * @param {Grid.view.Grid} event.source The grid instance
861
+ * @param {Core.data.Model} event.record The record representing the hovered row
862
+ * @param {Grid.column.Column} event.column The column currently hovered
863
+ * @param {HTMLElement} event.cellElement The cell HTML element
864
+ * @param {MouseEvent} event.event The native DOM event
865
+ */
866
+ this.onRowMouseEnter = new EventEmitter();
867
+ /**
868
+ * Fired when the mouse leaves a row
869
+ * @param {object} event Event object
870
+ * @param {Grid.view.Grid} event.source The grid instance
871
+ * @param {Core.data.Model} event.record The record representing the row that the mouse left
872
+ * @param {HTMLElement} event.cellElement The cell HTML element that the mouse left
873
+ * @param {MouseEvent} event.event The native DOM event
874
+ */
875
+ this.onRowMouseLeave = new EventEmitter();
876
+ /**
877
+ * Grid has scrolled vertically
878
+ * @param {object} event Event object
879
+ * @param {Grid.view.Grid} event.source The firing Grid instance.
880
+ * @param {number} event.scrollTop The vertical scroll position.
881
+ */
882
+ this.onScroll = new EventEmitter();
883
+ /**
884
+ * The selection has been changed.
885
+ * @param {object} event Event object
886
+ * @param {'select','deselect'} event.action `'select'`/`'deselect'`
887
+ * @param {'row','cell'} event.mode `'row'`/`'cell'`
888
+ * @param {Grid.view.Grid} event.source
889
+ * @param {Core.data.Model[]} event.deselected The records deselected in this operation.
890
+ * @param {Core.data.Model[]} event.selected The records selected in this operation.
891
+ * @param {Core.data.Model[]} event.selection The records in the new selection.
892
+ * @param {Grid.util.GridLocation[]} event.deselectedCells The cells deselected in this operation.
893
+ * @param {Grid.util.GridLocation[]} event.selectedCells The cells selected in this operation.
894
+ * @param {Grid.util.GridLocation[]} event.cellSelection The cells in the new selection.
895
+ */
896
+ this.onSelectionChange = new EventEmitter();
897
+ /**
898
+ * The selectionMode configuration has been changed.
899
+ * @param {object} event Event object
900
+ * @param {object} event.selectionMode The new [selectionMode](https://bryntum.com/products/grid/docs/api/Grid/view/mixin/GridSelection#config-selectionMode)
901
+ */
902
+ this.onSelectionModeChange = new EventEmitter();
903
+ /**
904
+ * Triggered after a widget is shown.
905
+ * @param {object} event Event object
906
+ * @param {Core.widget.Widget} event.source The widget
907
+ */
908
+ this.onShow = new EventEmitter();
909
+ /**
910
+ * Fires when splitting the Grid.
911
+ * @param {object} event Event object
912
+ * @param {Grid.view.GridBase[]} event.subViews The sub views created by the split
913
+ * @param {object} event.options The options passed to the split call
914
+ * @param {'horizontal','vertical','both'} event.options.direction The direction of the split
915
+ * @param {Grid.column.Column} event.options.atColumn The column to split at
916
+ * @param {Core.data.Model} event.options.atRecord The record to split at
917
+ */
918
+ this.onSplit = new EventEmitter();
919
+ /**
920
+ * Fired by the Grid when the collapse icon is clicked. Return `false` to prevent the default collapse action,
921
+ * if you want to implement your own behavior.
922
+ * @param {object} event Event object
923
+ * @param {Grid.view.Grid} event.source The Grid instance.
924
+ * @param {Grid.view.SubGrid} event.subGrid The subgrid
925
+ * @param {Event} event.domEvent The native DOM event
926
+ */
927
+ this.onSplitterCollapseClick = new EventEmitter();
928
+ /**
929
+ * Fired by the Grid after a sub-grid has been resized using the splitter
930
+ * @param {object} event Event object
931
+ * @param {Grid.view.Grid} event.source The Grid instance.
932
+ * @param {Grid.view.SubGrid} event.subGrid The resized subgrid
933
+ * @param {Event} event.domEvent The native DOM event
934
+ */
935
+ this.onSplitterDragEnd = new EventEmitter();
936
+ /**
937
+ * Fired by the Grid when a sub-grid resize gesture starts
938
+ * @param {object} event Event object
939
+ * @param {Grid.view.Grid} event.source The Grid instance.
940
+ * @param {Grid.view.SubGrid} event.subGrid The subgrid about to be resized
941
+ * @param {Event} event.domEvent The native DOM event
942
+ */
943
+ this.onSplitterDragStart = new EventEmitter();
944
+ /**
945
+ * Fired by the Grid when the expand icon is clicked. Return `false` to prevent the default expand action,
946
+ * if you want to implement your own behavior.
947
+ * @param {object} event Event object
948
+ * @param {Grid.view.Grid} event.source The Grid instance.
949
+ * @param {Grid.view.SubGrid} event.subGrid The subgrid
950
+ * @param {Event} event.domEvent The native DOM event
951
+ */
952
+ this.onSplitterExpandClick = new EventEmitter();
953
+ /**
954
+ * Fires on the owning Grid when editing starts
955
+ * @param {object} event Event object
956
+ * @param {Grid.view.Grid} event.source Owner grid
957
+ * @param {CellEditorContext} event.editorContext Editing context
958
+ */
959
+ this.onStartCellEdit = new EventEmitter();
960
+ /**
961
+ * Fires on the owning Grid when editing starts
962
+ * @param {object} event Event object
963
+ * @param {Grid.view.Grid} event.source Owner grid
964
+ * @param {RowEditorContext} event.editorContext Editing context
965
+ */
966
+ this.onStartRowEdit = new EventEmitter();
967
+ /**
968
+ * Fires after a sub grid is collapsed.
969
+ * @param {object} event Event object
970
+ * @param {Grid.view.Grid} event.source The firing Grid instance
971
+ * @param {Grid.view.SubGrid} event.subGrid The sub grid instance
972
+ */
973
+ this.onSubGridCollapse = new EventEmitter();
974
+ /**
975
+ * Fires after a sub grid is expanded.
976
+ * @param {object} event Event object
977
+ * @param {Grid.view.Grid} event.source The firing Grid instance
978
+ * @param {Grid.view.SubGrid} event.subGrid The sub grid instance
979
+ */
980
+ this.onSubGridExpand = new EventEmitter();
981
+ /**
982
+ * Fired when one or more groups are expanded or collapsed
983
+ * @param {object} event Event object
984
+ * @param {Core.data.Model} event.groupRecord [DEPRECATED] Use `groupRecords` param instead
985
+ * @param {Core.data.Model[]} event.groupRecords The group records being toggled
986
+ * @param {boolean} event.collapse Collapsed (true) or expanded (false)
987
+ * @param {boolean} event.allRecords True if this event is part of toggling all groups
988
+ */
989
+ this.onToggleGroup = new EventEmitter();
990
+ /**
991
+ * Fired after a parent node record toggles its collapsed state.
992
+ * @param {object} event Event object
993
+ * @param {Core.data.Model} event.record The record being toggled.
994
+ * @param {boolean} event.collapse `true` if the node is being collapsed.
995
+ */
996
+ this.onToggleNode = new EventEmitter();
997
+ /**
998
+ * A header [tool](https://bryntum.com/products/grid/docs/api/Core/widget/Panel#config-tools) has been clicked.
999
+ * @param {object} event Event object
1000
+ * @param {Core.widget.Tool} event.source This Panel.
1001
+ * @param {Core.widget.Tool} event.tool The tool which is being clicked.
1002
+ */
1003
+ this.onToolClick = new EventEmitter();
1004
+ /**
1005
+ * Fires when row locking is disabled.
1006
+ * @param {object} event Event object
1007
+ * @param {Grid.view.GridBase} event.clone The locked clone that will be destroyed
1008
+ */
1009
+ this.onUnlockRows = new EventEmitter();
1010
+ /**
1011
+ * Fires when un-splitting the Grid.
1012
+ */
1013
+ this.onUnsplit = new EventEmitter();
1014
+ this.elementRef = element;
1015
+ }
1016
+ /**
1017
+ * Create and append the underlying widget
1018
+ */
1019
+ ngOnInit() {
1020
+ const me = this, { elementRef, bryntumConfig } = me, { instanceClass, instanceName, bryntumConfigs, bryntumEvents } = BryntumGridBaseComponent;
1021
+ bryntumConfigs.filter(prop => prop in this).forEach(prop => {
1022
+ // @ts-ignore
1023
+ WrapperHelper.applyPropValue(bryntumConfig, prop, this[prop]);
1024
+ if (['features', 'config'].includes(prop)) {
1025
+ WrapperHelper.devWarningConfigProp(instanceName, prop);
1026
+ }
1027
+ });
1028
+ // @ts-ignore
1029
+ bryntumEvents.filter(event => this[event] && this[event].observers.length > 0).forEach(event => {
1030
+ const uncapitalize = (str) => str.charAt(0).toLowerCase() + str.slice(1), eventName = (str) => uncapitalize(str.slice(2));
1031
+ // @ts-ignore
1032
+ bryntumConfig.listeners[eventName(event)] = e => {
1033
+ // @ts-ignore
1034
+ me[event].emit(e);
1035
+ // EventEmitter does not return values in the normal way, work around it by setting `returnValue` flag
1036
+ // in Angular listeners
1037
+ return e.returnValue;
1038
+ };
1039
+ });
1040
+ // If component has no container specified in config then use adopt to Wrapper's element
1041
+ const containerParam = [
1042
+ 'adopt',
1043
+ 'appendTo',
1044
+ 'insertAfter',
1045
+ 'insertBefore'
1046
+ // @ts-ignore
1047
+ ].find(prop => bryntumConfig[prop]);
1048
+ if (!containerParam) {
1049
+ if (instanceName === 'Button' || elementRef.nativeElement.getRootNode() instanceof ShadowRoot) {
1050
+ // Button should always be <a> or <button> inside owner element
1051
+ bryntumConfig.appendTo = elementRef.nativeElement;
1052
+ }
1053
+ else {
1054
+ bryntumConfig.adopt = elementRef.nativeElement;
1055
+ }
1056
+ }
1057
+ else {
1058
+ WrapperHelper.devWarningContainer(instanceName, containerParam);
1059
+ }
1060
+ // @ts-ignore
1061
+ me.instance = instanceName === 'Widget' ? Widget.create(bryntumConfig) : new instanceClass(bryntumConfig);
1062
+ // Backwards compatibility for gridInstance, schedulerInstance etc.
1063
+ // @ts-ignore
1064
+ me[StringHelper.uncapitalize(instanceName) + 'Instance'] = me.instance;
1065
+ //
1066
+ }
1067
+ /**
1068
+ * Watch for changes
1069
+ * @param changes
1070
+ */
1071
+ ngOnChanges(changes) {
1072
+ const { instance } = this, { instanceName } = BryntumGridBaseComponent;
1073
+ if (!instance) {
1074
+ return;
1075
+ }
1076
+ // Iterate over all changes
1077
+ Object.entries(changes).forEach(([prop, change]) => {
1078
+ const newValue = change.currentValue, { instance } = this, { bryntumConfigsOnly, bryntumProps } = BryntumGridBaseComponent;
1079
+ if (bryntumProps.includes(prop)) {
1080
+ WrapperHelper.applyPropValue(instance, prop, newValue, false);
1081
+ if (bryntumConfigsOnly.includes(prop)) {
1082
+ WrapperHelper.devWarningUpdateProp(instanceName, prop);
1083
+ }
1084
+ }
1085
+ });
1086
+ }
1087
+ /**
1088
+ * Destroy the component
1089
+ */
1090
+ ngOnDestroy() {
1091
+ // @ts-ignore
1092
+ if (this.instance && this.instance.destroy) {
1093
+ this.instance.destroy();
1094
+ }
1095
+ }
1096
+ }
1097
+ BryntumGridBaseComponent.instanceClass = GridBase;
1098
+ BryntumGridBaseComponent.instanceName = 'GridBase';
1099
+ BryntumGridBaseComponent.bryntumEvents = [
1100
+ 'onBeforeCancelCellEdit',
1101
+ 'onBeforeCancelRowEdit',
1102
+ 'onBeforeCellEditStart',
1103
+ 'onBeforeCellRangeDelete',
1104
+ 'onBeforeCellRangeEdit',
1105
+ 'onBeforeColumnDragStart',
1106
+ 'onBeforeColumnDropFinalize',
1107
+ 'onBeforeColumnResize',
1108
+ 'onBeforeCopy',
1109
+ 'onBeforeCSVExport',
1110
+ 'onBeforeDestroy',
1111
+ 'onBeforeExcelExport',
1112
+ 'onBeforeFillHandleDragStart',
1113
+ 'onBeforeFinishCellEdit',
1114
+ 'onBeforeFinishRowEdit',
1115
+ 'onBeforeHide',
1116
+ 'onBeforePaste',
1117
+ 'onBeforePdfExport',
1118
+ 'onBeforeRenderRow',
1119
+ 'onBeforeRenderRows',
1120
+ 'onBeforeRowCollapse',
1121
+ 'onBeforeRowExpand',
1122
+ 'onBeforeSelectionChange',
1123
+ 'onBeforeSetRecord',
1124
+ 'onBeforeShow',
1125
+ 'onBeforeStartRowEdit',
1126
+ 'onBeforeStateApply',
1127
+ 'onBeforeStateSave',
1128
+ 'onBeforeToggleGroup',
1129
+ 'onBeforeToggleNode',
1130
+ 'onCancelCellEdit',
1131
+ 'onCatchAll',
1132
+ 'onCellClick',
1133
+ 'onCellContextMenu',
1134
+ 'onCellDblClick',
1135
+ 'onCellMenuBeforeShow',
1136
+ 'onCellMenuItem',
1137
+ 'onCellMenuShow',
1138
+ 'onCellMenuToggleItem',
1139
+ 'onCellMouseEnter',
1140
+ 'onCellMouseLeave',
1141
+ 'onCellMouseOut',
1142
+ 'onCellMouseOver',
1143
+ 'onCollapse',
1144
+ 'onCollapseNode',
1145
+ 'onColumnDrag',
1146
+ 'onColumnDragStart',
1147
+ 'onColumnDrop',
1148
+ 'onColumnResize',
1149
+ 'onColumnResizeStart',
1150
+ 'onContextMenuItem',
1151
+ 'onContextMenuToggleItem',
1152
+ 'onCopy',
1153
+ 'onDataChange',
1154
+ 'onDestroy',
1155
+ 'onDirtyStateChange',
1156
+ 'onDragSelecting',
1157
+ 'onElementCreated',
1158
+ 'onExpand',
1159
+ 'onExpandNode',
1160
+ 'onFileDrop',
1161
+ 'onFillHandleBeforeDragFinalize',
1162
+ 'onFillHandleDrag',
1163
+ 'onFillHandleDragAbort',
1164
+ 'onFillHandleDragEnd',
1165
+ 'onFillHandleDragStart',
1166
+ 'onFinishCellEdit',
1167
+ 'onFinishRowEdit',
1168
+ 'onFocusIn',
1169
+ 'onFocusOut',
1170
+ 'onGridRowBeforeDragStart',
1171
+ 'onGridRowBeforeDropFinalize',
1172
+ 'onGridRowDrag',
1173
+ 'onGridRowDragAbort',
1174
+ 'onGridRowDragStart',
1175
+ 'onGridRowDrop',
1176
+ 'onHeaderClick',
1177
+ 'onHeaderMenuBeforeShow',
1178
+ 'onHeaderMenuItem',
1179
+ 'onHeaderMenuShow',
1180
+ 'onHeaderMenuToggleItem',
1181
+ 'onHide',
1182
+ 'onLockRows',
1183
+ 'onMouseOut',
1184
+ 'onMouseOver',
1185
+ 'onPaint',
1186
+ 'onPaste',
1187
+ 'onPdfExport',
1188
+ 'onReadOnly',
1189
+ 'onRecompose',
1190
+ 'onRenderRow',
1191
+ 'onRenderRows',
1192
+ 'onResize',
1193
+ 'onResponsive',
1194
+ 'onRowCollapse',
1195
+ 'onRowExpand',
1196
+ 'onRowMouseEnter',
1197
+ 'onRowMouseLeave',
1198
+ 'onScroll',
1199
+ 'onSelectionChange',
1200
+ 'onSelectionModeChange',
1201
+ 'onShow',
1202
+ 'onSplit',
1203
+ 'onSplitterCollapseClick',
1204
+ 'onSplitterDragEnd',
1205
+ 'onSplitterDragStart',
1206
+ 'onSplitterExpandClick',
1207
+ 'onStartCellEdit',
1208
+ 'onStartRowEdit',
1209
+ 'onSubGridCollapse',
1210
+ 'onSubGridExpand',
1211
+ 'onToggleGroup',
1212
+ 'onToggleNode',
1213
+ 'onToolClick',
1214
+ 'onUnlockRows',
1215
+ 'onUnsplit'
1216
+ ];
1217
+ BryntumGridBaseComponent.bryntumFeatureNames = [
1218
+ 'aiFilterFeature',
1219
+ 'cellCopyPasteFeature',
1220
+ 'cellEditFeature',
1221
+ 'cellMenuFeature',
1222
+ 'cellTooltipFeature',
1223
+ 'chartsFeature',
1224
+ 'columnAutoWidthFeature',
1225
+ 'columnDragToolbarFeature',
1226
+ 'columnPickerFeature',
1227
+ 'columnRenameFeature',
1228
+ 'columnReorderFeature',
1229
+ 'columnResizeFeature',
1230
+ 'excelExporterFeature',
1231
+ 'fileDropFeature',
1232
+ 'fillHandleFeature',
1233
+ 'filterFeature',
1234
+ 'filterBarFeature',
1235
+ 'groupFeature',
1236
+ 'groupSummaryFeature',
1237
+ 'headerMenuFeature',
1238
+ 'lockRowsFeature',
1239
+ 'mergeCellsFeature',
1240
+ 'pdfExportFeature',
1241
+ 'pinColumnsFeature',
1242
+ 'printFeature',
1243
+ 'quickFindFeature',
1244
+ 'regionResizeFeature',
1245
+ 'rowCopyPasteFeature',
1246
+ 'rowEditFeature',
1247
+ 'rowExpanderFeature',
1248
+ 'rowReorderFeature',
1249
+ 'rowResizeFeature',
1250
+ 'searchFeature',
1251
+ 'sortFeature',
1252
+ 'splitFeature',
1253
+ 'stickyCellsFeature',
1254
+ 'stripeFeature',
1255
+ 'summaryFeature',
1256
+ 'treeFeature',
1257
+ 'treeGroupFeature'
1258
+ ];
1259
+ BryntumGridBaseComponent.bryntumConfigs = BryntumGridBaseComponent.bryntumFeatureNames.concat([
1260
+ 'adopt',
1261
+ 'alignSelf',
1262
+ 'animateFilterRemovals',
1263
+ 'animateRemovingRows',
1264
+ 'animateTreeNodeToggle',
1265
+ 'appendTo',
1266
+ 'ariaDescription',
1267
+ 'ariaLabel',
1268
+ 'autoHeight',
1269
+ 'bbar',
1270
+ 'bodyCls',
1271
+ 'bubbleEvents',
1272
+ 'callOnFunctions',
1273
+ 'catchEventHandlerExceptions',
1274
+ 'cellEllipsis',
1275
+ 'cls',
1276
+ 'collapsed',
1277
+ 'collapsible',
1278
+ 'color',
1279
+ 'column',
1280
+ 'columnLines',
1281
+ 'columns',
1282
+ 'config',
1283
+ 'contentElementCls',
1284
+ 'contextMenuTriggerEvent',
1285
+ 'data',
1286
+ 'dataField',
1287
+ 'dataset',
1288
+ 'defaultRegion',
1289
+ 'destroyStore',
1290
+ 'detectCSSCompatibilityIssues',
1291
+ 'disabled',
1292
+ 'disableGridColumnIdWarning',
1293
+ 'disableGridRowModelWarning',
1294
+ 'dock',
1295
+ 'drawer',
1296
+ 'elementAttributes',
1297
+ 'emptyText',
1298
+ 'enableSticky',
1299
+ 'enableTextSelection',
1300
+ 'enableUndoRedoKeys',
1301
+ 'extraData',
1302
+ 'fillLastColumn',
1303
+ 'fixedRowHeight',
1304
+ 'flex',
1305
+ 'footer',
1306
+ 'formulaProviders',
1307
+ 'fullRowRefresh',
1308
+ 'getRowHeight',
1309
+ 'header',
1310
+ 'height',
1311
+ 'hidden',
1312
+ 'hideFooters',
1313
+ 'hideHeaders',
1314
+ 'hideHorizontalScrollbar',
1315
+ 'hoverCls',
1316
+ 'icon',
1317
+ 'id',
1318
+ 'ignoreParentReadOnly',
1319
+ 'inputFieldAlign',
1320
+ 'insertBefore',
1321
+ 'insertFirst',
1322
+ 'keyMap',
1323
+ 'labelPosition',
1324
+ 'listeners',
1325
+ 'loadMask',
1326
+ 'loadMaskDefaults',
1327
+ 'loadMaskError',
1328
+ 'localizable',
1329
+ 'longPressTime',
1330
+ 'margin',
1331
+ 'maskDefaults',
1332
+ 'masked',
1333
+ 'maxHeight',
1334
+ 'maxWidth',
1335
+ 'minHeight',
1336
+ 'minWidth',
1337
+ 'monitorResize',
1338
+ 'owner',
1339
+ 'plugins',
1340
+ 'preserveFocusOnDatasetChange',
1341
+ 'preserveScroll',
1342
+ 'preserveScrollOnDatasetChange',
1343
+ 'preventTooltipOnTouch',
1344
+ 'readOnly',
1345
+ 'relayStoreEvents',
1346
+ 'rendition',
1347
+ 'resizable',
1348
+ 'resizeToFitIncludesHeader',
1349
+ 'responsiveLevels',
1350
+ 'ripple',
1351
+ 'rootElement',
1352
+ 'rowHeight',
1353
+ 'rowLines',
1354
+ 'rtl',
1355
+ 'scrollable',
1356
+ 'scrollerClass',
1357
+ 'scrollManager',
1358
+ 'selectionMode',
1359
+ 'showDirty',
1360
+ 'span',
1361
+ 'stateful',
1362
+ 'statefulEvents',
1363
+ 'stateId',
1364
+ 'stateProvider',
1365
+ 'stateSettings',
1366
+ 'store',
1367
+ 'strips',
1368
+ 'subGridConfigs',
1369
+ 'syncMask',
1370
+ 'tab',
1371
+ 'tabBarItems',
1372
+ 'tbar',
1373
+ 'title',
1374
+ 'tools',
1375
+ 'transition',
1376
+ 'transitionDuration',
1377
+ 'ui',
1378
+ 'weight',
1379
+ 'width'
1380
+ ]);
1381
+ BryntumGridBaseComponent.bryntumConfigsOnly = [
1382
+ 'adopt',
1383
+ 'animateFilterRemovals',
1384
+ 'animateRemovingRows',
1385
+ 'ariaDescription',
1386
+ 'ariaLabel',
1387
+ 'autoHeight',
1388
+ 'bbar',
1389
+ 'bodyCls',
1390
+ 'bubbleEvents',
1391
+ 'collapsible',
1392
+ 'color',
1393
+ 'config',
1394
+ 'contentElementCls',
1395
+ 'contextMenuTriggerEvent',
1396
+ 'dataField',
1397
+ 'defaultRegion',
1398
+ 'destroyStore',
1399
+ 'detectCSSCompatibilityIssues',
1400
+ 'disableGridColumnIdWarning',
1401
+ 'disableGridRowModelWarning',
1402
+ 'dock',
1403
+ 'drawer',
1404
+ 'elementAttributes',
1405
+ 'enableSticky',
1406
+ 'enableTextSelection',
1407
+ 'fillLastColumn',
1408
+ 'fixedRowHeight',
1409
+ 'footer',
1410
+ 'formulaProviders',
1411
+ 'fullRowRefresh',
1412
+ 'getRowHeight',
1413
+ 'header',
1414
+ 'hideHorizontalScrollbar',
1415
+ 'hoverCls',
1416
+ 'icon',
1417
+ 'ignoreParentReadOnly',
1418
+ 'listeners',
1419
+ 'loadMask',
1420
+ 'loadMaskDefaults',
1421
+ 'loadMaskError',
1422
+ 'localizable',
1423
+ 'maskDefaults',
1424
+ 'masked',
1425
+ 'monitorResize',
1426
+ 'owner',
1427
+ 'plugins',
1428
+ 'preserveFocusOnDatasetChange',
1429
+ 'preserveScrollOnDatasetChange',
1430
+ 'preventTooltipOnTouch',
1431
+ 'relayStoreEvents',
1432
+ 'resizable',
1433
+ 'resizeToFitIncludesHeader',
1434
+ 'responsiveLevels',
1435
+ 'ripple',
1436
+ 'rootElement',
1437
+ 'scrollerClass',
1438
+ 'scrollManager',
1439
+ 'showDirty',
1440
+ 'stateful',
1441
+ 'statefulEvents',
1442
+ 'stateId',
1443
+ 'stateProvider',
1444
+ 'strips',
1445
+ 'subGridConfigs',
1446
+ 'syncMask',
1447
+ 'tab',
1448
+ 'tabBarItems',
1449
+ 'tbar',
1450
+ 'ui',
1451
+ 'weight'
1452
+ ];
1453
+ BryntumGridBaseComponent.bryntumProps = BryntumGridBaseComponent.bryntumFeatureNames.concat([
1454
+ 'alignSelf',
1455
+ 'animateTreeNodeToggle',
1456
+ 'appendTo',
1457
+ 'callOnFunctions',
1458
+ 'catchEventHandlerExceptions',
1459
+ 'cellEllipsis',
1460
+ 'cls',
1461
+ 'collapsed',
1462
+ 'column',
1463
+ 'columnLines',
1464
+ 'columns',
1465
+ 'data',
1466
+ 'dataset',
1467
+ 'disabled',
1468
+ 'emptyText',
1469
+ 'enableUndoRedoKeys',
1470
+ 'extraData',
1471
+ 'flex',
1472
+ 'focusVisible',
1473
+ 'hasChanges',
1474
+ 'height',
1475
+ 'hidden',
1476
+ 'hideFooters',
1477
+ 'hideHeaders',
1478
+ 'id',
1479
+ 'inputFieldAlign',
1480
+ 'insertBefore',
1481
+ 'insertFirst',
1482
+ 'keyMap',
1483
+ 'labelPosition',
1484
+ 'longPressTime',
1485
+ 'margin',
1486
+ 'maxHeight',
1487
+ 'maxWidth',
1488
+ 'minHeight',
1489
+ 'minWidth',
1490
+ 'originalStore',
1491
+ 'parent',
1492
+ 'preserveScroll',
1493
+ 'readOnly',
1494
+ 'rendition',
1495
+ 'rowHeight',
1496
+ 'rowLines',
1497
+ 'rtl',
1498
+ 'scrollable',
1499
+ 'selectedCell',
1500
+ 'selectedCells',
1501
+ 'selectedRecord',
1502
+ 'selectedRecords',
1503
+ 'selectedRows',
1504
+ 'selectionMode',
1505
+ 'span',
1506
+ 'state',
1507
+ 'stateSettings',
1508
+ 'store',
1509
+ 'title',
1510
+ 'tools',
1511
+ 'tooltip',
1512
+ 'transition',
1513
+ 'transitionDuration',
1514
+ 'width'
1515
+ ]);
1516
+ BryntumGridBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumGridBaseComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1517
+ BryntumGridBaseComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.0", type: BryntumGridBaseComponent, selector: "bryntum-grid-base", inputs: { 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", destroyStore: "destroyStore", detectCSSCompatibilityIssues: "detectCSSCompatibilityIssues", disableGridColumnIdWarning: "disableGridColumnIdWarning", disableGridRowModelWarning: "disableGridRowModelWarning", dock: "dock", drawer: "drawer", elementAttributes: "elementAttributes", enableSticky: "enableSticky", enableTextSelection: "enableTextSelection", fillLastColumn: "fillLastColumn", fixedRowHeight: "fixedRowHeight", footer: "footer", formulaProviders: "formulaProviders", fullRowRefresh: "fullRowRefresh", getRowHeight: "getRowHeight", header: "header", hideHorizontalScrollbar: "hideHorizontalScrollbar", hoverCls: "hoverCls", icon: "icon", ignoreParentReadOnly: "ignoreParentReadOnly", listeners: "listeners", 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", responsiveLevels: "responsiveLevels", ripple: "ripple", rootElement: "rootElement", scrollerClass: "scrollerClass", scrollManager: "scrollManager", showDirty: "showDirty", stateful: "stateful", statefulEvents: "statefulEvents", stateId: "stateId", stateProvider: "stateProvider", strips: "strips", subGridConfigs: "subGridConfigs", syncMask: "syncMask", tab: "tab", tabBarItems: "tabBarItems", tbar: "tbar", ui: "ui", weight: "weight", alignSelf: "alignSelf", animateTreeNodeToggle: "animateTreeNodeToggle", appendTo: "appendTo", callOnFunctions: "callOnFunctions", catchEventHandlerExceptions: "catchEventHandlerExceptions", cellEllipsis: "cellEllipsis", cls: "cls", collapsed: "collapsed", column: "column", columnLines: "columnLines", columns: "columns", data: "data", dataset: "dataset", disabled: "disabled", emptyText: "emptyText", enableUndoRedoKeys: "enableUndoRedoKeys", extraData: "extraData", flex: "flex", height: "height", hidden: "hidden", hideFooters: "hideFooters", hideHeaders: "hideHeaders", id: "id", inputFieldAlign: "inputFieldAlign", insertBefore: "insertBefore", insertFirst: "insertFirst", keyMap: "keyMap", labelPosition: "labelPosition", longPressTime: "longPressTime", margin: "margin", maxHeight: "maxHeight", maxWidth: "maxWidth", minHeight: "minHeight", minWidth: "minWidth", preserveScroll: "preserveScroll", readOnly: "readOnly", rendition: "rendition", rowHeight: "rowHeight", rowLines: "rowLines", rtl: "rtl", scrollable: "scrollable", selectionMode: "selectionMode", span: "span", stateSettings: "stateSettings", store: "store", title: "title", tools: "tools", transition: "transition", transitionDuration: "transitionDuration", width: "width", focusVisible: "focusVisible", hasChanges: "hasChanges", 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: { onBeforeCancelCellEdit: "onBeforeCancelCellEdit", onBeforeCancelRowEdit: "onBeforeCancelRowEdit", onBeforeCellEditStart: "onBeforeCellEditStart", onBeforeCellRangeDelete: "onBeforeCellRangeDelete", onBeforeCellRangeEdit: "onBeforeCellRangeEdit", 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", 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", 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", onDestroy: "onDestroy", onDirtyStateChange: "onDirtyStateChange", onDragSelecting: "onDragSelecting", onElementCreated: "onElementCreated", 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", onReadOnly: "onReadOnly", onRecompose: "onRecompose", onRenderRow: "onRenderRow", onRenderRows: "onRenderRows", onResize: "onResize", onResponsive: "onResponsive", onRowCollapse: "onRowCollapse", onRowExpand: "onRowExpand", onRowMouseEnter: "onRowMouseEnter", onRowMouseLeave: "onRowMouseLeave", onScroll: "onScroll", onSelectionChange: "onSelectionChange", onSelectionModeChange: "onSelectionModeChange", 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 });
1518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.0", ngImport: i0, type: BryntumGridBaseComponent, decorators: [{
1519
+ type: Component,
1520
+ args: [{
1521
+ selector: 'bryntum-grid-base',
1522
+ template: ''
1523
+ }]
1524
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { adopt: [{
1525
+ type: Input
1526
+ }], animateFilterRemovals: [{
1527
+ type: Input
1528
+ }], animateRemovingRows: [{
1529
+ type: Input
1530
+ }], ariaDescription: [{
1531
+ type: Input
1532
+ }], ariaLabel: [{
1533
+ type: Input
1534
+ }], autoHeight: [{
1535
+ type: Input
1536
+ }], bbar: [{
1537
+ type: Input
1538
+ }], bodyCls: [{
1539
+ type: Input
1540
+ }], bubbleEvents: [{
1541
+ type: Input
1542
+ }], collapsible: [{
1543
+ type: Input
1544
+ }], color: [{
1545
+ type: Input
1546
+ }], config: [{
1547
+ type: Input
1548
+ }], contentElementCls: [{
1549
+ type: Input
1550
+ }], contextMenuTriggerEvent: [{
1551
+ type: Input
1552
+ }], dataField: [{
1553
+ type: Input
1554
+ }], defaultRegion: [{
1555
+ type: Input
1556
+ }], destroyStore: [{
1557
+ type: Input
1558
+ }], detectCSSCompatibilityIssues: [{
1559
+ type: Input
1560
+ }], disableGridColumnIdWarning: [{
1561
+ type: Input
1562
+ }], disableGridRowModelWarning: [{
1563
+ type: Input
1564
+ }], dock: [{
1565
+ type: Input
1566
+ }], drawer: [{
1567
+ type: Input
1568
+ }], elementAttributes: [{
1569
+ type: Input
1570
+ }], enableSticky: [{
1571
+ type: Input
1572
+ }], enableTextSelection: [{
1573
+ type: Input
1574
+ }], fillLastColumn: [{
1575
+ type: Input
1576
+ }], fixedRowHeight: [{
1577
+ type: Input
1578
+ }], footer: [{
1579
+ type: Input
1580
+ }], formulaProviders: [{
1581
+ type: Input
1582
+ }], fullRowRefresh: [{
1583
+ type: Input
1584
+ }], getRowHeight: [{
1585
+ type: Input
1586
+ }], header: [{
1587
+ type: Input
1588
+ }], hideHorizontalScrollbar: [{
1589
+ type: Input
1590
+ }], hoverCls: [{
1591
+ type: Input
1592
+ }], icon: [{
1593
+ type: Input
1594
+ }], ignoreParentReadOnly: [{
1595
+ type: Input
1596
+ }], listeners: [{
1597
+ type: Input
1598
+ }], loadMask: [{
1599
+ type: Input
1600
+ }], loadMaskDefaults: [{
1601
+ type: Input
1602
+ }], loadMaskError: [{
1603
+ type: Input
1604
+ }], localizable: [{
1605
+ type: Input
1606
+ }], maskDefaults: [{
1607
+ type: Input
1608
+ }], masked: [{
1609
+ type: Input
1610
+ }], monitorResize: [{
1611
+ type: Input
1612
+ }], owner: [{
1613
+ type: Input
1614
+ }], plugins: [{
1615
+ type: Input
1616
+ }], preserveFocusOnDatasetChange: [{
1617
+ type: Input
1618
+ }], preserveScrollOnDatasetChange: [{
1619
+ type: Input
1620
+ }], preventTooltipOnTouch: [{
1621
+ type: Input
1622
+ }], relayStoreEvents: [{
1623
+ type: Input
1624
+ }], resizable: [{
1625
+ type: Input
1626
+ }], resizeToFitIncludesHeader: [{
1627
+ type: Input
1628
+ }], responsiveLevels: [{
1629
+ type: Input
1630
+ }], ripple: [{
1631
+ type: Input
1632
+ }], rootElement: [{
1633
+ type: Input
1634
+ }], scrollerClass: [{
1635
+ type: Input
1636
+ }], scrollManager: [{
1637
+ type: Input
1638
+ }], showDirty: [{
1639
+ type: Input
1640
+ }], stateful: [{
1641
+ type: Input
1642
+ }], statefulEvents: [{
1643
+ type: Input
1644
+ }], stateId: [{
1645
+ type: Input
1646
+ }], stateProvider: [{
1647
+ type: Input
1648
+ }], strips: [{
1649
+ type: Input
1650
+ }], subGridConfigs: [{
1651
+ type: Input
1652
+ }], syncMask: [{
1653
+ type: Input
1654
+ }], tab: [{
1655
+ type: Input
1656
+ }], tabBarItems: [{
1657
+ type: Input
1658
+ }], tbar: [{
1659
+ type: Input
1660
+ }], ui: [{
1661
+ type: Input
1662
+ }], weight: [{
1663
+ type: Input
1664
+ }], alignSelf: [{
1665
+ type: Input
1666
+ }], animateTreeNodeToggle: [{
1667
+ type: Input
1668
+ }], appendTo: [{
1669
+ type: Input
1670
+ }], callOnFunctions: [{
1671
+ type: Input
1672
+ }], catchEventHandlerExceptions: [{
1673
+ type: Input
1674
+ }], cellEllipsis: [{
1675
+ type: Input
1676
+ }], cls: [{
1677
+ type: Input
1678
+ }], collapsed: [{
1679
+ type: Input
1680
+ }], column: [{
1681
+ type: Input
1682
+ }], columnLines: [{
1683
+ type: Input
1684
+ }], columns: [{
1685
+ type: Input
1686
+ }], data: [{
1687
+ type: Input
1688
+ }], dataset: [{
1689
+ type: Input
1690
+ }], disabled: [{
1691
+ type: Input
1692
+ }], emptyText: [{
1693
+ type: Input
1694
+ }], enableUndoRedoKeys: [{
1695
+ type: Input
1696
+ }], extraData: [{
1697
+ type: Input
1698
+ }], flex: [{
1699
+ type: Input
1700
+ }], height: [{
1701
+ type: Input
1702
+ }], hidden: [{
1703
+ type: Input
1704
+ }], hideFooters: [{
1705
+ type: Input
1706
+ }], hideHeaders: [{
1707
+ type: Input
1708
+ }], id: [{
1709
+ type: Input
1710
+ }], inputFieldAlign: [{
1711
+ type: Input
1712
+ }], insertBefore: [{
1713
+ type: Input
1714
+ }], insertFirst: [{
1715
+ type: Input
1716
+ }], keyMap: [{
1717
+ type: Input
1718
+ }], labelPosition: [{
1719
+ type: Input
1720
+ }], longPressTime: [{
1721
+ type: Input
1722
+ }], margin: [{
1723
+ type: Input
1724
+ }], maxHeight: [{
1725
+ type: Input
1726
+ }], maxWidth: [{
1727
+ type: Input
1728
+ }], minHeight: [{
1729
+ type: Input
1730
+ }], minWidth: [{
1731
+ type: Input
1732
+ }], preserveScroll: [{
1733
+ type: Input
1734
+ }], readOnly: [{
1735
+ type: Input
1736
+ }], rendition: [{
1737
+ type: Input
1738
+ }], rowHeight: [{
1739
+ type: Input
1740
+ }], rowLines: [{
1741
+ type: Input
1742
+ }], rtl: [{
1743
+ type: Input
1744
+ }], scrollable: [{
1745
+ type: Input
1746
+ }], selectionMode: [{
1747
+ type: Input
1748
+ }], span: [{
1749
+ type: Input
1750
+ }], stateSettings: [{
1751
+ type: Input
1752
+ }], store: [{
1753
+ type: Input
1754
+ }], title: [{
1755
+ type: Input
1756
+ }], tools: [{
1757
+ type: Input
1758
+ }], transition: [{
1759
+ type: Input
1760
+ }], transitionDuration: [{
1761
+ type: Input
1762
+ }], width: [{
1763
+ type: Input
1764
+ }], focusVisible: [{
1765
+ type: Input
1766
+ }], hasChanges: [{
1767
+ type: Input
1768
+ }], originalStore: [{
1769
+ type: Input
1770
+ }], parent: [{
1771
+ type: Input
1772
+ }], selectedCell: [{
1773
+ type: Input
1774
+ }], selectedCells: [{
1775
+ type: Input
1776
+ }], selectedRecord: [{
1777
+ type: Input
1778
+ }], selectedRecords: [{
1779
+ type: Input
1780
+ }], selectedRows: [{
1781
+ type: Input
1782
+ }], state: [{
1783
+ type: Input
1784
+ }], tooltip: [{
1785
+ type: Input
1786
+ }], aiFilterFeature: [{
1787
+ type: Input
1788
+ }], cellCopyPasteFeature: [{
1789
+ type: Input
1790
+ }], cellEditFeature: [{
1791
+ type: Input
1792
+ }], cellMenuFeature: [{
1793
+ type: Input
1794
+ }], cellTooltipFeature: [{
1795
+ type: Input
1796
+ }], chartsFeature: [{
1797
+ type: Input
1798
+ }], columnAutoWidthFeature: [{
1799
+ type: Input
1800
+ }], columnDragToolbarFeature: [{
1801
+ type: Input
1802
+ }], columnPickerFeature: [{
1803
+ type: Input
1804
+ }], columnRenameFeature: [{
1805
+ type: Input
1806
+ }], columnReorderFeature: [{
1807
+ type: Input
1808
+ }], columnResizeFeature: [{
1809
+ type: Input
1810
+ }], excelExporterFeature: [{
1811
+ type: Input
1812
+ }], fileDropFeature: [{
1813
+ type: Input
1814
+ }], fillHandleFeature: [{
1815
+ type: Input
1816
+ }], filterFeature: [{
1817
+ type: Input
1818
+ }], filterBarFeature: [{
1819
+ type: Input
1820
+ }], groupFeature: [{
1821
+ type: Input
1822
+ }], groupSummaryFeature: [{
1823
+ type: Input
1824
+ }], headerMenuFeature: [{
1825
+ type: Input
1826
+ }], lockRowsFeature: [{
1827
+ type: Input
1828
+ }], mergeCellsFeature: [{
1829
+ type: Input
1830
+ }], pdfExportFeature: [{
1831
+ type: Input
1832
+ }], pinColumnsFeature: [{
1833
+ type: Input
1834
+ }], printFeature: [{
1835
+ type: Input
1836
+ }], quickFindFeature: [{
1837
+ type: Input
1838
+ }], regionResizeFeature: [{
1839
+ type: Input
1840
+ }], rowCopyPasteFeature: [{
1841
+ type: Input
1842
+ }], rowEditFeature: [{
1843
+ type: Input
1844
+ }], rowExpanderFeature: [{
1845
+ type: Input
1846
+ }], rowReorderFeature: [{
1847
+ type: Input
1848
+ }], rowResizeFeature: [{
1849
+ type: Input
1850
+ }], searchFeature: [{
1851
+ type: Input
1852
+ }], sortFeature: [{
1853
+ type: Input
1854
+ }], splitFeature: [{
1855
+ type: Input
1856
+ }], stickyCellsFeature: [{
1857
+ type: Input
1858
+ }], stripeFeature: [{
1859
+ type: Input
1860
+ }], summaryFeature: [{
1861
+ type: Input
1862
+ }], treeFeature: [{
1863
+ type: Input
1864
+ }], treeGroupFeature: [{
1865
+ type: Input
1866
+ }], onBeforeCancelCellEdit: [{
1867
+ type: Output
1868
+ }], onBeforeCancelRowEdit: [{
1869
+ type: Output
1870
+ }], onBeforeCellEditStart: [{
1871
+ type: Output
1872
+ }], onBeforeCellRangeDelete: [{
1873
+ type: Output
1874
+ }], onBeforeCellRangeEdit: [{
1875
+ type: Output
1876
+ }], onBeforeColumnDragStart: [{
1877
+ type: Output
1878
+ }], onBeforeColumnDropFinalize: [{
1879
+ type: Output
1880
+ }], onBeforeColumnResize: [{
1881
+ type: Output
1882
+ }], onBeforeCopy: [{
1883
+ type: Output
1884
+ }], onBeforeCSVExport: [{
1885
+ type: Output
1886
+ }], onBeforeDestroy: [{
1887
+ type: Output
1888
+ }], onBeforeExcelExport: [{
1889
+ type: Output
1890
+ }], onBeforeFillHandleDragStart: [{
1891
+ type: Output
1892
+ }], onBeforeFinishCellEdit: [{
1893
+ type: Output
1894
+ }], onBeforeFinishRowEdit: [{
1895
+ type: Output
1896
+ }], onBeforeHide: [{
1897
+ type: Output
1898
+ }], onBeforePaste: [{
1899
+ type: Output
1900
+ }], onBeforePdfExport: [{
1901
+ type: Output
1902
+ }], onBeforeRenderRow: [{
1903
+ type: Output
1904
+ }], onBeforeRenderRows: [{
1905
+ type: Output
1906
+ }], onBeforeRowCollapse: [{
1907
+ type: Output
1908
+ }], onBeforeRowExpand: [{
1909
+ type: Output
1910
+ }], onBeforeSelectionChange: [{
1911
+ type: Output
1912
+ }], onBeforeSetRecord: [{
1913
+ type: Output
1914
+ }], onBeforeShow: [{
1915
+ type: Output
1916
+ }], onBeforeStartRowEdit: [{
1917
+ type: Output
1918
+ }], onBeforeStateApply: [{
1919
+ type: Output
1920
+ }], onBeforeStateSave: [{
1921
+ type: Output
1922
+ }], onBeforeToggleGroup: [{
1923
+ type: Output
1924
+ }], onBeforeToggleNode: [{
1925
+ type: Output
1926
+ }], onCancelCellEdit: [{
1927
+ type: Output
1928
+ }], onCatchAll: [{
1929
+ type: Output
1930
+ }], onCellClick: [{
1931
+ type: Output
1932
+ }], onCellContextMenu: [{
1933
+ type: Output
1934
+ }], onCellDblClick: [{
1935
+ type: Output
1936
+ }], onCellMenuBeforeShow: [{
1937
+ type: Output
1938
+ }], onCellMenuItem: [{
1939
+ type: Output
1940
+ }], onCellMenuShow: [{
1941
+ type: Output
1942
+ }], onCellMenuToggleItem: [{
1943
+ type: Output
1944
+ }], onCellMouseEnter: [{
1945
+ type: Output
1946
+ }], onCellMouseLeave: [{
1947
+ type: Output
1948
+ }], onCellMouseOut: [{
1949
+ type: Output
1950
+ }], onCellMouseOver: [{
1951
+ type: Output
1952
+ }], onCollapse: [{
1953
+ type: Output
1954
+ }], onCollapseNode: [{
1955
+ type: Output
1956
+ }], onColumnDrag: [{
1957
+ type: Output
1958
+ }], onColumnDragStart: [{
1959
+ type: Output
1960
+ }], onColumnDrop: [{
1961
+ type: Output
1962
+ }], onColumnResize: [{
1963
+ type: Output
1964
+ }], onColumnResizeStart: [{
1965
+ type: Output
1966
+ }], onContextMenuItem: [{
1967
+ type: Output
1968
+ }], onContextMenuToggleItem: [{
1969
+ type: Output
1970
+ }], onCopy: [{
1971
+ type: Output
1972
+ }], onDataChange: [{
1973
+ type: Output
1974
+ }], onDestroy: [{
1975
+ type: Output
1976
+ }], onDirtyStateChange: [{
1977
+ type: Output
1978
+ }], onDragSelecting: [{
1979
+ type: Output
1980
+ }], onElementCreated: [{
1981
+ type: Output
1982
+ }], onExpand: [{
1983
+ type: Output
1984
+ }], onExpandNode: [{
1985
+ type: Output
1986
+ }], onFileDrop: [{
1987
+ type: Output
1988
+ }], onFillHandleBeforeDragFinalize: [{
1989
+ type: Output
1990
+ }], onFillHandleDrag: [{
1991
+ type: Output
1992
+ }], onFillHandleDragAbort: [{
1993
+ type: Output
1994
+ }], onFillHandleDragEnd: [{
1995
+ type: Output
1996
+ }], onFillHandleDragStart: [{
1997
+ type: Output
1998
+ }], onFinishCellEdit: [{
1999
+ type: Output
2000
+ }], onFinishRowEdit: [{
2001
+ type: Output
2002
+ }], onFocusIn: [{
2003
+ type: Output
2004
+ }], onFocusOut: [{
2005
+ type: Output
2006
+ }], onGridRowBeforeDragStart: [{
2007
+ type: Output
2008
+ }], onGridRowBeforeDropFinalize: [{
2009
+ type: Output
2010
+ }], onGridRowDrag: [{
2011
+ type: Output
2012
+ }], onGridRowDragAbort: [{
2013
+ type: Output
2014
+ }], onGridRowDragStart: [{
2015
+ type: Output
2016
+ }], onGridRowDrop: [{
2017
+ type: Output
2018
+ }], onHeaderClick: [{
2019
+ type: Output
2020
+ }], onHeaderMenuBeforeShow: [{
2021
+ type: Output
2022
+ }], onHeaderMenuItem: [{
2023
+ type: Output
2024
+ }], onHeaderMenuShow: [{
2025
+ type: Output
2026
+ }], onHeaderMenuToggleItem: [{
2027
+ type: Output
2028
+ }], onHide: [{
2029
+ type: Output
2030
+ }], onLockRows: [{
2031
+ type: Output
2032
+ }], onMouseOut: [{
2033
+ type: Output
2034
+ }], onMouseOver: [{
2035
+ type: Output
2036
+ }], onPaint: [{
2037
+ type: Output
2038
+ }], onPaste: [{
2039
+ type: Output
2040
+ }], onPdfExport: [{
2041
+ type: Output
2042
+ }], onReadOnly: [{
2043
+ type: Output
2044
+ }], onRecompose: [{
2045
+ type: Output
2046
+ }], onRenderRow: [{
2047
+ type: Output
2048
+ }], onRenderRows: [{
2049
+ type: Output
2050
+ }], onResize: [{
2051
+ type: Output
2052
+ }], onResponsive: [{
2053
+ type: Output
2054
+ }], onRowCollapse: [{
2055
+ type: Output
2056
+ }], onRowExpand: [{
2057
+ type: Output
2058
+ }], onRowMouseEnter: [{
2059
+ type: Output
2060
+ }], onRowMouseLeave: [{
2061
+ type: Output
2062
+ }], onScroll: [{
2063
+ type: Output
2064
+ }], onSelectionChange: [{
2065
+ type: Output
2066
+ }], onSelectionModeChange: [{
2067
+ type: Output
2068
+ }], onShow: [{
2069
+ type: Output
2070
+ }], onSplit: [{
2071
+ type: Output
2072
+ }], onSplitterCollapseClick: [{
2073
+ type: Output
2074
+ }], onSplitterDragEnd: [{
2075
+ type: Output
2076
+ }], onSplitterDragStart: [{
2077
+ type: Output
2078
+ }], onSplitterExpandClick: [{
2079
+ type: Output
2080
+ }], onStartCellEdit: [{
2081
+ type: Output
2082
+ }], onStartRowEdit: [{
2083
+ type: Output
2084
+ }], onSubGridCollapse: [{
2085
+ type: Output
2086
+ }], onSubGridExpand: [{
2087
+ type: Output
2088
+ }], onToggleGroup: [{
2089
+ type: Output
2090
+ }], onToggleNode: [{
2091
+ type: Output
2092
+ }], onToolClick: [{
2093
+ type: Output
2094
+ }], onUnlockRows: [{
2095
+ type: Output
2096
+ }], onUnsplit: [{
2097
+ type: Output
2098
+ }] } });
2099
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJ5bnR1bS1ncmlkLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vY29tcG9uZW50L3NyYy9saWIvYnJ5bnR1bS1ncmlkLWJhc2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHNEQUFzRDtBQUN0RDs7R0FFRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWtELE1BQU0sZUFBZSxDQUFDO0FBRW5JLE9BQU8sYUFBYSxNQUFNLGtCQUFrQixDQUFDO0FBRTdDLE9BQU8sRUFBNnRCLFFBQVEsRUFBNHBDLE1BQU0sRUFBYSxNQUFNLGVBQWUsQ0FBQztBQUVqN0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUF1Z0M3QyxNQUFNLE9BQU8sd0JBQXdCO0lBd2JqQyxZQUFZLE9BQW1CO1FBVHZCLGtCQUFhLEdBQUc7WUFDcEIsS0FBSyxFQUFjLFNBQVM7WUFDNUIsUUFBUSxFQUFXLFNBQVM7WUFDNUIsSUFBSSxFQUFlLFNBQVM7WUFDNUIsZ0JBQWdCLEVBQUcsSUFBSTtZQUN2QixRQUFRLEVBQVcsRUFBRTtZQUNyQixTQUFTLEVBQVUsRUFBRTtTQUN4QixDQUFDO1FBc05GLGtCQUFrQjtRQUNsQjs7Ozs7V0FLRztRQUNPLDJCQUFzQixHQUFRLElBQUksWUFBWSxFQUFvRyxDQUFDO1FBQzdKOzs7Ozs7O1dBT0c7UUFDTywwQkFBcUIsR0FBUSxJQUFJLFlBQVksRUFBc0csQ0FBQztRQUM5Sjs7Ozs7V0FLRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUF5RyxDQUFDO1FBQ2pLOzs7Ozs7V0FNRztRQUNPLDRCQUF1QixHQUFRLElBQUksWUFBWSxFQUE4RyxDQUFDO1FBQ3hLOzs7Ozs7V0FNRztRQUNPLDBCQUFxQixHQUFRLElBQUksWUFBWSxFQUFtRyxDQUFDO1FBQzNKOzs7Ozs7V0FNRztRQUNPLDRCQUF1QixH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UUFBUTtzQkFBakIsTUFBTTtnQkFVRyxZQUFZO3NCQUFyQixNQUFNO2dCQU1HLGFBQWE7c0JBQXRCLE1BQU07Z0JBV0csV0FBVztzQkFBcEIsTUFBTTtnQkFVRyxlQUFlO3NCQUF4QixNQUFNO2dCQVNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBT0csUUFBUTtzQkFBakIsTUFBTTtnQkFjRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBTUcscUJBQXFCO3NCQUE5QixNQUFNO2dCQU1HLE1BQU07c0JBQWYsTUFBTTtnQkFVRyxPQUFPO3NCQUFoQixNQUFNO2dCQVNHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFRRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBUUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQVNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFPRyxlQUFlO3NCQUF4QixNQUFNO2dCQU9HLGNBQWM7c0JBQXZCLE1BQU07Z0JBT0csaUJBQWlCO3NCQUExQixNQUFNO2dCQU9HLGVBQWU7c0JBQXhCLE1BQU07Z0JBU0csYUFBYTtzQkFBdEIsTUFBTTtnQkFPRyxZQUFZO3NCQUFyQixNQUFNO2dCQU9HLFdBQVc7c0JBQXBCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFJRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vKipcbiAqIEFuZ3VsYXIgd3JhcHBlciBmb3IgQnJ5bnR1bSBHcmlkQmFzZVxuICovXG5cbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2UsIFNpbXBsZUNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCBXcmFwcGVySGVscGVyIGZyb20gJy4vd3JhcHBlci5oZWxwZXInO1xuXG5pbXBvcnQgeyBBSUZpbHRlciwgQUlGaWx0ZXJDb25maWcsIEFqYXhTdG9yZSwgQWpheFN0b3JlQ29uZmlnLCBCYXNlLCBDZWxsQ29weVBhc3RlLCBDZWxsQ29weVBhc3RlQ29uZmlnLCBDZWxsRWRpdCwgQ2VsbEVkaXRDb25maWcsIENlbGxFZGl0b3JDb250ZXh0LCBDZWxsTWVudSwgQ2VsbE1lbnVDb25maWcsIENlbGxUb29sdGlwLCBDZWxsVG9vbHRpcENvbmZpZywgQ2hhcnRzLCBDaGFydHNDb25maWcsIENvbHVtbiwgQ29sdW1uQXV0b1dpZHRoLCBDb2x1bW5BdXRvV2lkdGhDb25maWcsIENvbHVtbkRyYWdUb29sYmFyLCBDb2x1bW5EcmFnVG9vbGJhckNvbmZpZywgQ29sdW1uUGlja2VyLCBDb2x1bW5QaWNrZXJDb25maWcsIENvbHVtblJlbmFtZSwgQ29sdW1uUmVuYW1lQ29uZmlnLCBDb2x1bW5SZW9yZGVyLCBDb2x1bW5SZW9yZGVyQ29uZmlnLCBDb2x1bW5SZXNpemUsIENvbHVtblJlc2l6ZUNvbmZpZywgQ29sdW1uU3RvcmUsIENvbHVtblN0b3JlQ29uZmlnLCBDb250YWluZXIsIENvbnRhaW5lckl0ZW1Db25maWcsIERvbUNvbmZpZywgRW1wdHlUZXh0RG9tQ29uZmlnLCBFeGNlbEV4cG9ydGVyLCBFeGNlbEV4cG9ydGVyQ29uZmlnLCBFeHBvcnRDb25maWcsIEZpbGVEcm9wLCBGaWxlRHJvcENvbmZpZywgRmlsbEhhbmRsZSwgRmlsbEhhbmRsZUNvbmZpZywgRmlsdGVyLCBGaWx0ZXJCYXIsIEZpbHRlckJhckNvbmZpZywgRmlsdGVyQ29uZmlnLCBGb3JtdWxhUHJvdmlkZXJDb25maWcsIEdyaWQsIEdyaWRCYXNlLCBHcmlkQmFzZUxpc3RlbmVycywgR3JpZENvbHVtbkNvbmZpZywgR3JpZExvY2F0aW9uLCBHcmlkTG9jYXRpb25Db25maWcsIEdyaWRTZWxlY3Rpb25Nb2RlLCBHcmlkU3RhdGVJbmZvLCBHcm91cCwgR3JvdXBDb25maWcsIEdyb3VwU3VtbWFyeSwgR3JvdXBTdW1tYXJ5Q29uZmlnLCBIZWFkZXJNZW51LCBIZWFkZXJNZW51Q29uZmlnLCBLZXlNYXBDb25maWcsIExvY2tSb3dzLCBMb2NrUm93c0NvbmZpZywgTWFzaywgTWFza0NvbmZpZywgTWVudSwgTWVudUl0ZW0sIE1lbnVJdGVtRW50cnksIE1lcmdlQ2VsbHMsIE1lcmdlQ2VsbHNDb25maWcsIE1vZGVsLCBNb2RlbENvbmZpZywgUGFnaW5nVG9vbGJhckNvbmZpZywgUGFuZWwsIFBhbmVsQ29sbGFwc2VyQ29uZmlnLCBQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWcsIFBhbmVsSGVhZGVyLCBQZGZFeHBvcnQsIFBkZkV4cG9ydENvbmZpZywgUGluQ29sdW1ucywgUGluQ29sdW1uc0NvbmZpZywgUHJlc2VydmVTY3JvbGxPcHRpb25zLCBQcmludCwgUHJpbnRDb25maWcsIFF1aWNrRmluZCwgUXVpY2tGaW5kQ29uZmlnLCBSZWNvcmRQb3NpdGlvbkNvbnRleHQsIFJlZ2lvblJlc2l6ZSwgUmVnaW9uUmVzaXplQ29uZmlnLCBSZXNwb25zaXZlTGV2ZWxDb25maWcsIFJvdywgUm93Q29weVBhc3RlLCBSb3dDb3B5UGFzdGVDb25maWcsIFJvd0VkaXQsIFJvd0VkaXRDb25maWcsIFJvd0VkaXRvckNvbnRleHQsIFJvd0V4cGFuZGVyLCBSb3dFeHBhbmRlckNvbmZpZywgUm93UmVvcmRlciwgUm93UmVvcmRlckNvbmZpZywgUm93UmVzaXplLCBSb3dSZXNpemVDb25maWcsIFNjcm9sbE1hbmFnZXIsIFNjcm9sbE1hbmFnZXJDb25maWcsIFNjcm9sbGVyLCBTY3JvbGxlckNvbmZpZywgU2VhcmNoLCBTZWFyY2hDb25maWcsIFNvcnQsIFNvcnRDb25maWcsIFNwbGl0LCBTcGxpdENvbmZpZywgU3RhdGVQcm92aWRlciwgU3RpY2t5Q2VsbHMsIFN0aWNreUNlbGxzQ29uZmlnLCBTdG9yZSwgU3RvcmVDb25maWcsIFN0cmlwZSwgU3RyaXBlQ29uZmlnLCBTdWJHcmlkLCBTdWJHcmlkQ29uZmlnLCBTdW1tYXJ5LCBTdW1tYXJ5Q29uZmlnLCBUYWJDb25maWcsIFRvb2wsIFRvb2xDb25maWcsIFRvb2xiYXJDb25maWcsIFRvb2xiYXJJdGVtcywgVG9vbHRpcENvbmZpZywgVHJlZSwgVHJlZUNvbmZpZywgVHJlZUdyb3VwLCBUcmVlR3JvdXBDb25maWcsIFdpZGdldCwgWExTQ29sdW1uIH0gZnJvbSAnQGJyeW50dW0vZ3JpZCc7XG5cbmltcG9ydCB7IFN0cmluZ0hlbHBlciB9IGZyb20gJ0BicnludHVtL2dyaWQnO1xuXG5leHBvcnQgdHlwZSBCcnludHVtR3JpZEJhc2VQcm9wcyA9IHtcbiAgICAvLyBDb25maWdzXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgZWxlbWVudCBpZCkgdG8gYWRvcHQgYXMgdGhpcyBXaWRnZXQncyBlbmNhcHN1bGF0aW5nIGVsZW1lbnQuIFRoZSB3aWRnZXQnc1xuICAgICAqIGNvbnRlbnQgd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoaXMgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctYWRvcHQpXG4gICAgICovXG4gICAgYWRvcHQgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyB3aWRnZXQgaXMgYSBjaGlsZCBvZiBhIFtDb250YWluZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIpLCBpdCB3aWxsIGJ5IGRlZmF1bHQgYmUgcGFydGljaXBhdGluZyBpbiBhXG4gICAgICogZmxleGJveCBsYXlvdXQuIFRoaXMgY29uZmlnIGFsbG93cyB5b3UgdG8gc2V0IHRoaXMgd2lkZ2V0J3NcbiAgICAgKiBbYWxpZ24tc2VsZl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FsaWduLXNlbGYpIHN0eWxlLlxuICAgICAqL1xuICAgIGFsaWduU2VsZiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBhbmltYXRlIHJvdyByZW1vdmFscyBjYXVzZWQgYnkgZmlsdGVyaW5nLlxuICAgICAqIEBkZXByZWNhdGVkIDcuMC4wIERlcHJlY2F0ZWQgYGFuaW1hdGVGaWx0ZXJSZW1vdmFsc2AuIFVzZSBgdHJhbnNpdGlvbi5maWx0ZXJSZW1vdmFsYCBpbnN0ZWFkXG4gICAgICovXG4gICAgYW5pbWF0ZUZpbHRlclJlbW92YWxzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgaWYgcmVtb3ZpbmcgYW5kIGluc2VydGluZyByb3dzIHNob3VsZCBiZSBhbmltYXRlZC4gU2V0IHRvIGBmYWxzZWAgdG8gcHJldmVudCB0aG9zZSBhbmltYXRpb25zLFxuICAgICAqIHJlbW92aW5nIHRoZSByZWxhdGVkIGRlbGF5cy5cbiAgICAgKiBAZGVwcmVjYXRlZCA3LjAuMCBEZXByZWNhdGVkIGBhbmltYXRlUmVtb3ZpbmdSb3dzYC4gVXNlIGB0cmFuc2l0aW9uLnJlbW92ZVJlY29yZGAgaW5zdGVhZFxuICAgICAqL1xuICAgIGFuaW1hdGVSZW1vdmluZ1Jvd3MgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoZSBbVHJlZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9UcmVlKSBmZWF0dXJlIGlzIGluIHVzZSBhbmQgdGhlIFN0b3JlIGlzIGEgdHJlZSBzdG9yZSwgdGhpc1xuICAgICAqIGNvbmZpZyBtYXkgYmUgc2V0IHRvIGB0cnVlYCB0byB2aXN1YWxseSBhbmltYXRlIGJyYW5jaCBub2RlIGV4cGFuZCBhbmQgY29sbGFwc2Ugb3BlcmF0aW9ucy5cbiAgICAgKiAqVGhpcyBpcyBub3Qgc3VwcG9ydGVkIGluIFNjaGVkdWxlciBhbmQgR2FudHQqXG4gICAgICogQGRlcHJlY2F0ZWQgNy4wLjAgRGVwcmVjYXRlZCBgYW5pbWF0ZVRyZWVOb2RlVG9nZ2xlYC4gVXNlIGB0cmFuc2l0aW9uLnRvZ2dsZVRyZWVOb2RlYCBpbnN0ZWFkXG4gICAgICovXG4gICAgYW5pbWF0ZVRyZWVOb2RlVG9nZ2xlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogRWxlbWVudCAob3IgdGhlIGlkIG9mIGFuIGVsZW1lbnQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCdzIGVsZW1lbnQgdG8uIENhbiBiZSBjb25maWd1cmVkLCBvciBzZXQgb25jZSBhdFxuICAgICAqIHJ1bnRpbWUuIFRvIGFjY2VzcyB0aGUgZWxlbWVudCBvZiBhIHJlbmRlcmVkIHdpZGdldCwgc2VlIFtlbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWVsZW1lbnQpLlxuICAgICAqL1xuICAgIGFwcGVuZFRvID8gOiBIVE1MRWxlbWVudHxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBIGxvY2FsaXphYmxlIHN0cmluZyAoTWF5IGNvbnRhaW4gYCdMe30nYCB0b2tlbnMgd2hpY2ggcmVzb2x2ZSBpbiB0aGUgbG9jYWxlIGZpbGUpIHRvIGluamVjdFxuICAgICAqIGludG8gYW4gZWxlbWVudCB3aGljaCB3aWxsIGJlIGxpbmtlZCB1c2luZyB0aGUgYGFyaWEtZGVzY3JpYmVkYnlgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctYXJpYURlc2NyaXB0aW9uKVxuICAgICAqL1xuICAgIGFyaWFEZXNjcmlwdGlvbiA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQSBsb2NhbGl6YWJsZSBzdHJpbmcgKE1heSBjb250YWluIGAnTHt9J2AgdG9rZW5zIHdoaWNoIHJlc29sdmUgaW4gdGhlIGxvY2FsZSBmaWxlKSB0byBpbmplY3QgYXNcbiAgICAgKiB0aGUgYGFyaWEtbGFiZWxgIGF0dHJpYnV0ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctYXJpYUxhYmVsKVxuICAgICAqL1xuICAgIGFyaWFMYWJlbCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogQXV0b21hdGljYWxseSBzZXQgZ3JpZHMgaGVpZ2h0IHRvIGZpdCBhbGwgcm93cyAobm8gc2Nyb2xsaW5nIGluIHRoZSBncmlkKS4gSW4gZ2VuZXJhbCB5b3Ugc2hvdWxkIGF2b2lkXG4gICAgICogdXNpbmcgYGF1dG9IZWlnaHQ6IHRydWVgLCBzaW5jZSBpdCB3aWxsIGJ5cGFzcyBHcmlkcyB2aXJ0dWFsIHJlbmRlcmluZyBhbmQgcmVuZGVyIGFsbCByb3dzIGF0IG9uY2UsIHdoaWNoXG4gICAgICogaW4gYSBsYXJnZXIgZ3JpZCBpcyByZWFsbHkgYmFkIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgKi9cbiAgICBhdXRvSGVpZ2h0ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQSBDb25maWcgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIFtUb29sYmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhciksXG4gICAgICogb3IgYXJyYXkgb2YgY29uZmlnIG9iamVjdHMgcmVwcmVzZW50aW5nIHRoZSBjaGlsZCBpdGVtcyBvZiBhIFRvb2xiYXIuIEFub3RoZXIgd2F5IHRvIGFkZCBhIGJiYXIgaXMgdG8gdXNlIFtzdHJpcHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctc3RyaXBzKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctYmJhcilcbiAgICAgKi9cbiAgICBiYmFyID8gOiAoQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzZXMgdG8gYWRkIHRvIHRoZSBwYW5lbCdzIGJvZHkgZWxlbWVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctYm9keUNscylcbiAgICAgKi9cbiAgICBib2R5Q2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHdoZXJlIHByb3BlcnR5IG5hbWVzIHdpdGggYSB0cnV0aHkgdmFsdWUgaW5kaWNhdGUgd2hpY2ggZXZlbnRzIHNob3VsZCBidWJibGUgdXAgdGhlIG93bmVyc2hpcFxuICAgICAqIGhpZXJhcmNoeSB3aGVuIHRyaWdnZXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctYnViYmxlRXZlbnRzKVxuICAgICAqL1xuICAgIGJ1YmJsZUV2ZW50cyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IGNhbGwgb25YWFggbWV0aG9kIG5hbWVzIChlLmcuIGBvblNob3dgLCBgb25DbGlja2ApLCBhcyBhbiBlYXN5IHdheSB0byBsaXN0ZW4gZm9yIGV2ZW50cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctY2FsbE9uRnVuY3Rpb25zKVxuICAgICAqL1xuICAgIGNhbGxPbkZ1bmN0aW9ucyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIGlmIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlIGVycm9yIHByb3BhZ2F0ZXMgdXAgdGhlIHN0YWNrIGFuZCB0aGVcbiAgICAgKiBhcHBsaWNhdGlvbiBzdGF0ZSBpcyB1bmRlZmluZWQuIENvZGUgd2hpY2ggZm9sbG93cyB0aGUgZXZlbnQgaGFuZGxlciB3aWxsICpub3QqIGJlIGV4ZWN1dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1jYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMpXG4gICAgICovXG4gICAgY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gY3JvcCB0ZXh0IGluIGdyaWQgY2VsbHMgd2l0aG91dCBlbGxpcHNpcyAoLi4uKS4gV2hlbiBlbmFibGVkLCBjZWxscyBjb250YWluaW5nIHB1cmVcbiAgICAgKiB1c2UgYGRpc3BsYXkgOiBibG9ja2AsIGluc3RlYWQgb2YgYGRpc3BsYXkgOiBmbGV4YCB0byBhbGxvdyBlbGxpcHNpcyB0byB3b3JrLlxuICAgICAqIDxzdHJvbmc+Tk9URTwvc3Ryb25nPiBPbmx5IHN1cHBvcnRlZCBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgYDpoYXMoKWAgQ1NTIHNlbGVjdG9yXG4gICAgICovXG4gICAgY2VsbEVsbGlwc2lzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byBlbGVtZW50LlxuICAgICAqIE1heSBiZSBzcGVjaWZpZWQgYXMgYSBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nLCBvciBhcyBhbiBvYmplY3QgaW4gd2hpY2ggcHJvcGVydHkgbmFtZXNcbiAgICAgKiB3aXRoIHRydXRoeSB2YWx1ZXMgYXJlIHVzZWQgYXMgdGhlIGNsYXNzIG5hbWVzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1jbHMpXG4gICAgICovXG4gICAgY2xzID8gOiBzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgcGFuZWwgaXMgY29sbGFwc2VkICh0aGUgYm9keSBvZiB0aGUgcGFuZWwgaXMgaGlkZGVuIHdoaWxlIG9ubHkgdGhlIGhlYWRlciBpc1xuICAgICAqIHZpc2libGUpLiBPbmx5IHZhbGlkIGlmIHRoZSBwYW5lbCBpcyBbY29sbGFwc2libGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2libGUpLlxuICAgICAqL1xuICAgIGNvbGxhcHNlZCA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFRoaXMgY29uZmlnIGVuYWJsZXMgY29sbGFwc2liaWxpdHkgZm9yIHRoZSBwYW5lbC4gU2VlIFtjb2xsYXBzZWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctY29sbGFwc2VkKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctY29sbGFwc2libGUpXG4gICAgICovXG4gICAgY29sbGFwc2libGUgPyA6IGJvb2xlYW58UGFuZWxDb2xsYXBzZXJDb25maWd8UGFuZWxDb2xsYXBzZXJPdmVybGF5Q29uZmlnXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgc3BlY2lmaWVkIGNvbG9yIHRvIHRoZSB3aWRnZXQsIGJ5IHNldHRpbmcgdGhlIGAtLWItcHJpbWFyeWAgQ1NTIHZhcmlhYmxlIGluIHRoZSB3aWRnZXRzXG4gICAgICogYHN0eWxlYCBibG9jay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctY29sb3IpXG4gICAgICovXG4gICAgY29sb3IgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFByb2dyYW1tYXRpYyBjb250cm9sIG92ZXIgd2hpY2ggY29sdW1uIHRvIHN0YXJ0IGluIHdoZW4gdXNlZCBpbiBhIGdyaWQgbGF5b3V0LlxuICAgICAqL1xuICAgIGNvbHVtbiA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgY29sdW1uIGxpbmVzLiBFbmQgcmVzdWx0IG1pZ2h0IGJlIG92ZXJydWxlZCBieS9kaWZmZXIgYmV0d2VlbiB0aGVtZXMuXG4gICAgICovXG4gICAgY29sdW1uTGluZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBY2NlcHRzIGNvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIGdyaWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiBUaGV5IHdpbGwgYmUgdXNlZCB0byBjcmVhdGVcbiAgICAgKiBbQ29sdW1uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9jb2x1bW4vQ29sdW1uKSBpbnN0YW5jZXMgdGhhdCBhcmUgYWRkZWQgdG8gYSBbQ29sdW1uU3RvcmVdKCNHcmlkL2RhdGEvQ29sdW1uU3RvcmUpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1jb2x1bW5zKVxuICAgICAqL1xuICAgIGNvbHVtbnMgPyA6IENvbHVtblN0b3JlfEdyaWRDb2x1bW5Db25maWdbXXxDb2x1bW5TdG9yZUNvbmZpZ1xuICAgIGNvbmZpZyA/IDogb2JqZWN0XG4gICAgLyoqXG4gICAgICogQ3VzdG9tIENTUyBjbGFzc2VzIHRvIGFkZCB0byB0aGUgW2NvbnRlbnRFbGVtZW50XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I3Byb3BlcnR5LWNvbnRlbnRFbGVtZW50KS5cbiAgICAgKiBNYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIHN0cmluZywgb3IgYXMgYW4gb2JqZWN0IGluIHdoaWNoIHByb3BlcnR5IG5hbWVzXG4gICAgICogd2l0aCB0cnV0aHkgdmFsdWVzIGFyZSB1c2VkIGFzIHRoZSBjbGFzcyBuYW1lczpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctY29udGVudEVsZW1lbnRDbHMpXG4gICAgICovXG4gICAgY29udGVudEVsZW1lbnRDbHMgPyA6IHN0cmluZ3xvYmplY3RcbiAgICAvKipcbiAgICAgKiBFdmVudCB3aGljaCBpcyB1c2VkIHRvIHNob3cgY29udGV4dCBtZW51cy5cbiAgICAgKiBBdmFpbGFibGUgb3B0aW9ucyBhcmU6ICdjb250ZXh0bWVudScsICdjbGljaycsICdkYmxjbGljaycuXG4gICAgICovXG4gICAgY29udGV4dE1lbnVUcmlnZ2VyRXZlbnQgPyA6ICdjb250ZXh0bWVudSd8J2NsaWNrJ3wnZGJsY2xpY2snXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVudCBzaG9ydGN1dCB0byBzZXQgZGF0YSBpbiBncmlkcyBzdG9yZSBib3RoIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgYXQgcnVudGltZS4gQ2FuIGFsc28gYmVcbiAgICAgKiB1c2VkIHRvIHJldHJpZXZlIGRhdGEgYXQgcnVudGltZSwgYWx0aG91Z2ggd2UgZG8gcmVjb21tZW5kIGludGVyYWN0aW5nIHdpdGggR3JpZHMgc3RvcmUgaW5zdGVhZCB1c2luZ1xuICAgICAqIHRoZSBbc3RvcmVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjcHJvcGVydHktc3RvcmUpIHByb3BlcnR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1kYXRhKVxuICAgICAqL1xuICAgIGRhdGEgPyA6IG9iamVjdFtdfE1vZGVsW118TW9kZWxDb25maWdbXVxuICAgIC8qKlxuICAgICAqIFdoZW4gdGhpcyBXaWRnZXQgY29uZmlndXJhdGlvbiBpcyB1c2VkIGluIHRoZSBHcmlkJ3MgUm93RXhwYW5kZXIgZmVhdHVyZSdzIGB3aWRnZXRgIGNvbmZpZywgcHJvdmlkZSB0aGVcbiAgICAgKiBmaWVsZCBvbiB0aGUgZXhwYW5kZWQgcmVjb3JkIHRvIHVzZSBmb3IgcG9wdWxhdGluZyB0aGlzIHdpZGdldCdzIHN0b3JlIChpZiBhcHBsaWNhYmxlKVxuICAgICAqL1xuICAgIGRhdGFGaWVsZCA/IDogc3RyaW5nXG4gICAgLyoqXG4gICAgICogT2JqZWN0IHRvIGFwcGx5IHRvIGVsZW1lbnRzIGRhdGFzZXQgKGVhY2gga2V5IHdpbGwgYmUgdXNlZCBhcyBhIGRhdGEtYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50KVxuICAgICAqL1xuICAgIGRhdGFzZXQgPyA6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbiAgICAvKipcbiAgICAgKiBSZWdpb24gdG8gd2hpY2ggY29sdW1ucyBhcmUgYWRkZWQgd2hlbiB0aGV5IGhhdmUgbm9uZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBkZWZhdWx0UmVnaW9uID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGRlc3Ryb3kgdGhlIHN0b3JlIHdoZW4gdGhlIGdyaWQgaXMgZGVzdHJveWVkLlxuICAgICAqL1xuICAgIGRlc3Ryb3lTdG9yZSA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENoZWNrIGZvciBDU1MgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2hlbiB1cGdyYWRpbmcgdG8gdjcuIFBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgY2hlY2tzOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1kZXRlY3RDU1NDb21wYXRpYmlsaXR5SXNzdWVzKVxuICAgICAqL1xuICAgIGRldGVjdENTU0NvbXBhdGliaWxpdHlJc3N1ZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIG9yIGVuYWJsZSB0aGUgd2lkZ2V0LiBJdCBpcyBzaW1pbGFyIHRvIFtyZWFkT25seV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctcmVhZE9ubHkpIGV4Y2VwdCBhIGRpc2FibGVkIHdpZGdldFxuICAgICAqIGNhbm5vdCBiZSBmb2N1c2VkLCB1c2VzIGEgZGlmZmVyZW50IHJlbmRpdGlvbiAodXN1YWxseSBncmV5aXNoKSBhbmQgZG9lcyBub3QgYWxsb3cgc2VsZWN0aW5nIGl0cyB2YWx1ZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctZGlzYWJsZWQpXG4gICAgICovXG4gICAgZGlzYWJsZWQgPyA6IGJvb2xlYW58J2luZXJ0J1xuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbm90IGdldCBhIHdhcm5pbmcgd2hlbiBjYWxsaW5nIFtnZXRTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNmdW5jdGlvbi1nZXRTdGF0ZSkgd2hlbiB0aGVyZSBpcyBhIGNvbHVtblxuICAgICAqIGNvbmZpZ3VyZWQgd2l0aG91dCBhbiBgaWRgLiBCdXQgdGhlIHJlY29tbWVuZGVkIGFjdGlvbiBpcyB0byBhbHdheXMgY29uZmlndXJlIGNvbHVtbnMgd2l0aCBhbiBgaWRgIHdoZW5cbiAgICAgKiB1c2luZyBzdGF0ZXMuXG4gICAgICovXG4gICAgZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG5vdCBnZXQgYSB3YXJuaW5nIHdoZW4gdXNpbmcgYW5vdGhlciBiYXNlIGNsYXNzIHRoYW4gR3JpZFJvd01vZGVsIGZvciB5b3VyIGdyaWQgZGF0YS4gSWZcbiAgICAgKiB5b3UgZG8sIGFuZCB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgZnVsbCBmZWF0dXJlIHNldCBvZiB0aGUgZ3JpZCB0aGVuIGluY2x1ZGUgdGhlIGZpZWxkcyBmcm9tIEdyaWRSb3dNb2RlbFxuICAgICAqIGluIHlvdXIgbW9kZWwgZGVmaW5pdGlvbi5cbiAgICAgKi9cbiAgICBkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIENvbnRyb2xzIHRoZSBwbGFjZW1lbnQgb2YgdGhpcyB3aWRnZXQgd2hlbiBpdCBpcyBhZGRlZCB0byBhIFtwYW5lbCdzIF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsKVxuICAgICAqIFtzdHJpcHMgY29sbGVjdGlvbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLiBUeXBpY2FsIHZhbHVlcyBmb3IgdGhpcyBjb25maWcgYXJlIGAndG9wJ2AsXG4gICAgICogYCdib3R0b20nYCwgYCdsZWZ0J2AsIG9yIGAncmlnaHQnYCwgd2hpY2ggY2F1c2UgdGhlIHdpZGdldCB0byBiZSBwbGFjZWQgb24gdGhhdCBzaWRlIG9mIHRoZSBwYW5lbCdzXG4gICAgICogYm9keS4gU3VjaCB3aWRnZXRzIGFyZSBjYWxsZWQgXCJlZGdlIHN0cmlwc1wiLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1kb2NrKVxuICAgICAqL1xuICAgIGRvY2sgPyA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdFxuICAgIC8qKlxuICAgICAqIE1ha2UgdGhpcyBQYW5lbCBhIGRvY2tlZCBkcmF3ZXIgd2hpY2ggc2xpZGVzIG91dCBmcm9tIG9uZSBzaWRlIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0IGJ5IGRlZmF1bHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWRyYXdlcilcbiAgICAgKiBAcGFyYW0geydzdGFydCcsJ2xlZnQnLCdlbmQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSd9IHNpZGUgVGhlIHNpZGUgb2YgdGhlIHZpZXdwb3J0IHRvIGRvY2sgdGhlIGRyYXdlciB0by4gICogYCdzdGFydCdgIG1lYW5zIHRoZSBgaW5saW5lLXN0YXJ0YCBzaWRlLiAqIGAnZW5kJ2AgbWVhbnMgdGhlIGBpbmxpbmUtZW5kYCBzaWRlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nLG51bWJlcn0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZHJhd2VyIGluIGl0cyBjb2xsYXBzaWJsZSBheGlzLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5saW5lIElmIHVzaW5nIHRoZSBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctYXBwZW5kVG8pIGNvbmZpZyB0byBwbGFjZSB0aGUgZHJhd2VyIGluc2lkZSBhIGhvc3Qgd2lkZ2V0LCB0aGlzIG1heSBiZSBzZXQgdG8gYHRydWVgIHRvIG1ha2UgdGhlIGRyYXdlciBpbmxpbmUgd2l0aGluIHRoYXQgaG9zdC4gTm90ZSB0aGF0LCBpZiB1c2luZyB0aGlzLCB0aGUgbGF5b3V0IG9mIHRoZSBob3N0IGVsZW1lbnQgbXVzdCBoYXZlIGBmbGV4LWRpcmVjdGlvbmAgc2V0IGFwcHJvcHJpYXRlbHkuXG4gICAgICogQHBhcmFtIHtib29sZWFuLG9iamVjdH0gYXV0b0Nsb3NlIFNwZWNpZmllcyB3aGF0IHVzZXIgYWN0aW9ucyBzaG91bGQgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgZHJhd2VyLiBEZWZhdWx0cyB0byBjbG9zaW5nIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGRyYXdlciBvciB3aGVuIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlci5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW4sc3RyaW5nfSBhdXRvQ2xvc2UubW91c2Vkb3duIElmIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIG9mIHRoZSBkcmF3ZXIsIHRoZSBkcmF3ZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGhpZGRlbi4gSWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLCBpdCBpcyB1c2VkIGFzIGEgQ1NTIHNlbGVjdG9yIHRvIGZpbHRlciBjbGlja3Mgd2hpY2ggc2hvdWxkIGNsb3NlIHRoZSBkcmF3ZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFuLHN0cmluZ30gYXV0b0Nsb3NlLmZvY3Vzb3V0IElmIGZvY3VzIG1vdmVzIG91dHNpZGUgb2YgdGhlIGRyYXdlciwgdGhlIGRyYXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaGlkZGVuLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdXRvQ2xvc2UubW91c2VvdXQgSGlkZXMgdGhlIGRyYXdlciB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgdGhlIGRyYXdlciBhZnRlciB0aGUgYGF1dG9DbG9zZURlbGF5YCBwZXJpb2QuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGF1dG9DbG9zZURlbGF5IFdoZW4gdXNpbmcgYG1vdXNlb3V0YCwgdGhpcyBpcyB0aGUgZGVsYXkgaW4gbWlsbGlzZWNvbmRzXG4gICAgICovXG4gICAgZHJhd2VyID8gOiBib29sZWFufHtzaWRlPzogJ3N0YXJ0J3wnbGVmdCd8J2VuZCd8J3JpZ2h0J3wndG9wJ3wnYm90dG9tJywgc2l6ZT86IHN0cmluZ3xudW1iZXIsIGlubGluZT86IGJvb2xlYW4sIGF1dG9DbG9zZTogeyBtb3VzZWRvd24/OiBib29sZWFufHN0cmluZywgZm9jdXNvdXQ/OiBib29sZWFufHN0cmluZywgbW91c2VvdXQ/OiBzdHJpbmcgfSwgYXV0b0Nsb3NlRGVsYXk/OiBudW1iZXJ9XG4gICAgLyoqXG4gICAgICogQW4gb2JqZWN0IHNwZWNpZnlpbmcgYXR0cmlidXRlcyB0byBhc3NpZ24gdG8gdGhlIHJvb3QgZWxlbWVudCBvZiB0aGlzIHdpZGdldC5cbiAgICAgKiBTZXQgYG51bGxgIHZhbHVlIHRvIGF0dHJpYnV0ZSB0byByZW1vdmUgaXQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAqL1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzID8gOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8bnVsbD5cbiAgICAvKipcbiAgICAgKiBUZXh0IG9yIEhUTUwsIG9yIGEgW0VtcHR5VGV4dERvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSN0eXBlZGVmLUVtcHR5VGV4dERvbUNvbmZpZykgYmxvY2sgdG8gZGlzcGxheSB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gZGlzcGxheSBpbiB0aGUgZ3JpZC5cbiAgICAgKiBXaGVuIHVzaW5nIG11bHRpcGxlIEdyaWQgcmVnaW9ucywgcHJvdmlkZSB0aGUgYHJlZ2lvbmAgcHJvcGVydHkgdG8gZGVjaWRlIHdoZXJlIHRoZSB0ZXh0IGlzIHNob3duLlxuICAgICAqIEJ5IGRlZmF1bHQsIGl0IGlzIHNob3duIGluIHRoZSBmaXJzdCByZWdpb24uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWVtcHR5VGV4dClcbiAgICAgKi9cbiAgICBlbXB0eVRleHQgPyA6IHN0cmluZ3xFbXB0eVRleHREb21Db25maWdcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgdGhpcyBhcyBgdHJ1ZWAgdG8gYWxsb3cgZWxlbWVudHMgd2l0aGluIGNlbGxzIHRvIGJlIHN0eWxlZCBhcyBgcG9zaXRpb246IHN0aWNreWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWVuYWJsZVN0aWNreSlcbiAgICAgKi9cbiAgICBlbmFibGVTdGlja3kgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFsbG93IHRleHQgc2VsZWN0aW9uIGluIHRoZSBncmlkIGNlbGxzLiBOb3RlLCB0aGlzIGNhbm5vdCBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGggdGhlXG4gICAgICogYFJvd1Jlb3JkZXJgIGZlYXR1cmUuXG4gICAgICovXG4gICAgZW5hYmxlVGV4dFNlbGVjdGlvbiA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gbGlzdGVuIGZvciBDVFJMLVogKENNRC1aIG9uIE1hYyBPUykga2V5Ym9hcmQgZXZlbnQgYW5kIHRyaWdnZXIgdW5kbyAocmVkbyB3aGVuIFNISUZUIGlzXG4gICAgICogcHJlc3NlZCkuIE9ubHkgYXBwbGljYWJsZSB3aGVuIHVzaW5nIGEgW1N0YXRlVHJhY2tpbmdNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9kYXRhL3N0bS9TdGF0ZVRyYWNraW5nTWFuYWdlcikuXG4gICAgICovXG4gICAgZW5hYmxlVW5kb1JlZG9LZXlzID8gOiBib29sZWFuXG4gICAgZXh0cmFEYXRhID8gOiBhbnlcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIHN0cmV0Y2ggdGhlIGxhc3QgY29sdW1uIGluIGEgZ3JpZCB3aXRoIGFsbCBmaXhlZCB3aWR0aCBjb2x1bW5zXG4gICAgICogdG8gZmlsbCBleHRyYSBhdmFpbGFibGUgc3BhY2UgaWYgdGhlIGdyaWQncyB3aWR0aCBpcyB3aWRlciB0aGFuIHRoZSBzdW0gb2YgYWxsXG4gICAgICogY29uZmlndXJlZCBjb2x1bW4gd2lkdGhzLlxuICAgICAqL1xuICAgIGZpbGxMYXN0Q29sdW1uID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVXNlIGZpeGVkIHJvdyBoZWlnaHQuIFNldHRpbmcgdGhpcyB0byBgdHJ1ZWAgd2lsbCBjb25maWd1cmUgdGhlIHVuZGVybHlpbmcgUm93TWFuYWdlciB0byB1c2UgZml4ZWQgcm93XG4gICAgICogaGVpZ2h0LCB3aGljaCBzYWNyaWZpY2VzIHRoZSBhYmlsaXR5IHRvIHVzZSByb3dzIHdpdGggdmFyaWFibGUgaGVpZ2h0IHRvIGdhaW4gYSBmcmFjdGlvbiBiZXR0ZXJcbiAgICAgKiBwZXJmb3JtYW5jZS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctZml4ZWRSb3dIZWlnaHQpXG4gICAgICovXG4gICAgZml4ZWRSb3dIZWlnaHQgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBXaGVuIHRoaXMgd2lkZ2V0IGlzIGEgY2hpbGQgb2YgYSBbQ29udGFpbmVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvQ29udGFpbmVyKSwgaXQgd2lsbCBieSBkZWZhdWx0IGJlIHBhcnRpY2lwYXRpbmcgaW4gYVxuICAgICAqIGZsZXhib3ggbGF5b3V0LiBUaGlzIGNvbmZpZyBhbGxvd3MgeW91IHRvIHNldCB0aGlzIHdpZGdldCdzXG4gICAgICogW2ZsZXhdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mbGV4KSBzdHlsZS5cbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGEgc2luZ2xlIG51bWJlciBvciBhIGAmbHQ7ZmxleC1ncm93Jmd0OyAmbHQ7ZmxleC1zaHJpbmsmZ3Q7ICZsdDtmbGV4LWJhc2lzJmd0O2AgZm9ybWF0IHN0cmluZy5cbiAgICAgKiBudW1lcmljLW9ubHkgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB0aGUgYGZsZXgtZ3Jvd2AgdmFsdWUuXG4gICAgICovXG4gICAgZmxleCA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIENvbmZpZyBvYmplY3Qgb2YgYSBmb290ZXIuIE1heSBjb250YWluIGEgYGRvY2tgLCBgaHRtbGAgYW5kIGEgYGNsc2AgcHJvcGVydHkuIEEgZm9vdGVyIGlzIG5vdCBhIHdpZGdldCxcbiAgICAgKiBidXQgcmF0aGVyIHBsYWluIEhUTUwgdGhhdCBmb2xsb3dzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBhbmVsJ3MgYm9keSBhbmQgW3N0cmlwc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1zdHJpcHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1mb290ZXIpXG4gICAgICovXG4gICAgZm9vdGVyID8gOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2hpY2ggbmFtZXMgZm9ybXVsYSBwcmVmaXhlcyB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIGNvbHVtbnMgY29uZmlndXJlZCB3aXRoXG4gICAgICogYGZvcm11bGEgOiB0cnVlYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctZm9ybXVsYVByb3ZpZGVycylcbiAgICAgKi9cbiAgICBmb3JtdWxhUHJvdmlkZXJzID8gOiBSZWNvcmQ8c3RyaW5nLCBGb3JtdWxhUHJvdmlkZXJDb25maWc+XG4gICAgLyoqXG4gICAgICogUmVmcmVzaCBlbnRpcmUgcm93IHdoZW4gYSByZWNvcmQgY2hhbmdlcyAoYHRydWVgKSBvciwgaWYgcG9zc2libGUsIG9ubHkgdGhlIGNlbGxzIGFmZmVjdGVkIChgZmFsc2VgKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctZnVsbFJvd1JlZnJlc2gpXG4gICAgICovXG4gICAgZnVsbFJvd1JlZnJlc2ggPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBBIGZ1bmN0aW9uIGNhbGxlZCBmb3IgZWFjaCByb3cgdG8gZGV0ZXJtaW5lIGl0cyBoZWlnaHQuIEl0IGlzIHBhc3NlZCBhIFtyZWNvcmRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2RhdGEvTW9kZWwpIGFuZFxuICAgICAqIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgZGVzaXJlZCBoZWlnaHQgb2YgdGhhdCByZWNvcmRzIHJvdy4gSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBmYWxzeSB2YWx1ZSwgR3JpZHNcbiAgICAgKiBjb25maWd1cmVkIFtyb3dIZWlnaHRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXJvd0hlaWdodCkgaXMgdXNlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctZ2V0Um93SGVpZ2h0KVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBnZXRSb3dIZWlnaHQucmVjb3JkIFJlY29yZCB0byBkZXRlcm1pbmUgcm93IGhlaWdodCBmb3JcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBEZXNpcmVkIHJvdyBoZWlnaHRcbiAgICAgKi9cbiAgICBnZXRSb3dIZWlnaHQgPyA6IChnZXRSb3dIZWlnaHQ6IHsgcmVjb3JkOiBNb2RlbCB9KSA9PiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZyBbb2JqZWN0XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjdHlwZWRlZi1QYW5lbEhlYWRlcikgZm9yIHRoZSBwYW5lbCdzIGhlYWRlciBvciBhIHN0cmluZyBpbiBwbGFjZSBvZiBhIGB0aXRsZWAuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWhlYWRlcilcbiAgICAgKi9cbiAgICBoZWFkZXIgPyA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3MgaGVpZ2h0LCB1c2VkIHRvIHNldCBlbGVtZW50IGBzdHlsZS5oZWlnaHRgLiBFaXRoZXIgc3BlY2lmeSBhIHZhbGlkIGhlaWdodCBzdHJpbmcgb3IgYSBudW1iZXIsXG4gICAgICogd2hpY2ggd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCBoZWlnaHQsIGJ1dCBpbiBzb21lXG4gICAgICogY2FzZXMgdGhpcyBjb25maWcgaXMgY29udmVuaWVudC5cbiAgICAgKi9cbiAgICBoZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmUgd2l0aCB0cnVlIHRvIG1ha2Ugd2lkZ2V0IGluaXRpYWxseSBoaWRkZW4uXG4gICAgICovXG4gICAgaGlkZGVuID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBmb290ZXIgZWxlbWVudHNcbiAgICAgKi9cbiAgICBoaWRlRm9vdGVycyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgdHJ1ZWAgdG8gaGlkZSB0aGUgY29sdW1uIGhlYWRlciBlbGVtZW50c1xuICAgICAqL1xuICAgIGhpZGVIZWFkZXJzID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGB0cnVlYCB0byBoaWRlIHRoZSBHcmlkJ3MgaG9yaXpvbnRhbCBzY3JvbGxiYXIocylcbiAgICAgKi9cbiAgICBoaWRlSG9yaXpvbnRhbFNjcm9sbGJhciA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEEgQ1NTIGNsYXNzIHRvIGFkZCB0byBob3ZlcmVkIHJvdyBlbGVtZW50c1xuICAgICAqL1xuICAgIGhvdmVyQ2xzID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBBbiBpY29uIHRvIHNob3cgYmVmb3JlIHRoZSBbdGl0bGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9QYW5lbCNjb25maWctdGl0bGUpLiBFaXRoZXIgcGFzcyBhIENTUyBjbGFzcyBhcyBhIHN0cmluZywgb3IgcGFzcyBhXG4gICAgICogW0RvbUNvbmZpZ10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvaGVscGVyL0RvbUhlbHBlciN0eXBlZGVmLURvbUNvbmZpZykgb2JqZWN0IGRlc2NyaWJpbmcgYW4gZWxlbWVudCB0byByZXByZXNlbnQgdGhlIGljb24uXG4gICAgICovXG4gICAgaWNvbiA/IDogc3RyaW5nfERvbUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFdpZGdldCBpZCwgaWYgbm90IHNwZWNpZmllZCBvbmUgd2lsbCBiZSBnZW5lcmF0ZWQuIEFsc28gdXNlZCBmb3IgbG9va3VwcyB0aHJvdWdoIFdpZGdldC5nZXRCeUlkXG4gICAgICovXG4gICAgaWQgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIHdpZGdldHMgcmVhZC1vbmx5IHN0YXRlIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGl0cyBwYXJlbnQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWlnbm9yZVBhcmVudFJlYWRPbmx5KVxuICAgICAqL1xuICAgIGlnbm9yZVBhcmVudFJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29udmVuaWVuY2Ugc2V0dGluZyB0byBhbGlnbiBpbnB1dCBmaWVsZHMgb2YgY2hpbGQgd2lkZ2V0cy4gQnkgZGVmYXVsdCwgdGhlIEZpZWxkIGlucHV0IGVsZW1lbnQgaXNcbiAgICAgKiBwbGFjZWQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSBgbGFiZWxgLiBJZiB5b3UgcHJlZmVyIHRvIGhhdmUgYWxsIGlucHV0IGZpZWxkcyBhbGlnbmVkIHRvIHRoZVxuICAgICAqIHJpZ2h0LCBzZXQgdGhpcyBjb25maWcgdG8gYCdlbmQnYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctaW5wdXRGaWVsZEFsaWduKVxuICAgICAqL1xuICAgIGlucHV0RmllbGRBbGlnbiA/IDogJ3N0YXJ0J3wnZW5kJ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGluc2VydCB0aGlzIHdpZGdldCBiZWZvcmUuIElmIHByb3ZpZGVkLCBbYXBwZW5kVG9dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLWFwcGVuZFRvKSBjb25maWcgaXMgaWdub3JlZC5cbiAgICAgKi9cbiAgICBpbnNlcnRCZWZvcmUgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEVsZW1lbnQgKG9yIGVsZW1lbnQgaWQpIHRvIGFwcGVuZCB0aGlzIHdpZGdldCBlbGVtZW50IHRvLCBhcyBhIGZpcnN0IGNoaWxkLiBJZiBwcm92aWRlZCwgW2FwcGVuZFRvXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1hcHBlbmRUbykgY29uZmlnIGlzIGlnbm9yZWQuXG4gICAgICovXG4gICAgaW5zZXJ0Rmlyc3QgPyA6IEhUTUxFbGVtZW50fHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFNlZSBbS2V5Ym9hcmQgc2hvcnRjdXRzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWQja2V5Ym9hcmQtc2hvcnRjdXRzKSBmb3IgZGV0YWlsc1xuICAgICAqL1xuICAgIGtleU1hcCA/IDogUmVjb3JkPHN0cmluZywgS2V5TWFwQ29uZmlnPlxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNldHRpbmcgdG8gdXNlIHNhbWUgbGFiZWwgcGxhY2VtZW50IG9uIGFsbCBjaGlsZCB3aWRnZXRzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1sYWJlbFBvc2l0aW9uKVxuICAgICAqL1xuICAgIGxhYmVsUG9zaXRpb24gPyA6ICdiZWZvcmUnfCdhYm92ZSd8J2FsaWduLWJlZm9yZSd8J2F1dG8nfG51bGxcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdGVuZXIgc2V0IGZvciB0aGlzIG9iamVjdC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctbGlzdGVuZXJzKVxuICAgICAqL1xuICAgIGxpc3RlbmVycyA/IDogR3JpZEJhc2VMaXN0ZW5lcnNcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCwgb3IgYSBtZXNzYWdlIHRvIGJlIHNob3duIHdoZW4gYSBzdG9yZSBpcyBwZXJmb3JtaW5nIGEgcmVtb3RlXG4gICAgICogb3BlcmF0aW9uLCBvciBDcnVkIE1hbmFnZXIgaXMgbG9hZGluZyBkYXRhIGZyb20gdGhlIHNldmVyLiBTZXQgdG8gYG51bGxgIHRvIGRpc2FibGUgZGVmYXVsdCBsb2FkIG1hc2suXG4gICAgICovXG4gICAgbG9hZE1hc2sgPyA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCB0byBhZGp1c3QgdGhlIFttYXNrRGVmYXVsdHNdKCNDb3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLW1hc2tEZWZhdWx0cylcbiAgICAgKiB3aGVuIGRhdGEgaXMgbG9hZGluZy4gVGhlIG1lc3NhZ2UgYW5kIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGVcbiAgICAgKiBbbG9hZE1hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL21peGluL0xvYWRNYXNrYWJsZSNjb25maWctbG9hZE1hc2spIGNvbmZpZyB0YWtlIHByaW9yaXR5IG92ZXIgdGhlc2Ugb3B0aW9ucywganVzdCBhcyB0aGV5IGRvXG4gICAgICogZm9yIGBtYXNrRGVmYXVsdHNgLCByZXNwZWN0aXZlbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLWxvYWRNYXNrRGVmYXVsdHMpXG4gICAgICovXG4gICAgbG9hZE1hc2tEZWZhdWx0cyA/IDogTWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEEgW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0IHRvIGFkanVzdCB0aGUgW21hc2tEZWZhdWx0c10oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctbWFza0RlZmF1bHRzKVxuICAgICAqIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgZGF0YS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctbG9hZE1hc2tFcnJvcilcbiAgICAgKi9cbiAgICBsb2FkTWFza0Vycm9yID8gOiBNYXNrQ29uZmlnfE1hc2t8Ym9vbGVhblxuICAgIC8qKlxuICAgICAqIFNldCB0byBgZmFsc2VgIHRvIGRpc2FibGUgbG9jYWxpemF0aW9uIG9mIHRoaXMgb2JqZWN0LlxuICAgICAqL1xuICAgIGxvY2FsaXphYmxlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGltZSBpbiBtcyB1bnRpbCBhIGxvbmdwcmVzcyBpcyB0cmlnZ2VyZWRcbiAgICAgKi9cbiAgICBsb25nUHJlc3NUaW1lID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBXaWRnZXQncyBtYXJnaW4uIFRoaXMgbWF5IGJlIGNvbmZpZ3VyZWQgYXMgYSBzaW5nbGUgbnVtYmVyIG9yIGEgYFRSQkxgIGZvcm1hdCBzdHJpbmcuXG4gICAgICogbnVtZXJpYy1vbmx5IHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgcGl4ZWxzLlxuICAgICAqL1xuICAgIG1hcmdpbiA/IDogbnVtYmVyfHN0cmluZ1xuICAgIC8qKlxuICAgICAqIEdyaWRzIGNoYW5nZSB0aGUgYG1hc2tEZWZhdWx0c2AgdG8gY292ZXIgb25seSB0aGVpciBgYm9keWAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBtYXNrRGVmYXVsdHMgPyA6IE1hc2tDb25maWdcbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIGFwcGx5IHRoZSBkZWZhdWx0IG1hc2sgdG8gdGhlIHdpZGdldC4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgdGhlIG1hc2sgbWVzc2FnZSBvciBhXG4gICAgICogW01hc2tdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9NYXNrKSBjb25maWcgb2JqZWN0LlxuICAgICAqL1xuICAgIG1hc2tlZCA/IDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoZSBlbGVtZW50J3MgbWF4SGVpZ2h0LiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW2hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaGVpZ2h0KSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWF4SGVpZ2h0ID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogVGhlIGVsZW1lbnRzIG1heFdpZHRoLiBDYW4gYmUgZWl0aGVyIGEgU3RyaW5nIG9yIGEgTnVtYmVyICh3aGljaCB3aWxsIGhhdmUgJ3B4JyBhcHBlbmRlZCkuIE5vdGUgdGhhdFxuICAgICAqIGxpa2UgW3dpZHRoXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy13aWR0aCksICpyZWFkaW5nKiB0aGUgdmFsdWUgd2lsbCByZXR1cm4gdGhlIG51bWVyaWMgdmFsdWUgaW4gcGl4ZWxzLlxuICAgICAqL1xuICAgIG1heFdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG4gICAgLyoqXG4gICAgICogR3JpZCdzIGBtaW4taGVpZ2h0YC4gRGVmYXVsdHMgdG8gYDEwZW1gIHRvIGJlIHN1cmUgdGhhdCB0aGUgR3JpZCBhbHdheXMgaGFzIGEgaGVpZ2h0IHdoZXJldmVyIGl0IGlzXG4gICAgICogaW5zZXJ0ZWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLW1pbkhlaWdodClcbiAgICAgKi9cbiAgICBtaW5IZWlnaHQgPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGUgZWxlbWVudHMgbWluV2lkdGguIENhbiBiZSBlaXRoZXIgYSBTdHJpbmcgb3IgYSBOdW1iZXIgKHdoaWNoIHdpbGwgaGF2ZSAncHgnIGFwcGVuZGVkKS4gTm90ZSB0aGF0XG4gICAgICogbGlrZSBbd2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjY29uZmlnLXdpZHRoKSwgKnJlYWRpbmcqIHRoZSB2YWx1ZSB3aWxsIHJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBpbiBwaXhlbHMuXG4gICAgICovXG4gICAgbWluV2lkdGggPyA6IHN0cmluZ3xudW1iZXJcbiAgICAvKipcbiAgICAgKiBHcmlkIG1vbml0b3JzIHdpbmRvdyByZXNpemUgYnkgZGVmYXVsdC5cbiAgICAgKi9cbiAgICBtb25pdG9yUmVzaXplID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogVGhlIG93bmluZyBXaWRnZXQgb2YgdGhpcyBXaWRnZXQuIElmIHRoaXMgV2lkZ2V0IGlzIGRpcmVjdGx5IGNvbnRhaW5lZCAodGhhdCBpcywgaXQgaXMgb25lIG9mIHRoZVxuICAgICAqIFtpdGVtc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lciNwcm9wZXJ0eS1pdGVtcykgb2YgYSBDb250YWluZXIpLCB0aGlzIGNvbmZpZyB3aWxsIGJlIGlnbm9yZWQuIEluIHRoaXMgY2FzZVxuICAgICAqIHRoZSBvd25lciBpcyA8c3Ryb25nPmFsd2F5czwvc3Ryb25nPiB0aGUgZW5jYXBzdWxhdGluZyBDb250YWluZXIuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLW93bmVyKVxuICAgICAqL1xuICAgIG93bmVyID8gOiBXaWRnZXR8YW55XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBwbHVnaW5zIChhbiBhcnJheSBvZiBjbGFzc2VzKSBpbiBjb25maWdcbiAgICAgKi9cbiAgICBwbHVnaW5zID8gOiBGdW5jdGlvbltdXG4gICAgLyoqXG4gICAgICogVHJ1ZSB0byBwcmVzZXJ2ZSBmb2N1c2VkIGNlbGwgYWZ0ZXIgbG9hZGluZyBuZXcgZGF0YVxuICAgICAqL1xuICAgIHByZXNlcnZlRm9jdXNPbkRhdGFzZXRDaGFuZ2UgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBQcmVzZXJ2ZSB0aGUgZ3JpZCdzIHZlcnRpY2FsIHNjcm9sbCBwb3NpdGlvbiB3aGVuIGNoYW5nZXNldHMgYXJlIGFwcGxpZWQsIGFzIGluIHRoZSBjYXNlIG9mIHJlbW90ZVxuICAgICAqIGNoYW5nZXMsIG9yIHdoZW4gc3RvcmVzIGFyZSBjb25maWd1cmVkIHdpdGggW3N5bmNEYXRhT25Mb2FkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlI2NvbmZpZy1zeW5jRGF0YU9uTG9hZCkuXG4gICAgICovXG4gICAgcHJlc2VydmVTY3JvbGwgPyA6IFByZXNlcnZlU2Nyb2xsT3B0aW9uc3xib29sZWFuXG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBgdHJ1ZWAgdG8gcHJlc2VydmUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uIGFmdGVyIHN0b3JlIGFjdGlvbnMgdGhhdCB0cmlnZ2VyIGEgYHJlZnJlc2hgIGV2ZW50LFxuICAgICAqIHN1Y2ggYXMgbG9hZGluZyBuZXcgZGF0YSBhbmQgZmlsdGVyaW5nLlxuICAgICAqL1xuICAgIHByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogUHJldmVudCB0b29sdGlwIGZyb20gYmVpbmcgZGlzcGxheWVkIG9uIHRvdWNoIGRldmljZXMuIFVzZWZ1bCBmb3IgZXhhbXBsZSBmb3IgYnV0dG9ucyB0aGF0IGRpc3BsYXkgYVxuICAgICAqIG1lbnUgb24gY2xpY2sgZXRjLCBzaW5jZSB0aGUgdG9vbHRpcCB3b3VsZCBiZSBkaXNwbGF5ZWQgYXQgdGhlIHNhbWUgdGltZS5cbiAgICAgKi9cbiAgICBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gYHRydWVgIHRvIG1ha2UgdGhlIGdyaWQgcmVhZC1vbmx5LCBieSBkaXNhYmxpbmcgYW55IFVJcyBmb3IgbW9kaWZ5aW5nIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXJlYWRPbmx5KVxuICAgICAqL1xuICAgIHJlYWRPbmx5ID8gOiBib29sZWFuXG4gICAgcmVsYXlTdG9yZUV2ZW50cyA/IDogYm9vbGVhblxuICAgIC8qKlxuICAgICAqIEVpdGhlciBhIGRlZmF1bHQgYHJlbmRpdGlvbmAgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIHdpZGdldHMsIG9yIGEgbWFwIG9mIHJlbmRpdGlvbnMga2V5ZWQgYnkgY2hpbGQgd2lkZ2V0XG4gICAgICogYHR5cGVgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1yZW5kaXRpb24pXG4gICAgICovXG4gICAgcmVuZGl0aW9uID8gOiBzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nPnxudWxsXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIHRoaXMgcHJvcGVydHkgdG8gYWxsb3cgdGhlIHdpZGdldC9jb21wb25lbnQgdG8gYmUgcmVzaXplZC4gUHJlc3NpbmcgPGtiZD5TaGlmdDwva2JkPiB3aGlsZSByZXNpemluZyB3aWxsXG4gICAgICogY29uc3RyYWluIHRoZSBhc3BlY3QgcmF0aW8uXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXJlc2l6YWJsZSlcbiAgICAgKi9cbiAgICByZXNpemFibGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBtaW5XaWR0aD86IG51bWJlclxuICAgICAgICBtYXhXaWR0aD86IG51bWJlclxuICAgICAgICBtaW5IZWlnaHQ/OiBudW1iZXJcbiAgICAgICAgbWF4SGVpZ2h0PzogbnVtYmVyXG4gICAgICAgIGhhbmRsZXM/OiBvYmplY3RcbiAgICB9XG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gb25seSBtZWFzdXJlIGNlbGwgY29udGVudHMgd2hlbiBkb3VibGUtY2xpY2tpbmcgdGhlIGVkZ2UgYmV0d2VlbiBjb2x1bW4gaGVhZGVycy5cbiAgICAgKi9cbiAgICByZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogXCJCcmVhayBwb2ludHNcIiBmb3Igd2hpY2ggcmVzcG9uc2l2ZSBjb25maWcgdG8gdXNlIGZvciBjb2x1bW5zIGFuZCBjc3MuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXJlc3BvbnNpdmVMZXZlbHMpXG4gICAgICovXG4gICAgcmVzcG9uc2l2ZUxldmVscyA/IDogUmVjb3JkPHN0cmluZywgbnVtYmVyfHN0cmluZ3xSZXNwb25zaXZlTGV2ZWxDb25maWc+XG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlIGFzIGB0cnVlYCB0byBoYXZlIHRoZSBjb21wb25lbnQgZGlzcGxheSBhIHRyYW5zbHVjZW50IHJpcHBsZSB3aGVuIGl0c1xuICAgICAqIFtmb2N1c0VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZm9jdXNFbGVtZW50KSwgb3IgW2VsZW1lbnRdKCNDb3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgdGFwcGVkIDxlbT5pZiB0aGVcbiAgICAgKiBjdXJyZW50IHRoZW1lIHN1cHBvcnRzIHJpcHBsZXM8L2VtPi4gT3V0IG9mIHRoZSBib3gsIG9ubHkgdGhlIE1hdGVyaWFsIHRoZW1lIHN1cHBvcnRzIHJpcHBsZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXJpcHBsZSlcbiAgICAgKi9cbiAgICByaXBwbGUgPyA6IGJvb2xlYW58e1xuICAgICAgICBkZWxlZ2F0ZT86IHN0cmluZ1xuICAgICAgICBjb2xvcj86IHN0cmluZ1xuICAgICAgICByYWRpdXM/OiBudW1iZXJcbiAgICAgICAgY2xpcD86IHN0cmluZ1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBJZiB5b3UgYXJlIHJlbmRlcmluZyB0aGlzIHdpZGdldCB0byBhIHNoYWRvdyByb290IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCB0aGlzIGNvbmZpZyB0byB0aGUgc2hhZG93Um9vdC4gSWYgbm90IGluc2lkZSBhIHdlYiBjb21wb25lbnQsIHNldCBpdCB0byBgZG9jdW1lbnQuYm9keWBcbiAgICAgKi9cbiAgICByb290RWxlbWVudCA/IDogU2hhZG93Um9vdHxIVE1MRWxlbWVudFxuICAgIC8qKlxuICAgICAqIFJvdyBoZWlnaHQgaW4gcGl4ZWxzLiBUaGlzIGFsbG93cyB0aGUgZGVmYXVsdCBoZWlnaHQgZm9yIHJvd3MgdG8gYmUgY29udHJvbGxlZC4gTm90ZSB0aGF0IGl0IG1heSBiZVxuICAgICAqIG92ZXJyaWRlbiBieSBzcGVjaWZ5aW5nIGEgW3Jvd0hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZGF0YS9HcmlkUm93TW9kZWwjZmllbGQtcm93SGVpZ2h0KSBvbiBhIHBlciByZWNvcmQgYmFzaXMsIG9yIGZyb21cbiAgICAgKiBhIGNvbHVtbiBbcmVuZGVyZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2NvbHVtbi9Db2x1bW4jY29uZmlnLXJlbmRlcmVyKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctcm93SGVpZ2h0KVxuICAgICAqL1xuICAgIHJvd0hlaWdodCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogU2V0IHRvIGBmYWxzZWAgdG8gbm90IHNob3cgcm93IGxpbmVzLiBFbmQgcmVzdWx0IG1pZ2h0IGJlIG92ZXJydWxlZCBieS9kaWZmZXIgYmV0d2VlbiB0aGVtZXMuXG4gICAgICovXG4gICAgcm93TGluZXMgPyA6IGJvb2xlYW5cbiAgICAvKipcbiAgICAgKiBUaGlzIG1heSBiZSBjb25maWd1cmVkIGFzIGB0cnVlYCB0byBtYWtlIHRoZSB3aWRnZXQncyBlbGVtZW50IHVzZSB0aGUgYGRpcmVjdGlvbjpydGxgIHN0eWxlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1ydGwpXG4gICAgICovXG4gICAgcnRsID8gOiBib29sZWFuXG4gICAgLyoqXG4gICAgICogQ29uZmlndXJlcyB3aGV0aGVyIHRoZSBncmlkIGlzIHNjcm9sbGFibGUgaW4gdGhlIGBZYCBheGlzLiBUaGlzIGlzIHVzZWQgdG8gY29uZmlndXJlIGEgW1Njcm9sbGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9oZWxwZXIvdXRpbC9TY3JvbGxlcikuXG4gICAgICogU2VlIHRoZSBbc2Nyb2xsZXJDbGFzc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc2Nyb2xsZXJDbGFzcykgY29uZmlnIG9wdGlvbi5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc2Nyb2xsYWJsZSlcbiAgICAgKi9cbiAgICBzY3JvbGxhYmxlID8gOiBib29sZWFufFNjcm9sbGVyQ29uZmlnfFNjcm9sbGVyXG4gICAgLyoqXG4gICAgICogVGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlIHRvIHVzZSBhcyB0aGUgW3Njcm9sbGFibGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXNjcm9sbGFibGUpLiBEZWZhdWx0cyB0byBbU2Nyb2xsZXJdKCNDb3JlL2hlbHBlci91dGlsL1Njcm9sbGVyKS5cbiAgICAgKi9cbiAgICBzY3JvbGxlckNsYXNzID8gOiB0eXBlb2YgU2Nyb2xsZXJcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmF0aW9uIHZhbHVlcyBmb3IgdGhlIFtTY3JvbGxNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS91dGlsL1Njcm9sbE1hbmFnZXIpIGNsYXNzIG9uIGluaXRpYWxpemF0aW9uLiBSZXR1cm5zIHRoZVxuICAgICAqIFtTY3JvbGxNYW5hZ2VyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS91dGlsL1Njcm9sbE1hbmFnZXIpIGF0IHJ1bnRpbWUuXG4gICAgICovXG4gICAgc2Nyb2xsTWFuYWdlciA/IDogU2Nyb2xsTWFuYWdlckNvbmZpZ3xTY3JvbGxNYW5hZ2VyXG4gICAgLyoqXG4gICAgICogU2VsZWN0aW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MsIGNoYW5nZSB0aGVzZSBwcm9wZXJ0aWVzIHRvIGNvbnRyb2wgaG93IHNlbGVjdGlvbiB3b3JrcyBhbmQgd2hhdCBjYW4gYmVcbiAgICAgKiBzZWxlY3RlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc2VsZWN0aW9uTW9kZSlcbiAgICAgKi9cbiAgICBzZWxlY3Rpb25Nb2RlID8gOiBHcmlkU2VsZWN0aW9uTW9kZVxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBhcyBgdHJ1ZWAgdG8gaGF2ZSB0aGUgZ3JpZCBzaG93IGEgcmVkIFwiY2hhbmdlZFwiIHRhZyBpbiBjZWxscyB3aG9zZVxuICAgICAqIGZpZWxkIHZhbHVlIGhhcyBjaGFuZ2VkIGFuZCBub3QgeWV0IGJlZW4gY29tbWl0dGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1zaG93RGlydHkpXG4gICAgICovXG4gICAgc2hvd0RpcnR5ID8gOiBib29sZWFufHtcbiAgICAgICAgZHVyaW5nRWRpdD86IGJvb2xlYW5cbiAgICAgICAgbmV3UmVjb3JkPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9ncmFtbWF0aWMgY29udHJvbCBvdmVyIGhvdyBtYW55IGNvbHVtbnMgdG8gc3BhbiB3aGVuIHVzZWQgaW4gYSBncmlkIGxheW91dC5cbiAgICAgKi9cbiAgICBzcGFuID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBUaGlzIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc3RhdGVmdWwpXG4gICAgICovXG4gICAgc3RhdGVmdWwgPyA6IGJvb2xlYW58b2JqZWN0fHN0cmluZ1tdXG4gICAgLyoqXG4gICAgICogVGhlIGV2ZW50cyB0aGF0LCB3aGVuIGZpcmVkIGJ5IHRoaXMgY29tcG9uZW50LCBzaG91bGQgdHJpZ2dlciBpdCB0byBzYXZlIGl0cyBzdGF0ZSBieSBjYWxsaW5nXG4gICAgICogW3NhdmVTdGF0ZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvbWl4aW4vU3RhdGUjZnVuY3Rpb24tc2F2ZVN0YXRlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc3RhdGVmdWxFdmVudHMpXG4gICAgICovXG4gICAgc3RhdGVmdWxFdmVudHMgPyA6IG9iamVjdHxzdHJpbmdbXVxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgdG8gdXNlIHdoZW4gc2F2aW5nIHRoaXMgb2JqZWN0J3Mgc3RhdGUgaW4gdGhlIFtzdGF0ZVByb3ZpZGVyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNjb25maWctc3RhdGVQcm92aWRlcikuIElmIHRoaXMgY29uZmlnIGlzXG4gICAgICogbm90IGFzc2lnbmVkLCBhbmQgW3N0YXRlZnVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNjb25maWctc3RhdGVmdWwpIGlzIG5vdCBzZXQgdG8gYGZhbHNlYCwgdGhlIFtpZF0oI0NvcmUvd2lkZ2V0L1dpZGdldCNjb25maWctaWQpXG4gICAgICogKGlmIGV4cGxpY2l0bHkgc3BlY2lmaWVkKSB3aWxsIGJlIHVzZWQgYXMgdGhlIGBzdGF0ZUlkYC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc3RhdGVJZClcbiAgICAgKi9cbiAgICBzdGF0ZUlkID8gOiBzdHJpbmdcbiAgICAvKipcbiAgICAgKiBUaGUgYFN0YXRlUHJvdmlkZXJgIHRvIHVzZSB0byBzYXZlIGFuZCByZXN0b3JlIHRoaXMgb2JqZWN0J3MgW3N0YXRlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9taXhpbi9TdGF0ZSNwcm9wZXJ0eS1zdGF0ZSkuIEJ5IGRlZmF1bHQsIGBzdGF0ZWBcbiAgICAgKiB3aWxsIGJlIHNhdmVkIHVzaW5nIHRoZSBbZGVmYXVsdCBzdGF0ZSBwcm92aWRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvc3RhdGUvU3RhdGVQcm92aWRlciNwcm9wZXJ0eS1pbnN0YW5jZS1zdGF0aWMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1zdGF0ZVByb3ZpZGVyKVxuICAgICAqL1xuICAgIHN0YXRlUHJvdmlkZXIgPyA6IFN0YXRlUHJvdmlkZXJcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvcGVydGllcyBvZiB0aGlzIHNldHRpbmdzIG9iamVjdCBjb250cm9scyBob3cgZ3JpZCBpcyByZXN0b3JlZCBmcm9tIHN0YXRlIGRhdGEuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXN0YXRlU2V0dGluZ3MpXG4gICAgICovXG4gICAgc3RhdGVTZXR0aW5ncyA/IDoge1xuICAgICAgICByZXN0b3JlVW5jb25maWd1cmVkQ29sdW1ucz86IGJvb2xlYW5cbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RvcmUgdGhhdCBob2xkcyByZWNvcmRzIHRvIGRpc3BsYXkgaW4gdGhlIGdyaWQsIG9yIGEgc3RvcmUgY29uZmlnIG9iamVjdC4gSWYgdGhlIGNvbmZpZ3VyYXRpb24gY29udGFpbnNcbiAgICAgKiBhIGByZWFkVXJsYCwgYW4gYEFqYXhTdG9yZWAgd2lsbCBiZSBjcmVhdGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1zdG9yZSlcbiAgICAgKi9cbiAgICBzdG9yZSA/IDogU3RvcmV8U3RvcmVDb25maWd8QWpheFN0b3JlfEFqYXhTdG9yZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCBjb250YWluaW5nIHdpZGdldHMga2V5ZWQgYnkgbmFtZS4gQnkgZGVmYXVsdCAod2hlbiBubyBgdHlwZWAgaXMgZ2l2ZW4pLCBzdHJpcHMgYXJlXG4gICAgICogW3Rvb2xiYXJzXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVG9vbGJhcikuIElmIHlvdSB3YW50IHRvIHBhc3MgYW4gYXJyYXksIHlvdSBjYW4gdXNlXG4gICAgICogdGhlIHRvb2xiYXIncyBbaXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjY29uZmlnLWl0ZW1zKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc3RyaXBzKVxuICAgICAqL1xuICAgIHN0cmlwcyA/IDogUmVjb3JkPHN0cmluZywgQ29udGFpbmVySXRlbUNvbmZpZz5cbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3QgY29udGFpbmluZyBzdWIgZ3JpZCBjb25maWd1cmF0aW9uIG9iamVjdHMga2V5ZWQgYnkgYSBgcmVnaW9uYCBwcm9wZXJ0eS5cbiAgICAgKiBCeSBkZWZhdWx0LCBncmlkIGhhcyBhICdsb2NrZWQnIHJlZ2lvbiAoaWYgY29uZmlndXJlZCB3aXRoIGxvY2tlZCBjb2x1bW5zKSBhbmQgYSAnbm9ybWFsJyByZWdpb24uXG4gICAgICogVGhlICdub3JtYWwnIHJlZ2lvbiBkZWZhdWx0cyB0byB1c2UgYGZsZXg6IDFgLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy1zdWJHcmlkQ29uZmlncylcbiAgICAgKi9cbiAgICBzdWJHcmlkQ29uZmlncyA/IDogUmVjb3JkPHN0cmluZywgU3ViR3JpZENvbmZpZz5cbiAgICAvKipcbiAgICAgKiBBIFtNYXNrXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvTWFzaykgY29uZmlnIG9iamVjdCwgb3IgYSBtZXNzYWdlIHRvIGJlIHNob3duIHdoZW4gQ3J1ZCBNYW5hZ2VyXG4gICAgICogaXMgcGVyc2lzdGluZyBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIuIFNldCB0byBgbnVsbGAgdG8gZGlzYWJsZSBkZWZhdWx0IHN5bmMgbWFzay5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctc3luY01hc2spXG4gICAgICovXG4gICAgc3luY01hc2sgPyA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGxcbiAgICAvKipcbiAgICAgKiBBIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbdGFiXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiKSBjcmVhdGVkIGZvciB0aGlzIHdpZGdldCB3aGVuIGl0IGlzIHBsYWNlZCBpbiBhXG4gICAgICogW1RhYlBhbmVsXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiUGFuZWwpLiBGb3IgZXhhbXBsZSwgdGhpcyBjb25maWcgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgaWNvbiBvZiB0aGUgYHRhYmAgZm9yXG4gICAgICogdGhpcyB3aWRnZXQ6XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXRhYilcbiAgICAgKi9cbiAgICB0YWIgPyA6IGJvb2xlYW58VGFiQ29uZmlnXG4gICAgLyoqXG4gICAgICogV2hlbiB0aGlzIGNvbnRhaW5lciBpcyB1c2VkIGFzIGEgdGFiIGluIGEgVGFiUGFuZWwsIHRoZXNlIGl0ZW1zIGFyZSBhZGRlZCB0byB0aGVcbiAgICAgKiBbVGFiQmFyXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvVGFiQmFyKSB3aGVuIHRoaXMgY29udGFpbmVyIGlzIHRoZSBhY3RpdmUgdGFiLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy10YWJCYXJJdGVtcylcbiAgICAgKi9cbiAgICB0YWJCYXJJdGVtcyA/IDogVG9vbGJhckl0ZW1zW118V2lkZ2V0W11cbiAgICAvKipcbiAgICAgKiBBIENvbmZpZyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgW1Rvb2xiYXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sYmFyKSxcbiAgICAgKiBvciBhcnJheSBvZiBjb25maWcgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkIGl0ZW1zIG9mIGEgVG9vbGJhci5cbiAgICAgKiBUaGlzIGNyZWF0ZXMgYSB0b29sYmFyIGRvY2tlZCB0byB0aGUgdG9wIG9mIHRoZSBwYW5lbCBpbW1lZGlhdGVseSBiZWxvdyB0aGUgaGVhZGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy10YmFyKVxuICAgICAqL1xuICAgIHRiYXIgPyA6IChDb250YWluZXJJdGVtQ29uZmlnfHN0cmluZylbXXxUb29sYmFyQ29uZmlnfFBhZ2luZ1Rvb2xiYXJDb25maWd8bnVsbFxuICAgIC8qKlxuICAgICAqIEEgdGl0bGUgdG8gZGlzcGxheSBpbiB0aGUgaGVhZGVyIG9yIG93bmluZyBUYWJQYW5lbC4gQ2F1c2VzIGNyZWF0aW9uIGFuZCBkb2NraW5nIG9mIGEgaGVhZGVyXG4gICAgICogdG8gdGhlIHRvcCBpZiBubyBoZWFkZXIgaXMgY29uZmlndXJlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNjb25maWctdGl0bGUpXG4gICAgICovXG4gICAgdGl0bGUgPyA6IHN0cmluZ1xuICAgIC8qKlxuICAgICAqIFRoZSBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Ub29sKSB0byBhZGQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgYHRpdGxlYCBpbiB0aGUgUGFuZWwgaGVhZGVyLiBFYWNoXG4gICAgICogcHJvcGVydHkgbmFtZSBpcyB0aGUgcmVmZXJlbmNlIGJ5IHdoaWNoIGFuIGluc3RhbnRpYXRlZCB0b29sIG1heSBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbGl2ZVxuICAgICAqIGBbdG9vbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9taXhpbi9Ub29sYWJsZSNwcm9wZXJ0eS10b29scylgIHByb3BlcnR5LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2NvbmZpZy10b29scylcbiAgICAgKi9cbiAgICB0b29scyA/IDogUmVjb3JkPHN0cmluZywgVG9vbENvbmZpZz58bnVsbFxuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZSBVSSB0cmFuc2l0aW9ucyBmb3IgdmFyaW91cyBhY3Rpb25zIGluIHRoZSBncmlkLlxuICAgICAqL1xuICAgIHRyYW5zaXRpb24gPyA6IHtcbiAgICAgICAgaW5zZXJ0UmVjb3JkPzogYm9vbGVhblxuICAgICAgICByZW1vdmVSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgZXhwYW5kQ29sbGFwc2VDb2x1bW4/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZVJlZ2lvbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlVHJlZU5vZGU/OiBib29sZWFuXG4gICAgICAgIHRvZ2dsZUdyb3VwPzogYm9vbGVhblxuICAgICAgICBmaWx0ZXJSZW1vdmFsPzogYm9vbGVhblxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBbmltYXRpb24gdHJhbnNpdGlvbiBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuXG4gICAgICovXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uID8gOiBudW1iZXJcbiAgICAvKipcbiAgICAgKiBDdXN0b20gQ1NTIGNsYXNzIG5hbWUgc3VmZml4ZXMgdG8gYXBwbHkgdG8gdGhlIGVsZW1lbnRzIHJlbmRlcmVkIGJ5IHRoaXMgd2lkZ2V0LiBUaGlzIG1heSBiZSBzcGVjaWZpZWRcbiAgICAgKiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcsIGFuIGFycmF5IG9mIHN0cmluZ3MsIG9yIGFzIGFuIG9iamVjdCBpbiB3aGljaCBwcm9wZXJ0eSBuYW1lcyB3aXRoIHRydXRoeVxuICAgICAqIHZhbHVlcyBhcmUgdXNlZCBhcyB0aGUgY2xhc3MgbmFtZXMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjY29uZmlnLXVpKVxuICAgICAqL1xuICAgIHVpID8gOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0XG4gICAgLyoqXG4gICAgICogQSB3aWRnZXRzIHdlaWdodCBkZXRlcm1pbmVzIGl0cyBwb3NpdGlvbiBhbW9uZyBzaWJsaW5ncyB3aGVuIGFkZGVkIHRvIGEgW0NvbnRhaW5lcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L0NvbnRhaW5lcikuXG4gICAgICogSGlnaGVyIHdlaWdodHMgZ28gZnVydGhlciBkb3duLlxuICAgICAqL1xuICAgIHdlaWdodCA/IDogbnVtYmVyXG4gICAgLyoqXG4gICAgICogV2lkZ2V0J3Mgd2lkdGgsIHVzZWQgdG8gc2V0IGVsZW1lbnQgYHN0eWxlLndpZHRoYC4gRWl0aGVyIHNwZWNpZnkgYSB2YWxpZCB3aWR0aCBzdHJpbmcgb3IgYSBudW1iZXIsIHdoaWNoXG4gICAgICogd2lsbCBnZXQgJ3B4JyBhcHBlbmRlZC4gV2UgcmVjb21tZW5kIHVzaW5nIENTUyBhcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29udHJvbCB3aWR0aCwgYnV0IGluIHNvbWUgY2FzZXNcbiAgICAgKiB0aGlzIGNvbmZpZyBpcyBjb252ZW5pZW50LlxuICAgICAqL1xuICAgIHdpZHRoID8gOiBzdHJpbmd8bnVtYmVyXG5cbiAgICAvLyBGZWF0dXJlc1xuICAgIC8qKlxuICAgICAqIEFJLXBvd2VyZWQgZmlsdGVyIGZlYXR1cmUgZm9yIEdyaWQuIEFsbG93cyB1c2VycyB0byB0eXBlIG5hdHVyYWwgbGFuZ3VhZ2UgcXVlcmllcyB0byBmaWx0ZXIgZ3JpZCBkYXRhLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL2FpL0FJRmlsdGVyKVxuICAgICAqL1xuICAgIGFpRmlsdGVyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEFJRmlsdGVyfEFJRmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHVzaW5nIGBbQ3RybC9DTUQgKyBDXWAsIGBbQ3RybC9DTUQgKyBYXWAgYW5kIGBbQ3RybC9DTUQgKyBWXWAgdG8gY3V0LCBjb3B5IGFuZCBwYXN0ZSBjZWxsIG9yIGNlbGwgcmFuZ2VzLiBBbHNvXG4gICAgICogbWFrZXMgY3V0LCBjb3B5IGFuZCBwYXN0ZSBhY3Rpb25zIGF2YWlsYWJsZSB2aWEgdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxDb3B5UGFzdGUpXG4gICAgICovXG4gICAgY2VsbENvcHlQYXN0ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsQ29weVBhc3RlfENlbGxDb3B5UGFzdGVDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRpbmcgdGhpcyBmZWF0dXJlIHRvIHRoZSBncmlkIGFuZCBvdGhlciBCcnludHVtIHByb2R1Y3RzIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgR3JpZCAoaS5lLiBTY2hlZHVsZXIsIFNjaGVkdWxlclBybywgYW5kIEdhbnR0KVxuICAgICAqIGVuYWJsZXMgY2VsbCBlZGl0aW5nLiBBbnkgc3ViY2xhc3Mgb2YgW0ZpZWxkXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvRmllbGQpIGNhbiBiZSB1c2VkXG4gICAgICogYXMgZWRpdG9yIGZvciB0aGUgW0NvbHVtbl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvY29sdW1uL0NvbHVtbikuIFRoZSBtb3N0IHBvcHVsYXIgYXJlOlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxFZGl0KVxuICAgICAqL1xuICAgIGNlbGxFZGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxFZGl0fENlbGxFZGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogUmlnaHQgY2xpY2sgdG8gZGlzcGxheSBjb250ZXh0IG1lbnUgZm9yIGNlbGxzLiBUbyBpbnZva2UgdGhlIGNlbGwgbWVudSBpbiBhIGtleWJvYXJkLWFjY2Vzc2libGUgbWFubmVyLCB1c2UgdGhlXG4gICAgICogYFNQQUNFYCBrZXkgd2hlbiB0aGUgY2VsbCBpcyBmb2N1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NlbGxNZW51KVxuICAgICAqL1xuICAgIGNlbGxNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxNZW51fENlbGxNZW51Q29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSB0b29sdGlwIHdoZW4gaG92ZXJpbmcgY2VsbHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbFRvb2x0aXApXG4gICAgICovXG4gICAgY2VsbFRvb2x0aXBGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbFRvb2x0aXB8Q2VsbFRvb2x0aXBDb25maWdcbiAgICAvKipcbiAgICAgKiBBZGRzIGludGVyYWN0aXZlIGNoYXJ0aW5nIHRvIGEgR3JpZC4gW0NoYXJ0c10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NoYXJ0L3dpZGdldC9DaGFydCkgY2FuIGJlIGNyZWF0ZWQgZnJvbSBhIHNlbGVjdGlvbiBvZiBHcmlkIGRhdGFcbiAgICAgKiBhbmQgdXBkYXRlZCBpbiByZWFsdGltZSBhcyBkYXRhIGNoYW5nZXMuIFN1cHBvcnRzIG1hbnkgY29tbW9uIGNoYXJ0IHR5cGVzIHdpdGggZXh0ZW5zaXZlIHN0eWxpbmcgYW5kIGN1c3RvbWl6YXRpb25cbiAgICAgKiBvcHRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NoYXJ0cylcbiAgICAgKi9cbiAgICBjaGFydHNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2hhcnRzfENoYXJ0c0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgdGhlIFthdXRvV2lkdGhdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2NvbHVtbi9Db2x1bW4jY29uZmlnLWF1dG9XaWR0aCkgY29uZmlnIGZvciBhIGdyaWQncyBjb2x1bW5zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtbkF1dG9XaWR0aClcbiAgICAgKi9cbiAgICBjb2x1bW5BdXRvV2lkdGhGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uQXV0b1dpZHRofENvbHVtbkF1dG9XaWR0aENvbmZpZ1xuICAgIC8qKlxuICAgICAqIERpc3BsYXlzIGEgdG9vbGJhciB3aGlsZSBkcmFnZ2luZyBjb2x1bW4gaGVhZGVycy4gRHJvcCBvbiBhIGJ1dHRvbiBpbiB0aGUgdG9vbGJhciB0byBhY3RpdmF0ZSBhIGNlcnRhaW4gZnVuY3Rpb24sXG4gICAgICogZm9yIGV4YW1wbGUgdG8gZ3JvdXAgYnkgdGhhdCBjb2x1bW4uIFRoaXMgZmVhdHVyZSBzaW1wbGlmaWVzIGNlcnRhaW4gb3BlcmF0aW9ucyBvbiB0b3VjaCBkZXZpY2VzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtbkRyYWdUb29sYmFyKVxuICAgICAqL1xuICAgIGNvbHVtbkRyYWdUb29sYmFyRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtbkRyYWdUb29sYmFyfENvbHVtbkRyYWdUb29sYmFyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBjb2x1bW4gcGlja2VyICh0byBzaG93L2hpZGUgY29sdW1ucykgaW4gdGhlIGhlYWRlciBjb250ZXh0IG1lbnUuIENvbHVtbnMgY2FuIGJlIGRpc3BsYXllZCBpbiBzdWIgbWVudXNcbiAgICAgKiBieSByZWdpb24gb3IgdGFnLiBHcm91cGVkIGhlYWRlcnMgYXJlIGRpc3BsYXllZCBhcyBtZW51IGhpZXJhcmNoaWVzLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblBpY2tlcilcbiAgICAgKi9cbiAgICBjb2x1bW5QaWNrZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUGlja2VyfENvbHVtblBpY2tlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIHJlbmFtZSBjb2x1bW5zIGJ5IGVpdGhlciByaWdodC1jbGlja2luZyBjb2x1bW4gaGVhZGVyIG9yIHVzaW5nIGtleWJvYXJkIHNob3J0Y3V0cyB3aGVuIGNvbHVtbiBoZWFkZXJcbiAgICAgKiBpcyBmb2N1c2VkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblJlbmFtZSlcbiAgICAgKi9cbiAgICBjb2x1bW5SZW5hbWVGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVuYW1lfENvbHVtblJlbmFtZUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIHJlb3JkZXIgY29sdW1ucyBieSBkcmFnZ2luZyBoZWFkZXJzLiBUbyBnZXQgbm90aWZpZWQgYWJvdXQgY29sdW1uIHJlb3JkZXIgbGlzdGVuIHRvIGBjaGFuZ2VgIGV2ZW50XG4gICAgICogb24gW2NvbHVtbnNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2RhdGEvQ29sdW1uU3RvcmUpIHN0b3JlLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0NvbHVtblJlb3JkZXIpXG4gICAgICovXG4gICAgY29sdW1uUmVvcmRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZW9yZGVyfENvbHVtblJlb3JkZXJDb25maWdcbiAgICAvKipcbiAgICAgKiBFbmFibGVzIHVzZXIgdG8gcmVzaXplIGNvbHVtbnMgYnkgZHJhZ2dpbmcgYSBoYW5kbGUgb24gdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgaGVhZGVyLiBUbyBnZXQgbm90aWZpZWQgYWJvdXQgY29sdW1uXG4gICAgICogcmVzaXplIGxpc3RlbiB0byBgY2hhbmdlYCBldmVudCBvbiBbY29sdW1uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZGF0YS9Db2x1bW5TdG9yZSkgc3RvcmUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ29sdW1uUmVzaXplKVxuICAgICAqL1xuICAgIGNvbHVtblJlc2l6ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDb2x1bW5SZXNpemV8Q29sdW1uUmVzaXplQ29uZmlnXG4gICAgLyoqXG4gICAgICogQSBmZWF0dXJlIHRoYXQgYWxsb3dzIGV4cG9ydGluZyBHcmlkIGRhdGEgdG8gRXhjZWwgb3IgQ1NWIHdpdGhvdXQgaW52b2x2aW5nIHRoZSBzZXJ2ZXIuIEl0IHVzZXNcbiAgICAgKiBbVGFibGVFeHBvcnRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdXRpbC9UYWJsZUV4cG9ydGVyKSBjbGFzcyBhcyBkYXRhIHByb3ZpZGVyLCAzcmQgcGFydHkgcHJvdmlkZXIgdG8gZ2VuZXJhdGUgWExTIGZpbGVzLCBhbmRcbiAgICAgKiBbTWljcm9zb2Z0IFhNTCBzcGVjaWZpY2F0aW9uXShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L29mZmljZS9kb2N1bWVudGZvcm1hdC5vcGVueG1sLnNwcmVhZHNoZWV0LmFzcHgpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL2V4cGVyaW1lbnRhbC9FeGNlbEV4cG9ydGVyKVxuICAgICAqL1xuICAgIGV4Y2VsRXhwb3J0ZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXhjZWxFeHBvcnRlcnxFeGNlbEV4cG9ydGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogQW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgdGhhdCBsZXRzIHVzZXJzIGRyb3AgZmlsZXMgb24gYSBXaWRnZXQuIFRoZSB3aWRnZXQgZmlyZXMgYW4gZXZlbnQgd2hlbiBhIGZpbGUgaXMgZHJvcHBlZCBvbnRvIGl0LlxuICAgICAqIEluIHRoZSBldmVudCwgeW91IGdldCBhY2Nlc3MgdG8gdGhlIHJhdyBmaWxlcyBhcyBzdHJpbmdzLCB0aGF0IHdlcmUgcGFyc2VkIGJ5IGNhbGxpbmcgYHJlYWRBc0JpbmFyeVN0cmluZ2AuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvZXhwZXJpbWVudGFsL0ZpbGVEcm9wKVxuICAgICAqL1xuICAgIGZpbGVEcm9wRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEZpbGVEcm9wfEZpbGVEcm9wQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFkZHMgYSBmaWxsIGhhbmRsZSB0byBhIEdyaWQgcmFuZ2Ugc2VsZWN0aW9uLCB3aGljaCB3aGVuIGRyYWdnZWQsIGZpbGxzIHRoZSBjZWxscyBiZWluZyBkcmFnZ2VkIG92ZXJcbiAgICAgKiB3aXRoIHZhbHVlcyBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIHRoZSBvcmlnaW5hbCBzZWxlY3RlZCByYW5nZS4gVGhpcyBpcyBzaW1pbGFyIHRvIGZ1bmN0aW9uYWxpdHkgbm9ybWFsbHkgc2VlbiBpblxuICAgICAqIHZhcmlvdXMgc3ByZWFkc2hlZXQgYXBwbGljYXRpb25zLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0ZpbGxIYW5kbGUpXG4gICAgICovXG4gICAgZmlsbEhhbmRsZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWxsSGFuZGxlfEZpbGxIYW5kbGVDb25maWdcbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIHRoYXQgYWxsb3dzIGZpbHRlcmluZyBvZiB0aGUgZ3JpZCBieSBzZXR0aW5ncyBmaWx0ZXJzIG9uIGNvbHVtbnMuIFRoZSBhY3R1YWwgZmlsdGVyaW5nIGlzIGRvbmUgYnkgdGhlIHN0b3JlLlxuICAgICAqIEZvciBpbmZvIG9uIHByb2dyYW1tYXRpY2FsbHkgaGFuZGxpbmcgZmlsdGVycywgc2VlIFtTdG9yZUZpbHRlcl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvZGF0YS9taXhpbi9TdG9yZUZpbHRlcikuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvRmlsdGVyKVxuICAgICAqL1xuICAgIGZpbHRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJ8RmlsdGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IGFsbG93cyBmaWx0ZXJpbmcgb2YgdGhlIGdyaWQgYnkgZW50ZXJpbmcgZmlsdGVycyBvbiBjb2x1bW4gaGVhZGVycy5cbiAgICAgKiBUaGUgYWN0dWFsIGZpbHRlcmluZyBpcyBkb25lIGJ5IHRoZSBzdG9yZS5cbiAgICAgKiBGb3IgaW5mbyBvbiBwcm9ncmFtbWF0aWNhbGx5IGhhbmRsaW5nIGZpbHRlcnMsIHNlZSBbU3RvcmVGaWx0ZXJdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL2RhdGEvbWl4aW4vU3RvcmVGaWx0ZXIpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0ZpbHRlckJhcilcbiAgICAgKi9cbiAgICBmaWx0ZXJCYXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RmlsdGVyQmFyfEZpbHRlckJhckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgcmVuZGVyaW5nIGFuZCBoYW5kbGluZyBvZiByb3cgZ3JvdXBzLiBUaGUgYWN0dWFsIGdyb3VwaW5nIGlzIGRvbmUgaW4gdGhlIHN0b3JlLCBidXQgdHJpZ2dlcmVkIGJ5XG4gICAgICogPGtiZD5zaGlmdDwva2JkPiArIGNsaWNraW5nIGhlYWRlcnMsIG9yIGJ5IHVzaW5nIHRoZSBjb250ZXh0IG1lbnUsIG9yIGJ5IHVzaW5nIHR3byBmaW5nZXIgdGFwIChvbmUgb24gaGVhZGVyLFxuICAgICAqIG9uZSBhbnl3aGVyZSBvbiBncmlkKS4gVXNlIDxrYmQ+c2hpZnQ8L2tiZD4gKyA8a2JkPmFsdDwva2JkPiArIGNsaWNrLCBvciB0aGUgY29udGV4dCBtZW51LCB0byByZW1vdmUgYSBjb2x1bW5cbiAgICAgKiBncm91cGVyLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0dyb3VwKVxuICAgICAqL1xuICAgIGdyb3VwRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEdyb3VwfEdyb3VwQ29uZmlnXG4gICAgLyoqXG4gICAgICogRGlzcGxheXMgYSBzdW1tYXJ5IHJvdyBhcyBhIGdyb3VwIGZvb3RlciBpbiBhIGdyb3VwZWQgZ3JpZC4gVXNlcyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gY29sdW1ucyBhc1xuICAgICAqIFtTdW1tYXJ5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1N1bW1hcnkpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0dyb3VwU3VtbWFyeSlcbiAgICAgKi9cbiAgICBncm91cFN1bW1hcnlGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JvdXBTdW1tYXJ5fEdyb3VwU3VtbWFyeUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFJpZ2h0IGNsaWNrIGNvbHVtbiBoZWFkZXIgb3IgZm9jdXMgaXQgYW5kIHByZXNzIFNQQUNFIGtleSB0byBzaG93IHRoZSBjb250ZXh0IG1lbnUgZm9yIGhlYWRlcnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvSGVhZGVyTWVudSlcbiAgICAgKi9cbiAgICBoZWFkZXJNZW51RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfEhlYWRlck1lbnV8SGVhZGVyTWVudUNvbmZpZ1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgcmVjb3JkcyB3aGljaCBzYXRpc2Z5IGEgY2VydGFpbiBjb25kaXRpb24gdG8gYmUgbG9ja2VkIGF0IHRoZSB0b3Agb2YgdGhlIGdyaWQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvTG9ja1Jvd3MpXG4gICAgICovXG4gICAgbG9ja1Jvd3NGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8TG9ja1Jvd3N8TG9ja1Jvd3NDb25maWdcbiAgICAvKipcbiAgICAgKiBUaGlzIGZlYXR1cmUgbWVyZ2VzIGNlbGxzIHRoYXQgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBpbiBzb3J0ZWQgKG9yIFtvcHRpb25hbGx5XShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL01lcmdlQ2VsbHMjY29uZmlnLXNvcnRlZE9ubHkpIGFueSkgY29sdW1uc1xuICAgICAqIGNvbmZpZ3VyZWQgdG8gW21lcmdlQ2VsbHNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2NvbHVtbi9Db2x1bW4jY29uZmlnLW1lcmdlQ2VsbHMpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL01lcmdlQ2VsbHMpXG4gICAgICovXG4gICAgbWVyZ2VDZWxsc0ZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xNZXJnZUNlbGxzfE1lcmdlQ2VsbHNDb25maWdcbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgUERGL1BORyBmaWxlcyBmcm9tIHRoZSBHcmlkIGNvbXBvbmVudC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9leHBvcnQvUGRmRXhwb3J0KVxuICAgICAqL1xuICAgIHBkZkV4cG9ydEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQZGZFeHBvcnR8UGRmRXhwb3J0Q29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHBpbm5pbmcgY29sdW1ucyB0byB0aGUgc3RhcnQgb3IgZW5kIHJlZ2lvbiBvZiB0aGUgZ3JpZCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHN1YkdyaWQgY29uZmlndXJhdGlvbnMuXG4gICAgICogV2hlbiBwaW5uaW5nIHRvIGEgcmVnaW9uIHRoYXQgZG9lcyBub3QgeWV0IGV4aXN0LCB0aGUgZmVhdHVyZSBjcmVhdGVzIHRoZSByZXF1aXJlZCBzdWJHcmlkIG9uIHRoZSBmbHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUGluQ29sdW1ucylcbiAgICAgKi9cbiAgICBwaW5Db2x1bW5zRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFBpbkNvbHVtbnN8UGluQ29sdW1uc0NvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyBwcmludGluZyBHcmlkIGNvbnRlbnRzIHVzaW5nIGJyb3dzZXIgcHJpbnQgZGlhbG9nLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL2V4cG9ydC9QcmludClcbiAgICAgKi9cbiAgICBwcmludEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQcmludHxQcmludENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VhcmNoIGluIGEgY29sdW1uIGJ5IGZvY3VzaW5nIGEgY2VsbCBhbmQgdHlwaW5nLiBOYXZpZ2F0ZSBiZXR3ZWVuIGhpdHMgdXNpbmcgdGhlXG4gICAgICoga2V5Ym9hcmQsIFtmM10gb3IgW2N0cmxdL1tjbWRdICsgW2ddIG1vdmVzIHRvIG5leHQsIGFsc28gcHJlc3NpbmcgW3NoaWZ0XSBtb3ZlcyB0byBwcmV2aW91cy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9RdWlja0ZpbmQpXG4gICAgICovXG4gICAgcXVpY2tGaW5kRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFF1aWNrRmluZHxRdWlja0ZpbmRDb25maWdcbiAgICAvKipcbiAgICAgKiBNYWtlcyB0aGUgc3BsaXR0ZXIgYmV0d2VlbiBncmlkIFtzZWN0aW9uc10oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9TdWJHcmlkKSBkcmFnZ2FibGUsIHRvIGxldCB1c2VycyByZXNpemUsIGFuZFxuICAgICAqIGNvbGxhcHNlL2V4cGFuZCB0aGUgc2VjdGlvbnMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUmVnaW9uUmVzaXplKVxuICAgICAqL1xuICAgIHJlZ2lvblJlc2l6ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSZWdpb25SZXNpemV8UmVnaW9uUmVzaXplQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3cgdXNpbmcgW0N0cmwvQ01EICsgQy9YXSBhbmQgW0N0cmwvQ01EICsgVl0gdG8gY29weS9jdXQtYW5kLXBhc3RlIHJvd3MuIEFsc28gbWFrZXMgY3V0LCBjb3B5IGFuZCBwYXN0ZSBhY3Rpb25zXG4gICAgICogYXZhaWxhYmxlIHZpYSB0aGUgY2VsbCBjb250ZXh0IG1lbnUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93Q29weVBhc3RlKVxuICAgICAqL1xuICAgIHJvd0NvcHlQYXN0ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dDb3B5UGFzdGV8Um93Q29weVBhc3RlQ29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyBlZGl0aW5nIG9mIGVudGlyZSByb3dzIGluIGEgZ3JpZCBpbiBhIGRvY2tlZCBwYW5lbCB3aGljaCBieSBkZWZhdWx0IHNsaWRlcyBvdXQgZnJvbSB0aGUgcmlnaHQuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93RWRpdClcbiAgICAgKi9cbiAgICByb3dFZGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0VkaXR8Um93RWRpdENvbmZpZ1xuICAgIC8qKlxuICAgICAqIEVuYWJsZXMgZXhwYW5kaW5nIG9mIEdyaWQgcm93cyBieSBlaXRoZXIgcm93IGNsaWNrIG9yIGRvdWJsZSBjbGljaywgb3IgYnkgYWRkaW5nIGEgc2VwYXJhdGUgR3JpZCBjb2x1bW4gd2hpY2ggcmVuZGVyc1xuICAgICAqIGEgYnV0dG9uIHRoYXQgZXhwYW5kcyBvciBjb2xsYXBzZXMgdGhlIHJvdy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dFeHBhbmRlcilcbiAgICAgKi9cbiAgICByb3dFeHBhbmRlckZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dFeHBhbmRlcnxSb3dFeHBhbmRlckNvbmZpZ1xuICAgIC8qKlxuICAgICAqIEFsbG93cyB1c2VyIHRvIHJlb3JkZXIgcm93cyBieSBkcmFnZ2luZyB0aGVtLiBUbyBnZXQgbm90aWZpZWQgYWJvdXQgcm93IHJlb3JkZXIgbGlzdGVuIHRvIGBjaGFuZ2VgIGV2ZW50XG4gICAgICogb24gdGhlIGdyaWQgW3N0b3JlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9kYXRhL1N0b3JlKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Sb3dSZW9yZGVyKVxuICAgICAqL1xuICAgIHJvd1Jlb3JkZXJGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Um93UmVvcmRlcnxSb3dSZW9yZGVyQ29uZmlnXG4gICAgLyoqXG4gICAgICogRW5hYmxlcyB1c2VyIHRvIGNoYW5nZSByb3cgaGVpZ2h0IGJ5IGRyYWdnaW5nIHRoZSBib3R0b20gcm93IGJvcmRlci4gQWZ0ZXIgYSByZXNpemUgb3BlcmF0aW9uLCB0aGUgW3Jvd0hlaWdodF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZGF0YS9HcmlkUm93TW9kZWwjZmllbGQtcm93SGVpZ2h0KVxuICAgICAqIGZpZWxkIG9mIHRoZSByZWNvcmQgaXMgdXBkYXRlZCAod2hlbiBbYXBwbHlUb0FsbFJvd3NdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93UmVzaXplI2NvbmZpZy1hcHBseVRvQWxsUm93cykgaXMgYGZhbHNlYCkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvUm93UmVzaXplKVxuICAgICAqL1xuICAgIHJvd1Jlc2l6ZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dSZXNpemV8Um93UmVzaXplQ29uZmlnXG4gICAgLyoqXG4gICAgICogPGRpdiBjbGFzcz1cImV4dGVybmFsLWV4YW1wbGUgdmVydGljYWxcIiBkYXRhLWZpbGU9XCJHcmlkL2ZlYXR1cmUvU2VhcmNoLmpzXCI+PC9kaXY+XG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU2VhcmNoKVxuICAgICAqL1xuICAgIHNlYXJjaEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTZWFyY2h8U2VhcmNoQ29uZmlnXG4gICAgLyoqXG4gICAgICogQWxsb3dzIHNvcnRpbmcgb2YgZ3JpZCBieSBjbGlja2luZyAob3IgdGFwcGluZykgaGVhZGVycywgYWxzbyBkaXNwbGF5cyB3aGljaCBjb2x1bW5zIGdyaWQgaXMgc29ydGVkIGJ5IChudW1iZXJlZCBpZlxuICAgICAqIHVzaW5nIG11bHRpc29ydCkuIFVzZSBtb2RpZmllciBrZXlzIGZvciBtdWx0aXNvcnRpbmc6IFtDdHJsL0NNRCArIGNsaWNrXSB0byBhZGQgc29ydGVyLCBbQ3RybC9DTUQgKyBBbHQgKyBjbGlja10gdG8gcmVtb3ZlIHNvcnRlci5cbiAgICAgKiBUaGUgYWN0dWFsIHNvcnRpbmcgaXMgZG9uZSBieSB0aGUgc3RvcmUsIHNlZSBbU3RvcmUuc29ydCgpXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS9kYXRhL21peGluL1N0b3JlU29ydCNmdW5jdGlvbi1zb3J0KS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9Tb3J0KVxuICAgICAqL1xuICAgIHNvcnRGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U29ydHxTb3J0Q29uZmlnXG4gICAgLyoqXG4gICAgICogVGhpcyBmZWF0dXJlIGFsbG93cyBzcGxpdHRpbmcgdGhlIEdyaWQgaW50byBtdWx0aXBsZSB2aWV3cywgZWl0aGVyIGJ5IHVzaW5nIHRoZSBjZWxsIGNvbnRleHQgbWVudSwgb3JcbiAgICAgKiBwcm9ncmFtbWF0aWNhbGx5IGJ5IGNhbGxpbmcgW3NwbGl0KCldKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3BsaXQjZnVuY3Rpb24tc3BsaXQpLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1NwbGl0KVxuICAgICAqL1xuICAgIHNwbGl0RmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNwbGl0fFNwbGl0Q29uZmlnXG4gICAgLyoqXG4gICAgICogQSBmZWF0dXJlIHdoaWNoIHBpbnMgY29uZmlndXJhYmxlIGNvbnRlbnQgZnJvbSBhIGdyaWQgcm93IHRvIHRoZSB0b3Agb2YgdGhlIGdyaWRcbiAgICAgKiB3aGlsZSB0aGUgcm93IHNjcm9sbHMgb2ZmIHRoZSB0b3AgYnV0IGlzIHN0aWxsIHZpc2libGUuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvU3RpY2t5Q2VsbHMpXG4gICAgICovXG4gICAgc3RpY2t5Q2VsbHNGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3RpY2t5Q2VsbHN8U3RpY2t5Q2VsbHNDb25maWdcbiAgICAvKipcbiAgICAgKiBTdHJpcGVzIHJvd3MgYnkgYWRkaW5nIGFsdGVybmF0aW5nIENTUyBjbGFzc2VzIHRvIGFsbCByb3cgZWxlbWVudHMgKGBiLWV2ZW5gIGFuZCBgYi1vZGRgKS5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TdHJpcGUpXG4gICAgICovXG4gICAgc3RyaXBlRmVhdHVyZSA/IDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN0cmlwZXxTdHJpcGVDb25maWdcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5cyBhIHN1bW1hcnkgcm93IGluIHRoZSBncmlkIGZvb3Rlci5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvZmVhdHVyZS9TdW1tYXJ5KVxuICAgICAqL1xuICAgIHN1bW1hcnlGZWF0dXJlID8gOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3VtbWFyeXxTdW1tYXJ5Q29uZmlnXG4gICAgLyoqXG4gICAgICogRmVhdHVyZSB0aGF0IG1ha2VzIHRoZSBncmlkIHdvcmsgbW9yZSBsaWtlIGEgdHJlZS4gSW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBbVHJlZUdyaWRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvVHJlZUdyaWQpLiBSZXF1aXJlc1xuICAgICAqIGV4YWN0bHkgb25lIFtUcmVlQ29sdW1uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9jb2x1bW4vVHJlZUNvbHVtbikgYW1vbmcgZ3JpZHMgY29sdW1ucy4gVGhhdCBjb2x1bW4gd2lsbCBoYXZlIGl0cyByZW5kZXJlciByZXBsYWNlZCB3aXRoIGFcbiAgICAgKiB0cmVlIHJlbmRlcmVyIHRoYXQgYWRkcyBwYWRkaW5nIGFuZCBpY29uIHRvIGdpdmUgdGhlIGFwcGVhcmFuY2Ugb2YgYSB0cmVlLiBUaGUgb3JpZ2luYWwgcmVuZGVyZXIgaXMgcHJlc2VydmVkIGFuZFxuICAgICAqIGFsc28gY2FsbGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL1RyZWUpXG4gICAgICovXG4gICAgdHJlZUZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlfFRyZWVDb25maWdcbiAgICAvKipcbiAgICAgKiBBIGZlYXR1cmUgdGhhdCBhbGxvd3MgdHJhbnNmb3JtaW5nIGEgZmxhdCBkYXRhc2V0IChvciB0aGUgbGVhdmVzIG9mIGEgaGllcmFyY2hpY2FsKSBpbnRvIGEgdHJlZSBieSBzcGVjaWZ5aW5nIGFcbiAgICAgKiByZWNvcmQgZmllbGQgcGVyIHBhcmVudCBsZXZlbC4gUGFyZW50cyBhcmUgZ2VuZXJhdGVkIGJhc2VkIG9uIGVhY2ggbGVhZidzIHZhbHVlIGZvciB0aG9zZSBmaWVsZHMuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvVHJlZUdyb3VwKVxuICAgICAqL1xuICAgIHRyZWVHcm91cEZlYXR1cmUgPyA6IG9iamVjdHxib29sZWFufHN0cmluZ3xUcmVlR3JvdXB8VHJlZUdyb3VwQ29uZmlnXG5cbn1cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3IgOiAnYnJ5bnR1bS1ncmlkLWJhc2UnLFxuICAgIHRlbXBsYXRlIDogJydcbn0pXG5leHBvcnQgY2xhc3MgQnJ5bnR1bUdyaWRCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHVibGljIHN0YXRpYyBpbnN0YW5jZUNsYXNzID0gR3JpZEJhc2U7XG5cbiAgICBwdWJsaWMgc3RhdGljIGluc3RhbmNlTmFtZSA9ICdHcmlkQmFzZSc7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRXZlbnRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ29uQmVmb3JlQ2FuY2VsQ2VsbEVkaXQnLFxuICAgICAgICAnb25CZWZvcmVDYW5jZWxSb3dFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlQ2VsbEVkaXRTdGFydCcsXG4gICAgICAgICdvbkJlZm9yZUNlbGxSYW5nZURlbGV0ZScsXG4gICAgICAgICdvbkJlZm9yZUNlbGxSYW5nZUVkaXQnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5EcmFnU3RhcnQnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5Ecm9wRmluYWxpemUnLFxuICAgICAgICAnb25CZWZvcmVDb2x1bW5SZXNpemUnLFxuICAgICAgICAnb25CZWZvcmVDb3B5JyxcbiAgICAgICAgJ29uQmVmb3JlQ1NWRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRGVzdHJveScsXG4gICAgICAgICdvbkJlZm9yZUV4Y2VsRXhwb3J0JyxcbiAgICAgICAgJ29uQmVmb3JlRmlsbEhhbmRsZURyYWdTdGFydCcsXG4gICAgICAgICdvbkJlZm9yZUZpbmlzaENlbGxFZGl0JyxcbiAgICAgICAgJ29uQmVmb3JlRmluaXNoUm93RWRpdCcsXG4gICAgICAgICdvbkJlZm9yZUhpZGUnLFxuICAgICAgICAnb25CZWZvcmVQYXN0ZScsXG4gICAgICAgICdvbkJlZm9yZVBkZkV4cG9ydCcsXG4gICAgICAgICdvbkJlZm9yZVJlbmRlclJvdycsXG4gICAgICAgICdvbkJlZm9yZVJlbmRlclJvd3MnLFxuICAgICAgICAnb25CZWZvcmVSb3dDb2xsYXBzZScsXG4gICAgICAgICdvbkJlZm9yZVJvd0V4cGFuZCcsXG4gICAgICAgICdvbkJlZm9yZVNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAgICdvbkJlZm9yZVNldFJlY29yZCcsXG4gICAgICAgICdvbkJlZm9yZVNob3cnLFxuICAgICAgICAnb25CZWZvcmVTdGFydFJvd0VkaXQnLFxuICAgICAgICAnb25CZWZvcmVTdGF0ZUFwcGx5JyxcbiAgICAgICAgJ29uQmVmb3JlU3RhdGVTYXZlJyxcbiAgICAgICAgJ29uQmVmb3JlVG9nZ2xlR3JvdXAnLFxuICAgICAgICAnb25CZWZvcmVUb2dnbGVOb2RlJyxcbiAgICAgICAgJ29uQ2FuY2VsQ2VsbEVkaXQnLFxuICAgICAgICAnb25DYXRjaEFsbCcsXG4gICAgICAgICdvbkNlbGxDbGljaycsXG4gICAgICAgICdvbkNlbGxDb250ZXh0TWVudScsXG4gICAgICAgICdvbkNlbGxEYmxDbGljaycsXG4gICAgICAgICdvbkNlbGxNZW51QmVmb3JlU2hvdycsXG4gICAgICAgICdvbkNlbGxNZW51SXRlbScsXG4gICAgICAgICdvbkNlbGxNZW51U2hvdycsXG4gICAgICAgICdvbkNlbGxNZW51VG9nZ2xlSXRlbScsXG4gICAgICAgICdvbkNlbGxNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uQ2VsbE1vdXNlTGVhdmUnLFxuICAgICAgICAnb25DZWxsTW91c2VPdXQnLFxuICAgICAgICAnb25DZWxsTW91c2VPdmVyJyxcbiAgICAgICAgJ29uQ29sbGFwc2UnLFxuICAgICAgICAnb25Db2xsYXBzZU5vZGUnLFxuICAgICAgICAnb25Db2x1bW5EcmFnJyxcbiAgICAgICAgJ29uQ29sdW1uRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uQ29sdW1uRHJvcCcsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZScsXG4gICAgICAgICdvbkNvbHVtblJlc2l6ZVN0YXJ0JyxcbiAgICAgICAgJ29uQ29udGV4dE1lbnVJdGVtJyxcbiAgICAgICAgJ29uQ29udGV4dE1lbnVUb2dnbGVJdGVtJyxcbiAgICAgICAgJ29uQ29weScsXG4gICAgICAgICdvbkRhdGFDaGFuZ2UnLFxuICAgICAgICAnb25EZXN0cm95JyxcbiAgICAgICAgJ29uRGlydHlTdGF0ZUNoYW5nZScsXG4gICAgICAgICdvbkRyYWdTZWxlY3RpbmcnLFxuICAgICAgICAnb25FbGVtZW50Q3JlYXRlZCcsXG4gICAgICAgICdvbkV4cGFuZCcsXG4gICAgICAgICdvbkV4cGFuZE5vZGUnLFxuICAgICAgICAnb25GaWxlRHJvcCcsXG4gICAgICAgICdvbkZpbGxIYW5kbGVCZWZvcmVEcmFnRmluYWxpemUnLFxuICAgICAgICAnb25GaWxsSGFuZGxlRHJhZycsXG4gICAgICAgICdvbkZpbGxIYW5kbGVEcmFnQWJvcnQnLFxuICAgICAgICAnb25GaWxsSGFuZGxlRHJhZ0VuZCcsXG4gICAgICAgICdvbkZpbGxIYW5kbGVEcmFnU3RhcnQnLFxuICAgICAgICAnb25GaW5pc2hDZWxsRWRpdCcsXG4gICAgICAgICdvbkZpbmlzaFJvd0VkaXQnLFxuICAgICAgICAnb25Gb2N1c0luJyxcbiAgICAgICAgJ29uRm9jdXNPdXQnLFxuICAgICAgICAnb25HcmlkUm93QmVmb3JlRHJhZ1N0YXJ0JyxcbiAgICAgICAgJ29uR3JpZFJvd0JlZm9yZURyb3BGaW5hbGl6ZScsXG4gICAgICAgICdvbkdyaWRSb3dEcmFnJyxcbiAgICAgICAgJ29uR3JpZFJvd0RyYWdBYm9ydCcsXG4gICAgICAgICdvbkdyaWRSb3dEcmFnU3RhcnQnLFxuICAgICAgICAnb25HcmlkUm93RHJvcCcsXG4gICAgICAgICdvbkhlYWRlckNsaWNrJyxcbiAgICAgICAgJ29uSGVhZGVyTWVudUJlZm9yZVNob3cnLFxuICAgICAgICAnb25IZWFkZXJNZW51SXRlbScsXG4gICAgICAgICdvbkhlYWRlck1lbnVTaG93JyxcbiAgICAgICAgJ29uSGVhZGVyTWVudVRvZ2dsZUl0ZW0nLFxuICAgICAgICAnb25IaWRlJyxcbiAgICAgICAgJ29uTG9ja1Jvd3MnLFxuICAgICAgICAnb25Nb3VzZU91dCcsXG4gICAgICAgICdvbk1vdXNlT3ZlcicsXG4gICAgICAgICdvblBhaW50JyxcbiAgICAgICAgJ29uUGFzdGUnLFxuICAgICAgICAnb25QZGZFeHBvcnQnLFxuICAgICAgICAnb25SZWFkT25seScsXG4gICAgICAgICdvblJlY29tcG9zZScsXG4gICAgICAgICdvblJlbmRlclJvdycsXG4gICAgICAgICdvblJlbmRlclJvd3MnLFxuICAgICAgICAnb25SZXNpemUnLFxuICAgICAgICAnb25SZXNwb25zaXZlJyxcbiAgICAgICAgJ29uUm93Q29sbGFwc2UnLFxuICAgICAgICAnb25Sb3dFeHBhbmQnLFxuICAgICAgICAnb25Sb3dNb3VzZUVudGVyJyxcbiAgICAgICAgJ29uUm93TW91c2VMZWF2ZScsXG4gICAgICAgICdvblNjcm9sbCcsXG4gICAgICAgICdvblNlbGVjdGlvbkNoYW5nZScsXG4gICAgICAgICdvblNlbGVjdGlvbk1vZGVDaGFuZ2UnLFxuICAgICAgICAnb25TaG93JyxcbiAgICAgICAgJ29uU3BsaXQnLFxuICAgICAgICAnb25TcGxpdHRlckNvbGxhcHNlQ2xpY2snLFxuICAgICAgICAnb25TcGxpdHRlckRyYWdFbmQnLFxuICAgICAgICAnb25TcGxpdHRlckRyYWdTdGFydCcsXG4gICAgICAgICdvblNwbGl0dGVyRXhwYW5kQ2xpY2snLFxuICAgICAgICAnb25TdGFydENlbGxFZGl0JyxcbiAgICAgICAgJ29uU3RhcnRSb3dFZGl0JyxcbiAgICAgICAgJ29uU3ViR3JpZENvbGxhcHNlJyxcbiAgICAgICAgJ29uU3ViR3JpZEV4cGFuZCcsXG4gICAgICAgICdvblRvZ2dsZUdyb3VwJyxcbiAgICAgICAgJ29uVG9nZ2xlTm9kZScsXG4gICAgICAgICdvblRvb2xDbGljaycsXG4gICAgICAgICdvblVubG9ja1Jvd3MnLFxuICAgICAgICAnb25VbnNwbGl0J1xuICAgIF07XG5cbiAgICBwcml2YXRlIHN0YXRpYyBicnludHVtRmVhdHVyZU5hbWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FpRmlsdGVyRmVhdHVyZScsXG4gICAgICAgICdjZWxsQ29weVBhc3RlRmVhdHVyZScsXG4gICAgICAgICdjZWxsRWRpdEZlYXR1cmUnLFxuICAgICAgICAnY2VsbE1lbnVGZWF0dXJlJyxcbiAgICAgICAgJ2NlbGxUb29sdGlwRmVhdHVyZScsXG4gICAgICAgICdjaGFydHNGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtbkF1dG9XaWR0aEZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uRHJhZ1Rvb2xiYXJGZWF0dXJlJyxcbiAgICAgICAgJ2NvbHVtblBpY2tlckZlYXR1cmUnLFxuICAgICAgICAnY29sdW1uUmVuYW1lRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZW9yZGVyRmVhdHVyZScsXG4gICAgICAgICdjb2x1bW5SZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ2V4Y2VsRXhwb3J0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbGVEcm9wRmVhdHVyZScsXG4gICAgICAgICdmaWxsSGFuZGxlRmVhdHVyZScsXG4gICAgICAgICdmaWx0ZXJGZWF0dXJlJyxcbiAgICAgICAgJ2ZpbHRlckJhckZlYXR1cmUnLFxuICAgICAgICAnZ3JvdXBGZWF0dXJlJyxcbiAgICAgICAgJ2dyb3VwU3VtbWFyeUZlYXR1cmUnLFxuICAgICAgICAnaGVhZGVyTWVudUZlYXR1cmUnLFxuICAgICAgICAnbG9ja1Jvd3NGZWF0dXJlJyxcbiAgICAgICAgJ21lcmdlQ2VsbHNGZWF0dXJlJyxcbiAgICAgICAgJ3BkZkV4cG9ydEZlYXR1cmUnLFxuICAgICAgICAncGluQ29sdW1uc0ZlYXR1cmUnLFxuICAgICAgICAncHJpbnRGZWF0dXJlJyxcbiAgICAgICAgJ3F1aWNrRmluZEZlYXR1cmUnLFxuICAgICAgICAncmVnaW9uUmVzaXplRmVhdHVyZScsXG4gICAgICAgICdyb3dDb3B5UGFzdGVGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd0VkaXRGZWF0dXJlJyxcbiAgICAgICAgJ3Jvd0V4cGFuZGVyRmVhdHVyZScsXG4gICAgICAgICdyb3dSZW9yZGVyRmVhdHVyZScsXG4gICAgICAgICdyb3dSZXNpemVGZWF0dXJlJyxcbiAgICAgICAgJ3NlYXJjaEZlYXR1cmUnLFxuICAgICAgICAnc29ydEZlYXR1cmUnLFxuICAgICAgICAnc3BsaXRGZWF0dXJlJyxcbiAgICAgICAgJ3N0aWNreUNlbGxzRmVhdHVyZScsXG4gICAgICAgICdzdHJpcGVGZWF0dXJlJyxcbiAgICAgICAgJ3N1bW1hcnlGZWF0dXJlJyxcbiAgICAgICAgJ3RyZWVGZWF0dXJlJyxcbiAgICAgICAgJ3RyZWVHcm91cEZlYXR1cmUnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Db25maWdzOiBzdHJpbmdbXSA9IEJyeW50dW1HcmlkQmFzZUNvbXBvbmVudC5icnludHVtRmVhdHVyZU5hbWVzLmNvbmNhdChbXG4gICAgICAgICdhZG9wdCcsXG4gICAgICAgICdhbGlnblNlbGYnLFxuICAgICAgICAnYW5pbWF0ZUZpbHRlclJlbW92YWxzJyxcbiAgICAgICAgJ2FuaW1hdGVSZW1vdmluZ1Jvd3MnLFxuICAgICAgICAnYW5pbWF0ZVRyZWVOb2RlVG9nZ2xlJyxcbiAgICAgICAgJ2FwcGVuZFRvJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXV0b0hlaWdodCcsXG4gICAgICAgICdiYmFyJyxcbiAgICAgICAgJ2JvZHlDbHMnLFxuICAgICAgICAnYnViYmxlRXZlbnRzJyxcbiAgICAgICAgJ2NhbGxPbkZ1bmN0aW9ucycsXG4gICAgICAgICdjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMnLFxuICAgICAgICAnY2VsbEVsbGlwc2lzJyxcbiAgICAgICAgJ2NscycsXG4gICAgICAgICdjb2xsYXBzZWQnLFxuICAgICAgICAnY29sbGFwc2libGUnLFxuICAgICAgICAnY29sb3InLFxuICAgICAgICAnY29sdW1uJyxcbiAgICAgICAgJ2NvbHVtbkxpbmVzJyxcbiAgICAgICAgJ2NvbHVtbnMnLFxuICAgICAgICAnY29uZmlnJyxcbiAgICAgICAgJ2NvbnRlbnRFbGVtZW50Q2xzJyxcbiAgICAgICAgJ2NvbnRleHRNZW51VHJpZ2dlckV2ZW50JyxcbiAgICAgICAgJ2RhdGEnLFxuICAgICAgICAnZGF0YUZpZWxkJyxcbiAgICAgICAgJ2RhdGFzZXQnLFxuICAgICAgICAnZGVmYXVsdFJlZ2lvbicsXG4gICAgICAgICdkZXN0cm95U3RvcmUnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdkaXNhYmxlR3JpZENvbHVtbklkV2FybmluZycsXG4gICAgICAgICdkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZycsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYXdlcicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAnZW5hYmxlU3RpY2t5JyxcbiAgICAgICAgJ2VuYWJsZVRleHRTZWxlY3Rpb24nLFxuICAgICAgICAnZW5hYmxlVW5kb1JlZG9LZXlzJyxcbiAgICAgICAgJ2V4dHJhRGF0YScsXG4gICAgICAgICdmaWxsTGFzdENvbHVtbicsXG4gICAgICAgICdmaXhlZFJvd0hlaWdodCcsXG4gICAgICAgICdmbGV4JyxcbiAgICAgICAgJ2Zvb3RlcicsXG4gICAgICAgICdmb3JtdWxhUHJvdmlkZXJzJyxcbiAgICAgICAgJ2Z1bGxSb3dSZWZyZXNoJyxcbiAgICAgICAgJ2dldFJvd0hlaWdodCcsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnaGVpZ2h0JyxcbiAgICAgICAgJ2hpZGRlbicsXG4gICAgICAgICdoaWRlRm9vdGVycycsXG4gICAgICAgICdoaWRlSGVhZGVycycsXG4gICAgICAgICdoaWRlSG9yaXpvbnRhbFNjcm9sbGJhcicsXG4gICAgICAgICdob3ZlckNscycsXG4gICAgICAgICdpY29uJyxcbiAgICAgICAgJ2lkJyxcbiAgICAgICAgJ2lnbm9yZVBhcmVudFJlYWRPbmx5JyxcbiAgICAgICAgJ2lucHV0RmllbGRBbGlnbicsXG4gICAgICAgICdpbnNlcnRCZWZvcmUnLFxuICAgICAgICAnaW5zZXJ0Rmlyc3QnLFxuICAgICAgICAna2V5TWFwJyxcbiAgICAgICAgJ2xhYmVsUG9zaXRpb24nLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdsb25nUHJlc3NUaW1lJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21heEhlaWdodCcsXG4gICAgICAgICdtYXhXaWR0aCcsXG4gICAgICAgICdtaW5IZWlnaHQnLFxuICAgICAgICAnbWluV2lkdGgnLFxuICAgICAgICAnbW9uaXRvclJlc2l6ZScsXG4gICAgICAgICdvd25lcicsXG4gICAgICAgICdwbHVnaW5zJyxcbiAgICAgICAgJ3ByZXNlcnZlRm9jdXNPbkRhdGFzZXRDaGFuZ2UnLFxuICAgICAgICAncHJlc2VydmVTY3JvbGwnLFxuICAgICAgICAncHJlc2VydmVTY3JvbGxPbkRhdGFzZXRDaGFuZ2UnLFxuICAgICAgICAncHJldmVudFRvb2x0aXBPblRvdWNoJyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbGF5U3RvcmVFdmVudHMnLFxuICAgICAgICAncmVuZGl0aW9uJyxcbiAgICAgICAgJ3Jlc2l6YWJsZScsXG4gICAgICAgICdyZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVMZXZlbHMnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Jvd0hlaWdodCcsXG4gICAgICAgICdyb3dMaW5lcycsXG4gICAgICAgICdydGwnLFxuICAgICAgICAnc2Nyb2xsYWJsZScsXG4gICAgICAgICdzY3JvbGxlckNsYXNzJyxcbiAgICAgICAgJ3Njcm9sbE1hbmFnZXInLFxuICAgICAgICAnc2VsZWN0aW9uTW9kZScsXG4gICAgICAgICdzaG93RGlydHknLFxuICAgICAgICAnc3BhbicsXG4gICAgICAgICdzdGF0ZWZ1bCcsXG4gICAgICAgICdzdGF0ZWZ1bEV2ZW50cycsXG4gICAgICAgICdzdGF0ZUlkJyxcbiAgICAgICAgJ3N0YXRlUHJvdmlkZXInLFxuICAgICAgICAnc3RhdGVTZXR0aW5ncycsXG4gICAgICAgICdzdG9yZScsXG4gICAgICAgICdzdHJpcHMnLFxuICAgICAgICAnc3ViR3JpZENvbmZpZ3MnLFxuICAgICAgICAnc3luY01hc2snLFxuICAgICAgICAndGFiJyxcbiAgICAgICAgJ3RhYkJhckl0ZW1zJyxcbiAgICAgICAgJ3RiYXInLFxuICAgICAgICAndGl0bGUnLFxuICAgICAgICAndG9vbHMnLFxuICAgICAgICAndHJhbnNpdGlvbicsXG4gICAgICAgICd0cmFuc2l0aW9uRHVyYXRpb24nLFxuICAgICAgICAndWknLFxuICAgICAgICAnd2VpZ2h0JyxcbiAgICAgICAgJ3dpZHRoJ1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYnJ5bnR1bUNvbmZpZ3NPbmx5OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgJ2FuaW1hdGVGaWx0ZXJSZW1vdmFscycsXG4gICAgICAgICdhbmltYXRlUmVtb3ZpbmdSb3dzJyxcbiAgICAgICAgJ2FyaWFEZXNjcmlwdGlvbicsXG4gICAgICAgICdhcmlhTGFiZWwnLFxuICAgICAgICAnYXV0b0hlaWdodCcsXG4gICAgICAgICdiYmFyJyxcbiAgICAgICAgJ2JvZHlDbHMnLFxuICAgICAgICAnYnViYmxlRXZlbnRzJyxcbiAgICAgICAgJ2NvbGxhcHNpYmxlJyxcbiAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgJ2NvbmZpZycsXG4gICAgICAgICdjb250ZW50RWxlbWVudENscycsXG4gICAgICAgICdjb250ZXh0TWVudVRyaWdnZXJFdmVudCcsXG4gICAgICAgICdkYXRhRmllbGQnLFxuICAgICAgICAnZGVmYXVsdFJlZ2lvbicsXG4gICAgICAgICdkZXN0cm95U3RvcmUnLFxuICAgICAgICAnZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcycsXG4gICAgICAgICdkaXNhYmxlR3JpZENvbHVtbklkV2FybmluZycsXG4gICAgICAgICdkaXNhYmxlR3JpZFJvd01vZGVsV2FybmluZycsXG4gICAgICAgICdkb2NrJyxcbiAgICAgICAgJ2RyYXdlcicsXG4gICAgICAgICdlbGVtZW50QXR0cmlidXRlcycsXG4gICAgICAgICdlbmFibGVTdGlja3knLFxuICAgICAgICAnZW5hYmxlVGV4dFNlbGVjdGlvbicsXG4gICAgICAgICdmaWxsTGFzdENvbHVtbicsXG4gICAgICAgICdmaXhlZFJvd0hlaWdodCcsXG4gICAgICAgICdmb290ZXInLFxuICAgICAgICAnZm9ybXVsYVByb3ZpZGVycycsXG4gICAgICAgICdmdWxsUm93UmVmcmVzaCcsXG4gICAgICAgICdnZXRSb3dIZWlnaHQnLFxuICAgICAgICAnaGVhZGVyJyxcbiAgICAgICAgJ2hpZGVIb3Jpem9udGFsU2Nyb2xsYmFyJyxcbiAgICAgICAgJ2hvdmVyQ2xzJyxcbiAgICAgICAgJ2ljb24nLFxuICAgICAgICAnaWdub3JlUGFyZW50UmVhZE9ubHknLFxuICAgICAgICAnbGlzdGVuZXJzJyxcbiAgICAgICAgJ2xvYWRNYXNrJyxcbiAgICAgICAgJ2xvYWRNYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbG9hZE1hc2tFcnJvcicsXG4gICAgICAgICdsb2NhbGl6YWJsZScsXG4gICAgICAgICdtYXNrRGVmYXVsdHMnLFxuICAgICAgICAnbWFza2VkJyxcbiAgICAgICAgJ21vbml0b3JSZXNpemUnLFxuICAgICAgICAnb3duZXInLFxuICAgICAgICAncGx1Z2lucycsXG4gICAgICAgICdwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ3ByZXNlcnZlU2Nyb2xsT25EYXRhc2V0Q2hhbmdlJyxcbiAgICAgICAgJ3ByZXZlbnRUb29sdGlwT25Ub3VjaCcsXG4gICAgICAgICdyZWxheVN0b3JlRXZlbnRzJyxcbiAgICAgICAgJ3Jlc2l6YWJsZScsXG4gICAgICAgICdyZXNpemVUb0ZpdEluY2x1ZGVzSGVhZGVyJyxcbiAgICAgICAgJ3Jlc3BvbnNpdmVMZXZlbHMnLFxuICAgICAgICAncmlwcGxlJyxcbiAgICAgICAgJ3Jvb3RFbGVtZW50JyxcbiAgICAgICAgJ3Njcm9sbGVyQ2xhc3MnLFxuICAgICAgICAnc2Nyb2xsTWFuYWdlcicsXG4gICAgICAgICdzaG93RGlydHknLFxuICAgICAgICAnc3RhdGVmdWwnLFxuICAgICAgICAnc3RhdGVmdWxFdmVudHMnLFxuICAgICAgICAnc3RhdGVJZCcsXG4gICAgICAgICdzdGF0ZVByb3ZpZGVyJyxcbiAgICAgICAgJ3N0cmlwcycsXG4gICAgICAgICdzdWJHcmlkQ29uZmlncycsXG4gICAgICAgICdzeW5jTWFzaycsXG4gICAgICAgICd0YWInLFxuICAgICAgICAndGFiQmFySXRlbXMnLFxuICAgICAgICAndGJhcicsXG4gICAgICAgICd1aScsXG4gICAgICAgICd3ZWlnaHQnXG4gICAgXTtcblxuICAgIHByaXZhdGUgc3RhdGljIGJyeW50dW1Qcm9wczogc3RyaW5nW10gPSBCcnludHVtR3JpZEJhc2VDb21wb25lbnQuYnJ5bnR1bUZlYXR1cmVOYW1lcy5jb25jYXQoW1xuICAgICAgICAnYWxpZ25TZWxmJyxcbiAgICAgICAgJ2FuaW1hdGVUcmVlTm9kZVRvZ2dsZScsXG4gICAgICAgICdhcHBlbmRUbycsXG4gICAgICAgICdjYWxsT25GdW5jdGlvbnMnLFxuICAgICAgICAnY2F0Y2hFdmVudEhhbmRsZXJFeGNlcHRpb25zJyxcbiAgICAgICAgJ2NlbGxFbGxpcHNpcycsXG4gICAgICAgICdjbHMnLFxuICAgICAgICAnY29sbGFwc2VkJyxcbiAgICAgICAgJ2NvbHVtbicsXG4gICAgICAgICdjb2x1bW5MaW5lcycsXG4gICAgICAgICdjb2x1bW5zJyxcbiAgICAgICAgJ2RhdGEnLFxuICAgICAgICAnZGF0YXNldCcsXG4gICAgICAgICdkaXNhYmxlZCcsXG4gICAgICAgICdlbXB0eVRleHQnLFxuICAgICAgICAnZW5hYmxlVW5kb1JlZG9LZXlzJyxcbiAgICAgICAgJ2V4dHJhRGF0YScsXG4gICAgICAgICdmbGV4JyxcbiAgICAgICAgJ2ZvY3VzVmlzaWJsZScsXG4gICAgICAgICdoYXNDaGFuZ2VzJyxcbiAgICAgICAgJ2hlaWdodCcsXG4gICAgICAgICdoaWRkZW4nLFxuICAgICAgICAnaGlkZUZvb3RlcnMnLFxuICAgICAgICAnaGlkZUhlYWRlcnMnLFxuICAgICAgICAnaWQnLFxuICAgICAgICAnaW5wdXRGaWVsZEFsaWduJyxcbiAgICAgICAgJ2luc2VydEJlZm9yZScsXG4gICAgICAgICdpbnNlcnRGaXJzdCcsXG4gICAgICAgICdrZXlNYXAnLFxuICAgICAgICAnbGFiZWxQb3NpdGlvbicsXG4gICAgICAgICdsb25nUHJlc3NUaW1lJyxcbiAgICAgICAgJ21hcmdpbicsXG4gICAgICAgICdtYXhIZWlnaHQnLFxuICAgICAgICAnbWF4V2lkdGgnLFxuICAgICAgICAnbWluSGVpZ2h0JyxcbiAgICAgICAgJ21pbldpZHRoJyxcbiAgICAgICAgJ29yaWdpbmFsU3RvcmUnLFxuICAgICAgICAncGFyZW50JyxcbiAgICAgICAgJ3ByZXNlcnZlU2Nyb2xsJyxcbiAgICAgICAgJ3JlYWRPbmx5JyxcbiAgICAgICAgJ3JlbmRpdGlvbicsXG4gICAgICAgICdyb3dIZWlnaHQnLFxuICAgICAgICAncm93TGluZXMnLFxuICAgICAgICAncnRsJyxcbiAgICAgICAgJ3Njcm9sbGFibGUnLFxuICAgICAgICAnc2VsZWN0ZWRDZWxsJyxcbiAgICAgICAgJ3NlbGVjdGVkQ2VsbHMnLFxuICAgICAgICAnc2VsZWN0ZWRSZWNvcmQnLFxuICAgICAgICAnc2VsZWN0ZWRSZWNvcmRzJyxcbiAgICAgICAgJ3NlbGVjdGVkUm93cycsXG4gICAgICAgICdzZWxlY3Rpb25Nb2RlJyxcbiAgICAgICAgJ3NwYW4nLFxuICAgICAgICAnc3RhdGUnLFxuICAgICAgICAnc3RhdGVTZXR0aW5ncycsXG4gICAgICAgICdzdG9yZScsXG4gICAgICAgICd0aXRsZScsXG4gICAgICAgICd0b29scycsXG4gICAgICAgICd0b29sdGlwJyxcbiAgICAgICAgJ3RyYW5zaXRpb24nLFxuICAgICAgICAndHJhbnNpdGlvbkR1cmF0aW9uJyxcbiAgICAgICAgJ3dpZHRoJ1xuICAgIF0pO1xuXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHB1YmxpYyBpbnN0YW5jZSE6IEdyaWRCYXNlO1xuXG4gICAgcHJpdmF0ZSBicnludHVtQ29uZmlnID0ge1xuICAgICAgICBhZG9wdCAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhcHBlbmRUbyAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBocmVmICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBhbmd1bGFyQ29tcG9uZW50IDogdGhpcyxcbiAgICAgICAgZmVhdHVyZXMgICAgICAgICA6IHt9LFxuICAgICAgICBsaXN0ZW5lcnMgICAgICAgIDoge31cbiAgICB9O1xuXG4gICAgY29uc3RydWN0b3IoZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIC8vIENvbmZpZ3Mgb25seVxuICAgIEBJbnB1dCgpIGFkb3B0ICAgICAgICAgICAgICAgICAgICAgICAgICEgOiBIVE1MRWxlbWVudHxzdHJpbmc7XG4gICAgQElucHV0KCkgYW5pbWF0ZUZpbHRlclJlbW92YWxzICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYW5pbWF0ZVJlbW92aW5nUm93cyAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgYXJpYURlc2NyaXB0aW9uICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBhcmlhTGFiZWwgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGF1dG9IZWlnaHQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGJiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAoQ29udGFpbmVySXRlbUNvbmZpZ3xzdHJpbmcpW118VG9vbGJhckNvbmZpZ3xQYWdpbmdUb29sYmFyQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgYm9keUNscyAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xvYmplY3Q7XG4gICAgQElucHV0KCkgYnViYmxlRXZlbnRzICAgICAgICAgICAgICAgICAgISA6IG9iamVjdDtcbiAgICBASW5wdXQoKSBjb2xsYXBzaWJsZSAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxQYW5lbENvbGxhcHNlckNvbmZpZ3xQYW5lbENvbGxhcHNlck92ZXJsYXlDb25maWc7XG4gICAgQElucHV0KCkgY29sb3IgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZztcbiAgICBASW5wdXQoKSBjb25maWcgICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbnRlbnRFbGVtZW50Q2xzICAgICAgICAgICAgICEgOiBzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIGNvbnRleHRNZW51VHJpZ2dlckV2ZW50ICAgICAgICEgOiAnY29udGV4dG1lbnUnfCdjbGljayd8J2RibGNsaWNrJztcbiAgICBASW5wdXQoKSBkYXRhRmllbGQgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGRlZmF1bHRSZWdpb24gICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgZGVzdHJveVN0b3JlICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGV0ZWN0Q1NTQ29tcGF0aWJpbGl0eUlzc3VlcyAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZUdyaWRDb2x1bW5JZFdhcm5pbmcgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGlzYWJsZUdyaWRSb3dNb2RlbFdhcm5pbmcgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgISA6ICd0b3AnfCdib3R0b20nfCdsZWZ0J3wncmlnaHQnfCdzdGFydCd8J2VuZCd8J2hlYWRlcid8J3ByZS1oZWFkZXInfG9iamVjdDtcbiAgICBASW5wdXQoKSBkcmF3ZXIgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7c2lkZT86ICdzdGFydCd8J2xlZnQnfCdlbmQnfCdyaWdodCd8J3RvcCd8J2JvdHRvbScsIHNpemU/OiBzdHJpbmd8bnVtYmVyLCBpbmxpbmU/OiBib29sZWFuLCBhdXRvQ2xvc2U6IHsgbW91c2Vkb3duPzogYm9vbGVhbnxzdHJpbmcsIGZvY3Vzb3V0PzogYm9vbGVhbnxzdHJpbmcsIG1vdXNlb3V0Pzogc3RyaW5nIH0sIGF1dG9DbG9zZURlbGF5PzogbnVtYmVyfTtcbiAgICBASW5wdXQoKSBlbGVtZW50QXR0cmlidXRlcyAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgc3RyaW5nfG51bGw+O1xuICAgIEBJbnB1dCgpIGVuYWJsZVN0aWNreSAgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGVuYWJsZVRleHRTZWxlY3Rpb24gICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGZpbGxMYXN0Q29sdW1uICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGZpeGVkUm93SGVpZ2h0ICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGZvb3RlciAgICAgICAgICAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIGRvY2s/OiAndG9wJ3wncmlnaHQnfCdib3R0b20nfCdsZWZ0J3wnc3RhcnQnfCdlbmQnXG4gICAgICAgIGh0bWw/OiBzdHJpbmdcbiAgICAgICAgY2xzPzogc3RyaW5nXG4gICAgfXxzdHJpbmc7XG4gICAgQElucHV0KCkgZm9ybXVsYVByb3ZpZGVycyAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEZvcm11bGFQcm92aWRlckNvbmZpZz47XG4gICAgQElucHV0KCkgZnVsbFJvd1JlZnJlc2ggICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZ2V0Um93SGVpZ2h0ICAgICAgICAgICAgICAgICAgISA6IChnZXRSb3dIZWlnaHQ6IHsgcmVjb3JkOiBNb2RlbCB9KSA9PiBudW1iZXI7XG4gICAgQElucHV0KCkgaGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xib29sZWFufFBhbmVsSGVhZGVyO1xuICAgIEBJbnB1dCgpIGhpZGVIb3Jpem9udGFsU2Nyb2xsYmFyICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGhvdmVyQ2xzICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgaWNvbiAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xEb21Db25maWc7XG4gICAgQElucHV0KCkgaWdub3JlUGFyZW50UmVhZE9ubHkgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgbGlzdGVuZXJzICAgICAgICAgICAgICAgICAgICAgISA6IEdyaWRCYXNlTGlzdGVuZXJzO1xuICAgIEBJbnB1dCgpIGxvYWRNYXNrICAgICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8TWFza0NvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIGxvYWRNYXNrRGVmYXVsdHMgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnO1xuICAgIEBJbnB1dCgpIGxvYWRNYXNrRXJyb3IgICAgICAgICAgICAgICAgICEgOiBNYXNrQ29uZmlnfE1hc2t8Ym9vbGVhbjtcbiAgICBASW5wdXQoKSBsb2NhbGl6YWJsZSAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBtYXNrRGVmYXVsdHMgICAgICAgICAgICAgICAgICAhIDogTWFza0NvbmZpZztcbiAgICBASW5wdXQoKSBtYXNrZWQgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxzdHJpbmd8TWFza0NvbmZpZztcbiAgICBASW5wdXQoKSBtb25pdG9yUmVzaXplICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBvd25lciAgICAgICAgICAgICAgICAgICAgICAgICAhIDogV2lkZ2V0fGFueTtcbiAgICBASW5wdXQoKSBwbHVnaW5zICAgICAgICAgICAgICAgICAgICAgICAhIDogRnVuY3Rpb25bXTtcbiAgICBASW5wdXQoKSBwcmVzZXJ2ZUZvY3VzT25EYXRhc2V0Q2hhbmdlICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcmVzZXJ2ZVNjcm9sbE9uRGF0YXNldENoYW5nZSAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwcmV2ZW50VG9vbHRpcE9uVG91Y2ggICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZWxheVN0b3JlRXZlbnRzICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSByZXNpemFibGUgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIG1pbldpZHRoPzogbnVtYmVyXG4gICAgICAgIG1heFdpZHRoPzogbnVtYmVyXG4gICAgICAgIG1pbkhlaWdodD86IG51bWJlclxuICAgICAgICBtYXhIZWlnaHQ/OiBudW1iZXJcbiAgICAgICAgaGFuZGxlcz86IG9iamVjdFxuICAgIH07XG4gICAgQElucHV0KCkgcmVzaXplVG9GaXRJbmNsdWRlc0hlYWRlciAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVzcG9uc2l2ZUxldmVscyAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIG51bWJlcnxzdHJpbmd8UmVzcG9uc2l2ZUxldmVsQ29uZmlnPjtcbiAgICBASW5wdXQoKSByaXBwbGUgICAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnx7XG4gICAgICAgIGRlbGVnYXRlPzogc3RyaW5nXG4gICAgICAgIGNvbG9yPzogc3RyaW5nXG4gICAgICAgIHJhZGl1cz86IG51bWJlclxuICAgICAgICBjbGlwPzogc3RyaW5nXG4gICAgfTtcbiAgICBASW5wdXQoKSByb290RWxlbWVudCAgICAgICAgICAgICAgICAgICAhIDogU2hhZG93Um9vdHxIVE1MRWxlbWVudDtcbiAgICBASW5wdXQoKSBzY3JvbGxlckNsYXNzICAgICAgICAgICAgICAgICAhIDogdHlwZW9mIFNjcm9sbGVyO1xuICAgIEBJbnB1dCgpIHNjcm9sbE1hbmFnZXIgICAgICAgICAgICAgICAgICEgOiBTY3JvbGxNYW5hZ2VyQ29uZmlnfFNjcm9sbE1hbmFnZXI7XG4gICAgQElucHV0KCkgc2hvd0RpcnR5ICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58e1xuICAgICAgICBkdXJpbmdFZGl0PzogYm9vbGVhblxuICAgICAgICBuZXdSZWNvcmQ/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSBzdGF0ZWZ1bCAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbnxvYmplY3R8c3RyaW5nW107XG4gICAgQElucHV0KCkgc3RhdGVmdWxFdmVudHMgICAgICAgICAgICAgICAgISA6IG9iamVjdHxzdHJpbmdbXTtcbiAgICBASW5wdXQoKSBzdGF0ZUlkICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHN0YXRlUHJvdmlkZXIgICAgICAgICAgICAgICAgICEgOiBTdGF0ZVByb3ZpZGVyO1xuICAgIEBJbnB1dCgpIHN0cmlwcyAgICAgICAgICAgICAgICAgICAgICAgICEgOiBSZWNvcmQ8c3RyaW5nLCBDb250YWluZXJJdGVtQ29uZmlnPjtcbiAgICBASW5wdXQoKSBzdWJHcmlkQ29uZmlncyAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgU3ViR3JpZENvbmZpZz47XG4gICAgQElucHV0KCkgc3luY01hc2sgICAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xNYXNrQ29uZmlnfG51bGw7XG4gICAgQElucHV0KCkgdGFiICAgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW58VGFiQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRhYkJhckl0ZW1zICAgICAgICAgICAgICAgICAgICEgOiBUb29sYmFySXRlbXNbXXxXaWRnZXRbXTtcbiAgICBASW5wdXQoKSB0YmFyICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogKENvbnRhaW5lckl0ZW1Db25maWd8c3RyaW5nKVtdfFRvb2xiYXJDb25maWd8UGFnaW5nVG9vbGJhckNvbmZpZ3xudWxsO1xuICAgIEBJbnB1dCgpIHVpICAgICAgICAgICAgICAgICAgICAgICAgICAgICEgOiAncGxhaW4nfCd0b29sYmFyJ3xzdHJpbmd8b2JqZWN0O1xuICAgIEBJbnB1dCgpIHdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG5cbiAgICAvLyBDb25maWdzIGFuZCBwcm9wZXJ0aWVzXG4gICAgQElucHV0KCkgYWxpZ25TZWxmICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYW5pbWF0ZVRyZWVOb2RlVG9nZ2xlICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGFwcGVuZFRvICAgICAgICAgICAgICAgICAgICAhIDogSFRNTEVsZW1lbnR8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGNhbGxPbkZ1bmN0aW9ucyAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBjYXRjaEV2ZW50SGFuZGxlckV4Y2VwdGlvbnMgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY2VsbEVsbGlwc2lzICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG9iamVjdDtcbiAgICBASW5wdXQoKSBjb2xsYXBzZWQgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgY29sdW1uICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgY29sdW1uTGluZXMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGNvbHVtbnMgICAgICAgICAgICAgICAgICAgICAhIDogQ29sdW1uU3RvcmV8R3JpZENvbHVtbkNvbmZpZ1tdfENvbHVtblN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0W118TW9kZWxbXXxNb2RlbENvbmZpZ1tdO1xuICAgIEBJbnB1dCgpIGRhdGFzZXQgICAgICAgICAgICAgICAgICAgICAhIDogb2JqZWN0fFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgQElucHV0KCkgZGlzYWJsZWQgICAgICAgICAgICAgICAgICAgICEgOiBib29sZWFufCdpbmVydCc7XG4gICAgQElucHV0KCkgZW1wdHlUZXh0ICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8RW1wdHlUZXh0RG9tQ29uZmlnO1xuICAgIEBJbnB1dCgpIGVuYWJsZVVuZG9SZWRvS2V5cyAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBleHRyYURhdGEgICAgICAgICAgICAgICAgICAgISA6IGFueTtcbiAgICBASW5wdXQoKSBmbGV4ICAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG4gICAgQElucHV0KCkgaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXJ8c3RyaW5nO1xuICAgIEBJbnB1dCgpIGhpZGRlbiAgICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBoaWRlRm9vdGVycyAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGlkZUhlYWRlcnMgICAgICAgICAgICAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIGlucHV0RmllbGRBbGlnbiAgICAgICAgICAgICAhIDogJ3N0YXJ0J3wnZW5kJztcbiAgICBASW5wdXQoKSBpbnNlcnRCZWZvcmUgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBpbnNlcnRGaXJzdCAgICAgICAgICAgICAgICAgISA6IEhUTUxFbGVtZW50fHN0cmluZztcbiAgICBASW5wdXQoKSBrZXlNYXAgICAgICAgICAgICAgICAgICAgICAgISA6IFJlY29yZDxzdHJpbmcsIEtleU1hcENvbmZpZz47XG4gICAgQElucHV0KCkgbGFiZWxQb3NpdGlvbiAgICAgICAgICAgICAgICEgOiAnYmVmb3JlJ3wnYWJvdmUnfCdhbGlnbi1iZWZvcmUnfCdhdXRvJ3xudWxsO1xuICAgIEBJbnB1dCgpIGxvbmdQcmVzc1RpbWUgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIG1hcmdpbiAgICAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyfHN0cmluZztcbiAgICBASW5wdXQoKSBtYXhIZWlnaHQgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgbWF4V2lkdGggICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8bnVtYmVyO1xuICAgIEBJbnB1dCgpIG1pbkhlaWdodCAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nfG51bWJlcjtcbiAgICBASW5wdXQoKSBtaW5XaWR0aCAgICAgICAgICAgICAgICAgICAgISA6IHN0cmluZ3xudW1iZXI7XG4gICAgQElucHV0KCkgcHJlc2VydmVTY3JvbGwgICAgICAgICAgICAgICEgOiBQcmVzZXJ2ZVNjcm9sbE9wdGlvbnN8Ym9vbGVhbjtcbiAgICBASW5wdXQoKSByZWFkT25seSAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcmVuZGl0aW9uICAgICAgICAgICAgICAgICAgICEgOiBzdHJpbmd8UmVjb3JkPHN0cmluZywgc3RyaW5nPnxudWxsO1xuICAgIEBJbnB1dCgpIHJvd0hlaWdodCAgICAgICAgICAgICAgICAgICAhIDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHJvd0xpbmVzICAgICAgICAgICAgICAgICAgICAhIDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBydGwgICAgICAgICAgICAgICAgICAgICAgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgc2Nyb2xsYWJsZSAgICAgICAgICAgICAgICAgICEgOiBTY3JvbGxlcnxib29sZWFufFNjcm9sbGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGUgICAgICAgICAgICAgICAhIDogR3JpZFNlbGVjdGlvbk1vZGU7XG4gICAgQElucHV0KCkgc3BhbiAgICAgICAgICAgICAgICAgICAgICAgICEgOiBudW1iZXI7XG4gICAgQElucHV0KCkgc3RhdGVTZXR0aW5ncyAgICAgICAgICAgICAgICEgOiB7XG4gICAgICAgIHJlc3RvcmVVbmNvbmZpZ3VyZWRDb2x1bW5zPzogYm9vbGVhblxuICAgIH07XG4gICAgQElucHV0KCkgc3RvcmUgICAgICAgICAgICAgICAgICAgICAgICEgOiBTdG9yZXxTdG9yZUNvbmZpZ3xBamF4U3RvcmV8QWpheFN0b3JlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHRpdGxlICAgICAgICAgICAgICAgICAgICAgICAhIDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHRvb2xzICAgICAgICAgICAgICAgICAgICAgICAhIDogUmVjb3JkPHN0cmluZywgVG9vbHxUb29sQ29uZmlnPnxudWxsfFJlY29yZDxzdHJpbmcsIFRvb2w+fFJlY29yZDxzdHJpbmcsIFRvb2xDb25maWc+O1xuICAgIEBJbnB1dCgpIHRyYW5zaXRpb24gICAgICAgICAgICAgICAgICAhIDoge1xuICAgICAgICBpbnNlcnRSZWNvcmQ/OiBib29sZWFuXG4gICAgICAgIHJlbW92ZVJlY29yZD86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlQ29sdW1uPzogYm9vbGVhblxuICAgICAgICBleHBhbmRDb2xsYXBzZUNvbHVtbj86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlUmVnaW9uPzogYm9vbGVhblxuICAgICAgICB0b2dnbGVUcmVlTm9kZT86IGJvb2xlYW5cbiAgICAgICAgdG9nZ2xlR3JvdXA/OiBib29sZWFuXG4gICAgICAgIGZpbHRlclJlbW92YWw/OiBib29sZWFuXG4gICAgfTtcbiAgICBASW5wdXQoKSB0cmFuc2l0aW9uRHVyYXRpb24gICAgICAgICAgISA6IG51bWJlcjtcbiAgICBASW5wdXQoKSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgISA6IG51bWJlcnxzdHJpbmc7XG5cbiAgICAvLyBQcm9wZXJ0aWVzIG9ubHlcbiAgICBASW5wdXQoKSBmb2N1c1Zpc2libGUgICAgISA6IGJvb2xlYW47XG4gICAgQElucHV0KCkgaGFzQ2hhbmdlcyAgICAgICEgOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIG9yaWdpbmFsU3RvcmUgICAhIDogU3RvcmU7XG4gICAgQElucHV0KCkgcGFyZW50ICAgICAgICAgICEgOiBXaWRnZXQ7XG4gICAgQElucHV0KCkgc2VsZWN0ZWRDZWxsICAgICEgOiBHcmlkTG9jYXRpb258R3JpZExvY2F0aW9uQ29uZmlnO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkQ2VsbHMgICAhIDogR3JpZExvY2F0aW9uW118R3JpZExvY2F0aW9uQ29uZmlnW107XG4gICAgQElucHV0KCkgc2VsZWN0ZWRSZWNvcmQgICEgOiBNb2RlbDtcbiAgICBASW5wdXQoKSBzZWxlY3RlZFJlY29yZHMgISA6IE1vZGVsW118bnVtYmVyW107XG4gICAgQElucHV0KCkgc2VsZWN0ZWRSb3dzICAgICEgOiBNb2RlbFtdfG51bWJlcltdO1xuICAgIEBJbnB1dCgpIHN0YXRlICAgICAgICAgICAhIDogR3JpZFN0YXRlSW5mbztcbiAgICBASW5wdXQoKSB0b29sdGlwICAgICAgICAgISA6IHN0cmluZ3xUb29sdGlwQ29uZmlnO1xuXG4gICAgLy8gRmVhdHVyZXNcbiAgICBASW5wdXQoKSBhaUZpbHRlckZlYXR1cmUgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8QUlGaWx0ZXJ8QUlGaWx0ZXJDb25maWc7XG4gICAgQElucHV0KCkgY2VsbENvcHlQYXN0ZUZlYXR1cmUgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxDb3B5UGFzdGV8Q2VsbENvcHlQYXN0ZUNvbmZpZztcbiAgICBASW5wdXQoKSBjZWxsRWRpdEZlYXR1cmUgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2VsbEVkaXR8Q2VsbEVkaXRDb25maWc7XG4gICAgQElucHV0KCkgY2VsbE1lbnVGZWF0dXJlICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENlbGxNZW51fENlbGxNZW51Q29uZmlnO1xuICAgIEBJbnB1dCgpIGNlbGxUb29sdGlwRmVhdHVyZSAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xDZWxsVG9vbHRpcHxDZWxsVG9vbHRpcENvbmZpZztcbiAgICBASW5wdXQoKSBjaGFydHNGZWF0dXJlICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q2hhcnRzfENoYXJ0c0NvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5BdXRvV2lkdGhGZWF0dXJlICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uQXV0b1dpZHRofENvbHVtbkF1dG9XaWR0aENvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5EcmFnVG9vbGJhckZlYXR1cmUgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uRHJhZ1Rvb2xiYXJ8Q29sdW1uRHJhZ1Rvb2xiYXJDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUGlja2VyRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblBpY2tlcnxDb2x1bW5QaWNrZXJDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVuYW1lRmVhdHVyZSAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlbmFtZXxDb2x1bW5SZW5hbWVDb25maWc7XG4gICAgQElucHV0KCkgY29sdW1uUmVvcmRlckZlYXR1cmUgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfENvbHVtblJlb3JkZXJ8Q29sdW1uUmVvcmRlckNvbmZpZztcbiAgICBASW5wdXQoKSBjb2x1bW5SZXNpemVGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8Q29sdW1uUmVzaXplfENvbHVtblJlc2l6ZUNvbmZpZztcbiAgICBASW5wdXQoKSBleGNlbEV4cG9ydGVyRmVhdHVyZSAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RXhjZWxFeHBvcnRlcnxFeGNlbEV4cG9ydGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbGVEcm9wRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWxlRHJvcHxGaWxlRHJvcENvbmZpZztcbiAgICBASW5wdXQoKSBmaWxsSGFuZGxlRmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8RmlsbEhhbmRsZXxGaWxsSGFuZGxlQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbHRlckZlYXR1cmUgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJ8RmlsdGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGZpbHRlckJhckZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xGaWx0ZXJCYXJ8RmlsdGVyQmFyQ29uZmlnO1xuICAgIEBJbnB1dCgpIGdyb3VwRmVhdHVyZSAgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xHcm91cHxHcm91cENvbmZpZztcbiAgICBASW5wdXQoKSBncm91cFN1bW1hcnlGZWF0dXJlICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8R3JvdXBTdW1tYXJ5fEdyb3VwU3VtbWFyeUNvbmZpZztcbiAgICBASW5wdXQoKSBoZWFkZXJNZW51RmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8SGVhZGVyTWVudXxIZWFkZXJNZW51Q29uZmlnO1xuICAgIEBJbnB1dCgpIGxvY2tSb3dzRmVhdHVyZSAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xMb2NrUm93c3xMb2NrUm93c0NvbmZpZztcbiAgICBASW5wdXQoKSBtZXJnZUNlbGxzRmVhdHVyZSAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8TWVyZ2VDZWxsc3xNZXJnZUNlbGxzQ29uZmlnO1xuICAgIEBJbnB1dCgpIHBkZkV4cG9ydEZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQZGZFeHBvcnR8UGRmRXhwb3J0Q29uZmlnO1xuICAgIEBJbnB1dCgpIHBpbkNvbHVtbnNGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xQaW5Db2x1bW5zfFBpbkNvbHVtbnNDb25maWc7XG4gICAgQElucHV0KCkgcHJpbnRGZWF0dXJlICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFByaW50fFByaW50Q29uZmlnO1xuICAgIEBJbnB1dCgpIHF1aWNrRmluZEZlYXR1cmUgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xRdWlja0ZpbmR8UXVpY2tGaW5kQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJlZ2lvblJlc2l6ZUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSZWdpb25SZXNpemV8UmVnaW9uUmVzaXplQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd0NvcHlQYXN0ZUZlYXR1cmUgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dDb3B5UGFzdGV8Um93Q29weVBhc3RlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd0VkaXRGZWF0dXJlICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dFZGl0fFJvd0VkaXRDb25maWc7XG4gICAgQElucHV0KCkgcm93RXhwYW5kZXJGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd0V4cGFuZGVyfFJvd0V4cGFuZGVyQ29uZmlnO1xuICAgIEBJbnB1dCgpIHJvd1Jlb3JkZXJGZWF0dXJlICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xSb3dSZW9yZGVyfFJvd1Jlb3JkZXJDb25maWc7XG4gICAgQElucHV0KCkgcm93UmVzaXplRmVhdHVyZSAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFJvd1Jlc2l6ZXxSb3dSZXNpemVDb25maWc7XG4gICAgQElucHV0KCkgc2VhcmNoRmVhdHVyZSAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNlYXJjaHxTZWFyY2hDb25maWc7XG4gICAgQElucHV0KCkgc29ydEZlYXR1cmUgICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFNvcnR8U29ydENvbmZpZztcbiAgICBASW5wdXQoKSBzcGxpdEZlYXR1cmUgICAgICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8U3BsaXR8U3BsaXRDb25maWc7XG4gICAgQElucHV0KCkgc3RpY2t5Q2VsbHNGZWF0dXJlICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFN0aWNreUNlbGxzfFN0aWNreUNlbGxzQ29uZmlnO1xuICAgIEBJbnB1dCgpIHN0cmlwZUZlYXR1cmUgICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdHJpcGV8U3RyaXBlQ29uZmlnO1xuICAgIEBJbnB1dCgpIHN1bW1hcnlGZWF0dXJlICAgICAgICAgICAgISA6IG9iamVjdHxib29sZWFufHN0cmluZ3xTdW1tYXJ5fFN1bW1hcnlDb25maWc7XG4gICAgQElucHV0KCkgdHJlZUZlYXR1cmUgICAgICAgICAgICAgICAhIDogb2JqZWN0fGJvb2xlYW58c3RyaW5nfFRyZWV8VHJlZUNvbmZpZztcbiAgICBASW5wdXQoKSB0cmVlR3JvdXBGZWF0dXJlICAgICAgICAgICEgOiBvYmplY3R8Ym9vbGVhbnxzdHJpbmd8VHJlZUdyb3VwfFRyZWVHcm91cENvbmZpZztcblxuICAgIC8vIEV2ZW50cyBlbWl0dGVyc1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIGNlbGwgZWRpdGluZyBpcyBjYW5jZWxlZCwgcmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCBjYW5jZWxsYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNhbmNlbENlbGxFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBHcmlkTG9jYXRpb24gfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSByb3cgZWRpdGluZyBpcyBjYW5jZWxlZCwgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkIGFuZCBlZGl0aW5nIHNob3VsZCBub3QgYmUgZmluYWxpemVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2V2ZW50LWJlZm9yZUNhbmNlbFJvd0VkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge1Jvd0VkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlQ2FuY2VsUm93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGVkaXRpbmcgc3RhcnRzLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGVkaXRpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NlbGxFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNlbGxFZGl0U3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBkZWxldGluZyBhIHJhbmdlIG9mIHNlbGVjdGVkIGNlbGwgdmFsdWVzIGJ5IHByZXNzaW5nIGBCYWNrc3BhY2VgIG9yIGBEZWxgXG4gICAgICogYnV0dG9ucyB3aGlsZSBbYXV0b0VkaXRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbEVkaXQjY29uZmlnLWF1dG9FZGl0KSBpcyBzZXQgdG8gYHRydWVgLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGVkaXRpbmcuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHsoR3JpZC51dGlsLkdyaWRMb2NhdGlvbnxDb3JlLmRhdGEuTW9kZWwpW119IGV2ZW50LmdyaWRTZWxlY3Rpb24gQW4gYXJyYXkgb2YgY2VsbCBzZWxlY3RvcnMgb3IgcmVjb3JkcyB0aGF0IHdpbGwgaGF2ZSB0aGVpciB2YWx1ZXMgZGVsZXRlZCAodGhlIHJlY29yZHMgdGhlbXNlbHZlcyB3aWxsIG5vdCBnZXQgZGVsZXRlZCwgb25seSB2aXNpYmxlIGNvbHVtbiB2YWx1ZXMpLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNlbGxSYW5nZURlbGV0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZ3JpZFNlbGVjdGlvbjogKEdyaWRMb2NhdGlvbnxNb2RlbClbXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGZvciBlYWNoIHNlbGVjdGVkIHJlY29yZCBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGVkaXRpbmcgYSByYW5nZSBvZiBzZWxlY3RlZCBjZWxsIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIEN1cnJlbnQgc2VsZWN0ZWQgcmVjb3JkIGZyb20gdGhlIHJhbmdlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmZpZWxkIFRoZSBmaWVsZCBiZWluZyBjaGFuZ2VkXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50LnZhbHVlIFRoZSB2YWx1ZSBiZWluZyBzZXRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDZWxsUmFuZ2VFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCwgZmllbGQ6IHN0cmluZywgdmFsdWU6IGFueSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgcHJpb3IgdG8gc3RhcnRpbmcgYSBjb2x1bW4gZHJhZyBnZXN0dXJlLiBUaGUgZHJhZyBpcyBjYW5jZWxlZCBpZiBhIGxpc3RlbmVyIHJldHVybnMgYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvbHVtbkRyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGV2ZW50OiBFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiBpcyBkcm9wcGVkLCBhbmQgeW91IGNhbiByZXR1cm4gZmFsc2UgZnJvbSBhIGxpc3RlbmVyIHRvIGFib3J0IHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBkcmFnZ2VkIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuaW5zZXJ0QmVmb3JlIFRoZSBjb2x1bW4gYmVmb3JlIHdoaWNoIHRoZSBkcmFnZ2VkIGNvbHVtbiB3aWxsIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5uZXdQYXJlbnQgVGhlIG5ldyBwYXJlbnQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBicm93c2VyIGV2ZW50LlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5yZWdpb24gVGhlIHJlZ2lvbiB3aGVyZSB0aGUgY29sdW1uIHdhcyBkcm9wcGVkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvbHVtbkRyb3BGaW5hbGl6ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGluc2VydEJlZm9yZTogQ29sdW1uLCBuZXdQYXJlbnQ6IENvbHVtbiwgZXZlbnQ6IEV2ZW50LCByZWdpb246IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgcHJpb3IgdG8gc3RhcnRpbmcgYSBjb2x1bW4gcmVzaXplIGdlc3R1cmUuIFRoZSByZXNpemUgaXMgY2FuY2VsZWQgaWYgYSBsaXN0ZW5lciByZXR1cm5zXG4gICAgICogYGZhbHNlYC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVDb2x1bW5SZXNpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBkb21FdmVudDogRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGEgY29weSBhY3Rpb24gaXMgcGVyZm9ybWVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbHMgVGhlIGNlbGxzIGFib3V0IHRvIGJlIGNvcGllZCBvciBjdXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZGF0YSBUaGUgc3RyaW5nIGRhdGEgYWJvdXQgdG8gYmUgY29waWVkIG9yIGN1dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuaXNDdXQgYHRydWVgIGlmIHRoaXMgaXMgYSBjdXQgYWN0aW9uXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2NlbGwnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBiZWZvcmVDb3B5IGV2ZW50c1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNvcHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNlbGxzOiBHcmlkTG9jYXRpb25bXSwgZGF0YTogc3RyaW5nLCBpc0N1dDogYm9vbGVhbiwgZW50aXR5TmFtZTogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBDU1YgZXhwb3J0IHN0YXJ0cy4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBleHBvcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7RXhwb3J0Q29uZmlnfSBldmVudC5jb25maWcgRXhwb3J0IGNvbmZpZ1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1uW119IGV2ZW50LmNvbHVtbnMgQW4gYXJyYXkgb2YgY29sdW1ucyB0byBleHBvcnRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5yb3dzIEFuIGFycmF5IG9mIHJlY29yZHMgdG8gZXhwb3J0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmxpbmVEZWxpbWl0ZXIgVGhlIENTViBkZWxpbWl0ZXIgdG8gc2VwYXJhdGUgbGluZXNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY29sdW1uRGVsaW1pdGVyIFRoZSBDU1YgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIHZhbHVlcyBvbiBvbmUgbGluZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUNTVkV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNvbmZpZzogRXhwb3J0Q29uZmlnLCBjb2x1bW5zOiBDb2x1bW5bXSwgcm93czogTW9kZWxbXSwgbGluZURlbGltaXRlcjogc3RyaW5nLCBjb2x1bW5EZWxpbWl0ZXI6IHN0cmluZyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBFeGNlbCBleHBvcnQgc3RhcnRzLiBSZXR1cm4gYGZhbHNlYCB0byBjYW5jZWwgdGhlIGV4cG9ydC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtFeHBvcnRDb25maWd9IGV2ZW50LmNvbmZpZyBFeHBvcnQgY29uZmlnXG4gICAgICogQHBhcmFtIHtYTFNDb2x1bW5bXX0gZXZlbnQuY29sdW1ucyBBbiBhcnJheSBvZiBjb2x1bW5zIHRvIGV4cG9ydFxuICAgICAqIEBwYXJhbSB7YW55W11bXX0gZXZlbnQucm93cyBBbiBhcnJheSBvZiByZWNvcmRzIHRvIGV4cG9ydFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUV4Y2VsRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY29uZmlnOiBFeHBvcnRDb25maWcsIGNvbHVtbnM6IFhMU0NvbHVtbltdLCByb3dzOiBhbnlbXSB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBkcmFnZ2luZyBvZiB0aGUgRmlsbEhhbmRsZSBzdGFydHMsIHJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGRyYWcgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmNlbGwgSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbHVtbiAvIHJlY29yZFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIHJhdyBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVGaWxsSGFuZGxlRHJhZ1N0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2VsbDogR3JpZExvY2F0aW9uLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgdGhlIGNlbGwgZWRpdGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkIGFuZCBlZGl0aW5nIHNob3VsZCBub3QgYmUgZmluYWxpemVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtDZWxsRWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVGaW5pc2hDZWxsRWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSByb3cgZWRpdGluZyBpcyBmaW5pc2hlZCwgcmV0dXJuIGZhbHNlIHRvIHNpZ25hbCB0aGF0IHRoZSB2YWx1ZSBpcyBpbnZhbGlkIGFuZCBlZGl0aW5nIHNob3VsZCBub3QgYmUgZmluYWxpemVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2V2ZW50LWJlZm9yZUZpbmlzaFJvd0VkaXQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGFyZ2V0IGdyaWRcbiAgICAgKiBAcGFyYW0ge1Jvd0VkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlRmluaXNoUm93RWRpdDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYmVmb3JlIGEgd2lkZ2V0IGlzIGhpZGRlbi4gUmV0dXJuIGBmYWxzZWAgdG8gcHJldmVudCB0aGUgYWN0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSB3aWRnZXQgYmVpbmcgaGlkZGVuLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZUhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBiZWZvcmUgYSBwYXN0ZSBhY3Rpb24gaXMgcGVyZm9ybWVkLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY2xpcGJvYXJkRGF0YSBUaGUgY2xpcGJvYXJkRGF0YSBhYm91dCB0byBiZSBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRhcmdldENlbGwgVGhlIGNlbGwgZnJvbSB3aGljaCB0aGUgcGFzdGUgd2lsbCBiZSBzdGFydGVkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmVudGl0eU5hbWUgJ2NlbGwnIHRvIGRpc3Rpbmd1aXNoIHRoaXMgZXZlbnQgZnJvbSBvdGhlciBiZWZvcmVQYXN0ZSBldmVudHNcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQudGV4dCBUaGUgcmF3IHRleHQgZnJvbSBjbGlwYm9hcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVQYXN0ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY2xpcGJvYXJkRGF0YTogc3RyaW5nLCB0YXJnZXRDZWxsOiBHcmlkTG9jYXRpb24sIGVudGl0eU5hbWU6IHN0cmluZywgdGV4dDogc3RyaW5nIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSBleHBvcnQgc3RhcnRlZC4gUmV0dXJuIGBmYWxzZWAgdG8gY2FuY2VsIHRoZSBleHBvcnQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb25maWcgRXhwb3J0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVBkZkV4cG9ydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNvbmZpZzogb2JqZWN0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYmVmb3JlIGEgcm93IGlzIHJlbmRlcmVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5yb3cuUm93fSBldmVudC5yb3cgVGhlIHJvdyBhYm91dCB0byBiZSByZW5kZXJlZC5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgZm9yIHRoZSByb3cuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnJlY29yZEluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSByZWNvcmQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUmVuZGVyUm93OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByb3c6IFJvdywgcmVjb3JkOiBNb2RlbCwgcmVjb3JkSW5kZXg6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogR3JpZCByb3dzIGFyZSBhYm91dCB0byBiZSByZW5kZXJlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhpcyBncmlkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJlbmRlclJvd3M6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgYmVmb3JlIHJvdyBjb2xsYXBzZSBpcyBzdGFydGVkLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2V2ZW50LWJlZm9yZVJvd0NvbGxhcHNlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFJlY29yZFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVJvd0NvbGxhcHNlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgYmVmb3JlIHJvdyBleHBhbmQgaXMgc3RhcnRlZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNldmVudC1iZWZvcmVSb3dFeHBhbmQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlUm93RXhwYW5kOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVjb3JkOiBNb2RlbCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGJlZm9yZSB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuIFJldHVybmluZyBgZmFsc2VgIGZyb20gYSBsaXN0ZW5lciBwcmV2ZW50cyB0aGUgY2hhbmdlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5hY3Rpb24gYCdzZWxlY3QnYC9gJ2Rlc2VsZWN0J2BcbiAgICAgKiBAcGFyYW0geydyb3cnLCdjZWxsJ30gZXZlbnQubW9kZSBgJ3JvdydgL2AnY2VsbCdgXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBUaGUgcmVjb3JkcyB0byBiZSBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGVkIFRoZSByZWNvcmRzIHRvIGJlIHNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBUaGUgcmVjb3JkcyBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIGJlZm9yZSBhcHBseWluZyBgc2VsZWN0ZWRgIGFuZCBgZGVzZWxlY3RlZGBcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuZGVzZWxlY3RlZENlbGxzIFRoZSBjZWxscyB0byBiZSBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5zZWxlY3RlZENlbGxzIFRoZSBjZWxscyB0byBiZSBzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbFNlbGVjdGlvbiBUaGUgY2VsbHMgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBiZWZvcmUgYXBwbHlpbmcgYHNlbGVjdGVkQ2VsbHNgIGFuZCBgZGVzZWxlY3RlZENlbGxzYFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNlbGVjdGlvbkNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGFjdGlvbjogc3RyaW5nLCBtb2RlOiAncm93J3wnY2VsbCcsIHNvdXJjZTogR3JpZCwgZGVzZWxlY3RlZDogTW9kZWxbXSwgc2VsZWN0ZWQ6IE1vZGVsW10sIHNlbGVjdGlvbjogTW9kZWxbXSwgZGVzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25bXSwgc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uW10sIGNlbGxTZWxlY3Rpb246IEdyaWRMb2NhdGlvbltdIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHRoaXMgY29udGFpbmVyIHdpbGwgbG9hZCByZWNvcmQgdmFsdWVzIGludG8gaXRzIGNoaWxkIGZpZWxkcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91XG4gICAgICogd2FudCB0byBtb2RpZnkgdGhlIFVJIGJlZm9yZSBkYXRhIGlzIGxvYWRlZCAoZS5nLiBzZXQgc29tZSBpbnB1dCBmaWVsZCB0byBiZSByZWFkb25seSlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Db250YWluZXJ9IGV2ZW50LnNvdXJjZSBUaGUgY29udGFpbmVyXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU2V0UmVjb3JkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBDb250YWluZXIsIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBiZWZvcmUgYSB3aWRnZXQgaXMgc2hvd24uIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGFjdGlvbi5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXQsYW55fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBzaG93blxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldHxhbnkgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIGVkaXRpbmcgc3RhcnRzLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IGVkaXRpbmdcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge1Jvd0VkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlU3RhcnRSb3dFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBSb3dFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHN0YXRlIGlzIGFwcGxpZWQgdG8gdGhlIHNvdXJjZS4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZFN0YXRlSW5mb30gZXZlbnQuc3RhdGUgU3RhdGUgb2JqZWN0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXRlQXBwbHk6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzdGF0ZTogR3JpZFN0YXRlSW5mbyB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSBzdGF0ZSBpcyBzYXZlZCBieSB0aGUgU3RhdGVQcm92aWRlci4gQWxsb3dzIGVkaXRpbmcgdGhlIHN0YXRlIG9iamVjdCBvciBwcmV2ZW50aW5nIHRoZSBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZFN0YXRlSW5mb30gZXZlbnQuc3RhdGUgU3RhdGUgb2JqZWN0IGNvbmZpZ1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkJlZm9yZVN0YXRlU2F2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHN0YXRlOiBHcmlkU3RhdGVJbmZvIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIGdyb3VwIGlzIGdvaW5nIHRvIGJlIGV4cGFuZGVkIG9yIGNvbGxhcHNlZCB1c2luZyB0aGUgVUkuXG4gICAgICogUmV0dXJuaW5nIGBmYWxzZWAgZnJvbSBhIGxpc3RlbmVyIHByZXZlbnRzIHRoZSBvcGVyYXRpb25cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50Lmdyb3VwUmVjb3JkIFtERVBSRUNBVEVEXSBVc2UgYGdyb3VwUmVjb3Jkc2AgcGFyYW0gaW5zdGVhZFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50Lmdyb3VwUmVjb3JkcyBUaGUgZ3JvdXAgcmVjb3JkcyBiZWluZyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBDb2xsYXBzZWQgKHRydWUpIG9yIGV4cGFuZGVkIChmYWxzZSlcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgdXNlciBpbnRlcmFjdGlvbiBldmVudCAoZWcgYSBgY2xpY2tgIGV2ZW50KSBpZiB0aGUgdG9nZ2xlIHJlcXVlc3Qgd2FzIGluc3RpZ2F0ZWQgYnkgdXNlciBpbnRlcmFjdGlvbi5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25CZWZvcmVUb2dnbGVHcm91cDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyb3VwUmVjb3JkOiBNb2RlbCwgZ3JvdXBSZWNvcmRzOiBNb2RlbFtdLCBjb2xsYXBzZTogYm9vbGVhbiwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIGEgcGFyZW50IG5vZGUgcmVjb3JkIHRvZ2dsZXMgaXRzIGNvbGxhcHNlZCBzdGF0ZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBmaXJpbmcgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgYmVpbmcgdG9nZ2xlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBiZWluZyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQmVmb3JlVG9nZ2xlTm9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sbGFwc2U6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCB3aGVuIGVkaXRpbmcgaXMgY2FuY2VsbGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBPd25lciBncmlkXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmV2ZW50IEluY2x1ZGVkIGlmIHRoZSBjYW5jZWxsYXRpb24gd2FzIHRyaWdnZXJlZCBieSBhIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNhbmNlbENlbGxFZGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBHcmlkTG9jYXRpb24sIGV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbnkgb3RoZXIgZXZlbnQgaXMgZmlyZWQgZnJvbSB0aGUgb2JqZWN0LlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2V2ZW50LWNhdGNoQWxsKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge3tba2V5OiBzdHJpbmddOiBhbnksIHR5cGU6IHN0cmluZ319IGV2ZW50LmV2ZW50IFRoZSBPYmplY3QgdGhhdCBjb250YWlucyBldmVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LmV2ZW50LnR5cGUgVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGlzIGNhdWdodCBieSB0aGUgbGlzdGVuZXJcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DYXRjaEFsbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7W2tleTogc3RyaW5nXTogYW55LCB0eXBlOiBzdHJpbmd9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB1c2VyIGNsaWNrcyBpbiBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgYWN0aXZhdGVzIGNvbnRleHRtZW51IGluIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbENvbnRleHRNZW51OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gdXNlciBkb3VibGUgY2xpY2tzIGEgZ3JpZCBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LmdyaWQgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSByb3dcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gdG8gd2hpY2ggdGhlIGNlbGwgYmVsb25nc1xuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbERibENsaWNrOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIGJlZm9yZSB0aGUgY29udGV4dCBtZW51IGlzIHNob3duIGZvciBhIGNlbGwuXG4gICAgICogQWxsb3dzIG1hbmlwdWxhdGlvbiBvZiB0aGUgaXRlbXMgdG8gc2hvdyBpbiB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlIFtwcm9jZXNzSXRlbXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL2ZlYXR1cmUvQ2VsbE1lbnUjY29uZmlnLXByb2Nlc3NJdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjZXZlbnQtY2VsbE1lbnVCZWZvcmVTaG93KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudUJlZm9yZVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uOiBDb2x1bW4sIHJlY29yZDogTW9kZWwgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgZ3JpZCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQgaW4gdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW46IENvbHVtbiwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIGdyaWQgYWZ0ZXIgdGhlIGNvbnRleHQgbWVudSBpcyBzaG93biBmb3IgYSBjZWxsLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+fSBldmVudC5pdGVtcyBNZW51IGl0ZW0gY29uZmlnc1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudVNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW1zOiBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUVudHJ5PiwgY29sdW1uOiBDb2x1bW4sIHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBncmlkIHdoZW4gYSBjaGVjayBpdGVtIGlzIHRvZ2dsZWQgaW4gdGhlIGNlbGwgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnV9IGV2ZW50Lm1lbnUgVGhlIG1lbnVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0Lk1lbnVJdGVtfSBldmVudC5pdGVtIFNlbGVjdGVkIG1lbnUgaXRlbVxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gQ29sdW1uXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoZWNrZWQgQ2hlY2tlZCBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTWVudVRvZ2dsZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIG1lbnU6IE1lbnUsIGl0ZW06IE1lbnVJdGVtLCBjb2x1bW46IENvbHVtbiwgcmVjb3JkOiBNb2RlbCwgY2hlY2tlZDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGEgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgcmVwcmVzZW50aW5nIHRoZSBob3ZlcmVkIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW4gY3VycmVudGx5IGhvdmVyZWRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ2VsbE1vdXNlRW50ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSBjZWxsXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIGNlbGwgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtbiByZXByZXNlbnRpbmcgdGhlIGNlbGwgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LmNlbGxFbGVtZW50IFRoZSBjZWxsIEhUTUwgZWxlbWVudCB0aGF0IHRoZSBtb3VzZSBsZWZ0XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjb2x1bW46IENvbHVtbiwgY2VsbEVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHVzZXIgbW92ZXMgdGhlIG1vdXNlIG91dCBvZiBhIGdyaWQgY2VsbFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIHRvIHdoaWNoIHRoZSBjZWxsIGJlbG9uZ3NcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC50YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNlbGxNb3VzZU91dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIHRhcmdldDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHVzZXIgbW92ZXMgdGhlIG1vdXNlIG92ZXIgYSBncmlkIGNlbGxcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIHJvd1xuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGNvbHVtbiB0byB3aGljaCB0aGUgY2VsbCBiZWxvbmdzXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQudGFyZ2V0IFRoZSB0YXJnZXQgZWxlbWVudFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25DZWxsTW91c2VPdmVyOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JpZDogR3JpZCwgcmVjb3JkOiBNb2RlbCwgY29sdW1uOiBDb2x1bW4sIGNlbGxFbGVtZW50OiBIVE1MRWxlbWVudCwgdGFyZ2V0OiBIVE1MRWxlbWVudCwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBjb2xsYXBzZWQgdXNpbmcgdGhlIFtjb2xsYXBzaWJsZV0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy1jb2xsYXBzaWJsZSkgc2V0dGluZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5QYW5lbH0gZXZlbnQuc291cmNlIFRoaXMgUGFuZWwuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFBhbmVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgYSBwYXJlbnQgbm9kZSByZWNvcmQgaXMgY29sbGFwc2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCB3aGljaCBoYXMgYmVlbiBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sbGFwc2VOb2RlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjb2x1bW4gaXMgYmVpbmcgZHJhZ2dlZCwgYW5kIHlvdSBjYW4gc2V0IHRoZSBgdmFsaWRgIGZsYWcgb24gdGhlIGBjb250ZXh0YCBvYmplY3RcbiAgICAgKiB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkcm9wIHBvc2l0aW9uIGlzIHZhbGlkIG9yIG5vdC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5jb2x1bW4gVGhlIGRyYWdnZWQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5pbnNlcnRCZWZvcmUgVGhlIGNvbHVtbiBiZWZvcmUgd2hpY2ggdGhlIGRyYWdnZWQgY29sdW1uIHdpbGwgYmUgaW5zZXJ0ZWQgKGlmIG5vdCBsYXN0KS5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC52YWxpZCBTZXQgdGhpcyB0byBgdHJ1ZWAgb3IgYGZhbHNlYCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkcm9wIHBvc2l0aW9uIGlzIHZhbGlkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtbkRyYWc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBpbnNlcnRCZWZvcmU6IENvbHVtbiwgZXZlbnQ6IEV2ZW50LCBjb250ZXh0OiB7IHZhbGlkOiBib29sZWFuIH0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIGNvbHVtbiBkcmFnIGdlc3R1cmUgaGFzIHN0YXJ0ZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBkcmFnZ2VkIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5ldmVudCBUaGUgYnJvd3NlciBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db2x1bW5EcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNvbHVtbjogQ29sdW1uLCBldmVudDogRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgaXMgYWx3YXlzIGZpcmVkIGFmdGVyIGEgY29sdW1uIGlzIGRyb3BwZWQuIFRoZSBgdmFsaWRgIHBhcmFtIGlzIGB0cnVlYCBpZiB0aGUgb3BlcmF0aW9uIHdhcyBub3RcbiAgICAgKiB2ZXRvZWQgYW5kIHRoZSBjb2x1bW4gd2FzIG1vdmVkIGluIHRoZSBjb2x1bW4gc3RvcmUuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBkcmFnZ2VkIGNvbHVtbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuaW5zZXJ0QmVmb3JlIFRoZSBjb2x1bW4gYmVmb3JlIHdoaWNoIHRoZSBkcmFnZ2VkIGNvbHVtbiB3aWxsIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSB7R3JpZC5jb2x1bW4uQ29sdW1ufSBldmVudC5uZXdQYXJlbnQgVGhlIG5ldyBwYXJlbnQgY29sdW1uLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQudmFsaWQgYHRydWVgIGlmIHRoZSBvcGVyYXRpb24gd2FzIG5vdCB2ZXRvZWQuXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZXZlbnQgVGhlIGJyb3dzZXIgZXZlbnQuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50LnJlZ2lvbiBUaGUgcmVnaW9uIHdoZXJlIHRoZSBjb2x1bW4gd2FzIGRyb3BwZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uRHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY29sdW1uOiBDb2x1bW4sIGluc2VydEJlZm9yZTogQ29sdW1uLCBuZXdQYXJlbnQ6IENvbHVtbiwgdmFsaWQ6IGJvb2xlYW4sIGV2ZW50OiBFdmVudCwgcmVnaW9uOiBzdHJpbmcgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgcmVzaXplIGdlc3R1cmUgaXMgY29tcGxldGVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSByZXNpemVkIGNvbHVtblxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29sdW1uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjb2x1bW4gcmVzaXplIGdlc3R1cmUgc3RhcnRzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIFRoZSBjb2x1bW5cbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgYnJvd3NlciBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkNvbHVtblJlc2l6ZVN0YXJ0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBjb2x1bW46IENvbHVtbiwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGZpcmVzIG9uIHRoZSBvd25pbmcgd2lkZ2V0IHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSBvd25pbmcgd2lkZ2V0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db250ZXh0TWVudUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyB3aWRnZXQgd2hlbiBhIGNoZWNrIGl0ZW0gaXMgdG9nZ2xlZCBpbiB0aGUgY29udGV4dCBtZW51LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoZSBvd25pbmcgd2lkZ2V0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNoZWNrZWQgQ2hlY2tlZCBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Db250ZXh0TWVudVRvZ2dsZUl0ZW06IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgbWVudTogTWVudSwgaXRlbTogTWVudUl0ZW0sIGNoZWNrZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIG9uIHRoZSBvd25pbmcgR3JpZCBhZnRlciBhIGNvcHkgYWN0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbHMgVGhlIGNlbGxzIGFib3V0IHRvIGJlIGNvcGllZCBvciBjdXRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY29waWVkRGF0YVN0cmluZyBUaGUgY29uY2F0ZW5hdGVkIGRhdGEgc3RyaW5nIHRoYXQgd2FzIGNvcGllZCBvciBjdXRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmlzQ3V0IGB0cnVlYCBpZiB0aGlzIHdhcyBhIGN1dCBhY3Rpb25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuZW50aXR5TmFtZSAnY2VsbCcgdG8gZGlzdGluZ3Vpc2ggdGhpcyBldmVudCBmcm9tIG90aGVyIGNvcHkgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uQ29weTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgY2VsbHM6IEdyaWRMb2NhdGlvbltdLCBjb3BpZWREYXRhU3RyaW5nOiBzdHJpbmcsIGlzQ3V0OiBib29sZWFuLCBlbnRpdHlOYW1lOiBzdHJpbmcgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZGF0YSBpbiB0aGUgc3RvcmUgY2hhbmdlcy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNldmVudC1kYXRhQ2hhbmdlKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duaW5nIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5TdG9yZX0gZXZlbnQuc3RvcmUgVGhlIG9yaWdpbmF0aW5nIHN0b3JlXG4gICAgICogQHBhcmFtIHsncmVtb3ZlJywncmVtb3ZlQWxsJywnYWRkJywnY2xlYXJjaGFuZ2VzJywnZmlsdGVyJywndXBkYXRlJywnZGF0YXNldCcsJ3JlcGxhY2UnfSBldmVudC5hY3Rpb24gTmFtZSBvZiBhY3Rpb24gd2hpY2ggdHJpZ2dlcmVkIHRoZSBjaGFuZ2UuIE1heSBiZSBvbmUgb2Y6ICAqIGAncmVtb3ZlJ2AgKiBgJ3JlbW92ZUFsbCdgICogYCdhZGQnYCAqIGAnY2xlYXJjaGFuZ2VzJ2AgKiBgJ2ZpbHRlcidgICogYCd1cGRhdGUnYCAqIGAnZGF0YXNldCdgICogYCdyZXBsYWNlJ2BcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIENoYW5nZWQgcmVjb3JkLCBmb3IgYWN0aW9ucyB0aGF0IGFmZmVjdHMgZXhhY3RseSBvbmUgcmVjb3JkIChgJ3VwZGF0ZSdgKVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnJlY29yZHMgQ2hhbmdlZCByZWNvcmRzLCBwYXNzZWQgZm9yIGFsbCBhY3Rpb25zIGV4Y2VwdCBgJ3JlbW92ZUFsbCdgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNoYW5nZXMgUGFzc2VkIGZvciB0aGUgYCd1cGRhdGUnYCBhY3Rpb24sIGluZm8gb24gd2hpY2ggcmVjb3JkIGZpZWxkcyBjaGFuZ2VkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGF0YUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3RvcmU6IFN0b3JlLCBhY3Rpb246ICdyZW1vdmUnfCdyZW1vdmVBbGwnfCdhZGQnfCdjbGVhcmNoYW5nZXMnfCdmaWx0ZXInfCd1cGRhdGUnfCdkYXRhc2V0J3wncmVwbGFjZScsIHJlY29yZDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIGNoYW5nZXM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhbiBvYmplY3QgaXMgZGVzdHJveWVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuQmFzZX0gZXZlbnQuc291cmNlIFRoZSBPYmplY3QgdGhhdCBpcyBiZWluZyBkZXN0cm95ZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGVzdHJveTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpZWxkIGlzIG11dGF0ZWQgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgW2hhc0NoYW5nZXNdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9Db250YWluZXIjcHJvcGVydHktaGFzQ2hhbmdlcykgcHJvcGVydHkgY2hhbmdlc1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LkNvbnRhaW5lcn0gZXZlbnQuc291cmNlIFRoZSBjb250YWluZXIuXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5kaXJ0eSBUaGUgZGlydHkgc3RhdGUgb2YgdGhlIENvbnRhaW5lciAtIGB0cnVlYCBpZiB0aGVyZSBhcmUgYW55IGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gY2hhbmdlZCBzaW5jZSBpbml0aWFsIGxvYWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRGlydHlTdGF0ZUNoYW5nZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogQ29udGFpbmVyLCBkaXJ0eTogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hpbGUgZHJhZyBzZWxlY3RpbmcuIFVJIHdpbGwgdXBkYXRlIHdpdGggY3VycmVudCByYW5nZSwgYnV0IHRoZSBjZWxscyB3aWxsIG5vdCBiZSBzZWxlY3RlZCB1bnRpbFxuICAgICAqIG1vdXNlIHVwLiBUaGlzIGV2ZW50IGNhbiBiZSBsaXN0ZW5lZCBmb3IgdG8gcGVyZm9ybSBhY3Rpb25zIHdoaWxlIGRyYWcgc2VsZWN0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge0dyaWRMb2NhdGlvbkNvbmZpZ1tdLEdyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuc2VsZWN0ZWRDZWxscyBUaGUgY2VsbHMgdGhhdCBpcyBjdXJyZW50bHkgYmVpbmcgZHJhZ2dlZCBvdmVyXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuc2VsZWN0ZWRSZWNvcmRzIFRoZSByZWNvcmRzIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGRyYWdnZWQgb3ZlclxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkRyYWdTZWxlY3Rpbmc6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHNlbGVjdGVkQ2VsbHM6IEdyaWRMb2NhdGlvbkNvbmZpZ1tdfEdyaWRMb2NhdGlvbltdLCBzZWxlY3RlZFJlY29yZHM6IE1vZGVsW10gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCB3aGVuIGEgd2lkZ2V0J3MgW2VsZW1lbnRdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjcHJvcGVydHktZWxlbWVudCkgaXMgYXZhaWxhYmxlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5lbGVtZW50IFRoZSBXaWRnZXQncyBlbGVtZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkVsZW1lbnRDcmVhdGVkOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZWxlbWVudDogSFRNTEVsZW1lbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBQYW5lbCBpcyBleHBhbmRlZCB1c2luZyB0aGUgW2NvbGxhcHNpYmxlXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvUGFuZWwjY29uZmlnLWNvbGxhcHNpYmxlKSBzZXR0aW5nLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlBhbmVsfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25FeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFBhbmVsIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciBhIHBhcmVudCBub2RlIHJlY29yZCBpcyBleHBhbmRlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBmaXJpbmcgR3JpZCBpbnN0YW5jZS5cbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgd2hpY2ggaGFzIGJlZW4gZXhwYW5kZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRXhwYW5kTm9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcmVjb3JkOiBNb2RlbCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIGZpbGUgaXMgZHJvcHBlZCBvbiB0aGUgd2lkZ2V0IGVsZW1lbnRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBvd25pbmcgR3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7RGF0YVRyYW5zZmVySXRlbX0gZXZlbnQuZmlsZSBUaGUgZHJvcHBlZCBmaWxlIGRlc2NyaXB0b3JcbiAgICAgKiBAcGFyYW0ge0RyYWdFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG5hdGl2ZSBEcmFnRXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25GaWxlRHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgZmlsZTogRGF0YVRyYW5zZmVySXRlbSwgZG9tRXZlbnQ6IERyYWdFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYmVmb3JlIHRoZSBGaWxsSGFuZGxlIGRyYWdnaW5nIGlzIGZpbmFsaXplZCBhbmQgdmFsdWVzIGFyZSBhcHBsaWVkIHRvIGNlbGxzLCByZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZVxuICAgICAqIGRyYWcgb3BlcmF0aW9uIGZyb20gYXBwbHlpbmcgZGF0YSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmZyb20gVGhlIGZyb20gY2VsbFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQudG8gVGhlIHRvIGNlbGxcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSByYXcgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsbEhhbmRsZUJlZm9yZURyYWdGaW5hbGl6ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGZyb206IEdyaWRMb2NhdGlvbiwgdG86IEdyaWRMb2NhdGlvbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGlsZSBkcmFnZ2luZyB0aGUgRmlsbEhhbmRsZS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5mcm9tIFRoZSBmcm9tIGNlbGxcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LnRvIFRoZSB0byBjZWxsXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5kb21FdmVudCBUaGUgcmF3IERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbGxIYW5kbGVEcmFnOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZnJvbTogR3JpZExvY2F0aW9uLCB0bzogR3JpZExvY2F0aW9uLCBkb21FdmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIEZpbGxIYW5kbGUgZHJhZyBvcGVyYXRpb24gaXMgYWJvcnRlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25GaWxsSGFuZGxlRHJhZ0Fib3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYSBGaWxsSGFuZGxlIGRyYWcgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb259IGV2ZW50LmZyb20gVGhlIGZyb20gY2VsbFxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbn0gZXZlbnQudG8gVGhlIHRvIGNlbGxcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSByYXcgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsbEhhbmRsZURyYWdFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBmcm9tOiBHcmlkTG9jYXRpb24sIHRvOiBHcmlkTG9jYXRpb24sIGRvbUV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGRyYWdnaW5nIG9mIHRoZSBGaWxsSGFuZGxlIHN0YXJ0cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC5jZWxsIEluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2x1bW4gLyByZWNvcmRcbiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSByYXcgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmlsbEhhbmRsZURyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNlbGw6IEdyaWRMb2NhdGlvbiwgZG9tRXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gUHJvbWlzZTxib29sZWFuPnxib29sZWFufHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBjZWxsIGVkaXRpbmcgaXMgZmluaXNoZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBUYXJnZXQgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q2VsbEVkaXRvckNvbnRleHR9IGV2ZW50LmVkaXRvckNvbnRleHQgRWRpdGluZyBjb250ZXh0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uRmluaXNoQ2VsbEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBDZWxsRWRpdG9yQ29udGV4dCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGJlZm9yZSB0aGUgcm93IGVkaXRpbmcgaXMgZmluaXNoZWQsIHJldHVybiBmYWxzZSB0byBzaWduYWwgdGhhdCB0aGUgdmFsdWUgaXMgaW52YWxpZCBhbmQgZWRpdGluZyBzaG91bGQgbm90IGJlIGZpbmFsaXplZC5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNldmVudC1maW5pc2hSb3dFZGl0KVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5ncmlkIFRhcmdldCBncmlkXG4gICAgICogQHBhcmFtIHtSb3dFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkZpbmlzaFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBncmlkOiBHcmlkLCBlZGl0b3JDb250ZXh0OiBSb3dFZGl0b3JDb250ZXh0IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBmb2N1cyBlbnRlcnMgdGhpcyBXaWRnZXQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c0luOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIGZyb21FbGVtZW50OiBIVE1MRWxlbWVudCwgdG9FbGVtZW50OiBIVE1MRWxlbWVudCwgZnJvbVdpZGdldDogV2lkZ2V0LCB0b1dpZGdldDogV2lkZ2V0LCBiYWNrd2FyZHM6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gZm9jdXMgZXhpdHMgdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZS4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBhIGBibHVyYCBldmVudC5cbiAgICAgKiBmb2N1cyBtb3ZpbmcgZnJvbSB3aXRoaW4gdGhpcyBXaWRnZXQncyBvd25lcnNoaXAgdHJlZSwgZXZlbiBpZiB0aGVyZSBhcmUgZmxvYXRpbmcgd2lkZ2V0c1xuICAgICAqIHdpbGwgbm90IHRyaWdnZXIgdGhpcyBldmVudC4gVGhpcyBpcyB3aGVuIGZvY3VzIGV4aXRzIHRoaXMgd2lkZ2V0IGNvbXBsZXRlbHkuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhpcyBXaWRnZXRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5mcm9tRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGV2ZW50LnRvRWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBnYWluZWQgZm9jdXMuXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5XaWRnZXR9IGV2ZW50LmZyb21XaWRnZXQgVGhlIHdpZGdldCB3aGljaCBsb3N0IGZvY3VzLlxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC50b1dpZGdldCBUaGUgd2lkZ2V0IHdoaWNoIGdhaW5lZCBmb2N1cy5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmJhY2t3YXJkcyBgdHJ1ZWAgaWYgdGhlIGB0b0VsZW1lbnRgIGlzIGJlZm9yZSB0aGUgYGZyb21FbGVtZW50YCBpbiBkb2N1bWVudCBvcmRlci5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Gb2N1c091dDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogV2lkZ2V0LCBmcm9tRWxlbWVudDogSFRNTEVsZW1lbnQsIHRvRWxlbWVudDogSFRNTEVsZW1lbnQsIGZyb21XaWRnZXQ6IFdpZGdldCwgdG9XaWRnZXQ6IFdpZGdldCwgYmFja3dhcmRzOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBiZWZvcmUgZHJhZ2dpbmcgc3RhcnRzLCByZXR1cm4gZmFsc2UgdG8gcHJldmVudCB0aGUgZHJhZyBvcGVyYXRpb24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmNvbnRleHQucmVjb3JkcyBUaGUgZHJhZ2dlZCByb3cgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudCxUb3VjaEV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dCZWZvcmVEcmFnU3RhcnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHJlY29yZHM6IE1vZGVsW10gfSwgZXZlbnQ6IE1vdXNlRXZlbnR8VG91Y2hFdmVudCB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIGJlZm9yZSB0aGUgcm93IGRyb3Agb3BlcmF0aW9uIGlzIGZpbmFsaXplZC4gWW91IGNhbiByZXR1cm4gZmFsc2UgdG8gYWJvcnQgdGhlIGRyb3Agb3BlcmF0aW9uLCBvciBhXG4gICAgICogUHJvbWlzZSB5aWVsZGluZyBgdHJ1ZWAgLyBgZmFsc2VgIHdoaWNoIGFsbG93cyBmb3IgYXN5bmNocm9ub3VzIGFib3J0IChlLmcuIGZpcnN0IHNob3cgdXNlciBhIGNvbmZpcm1hdGlvbiBkaWFsb2cpLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkQmFzZX0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmNvbnRleHRcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbnRleHQudmFsaWQgU2V0IHRoaXMgdG8gdHJ1ZSBvciBmYWxzZSB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBkcm9wIHBvc2l0aW9uIGlzIHZhbGlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtSZWNvcmRQb3NpdGlvbkNvbnRleHRbXX0gZXZlbnQuY29udGV4dC5vbGRQb3NpdGlvbkNvbnRleHQgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyB0cmVlIHBvc2l0aW9uLiBPYmplY3RzIGNvbnRhaW4gdGhlIGByZWNvcmRgLCBhbmQgaXRzIG9yaWdpbmFsIGBwYXJlbnRJbmRleGAgYW5kIGBwYXJlbnRJZGAgdmFsdWVzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dCZWZvcmVEcm9wRmluYWxpemU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWRCYXNlLCBjb250ZXh0OiB7IHZhbGlkOiBib29sZWFuLCBpbnNlcnRCZWZvcmU6IE1vZGVsLCBwYXJlbnQ6IE1vZGVsLCByZWNvcmRzOiBNb2RlbFtdLCBvbGRQb3NpdGlvbkNvbnRleHQ6IFJlY29yZFBvc2l0aW9uQ29udGV4dFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hpbGUgdGhlIHJvdyBpcyBiZWluZyBkcmFnZ2VkLCBpbiB0aGUgbGlzdGVuZXIgZnVuY3Rpb24geW91IGhhdmUgYWNjZXNzIHRvIGBjb250ZXh0Lmluc2VydEJlZm9yZWAgYSBncmlkIC9cbiAgICAgKiB0cmVlIHJlY29yZCwgYW5kIGFkZGl0aW9uYWxseSBgY29udGV4dC5wYXJlbnRgIChhIFRyZWVOb2RlKSBmb3IgdHJlZXMuIFlvdSBjYW4gc2lnbmFsIHRoYXQgdGhlIGRyb3AgcG9zaXRpb24gaXNcbiAgICAgKiB2YWxpZCBvciBpbnZhbGlkIGJ5IHNldHRpbmcgYGNvbnRleHQudmFsaWQgPSBmYWxzZTtgXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY29udGV4dC52YWxpZCBTZXQgdGhpcyB0byB0cnVlIG9yIGZhbHNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gaXMgdmFsaWQuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkdyaWRSb3dEcmFnOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyB2YWxpZDogYm9vbGVhbiwgaW5zZXJ0QmVmb3JlOiBNb2RlbCwgcGFyZW50OiBNb2RlbCwgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiBhIHJvdyBkcmFnIG9wZXJhdGlvbiBpcyBhYm9ydGVkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5zb3VyY2VcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQuY29udGV4dFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LmNvbnRleHQucmVjb3JkcyBUaGUgZHJhZ2dlZCByb3cgcmVjb3Jkc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJhZ0Fib3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkQmFzZSwgY29udGV4dDogeyByZWNvcmRzOiBNb2RlbFtdIH0sIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50LFRvdWNoRXZlbnR9IGV2ZW50LmV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uR3JpZFJvd0RyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgcmVjb3JkczogTW9kZWxbXSB9LCBldmVudDogTW91c2VFdmVudHxUb3VjaEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBhZnRlciB0aGUgcm93IGRyb3Agb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQsIHJlZ2FyZGxlc3Mgb2YgdmFsaWRpdHlcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZEJhc2V9IGV2ZW50LnNvdXJjZVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5jb250ZXh0XG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb250ZXh0LnZhbGlkIHRydWUgb3IgZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGRyb3AgcG9zaXRpb24gd2FzIHZhbGlkXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQuaW5zZXJ0QmVmb3JlIFRoZSByZWNvcmQgdG8gaW5zZXJ0IGJlZm9yZSAoYG51bGxgIGlmIGluc2VydGluZyBhdCBsYXN0IHBvc2l0aW9uIG9mIGEgcGFyZW50IG5vZGUpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LmNvbnRleHQucGFyZW50IFRoZSBwYXJlbnQgcmVjb3JkIG9mIHRoZSBjdXJyZW50IGRyb3AgcG9zaXRpb24gKG9ubHkgYXBwbGljYWJsZSBmb3IgdHJlZXMpXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuY29udGV4dC5yZWNvcmRzIFRoZSBkcmFnZ2VkIHJvdyByZWNvcmRzXG4gICAgICogQHBhcmFtIHtSZWNvcmRQb3NpdGlvbkNvbnRleHRbXX0gZXZlbnQuY29udGV4dC5vbGRQb3NpdGlvbkNvbnRleHQgQW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcmV2aW91cyB0cmVlIHBvc2l0aW9uLiBPYmplY3RzIGNvbnRhaW4gdGhlIHJlY29yZCwgYW5kIGl0cyBvcmlnaW5hbCBgcGFyZW50SW5kZXhgIGFuZCBgcGFyZW50SWRgIHZhbHVlc1xuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25HcmlkUm93RHJvcDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZEJhc2UsIGNvbnRleHQ6IHsgdmFsaWQ6IGJvb2xlYW4sIGluc2VydEJlZm9yZTogTW9kZWwsIHBhcmVudDogTW9kZWwsIHJlY29yZHM6IE1vZGVsW10sIG9sZFBvc2l0aW9uQ29udGV4dDogUmVjb3JkUG9zaXRpb25Db250ZXh0W10gfSwgZXZlbnQ6IE1vdXNlRXZlbnQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBncmlkIGhlYWRlciBpcyBjbGlja2VkIG9uLlxuICAgICAqIC4uLlxuICAgICAqIFtWaWV3IG9ubGluZSBkb2NzLi4uXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC92aWV3L0dyaWRCYXNlI2V2ZW50LWhlYWRlckNsaWNrKVxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgdHJpZ2dlcmluZyBET00gZXZlbnQuXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIGNsaWNrZWQgb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uSGVhZGVyQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBkb21FdmVudDogRXZlbnQsIGNvbHVtbjogQ29sdW1uIH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgYmVmb3JlIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGEgaGVhZGVyLlxuICAgICAqIEFsbG93cyBtYW5pcHVsYXRpb24gb2YgdGhlIGl0ZW1zIHRvIHNob3cgaW4gdGhlIHNhbWUgd2F5IGFzIGluIHRoZSBbcHJvY2Vzc0l0ZW1zXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvR3JpZC9mZWF0dXJlL0hlYWRlck1lbnUjY29uZmlnLXByb2Nlc3NJdGVtcykuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjZXZlbnQtaGVhZGVyTWVudUJlZm9yZVNob3cpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJNZW51QmVmb3JlU2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiB9KSA9PiBQcm9taXNlPGJvb2xlYW4+fGJvb2xlYW58dm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gYW4gaXRlbSBpcyBzZWxlY3RlZCBpbiB0aGUgaGVhZGVyIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhlYWRlck1lbnVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uOiBDb2x1bW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIHRoZSBjb250ZXh0IG1lbnUgaXMgc2hvd24gZm9yIGEgaGVhZGVyXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuTWVudX0gZXZlbnQubWVudSBUaGUgbWVudVxuICAgICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgTWVudUl0ZW1FbnRyeT59IGV2ZW50Lml0ZW1zIE1lbnUgaXRlbSBjb25maWdzXG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBDb2x1bW5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25IZWFkZXJNZW51U2hvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgbWVudTogTWVudSwgaXRlbXM6IFJlY29yZDxzdHJpbmcsIE1lbnVJdGVtRW50cnk+LCBjb2x1bW46IENvbHVtbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVGhpcyBldmVudCBmaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBhIGNoZWNrIGl0ZW0gaXMgdG9nZ2xlZCBpbiB0aGUgaGVhZGVyIGNvbnRleHQgbWVudS5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkXG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51fSBldmVudC5tZW51IFRoZSBtZW51XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5NZW51SXRlbX0gZXZlbnQuaXRlbSBTZWxlY3RlZCBtZW51IGl0ZW1cbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQuY29sdW1uIENvbHVtblxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuY2hlY2tlZCBDaGVja2VkIG9yIG5vdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhlYWRlck1lbnVUb2dnbGVJdGVtOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCBtZW51OiBNZW51LCBpdGVtOiBNZW51SXRlbSwgY29sdW1uOiBDb2x1bW4sIGNoZWNrZWQ6IGJvb2xlYW4gfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRyaWdnZXJlZCBhZnRlciBhIHdpZGdldCB3YXMgaGlkZGVuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvbkhpZGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiByb3cgbG9ja2luZyBpcyBlbmFibGVkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkQmFzZX0gZXZlbnQuY2xvbmUgVGhlIGNyZWF0ZWQgY2xvbmVcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Mb2NrUm93czogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGNsb25lOiBHcmlkQmFzZSB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogTW91c2UgbW92ZWQgb3V0IGZyb20gZWxlbWVudCBpbiBncmlkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBicm93c2VyIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uTW91c2VPdXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogTW91c2UgbW92ZWQgaW4gb3ZlciBlbGVtZW50IGluIGdyaWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIGJyb3dzZXIgZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Nb3VzZU92ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBldmVudDogTW91c2VFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogVHJpZ2dlcmVkIHdoZW4gYSB3aWRnZXQgd2hpY2ggaGFkIGJlZW4gaW4gYSBub24tdmlzaWJsZSBzdGF0ZSBmb3IgYW55IHJlYXNvblxuICAgICAqIGFjaGlldmVzIHZpc2liaWxpdHkuXG4gICAgICogLi4uXG4gICAgICogW1ZpZXcgb25saW5lIGRvY3MuLi5dKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvR3JpZEJhc2UjZXZlbnQtcGFpbnQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldCBiZWluZyBwYWludGVkLlxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZXZlbnQuZmlyc3RQYWludCBgdHJ1ZWAgaWYgdGhpcyBpcyB0aGUgZmlyc3QgcGFpbnQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFpbnQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCwgZmlyc3RQYWludDogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIGFmdGVyIGEgcGFzdGUgYWN0aW9uIGlzIHBlcmZvcm1lZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQuY2xpcGJvYXJkRGF0YSBUaGUgY2xpcGJvYXJkRGF0YSB0aGF0IHdhcyBwYXN0ZWRcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbFtdfSBldmVudC5tb2RpZmllZFJlY29yZHMgVGhlIHJlY29yZHMgd2hpY2ggaGF2ZSBiZWVuIG1vZGlmaWVkIGR1ZSB0byB0aGUgcGFzdGUgYWN0aW9uXG4gICAgICogQHBhcmFtIHtHcmlkLnV0aWwuR3JpZExvY2F0aW9ufSBldmVudC50YXJnZXRDZWxsIFRoZSBjZWxsIGZyb20gd2hpY2ggdGhlIHBhc3RlIHdpbGwgYmUgc3RhcnRlZFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudC5lbnRpdHlOYW1lICdjZWxsJyB0byBkaXN0aW5ndWlzaCB0aGlzIGV2ZW50IGZyb20gb3RoZXIgcGFzdGUgZXZlbnRzXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGFzdGU6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGNsaXBib2FyZERhdGE6IHN0cmluZywgbW9kaWZpZWRSZWNvcmRzOiBNb2RlbFtdLCB0YXJnZXRDZWxsOiBHcmlkTG9jYXRpb24sIGVudGl0eU5hbWU6IHN0cmluZyB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gZXhwb3J0IGhhcyBmaW5pc2hlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge1Jlc3BvbnNlfSBldmVudC5yZXNwb25zZSBPcHRpb25hbCByZXNwb25zZSwgaWYgcmVjZWl2ZWRcbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBldmVudC5lcnJvciBPcHRpb25hbCBlcnJvciwgaWYgZXhjZXB0aW9uIG9jY3VycmVkXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUGRmRXhwb3J0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgcmVzcG9uc2U/OiBhbnksIGVycm9yPzogRXJyb3IgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gYSBXaWRnZXQncyByZWFkIG9ubHkgc3RhdGUgaXMgdG9nZ2xlZFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LnJlYWRPbmx5IFJlYWQgb25seSBvciBub3RcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZWFkT25seTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlYWRPbmx5OiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IGlzIGZpcmVkIGFmdGVyIGEgd2lkZ2V0J3MgZWxlbWVudHMgaGF2ZSBiZWVuIHN5bmNocm9uaXplZCBkdWUgdG8gYSBkaXJlY3Qgb3IgaW5kaXJlY3QgY2FsbFxuICAgICAqIHRvIFtyZWNvbXBvc2VdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9Db3JlL3dpZGdldC9XaWRnZXQjZnVuY3Rpb24tcmVjb21wb3NlKSwgaWYgdGhpcyByZXN1bHRzIGluIHNvbWUgY2hhbmdlIHRvIHRoZSB3aWRnZXQncyByZW5kZXJlZCBET00gZWxlbWVudHMuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVjb21wb3NlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgYWZ0ZXIgYSByb3cgaXMgcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnJvdy5Sb3d9IGV2ZW50LnJvdyBUaGUgcm93IHRoYXQgaGFzIGJlZW4gcmVuZGVyZWQuXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIGZvciB0aGUgcm93LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC5yZWNvcmRJbmRleCBUaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgcmVjb3JkLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJlbmRlclJvdzogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgcm93OiBSb3csIHJlY29yZDogTW9kZWwsIHJlY29yZEluZGV4OiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEdyaWQgcm93cyBoYXZlIGJlZW4gcmVuZGVyZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoaXMgZ3JpZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25SZW5kZXJSb3dzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBlbmNhcHN1bGF0aW5nIGVsZW1lbnQgb2YgYSBXaWRnZXQgcmVzaXplcyAqb25seSB3aGVuIFttb25pdG9yUmVzaXplXShodHRwczovL2JyeW50dW0uY29tL3Byb2R1Y3RzL2dyaWQvZG9jcy9hcGkvQ29yZS93aWRnZXQvV2lkZ2V0I2NvbmZpZy1tb25pdG9yUmVzaXplKSBpcyBgdHJ1ZWAqLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQuc291cmNlIFRoaXMgV2lkZ2V0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LndpZHRoIFRoZSBuZXcgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQuaGVpZ2h0IFRoZSBuZXcgaGVpZ2h0XG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50Lm9sZFdpZHRoIFRoZSBvbGQgd2lkdGhcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkSGVpZ2h0IFRoZSBvbGQgaGVpZ2h0XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzaXplOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBXaWRnZXQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLCBvbGRXaWR0aDogbnVtYmVyLCBvbGRIZWlnaHQ6IG51bWJlciB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogR3JpZCByZXNpemUgbGVhZCB0byBhIG5ldyByZXNwb25zaXZlIGxldmVsIGJlaW5nIGFwcGxpZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuZ3JpZCBHcmlkIHRoYXQgd2FzIHJlc2l6ZWRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQubGV2ZWwgTmV3IHJlc3BvbnNpdmUgbGV2ZWwgKHNtYWxsLCBsYXJnZSwgZXRjKVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBldmVudC53aWR0aCBOZXcgd2lkdGggaW4gcHhcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQub2xkTGV2ZWwgT2xkIHJlc3BvbnNpdmUgbGV2ZWxcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gZXZlbnQub2xkV2lkdGggT2xkIHdpZHRoIGluIHB4XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uUmVzcG9uc2l2ZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IGdyaWQ6IEdyaWQsIGxldmVsOiBzdHJpbmcsIHdpZHRoOiBudW1iZXIsIG9sZExldmVsOiBzdHJpbmcsIG9sZFdpZHRoOiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiBhIHJvdyBoYXMgZmluaXNoZWQgY29sbGFwc2luZy5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBSZWNvcmRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dDb2xsYXBzZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZXZlbnQgZmlyZXMgd2hlbiBhIHJvdyBleHBhbmQgaGFzIGZpbmlzaGVkIGV4cGFuZGluZy5cbiAgICAgKiAuLi5cbiAgICAgKiBbVmlldyBvbmxpbmUgZG9jcy4uLl0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0dyaWQvdmlldy9HcmlkQmFzZSNldmVudC1yb3dFeHBhbmQpXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgUmVjb3JkXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50LmV4cGFuZGVkRWxlbWVudHMgQW4gb2JqZWN0IHdpdGggdGhlIEdyaWQgcmVnaW9uIG5hbWUgYXMgcHJvcGVydHkgYW5kIHRoZSBleHBhbmRlZCBib2R5IGVsZW1lbnQgYXMgdmFsdWVcbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LldpZGdldH0gZXZlbnQud2lkZ2V0IEluIGNhc2Ugb2YgZXhwYW5kaW5nIGEgV2lkZ2V0LCB0aGlzIHdpbGwgYmUgYSByZWZlcmVuY2UgdG8gdGhlIGluc3RhbmNlIGNyZWF0ZWQgYnkgdGhlIGFjdHVhbCBleHBhbnNpb24uIElmIHRoZXJlIGlzIG11bHRpcGxlIEdyaWQgcmVnaW9ucywgdXNlIHRoZSBgd2lkZ2V0c2AgcGFyYW0gaW5zdGVhZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQud2lkZ2V0cyBJbiBjYXNlIG9mIGV4cGFuZGluZyBhIFdpZGdldCwgdGhpcyB3aWxsIGJlIGFuIG9iamVjdCB3aXRoIHRoZSBHcmlkIHJlZ2lvbiBuYW1lIGFzIHByb3BlcnR5IGFuZCB0aGUgcmVmZXJlbmNlIHRvIHRoZSB3aWRnZXQgaW5zdGFuY2UgY3JlYXRlZCBieSB0aGUgYWN0dWFsIGV4cGFuc2lvblxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd0V4cGFuZDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGV4cGFuZGVkRWxlbWVudHM6IG9iamVjdCwgd2lkZ2V0OiBXaWRnZXQsIHdpZGdldHM6IG9iamVjdCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgd2hlbiB0aGUgbW91c2UgZW50ZXJzIGEgcm93XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZ3JpZCBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsfSBldmVudC5yZWNvcmQgVGhlIHJlY29yZCByZXByZXNlbnRpbmcgdGhlIGhvdmVyZWQgcm93XG4gICAgICogQHBhcmFtIHtHcmlkLmNvbHVtbi5Db2x1bW59IGV2ZW50LmNvbHVtbiBUaGUgY29sdW1uIGN1cnJlbnRseSBob3ZlcmVkXG4gICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZXZlbnQuY2VsbEVsZW1lbnQgVGhlIGNlbGwgSFRNTCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBldmVudC5ldmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblJvd01vdXNlRW50ZXI6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHJlY29yZDogTW9kZWwsIGNvbHVtbjogQ29sdW1uLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCB3aGVuIHRoZSBtb3VzZSBsZWF2ZXMgYSByb3dcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBncmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50LnJlY29yZCBUaGUgcmVjb3JkIHJlcHJlc2VudGluZyB0aGUgcm93IHRoYXQgdGhlIG1vdXNlIGxlZnRcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBldmVudC5jZWxsRWxlbWVudCBUaGUgY2VsbCBIVE1MIGVsZW1lbnQgdGhhdCB0aGUgbW91c2UgbGVmdFxuICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXZlbnQuZXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Sb3dNb3VzZUxlYXZlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc291cmNlOiBHcmlkLCByZWNvcmQ6IE1vZGVsLCBjZWxsRWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50OiBNb3VzZUV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBHcmlkIGhhcyBzY3JvbGxlZCB2ZXJ0aWNhbGx5XG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGV2ZW50LnNjcm9sbFRvcCBUaGUgdmVydGljYWwgc2Nyb2xsIHBvc2l0aW9uLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNjcm9sbDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc2Nyb2xsVG9wOiBudW1iZXIgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWxlY3Rpb24gaGFzIGJlZW4gY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHsnc2VsZWN0JywnZGVzZWxlY3QnfSBldmVudC5hY3Rpb24gYCdzZWxlY3QnYC9gJ2Rlc2VsZWN0J2BcbiAgICAgKiBAcGFyYW0geydyb3cnLCdjZWxsJ30gZXZlbnQubW9kZSBgJ3JvdydgL2AnY2VsbCdgXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlXG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWxbXX0gZXZlbnQuZGVzZWxlY3RlZCBUaGUgcmVjb3JkcyBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGVkIFRoZSByZWNvcmRzIHNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50LnNlbGVjdGlvbiBUaGUgcmVjb3JkcyBpbiB0aGUgbmV3IHNlbGVjdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuZGVzZWxlY3RlZENlbGxzIFRoZSBjZWxscyBkZXNlbGVjdGVkIGluIHRoaXMgb3BlcmF0aW9uLlxuICAgICAqIEBwYXJhbSB7R3JpZC51dGlsLkdyaWRMb2NhdGlvbltdfSBldmVudC5zZWxlY3RlZENlbGxzIFRoZSBjZWxscyBzZWxlY3RlZCBpbiB0aGlzIG9wZXJhdGlvbi5cbiAgICAgKiBAcGFyYW0ge0dyaWQudXRpbC5HcmlkTG9jYXRpb25bXX0gZXZlbnQuY2VsbFNlbGVjdGlvbiBUaGUgY2VsbHMgaW4gdGhlIG5ldyBzZWxlY3Rpb24uXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0aW9uQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgYWN0aW9uOiAnc2VsZWN0J3wnZGVzZWxlY3QnLCBtb2RlOiAncm93J3wnY2VsbCcsIHNvdXJjZTogR3JpZCwgZGVzZWxlY3RlZDogTW9kZWxbXSwgc2VsZWN0ZWQ6IE1vZGVsW10sIHNlbGVjdGlvbjogTW9kZWxbXSwgZGVzZWxlY3RlZENlbGxzOiBHcmlkTG9jYXRpb25bXSwgc2VsZWN0ZWRDZWxsczogR3JpZExvY2F0aW9uW10sIGNlbGxTZWxlY3Rpb246IEdyaWRMb2NhdGlvbltdIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VsZWN0aW9uTW9kZSBjb25maWd1cmF0aW9uIGhhcyBiZWVuIGNoYW5nZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudC5zZWxlY3Rpb25Nb2RlIFRoZSBuZXcgW3NlbGVjdGlvbk1vZGVdKGh0dHBzOi8vYnJ5bnR1bS5jb20vcHJvZHVjdHMvZ3JpZC9kb2NzL2FwaS9HcmlkL3ZpZXcvbWl4aW4vR3JpZFNlbGVjdGlvbiNjb25maWctc2VsZWN0aW9uTW9kZSlcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TZWxlY3Rpb25Nb2RlQ2hhbmdlOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc2VsZWN0aW9uTW9kZTogb2JqZWN0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBUcmlnZ2VyZWQgYWZ0ZXIgYSB3aWRnZXQgaXMgc2hvd24uXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7Q29yZS53aWRnZXQuV2lkZ2V0fSBldmVudC5zb3VyY2UgVGhlIHdpZGdldFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNob3c6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFdpZGdldCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBzcGxpdHRpbmcgdGhlIEdyaWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlW119IGV2ZW50LnN1YlZpZXdzIFRoZSBzdWIgdmlld3MgY3JlYXRlZCBieSB0aGUgc3BsaXRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQub3B0aW9ucyBUaGUgb3B0aW9ucyBwYXNzZWQgdG8gdGhlIHNwbGl0IGNhbGxcbiAgICAgKiBAcGFyYW0geydob3Jpem9udGFsJywndmVydGljYWwnLCdib3RoJ30gZXZlbnQub3B0aW9ucy5kaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiBvZiB0aGUgc3BsaXRcbiAgICAgKiBAcGFyYW0ge0dyaWQuY29sdW1uLkNvbHVtbn0gZXZlbnQub3B0aW9ucy5hdENvbHVtbiBUaGUgY29sdW1uIHRvIHNwbGl0IGF0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50Lm9wdGlvbnMuYXRSZWNvcmQgVGhlIHJlY29yZCB0byBzcGxpdCBhdFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgc3ViVmlld3M6IEdyaWRCYXNlW10sIG9wdGlvbnM6IHsgZGlyZWN0aW9uOiAnaG9yaXpvbnRhbCd8J3ZlcnRpY2FsJ3wnYm90aCcsIGF0Q29sdW1uOiBDb2x1bW4sIGF0UmVjb3JkOiBNb2RlbCB9IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCB3aGVuIHRoZSBjb2xsYXBzZSBpY29uIGlzIGNsaWNrZWQuIFJldHVybiBgZmFsc2VgIHRvIHByZXZlbnQgdGhlIGRlZmF1bHQgY29sbGFwc2UgYWN0aW9uLFxuICAgICAqIGlmIHlvdSB3YW50IHRvIGltcGxlbWVudCB5b3VyIG93biBiZWhhdmlvci5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIFRoZSBHcmlkIGluc3RhbmNlLlxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LlN1YkdyaWR9IGV2ZW50LnN1YkdyaWQgVGhlIHN1YmdyaWRcbiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudC5kb21FdmVudCBUaGUgbmF0aXZlIERPTSBldmVudFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblNwbGl0dGVyQ29sbGFwc2VDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYnkgdGhlIEdyaWQgYWZ0ZXIgYSBzdWItZ3JpZCBoYXMgYmVlbiByZXNpemVkIHVzaW5nIHRoZSBzcGxpdHRlclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgcmVzaXplZCBzdWJncmlkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TcGxpdHRlckRyYWdFbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHN1YkdyaWQ6IFN1YkdyaWQsIGRvbUV2ZW50OiBFdmVudCB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYnkgdGhlIEdyaWQgd2hlbiBhIHN1Yi1ncmlkIHJlc2l6ZSBnZXN0dXJlIHN0YXJ0c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgc3ViZ3JpZCBhYm91dCB0byBiZSByZXNpemVkXG4gICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQuZG9tRXZlbnQgVGhlIG5hdGl2ZSBET00gZXZlbnRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TcGxpdHRlckRyYWdTdGFydDogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlZCBieSB0aGUgR3JpZCB3aGVuIHRoZSBleHBhbmQgaWNvbiBpcyBjbGlja2VkLiBSZXR1cm4gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBkZWZhdWx0IGV4cGFuZCBhY3Rpb24sXG4gICAgICogaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IHlvdXIgb3duIGJlaGF2aW9yLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIEdyaWQgaW5zdGFuY2UuXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgc3ViZ3JpZFxuICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50LmRvbUV2ZW50IFRoZSBuYXRpdmUgRE9NIGV2ZW50XG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uU3BsaXR0ZXJFeHBhbmRDbGljazogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHNvdXJjZTogR3JpZCwgc3ViR3JpZDogU3ViR3JpZCwgZG9tRXZlbnQ6IEV2ZW50IH0pID0+IFByb21pc2U8Ym9vbGVhbj58Ym9vbGVhbnx2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZXMgb24gdGhlIG93bmluZyBHcmlkIHdoZW4gZWRpdGluZyBzdGFydHNcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuR3JpZH0gZXZlbnQuc291cmNlIE93bmVyIGdyaWRcbiAgICAgKiBAcGFyYW0ge0NlbGxFZGl0b3JDb250ZXh0fSBldmVudC5lZGl0b3JDb250ZXh0IEVkaXRpbmcgY29udGV4dFxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN0YXJ0Q2VsbEVkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IENlbGxFZGl0b3JDb250ZXh0IH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyBvbiB0aGUgb3duaW5nIEdyaWQgd2hlbiBlZGl0aW5nIHN0YXJ0c1xuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgT3duZXIgZ3JpZFxuICAgICAqIEBwYXJhbSB7Um93RWRpdG9yQ29udGV4dH0gZXZlbnQuZWRpdG9yQ29udGV4dCBFZGl0aW5nIGNvbnRleHRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TdGFydFJvd0VkaXQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIGVkaXRvckNvbnRleHQ6IFJvd0VkaXRvckNvbnRleHQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIGEgc3ViIGdyaWQgaXMgY29sbGFwc2VkLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5HcmlkfSBldmVudC5zb3VyY2UgVGhlIGZpcmluZyBHcmlkIGluc3RhbmNlXG4gICAgICogQHBhcmFtIHtHcmlkLnZpZXcuU3ViR3JpZH0gZXZlbnQuc3ViR3JpZCBUaGUgc3ViIGdyaWQgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25TdWJHcmlkQ29sbGFwc2U6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHN1YkdyaWQ6IFN1YkdyaWQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIGFmdGVyIGEgc3ViIGdyaWQgaXMgZXhwYW5kZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWR9IGV2ZW50LnNvdXJjZSBUaGUgZmlyaW5nIEdyaWQgaW5zdGFuY2VcbiAgICAgKiBAcGFyYW0ge0dyaWQudmlldy5TdWJHcmlkfSBldmVudC5zdWJHcmlkIFRoZSBzdWIgZ3JpZCBpbnN0YW5jZVxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblN1YkdyaWRFeHBhbmQ6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IEdyaWQsIHN1YkdyaWQ6IFN1YkdyaWQgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVkIHdoZW4gb25lIG9yIG1vcmUgZ3JvdXBzIGFyZSBleHBhbmRlZCBvciBjb2xsYXBzZWRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLmRhdGEuTW9kZWx9IGV2ZW50Lmdyb3VwUmVjb3JkIFtERVBSRUNBVEVEXSBVc2UgYGdyb3VwUmVjb3Jkc2AgcGFyYW0gaW5zdGVhZFxuICAgICAqIEBwYXJhbSB7Q29yZS5kYXRhLk1vZGVsW119IGV2ZW50Lmdyb3VwUmVjb3JkcyBUaGUgZ3JvdXAgcmVjb3JkcyBiZWluZyB0b2dnbGVkXG4gICAgICogQHBhcmFtIHtib29sZWFufSBldmVudC5jb2xsYXBzZSBDb2xsYXBzZWQgKHRydWUpIG9yIGV4cGFuZGVkIChmYWxzZSlcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmFsbFJlY29yZHMgVHJ1ZSBpZiB0aGlzIGV2ZW50IGlzIHBhcnQgb2YgdG9nZ2xpbmcgYWxsIGdyb3Vwc1xuICAgICAqL1xuICAgIEBPdXRwdXQoKSBvblRvZ2dsZUdyb3VwOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgZ3JvdXBSZWNvcmQ6IE1vZGVsLCBncm91cFJlY29yZHM6IE1vZGVsW10sIGNvbGxhcHNlOiBib29sZWFuLCBhbGxSZWNvcmRzPzogYm9vbGVhbiB9KSA9PiB2b2lkKXxzdHJpbmc+KCk7XG4gICAgLyoqXG4gICAgICogRmlyZWQgYWZ0ZXIgYSBwYXJlbnQgbm9kZSByZWNvcmQgdG9nZ2xlcyBpdHMgY29sbGFwc2VkIHN0YXRlLlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICAgKiBAcGFyYW0ge0NvcmUuZGF0YS5Nb2RlbH0gZXZlbnQucmVjb3JkIFRoZSByZWNvcmQgYmVpbmcgdG9nZ2xlZC5cbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGV2ZW50LmNvbGxhcHNlIGB0cnVlYCBpZiB0aGUgbm9kZSBpcyBiZWluZyBjb2xsYXBzZWQuXG4gICAgICovXG4gICAgQE91dHB1dCgpIG9uVG9nZ2xlTm9kZTogYW55ID0gbmV3IEV2ZW50RW1pdHRlcjwoKGV2ZW50OiB7IHJlY29yZDogTW9kZWwsIGNvbGxhcHNlOiBib29sZWFuIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBBIGhlYWRlciBbdG9vbF0oaHR0cHM6Ly9icnludHVtLmNvbS9wcm9kdWN0cy9ncmlkL2RvY3MvYXBpL0NvcmUvd2lkZ2V0L1BhbmVsI2NvbmZpZy10b29scykgaGFzIGJlZW4gY2xpY2tlZC5cbiAgICAgKiBAcGFyYW0ge29iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAgICogQHBhcmFtIHtDb3JlLndpZGdldC5Ub29sfSBldmVudC5zb3VyY2UgVGhpcyBQYW5lbC5cbiAgICAgKiBAcGFyYW0ge0NvcmUud2lkZ2V0LlRvb2x9IGV2ZW50LnRvb2wgVGhlIHRvb2wgd2hpY2ggaXMgYmVpbmcgY2xpY2tlZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25Ub29sQ2xpY2s6IGFueSA9IG5ldyBFdmVudEVtaXR0ZXI8KChldmVudDogeyBzb3VyY2U6IFRvb2wsIHRvb2w6IFRvb2wgfSkgPT4gdm9pZCl8c3RyaW5nPigpO1xuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gcm93IGxvY2tpbmcgaXMgZGlzYWJsZWQuXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgICAqIEBwYXJhbSB7R3JpZC52aWV3LkdyaWRCYXNlfSBldmVudC5jbG9uZSBUaGUgbG9ja2VkIGNsb25lIHRoYXQgd2lsbCBiZSBkZXN0cm95ZWRcbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25VbmxvY2tSb3dzOiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoZXZlbnQ6IHsgY2xvbmU6IEdyaWRCYXNlIH0pID0+IHZvaWQpfHN0cmluZz4oKTtcbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIHVuLXNwbGl0dGluZyB0aGUgR3JpZC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgb25VbnNwbGl0OiBhbnkgPSBuZXcgRXZlbnRFbWl0dGVyPCgoKSA9PiB2b2lkKXxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW5kIGFwcGVuZCB0aGUgdW5kZXJseWluZyB3aWRnZXRcbiAgICAgKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIG1lID0gdGhpcyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWdcbiAgICAgICAgICAgIH0gPSBtZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbnN0YW5jZUNsYXNzLFxuICAgICAgICAgICAgICAgIGluc3RhbmNlTmFtZSxcbiAgICAgICAgICAgICAgICBicnludHVtQ29uZmlncyxcbiAgICAgICAgICAgICAgICBicnludHVtRXZlbnRzXG4gICAgICAgICAgICB9ID0gQnJ5bnR1bUdyaWRCYXNlQ29tcG9uZW50O1xuXG4gICAgICAgIGJyeW50dW1Db25maWdzLmZpbHRlcihwcm9wID0+IHByb3AgaW4gdGhpcykuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuYXBwbHlQcm9wVmFsdWUoYnJ5bnR1bUNvbmZpZywgcHJvcCwgdGhpc1twcm9wXSk7XG4gICAgICAgICAgICBpZiAoWydmZWF0dXJlcycsICdjb25maWcnXS5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgICAgICAgICAgIFdyYXBwZXJIZWxwZXIuZGV2V2FybmluZ0NvbmZpZ1Byb3AoaW5zdGFuY2VOYW1lLCBwcm9wKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgYnJ5bnR1bUV2ZW50cy5maWx0ZXIoZXZlbnQgPT4gdGhpc1tldmVudF0gJiYgdGhpc1tldmVudF0ub2JzZXJ2ZXJzLmxlbmd0aCA+IDApLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICAgICAgY29uc3RcbiAgICAgICAgICAgICAgICB1bmNhcGl0YWxpemUgPSAoc3RyOiBzdHJpbmcpID0+IHN0ci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIHN0ci5zbGljZSgxKSxcbiAgICAgICAgICAgICAgICBldmVudE5hbWUgPSAoc3RyOiBzdHJpbmcpID0+IHVuY2FwaXRhbGl6ZShzdHIuc2xpY2UoMikpO1xuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBicnludHVtQ29uZmlnLmxpc3RlbmVyc1tldmVudE5hbWUoZXZlbnQpXSA9IGUgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBtZVtldmVudF0uZW1pdChlKTtcbiAgICAgICAgICAgICAgICAvLyBFdmVudEVtaXR0ZXIgZG9lcyBub3QgcmV0dXJuIHZhbHVlcyBpbiB0aGUgbm9ybWFsIHdheSwgd29yayBhcm91bmQgaXQgYnkgc2V0dGluZyBgcmV0dXJuVmFsdWVgIGZsYWdcbiAgICAgICAgICAgICAgICAvLyBpbiBBbmd1bGFyIGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIHJldHVybiBlLnJldHVyblZhbHVlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSWYgY29tcG9uZW50IGhhcyBubyBjb250YWluZXIgc3BlY2lmaWVkIGluIGNvbmZpZyB0aGVuIHVzZSBhZG9wdCB0byBXcmFwcGVyJ3MgZWxlbWVudFxuICAgICAgICBjb25zdFxuICAgICAgICAgICAgY29udGFpbmVyUGFyYW0gPSBbXG4gICAgICAgICAgICAgICAgJ2Fkb3B0JyxcbiAgICAgICAgICAgICAgICAnYXBwZW5kVG8nLFxuICAgICAgICAgICAgICAgICdpbnNlcnRBZnRlcicsXG4gICAgICAgICAgICAgICAgJ2luc2VydEJlZm9yZSdcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBdLmZpbmQocHJvcCA9PiBicnludHVtQ29uZmlnW3Byb3BdKTtcbiAgICAgICAgaWYgKCFjb250YWluZXJQYXJhbSkge1xuICAgICAgICAgICAgaWYgKGluc3RhbmNlTmFtZSA9PT0gJ0J1dHRvbicgfHwgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldFJvb3ROb2RlKCkgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgLy8gQnV0dG9uIHNob3VsZCBhbHdheXMgYmUgPGE+IG9yIDxidXR0b24+IGluc2lkZSBvd25lciBlbGVtZW50XG4gICAgICAgICAgICAgICAgYnJ5bnR1bUNvbmZpZy5hcHBlbmRUbyA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyeW50dW1Db25maWcuYWRvcHQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBXcmFwcGVySGVscGVyLmRldldhcm5pbmdDb250YWluZXIoaW5zdGFuY2VOYW1lLCBjb250YWluZXJQYXJhbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lLmluc3RhbmNlID0gaW5zdGFuY2VOYW1lID09PSAnV2lkZ2V0JyA/IFdpZGdldC5jcmVhdGUoYnJ5bnR1bUNvbmZpZykgOiBuZXcgaW5zdGFuY2VDbGFzcyhicnludHVtQ29uZmlnKTtcblxuICAgICAgICAvLyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgZ3JpZEluc3RhbmNlLCBzY2hlZHVsZXJJbnN0YW5jZSBldGMuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbWVbU3RyaW5nSGVscGVyLnVuY2FwaXRhbGl6ZShpbnN0YW5jZU5hbWUpICsgJ0luc3RhbmNlJ10gPSBtZS5pbnN0YW5jZTtcbiAgICAgICAgLy8gXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2F0Y2ggZm9yIGNoYW5nZXNcbiAgICAgKiBAcGFyYW0gY2hhbmdlc1xuICAgICAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgY29uc3RcbiAgICAgICAgICAgIHsgaW5zdGFuY2UgfSA9IHRoaXMsXG4gICAgICAgICAgICB7IGluc3RhbmNlTmFtZSB9ID0gQnJ5bnR1bUdyaWRCYXNlQ29tcG9uZW50O1xuICAgICAgICBpZiAoIWluc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBjaGFuZ2VzXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGNoYW5nZXMpLmZvckVhY2goKFtwcm9wLCBjaGFuZ2VdKSA9PiB7XG4gICAgICAgICAgICBjb25zdFxuICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gKGNoYW5nZSBhcyBTaW1wbGVDaGFuZ2UpLmN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICAgICAgICB7IGluc3RhbmNlIH0gPSB0aGlzLFxuICAgICAgICAgICAgICAgIHsgYnJ5bnR1bUNvbmZpZ3NPbmx5LCBicnludHVtUHJvcHMgfSA9IEJyeW50dW1HcmlkQmFzZUNvbXBvbmVudDtcbiAgICAgICAgICAgIGlmIChicnludHVtUHJvcHMuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICBXcmFwcGVySGVscGVyLmFwcGx5UHJvcFZhbHVlKGluc3RhbmNlLCBwcm9wLCBuZXdWYWx1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmIChicnludHVtQ29uZmlnc09ubHkuaW5jbHVkZXMocHJvcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgV3JhcHBlckhlbHBlci5kZXZXYXJuaW5nVXBkYXRlUHJvcChpbnN0YW5jZU5hbWUsIHByb3ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVzdHJveSB0aGUgY29tcG9uZW50XG4gICAgICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHRoaXMuaW5zdGFuY2UgJiYgdGhpcy5pbnN0YW5jZS5kZXN0cm95KSB7XG4gICAgICAgICAgICB0aGlzLmluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==