@smart-webcomponents-angular/window 22.0.3 → 24.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,43 +6,43 @@ export class WindowComponent extends BaseElement {
6
6
  constructor(ref) {
7
7
  super(ref);
8
8
  this.eventHandlers = [];
9
- /** @description This event is triggered just before the window starts opening.
9
+ /** @description This event is triggered immediately before the window begins its opening process, allowing developers to perform any preparatory actions or modifications prior to the window becoming visible to the user.
10
10
  * @param event. The custom event. */
11
11
  this.onOpening = new EventEmitter();
12
- /** @description This event is triggered when the window is opened( visible ).
12
+ /** @description This event is triggered when the window becomes visible to the user—specifically, when it is opened or brought into view.
13
13
  * @param event. The custom event. */
14
14
  this.onOpen = new EventEmitter();
15
- /** @description This event is triggered just before the window starts closing.
15
+ /** @description This event is triggered immediately before the window begins the closing process, allowing developers to execute custom logic or prompt the user for confirmation before the window is fully closed.
16
16
  * @param event. The custom event. */
17
17
  this.onClosing = new EventEmitter();
18
- /** @description This event is triggered when the window is closed( hidden )
18
+ /** @description This event is triggered when the window is closed or becomes hidden, such as when the user closes the browser tab, navigates away, or minimizes the window, causing it to no longer be visible to the user.
19
19
  * @param event. The custom event. */
20
20
  this.onClose = new EventEmitter();
21
- /** @description This event is triggered when the window is collapsed.
21
+ /** @description This event is triggered whenever the application window is minimized or collapsed by the user. It allows you to execute custom logic in response to the window being hidden from view.
22
22
  * @param event. The custom event. */
23
23
  this.onCollapse = new EventEmitter();
24
- /** @description This event is triggered when window's dragging is ended.
24
+ /** @description This event is triggered when the user finishes dragging the window, signaling the completion of the drag-and-drop operation. It occurs after the mouse button is released and the window movement has stopped.
25
25
  * @param event. The custom event. */
26
26
  this.onDragEnd = new EventEmitter();
27
- /** @description This event is triggered when window's dragging is started.
27
+ /** @description This event is triggered when the user initiates a window drag operation, indicating that the dragging of the window has begun. It fires as soon as the user starts moving the window, typically by clicking and holding the window's title bar.
28
28
  * @param event. The custom event. */
29
29
  this.onDragStart = new EventEmitter();
30
- /** @description This event is triggered when the window is expanded.
30
+ /** @description This event is triggered whenever the window is resized to a larger size, indicating that the user has expanded the window either by dragging its edges or by maximizing it.
31
31
  * @param event. The custom event. */
32
32
  this.onExpand = new EventEmitter();
33
- /** @description This event is triggered when the window is maximized.
33
+ /** @description This event is triggered whenever the application window transitions into a maximized state. It fires immediately after the window expands to fill the available screen space, allowing developers to implement custom logic in response to the window being maximized by the user or programmatically.
34
34
  * @param event. The custom event. */
35
35
  this.onMaximize = new EventEmitter();
36
- /** @description This event is triggered when the window is minimized.
36
+ /** @description This event is triggered whenever the application window is minimized by the user. It occurs immediately after the minimize action takes place, allowing developers to execute custom logic—such as pausing background processes, saving state, or updating the UI—in response to the window being minimized.
37
37
  * @param event. The custom event. */
38
38
  this.onMinimize = new EventEmitter();
39
- /** @description This event is triggered when window's resizing is ended.
39
+ /** @description This event is triggered when the user completes resizing the browser window, specifically after the resizing action has finished and the window size is no longer changing.
40
40
  * @param event. The custom event. */
41
41
  this.onResizeEnd = new EventEmitter();
42
- /** @description This event is triggered when window's resizing is started.
42
+ /** @description This event is triggered when the user initiates a window resize action, such as clicking and dragging the window’s edge or corner to change its dimensions. It marks the beginning of the window resizing process, allowing you to execute scripts or handle UI updates as soon as resizing starts.
43
43
  * @param event. The custom event. */
44
44
  this.onResizeStart = new EventEmitter();
45
- /** @description This event is triggered when the window is restored to it's previous state before maximization.
45
+ /** @description This event is triggered when the window is returned to its original size and position after being maximized, effectively restoring it to the state it was in prior to maximization.
46
46
  * @param event. The custom event. */
47
47
  this.onRestore = new EventEmitter();
48
48
  this.nativeElement = ref.nativeElement;
@@ -57,497 +57,497 @@ export class WindowComponent extends BaseElement {
57
57
  }
58
58
  return this.nativeElement;
59
59
  }
60
- /** @description Determines if 'Add New' Tab inside the Tabs element is visible. Applicable only to TabsWindow */
60
+ /** @description Determines whether the 'Add New' tab within the Tabs element is currently visible to the user. Note: This property is only relevant when used with the TabsWindow component; it does not apply to other components. */
61
61
  get addNewTab() {
62
62
  return this.nativeElement ? this.nativeElement.addNewTab : undefined;
63
63
  }
64
64
  set addNewTab(value) {
65
65
  this.nativeElement ? this.nativeElement.addNewTab = value : undefined;
66
66
  }
67
- /** @description Sets or gets the animation mode. Animation is disabled when the property is set to 'none' */
67
+ /** @description Sets or retrieves the current animation mode. When this property is set to 'none', all animations are disabled. If set to any other supported value, animations will be enabled and behave according to the specified mode. */
68
68
  get animation() {
69
69
  return this.nativeElement ? this.nativeElement.animation : undefined;
70
70
  }
71
71
  set animation(value) {
72
72
  this.nativeElement ? this.nativeElement.animation = value : undefined;
73
73
  }
74
- /** @description Determines whether and how the value should be automatically capitalized as it is entered/edited by the user. Applicable only to MultilinePromptWindow. */
74
+ /** @description Controls the automatic capitalization behavior for user input as it is entered or edited. This setting specifies whether characters are auto-capitalized (e.g., sentences, words, or all characters) in the input field. Note: This property is only relevant when used with the MultilinePromptWindow component. */
75
75
  get autoCapitalize() {
76
76
  return this.nativeElement ? this.nativeElement.autoCapitalize : undefined;
77
77
  }
78
78
  set autoCapitalize(value) {
79
79
  this.nativeElement ? this.nativeElement.autoCapitalize = value : undefined;
80
80
  }
81
- /** @description Determines whether element will auto expand when the input overflows vertically. Applicable only to MultilinePromptWindow. */
81
+ /** @description Specifies whether the element should automatically expand its height to accommodate vertically overflowing input. Note: This setting only applies to MultilinePromptWindow components. */
82
82
  get autoExpand() {
83
83
  return this.nativeElement ? this.nativeElement.autoExpand : undefined;
84
84
  }
85
85
  set autoExpand(value) {
86
86
  this.nativeElement ? this.nativeElement.autoExpand = value : undefined;
87
87
  }
88
- /** @description Determines the label for the 'cancel' button inside the Prompt Window. */
88
+ /** @description Specifies the text displayed on the 'Cancel' button within the Prompt Window. This label informs users which button will dismiss or close the prompt without taking any action. */
89
89
  get cancelLabel() {
90
90
  return this.nativeElement ? this.nativeElement.cancelLabel : undefined;
91
91
  }
92
92
  set cancelLabel(value) {
93
93
  this.nativeElement ? this.nativeElement.cancelLabel = value : undefined;
94
94
  }
95
- /** @description Determines the label for the 'Complete' button insinde the Progress Window. */
95
+ /** @description Specifies the text that appears on the 'Complete' button within the Progress Window, allowing customization of the button label to better suit user interface requirements. */
96
96
  get completeLabel() {
97
97
  return this.nativeElement ? this.nativeElement.completeLabel : undefined;
98
98
  }
99
99
  set completeLabel(value) {
100
100
  this.nativeElement ? this.nativeElement.completeLabel = value : undefined;
101
101
  }
102
- /** @description Determines the label for the 'Confirm' button insinde the Prompt Window. */
102
+ /** @description Specifies the text displayed on the 'Confirm' button within the Prompt Window, allowing customization of the button label to suit your application's context. */
103
103
  get confirmLabel() {
104
104
  return this.nativeElement ? this.nativeElement.confirmLabel : undefined;
105
105
  }
106
106
  set confirmLabel(value) {
107
107
  this.nativeElement ? this.nativeElement.confirmLabel = value : undefined;
108
108
  }
109
- /** @description Determines if the window is collapsed or not. When collapsed the only the header of the window is visible. */
109
+ /** @description Indicates whether the window is currently collapsed. When set to true, only the window's header is displayed while the content area is hidden. If false, both the header and the full content of the window are visible. */
110
110
  get collapsed() {
111
111
  return this.nativeElement ? this.nativeElement.collapsed : undefined;
112
112
  }
113
113
  set collapsed(value) {
114
114
  this.nativeElement ? this.nativeElement.collapsed = value : undefined;
115
115
  }
116
- /** @description When a modal window is opened, thid property determines if clicking on the mask closes the window or not. */
116
+ /** @description When a modal window is opened, this property specifies whether clicking on the overlay (mask) outside the modal will close the window. Set it to true to allow users to dismiss the modal by clicking the mask, or false to require an explicit action (such as clicking a close button) to close the modal. */
117
117
  get closeOnMaskClick() {
118
118
  return this.nativeElement ? this.nativeElement.closeOnMaskClick : undefined;
119
119
  }
120
120
  set closeOnMaskClick(value) {
121
121
  this.nativeElement ? this.nativeElement.closeOnMaskClick = value : undefined;
122
122
  }
123
- /** @description Determines the data source that will be loaded to the TabsWindow. Applicable only to TabsWindow. */
123
+ /** @description Specifies the data source to be loaded into the TabsWindow component. This property is relevant exclusively for the TabsWindow and will not affect other components. */
124
124
  get dataSource() {
125
125
  return this.nativeElement ? this.nativeElement.dataSource : undefined;
126
126
  }
127
127
  set dataSource(value) {
128
128
  this.nativeElement ? this.nativeElement.dataSource = value : undefined;
129
129
  }
130
- /** @description Enables or disables the window. */
130
+ /** @description Controls whether the window is active and visible to the user. When enabled, the window is operational and can be interacted with; when disabled, the window is hidden or inactive, and user interactions are ignored. */
131
131
  get disabled() {
132
132
  return this.nativeElement ? this.nativeElement.disabled : undefined;
133
133
  }
134
134
  set disabled(value) {
135
135
  this.nativeElement ? this.nativeElement.disabled = value : undefined;
136
136
  }
137
- /** @description Enables or disables the window snapping feature. */
137
+ /** @description Controls whether the window snapping feature is active. When enabled, users can automatically align and resize windows by dragging them to the edges or corners of the screen. Disabling this feature prevents windows from snapping into place during movement. */
138
138
  get disableSnap() {
139
139
  return this.nativeElement ? this.nativeElement.disableSnap : undefined;
140
140
  }
141
141
  set disableSnap(value) {
142
142
  this.nativeElement ? this.nativeElement.disableSnap = value : undefined;
143
143
  }
144
- /** @description By default the window is closing after the 'Escape' key is pressed. Set this property to true, if you want to disable that. */
144
+ /** @description By default, pressing the 'Escape' key will automatically close the window. To prevent the window from closing when 'Escape' is pressed, set this property to true. */
145
145
  get disableEscape() {
146
146
  return this.nativeElement ? this.nativeElement.disableEscape : undefined;
147
147
  }
148
148
  set disableEscape(value) {
149
149
  this.nativeElement ? this.nativeElement.disableEscape = value : undefined;
150
150
  }
151
- /** @description By default the window is handling keyboard keys like 'Arrows', 'Escape', etc. Set this property to true, if you want to disable that. */
151
+ /** @description By default, the window handles certain keyboard inputs such as the arrow keys ('ArrowUp', 'ArrowDown', etc.), 'Escape', and similar keys for scrolling or navigation actions. Set this property to true to disable the window’s default keyboard handling, allowing you to manage these key events manually within your application. */
152
152
  get disableKeyboard() {
153
153
  return this.nativeElement ? this.nativeElement.disableKeyboard : undefined;
154
154
  }
155
155
  set disableKeyboard(value) {
156
156
  this.nativeElement ? this.nativeElement.disableKeyboard = value : undefined;
157
157
  }
158
- /** @description Determines how the characters are displayed inside the input. Applicable to Prompt Window. */
158
+ /** @description Specifies the visual presentation of characters entered within the input field. For example, this setting can control whether characters are shown as plain text or masked (such as for password fields). This option applies specifically to the Prompt Window component. */
159
159
  get displayMode() {
160
160
  return this.nativeElement ? this.nativeElement.displayMode : undefined;
161
161
  }
162
162
  set displayMode(value) {
163
163
  this.nativeElement ? this.nativeElement.displayMode = value : undefined;
164
164
  }
165
- /** @description Applicable to TabsWindow when docked inside a DockingLayout Custom Element. Determines where the window(it's tab items as well) can be dropped inside the DockingLayout. The property is an array that accepts multiple positions. Note: Positions with prefix 'layout-' are applied to the Tab item children of the TabsWidnow owner that is being dragged. The rest of the positions indicate the allowed drop position inside the hovered target(TabsWindow). Used only by jqxDockingLayout custom elements. Determines the possible drop position inside the DockingLayout. The following values are allowed. */
165
+ /** @description ''Applicable to TabsWindow components when they are docked within a DockingLayout Custom Element.This property specifies the valid drop locations for the window—and its tab items—inside the DockingLayout. The property accepts an array of positional values, allowing you to define multiple allowable drop zones.Details: Positions prefixed with 'layout-' apply to each individual tab item (child element) of the TabsWindow being dragged. These determine where tab items can be dropped within the overall layout, outside their original container. Other position values (without the 'layout-' prefix) indicate allowed drop positions directly within the hovered target TabsWindow, specifying where the whole window or its tabs can be placed relative to the target window.Notes: This property is used exclusively by jqxDockingLayout custom elements. It controls the possible drop targets—both at the window and tab levels—within the DockingLayout environment.Allowed Values: The array values specify the permitted drop positions. Refer to the documentation for a complete list of supported position strings. */
166
166
  get dropPosition() {
167
167
  return this.nativeElement ? this.nativeElement.dropPosition : undefined;
168
168
  }
169
169
  set dropPosition(value) {
170
170
  this.nativeElement ? this.nativeElement.dropPosition = value : undefined;
171
171
  }
172
- /** @description A callback function defining the new format for the label of the Progress Bar. Applicable only to ProgressWindow. */
172
+ /** @description A callback function that specifies how to format the label displayed on the Progress Bar. This function allows customization of the label's content or appearance based on the current progress value. Note: This property is only applicable to the ProgressWindow component. */
173
173
  get formatFunction() {
174
174
  return this.nativeElement ? this.nativeElement.formatFunction : undefined;
175
175
  }
176
176
  set formatFunction(value) {
177
177
  this.nativeElement ? this.nativeElement.formatFunction = value : undefined;
178
178
  }
179
- /** @description Determines the position of the footer of the window element. */
179
+ /** @description Specifies the exact placement or alignment of the footer section within the window element, such as positioning it at the bottom, fixed, absolute, or relative to other content. This property controls where the footer appears in relation to the window’s layout. */
180
180
  get footerPosition() {
181
181
  return this.nativeElement ? this.nativeElement.footerPosition : undefined;
182
182
  }
183
183
  set footerPosition(value) {
184
184
  this.nativeElement ? this.nativeElement.footerPosition = value : undefined;
185
185
  }
186
- /** @description Determines the template for the Dialog section of the window. By default footerTemplate is null. */
186
+ /** @description Specifies the custom template used to render the footer section of the Dialog window. If footerTemplate is set to null (the default), the Dialog will not display a footer section. You can provide a template string or a function to customize the appearance and content of the Dialog’s footer. */
187
187
  get footerTemplate() {
188
188
  return this.nativeElement ? this.nativeElement.footerTemplate : undefined;
189
189
  }
190
190
  set footerTemplate(value) {
191
191
  this.nativeElement ? this.nativeElement.footerTemplate = value : undefined;
192
192
  }
193
- /** @description Set's the buttons that will be visible in the header section. */
193
+ /** @description Specifies which buttons will be displayed in the header section, allowing you to control the visibility of header actions for users. */
194
194
  get headerButtons() {
195
195
  return this.nativeElement ? this.nativeElement.headerButtons : undefined;
196
196
  }
197
197
  set headerButtons(value) {
198
198
  this.nativeElement ? this.nativeElement.headerButtons = value : undefined;
199
199
  }
200
- /** @description Determines the template for the Dialog section of the window. By default headerTemplate is null. */
200
+ /** @description Specifies the custom template to be used for rendering the header section of the dialog window. If headerTemplate is set to null (the default value), the dialog will display its standard header layout. By providing a template, you can fully customize the appearance and content of the dialog's header area. */
201
201
  get headerTemplate() {
202
202
  return this.nativeElement ? this.nativeElement.headerTemplate : undefined;
203
203
  }
204
204
  set headerTemplate(value) {
205
205
  this.nativeElement ? this.nativeElement.headerTemplate = value : undefined;
206
206
  }
207
- /** @description Determines the position of the header of the window element. */
207
+ /** @description Specifies the exact placement of the header section within the window element, such as top, bottom, left, or right. This setting controls where the header appears relative to the content of the window. */
208
208
  get headerPosition() {
209
209
  return this.nativeElement ? this.nativeElement.headerPosition : undefined;
210
210
  }
211
211
  set headerPosition(value) {
212
212
  this.nativeElement ? this.nativeElement.headerPosition = value : undefined;
213
213
  }
214
- /** @description Sets additional helper text below the text box. The hint is visible only when the text box is focued. Applicable to Prompt Window. */
214
+ /** @description Displays supplementary helper text beneath the text box, providing users with additional guidance or context. This hint appears only when the text box is focused (i.e., the user is actively typing or has selected the field). Note: This property is specifically applicable to the Prompt Window component. */
215
215
  get hint() {
216
216
  return this.nativeElement ? this.nativeElement.hint : undefined;
217
217
  }
218
218
  set hint(value) {
219
219
  this.nativeElement ? this.nativeElement.hint = value : undefined;
220
220
  }
221
- /** @description Sets the value of the Progress bar to indeterminate state(null) and starts the animation. Applicable only to ProgressWindow. */
221
+ /** @description Sets the Progress bar value to the indeterminate state ('null'), activating its loading animation to indicate ongoing progress without a defined endpoint. Note: This property is only applicable when used within a ProgressWindow component. */
222
222
  get indeterminate() {
223
223
  return this.nativeElement ? this.nativeElement.indeterminate : undefined;
224
224
  }
225
225
  set indeterminate(value) {
226
226
  this.nativeElement ? this.nativeElement.indeterminate = value : undefined;
227
227
  }
228
- /** @description Sets the filling direction of the Progress Bar. Applicable only to ProgressWindow. */
228
+ /** @description Specifies the direction in which the Progress Bar fills (e.g., left-to-right, right-to-left, top-to-bottom, or bottom-to-top). Note: This property is only applicable when used within a ProgressWindow component. */
229
229
  get inverted() {
230
230
  return this.nativeElement ? this.nativeElement.inverted : undefined;
231
231
  }
232
232
  set inverted(value) {
233
233
  this.nativeElement ? this.nativeElement.inverted = value : undefined;
234
234
  }
235
- /** @description The label of the window that appears in the header area. */
235
+ /** @description Specifies the text displayed as the window title in the header section, typically shown at the top of the application window or dialog box. */
236
236
  get label() {
237
237
  return this.nativeElement ? this.nativeElement.label : undefined;
238
238
  }
239
239
  set label(value) {
240
240
  this.nativeElement ? this.nativeElement.label = value : undefined;
241
241
  }
242
- /** @description When enabled the resizing operation happens live. By default it's not enabled and during resizing a highlighter around the edges of the window appears to outline the current size of the element. */
242
+ /** @description When enabled, the resizing operation updates the element’s size in real time as the user drags its edges, providing immediate visual feedback. By default, this feature is disabled; instead, a highlighter appears around the edges of the window during resizing to indicate the prospective new size, while the element itself resizes only once the operation is complete. */
243
243
  get liveResize() {
244
244
  return this.nativeElement ? this.nativeElement.liveResize : undefined;
245
245
  }
246
246
  set liveResize(value) {
247
247
  this.nativeElement ? this.nativeElement.liveResize = value : undefined;
248
248
  }
249
- /** @description Applicable only to TabsWindow when used with a DockingLayout custom element.Used only by jqxDockingLayout. Determines the owner jqxDockingLayout that the window belongs to. When the tabsWindow has been removed from a DockingLayout element, the property is used to indicate that it belongs to that particular Dockinglayout. Accepts a string, representing the ID of a jqxDockingLayout on the page, or an instance of jqxDokcingLayout. */
249
+ /** @description Note: This property is relevant only for TabsWindow elements that are utilized within a DockingLayout custom element.This property is exclusively used by jqxDockingLayout to specify ownership of a TabsWindow. It determines which jqxDockingLayout instance the window is associated with. If a TabsWindow is removed from its parent DockingLayout element, this property continues to reference the original docking layout to which it belonged.The property accepts either: A string representing the id of a jqxDockingLayout present on the page. An instance of a jqxDockingLayout object.This allows for flexible identification of the owning layout, either by ID or by direct reference to the layout instance. */
250
250
  get layout() {
251
251
  return this.nativeElement ? this.nativeElement.layout : undefined;
252
252
  }
253
253
  set layout(value) {
254
254
  this.nativeElement ? this.nativeElement.layout = value : undefined;
255
255
  }
256
- /** @description Sets or gets the unlockKey which unlocks the product. */
256
+ /** @description Gets or sets the unlockKey, a unique code required to activate or unlock access to the product’s full features or licensed functionality. */
257
257
  get unlockKey() {
258
258
  return this.nativeElement ? this.nativeElement.unlockKey : undefined;
259
259
  }
260
260
  set unlockKey(value) {
261
261
  this.nativeElement ? this.nativeElement.unlockKey = value : undefined;
262
262
  }
263
- /** @description Sets or gets the language. Used in conjunction with the property messages. */
263
+ /** @description Specifies the language to be used for displaying messages. This property can be set or retrieved, and works in conjunction with the messages property to determine which set of localized messages is shown to the user. Changing the language updates the displayed messages accordingly. */
264
264
  get locale() {
265
265
  return this.nativeElement ? this.nativeElement.locale : undefined;
266
266
  }
267
267
  set locale(value) {
268
268
  this.nativeElement ? this.nativeElement.locale = value : undefined;
269
269
  }
270
- /** @description Applicable only to TabsWindow when docked inside a DockingLayout Custom Element.Determines of the item can be resized or not. */
270
+ /** @description Note: This property is only applicable to a TabsWindow when it is docked within a DockingLayout custom element. When enabled, it controls whether the TabsWindow can be resized by the user. If set to true, users will be able to adjust the size of the TabsWindow within the DockingLayout; if set to false, resizing will be disabled and the TabsWindow will have a fixed size. */
271
271
  get locked() {
272
272
  return this.nativeElement ? this.nativeElement.locked : undefined;
273
273
  }
274
274
  set locked(value) {
275
275
  this.nativeElement ? this.nativeElement.locked = value : undefined;
276
276
  }
277
- /** @description Callback, related to localization module. */
277
+ /** @description Callback function used within the localization module, typically invoked when a localization event occurs (e.g., language change, resource load). This callback handles tasks such as updating UI elements or retrieving localized content based on the current language settings. */
278
278
  get localizeFormatFunction() {
279
279
  return this.nativeElement ? this.nativeElement.localizeFormatFunction : undefined;
280
280
  }
281
281
  set localizeFormatFunction(value) {
282
282
  this.nativeElement ? this.nativeElement.localizeFormatFunction = value : undefined;
283
283
  }
284
- /** @description Determines if the window is maximized or not. When maximized the window covers the whole viewport. */
284
+ /** @description Indicates whether the window is currently maximized. When set to true, the window expands to fill the entire available viewport, covering all other interface elements and leaving no visible borders or title bars. If false, the window retains its previous size and position. This property can be used to programmatically check or control the window’s maximized state within the application. */
285
285
  get maximized() {
286
286
  return this.nativeElement ? this.nativeElement.maximized : undefined;
287
287
  }
288
288
  set maximized(value) {
289
289
  this.nativeElement ? this.nativeElement.maximized = value : undefined;
290
290
  }
291
- /** @description Sets or gets an object specifying strings used in the widget that can be localized. Used in conjunction with the property locale. */
291
+ /** @description Defines or retrieves an object containing localized strings used throughout the widget’s user interface. This property allows developers to customize the widget’s displayed text for different languages and regions. It is typically used together with the locale property to ensure that the widget adapts its content based on the selected language or regional settings. */
292
292
  get messages() {
293
293
  return this.nativeElement ? this.nativeElement.messages : undefined;
294
294
  }
295
295
  set messages(value) {
296
296
  this.nativeElement ? this.nativeElement.messages = value : undefined;
297
297
  }
298
- /** @description Determines if the window is modal or not. If true the user can only interact with the window and nothing else on the page. */
298
+ /** @description Specifies whether the window should function as a modal dialog. When set to true, the window captures user focus and prevents interaction with any other elements on the page until it is closed. This ensures that the user must address or dismiss the modal window before returning to the rest of the content. */
299
299
  get modal() {
300
300
  return this.nativeElement ? this.nativeElement.modal : undefined;
301
301
  }
302
302
  set modal(value) {
303
303
  this.nativeElement ? this.nativeElement.modal = value : undefined;
304
304
  }
305
- /** @description Applicable to TabsWindow when docked inside a DockingLayout Custom Element. Determines the max size of the item. Applicable to Progress Window by allowing the user to specify the maximum of the ProgressBar. */
305
+ /** @description For use with TabsWindow when docked within a DockingLayout custom element: Specifies the maximum size that the TabsWindow component can occupy when it is docked. For the ProgressWindow component: Defines the maximum value for the progress bar, allowing users to set the upper limit of the ProgressBar's range. */
306
306
  get max() {
307
307
  return this.nativeElement ? this.nativeElement.max : undefined;
308
308
  }
309
309
  set max(value) {
310
310
  this.nativeElement ? this.nativeElement.max = value : undefined;
311
311
  }
312
- /** @description Applicable to TabsWindow when docked inside DockingLayout Custom Element. Determines the min size of the item. Applicable to Progress Window by allowing the user to specify the minimu of the ProgressBar. */
312
+ /** @description Applicable to TabsWindow when docked inside a DockingLayout custom element. Specifies the minimum allowed size for the item within the layout, ensuring it does not shrink below this value during resizing operations.Also applies to ProgressWindow, where it lets the user set the minimum value for the ProgressBar, defining the lowest possible progress state that can be represented. */
313
313
  get min() {
314
314
  return this.nativeElement ? this.nativeElement.min : undefined;
315
315
  }
316
316
  set min(value) {
317
317
  this.nativeElement ? this.nativeElement.min = value : undefined;
318
318
  }
319
- /** @description Determines if the window is minimized or not. When minimized the window is docked at the bottom left corner of the viewport. */
319
+ /** @description Indicates whether the window is currently minimized. When set to true, the window is reduced to an icon or compact form and positioned (docked) in the bottom left corner of the viewport. If false, the window remains in its normal, active state. */
320
320
  get minimized() {
321
321
  return this.nativeElement ? this.nativeElement.minimized : undefined;
322
322
  }
323
323
  set minimized(value) {
324
324
  this.nativeElement ? this.nativeElement.minimized = value : undefined;
325
325
  }
326
- /** @description Sets or gets the maximum number of characters that the user can enter. Applicable to Prompt/MultilinePrompt Window. */
326
+ /** @description Specifies or retrieves the maximum number of characters a user is allowed to enter into the input field. This property applies to both Prompt and MultilinePrompt windows. If set, the input will be limited to the defined character count, preventing users from entering more characters than specified. */
327
327
  get maxLength() {
328
328
  return this.nativeElement ? this.nativeElement.maxLength : undefined;
329
329
  }
330
330
  set maxLength(value) {
331
331
  this.nativeElement ? this.nativeElement.maxLength = value : undefined;
332
332
  }
333
- /** @description Sets or gets the minimum number of characters that the user have to enter to trigger the auto complete functionality. Applicable to Prompt/MultilinePrompt Window. */
333
+ /** @description Defines the minimum number of characters a user must enter before the autocomplete feature is activated. This property can be both set (to specify the desired threshold) and retrieved (to check the current threshold). Note: This setting is only applicable to Prompt and MultilinePrompt windows. */
334
334
  get minLength() {
335
335
  return this.nativeElement ? this.nativeElement.minLength : undefined;
336
336
  }
337
337
  set minLength(value) {
338
338
  this.nativeElement ? this.nativeElement.minLength = value : undefined;
339
339
  }
340
- /** @description Determines if the window is visible or not. */
340
+ /** @description Indicates whether the window is currently visible to the user. Returns true if the window is displayed on the screen and can be interacted with, and false if it is hidden or minimized. */
341
341
  get opened() {
342
342
  return this.nativeElement ? this.nativeElement.opened : undefined;
343
343
  }
344
344
  set opened(value) {
345
345
  this.nativeElement ? this.nativeElement.opened = value : undefined;
346
346
  }
347
- /** @description Determines if the window is pinned or not. Pinned window is a window that can't be dragged but can be resized. */
347
+ /** @description Indicates whether the window is pinned. A pinned window cannot be moved (dragged) by the user, but it can still be resized. When set to true, this property disables window dragging while allowing resizing operations. */
348
348
  get pinned() {
349
349
  return this.nativeElement ? this.nativeElement.pinned : undefined;
350
350
  }
351
351
  set pinned(value) {
352
352
  this.nativeElement ? this.nativeElement.pinned = value : undefined;
353
353
  }
354
- /** @description Determines the input's placeholder. Applicable to Prompt Window. */
354
+ /** @description Specifies the placeholder text that appears inside the input field before the user enters a value. Note: This option is only applicable to the Prompt Window component. */
355
355
  get placeholder() {
356
356
  return this.nativeElement ? this.nativeElement.placeholder : undefined;
357
357
  }
358
358
  set placeholder(value) {
359
359
  this.nativeElement ? this.nativeElement.placeholder = value : undefined;
360
360
  }
361
- /** @description Determines the label for the Input insinde the PromptWindow. */
361
+ /** @description Specifies the text label displayed above or alongside the input field within the PromptWindow component. This label helps users understand what information is expected in the input field. */
362
362
  get promptLabel() {
363
363
  return this.nativeElement ? this.nativeElement.promptLabel : undefined;
364
364
  }
365
365
  set promptLabel(value) {
366
366
  this.nativeElement ? this.nativeElement.promptLabel = value : undefined;
367
367
  }
368
- /** @description If the element is readonly, users cannot interact with it. */
368
+ /** @description If the element has the "readonly" attribute, users cannot modify its value; the field will display data in a non-editable state, though users can still select and copy its contents. This differs from a "disabled" element, as a "readonly" field remains focusable and included in form submissions. */
369
369
  get readonly() {
370
370
  return this.nativeElement ? this.nativeElement.readonly : undefined;
371
371
  }
372
372
  set readonly(value) {
373
373
  this.nativeElement ? this.nativeElement.readonly = value : undefined;
374
374
  }
375
- /** @description When applied a resize indicator is displayed in the bottom right corner of the window and resizing operation can be initiated only from its position. */
375
+ /** @description When this option is enabled, a resize handle appears in the bottom-right corner of the window. Users can initiate the resizing operation exclusively by dragging this indicator; resizing from any other window edge or corner is disabled. */
376
376
  get resizeIndicator() {
377
377
  return this.nativeElement ? this.nativeElement.resizeIndicator : undefined;
378
378
  }
379
379
  set resizeIndicator(value) {
380
380
  this.nativeElement ? this.nativeElement.resizeIndicator = value : undefined;
381
381
  }
382
- /** @description Determines the resizing mode of the window. Several modes are available: none - resizing is disabled. vertical - vertical resizing is allowed. horizontal - horizontal resizing is allowed. both - horizontal and vertical resizing is allowed. top - the window can only be resized from the top side. bottom - the window is resizable only from the bottom side. left - the window can be resized only from the left side. right - the window can be resized only from the right side. */
382
+ /** @description Specifies how the window can be resized by the user.Available resizing modes: none Disables all window resizing; the window size is fixed. vertical Allows the window to be resized only vertically (top and bottom edges). horizontal Allows the window to be resized only horizontally (left and right edges). both – Enables both horizontal and vertical resizing; the window can be resized in any direction. top The window can only be resized by dragging the top edge. bottom The window can only be resized by dragging the bottom edge. left The window can only be resized by dragging the left edge. right The window can only be resized by dragging the right edge.Choose the desired mode to control which edges of the window users can drag to resize, or to prevent resizing entirely. */
383
383
  get resizeMode() {
384
384
  return this.nativeElement ? this.nativeElement.resizeMode : undefined;
385
385
  }
386
386
  set resizeMode(value) {
387
387
  this.nativeElement ? this.nativeElement.resizeMode = value : undefined;
388
388
  }
389
- /** @description Sets or gets the value indicating whether the element is aligned to support locales using right-to-left fonts. */
389
+ /** @description Gets or sets a value that determines whether the element’s alignment is configured to support right-to-left (RTL) languages and text direction, such as Arabic or Hebrew. Use this property to ensure proper display and alignment for locales that require RTL font and layout support. */
390
390
  get rightToLeft() {
391
391
  return this.nativeElement ? this.nativeElement.rightToLeft : undefined;
392
392
  }
393
393
  set rightToLeft(value) {
394
394
  this.nativeElement ? this.nativeElement.rightToLeft = value : undefined;
395
395
  }
396
- /** @description Specifies that the user must fill the input before submitting a form with the text box.Applicable to Prompt Window. */
396
+ /** @description Indicates that the input field is required and must be filled out by the user before the form can be submitted. If left empty, the form submission will be blocked, prompting the user to complete this field. 'Note:' This setting is applicable to the Prompt Window. */
397
397
  get required() {
398
398
  return this.nativeElement ? this.nativeElement.required : undefined;
399
399
  }
400
400
  set required(value) {
401
401
  this.nativeElement ? this.nativeElement.required = value : undefined;
402
402
  }
403
- /** @description Specifies the message that will appear if required is set and no value is provided in the input. Applicable to Prompt Window. */
403
+ /** @description Defines the error message displayed when the required attribute is enabled and the user submits the input field without providing a value. This setting only applies to the Prompt Window interface. */
404
404
  get requiredMessage() {
405
405
  return this.nativeElement ? this.nativeElement.requiredMessage : undefined;
406
406
  }
407
407
  set requiredMessage(value) {
408
408
  this.nativeElement ? this.nativeElement.requiredMessage = value : undefined;
409
409
  }
410
- /** @description Determines whether the content of the input will be selected on focus or not. Applicable to Prompt Window. */
410
+ /** @description Specifies whether the input field's content should be automatically highlighted (selected) when the field gains focus. Note: This setting applies specifically to the Prompt Window component. */
411
411
  get selectAllOnFocus() {
412
412
  return this.nativeElement ? this.nativeElement.selectAllOnFocus : undefined;
413
413
  }
414
414
  set selectAllOnFocus(value) {
415
415
  this.nativeElement ? this.nativeElement.selectAllOnFocus = value : undefined;
416
416
  }
417
- /** @description Sets or gets which tab is selected. Applicable only to TabsWindow. */
417
+ /** @description Specifies or retrieves the currently selected tab within the component. This property applies exclusively to the TabsWindow component. */
418
418
  get selectedIndex() {
419
419
  return this.nativeElement ? this.nativeElement.selectedIndex : undefined;
420
420
  }
421
421
  set selectedIndex(value) {
422
422
  this.nativeElement ? this.nativeElement.selectedIndex = value : undefined;
423
423
  }
424
- /** @description Determines the way the user can switch between tabs. Applicable only to TabsWindow. */
424
+ /** @description Specifies how the user is allowed to navigate between different tabs within the interface. This property is relevant only when using the TabsWindow component. */
425
425
  get selectionMode() {
426
426
  return this.nativeElement ? this.nativeElement.selectionMode : undefined;
427
427
  }
428
428
  set selectionMode(value) {
429
429
  this.nativeElement ? this.nativeElement.selectionMode = value : undefined;
430
430
  }
431
- /** @description Indicates the index of the last character in the current selection. Applicable only to MultilinePromptWindow. */
431
+ /** @description Specifies the zero-based index position of the last character included in the current text selection. Note: This property is relevant only for use within MultilinePromptWindow components. */
432
432
  get selectionEnd() {
433
433
  return this.nativeElement ? this.nativeElement.selectionEnd : undefined;
434
434
  }
435
435
  set selectionEnd(value) {
436
436
  this.nativeElement ? this.nativeElement.selectionEnd = value : undefined;
437
437
  }
438
- /** @description Indicates the index to the first character in the current selection. Applicable only to MultilinePromptWindow. */
438
+ /** @description Specifies the zero-based index of the first character in the currently selected text within the prompt window. This property is only applicable when using the MultilinePromptWindow component. */
439
439
  get selectionStart() {
440
440
  return this.nativeElement ? this.nativeElement.selectionStart : undefined;
441
441
  }
442
442
  set selectionStart(value) {
443
443
  this.nativeElement ? this.nativeElement.selectionStart = value : undefined;
444
444
  }
445
- /** @description Enables/Disabled the label for the Progress Bar. Applicable only to Progress Window. */
445
+ /** @description Controls the visibility of the label displayed on the Progress Bar. Note: This setting is only applicable when used within the Progress Window component. */
446
446
  get showProgressValue() {
447
447
  return this.nativeElement ? this.nativeElement.showProgressValue : undefined;
448
448
  }
449
449
  set showProgressValue(value) {
450
450
  this.nativeElement ? this.nativeElement.showProgressValue = value : undefined;
451
451
  }
452
- /** @description A getter that returns the siblings (that share the same parent) of a LayoutPanel item that is docked inside a DockingLayout. The siblings are also DockingLayout items ( LayoutPanels).Applicable only to TabsWindow when docked inside a DockingLayout. */
452
+ /** @description A getter that retrieves all sibling LayoutPanel instances—those sharing the same immediate parent—when a LayoutPanel item is docked within a DockingLayout. The returned siblings are also DockingLayout items (specifically, other LayoutPanels). This property is only available for TabsWindow components that are docked inside a DockingLayout. */
453
453
  get siblings() {
454
454
  return this.nativeElement ? this.nativeElement.siblings : undefined;
455
455
  }
456
456
  set siblings(value) {
457
457
  this.nativeElement ? this.nativeElement.siblings = value : undefined;
458
458
  }
459
- /** @description Applicable to TabsWindow when nested inside a DockingLayout Custom Element. Determines the size of the item. */
459
+ /** @description Relevant when a TabsWindow component is nested within a DockingLayout custom element. This property specifies the size (width or height, depending on layout orientation) allocated to the TabsWindow within the docking layout, allowing developers to control how much space the window occupies relative to other docked components. */
460
460
  get size() {
461
461
  return this.nativeElement ? this.nativeElement.size : undefined;
462
462
  }
463
463
  set size(value) {
464
464
  this.nativeElement ? this.nativeElement.size = value : undefined;
465
465
  }
466
- /** @description Specifies whether the element is to have its spelling and grammar checked or not. Applicable only to MultilinePromptWindow. */
466
+ /** @description Indicates whether spelling and grammar checking should be enabled for the element. This property determines if the content entered within the element will be reviewed for spelling and grammatical errors. Note: This option is only relevant for the MultilinePromptWindow component. */
467
467
  get spellCheck() {
468
468
  return this.nativeElement ? this.nativeElement.spellCheck : undefined;
469
469
  }
470
470
  set spellCheck(value) {
471
471
  this.nativeElement ? this.nativeElement.spellCheck = value : undefined;
472
472
  }
473
- /** @description Sets or gets whether close buttons are displayed inside the Tab Strip of the TabsWindow. Applicable only to TabsWindow. */
473
+ /** @description Determines whether close buttons are shown on each tab within the Tab Strip of the TabsWindow. You can use this property to enable or disable the visibility of close buttons on tabs, allowing users to close individual tabs directly from the Tab Strip. Note: This property is only applicable to the TabsWindow component. */
474
474
  get tabCloseButtons() {
475
475
  return this.nativeElement ? this.nativeElement.tabCloseButtons : undefined;
476
476
  }
477
477
  set tabCloseButtons(value) {
478
478
  this.nativeElement ? this.nativeElement.tabCloseButtons = value : undefined;
479
479
  }
480
- /** @description Determines if the close button is visible on select or always. Applicable only to TabsWindow. */
480
+ /** @description Specifies when the close button is visible—either only when a tab is selected or always visible on all tabs. Note: This property applies exclusively to the TabsWindow component. */
481
481
  get tabCloseButtonMode() {
482
482
  return this.nativeElement ? this.nativeElement.tabCloseButtonMode : undefined;
483
483
  }
484
484
  set tabCloseButtonMode(value) {
485
485
  this.nativeElement ? this.nativeElement.tabCloseButtonMode = value : undefined;
486
486
  }
487
- /** @description Sets or gets the Tabs scroll buttons behavior. Applicable only when tabLayout is 'scroll'. Applicable only to TabsWindow. */
487
+ /** @description Specifies how the scroll buttons for tabs are displayed or behave. This option is only relevant when the tabLayout property is set to 'scroll', allowing tabs to be scrolled horizontally. Note: This property applies exclusively to the TabsWindow component. */
488
488
  get tabOverflow() {
489
489
  return this.nativeElement ? this.nativeElement.tabOverflow : undefined;
490
490
  }
491
491
  set tabOverflow(value) {
492
492
  this.nativeElement ? this.nativeElement.tabOverflow = value : undefined;
493
493
  }
494
- /** @description Detetmines Tab Strip is positioned of the TabsWindow. Applicable only to TabsWindow. */
494
+ /** @description Determines the position of the Tab Strip within the TabsWindow. Note: This property applies exclusively to the TabsWindow component. */
495
495
  get tabPosition() {
496
496
  return this.nativeElement ? this.nativeElement.tabPosition : undefined;
497
497
  }
498
498
  set tabPosition(value) {
499
499
  this.nativeElement ? this.nativeElement.tabPosition = value : undefined;
500
500
  }
501
- /** @description Sets or gets the position of the scroll buttons inside the Tab header of the TabsWindow. Applicable only to TabsWindow. */
501
+ /** @description Defines or retrieves the position of the scroll buttons located within the tab header of a TabsWindow component. This setting is exclusively applicable to TabsWindow instances and allows you to control where the scroll buttons appear (for example, at the start, end, or both ends of the tab header). */
502
502
  get tabScrollButtonsPosition() {
503
503
  return this.nativeElement ? this.nativeElement.tabScrollButtonsPosition : undefined;
504
504
  }
505
505
  set tabScrollButtonsPosition(value) {
506
506
  this.nativeElement ? this.nativeElement.tabScrollButtonsPosition = value : undefined;
507
507
  }
508
- /** @description Sets or gets the orientation of the text in the tabs labels of the TabsWindow. Applicable only to TabsWindow. */
508
+ /** @description Defines or retrieves the orientation of the text displayed in the tab labels within the TabsWindow component. This property determines whether the tab text is laid out horizontally or vertically. Note: This property is exclusively applicable to the TabsWindow component and has no effect on other components. */
509
509
  get tabTextOrientation() {
510
510
  return this.nativeElement ? this.nativeElement.tabTextOrientation : undefined;
511
511
  }
512
512
  set tabTextOrientation(value) {
513
513
  this.nativeElement ? this.nativeElement.tabTextOrientation = value : undefined;
514
514
  }
515
- /** @description Determines the theme. Theme defines the look of the element */
515
+ /** @description Specifies the visual theme to be applied. The theme controls the appearance, including colors, fonts, and styling, of the element to ensure a consistent look and feel across the user interface. */
516
516
  get theme() {
517
517
  return this.nativeElement ? this.nativeElement.theme : undefined;
518
518
  }
519
519
  set theme(value) {
520
520
  this.nativeElement ? this.nativeElement.theme = value : undefined;
521
521
  }
522
- /** @description If is set to true, the element cannot be focused. */
522
+ /** @description If this property is set to true, the element will be excluded from keyboard navigation and cannot receive focus either programmatically or via user interaction. This ensures that users will be unable to focus on the element using methods such as the Tab key or calling focus() in JavaScript. */
523
523
  get unfocusable() {
524
524
  return this.nativeElement ? this.nativeElement.unfocusable : undefined;
525
525
  }
526
526
  set unfocusable(value) {
527
527
  this.nativeElement ? this.nativeElement.unfocusable = value : undefined;
528
528
  }
529
- /** @description Determines the value of the TextBox/ProgressBar inside the Dialog/Prompt/Progress Window */
529
+ /** @description Specifies the current value displayed within the TextBox or ProgressBar component inside a Dialog, Prompt, or Progress Window. This value can represent user input (for TextBox) or progress status (for ProgressBar) and is used to dynamically update the UI element's content or state. */
530
530
  get value() {
531
531
  return this.nativeElement ? this.nativeElement.value : undefined;
532
532
  }
533
533
  set value(value) {
534
534
  this.nativeElement ? this.nativeElement.value = value : undefined;
535
535
  }
536
- /** @description Determines the actual parent of the element. The window can size and move only in the area of that element. */
536
+ /** @description Specifies the actual parent element of the target element. The window's sizing and movement are restricted to the boundaries of this parent element, meaning the window can only be resized or repositioned within the visible area of the designated parent. */
537
537
  get windowParent() {
538
538
  return this.nativeElement ? this.nativeElement.windowParent : undefined;
539
539
  }
540
540
  set windowParent(value) {
541
541
  this.nativeElement ? this.nativeElement.windowParent = value : undefined;
542
542
  }
543
- /** @description Indicates how the input wraps text. Applicable only to MultilinePromptWindow. */
543
+ /** @description Specifies the text-wrapping behavior for the input field. Note: This property is only relevant when used with the MultilinePromptWindow component. */
544
544
  get wrap() {
545
545
  return this.nativeElement ? this.nativeElement.wrap : undefined;
546
546
  }
547
547
  set wrap(value) {
548
548
  this.nativeElement ? this.nativeElement.wrap = value : undefined;
549
549
  }
550
- /** @description Appends a tabitem to the end of the list of tab items inside element.
550
+ /** @description Appends a new tab item to the end of the existing list of tab items within the specified parent element. This operation updates the parent element's tab item collection, ensuring the new tab appears as the last item in the tab navigation.
551
551
  * @param {Node} node. A TabItem element that should be added to the rest of the items as the last item.
552
552
  * @returns {Node}
553
553
  */
@@ -563,7 +563,13 @@ export class WindowComponent extends BaseElement {
563
563
  const result = await getResultOnRender();
564
564
  return result;
565
565
  }
566
- /** @description Sets the window to the top level so the user can interact with it.
566
+ appendChildSync(node) {
567
+ if (this.nativeElement.isRendered) {
568
+ return this.nativeElement.appendChild(node);
569
+ }
570
+ return null;
571
+ }
572
+ /** @description Sets the window to the highest z-order level, bringing it to the foreground and ensuring it is visible and accessible for user interaction above all other open windows.
567
573
  */
568
574
  bringToFront() {
569
575
  if (this.nativeElement.isRendered) {
@@ -575,7 +581,7 @@ export class WindowComponent extends BaseElement {
575
581
  });
576
582
  }
577
583
  }
578
- /** @description Clears the content of the Window.
584
+ /** @description Removes all existing content from the window, effectively resetting the window’s display area to an empty state. This operation clears any text, images, or elements currently visible within the window.
579
585
  */
580
586
  clear() {
581
587
  if (this.nativeElement.isRendered) {
@@ -587,7 +593,7 @@ export class WindowComponent extends BaseElement {
587
593
  });
588
594
  }
589
595
  }
590
- /** @description Closes the window.
596
+ /** @description Closes the currently active window in the application, terminating its user interface and releasing any associated resources. If there are unsaved changes or prompts, the user may be asked to confirm before the window is closed.
591
597
  */
592
598
  close() {
593
599
  if (this.nativeElement.isRendered) {
@@ -599,7 +605,7 @@ export class WindowComponent extends BaseElement {
599
605
  });
600
606
  }
601
607
  }
602
- /** @description Collapses the window.
608
+ /** @description Minimizes the window, reducing it to a smaller icon or hidden state, without closing the application.
603
609
  * @returns {HTMLElement}
604
610
  */
605
611
  async collapse() {
@@ -614,7 +620,13 @@ export class WindowComponent extends BaseElement {
614
620
  const result = await getResultOnRender();
615
621
  return result;
616
622
  }
617
- /** @description Makes sure a tab item is visible by scrolling to it. Applicable only to TabsWindow.
623
+ collapseSync() {
624
+ if (this.nativeElement.isRendered) {
625
+ return this.nativeElement.collapse();
626
+ }
627
+ return null;
628
+ }
629
+ /** @description Ensures the specified tab item is brought into view by automatically scrolling the tab bar as needed. This functionality is exclusive to the TabsWindow component.
618
630
  * @param {number} index. The index of the tab to scroll to.
619
631
  */
620
632
  ensureVisible(index) {
@@ -627,7 +639,7 @@ export class WindowComponent extends BaseElement {
627
639
  });
628
640
  }
629
641
  }
630
- /** @description Expands the window after being collapsed.
642
+ /** @description Restores the window to its full size and visibility after it has been collapsed or minimized, allowing users to view and interact with its contents again.
631
643
  * @returns {any[]}
632
644
  */
633
645
  async expand() {
@@ -642,7 +654,13 @@ export class WindowComponent extends BaseElement {
642
654
  const result = await getResultOnRender();
643
655
  return result;
644
656
  }
645
- /** @description Inserts a new tab and an associated content section. Applicable only to TabsWindow.
657
+ expandSync() {
658
+ if (this.nativeElement.isRendered) {
659
+ return this.nativeElement.expand();
660
+ }
661
+ return null;
662
+ }
663
+ /** @description Inserts a new tab along with its corresponding content section into the user interface. This function is specifically designed for use within the TabsWindow component and will not operate outside of this context.
646
664
  * @param {number} index. The index to insert a new tab at.
647
665
  * @param {any} details. An Object with the fields "label", "labelSize", "content" and "group".
648
666
  */
@@ -656,7 +674,7 @@ export class WindowComponent extends BaseElement {
656
674
  });
657
675
  }
658
676
  }
659
- /** @description Inserts the specified "smart-tab-item" node before the reference "smart-tab-item" node. Applicable only to TabsWindow.
677
+ /** @description Inserts the specified "smart-tab-item" node directly before the reference "smart-tab-item" node within the tab collection. This operation is only applicable when manipulating tab items inside a TabsWindow component.
660
678
  * @param {Node} newNode. The "smart-tab-item" node to insert.
661
679
  * @param {Node | null} referenceNode?. The "smart-tab-item" node before which newNode is inserted.
662
680
  * @returns {Node}
@@ -673,7 +691,13 @@ export class WindowComponent extends BaseElement {
673
691
  const result = await getResultOnRender();
674
692
  return result;
675
693
  }
676
- /** @description Moves the window to a new position
694
+ insertBeforeSync(newNode, referenceNode) {
695
+ if (this.nativeElement.isRendered) {
696
+ return this.nativeElement.insertBefore(newNode, referenceNode);
697
+ }
698
+ return null;
699
+ }
700
+ /** @description Revised Description:"Sets the window's position on the screen by moving it to specified X and Y coordinates, effectively relocating the window to a new location."
677
701
  * @param {string | number} left. Left position. For example: '100px'.
678
702
  * @param {string | number} top. Top position. For example: '100px'.
679
703
  */
@@ -687,7 +711,7 @@ export class WindowComponent extends BaseElement {
687
711
  });
688
712
  }
689
713
  }
690
- /** @description Maximizes the window to fill the area.
714
+ /** @description Expands the window to occupy the entire available viewing area, ensuring it fills all usable screen space without overlapping system taskbars or menus.
691
715
  */
692
716
  maximize() {
693
717
  if (this.nativeElement.isRendered) {
@@ -699,7 +723,7 @@ export class WindowComponent extends BaseElement {
699
723
  });
700
724
  }
701
725
  }
702
- /** @description Minimizes the window.
726
+ /** @description Reduces the window to the taskbar or dock, temporarily hiding it from view without closing the application.
703
727
  */
704
728
  minimize() {
705
729
  if (this.nativeElement.isRendered) {
@@ -711,7 +735,7 @@ export class WindowComponent extends BaseElement {
711
735
  });
712
736
  }
713
737
  }
714
- /** @description Opens the window
738
+ /** @description Opens a new browser window or tab with the specified URL or content, allowing additional web pages or resources to be displayed alongside the current page.
715
739
  */
716
740
  open() {
717
741
  if (this.nativeElement.isRendered) {
@@ -723,7 +747,7 @@ export class WindowComponent extends BaseElement {
723
747
  });
724
748
  }
725
749
  }
726
- /** @description Pins the window. Disables window dragging.
750
+ /** @description Prevents the window from being moved by locking its position. Disables the ability to drag or reposition the window, ensuring it remains fixed in place.
727
751
  */
728
752
  pin() {
729
753
  if (this.nativeElement.isRendered) {
@@ -735,7 +759,7 @@ export class WindowComponent extends BaseElement {
735
759
  });
736
760
  }
737
761
  }
738
- /** @description Removes a tab and its associated content section. Applicable only to TabsWindow.
762
+ /** @description Removes a tab along with its corresponding content section from the interface. This function is designed to work exclusively within the TabsWindow component.
739
763
  * @param {number} index. The index of the tab to remove.
740
764
  */
741
765
  removeAt(index) {
@@ -748,7 +772,7 @@ export class WindowComponent extends BaseElement {
748
772
  });
749
773
  }
750
774
  }
751
- /** @description Removes a child "smart-tab-item" node. Applicable only to TabsWindow.
775
+ /** @description Removes a child node with the "smart-tab-item" tag from the parent container. Note: This operation is only supported within the TabsWindow component; attempting to use it elsewhere will have no effect.
752
776
  * @param {Node} node. The "smart-tab-item" node to remove.
753
777
  * @returns {Node}
754
778
  */
@@ -764,7 +788,13 @@ export class WindowComponent extends BaseElement {
764
788
  const result = await getResultOnRender();
765
789
  return result;
766
790
  }
767
- /** @description Restores the window to it's previous size before maximization/minimization.
791
+ removeChildSync(node) {
792
+ if (this.nativeElement.isRendered) {
793
+ return this.nativeElement.removeChild(node);
794
+ }
795
+ return null;
796
+ }
797
+ /** @description Restores the window to its previous dimensions and position before it was maximized or minimized, returning it to the exact size and location it had prior to those actions.
768
798
  */
769
799
  restore() {
770
800
  if (this.nativeElement.isRendered) {
@@ -776,7 +806,7 @@ export class WindowComponent extends BaseElement {
776
806
  });
777
807
  }
778
808
  }
779
- /** @description Selects a tab. Applicalbe only to TabsWindow elements.
809
+ /** @description Selects the specified tab within the interface. This action applies exclusively to elements of type TabsWindow.
780
810
  * @param {number} index. The index of the tab to select.
781
811
  */
782
812
  select(index) {
@@ -789,7 +819,7 @@ export class WindowComponent extends BaseElement {
789
819
  });
790
820
  }
791
821
  }
792
- /** @description Unpins the window. Enables window dragging.
822
+ /** @description Removes the pinned (fixed) state from the window, allowing the user to freely move or drag the window to a different position on the screen.
793
823
  */
794
824
  unpin() {
795
825
  if (this.nativeElement.isRendered) {
@@ -801,7 +831,7 @@ export class WindowComponent extends BaseElement {
801
831
  });
802
832
  }
803
833
  }
804
- /** @description Updates the header label.
834
+ /** @description Updates the text displayed in the header label to reflect new information or changes, ensuring that the header accurately represents the current content or context of the section.
805
835
  * @param {string} label. The new label of the Header.
806
836
  */
807
837
  updateLabel(label) {
@@ -814,7 +844,7 @@ export class WindowComponent extends BaseElement {
814
844
  });
815
845
  }
816
846
  }
817
- /** @description Updates the content.
847
+ /** @description Replaces the existing content with new or modified information, ensuring that the displayed data reflects the latest updates or changes.
818
848
  * @param {string | HTMLElement} content. The new content of the window.
819
849
  */
820
850
  updateContent(content) {
@@ -827,7 +857,7 @@ export class WindowComponent extends BaseElement {
827
857
  });
828
858
  }
829
859
  }
830
- /** @description Updates a TAB in TAB Window and its associated content section. Applies only to TabsWindow elements.
860
+ /** @description Updates an individual tab within a TabsWindow component and modifies its corresponding content section. This operation exclusively applies to elements of the TabsWindow type. Use this function to change tab labels, update active states, or refresh the content associated with a specific tab within the TabsWindow interface.
831
861
  * @param {number} index. The index of the tab to update.
832
862
  * @param {string} label. The new label of the tab. The value can be the id of an HTMLTemplateElement
833
863
  * @param {string | HTMLElement} content. The new content of the tab.
@@ -1117,4 +1147,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.6", ngImpor
1117
1147
  }], onRestore: [{
1118
1148
  type: Output
1119
1149
  }] } });
1120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQud2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vd2luZG93L3NyYy9zbWFydC53aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFNBQVMsRUFBNkIsS0FBSyxFQUErQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFKLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXJELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVF4QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQy9DLFlBQVksR0FBdUI7UUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSUosa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFtb0JsQzs4Q0FDc0M7UUFDNUIsY0FBUyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBFOzhDQUNzQztRQUM1QixXQUFNLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsWUFBTyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWxFOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0RTs4Q0FDc0M7UUFDNUIsYUFBUSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5FOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7OENBQ3NDO1FBQzVCLGVBQVUsR0FBOEIsSUFBSSxZQUFZLEVBQUUs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QyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRXZGLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2hHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRXZGLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ2xHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBRXpGLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3RHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO1FBRTdGLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtB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O3NCQURyQixLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixXQUFXO3NCQURkLEtBQUs7Z0JBVUYsS0FBSztzQkFEUixLQUFLO2dCQVVGLFlBQVk7c0JBRGYsS0FBSztnQkFVRixJQUFJO3NCQURQLEtBQUs7Z0JBVUksU0FBUztzQkFBbEIsTUFBTTtnQkFJRyxNQUFNO3NCQUFmLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTTtnQkFJRyxPQUFPO3NCQUFoQixNQUFNO2dCQUlHLFVBQVU7c0JBQW5CLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTTtnQkFJRyxXQUFXO3NCQUFwQixNQUFNO2dCQUlHLFFBQVE7c0JBQWpCLE1BQU07Z0JBSUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFJRyxVQUFVO3NCQUFuQixNQUFNO2dCQUlHLFdBQVc7c0JBQXBCLE1BQU07Z0JBSUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFJRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2luZG93IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBBbmltYXRpb24sIFdpbmRvd0F1dG9DYXBpdGFsaXplLCBXaW5kb3dEaXNwbGF5TW9kZSwgV2luZG93RHJvcFBvc2l0aW9uLCBXaW5kb3dGb290ZXJQb3NpdGlvbiwgVGFiUG9zaXRpb24sIFdpbmRvd1Jlc2l6ZU1vZGUsIFRhYlNlbGVjdGlvbk1vZGUsIFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSwgT3ZlcmZsb3csIExheW91dFBvc2l0aW9uLCBPcmllbnRhdGlvbiwgV2luZG93V3JhcCwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEaXJlY3RpdmUsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnQsIFNtYXJ0IH0gZnJvbSAnLi9zbWFydC5lbGVtZW50JztcbmV4cG9ydCB7IEFuaW1hdGlvbiwgV2luZG93QXV0b0NhcGl0YWxpemUsIFdpbmRvd0Rpc3BsYXlNb2RlLCBXaW5kb3dEcm9wUG9zaXRpb24sIFdpbmRvd0Zvb3RlclBvc2l0aW9uLCBUYWJQb3NpdGlvbiwgV2luZG93UmVzaXplTW9kZSwgVGFiU2VsZWN0aW9uTW9kZSwgV2luZG93VGFiQ2xvc2VCdXR0b25Nb2RlLCBPdmVyZmxvdywgTGF5b3V0UG9zaXRpb24sIE9yaWVudGF0aW9uLCBXaW5kb3dXcmFwLCBFbGVtZW50UmVuZGVyTW9kZX0gZnJvbSAnLi8uLi9pbmRleCc7XG5leHBvcnQgeyBTbWFydCB9IGZyb20gJy4vc21hcnQuZWxlbWVudCc7XG5leHBvcnQgeyBXaW5kb3cgfSBmcm9tICcuLy4uL2luZGV4JztcblxuXG5ARGlyZWN0aXZlKHtcblx0ZXhwb3J0QXM6ICdzbWFydC13aW5kb3cnLFx0c2VsZWN0b3I6ICdzbWFydC13aW5kb3csIFtzbWFydC13aW5kb3ddLCBzbWFydC10YWJzLXdpbmRvdywgc21hcnQtcHJvbXB0LXdpbmRvdywgc21hcnQtbXVsdGlsaW5lLXByb21wdC13aW5kb3csIHNtYXJ0LWRpYWxvZy13aW5kb3csICBzbWFydC1hbGVydC13aW5kb3csIHNtYXJ0LXByb2dyZXNzLXdpbmRvdywgc21hcnQtd2FpdC13aW5kb3cnXG59KVxuXG5leHBvcnQgY2xhc3MgV2luZG93Q29tcG9uZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblx0Y29uc3RydWN0b3IocmVmOiBFbGVtZW50UmVmPFdpbmRvdz4pIHtcblx0XHRzdXBlcihyZWYpO1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA9IHJlZi5uYXRpdmVFbGVtZW50IGFzIFdpbmRvdztcblx0fVxuXG5cdHByaXZhdGUgZXZlbnRIYW5kbGVyczogYW55W10gPSBbXTtcblxuXHRwdWJsaWMgZGVjbGFyZSBuYXRpdmVFbGVtZW50OiBXaW5kb3c7XG5cdC8qKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC5cblx0ICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb3B0aW9uYWwgb2JqZWN0IG9mIHByb3BlcnRpZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRlbXBsYXRlIGJpbmRlZCBvbmVzLlxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0aWVzID0ge30pOiBhbnkge1xuICAgIFx0dGhpcy5uYXRpdmVFbGVtZW50ID0gPFdpbmRvdz5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbWFydC13aW5kb3cnKTtcblx0XHRmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykgeyBcbiBcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudDtcblx0fVxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgJ0FkZCBOZXcnIFRhYiBpbnNpZGUgdGhlIFRhYnMgZWxlbWVudCBpcyB2aXNpYmxlLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdyAqL1xuXHRASW5wdXQoKVxuXHRnZXQgYWRkTmV3VGFiKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYWRkTmV3VGFiIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBhZGROZXdUYWIodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYWRkTmV3VGFiID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgYW5pbWF0aW9uIG1vZGUuIEFuaW1hdGlvbiBpcyBkaXNhYmxlZCB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gJ25vbmUnICovXG5cdEBJbnB1dCgpXG5cdGdldCBhbmltYXRpb24oKTogQW5pbWF0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmFuaW1hdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYW5pbWF0aW9uKHZhbHVlOiBBbmltYXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYW5pbWF0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciBhbmQgaG93IHRoZSB2YWx1ZSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBjYXBpdGFsaXplZCBhcyBpdCBpcyBlbnRlcmVkL2VkaXRlZCBieSB0aGUgdXNlci4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGF1dG9DYXBpdGFsaXplKCk6IFdpbmRvd0F1dG9DYXBpdGFsaXplIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9DYXBpdGFsaXplIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBhdXRvQ2FwaXRhbGl6ZSh2YWx1ZTogV2luZG93QXV0b0NhcGl0YWxpemUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0NhcGl0YWxpemUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3aGV0aGVyIGVsZW1lbnQgd2lsbCBhdXRvIGV4cGFuZCB3aGVuIHRoZSBpbnB1dCBvdmVyZmxvd3MgdmVydGljYWxseS4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGF1dG9FeHBhbmQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvRXhwYW5kIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBhdXRvRXhwYW5kKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9FeHBhbmQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgbGFiZWwgZm9yIHRoZSAnY2FuY2VsJyBidXR0b24gaW5zaWRlIHRoZSBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgY2FuY2VsTGFiZWwoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNhbmNlbExhYmVsIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBjYW5jZWxMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNhbmNlbExhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGxhYmVsIGZvciB0aGUgJ0NvbXBsZXRlJyBidXR0b24gaW5zaW5kZSB0aGUgUHJvZ3Jlc3MgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgY29tcGxldGVMYWJlbCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29tcGxldGVMYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgY29tcGxldGVMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbXBsZXRlTGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgbGFiZWwgZm9yIHRoZSAnQ29uZmlybScgYnV0dG9uIGluc2luZGUgdGhlIFByb21wdCBXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBjb25maXJtTGFiZWwoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbmZpcm1MYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgY29uZmlybUxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29uZmlybUxhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIHdpbmRvdyBpcyBjb2xsYXBzZWQgb3Igbm90LiBXaGVuIGNvbGxhcHNlZCB0aGUgb25seSB0aGUgaGVhZGVyIG9mIHRoZSB3aW5kb3cgaXMgdmlzaWJsZS4gKi9cblx0QElucHV0KClcblx0Z2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbGxhcHNlZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgY29sbGFwc2VkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbGxhcHNlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBXaGVuIGEgbW9kYWwgd2luZG93IGlzIG9wZW5lZCwgdGhpZCBwcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIGNsaWNraW5nIG9uIHRoZSBtYXNrIGNsb3NlcyB0aGUgd2luZG93IG9yIG5vdC4gKi9cblx0QElucHV0KClcblx0Z2V0IGNsb3NlT25NYXNrQ2xpY2soKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZU9uTWFza0NsaWNrIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBjbG9zZU9uTWFza0NsaWNrKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3NlT25NYXNrQ2xpY2sgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgZGF0YSBzb3VyY2UgdGhhdCB3aWxsIGJlIGxvYWRlZCB0byB0aGUgVGFic1dpbmRvdy4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkYXRhU291cmNlKCk6IHtsYWJlbDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmd9W10ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YVNvdXJjZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGF0YVNvdXJjZSh2YWx1ZToge2xhYmVsOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZ31bXSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kYXRhU291cmNlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHdpbmRvdyBzbmFwcGluZyBmZWF0dXJlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGlzYWJsZVNuYXAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlU25hcCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGlzYWJsZVNuYXAodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZVNuYXAgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQnkgZGVmYXVsdCB0aGUgd2luZG93IGlzIGNsb3NpbmcgYWZ0ZXIgdGhlICdFc2NhcGUnIGtleSBpcyBwcmVzc2VkLiBTZXQgdGhpcyBwcm9wZXJ0eSB0byB0cnVlLCBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoYXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNhYmxlRXNjYXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZUVzY2FwZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGlzYWJsZUVzY2FwZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlRXNjYXBlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEJ5IGRlZmF1bHQgdGhlIHdpbmRvdyBpcyBoYW5kbGluZyBrZXlib2FyZCBrZXlzIGxpa2UgJ0Fycm93cycsICdFc2NhcGUnLCBldGMuIFNldCB0aGlzIHByb3BlcnR5IHRvIHRydWUsIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdGhhdC4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc2FibGVLZXlib2FyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVLZXlib2FyZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGlzYWJsZUtleWJvYXJkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVLZXlib2FyZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGhvdyB0aGUgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIGluc2lkZSB0aGUgaW5wdXQuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc3BsYXlNb2RlKCk6IFdpbmRvd0Rpc3BsYXlNb2RlIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc3BsYXlNb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNwbGF5TW9kZSh2YWx1ZTogV2luZG93RGlzcGxheU1vZGUgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzcGxheU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuICBEZXRlcm1pbmVzIHdoZXJlIHRoZSB3aW5kb3coaXQncyB0YWIgaXRlbXMgYXMgd2VsbCkgY2FuIGJlIGRyb3BwZWQgaW5zaWRlIHRoZSBEb2NraW5nTGF5b3V0LiAgVGhlIHByb3BlcnR5IGlzIGFuIGFycmF5IHRoYXQgYWNjZXB0cyBtdWx0aXBsZSBwb3NpdGlvbnMuIE5vdGU6IFBvc2l0aW9ucyB3aXRoIHByZWZpeCAnbGF5b3V0LScgYXJlIGFwcGxpZWQgdG8gdGhlIFRhYiBpdGVtIGNoaWxkcmVuIG9mIHRoZSBUYWJzV2lkbm93IG93bmVyIHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC4gVGhlIHJlc3Qgb2YgdGhlIHBvc2l0aW9ucyBpbmRpY2F0ZSB0aGUgYWxsb3dlZCBkcm9wIHBvc2l0aW9uIGluc2lkZSB0aGUgaG92ZXJlZCB0YXJnZXQoVGFic1dpbmRvdykuIFVzZWQgb25seSBieSBqcXhEb2NraW5nTGF5b3V0IGN1c3RvbSBlbGVtZW50cy4gRGV0ZXJtaW5lcyB0aGUgcG9zc2libGUgZHJvcCBwb3NpdGlvbiBpbnNpZGUgdGhlIERvY2tpbmdMYXlvdXQuIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhbGxvd2VkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZHJvcFBvc2l0aW9uKCk6IFdpbmRvd0Ryb3BQb3NpdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRyb3BQb3NpdGlvbih2YWx1ZTogV2luZG93RHJvcFBvc2l0aW9uIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BQb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBIGNhbGxiYWNrIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBuZXcgZm9ybWF0IGZvciB0aGUgbGFiZWwgb2YgdGhlIFByb2dyZXNzIEJhci4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZm9ybWF0RnVuY3Rpb24oKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvcm1hdEZ1bmN0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBmb3JtYXRGdW5jdGlvbih2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvcm1hdEZ1bmN0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmb290ZXIgb2YgdGhlIHdpbmRvdyBlbGVtZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZm9vdGVyUG9zaXRpb24oKTogV2luZG93Rm9vdGVyUG9zaXRpb24gfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9vdGVyUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGZvb3RlclBvc2l0aW9uKHZhbHVlOiBXaW5kb3dGb290ZXJQb3NpdGlvbiB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJQb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIERpYWxvZyBzZWN0aW9uIG9mIHRoZSB3aW5kb3cuIEJ5IGRlZmF1bHQgZm9vdGVyVGVtcGxhdGUgaXMgbnVsbC4gKi9cblx0QElucHV0KClcblx0Z2V0IGZvb3RlclRlbXBsYXRlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJUZW1wbGF0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZm9vdGVyVGVtcGxhdGUodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJUZW1wbGF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXQncyB0aGUgYnV0dG9ucyB0aGF0IHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgaGVhZGVyIHNlY3Rpb24uICovXG5cdEBJbnB1dCgpXG5cdGdldCBoZWFkZXJCdXR0b25zKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlckJ1dHRvbnMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhlYWRlckJ1dHRvbnModmFsdWU6IHN0cmluZ1tdKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlckJ1dHRvbnMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBEaWFsb2cgc2VjdGlvbiBvZiB0aGUgd2luZG93LiBCeSBkZWZhdWx0IGhlYWRlclRlbXBsYXRlIGlzIG51bGwuICovXG5cdEBJbnB1dCgpXG5cdGdldCBoZWFkZXJUZW1wbGF0ZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyVGVtcGxhdGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhlYWRlclRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyVGVtcGxhdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIGhlYWRlciBvZiB0aGUgd2luZG93IGVsZW1lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBoZWFkZXJQb3NpdGlvbigpOiBUYWJQb3NpdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oZWFkZXJQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaGVhZGVyUG9zaXRpb24odmFsdWU6IFRhYlBvc2l0aW9uIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgYWRkaXRpb25hbCBoZWxwZXIgdGV4dCBiZWxvdyB0aGUgdGV4dCBib3guIFRoZSBoaW50IGlzIHZpc2libGUgb25seSB3aGVuIHRoZSB0ZXh0IGJveCBpcyBmb2N1ZWQuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGhpbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhpbnQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhpbnQodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oaW50ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBQcm9ncmVzcyBiYXIgdG8gaW5kZXRlcm1pbmF0ZSBzdGF0ZShudWxsKSBhbmQgc3RhcnRzIHRoZSBhbmltYXRpb24uIEFwcGxpY2FibGUgb25seSB0byBQcm9ncmVzc1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGluZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBpbmRldGVybWluYXRlKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZmlsbGluZyBkaXJlY3Rpb24gb2YgdGhlIFByb2dyZXNzIEJhci4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaW52ZXJ0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbnZlcnRlZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaW52ZXJ0ZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW52ZXJ0ZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIG9mIHRoZSB3aW5kb3cgdGhhdCBhcHBlYXJzIGluIHRoZSBoZWFkZXIgYXJlYS4gKi9cblx0QElucHV0KClcblx0Z2V0IGxhYmVsKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbGFiZWwodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBXaGVuIGVuYWJsZWQgdGhlIHJlc2l6aW5nIG9wZXJhdGlvbiBoYXBwZW5zIGxpdmUuIEJ5IGRlZmF1bHQgaXQncyBub3QgZW5hYmxlZCBhbmQgZHVyaW5nIHJlc2l6aW5nIGEgaGlnaGxpZ2h0ZXIgYXJvdW5kIHRoZSBlZGdlcyBvZiB0aGUgd2luZG93IGFwcGVhcnMgdG8gb3V0bGluZSAgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgZWxlbWVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IGxpdmVSZXNpemUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5saXZlUmVzaXplIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsaXZlUmVzaXplKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxpdmVSZXNpemUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cgd2hlbiB1c2VkIHdpdGggYSBEb2NraW5nTGF5b3V0IGN1c3RvbSBlbGVtZW50LlVzZWQgb25seSBieSBqcXhEb2NraW5nTGF5b3V0LiBEZXRlcm1pbmVzIHRoZSBvd25lciBqcXhEb2NraW5nTGF5b3V0ICB0aGF0IHRoZSB3aW5kb3cgYmVsb25ncyB0by4gV2hlbiB0aGUgdGFic1dpbmRvdyBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBEb2NraW5nTGF5b3V0IGVsZW1lbnQsIHRoZSBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgaXQgYmVsb25ncyB0byB0aGF0IHBhcnRpY3VsYXIgRG9ja2luZ2xheW91dC4gQWNjZXB0cyBhIHN0cmluZywgcmVwcmVzZW50aW5nIHRoZSBJRCBvZiBhIGpxeERvY2tpbmdMYXlvdXQgb24gdGhlIHBhZ2UsIG9yIGFuIGluc3RhbmNlIG9mIGpxeERva2NpbmdMYXlvdXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsYXlvdXQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxheW91dCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbGF5b3V0KHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGF5b3V0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgdW5sb2NrS2V5IHdoaWNoIHVubG9ja3MgdGhlIHByb2R1Y3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCB1bmxvY2tLZXkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVubG9ja0tleSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdW5sb2NrS2V5KHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudW5sb2NrS2V5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgbGFuZ3VhZ2UuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJvcGVydHkgbWVzc2FnZXMuICAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9jYWxlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvY2FsZSh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdyB3aGVuIGRvY2tlZCBpbnNpZGUgYSBEb2NraW5nTGF5b3V0IEN1c3RvbSBFbGVtZW50LkRldGVybWluZXMgb2YgdGhlIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgb3Igbm90LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9ja2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9ja2VkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsb2NrZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9ja2VkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENhbGxiYWNrLCByZWxhdGVkIHRvIGxvY2FsaXphdGlvbiBtb2R1bGUuICAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9jYWxpemVGb3JtYXRGdW5jdGlvbigpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxpemVGb3JtYXRGdW5jdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9jYWxpemVGb3JtYXRGdW5jdGlvbih2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsaXplRm9ybWF0RnVuY3Rpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIG1heGltaXplZCBvciBub3QuIFdoZW4gbWF4aW1pemVkIHRoZSB3aW5kb3cgY292ZXJzIHRoZSB3aG9sZSB2aWV3cG9ydC4gKi9cblx0QElucHV0KClcblx0Z2V0IG1heGltaXplZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWF4aW1pemVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgYW4gb2JqZWN0IHNwZWNpZnlpbmcgc3RyaW5ncyB1c2VkIGluIHRoZSB3aWRnZXQgdGhhdCBjYW4gYmUgbG9jYWxpemVkLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByb3BlcnR5IGxvY2FsZS4gICovXG5cdEBJbnB1dCgpXG5cdGdldCBtZXNzYWdlcygpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1lc3NhZ2VzKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIG1vZGFsIG9yIG5vdC4gSWYgdHJ1ZSB0aGUgdXNlciBjYW4gb25seSBpbnRlcmFjdCB3aXRoIHRoZSB3aW5kb3cgYW5kIG5vdGhpbmcgZWxzZSBvbiB0aGUgcGFnZS4gKi9cblx0QElucHV0KClcblx0Z2V0IG1vZGFsKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubW9kYWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1vZGFsKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1vZGFsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEFwcGxpY2FibGUgdG8gVGFic1dpbmRvdyB3aGVuIGRvY2tlZCBpbnNpZGUgYSBEb2NraW5nTGF5b3V0IEN1c3RvbSBFbGVtZW50LiBEZXRlcm1pbmVzIHRoZSBtYXggc2l6ZSBvZiB0aGUgaXRlbS4gQXBwbGljYWJsZSB0byBQcm9ncmVzcyBXaW5kb3cgYnkgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBvZiB0aGUgUHJvZ3Jlc3NCYXIuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtYXgoKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1heCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBEb2NraW5nTGF5b3V0IEN1c3RvbSBFbGVtZW50LiBEZXRlcm1pbmVzIHRoZSBtaW4gc2l6ZSBvZiB0aGUgaXRlbS4gQXBwbGljYWJsZSB0byBQcm9ncmVzcyBXaW5kb3cgYnkgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbWluaW11IG9mIHRoZSBQcm9ncmVzc0Jhci4gKi9cblx0QElucHV0KClcblx0Z2V0IG1pbigpOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWluKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pemVkIG9yIG5vdC4gV2hlbiBtaW5pbWl6ZWQgdGhlIHdpbmRvdyBpcyBkb2NrZWQgYXQgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBvZiB0aGUgdmlld3BvcnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtaW5pbWl6ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1pbmltaXplZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHVzZXIgY2FuIGVudGVyLiBBcHBsaWNhYmxlIHRvIFByb21wdC9NdWx0aWxpbmVQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWF4TGVuZ3RoKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXhMZW5ndGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1heExlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heExlbmd0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgdXNlciBoYXZlIHRvIGVudGVyIHRvIHRyaWdnZXIgdGhlIGF1dG8gY29tcGxldGUgZnVuY3Rpb25hbGl0eS4gQXBwbGljYWJsZSB0byBQcm9tcHQvTXVsdGlsaW5lUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IG1pbkxlbmd0aCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluTGVuZ3RoIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtaW5MZW5ndGgodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5MZW5ndGggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIHZpc2libGUgb3Igbm90LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBvcGVuZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIHdpbmRvdyBpcyBwaW5uZWQgb3Igbm90LiBQaW5uZWQgd2luZG93IGlzIGEgd2luZG93IHRoYXQgY2FuJ3QgYmUgZHJhZ2dlZCBidXQgY2FuIGJlIHJlc2l6ZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBwaW5uZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5waW5uZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHBpbm5lZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5waW5uZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgaW5wdXQncyBwbGFjZWhvbGRlci4gQXBwbGljYWJsZSB0byBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGxhYmVsIGZvciB0aGUgSW5wdXQgaW5zaW5kZSB0aGUgUHJvbXB0V2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcHJvbXB0TGFiZWwoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnByb21wdExhYmVsIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBwcm9tcHRMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnByb21wdExhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIElmIHRoZSBlbGVtZW50IGlzIHJlYWRvbmx5LCB1c2VycyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpdC4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlYWRvbmx5KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVhZG9ubHkgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlYWRvbmx5KHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlYWRvbmx5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFdoZW4gYXBwbGllZCBhIHJlc2l6ZSBpbmRpY2F0b3IgaXMgZGlzcGxheWVkIGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyIG9mIHRoZSB3aW5kb3cgYW5kIHJlc2l6aW5nIG9wZXJhdGlvbiBjYW4gYmUgaW5pdGlhdGVkIG9ubHkgZnJvbSBpdHMgcG9zaXRpb24uICovXG5cdEBJbnB1dCgpXG5cdGdldCByZXNpemVJbmRpY2F0b3IoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVJbmRpY2F0b3IgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlc2l6ZUluZGljYXRvcih2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVJbmRpY2F0b3IgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcmVzaXppbmcgbW9kZSBvZiB0aGUgd2luZG93LiAgU2V2ZXJhbCBtb2RlcyBhcmUgYXZhaWxhYmxlOiAgIG5vbmUgLSByZXNpemluZyBpcyBkaXNhYmxlZC4gIHZlcnRpY2FsIC0gdmVydGljYWwgcmVzaXppbmcgaXMgYWxsb3dlZC4gIGhvcml6b250YWwgLSBob3Jpem9udGFsIHJlc2l6aW5nIGlzIGFsbG93ZWQuIGJvdGggLSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCByZXNpemluZyBpcyBhbGxvd2VkLiB0b3AgLSB0aGUgd2luZG93IGNhbiBvbmx5IGJlIHJlc2l6ZWQgZnJvbSB0aGUgdG9wIHNpZGUuIGJvdHRvbSAtIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlIG9ubHkgZnJvbSB0aGUgYm90dG9tIHNpZGUuIGxlZnQgLSB0aGUgd2luZG93IGNhbiBiZSByZXNpemVkIG9ubHkgZnJvbSB0aGUgbGVmdCBzaWRlLiByaWdodCAtIHRoZSB3aW5kb3cgY2FuIGJlIHJlc2l6ZWQgb25seSBmcm9tIHRoZSByaWdodCBzaWRlLiAgKi9cblx0QElucHV0KClcblx0Z2V0IHJlc2l6ZU1vZGUoKTogV2luZG93UmVzaXplTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVNb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZXNpemVNb2RlKHZhbHVlOiBXaW5kb3dSZXNpemVNb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYWxpZ25lZCB0byBzdXBwb3J0IGxvY2FsZXMgdXNpbmcgcmlnaHQtdG8tbGVmdCBmb250cy4gKi9cblx0QElucHV0KClcblx0Z2V0IHJpZ2h0VG9MZWZ0KCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmlnaHRUb0xlZnQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJpZ2h0VG9MZWZ0KHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJpZ2h0VG9MZWZ0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGF0IHRoZSB1c2VyIG11c3QgZmlsbCB0aGUgaW5wdXQgYmVmb3JlIHN1Ym1pdHRpbmcgYSBmb3JtIHdpdGggdGhlIHRleHQgYm94LkFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0aGF0IHdpbGwgYXBwZWFyIGlmIHJlcXVpcmVkIGlzIHNldCBhbmQgbm8gdmFsdWUgaXMgcHJvdmlkZWQgaW4gdGhlIGlucHV0LiBBcHBsaWNhYmxlIHRvIFByb21wdCBXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCByZXF1aXJlZE1lc3NhZ2UoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkTWVzc2FnZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVxdWlyZWRNZXNzYWdlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWRNZXNzYWdlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgd2lsbCBiZSBzZWxlY3RlZCBvbiBmb2N1cyBvciBub3QuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdEFsbE9uRm9jdXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RBbGxPbkZvY3VzIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3RBbGxPbkZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdEFsbE9uRm9jdXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHdoaWNoIHRhYiBpcyBzZWxlY3RlZC4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzZWxlY3RlZEluZGV4KCk6IG51bWJlciB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRJbmRleCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0ZWRJbmRleCh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZEluZGV4ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHdheSB0aGUgdXNlciBjYW4gc3dpdGNoIGJldHdlZW4gdGFicy4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzZWxlY3Rpb25Nb2RlKCk6IFRhYlNlbGVjdGlvbk1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uTW9kZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0aW9uTW9kZSh2YWx1ZTogVGFiU2VsZWN0aW9uTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25Nb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvbkVuZCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25FbmQodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHRoZSBpbmRleCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvblN0YXJ0KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0aW9uU3RhcnQodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBFbmFibGVzL0Rpc2FibGVkIHRoZSBsYWJlbCBmb3IgdGhlIFByb2dyZXNzIEJhci4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzIFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNob3dQcm9ncmVzc1ZhbHVlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2hvd1Byb2dyZXNzVmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNob3dQcm9ncmVzc1ZhbHVlKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNob3dQcm9ncmVzc1ZhbHVlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyB0aGUgc2libGluZ3MgKHRoYXQgc2hhcmUgdGhlIHNhbWUgcGFyZW50KSBvZiBhIExheW91dFBhbmVsIGl0ZW0gdGhhdCBpcyBkb2NrZWQgaW5zaWRlIGEgRG9ja2luZ0xheW91dC4gVGhlIHNpYmxpbmdzIGFyZSBhbHNvIERvY2tpbmdMYXlvdXQgaXRlbXMgKCBMYXlvdXRQYW5lbHMpLkFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzaWJsaW5ncygpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2libGluZ3MgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNpYmxpbmdzKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2libGluZ3MgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gbmVzdGVkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuIERldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGl0ZW0uICovXG5cdEBJbnB1dCgpXG5cdGdldCBzaXplKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaXplIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzaXplKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2l6ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hldGhlciB0aGUgZWxlbWVudCBpcyB0byBoYXZlIGl0cyBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2VkIG9yIG5vdC4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNwZWxsQ2hlY2soKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zcGVsbENoZWNrIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzcGVsbENoZWNrKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNwZWxsQ2hlY2sgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHdoZXRoZXIgY2xvc2UgYnV0dG9ucyBhcmUgZGlzcGxheWVkIGluc2lkZSB0aGUgVGFiIFN0cmlwIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYkNsb3NlQnV0dG9ucygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYkNsb3NlQnV0dG9ucyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGFiQ2xvc2VCdXR0b25zKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYkNsb3NlQnV0dG9ucyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSBjbG9zZSBidXR0b24gaXMgdmlzaWJsZSBvbiBzZWxlY3Qgb3IgYWx3YXlzLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYkNsb3NlQnV0dG9uTW9kZSgpOiBXaW5kb3dUYWJDbG9zZUJ1dHRvbk1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiQ2xvc2VCdXR0b25Nb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB0YWJDbG9zZUJ1dHRvbk1vZGUodmFsdWU6IFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJDbG9zZUJ1dHRvbk1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBUYWJzIHNjcm9sbCBidXR0b25zIGJlaGF2aW9yLiBBcHBsaWNhYmxlIG9ubHkgd2hlbiB0YWJMYXlvdXQgaXMgJ3Njcm9sbCcuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiT3ZlcmZsb3coKTogT3ZlcmZsb3cgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiT3ZlcmZsb3cgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYk92ZXJmbG93KHZhbHVlOiBPdmVyZmxvdyB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJPdmVyZmxvdyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRldG1pbmVzIFRhYiBTdHJpcCBpcyBwb3NpdGlvbmVkIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYlBvc2l0aW9uKCk6IFRhYlBvc2l0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYlBvc2l0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB0YWJQb3NpdGlvbih2YWx1ZTogVGFiUG9zaXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiUG9zaXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Nyb2xsIGJ1dHRvbnMgaW5zaWRlIHRoZSBUYWIgaGVhZGVyIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYlNjcm9sbEJ1dHRvbnNQb3NpdGlvbigpOiBMYXlvdXRQb3NpdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJTY3JvbGxCdXR0b25zUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYlNjcm9sbEJ1dHRvbnNQb3NpdGlvbih2YWx1ZTogTGF5b3V0UG9zaXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiU2Nyb2xsQnV0dG9uc1Bvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHRleHQgaW4gdGhlIHRhYnMgbGFiZWxzIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYlRleHRPcmllbnRhdGlvbigpOiBPcmllbnRhdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJUZXh0T3JpZW50YXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYlRleHRPcmllbnRhdGlvbih2YWx1ZTogT3JpZW50YXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiVGV4dE9yaWVudGF0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHRoZW1lLiBUaGVtZSBkZWZpbmVzIHRoZSBsb29rIG9mIHRoZSBlbGVtZW50ICovXG5cdEBJbnB1dCgpXG5cdGdldCB0aGVtZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGhlbWUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRoZW1lKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGhlbWUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSWYgaXMgc2V0IHRvIHRydWUsIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBmb2N1c2VkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdW5mb2N1c2FibGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmZvY3VzYWJsZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdW5mb2N1c2FibGUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudW5mb2N1c2FibGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdmFsdWUgb2YgdGhlIFRleHRCb3gvUHJvZ3Jlc3NCYXIgaW5zaWRlIHRoZSBEaWFsb2cvUHJvbXB0L1Byb2dyZXNzIFdpbmRvdyAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGFjdHVhbCBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuIFRoZSB3aW5kb3cgY2FuIHNpemUgYW5kIG1vdmUgb25seSBpbiB0aGUgYXJlYSBvZiB0aGF0IGVsZW1lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCB3aW5kb3dQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LndpbmRvd1BhcmVudCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgd2luZG93UGFyZW50KHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud2luZG93UGFyZW50ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyBob3cgdGhlIGlucHV0IHdyYXBzIHRleHQuIEFwcGxpY2FibGUgb25seSB0byBNdWx0aWxpbmVQcm9tcHRXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCB3cmFwKCk6IFdpbmRvd1dyYXAgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud3JhcCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgd3JhcCh2YWx1ZTogV2luZG93V3JhcCB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC53cmFwID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGp1c3QgYmVmb3JlIHRoZSB3aW5kb3cgc3RhcnRzIG9wZW5pbmcuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25PcGVuaW5nOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgd2luZG93IGlzIG9wZW5lZCggdmlzaWJsZSApLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uT3BlbjogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGp1c3QgYmVmb3JlIHRoZSB3aW5kb3cgc3RhcnRzIGNsb3NpbmcuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25DbG9zaW5nOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZCggaGlkZGVuIClcblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgd2luZG93IGlzIGNvbGxhcHNlZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB3aW5kb3cncyBkcmFnZ2luZyBpcyBlbmRlZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkRyYWdFbmQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHdpbmRvdydzIGRyYWdnaW5nIGlzIHN0YXJ0ZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25EcmFnU3RhcnQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgZXhwYW5kZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25FeHBhbmQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgbWF4aW1pemVkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uTWF4aW1pemU6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgbWluaW1pemVkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uTWluaW1pemU6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHdpbmRvdydzIHJlc2l6aW5nIGlzIGVuZGVkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uUmVzaXplRW5kOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB3aW5kb3cncyByZXNpemluZyBpcyBzdGFydGVkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uUmVzaXplU3RhcnQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzdG9yZWQgdG8gaXQncyBwcmV2aW91cyBzdGF0ZSBiZWZvcmUgbWF4aW1pemF0aW9uLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uUmVzdG9yZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIEFwcGVuZHMgYSB0YWJpdGVtIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgdGFiIGl0ZW1zIGluc2lkZSBlbGVtZW50LiBcblx0KiBAcGFyYW0ge05vZGV9IG5vZGUuIEEgVGFiSXRlbSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSByZXN0IG9mIHRoZSBpdGVtcyBhcyB0aGUgbGFzdCBpdGVtLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgYXBwZW5kQ2hpbGQobm9kZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHdpbmRvdyB0byB0aGUgdG9wIGxldmVsIHNvIHRoZSB1c2VyIGNhbiBpbnRlcmFjdCB3aXRoIGl0LiBcblx0Ki9cbiAgICBwdWJsaWMgYnJpbmdUb0Zyb250KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5icmluZ1RvRnJvbnQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2xlYXJzIHRoZSBjb250ZW50IG9mIHRoZSBXaW5kb3cuIFxuXHQqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xlYXIoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGVhcigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDbG9zZXMgdGhlIHdpbmRvdy4gXG5cdCovXG4gICAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENvbGxhcHNlcyB0aGUgd2luZG93LiBcblx0KiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICovXG5cdHB1YmxpYyBhc3luYyBjb2xsYXBzZSgpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29sbGFwc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE1ha2VzIHN1cmUgYSB0YWIgaXRlbSBpcyB2aXNpYmxlIGJ5IHNjcm9sbGluZyB0byBpdC4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBpbmRleC4gVGhlIGluZGV4IG9mIHRoZSB0YWIgdG8gc2Nyb2xsIHRvLlxuXHQqL1xuICAgIHB1YmxpYyBlbnN1cmVWaXNpYmxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZW5zdXJlVmlzaWJsZShpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuZW5zdXJlVmlzaWJsZShpbmRleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEV4cGFuZHMgdGhlIHdpbmRvdyBhZnRlciBiZWluZyBjb2xsYXBzZWQuIFxuXHQqIEByZXR1cm5zIHthbnlbXX1cbiAgKi9cblx0cHVibGljIGFzeW5jIGV4cGFuZCgpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZXhwYW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJbnNlcnRzIGEgbmV3IHRhYiBhbmQgYW4gYXNzb2NpYXRlZCBjb250ZW50IHNlY3Rpb24uIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiBcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCB0byBpbnNlcnQgYSBuZXcgdGFiIGF0LlxuXHQqIEBwYXJhbSB7YW55fSBkZXRhaWxzLiBBbiBPYmplY3Qgd2l0aCB0aGUgZmllbGRzIFwibGFiZWxcIiwgXCJsYWJlbFNpemVcIiwgXCJjb250ZW50XCIgYW5kIFwiZ3JvdXBcIi5cblx0Ki9cbiAgICBwdWJsaWMgaW5zZXJ0KGluZGV4OiBudW1iZXIsIGRldGFpbHM6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5pbnNlcnQoaW5kZXgsIGRldGFpbHMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydChpbmRleCwgZGV0YWlscyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluc2VydHMgdGhlIHNwZWNpZmllZCBcInNtYXJ0LXRhYi1pdGVtXCIgbm9kZSBiZWZvcmUgdGhlIHJlZmVyZW5jZSBcInNtYXJ0LXRhYi1pdGVtXCIgbm9kZS4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuIFxuXHQqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZS4gVGhlIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIHRvIGluc2VydC5cblx0KiBAcGFyYW0ge05vZGUgfCBudWxsfSByZWZlcmVuY2VOb2RlPy4gVGhlIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIGJlZm9yZSB3aGljaCBuZXdOb2RlIGlzIGluc2VydGVkLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGU/KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE1vdmVzIHRoZSB3aW5kb3cgdG8gYSBuZXcgcG9zaXRpb24gXG5cdCogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXJ9IGxlZnQuIExlZnQgcG9zaXRpb24uIEZvciBleGFtcGxlOiAnMTAwcHgnLiBcblx0KiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gdG9wLiBUb3AgcG9zaXRpb24uIEZvciBleGFtcGxlOiAnMTAwcHgnLiBcblx0Ki9cbiAgICBwdWJsaWMgbW92ZShsZWZ0OiBzdHJpbmcgfCBudW1iZXIsIHRvcDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm1vdmUobGVmdCwgdG9wKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5tb3ZlKGxlZnQsIHRvcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE1heGltaXplcyB0aGUgd2luZG93IHRvIGZpbGwgdGhlIGFyZWEuIFxuXHQqL1xuICAgIHB1YmxpYyBtYXhpbWl6ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4aW1pemUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5tYXhpbWl6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBNaW5pbWl6ZXMgdGhlIHdpbmRvdy4gXG5cdCovXG4gICAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm1pbmltaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE9wZW5zIHRoZSB3aW5kb3cgXG5cdCovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFBpbnMgdGhlIHdpbmRvdy4gRGlzYWJsZXMgd2luZG93IGRyYWdnaW5nLiBcblx0Ki9cbiAgICBwdWJsaWMgcGluKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIHRhYiBhbmQgaXRzIGFzc29jaWF0ZWQgY29udGVudCBzZWN0aW9uLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IGluZGV4LiBUaGUgaW5kZXggb2YgdGhlIHRhYiB0byByZW1vdmUuXG5cdCovXG4gICAgcHVibGljIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlbW92ZUF0KGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIGNoaWxkIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBUaGUgXCJzbWFydC10YWItaXRlbVwiIG5vZGUgdG8gcmVtb3ZlLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgcmVtb3ZlQ2hpbGQobm9kZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlc3RvcmVzIHRoZSB3aW5kb3cgdG8gaXQncyBwcmV2aW91cyBzaXplIGJlZm9yZSBtYXhpbWl6YXRpb24vbWluaW1pemF0aW9uLiBcblx0Ki9cbiAgICBwdWJsaWMgcmVzdG9yZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzdG9yZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlc3RvcmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2VsZWN0cyBhIHRhYi4gIEFwcGxpY2FsYmUgb25seSB0byBUYWJzV2luZG93IGVsZW1lbnRzLiBcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHNlbGVjdC5cblx0Ki9cbiAgICBwdWJsaWMgc2VsZWN0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3QoaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBVbnBpbnMgdGhlIHdpbmRvdy4gRW5hYmxlcyB3aW5kb3cgZHJhZ2dpbmcuIFxuXHQqL1xuICAgIHB1YmxpYyB1bnBpbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudW5waW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51bnBpbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIHRoZSBoZWFkZXIgbGFiZWwuIFxuXHQqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbC4gVGhlIG5ldyBsYWJlbCBvZiB0aGUgSGVhZGVyLlxuXHQqL1xuICAgIHB1YmxpYyB1cGRhdGVMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZUxhYmVsKGxhYmVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51cGRhdGVMYWJlbChsYWJlbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgdGhlIGNvbnRlbnQuIFxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgSFRNTEVsZW1lbnR9IGNvbnRlbnQuIFRoZSBuZXcgY29udGVudCBvZiB0aGUgd2luZG93LlxuXHQqL1xuICAgIHB1YmxpYyB1cGRhdGVDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZUNvbnRlbnQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlQ29udGVudChjb250ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhIFRBQiBpbiBUQUIgV2luZG93IGFuZCBpdHMgYXNzb2NpYXRlZCBjb250ZW50IHNlY3Rpb24uICBBcHBsaWVzIG9ubHkgdG8gVGFic1dpbmRvdyBlbGVtZW50cy4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IGluZGV4LiBUaGUgaW5kZXggb2YgdGhlIHRhYiB0byB1cGRhdGUuXG5cdCogQHBhcmFtIHtzdHJpbmd9IGxhYmVsLiBUaGUgbmV3IGxhYmVsIG9mIHRoZSB0YWIuIFRoZSB2YWx1ZSBjYW4gYmUgdGhlIGlkIG9mIGFuIEhUTUxUZW1wbGF0ZUVsZW1lbnRcblx0KiBAcGFyYW0ge3N0cmluZyB8IEhUTUxFbGVtZW50fSBjb250ZW50LiBUaGUgbmV3IGNvbnRlbnQgb2YgdGhlIHRhYi5cblx0Ki9cbiAgICBwdWJsaWMgdXBkYXRlKGluZGV4OiBudW1iZXIsIGxhYmVsOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZShpbmRleCwgbGFiZWwsIGNvbnRlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZShpbmRleCwgbGFiZWwsIGNvbnRlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXHRnZXQgaXNSZW5kZXJlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQgOiBmYWxzZTtcblx0fVxuXG5cdG5nT25Jbml0KCkge1xuXHR9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcblxuICAgICAgdGhhdC5vbkNyZWF0ZS5lbWl0KHRoYXQubmF0aXZlRWxlbWVudCk7XG5cblx0XHRpZiAoU21hcnQpIFNtYXJ0LlJlbmRlcigpO1xuXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NtYXJ0LWFuZ3VsYXInKTtcblxuXHRcdGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKSB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHsgdGhhdC5vblJlYWR5LmVtaXQodGhhdC5uYXRpdmVFbGVtZW50KTsgfSk7XG5cdFx0dGhpcy5saXN0ZW4oKTtcblx0fVxuXG5cdG5nT25EZXN0cm95KCkge1xuXHRcdHRoaXMudW5saXN0ZW4oKTtcblx0fVxuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcblx0XHRpZiAodGhpcy5uYXRpdmVFbGVtZW50ICYmIHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IHByb3BOYW1lIGluIGNoYW5nZXMpIHtcblx0XHRcdFx0aWYgKGNoYW5nZXMuaGFzT3duUHJvcGVydHkocHJvcE5hbWUpKSB7XG5cdFx0XHRcdFx0dGhpcy5uYXRpdmVFbGVtZW50W3Byb3BOYW1lXSA9IGNoYW5nZXNbcHJvcE5hbWVdLmN1cnJlbnRWYWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQWRkIGV2ZW50IGxpc3RlbmVycy4gKi9cblx0cHJpdmF0ZSBsaXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk9wZW5pbmcuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbmluZycsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25PcGVuLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uQ2xvc2luZy5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25DbG9zZS5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkNvbGxhcHNlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbGxhcHNlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25EcmFnRW5kLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydkcmFnU3RhcnRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25EcmFnU3RhcnQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ1N0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydkcmFnU3RhcnRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25FeHBhbmQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXhwYW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydtYXhpbWl6ZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk1heGltaXplLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21heGltaXplJywgdGhhdC5ldmVudEhhbmRsZXJzWydtYXhpbWl6ZUhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uTWluaW1pemUuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWluaW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uUmVzaXplRW5kLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZUVuZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25SZXNpemVTdGFydC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXNpemVTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydyZXN0b3JlSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uUmVzdG9yZS5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXN0b3JlJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXN0b3JlSGFuZGxlciddKTtcblxuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzLiAqL1xuXHRwcml2YXRlIHVubGlzdGVuKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbmluZycsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snY29sbGFwc2VIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb2xsYXBzZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY29sbGFwc2VIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnRW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydkcmFnRW5kSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydkcmFnU3RhcnRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnU3RhcnQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snZXhwYW5kSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXhwYW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWF4aW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydtaW5pbWl6ZUhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21pbmltaXplJywgdGhhdC5ldmVudEhhbmRsZXJzWydtaW5pbWl6ZUhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplRW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZVN0YXJ0SGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplU3RhcnQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZVN0YXJ0SGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydyZXN0b3JlSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzdG9yZScsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzdG9yZUhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdH1cbn1cbiJdfQ==
1150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQud2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vd2luZG93L3NyYy9zbWFydC53aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFNBQVMsRUFBNkIsS0FBSyxFQUErQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFKLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXJELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVF4QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQy9DLFlBQVksR0FBdUI7UUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSUosa0JBQWEsR0FBVSxFQUFFLENBQUM7UUFtb0JsQzs4Q0FDc0M7UUFDNUIsY0FBUyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBFOzhDQUNzQztRQUM1QixXQUFNLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsWUFBTyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWxFOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0RTs4Q0FDc0M7UUFDNUIsYUFBUSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5FOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7OENBQ3NDO1FBQzVCLGVBQVUsR0FBOEIsSUFBSSxZQUFZLEVBQUUs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QUFTLENBQUM7SUFDdEUsQ0FBQztJQUNELElBQUksU0FBUyxDQUFDLEtBQWE7UUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDdkUsQ0FBQztJQUVELDRNQUE0TTtJQUM1TSxJQUNJLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLEtBQWM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVELDRPQUE0TztJQUM1TyxJQUNJLE1BQU07UUFDVCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbkUsQ0FBQztJQUNELElBQUksTUFBTSxDQUFDLEtBQWM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEUsQ0FBQztJQUVELDRMQUE0TDtJQUM1TCxJQUNJLFdBQVc7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEUsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsS0FBSyxD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TTtnQkFJRyxNQUFNO3NCQUFmLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTTtnQkFJRyxPQUFPO3NCQUFoQixNQUFNO2dCQUlHLFVBQVU7c0JBQW5CLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTTtnQkFJRyxXQUFXO3NCQUFwQixNQUFNO2dCQUlHLFFBQVE7c0JBQWpCLE1BQU07Z0JBSUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFJRyxVQUFVO3NCQUFuQixNQUFNO2dCQUlHLFdBQVc7c0JBQXBCLE1BQU07Z0JBSUcsYUFBYTtzQkFBdEIsTUFBTTtnQkFJRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV2luZG93IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBBbmltYXRpb24sIFdpbmRvd0F1dG9DYXBpdGFsaXplLCBXaW5kb3dEaXNwbGF5TW9kZSwgV2luZG93RHJvcFBvc2l0aW9uLCBXaW5kb3dGb290ZXJQb3NpdGlvbiwgVGFiUG9zaXRpb24sIFdpbmRvd1Jlc2l6ZU1vZGUsIFRhYlNlbGVjdGlvbk1vZGUsIFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSwgT3ZlcmZsb3csIExheW91dFBvc2l0aW9uLCBPcmllbnRhdGlvbiwgV2luZG93V3JhcCwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBEaXJlY3RpdmUsIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmFzZUVsZW1lbnQsIFNtYXJ0IH0gZnJvbSAnLi9zbWFydC5lbGVtZW50JztcbmV4cG9ydCB7IEFuaW1hdGlvbiwgV2luZG93QXV0b0NhcGl0YWxpemUsIFdpbmRvd0Rpc3BsYXlNb2RlLCBXaW5kb3dEcm9wUG9zaXRpb24sIFdpbmRvd0Zvb3RlclBvc2l0aW9uLCBUYWJQb3NpdGlvbiwgV2luZG93UmVzaXplTW9kZSwgVGFiU2VsZWN0aW9uTW9kZSwgV2luZG93VGFiQ2xvc2VCdXR0b25Nb2RlLCBPdmVyZmxvdywgTGF5b3V0UG9zaXRpb24sIE9yaWVudGF0aW9uLCBXaW5kb3dXcmFwLCBFbGVtZW50UmVuZGVyTW9kZX0gZnJvbSAnLi8uLi9pbmRleCc7XG5leHBvcnQgeyBTbWFydCB9IGZyb20gJy4vc21hcnQuZWxlbWVudCc7XG5leHBvcnQgeyBXaW5kb3cgfSBmcm9tICcuLy4uL2luZGV4JztcblxuXG5ARGlyZWN0aXZlKHtcblx0ZXhwb3J0QXM6ICdzbWFydC13aW5kb3cnLFx0c2VsZWN0b3I6ICdzbWFydC13aW5kb3csIFtzbWFydC13aW5kb3ddLCBzbWFydC10YWJzLXdpbmRvdywgc21hcnQtcHJvbXB0LXdpbmRvdywgc21hcnQtbXVsdGlsaW5lLXByb21wdC13aW5kb3csIHNtYXJ0LWRpYWxvZy13aW5kb3csICBzbWFydC1hbGVydC13aW5kb3csIHNtYXJ0LXByb2dyZXNzLXdpbmRvdywgc21hcnQtd2FpdC13aW5kb3cnXG59KVxuXG5leHBvcnQgY2xhc3MgV2luZG93Q29tcG9uZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblx0Y29uc3RydWN0b3IocmVmOiBFbGVtZW50UmVmPFdpbmRvdz4pIHtcblx0XHRzdXBlcihyZWYpO1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA9IHJlZi5uYXRpdmVFbGVtZW50IGFzIFdpbmRvdztcblx0fVxuXG5cdHByaXZhdGUgZXZlbnRIYW5kbGVyczogYW55W10gPSBbXTtcblxuXHRwdWJsaWMgZGVjbGFyZSBuYXRpdmVFbGVtZW50OiBXaW5kb3c7XG5cdC8qKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC5cblx0ICogQHBhcmFtIHByb3BlcnRpZXMgQW4gb3B0aW9uYWwgb2JqZWN0IG9mIHByb3BlcnRpZXMsIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRlbXBsYXRlIGJpbmRlZCBvbmVzLlxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0aWVzID0ge30pOiBhbnkge1xuICAgIFx0dGhpcy5uYXRpdmVFbGVtZW50ID0gPFdpbmRvdz5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzbWFydC13aW5kb3cnKTtcblx0XHRmb3IgKGxldCBwcm9wZXJ0eU5hbWUgaW4gcHJvcGVydGllcykgeyBcbiBcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudDtcblx0fVxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgJ0FkZCBOZXcnIHRhYiB3aXRoaW4gdGhlIFRhYnMgZWxlbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgb25seSByZWxldmFudCB3aGVuIHVzZWQgd2l0aCB0aGUgVGFic1dpbmRvdyBjb21wb25lbnQ7IGl0IGRvZXMgbm90IGFwcGx5IHRvIG90aGVyIGNvbXBvbmVudHMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhZGROZXdUYWIoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hZGROZXdUYWIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGFkZE5ld1RhYih2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hZGROZXdUYWIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciByZXRyaWV2ZXMgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIG1vZGUuIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBzZXQgdG8gJ25vbmUnLCBhbGwgYW5pbWF0aW9ucyBhcmUgZGlzYWJsZWQuIElmIHNldCB0byBhbnkgb3RoZXIgc3VwcG9ydGVkIHZhbHVlLCBhbmltYXRpb25zIHdpbGwgYmUgZW5hYmxlZCBhbmQgYmVoYXZlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIG1vZGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhbmltYXRpb24oKTogQW5pbWF0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmFuaW1hdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYW5pbWF0aW9uKHZhbHVlOiBBbmltYXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYW5pbWF0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENvbnRyb2xzIHRoZSBhdXRvbWF0aWMgY2FwaXRhbGl6YXRpb24gYmVoYXZpb3IgZm9yIHVzZXIgaW5wdXQgYXMgaXQgaXMgZW50ZXJlZCBvciBlZGl0ZWQuIFRoaXMgc2V0dGluZyBzcGVjaWZpZXMgd2hldGhlciBjaGFyYWN0ZXJzIGFyZSBhdXRvLWNhcGl0YWxpemVkIChlLmcuLCBzZW50ZW5jZXMsIHdvcmRzLCBvciBhbGwgY2hhcmFjdGVycykgaW4gdGhlIGlucHV0IGZpZWxkLiBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB1c2VkIHdpdGggdGhlIE11bHRpbGluZVByb21wdFdpbmRvdyBjb21wb25lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvQ2FwaXRhbGl6ZSgpOiBXaW5kb3dBdXRvQ2FwaXRhbGl6ZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ2FwaXRhbGl6ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0NhcGl0YWxpemUodmFsdWU6IFdpbmRvd0F1dG9DYXBpdGFsaXplIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9DYXBpdGFsaXplID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbGVtZW50IHNob3VsZCBhdXRvbWF0aWNhbGx5IGV4cGFuZCBpdHMgaGVpZ2h0IHRvIGFjY29tbW9kYXRlIHZlcnRpY2FsbHkgb3ZlcmZsb3dpbmcgaW5wdXQuICBOb3RlOiBUaGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIE11bHRpbGluZVByb21wdFdpbmRvdyBjb21wb25lbnRzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgYXV0b0V4cGFuZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9FeHBhbmQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGF1dG9FeHBhbmQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0V4cGFuZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSAnQ2FuY2VsJyBidXR0b24gd2l0aGluIHRoZSBQcm9tcHQgV2luZG93LiBUaGlzIGxhYmVsIGluZm9ybXMgdXNlcnMgd2hpY2ggYnV0dG9uIHdpbGwgZGlzbWlzcyBvciBjbG9zZSB0aGUgcHJvbXB0IHdpdGhvdXQgdGFraW5nIGFueSBhY3Rpb24uICovXG5cdEBJbnB1dCgpXG5cdGdldCBjYW5jZWxMYWJlbCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2FuY2VsTGFiZWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGNhbmNlbExhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2FuY2VsTGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSB0ZXh0IHRoYXQgYXBwZWFycyBvbiB0aGUgJ0NvbXBsZXRlJyBidXR0b24gd2l0aGluIHRoZSBQcm9ncmVzcyBXaW5kb3csIGFsbG93aW5nIGN1c3RvbWl6YXRpb24gb2YgdGhlIGJ1dHRvbiBsYWJlbCB0byBiZXR0ZXIgc3VpdCB1c2VyIGludGVyZmFjZSByZXF1aXJlbWVudHMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBjb21wbGV0ZUxhYmVsKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb21wbGV0ZUxhYmVsIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBjb21wbGV0ZUxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29tcGxldGVMYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHRleHQgZGlzcGxheWVkIG9uIHRoZSAnQ29uZmlybScgYnV0dG9uIHdpdGhpbiB0aGUgUHJvbXB0IFdpbmRvdywgYWxsb3dpbmcgY3VzdG9taXphdGlvbiBvZiB0aGUgYnV0dG9uIGxhYmVsIHRvIHN1aXQgeW91ciBhcHBsaWNhdGlvbidzIGNvbnRleHQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBjb25maXJtTGFiZWwoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbmZpcm1MYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgY29uZmlybUxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29uZmlybUxhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IGNvbGxhcHNlZC4gV2hlbiBzZXQgdG8gdHJ1ZSwgb25seSB0aGUgd2luZG93J3MgaGVhZGVyIGlzIGRpc3BsYXllZCB3aGlsZSB0aGUgY29udGVudCBhcmVhIGlzIGhpZGRlbi4gSWYgZmFsc2UsIGJvdGggdGhlIGhlYWRlciBhbmQgdGhlIGZ1bGwgY29udGVudCBvZiB0aGUgd2luZG93IGFyZSB2aXNpYmxlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgY29sbGFwc2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29sbGFwc2VkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBjb2xsYXBzZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29sbGFwc2VkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFdoZW4gYSBtb2RhbCB3aW5kb3cgaXMgb3BlbmVkLCB0aGlzIHByb3BlcnR5IHNwZWNpZmllcyB3aGV0aGVyIGNsaWNraW5nIG9uIHRoZSBvdmVybGF5IChtYXNrKSBvdXRzaWRlIHRoZSBtb2RhbCB3aWxsIGNsb3NlIHRoZSB3aW5kb3cuIFNldCBpdCB0byB0cnVlIHRvIGFsbG93IHVzZXJzIHRvIGRpc21pc3MgdGhlIG1vZGFsIGJ5IGNsaWNraW5nIHRoZSBtYXNrLCBvciBmYWxzZSB0byByZXF1aXJlIGFuIGV4cGxpY2l0IGFjdGlvbiAoc3VjaCBhcyBjbGlja2luZyBhIGNsb3NlIGJ1dHRvbikgdG8gY2xvc2UgdGhlIG1vZGFsLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgY2xvc2VPbk1hc2tDbGljaygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3NlT25NYXNrQ2xpY2sgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGNsb3NlT25NYXNrQ2xpY2sodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2VPbk1hc2tDbGljayA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGRhdGEgc291cmNlIHRvIGJlIGxvYWRlZCBpbnRvIHRoZSBUYWJzV2luZG93IGNvbXBvbmVudC4gVGhpcyBwcm9wZXJ0eSBpcyByZWxldmFudCBleGNsdXNpdmVseSBmb3IgdGhlIFRhYnNXaW5kb3cgYW5kIHdpbGwgbm90IGFmZmVjdCBvdGhlciBjb21wb25lbnRzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGF0YVNvdXJjZSgpOiB7bGFiZWw6IHN0cmluZywgY29udGVudDogc3RyaW5nfVtdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRhdGFTb3VyY2UgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRhdGFTb3VyY2UodmFsdWU6IHtsYWJlbDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmd9W10pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YVNvdXJjZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgYWN0aXZlIGFuZCB2aXNpYmxlIHRvIHRoZSB1c2VyLiBXaGVuIGVuYWJsZWQsIHRoZSB3aW5kb3cgaXMgb3BlcmF0aW9uYWwgYW5kIGNhbiBiZSBpbnRlcmFjdGVkIHdpdGg7IHdoZW4gZGlzYWJsZWQsIHRoZSB3aW5kb3cgaXMgaGlkZGVuIG9yIGluYWN0aXZlLCBhbmQgdXNlciBpbnRlcmFjdGlvbnMgYXJlIGlnbm9yZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDb250cm9scyB3aGV0aGVyIHRoZSB3aW5kb3cgc25hcHBpbmcgZmVhdHVyZSBpcyBhY3RpdmUuIFdoZW4gZW5hYmxlZCwgdXNlcnMgY2FuIGF1dG9tYXRpY2FsbHkgYWxpZ24gYW5kIHJlc2l6ZSB3aW5kb3dzIGJ5IGRyYWdnaW5nIHRoZW0gdG8gdGhlIGVkZ2VzIG9yIGNvcm5lcnMgb2YgdGhlIHNjcmVlbi4gRGlzYWJsaW5nIHRoaXMgZmVhdHVyZSBwcmV2ZW50cyB3aW5kb3dzIGZyb20gc25hcHBpbmcgaW50byBwbGFjZSBkdXJpbmcgbW92ZW1lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNhYmxlU25hcCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVTbmFwIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNhYmxlU25hcCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlU25hcCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBCeSBkZWZhdWx0LCBwcmVzc2luZyB0aGUgJ0VzY2FwZScga2V5IHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgd2luZG93LiBUbyBwcmV2ZW50IHRoZSB3aW5kb3cgZnJvbSBjbG9zaW5nIHdoZW4gJ0VzY2FwZScgaXMgcHJlc3NlZCwgc2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc2FibGVFc2NhcGUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlRXNjYXBlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNhYmxlRXNjYXBlKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVFc2NhcGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQnkgZGVmYXVsdCwgdGhlIHdpbmRvdyBoYW5kbGVzIGNlcnRhaW4ga2V5Ym9hcmQgaW5wdXRzIHN1Y2ggYXMgdGhlIGFycm93IGtleXMgKCdBcnJvd1VwJywgJ0Fycm93RG93bicsIGV0Yy4pLCAnRXNjYXBlJywgYW5kIHNpbWlsYXIga2V5cyBmb3Igc2Nyb2xsaW5nIG9yIG5hdmlnYXRpb24gYWN0aW9ucy4gU2V0IHRoaXMgcHJvcGVydHkgdG8gdHJ1ZSB0byBkaXNhYmxlIHRoZSB3aW5kb3figJlzIGRlZmF1bHQga2V5Ym9hcmQgaGFuZGxpbmcsIGFsbG93aW5nIHlvdSB0byBtYW5hZ2UgdGhlc2Uga2V5IGV2ZW50cyBtYW51YWxseSB3aXRoaW4geW91ciBhcHBsaWNhdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc2FibGVLZXlib2FyZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVLZXlib2FyZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZGlzYWJsZUtleWJvYXJkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVLZXlib2FyZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIHZpc3VhbCBwcmVzZW50YXRpb24gb2YgY2hhcmFjdGVycyBlbnRlcmVkIHdpdGhpbiB0aGUgaW5wdXQgZmllbGQuIEZvciBleGFtcGxlLCB0aGlzIHNldHRpbmcgY2FuIGNvbnRyb2wgd2hldGhlciBjaGFyYWN0ZXJzIGFyZSBzaG93biBhcyBwbGFpbiB0ZXh0IG9yIG1hc2tlZCAoc3VjaCBhcyBmb3IgcGFzc3dvcmQgZmllbGRzKS4gVGhpcyBvcHRpb24gYXBwbGllcyBzcGVjaWZpY2FsbHkgdG8gdGhlIFByb21wdCBXaW5kb3cgY29tcG9uZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGlzcGxheU1vZGUoKTogV2luZG93RGlzcGxheU1vZGUgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzcGxheU1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRpc3BsYXlNb2RlKHZhbHVlOiBXaW5kb3dEaXNwbGF5TW9kZSB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNwbGF5TW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiAnJ0FwcGxpY2FibGUgdG8gVGFic1dpbmRvdyBjb21wb25lbnRzIHdoZW4gdGhleSBhcmUgZG9ja2VkIHdpdGhpbiBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuVGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgdGhlIHZhbGlkIGRyb3AgbG9jYXRpb25zIGZvciB0aGUgd2luZG934oCUYW5kIGl0cyB0YWIgaXRlbXPigJRpbnNpZGUgdGhlIERvY2tpbmdMYXlvdXQuIFRoZSBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHBvc2l0aW9uYWwgdmFsdWVzLCBhbGxvd2luZyB5b3UgdG8gZGVmaW5lIG11bHRpcGxlIGFsbG93YWJsZSBkcm9wIHpvbmVzLkRldGFpbHM6ICBQb3NpdGlvbnMgcHJlZml4ZWQgd2l0aCAnbGF5b3V0LScgYXBwbHkgdG8gZWFjaCBpbmRpdmlkdWFsIHRhYiBpdGVtIChjaGlsZCBlbGVtZW50KSBvZiB0aGUgVGFic1dpbmRvdyBiZWluZyBkcmFnZ2VkLiBUaGVzZSBkZXRlcm1pbmUgd2hlcmUgdGFiIGl0ZW1zIGNhbiBiZSBkcm9wcGVkIHdpdGhpbiB0aGUgb3ZlcmFsbCBsYXlvdXQsIG91dHNpZGUgdGhlaXIgb3JpZ2luYWwgY29udGFpbmVyLiAgT3RoZXIgcG9zaXRpb24gdmFsdWVzICh3aXRob3V0IHRoZSAnbGF5b3V0LScgcHJlZml4KSBpbmRpY2F0ZSBhbGxvd2VkIGRyb3AgcG9zaXRpb25zIGRpcmVjdGx5IHdpdGhpbiB0aGUgaG92ZXJlZCB0YXJnZXQgVGFic1dpbmRvdywgc3BlY2lmeWluZyB3aGVyZSB0aGUgd2hvbGUgd2luZG93IG9yIGl0cyB0YWJzIGNhbiBiZSBwbGFjZWQgcmVsYXRpdmUgdG8gdGhlIHRhcmdldCB3aW5kb3cuTm90ZXM6ICBUaGlzIHByb3BlcnR5IGlzIHVzZWQgZXhjbHVzaXZlbHkgYnkganF4RG9ja2luZ0xheW91dCBjdXN0b20gZWxlbWVudHMuICBJdCBjb250cm9scyB0aGUgcG9zc2libGUgZHJvcCB0YXJnZXRz4oCUYm90aCBhdCB0aGUgd2luZG93IGFuZCB0YWIgbGV2ZWxz4oCUd2l0aGluIHRoZSBEb2NraW5nTGF5b3V0IGVudmlyb25tZW50LkFsbG93ZWQgVmFsdWVzOiAgVGhlIGFycmF5IHZhbHVlcyBzcGVjaWZ5IHRoZSBwZXJtaXR0ZWQgZHJvcCBwb3NpdGlvbnMuIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciBhIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBvc2l0aW9uIHN0cmluZ3MuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wUG9zaXRpb24oKTogV2luZG93RHJvcFBvc2l0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcFBvc2l0aW9uKHZhbHVlOiBXaW5kb3dEcm9wUG9zaXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcFBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBzcGVjaWZpZXMgaG93IHRvIGZvcm1hdCB0aGUgbGFiZWwgZGlzcGxheWVkIG9uIHRoZSBQcm9ncmVzcyBCYXIuIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGN1c3RvbWl6YXRpb24gb2YgdGhlIGxhYmVsJ3MgY29udGVudCBvciBhcHBlYXJhbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IHByb2dyZXNzIHZhbHVlLiAgTm90ZTogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIFByb2dyZXNzV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IGZvcm1hdEZ1bmN0aW9uKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb3JtYXRGdW5jdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZm9ybWF0RnVuY3Rpb24odmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb3JtYXRGdW5jdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgdGhlIGV4YWN0IHBsYWNlbWVudCBvciBhbGlnbm1lbnQgb2YgdGhlIGZvb3RlciBzZWN0aW9uIHdpdGhpbiB0aGUgd2luZG93IGVsZW1lbnQsIHN1Y2ggYXMgcG9zaXRpb25pbmcgaXQgYXQgdGhlIGJvdHRvbSwgZml4ZWQsIGFic29sdXRlLCBvciByZWxhdGl2ZSB0byBvdGhlciBjb250ZW50LiBUaGlzIHByb3BlcnR5IGNvbnRyb2xzIHdoZXJlIHRoZSBmb290ZXIgYXBwZWFycyBpbiByZWxhdGlvbiB0byB0aGUgd2luZG934oCZcyBsYXlvdXQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBmb290ZXJQb3NpdGlvbigpOiBXaW5kb3dGb290ZXJQb3NpdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZm9vdGVyUG9zaXRpb24odmFsdWU6IFdpbmRvd0Zvb3RlclBvc2l0aW9uIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvb3RlclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgY3VzdG9tIHRlbXBsYXRlIHVzZWQgdG8gcmVuZGVyIHRoZSBmb290ZXIgc2VjdGlvbiBvZiB0aGUgRGlhbG9nIHdpbmRvdy4gSWYgZm9vdGVyVGVtcGxhdGUgaXMgc2V0IHRvIG51bGwgKHRoZSBkZWZhdWx0KSwgdGhlIERpYWxvZyB3aWxsIG5vdCBkaXNwbGF5IGEgZm9vdGVyIHNlY3Rpb24uIFlvdSBjYW4gcHJvdmlkZSBhIHRlbXBsYXRlIHN0cmluZyBvciBhIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSB0aGUgYXBwZWFyYW5jZSBhbmQgY29udGVudCBvZiB0aGUgRGlhbG9n4oCZcyBmb290ZXIuICovXG5cdEBJbnB1dCgpXG5cdGdldCBmb290ZXJUZW1wbGF0ZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9vdGVyVGVtcGxhdGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGZvb3RlclRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9vdGVyVGVtcGxhdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoaWNoIGJ1dHRvbnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlciBzZWN0aW9uLCBhbGxvd2luZyB5b3UgdG8gY29udHJvbCB0aGUgdmlzaWJpbGl0eSBvZiBoZWFkZXIgYWN0aW9ucyBmb3IgdXNlcnMuICovXG5cdEBJbnB1dCgpXG5cdGdldCBoZWFkZXJCdXR0b25zKCk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlckJ1dHRvbnMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhlYWRlckJ1dHRvbnModmFsdWU6IHN0cmluZ1tdKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlckJ1dHRvbnMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBjdXN0b20gdGVtcGxhdGUgdG8gYmUgdXNlZCBmb3IgcmVuZGVyaW5nIHRoZSBoZWFkZXIgc2VjdGlvbiBvZiB0aGUgZGlhbG9nIHdpbmRvdy4gSWYgaGVhZGVyVGVtcGxhdGUgaXMgc2V0IHRvIG51bGwgKHRoZSBkZWZhdWx0IHZhbHVlKSwgdGhlIGRpYWxvZyB3aWxsIGRpc3BsYXkgaXRzIHN0YW5kYXJkIGhlYWRlciBsYXlvdXQuIEJ5IHByb3ZpZGluZyBhIHRlbXBsYXRlLCB5b3UgY2FuIGZ1bGx5IGN1c3RvbWl6ZSB0aGUgYXBwZWFyYW5jZSBhbmQgY29udGVudCBvZiB0aGUgZGlhbG9nJ3MgaGVhZGVyIGFyZWEuICovXG5cdEBJbnB1dCgpXG5cdGdldCBoZWFkZXJUZW1wbGF0ZSgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyVGVtcGxhdGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhlYWRlclRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyVGVtcGxhdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBleGFjdCBwbGFjZW1lbnQgb2YgdGhlIGhlYWRlciBzZWN0aW9uIHdpdGhpbiB0aGUgd2luZG93IGVsZW1lbnQsIHN1Y2ggYXMgdG9wLCBib3R0b20sIGxlZnQsIG9yIHJpZ2h0LiBUaGlzIHNldHRpbmcgY29udHJvbHMgd2hlcmUgdGhlIGhlYWRlciBhcHBlYXJzIHJlbGF0aXZlIHRvIHRoZSBjb250ZW50IG9mIHRoZSB3aW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBoZWFkZXJQb3NpdGlvbigpOiBUYWJQb3NpdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oZWFkZXJQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaGVhZGVyUG9zaXRpb24odmFsdWU6IFRhYlBvc2l0aW9uIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERpc3BsYXlzIHN1cHBsZW1lbnRhcnkgaGVscGVyIHRleHQgYmVuZWF0aCB0aGUgdGV4dCBib3gsIHByb3ZpZGluZyB1c2VycyB3aXRoIGFkZGl0aW9uYWwgZ3VpZGFuY2Ugb3IgY29udGV4dC4gVGhpcyBoaW50IGFwcGVhcnMgb25seSB3aGVuIHRoZSB0ZXh0IGJveCBpcyBmb2N1c2VkIChpLmUuLCB0aGUgdXNlciBpcyBhY3RpdmVseSB0eXBpbmcgb3IgaGFzIHNlbGVjdGVkIHRoZSBmaWVsZCkuICBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIHNwZWNpZmljYWxseSBhcHBsaWNhYmxlIHRvIHRoZSBQcm9tcHQgV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IGhpbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhpbnQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGhpbnQodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oaW50ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgdGhlIFByb2dyZXNzIGJhciB2YWx1ZSB0byB0aGUgaW5kZXRlcm1pbmF0ZSBzdGF0ZSAoJ251bGwnKSwgYWN0aXZhdGluZyBpdHMgbG9hZGluZyBhbmltYXRpb24gdG8gaW5kaWNhdGUgb25nb2luZyBwcm9ncmVzcyB3aXRob3V0IGEgZGVmaW5lZCBlbmRwb2ludC4gIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gdXNlZCB3aXRoaW4gYSBQcm9ncmVzc1dpbmRvdyBjb21wb25lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoZSBQcm9ncmVzcyBCYXIgZmlsbHMgKGUuZy4sIGxlZnQtdG8tcmlnaHQsIHJpZ2h0LXRvLWxlZnQsIHRvcC10by1ib3R0b20sIG9yIGJvdHRvbS10by10b3ApLiAgTm90ZTogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiB1c2VkIHdpdGhpbiBhIFByb2dyZXNzV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IGludmVydGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW52ZXJ0ZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGludmVydGVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmludmVydGVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgdGV4dCBkaXNwbGF5ZWQgYXMgdGhlIHdpbmRvdyB0aXRsZSBpbiB0aGUgaGVhZGVyIHNlY3Rpb24sIHR5cGljYWxseSBzaG93biBhdCB0aGUgdG9wIG9mIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cgb3IgZGlhbG9nIGJveC4gKi9cblx0QElucHV0KClcblx0Z2V0IGxhYmVsKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbGFiZWwodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBXaGVuIGVuYWJsZWQsIHRoZSByZXNpemluZyBvcGVyYXRpb24gdXBkYXRlcyB0aGUgZWxlbWVudOKAmXMgc2l6ZSBpbiByZWFsIHRpbWUgYXMgdGhlIHVzZXIgZHJhZ3MgaXRzIGVkZ2VzLCBwcm92aWRpbmcgaW1tZWRpYXRlIHZpc3VhbCBmZWVkYmFjay4gQnkgZGVmYXVsdCwgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkOyBpbnN0ZWFkLCBhIGhpZ2hsaWdodGVyIGFwcGVhcnMgYXJvdW5kIHRoZSBlZGdlcyBvZiB0aGUgd2luZG93IGR1cmluZyByZXNpemluZyB0byBpbmRpY2F0ZSB0aGUgcHJvc3BlY3RpdmUgbmV3IHNpemUsIHdoaWxlIHRoZSBlbGVtZW50IGl0c2VsZiByZXNpemVzIG9ubHkgb25jZSB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbGl2ZVJlc2l6ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxpdmVSZXNpemUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxpdmVSZXNpemUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGl2ZVJlc2l6ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIHJlbGV2YW50IG9ubHkgZm9yIFRhYnNXaW5kb3cgZWxlbWVudHMgdGhhdCBhcmUgdXRpbGl6ZWQgd2l0aGluIGEgRG9ja2luZ0xheW91dCBjdXN0b20gZWxlbWVudC5UaGlzIHByb3BlcnR5IGlzIGV4Y2x1c2l2ZWx5IHVzZWQgYnkganF4RG9ja2luZ0xheW91dCB0byBzcGVjaWZ5IG93bmVyc2hpcCBvZiBhIFRhYnNXaW5kb3cuIEl0IGRldGVybWluZXMgd2hpY2gganF4RG9ja2luZ0xheW91dCBpbnN0YW5jZSB0aGUgd2luZG93IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgYSBUYWJzV2luZG93IGlzIHJlbW92ZWQgZnJvbSBpdHMgcGFyZW50IERvY2tpbmdMYXlvdXQgZWxlbWVudCwgdGhpcyBwcm9wZXJ0eSBjb250aW51ZXMgdG8gcmVmZXJlbmNlIHRoZSBvcmlnaW5hbCBkb2NraW5nIGxheW91dCB0byB3aGljaCBpdCBiZWxvbmdlZC5UaGUgcHJvcGVydHkgYWNjZXB0cyBlaXRoZXI6ICBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGlkIG9mIGEganF4RG9ja2luZ0xheW91dCBwcmVzZW50IG9uIHRoZSBwYWdlLiAgQW4gaW5zdGFuY2Ugb2YgYSBqcXhEb2NraW5nTGF5b3V0IG9iamVjdC5UaGlzIGFsbG93cyBmb3IgZmxleGlibGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIG93bmluZyBsYXlvdXQsIGVpdGhlciBieSBJRCBvciBieSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBsYXlvdXQgaW5zdGFuY2UuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsYXlvdXQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxheW91dCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbGF5b3V0KHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGF5b3V0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEdldHMgb3Igc2V0cyB0aGUgdW5sb2NrS2V5LCBhIHVuaXF1ZSBjb2RlIHJlcXVpcmVkIHRvIGFjdGl2YXRlIG9yIHVubG9jayBhY2Nlc3MgdG8gdGhlIHByb2R1Y3TigJlzIGZ1bGwgZmVhdHVyZXMgb3IgbGljZW5zZWQgZnVuY3Rpb25hbGl0eS4gKi9cblx0QElucHV0KClcblx0Z2V0IHVubG9ja0tleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudW5sb2NrS2V5IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB1bmxvY2tLZXkodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmxvY2tLZXkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBsYW5ndWFnZSB0byBiZSB1c2VkIGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzLiBUaGlzIHByb3BlcnR5IGNhbiBiZSBzZXQgb3IgcmV0cmlldmVkLCBhbmQgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgbWVzc2FnZXMgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBsb2NhbGl6ZWQgbWVzc2FnZXMgaXMgc2hvd24gdG8gdGhlIHVzZXIuIENoYW5naW5nIHRoZSBsYW5ndWFnZSB1cGRhdGVzIHRoZSBkaXNwbGF5ZWQgbWVzc2FnZXMgYWNjb3JkaW5nbHkuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2NhbGUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgb25seSBhcHBsaWNhYmxlIHRvIGEgVGFic1dpbmRvdyB3aGVuIGl0IGlzIGRvY2tlZCB3aXRoaW4gYSBEb2NraW5nTGF5b3V0IGN1c3RvbSBlbGVtZW50LiBXaGVuIGVuYWJsZWQsIGl0IGNvbnRyb2xzIHdoZXRoZXIgdGhlIFRhYnNXaW5kb3cgY2FuIGJlIHJlc2l6ZWQgYnkgdGhlIHVzZXIuIElmIHNldCB0byB0cnVlLCB1c2VycyB3aWxsIGJlIGFibGUgdG8gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBUYWJzV2luZG93IHdpdGhpbiB0aGUgRG9ja2luZ0xheW91dDsgaWYgc2V0IHRvIGZhbHNlLCByZXNpemluZyB3aWxsIGJlIGRpc2FibGVkIGFuZCB0aGUgVGFic1dpbmRvdyB3aWxsIGhhdmUgYSBmaXhlZCBzaXplLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbG9ja2VkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9ja2VkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsb2NrZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9ja2VkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENhbGxiYWNrIGZ1bmN0aW9uIHVzZWQgd2l0aGluIHRoZSBsb2NhbGl6YXRpb24gbW9kdWxlLCB0eXBpY2FsbHkgaW52b2tlZCB3aGVuIGEgbG9jYWxpemF0aW9uIGV2ZW50IG9jY3VycyAoZS5nLiwgbGFuZ3VhZ2UgY2hhbmdlLCByZXNvdXJjZSBsb2FkKS4gVGhpcyBjYWxsYmFjayBoYW5kbGVzIHRhc2tzIHN1Y2ggYXMgdXBkYXRpbmcgVUkgZWxlbWVudHMgb3IgcmV0cmlldmluZyBsb2NhbGl6ZWQgY29udGVudCBiYXNlZCBvbiB0aGUgY3VycmVudCBsYW5ndWFnZSBzZXR0aW5ncy4gKi9cblx0QElucHV0KClcblx0Z2V0IGxvY2FsaXplRm9ybWF0RnVuY3Rpb24oKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsaXplRm9ybWF0RnVuY3Rpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvY2FsaXplRm9ybWF0RnVuY3Rpb24odmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgY3VycmVudGx5IG1heGltaXplZC4gV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIHdpbmRvdyBleHBhbmRzIHRvIGZpbGwgdGhlIGVudGlyZSBhdmFpbGFibGUgdmlld3BvcnQsIGNvdmVyaW5nIGFsbCBvdGhlciBpbnRlcmZhY2UgZWxlbWVudHMgYW5kIGxlYXZpbmcgbm8gdmlzaWJsZSBib3JkZXJzIG9yIHRpdGxlIGJhcnMuIElmIGZhbHNlLCB0aGUgd2luZG93IHJldGFpbnMgaXRzIHByZXZpb3VzIHNpemUgYW5kIHBvc2l0aW9uLiBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIHByb2dyYW1tYXRpY2FsbHkgY2hlY2sgb3IgY29udHJvbCB0aGUgd2luZG934oCZcyBtYXhpbWl6ZWQgc3RhdGUgd2l0aGluIHRoZSBhcHBsaWNhdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IG1heGltaXplZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWF4aW1pemVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIG9yIHJldHJpZXZlcyBhbiBvYmplY3QgY29udGFpbmluZyBsb2NhbGl6ZWQgc3RyaW5ncyB1c2VkIHRocm91Z2hvdXQgdGhlIHdpZGdldOKAmXMgdXNlciBpbnRlcmZhY2UuIFRoaXMgcHJvcGVydHkgYWxsb3dzIGRldmVsb3BlcnMgdG8gY3VzdG9taXplIHRoZSB3aWRnZXTigJlzIGRpc3BsYXllZCB0ZXh0IGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzIGFuZCByZWdpb25zLiBJdCBpcyB0eXBpY2FsbHkgdXNlZCB0b2dldGhlciB3aXRoIHRoZSBsb2NhbGUgcHJvcGVydHkgdG8gZW5zdXJlIHRoYXQgdGhlIHdpZGdldCBhZGFwdHMgaXRzIGNvbnRlbnQgYmFzZWQgb24gdGhlIHNlbGVjdGVkIGxhbmd1YWdlIG9yIHJlZ2lvbmFsIHNldHRpbmdzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWVzc2FnZXMoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1lc3NhZ2VzIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtZXNzYWdlcyh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1lc3NhZ2VzID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB3aW5kb3cgc2hvdWxkIGZ1bmN0aW9uIGFzIGEgbW9kYWwgZGlhbG9nLiBXaGVuIHNldCB0byB0cnVlLCB0aGUgd2luZG93IGNhcHR1cmVzIHVzZXIgZm9jdXMgYW5kIHByZXZlbnRzIGludGVyYWN0aW9uIHdpdGggYW55IG90aGVyIGVsZW1lbnRzIG9uIHRoZSBwYWdlIHVudGlsIGl0IGlzIGNsb3NlZC4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHVzZXIgbXVzdCBhZGRyZXNzIG9yIGRpc21pc3MgdGhlIG1vZGFsIHdpbmRvdyBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSByZXN0IG9mIHRoZSBjb250ZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbW9kYWwoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tb2RhbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbW9kYWwodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubW9kYWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRm9yIHVzZSB3aXRoIFRhYnNXaW5kb3cgd2hlbiBkb2NrZWQgd2l0aGluIGEgRG9ja2luZ0xheW91dCBjdXN0b20gZWxlbWVudDogIFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaXplIHRoYXQgdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50IGNhbiBvY2N1cHkgd2hlbiBpdCBpcyBkb2NrZWQuICBGb3IgdGhlIFByb2dyZXNzV2luZG93IGNvbXBvbmVudDogIERlZmluZXMgdGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZSBwcm9ncmVzcyBiYXIsIGFsbG93aW5nIHVzZXJzIHRvIHNldCB0aGUgdXBwZXIgbGltaXQgb2YgdGhlIFByb2dyZXNzQmFyJ3MgcmFuZ2UuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtYXgoKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1heCh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgY3VzdG9tIGVsZW1lbnQuIFNwZWNpZmllcyB0aGUgbWluaW11bSBhbGxvd2VkIHNpemUgZm9yIHRoZSBpdGVtIHdpdGhpbiB0aGUgbGF5b3V0LCBlbnN1cmluZyBpdCBkb2VzIG5vdCBzaHJpbmsgYmVsb3cgdGhpcyB2YWx1ZSBkdXJpbmcgcmVzaXppbmcgb3BlcmF0aW9ucy5BbHNvIGFwcGxpZXMgdG8gUHJvZ3Jlc3NXaW5kb3csIHdoZXJlIGl0IGxldHMgdGhlIHVzZXIgc2V0IHRoZSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgUHJvZ3Jlc3NCYXIsIGRlZmluaW5nIHRoZSBsb3dlc3QgcG9zc2libGUgcHJvZ3Jlc3Mgc3RhdGUgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtaW4oKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW4gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1pbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW4gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgbWluaW1pemVkLiBXaGVuIHNldCB0byB0cnVlLCB0aGUgd2luZG93IGlzIHJlZHVjZWQgdG8gYW4gaWNvbiBvciBjb21wYWN0IGZvcm0gYW5kIHBvc2l0aW9uZWQgKGRvY2tlZCkgaW4gdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBvZiB0aGUgdmlld3BvcnQuIElmIGZhbHNlLCB0aGUgd2luZG93IHJlbWFpbnMgaW4gaXRzIG5vcm1hbCwgYWN0aXZlIHN0YXRlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWluaW1pemVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluaW1pemVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtaW5pbWl6ZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluaW1pemVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyBvciByZXRyaWV2ZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYSB1c2VyIGlzIGFsbG93ZWQgdG8gZW50ZXIgaW50byB0aGUgaW5wdXQgZmllbGQuIFRoaXMgcHJvcGVydHkgYXBwbGllcyB0byBib3RoIFByb21wdCBhbmQgTXVsdGlsaW5lUHJvbXB0IHdpbmRvd3MuIElmIHNldCwgdGhlIGlucHV0IHdpbGwgYmUgbGltaXRlZCB0byB0aGUgZGVmaW5lZCBjaGFyYWN0ZXIgY291bnQsIHByZXZlbnRpbmcgdXNlcnMgZnJvbSBlbnRlcmluZyBtb3JlIGNoYXJhY3RlcnMgdGhhbiBzcGVjaWZpZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heExlbmd0aCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWF4TGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4TGVuZ3RoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgYSB1c2VyIG11c3QgZW50ZXIgYmVmb3JlIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZSBpcyBhY3RpdmF0ZWQuIFRoaXMgcHJvcGVydHkgY2FuIGJlIGJvdGggc2V0ICh0byBzcGVjaWZ5IHRoZSBkZXNpcmVkIHRocmVzaG9sZCkgYW5kIHJldHJpZXZlZCAodG8gY2hlY2sgdGhlIGN1cnJlbnQgdGhyZXNob2xkKS4gIE5vdGU6IFRoaXMgc2V0dGluZyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gUHJvbXB0IGFuZCBNdWx0aWxpbmVQcm9tcHQgd2luZG93cy4gKi9cblx0QElucHV0KClcblx0Z2V0IG1pbkxlbmd0aCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluTGVuZ3RoIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtaW5MZW5ndGgodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5MZW5ndGggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyBjdXJyZW50bHkgdmlzaWJsZSB0byB0aGUgdXNlci4gUmV0dXJucyB0cnVlIGlmIHRoZSB3aW5kb3cgaXMgZGlzcGxheWVkIG9uIHRoZSBzY3JlZW4gYW5kIGNhbiBiZSBpbnRlcmFjdGVkIHdpdGgsIGFuZCBmYWxzZSBpZiBpdCBpcyBoaWRkZW4gb3IgbWluaW1pemVkLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBvcGVuZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHRoZSB3aW5kb3cgaXMgcGlubmVkLiBBIHBpbm5lZCB3aW5kb3cgY2Fubm90IGJlIG1vdmVkIChkcmFnZ2VkKSBieSB0aGUgdXNlciwgYnV0IGl0IGNhbiBzdGlsbCBiZSByZXNpemVkLiBXaGVuIHNldCB0byB0cnVlLCB0aGlzIHByb3BlcnR5IGRpc2FibGVzIHdpbmRvdyBkcmFnZ2luZyB3aGlsZSBhbGxvd2luZyByZXNpemluZyBvcGVyYXRpb25zLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcGlubmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucGlubmVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBwaW5uZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucGlubmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgcGxhY2Vob2xkZXIgdGV4dCB0aGF0IGFwcGVhcnMgaW5zaWRlIHRoZSBpbnB1dCBmaWVsZCBiZWZvcmUgdGhlIHVzZXIgZW50ZXJzIGEgdmFsdWUuICBOb3RlOiBUaGlzIG9wdGlvbiBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIFByb21wdCBXaW5kb3cgY29tcG9uZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcGxhY2Vob2xkZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBwbGFjZWhvbGRlcih2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgdGV4dCBsYWJlbCBkaXNwbGF5ZWQgYWJvdmUgb3IgYWxvbmdzaWRlIHRoZSBpbnB1dCBmaWVsZCB3aXRoaW4gdGhlIFByb21wdFdpbmRvdyBjb21wb25lbnQuIFRoaXMgbGFiZWwgaGVscHMgdXNlcnMgdW5kZXJzdGFuZCB3aGF0IGluZm9ybWF0aW9uIGlzIGV4cGVjdGVkIGluIHRoZSBpbnB1dCBmaWVsZC4gKi9cblx0QElucHV0KClcblx0Z2V0IHByb21wdExhYmVsKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5wcm9tcHRMYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcHJvbXB0TGFiZWwodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5wcm9tcHRMYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJZiB0aGUgZWxlbWVudCBoYXMgdGhlIFwicmVhZG9ubHlcIiBhdHRyaWJ1dGUsIHVzZXJzIGNhbm5vdCBtb2RpZnkgaXRzIHZhbHVlOyB0aGUgZmllbGQgd2lsbCBkaXNwbGF5IGRhdGEgaW4gYSBub24tZWRpdGFibGUgc3RhdGUsIHRob3VnaCB1c2VycyBjYW4gc3RpbGwgc2VsZWN0IGFuZCBjb3B5IGl0cyBjb250ZW50cy4gVGhpcyBkaWZmZXJzIGZyb20gYSBcImRpc2FibGVkXCIgZWxlbWVudCwgYXMgYSBcInJlYWRvbmx5XCIgZmllbGQgcmVtYWlucyBmb2N1c2FibGUgYW5kIGluY2x1ZGVkIGluIGZvcm0gc3VibWlzc2lvbnMuICovXG5cdEBJbnB1dCgpXG5cdGdldCByZWFkb25seSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlYWRvbmx5IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZWFkb25seSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIGEgcmVzaXplIGhhbmRsZSBhcHBlYXJzIGluIHRoZSBib3R0b20tcmlnaHQgY29ybmVyIG9mIHRoZSB3aW5kb3cuIFVzZXJzIGNhbiBpbml0aWF0ZSB0aGUgcmVzaXppbmcgb3BlcmF0aW9uIGV4Y2x1c2l2ZWx5IGJ5IGRyYWdnaW5nIHRoaXMgaW5kaWNhdG9yOyByZXNpemluZyBmcm9tIGFueSBvdGhlciB3aW5kb3cgZWRnZSBvciBjb3JuZXIgaXMgZGlzYWJsZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCByZXNpemVJbmRpY2F0b3IoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVJbmRpY2F0b3IgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlc2l6ZUluZGljYXRvcih2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVJbmRpY2F0b3IgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIGhvdyB0aGUgd2luZG93IGNhbiBiZSByZXNpemVkIGJ5IHRoZSB1c2VyLkF2YWlsYWJsZSByZXNpemluZyBtb2RlczogIG5vbmUg4oCTIERpc2FibGVzIGFsbCB3aW5kb3cgcmVzaXppbmc7IHRoZSB3aW5kb3cgc2l6ZSBpcyBmaXhlZC4gIHZlcnRpY2FsIOKAkyBBbGxvd3MgdGhlIHdpbmRvdyB0byBiZSByZXNpemVkIG9ubHkgdmVydGljYWxseSAodG9wIGFuZCBib3R0b20gZWRnZXMpLiAgaG9yaXpvbnRhbCDigJMgQWxsb3dzIHRoZSB3aW5kb3cgdG8gYmUgcmVzaXplZCBvbmx5IGhvcml6b250YWxseSAobGVmdCBhbmQgcmlnaHQgZWRnZXMpLiAgYm90aCDigJMgRW5hYmxlcyBib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHJlc2l6aW5nOyB0aGUgd2luZG93IGNhbiBiZSByZXNpemVkIGluIGFueSBkaXJlY3Rpb24uICB0b3Ag4oCTIFRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgcmVzaXplZCBieSBkcmFnZ2luZyB0aGUgdG9wIGVkZ2UuICBib3R0b20g4oCTIFRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgcmVzaXplZCBieSBkcmFnZ2luZyB0aGUgYm90dG9tIGVkZ2UuICBsZWZ0IOKAkyBUaGUgd2luZG93IGNhbiBvbmx5IGJlIHJlc2l6ZWQgYnkgZHJhZ2dpbmcgdGhlIGxlZnQgZWRnZS4gIHJpZ2h0IOKAkyBUaGUgd2luZG93IGNhbiBvbmx5IGJlIHJlc2l6ZWQgYnkgZHJhZ2dpbmcgdGhlIHJpZ2h0IGVkZ2UuQ2hvb3NlIHRoZSBkZXNpcmVkIG1vZGUgdG8gY29udHJvbCB3aGljaCBlZGdlcyBvZiB0aGUgd2luZG93IHVzZXJzIGNhbiBkcmFnIHRvIHJlc2l6ZSwgb3IgdG8gcHJldmVudCByZXNpemluZyBlbnRpcmVseS4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlc2l6ZU1vZGUoKTogV2luZG93UmVzaXplTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVNb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZXNpemVNb2RlKHZhbHVlOiBXaW5kb3dSZXNpemVNb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gR2V0cyBvciBzZXRzIGEgdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGVsZW1lbnTigJlzIGFsaWdubWVudCBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQgcmlnaHQtdG8tbGVmdCAoUlRMKSBsYW5ndWFnZXMgYW5kIHRleHQgZGlyZWN0aW9uLCBzdWNoIGFzIEFyYWJpYyBvciBIZWJyZXcuIFVzZSB0aGlzIHByb3BlcnR5IHRvIGVuc3VyZSBwcm9wZXIgZGlzcGxheSBhbmQgYWxpZ25tZW50IGZvciBsb2NhbGVzIHRoYXQgcmVxdWlyZSBSVEwgZm9udCBhbmQgbGF5b3V0IHN1cHBvcnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCByaWdodFRvTGVmdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJpZ2h0VG9MZWZ0IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByaWdodFRvTGVmdCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yaWdodFRvTGVmdCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgZmllbGQgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgZmlsbGVkIG91dCBieSB0aGUgdXNlciBiZWZvcmUgdGhlIGZvcm0gY2FuIGJlIHN1Ym1pdHRlZC4gSWYgbGVmdCBlbXB0eSwgdGhlIGZvcm0gc3VibWlzc2lvbiB3aWxsIGJlIGJsb2NrZWQsIHByb21wdGluZyB0aGUgdXNlciB0byBjb21wbGV0ZSB0aGlzIGZpZWxkLiAgJ05vdGU6JyBUaGlzIHNldHRpbmcgaXMgYXBwbGljYWJsZSB0byB0aGUgUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlcXVpcmVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERlZmluZXMgdGhlIGVycm9yIG1lc3NhZ2UgZGlzcGxheWVkIHdoZW4gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBlbmFibGVkIGFuZCB0aGUgdXNlciBzdWJtaXRzIHRoZSBpbnB1dCBmaWVsZCB3aXRob3V0IHByb3ZpZGluZyBhIHZhbHVlLiBUaGlzIHNldHRpbmcgb25seSBhcHBsaWVzIHRvIHRoZSBQcm9tcHQgV2luZG93IGludGVyZmFjZS4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlcXVpcmVkTWVzc2FnZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWRNZXNzYWdlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZXF1aXJlZE1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXF1aXJlZE1lc3NhZ2UgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHdoZXRoZXIgdGhlIGlucHV0IGZpZWxkJ3MgY29udGVudCBzaG91bGQgYmUgYXV0b21hdGljYWxseSBoaWdobGlnaHRlZCAoc2VsZWN0ZWQpIHdoZW4gdGhlIGZpZWxkIGdhaW5zIGZvY3VzLiAgTm90ZTogVGhpcyBzZXR0aW5nIGFwcGxpZXMgc3BlY2lmaWNhbGx5IHRvIHRoZSBQcm9tcHQgV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdEFsbE9uRm9jdXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RBbGxPbkZvY3VzIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3RBbGxPbkZvY3VzKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdEFsbE9uRm9jdXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIG9yIHJldHJpZXZlcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRhYiB3aXRoaW4gdGhlIGNvbXBvbmVudC4gVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIGV4Y2x1c2l2ZWx5IHRvIHRoZSBUYWJzV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZEluZGV4IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3RlZEluZGV4KHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkSW5kZXggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIGhvdyB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIG5hdmlnYXRlIGJldHdlZW4gZGlmZmVyZW50IHRhYnMgd2l0aGluIHRoZSBpbnRlcmZhY2UuIFRoaXMgcHJvcGVydHkgaXMgcmVsZXZhbnQgb25seSB3aGVuIHVzaW5nIHRoZSBUYWJzV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvbk1vZGUoKTogVGFiU2VsZWN0aW9uTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25Nb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBUYWJTZWxlY3Rpb25Nb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbk1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSB6ZXJvLWJhc2VkIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbmNsdWRlZCBpbiB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbi4gIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgcmVsZXZhbnQgb25seSBmb3IgdXNlIHdpdGhpbiBNdWx0aWxpbmVQcm9tcHRXaW5kb3cgY29tcG9uZW50cy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvbkVuZCgpOiBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25FbmQodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZXh0IHdpdGhpbiB0aGUgcHJvbXB0IHdpbmRvdy4gVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiB1c2luZyB0aGUgTXVsdGlsaW5lUHJvbXB0V2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvblN0YXJ0KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2VsZWN0aW9uU3RhcnQodmFsdWU6IG51bWJlcikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDb250cm9scyB0aGUgdmlzaWJpbGl0eSBvZiB0aGUgbGFiZWwgZGlzcGxheWVkIG9uIHRoZSBQcm9ncmVzcyBCYXIuICBOb3RlOiBUaGlzIHNldHRpbmcgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gdXNlZCB3aXRoaW4gdGhlIFByb2dyZXNzIFdpbmRvdyBjb21wb25lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBzaG93UHJvZ3Jlc3NWYWx1ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNob3dQcm9ncmVzc1ZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzaG93UHJvZ3Jlc3NWYWx1ZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaG93UHJvZ3Jlc3NWYWx1ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBIGdldHRlciB0aGF0IHJldHJpZXZlcyBhbGwgc2libGluZyBMYXlvdXRQYW5lbCBpbnN0YW5jZXPigJR0aG9zZSBzaGFyaW5nIHRoZSBzYW1lIGltbWVkaWF0ZSBwYXJlbnTigJR3aGVuIGEgTGF5b3V0UGFuZWwgaXRlbSBpcyBkb2NrZWQgd2l0aGluIGEgRG9ja2luZ0xheW91dC4gVGhlIHJldHVybmVkIHNpYmxpbmdzIGFyZSBhbHNvIERvY2tpbmdMYXlvdXQgaXRlbXMgKHNwZWNpZmljYWxseSwgb3RoZXIgTGF5b3V0UGFuZWxzKS4gIFRoaXMgcHJvcGVydHkgaXMgb25seSBhdmFpbGFibGUgZm9yIFRhYnNXaW5kb3cgY29tcG9uZW50cyB0aGF0IGFyZSBkb2NrZWQgaW5zaWRlIGEgRG9ja2luZ0xheW91dC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNpYmxpbmdzKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaWJsaW5ncyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2libGluZ3ModmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaWJsaW5ncyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZWxldmFudCB3aGVuIGEgVGFic1dpbmRvdyBjb21wb25lbnQgaXMgbmVzdGVkIHdpdGhpbiBhIERvY2tpbmdMYXlvdXQgY3VzdG9tIGVsZW1lbnQuIFRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBzaXplICh3aWR0aCBvciBoZWlnaHQsIGRlcGVuZGluZyBvbiBsYXlvdXQgb3JpZW50YXRpb24pIGFsbG9jYXRlZCB0byB0aGUgVGFic1dpbmRvdyB3aXRoaW4gdGhlIGRvY2tpbmcgbGF5b3V0LCBhbGxvd2luZyBkZXZlbG9wZXJzIHRvIGNvbnRyb2wgaG93IG11Y2ggc3BhY2UgdGhlIHdpbmRvdyBvY2N1cGllcyByZWxhdGl2ZSB0byBvdGhlciBkb2NrZWQgY29tcG9uZW50cy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNpemUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNpemUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNpemUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaXplID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB3aGV0aGVyIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNraW5nIHNob3VsZCBiZSBlbmFibGVkIGZvciB0aGUgZWxlbWVudC4gVGhpcyBwcm9wZXJ0eSBkZXRlcm1pbmVzIGlmIHRoZSBjb250ZW50IGVudGVyZWQgd2l0aGluIHRoZSBlbGVtZW50IHdpbGwgYmUgcmV2aWV3ZWQgZm9yIHNwZWxsaW5nIGFuZCBncmFtbWF0aWNhbCBlcnJvcnMuIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSBNdWx0aWxpbmVQcm9tcHRXaW5kb3cgY29tcG9uZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc3BlbGxDaGVjaygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNwZWxsQ2hlY2sgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNwZWxsQ2hlY2sodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc3BlbGxDaGVjayA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHdoZXRoZXIgY2xvc2UgYnV0dG9ucyBhcmUgc2hvd24gb24gZWFjaCB0YWIgd2l0aGluIHRoZSBUYWIgU3RyaXAgb2YgdGhlIFRhYnNXaW5kb3cuIFlvdSBjYW4gdXNlIHRoaXMgcHJvcGVydHkgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIHZpc2liaWxpdHkgb2YgY2xvc2UgYnV0dG9ucyBvbiB0YWJzLCBhbGxvd2luZyB1c2VycyB0byBjbG9zZSBpbmRpdmlkdWFsIHRhYnMgZGlyZWN0bHkgZnJvbSB0aGUgVGFiIFN0cmlwLiAgTm90ZTogVGhpcyBwcm9wZXJ0eSBpcyBvbmx5IGFwcGxpY2FibGUgdG8gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiQ2xvc2VCdXR0b25zKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiQ2xvc2VCdXR0b25zIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB0YWJDbG9zZUJ1dHRvbnModmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiQ2xvc2VCdXR0b25zID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGVuIHRoZSBjbG9zZSBidXR0b24gaXMgdmlzaWJsZeKAlGVpdGhlciBvbmx5IHdoZW4gYSB0YWIgaXMgc2VsZWN0ZWQgb3IgYWx3YXlzIHZpc2libGUgb24gYWxsIHRhYnMuICBOb3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgZXhjbHVzaXZlbHkgdG8gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiQ2xvc2VCdXR0b25Nb2RlKCk6IFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJDbG9zZUJ1dHRvbk1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYkNsb3NlQnV0dG9uTW9kZSh2YWx1ZTogV2luZG93VGFiQ2xvc2VCdXR0b25Nb2RlIHwgc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYkNsb3NlQnV0dG9uTW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgaG93IHRoZSBzY3JvbGwgYnV0dG9ucyBmb3IgdGFicyBhcmUgZGlzcGxheWVkIG9yIGJlaGF2ZS4gVGhpcyBvcHRpb24gaXMgb25seSByZWxldmFudCB3aGVuIHRoZSB0YWJMYXlvdXQgcHJvcGVydHkgaXMgc2V0IHRvICdzY3JvbGwnLCBhbGxvd2luZyB0YWJzIHRvIGJlIHNjcm9sbGVkIGhvcml6b250YWxseS4gTm90ZTogVGhpcyBwcm9wZXJ0eSBhcHBsaWVzIGV4Y2x1c2l2ZWx5IHRvIHRoZSBUYWJzV2luZG93IGNvbXBvbmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYk92ZXJmbG93KCk6IE92ZXJmbG93IHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYk92ZXJmbG93IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB0YWJPdmVyZmxvdyh2YWx1ZTogT3ZlcmZsb3cgfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiT3ZlcmZsb3cgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIFRhYiBTdHJpcCB3aXRoaW4gdGhlIFRhYnNXaW5kb3cuICBOb3RlOiBUaGlzIHByb3BlcnR5IGFwcGxpZXMgZXhjbHVzaXZlbHkgdG8gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiUG9zaXRpb24oKTogVGFiUG9zaXRpb24gfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYlBvc2l0aW9uKHZhbHVlOiBUYWJQb3NpdGlvbiB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJQb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZWZpbmVzIG9yIHJldHJpZXZlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHNjcm9sbCBidXR0b25zIGxvY2F0ZWQgd2l0aGluIHRoZSB0YWIgaGVhZGVyIG9mIGEgVGFic1dpbmRvdyBjb21wb25lbnQuIFRoaXMgc2V0dGluZyBpcyBleGNsdXNpdmVseSBhcHBsaWNhYmxlIHRvIFRhYnNXaW5kb3cgaW5zdGFuY2VzIGFuZCBhbGxvd3MgeW91IHRvIGNvbnRyb2wgd2hlcmUgdGhlIHNjcm9sbCBidXR0b25zIGFwcGVhciAoZm9yIGV4YW1wbGUsIGF0IHRoZSBzdGFydCwgZW5kLCBvciBib3RoIGVuZHMgb2YgdGhlIHRhYiBoZWFkZXIpLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiU2Nyb2xsQnV0dG9uc1Bvc2l0aW9uKCk6IExheW91dFBvc2l0aW9uIHwgc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYlNjcm9sbEJ1dHRvbnNQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGFiU2Nyb2xsQnV0dG9uc1Bvc2l0aW9uKHZhbHVlOiBMYXlvdXRQb3NpdGlvbiB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJTY3JvbGxCdXR0b25zUG9zaXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGVmaW5lcyBvciByZXRyaWV2ZXMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSB0ZXh0IGRpc3BsYXllZCBpbiB0aGUgdGFiIGxhYmVscyB3aXRoaW4gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50LiBUaGlzIHByb3BlcnR5IGRldGVybWluZXMgd2hldGhlciB0aGUgdGFiIHRleHQgaXMgbGFpZCBvdXQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkuIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgZXhjbHVzaXZlbHkgYXBwbGljYWJsZSB0byB0aGUgVGFic1dpbmRvdyBjb21wb25lbnQgYW5kIGhhcyBubyBlZmZlY3Qgb24gb3RoZXIgY29tcG9uZW50cy4gKi9cblx0QElucHV0KClcblx0Z2V0IHRhYlRleHRPcmllbnRhdGlvbigpOiBPcmllbnRhdGlvbiB8IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJUZXh0T3JpZW50YXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYlRleHRPcmllbnRhdGlvbih2YWx1ZTogT3JpZW50YXRpb24gfCBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiVGV4dE9yaWVudGF0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgdmlzdWFsIHRoZW1lIHRvIGJlIGFwcGxpZWQuIFRoZSB0aGVtZSBjb250cm9scyB0aGUgYXBwZWFyYW5jZSwgaW5jbHVkaW5nIGNvbG9ycywgZm9udHMsIGFuZCBzdHlsaW5nLCBvZiB0aGUgZWxlbWVudCB0byBlbnN1cmUgYSBjb25zaXN0ZW50IGxvb2sgYW5kIGZlZWwgYWNyb3NzIHRoZSB1c2VyIGludGVyZmFjZS4gKi9cblx0QElucHV0KClcblx0Z2V0IHRoZW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGhlbWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJZiB0aGlzIHByb3BlcnR5IGlzIHNldCB0byB0cnVlLCB0aGUgZWxlbWVudCB3aWxsIGJlIGV4Y2x1ZGVkIGZyb20ga2V5Ym9hcmQgbmF2aWdhdGlvbiBhbmQgY2Fubm90IHJlY2VpdmUgZm9jdXMgZWl0aGVyIHByb2dyYW1tYXRpY2FsbHkgb3IgdmlhIHVzZXIgaW50ZXJhY3Rpb24uIFRoaXMgZW5zdXJlcyB0aGF0IHVzZXJzIHdpbGwgYmUgdW5hYmxlIHRvIGZvY3VzIG9uIHRoZSBlbGVtZW50IHVzaW5nIG1ldGhvZHMgc3VjaCBhcyB0aGUgVGFiIGtleSBvciBjYWxsaW5nIGZvY3VzKCkgaW4gSmF2YVNjcmlwdC4gKi9cblx0QElucHV0KClcblx0Z2V0IHVuZm9jdXNhYmxlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudW5mb2N1c2FibGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHVuZm9jdXNhYmxlKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVuZm9jdXNhYmxlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgY3VycmVudCB2YWx1ZSBkaXNwbGF5ZWQgd2l0aGluIHRoZSBUZXh0Qm94IG9yIFByb2dyZXNzQmFyIGNvbXBvbmVudCBpbnNpZGUgYSBEaWFsb2csIFByb21wdCwgb3IgUHJvZ3Jlc3MgV2luZG93LiBUaGlzIHZhbHVlIGNhbiByZXByZXNlbnQgdXNlciBpbnB1dCAoZm9yIFRleHRCb3gpIG9yIHByb2dyZXNzIHN0YXR1cyAoZm9yIFByb2dyZXNzQmFyKSBhbmQgaXMgdXNlZCB0byBkeW5hbWljYWxseSB1cGRhdGUgdGhlIFVJIGVsZW1lbnQncyBjb250ZW50IG9yIHN0YXRlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdmFsdWUoKTogc3RyaW5nIHwgbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgYWN0dWFsIHBhcmVudCBlbGVtZW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudC4gVGhlIHdpbmRvdydzIHNpemluZyBhbmQgbW92ZW1lbnQgYXJlIHJlc3RyaWN0ZWQgdG8gdGhlIGJvdW5kYXJpZXMgb2YgdGhpcyBwYXJlbnQgZWxlbWVudCwgbWVhbmluZyB0aGUgd2luZG93IGNhbiBvbmx5IGJlIHJlc2l6ZWQgb3IgcmVwb3NpdGlvbmVkIHdpdGhpbiB0aGUgdmlzaWJsZSBhcmVhIG9mIHRoZSBkZXNpZ25hdGVkIHBhcmVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHdpbmRvd1BhcmVudCgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud2luZG93UGFyZW50IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB3aW5kb3dQYXJlbnQodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC53aW5kb3dQYXJlbnQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSB0ZXh0LXdyYXBwaW5nIGJlaGF2aW9yIGZvciB0aGUgaW5wdXQgZmllbGQuICBOb3RlOiBUaGlzIHByb3BlcnR5IGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB1c2VkIHdpdGggdGhlIE11bHRpbGluZVByb21wdFdpbmRvdyBjb21wb25lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCB3cmFwKCk6IFdpbmRvd1dyYXAgfCBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud3JhcCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgd3JhcCh2YWx1ZTogV2luZG93V3JhcCB8IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC53cmFwID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgd2luZG93IGJlZ2lucyBpdHMgb3BlbmluZyBwcm9jZXNzLCBhbGxvd2luZyBkZXZlbG9wZXJzIHRvIHBlcmZvcm0gYW55IHByZXBhcmF0b3J5IGFjdGlvbnMgb3IgbW9kaWZpY2F0aW9ucyBwcmlvciB0byB0aGUgd2luZG93IGJlY29taW5nIHZpc2libGUgdG8gdGhlIHVzZXIuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25PcGVuaW5nOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgd2luZG93IGJlY29tZXMgdmlzaWJsZSB0byB0aGUgdXNlcuKAlHNwZWNpZmljYWxseSwgd2hlbiBpdCBpcyBvcGVuZWQgb3IgYnJvdWdodCBpbnRvIHZpZXcuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25PcGVuOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSB3aW5kb3cgYmVnaW5zIHRoZSBjbG9zaW5nIHByb2Nlc3MsIGFsbG93aW5nIGRldmVsb3BlcnMgdG8gZXhlY3V0ZSBjdXN0b20gbG9naWMgb3IgcHJvbXB0IHRoZSB1c2VyIGZvciBjb25maXJtYXRpb24gYmVmb3JlIHRoZSB3aW5kb3cgaXMgZnVsbHkgY2xvc2VkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uQ2xvc2luZzogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHdpbmRvdyBpcyBjbG9zZWQgb3IgYmVjb21lcyBoaWRkZW4sIHN1Y2ggYXMgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIGJyb3dzZXIgdGFiLCBuYXZpZ2F0ZXMgYXdheSwgb3IgbWluaW1pemVzIHRoZSB3aW5kb3csIGNhdXNpbmcgaXQgdG8gbm8gbG9uZ2VyIGJlIHZpc2libGUgdG8gdGhlIHVzZXIuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25DbG9zZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cgaXMgbWluaW1pemVkIG9yIGNvbGxhcHNlZCBieSB0aGUgdXNlci4gSXQgYWxsb3dzIHlvdSB0byBleGVjdXRlIGN1c3RvbSBsb2dpYyBpbiByZXNwb25zZSB0byB0aGUgd2luZG93IGJlaW5nIGhpZGRlbiBmcm9tIHZpZXcuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25Db2xsYXBzZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgZmluaXNoZXMgZHJhZ2dpbmcgdGhlIHdpbmRvdywgc2lnbmFsaW5nIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBkcmFnLWFuZC1kcm9wIG9wZXJhdGlvbi4gSXQgb2NjdXJzIGFmdGVyIHRoZSBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQgYW5kIHRoZSB3aW5kb3cgbW92ZW1lbnQgaGFzIHN0b3BwZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25EcmFnRW5kOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBpbml0aWF0ZXMgYSB3aW5kb3cgZHJhZyBvcGVyYXRpb24sIGluZGljYXRpbmcgdGhhdCB0aGUgZHJhZ2dpbmcgb2YgdGhlIHdpbmRvdyBoYXMgYmVndW4uIEl0IGZpcmVzIGFzIHNvb24gYXMgdGhlIHVzZXIgc3RhcnRzIG1vdmluZyB0aGUgd2luZG93LCB0eXBpY2FsbHkgYnkgY2xpY2tpbmcgYW5kIGhvbGRpbmcgdGhlIHdpbmRvdydzIHRpdGxlIGJhci5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkRyYWdTdGFydDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW5ldmVyIHRoZSB3aW5kb3cgaXMgcmVzaXplZCB0byBhIGxhcmdlciBzaXplLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGV4cGFuZGVkIHRoZSB3aW5kb3cgZWl0aGVyIGJ5IGRyYWdnaW5nIGl0cyBlZGdlcyBvciBieSBtYXhpbWl6aW5nIGl0LlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uRXhwYW5kOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyB0cmFuc2l0aW9ucyBpbnRvIGEgbWF4aW1pemVkIHN0YXRlLiBJdCBmaXJlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgd2luZG93IGV4cGFuZHMgdG8gZmlsbCB0aGUgYXZhaWxhYmxlIHNjcmVlbiBzcGFjZSwgYWxsb3dpbmcgZGV2ZWxvcGVycyB0byBpbXBsZW1lbnQgY3VzdG9tIGxvZ2ljIGluIHJlc3BvbnNlIHRvIHRoZSB3aW5kb3cgYmVpbmcgbWF4aW1pemVkIGJ5IHRoZSB1c2VyIG9yIHByb2dyYW1tYXRpY2FsbHkuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25NYXhpbWl6ZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiB3aW5kb3cgaXMgbWluaW1pemVkIGJ5IHRoZSB1c2VyLiBJdCBvY2N1cnMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG1pbmltaXplIGFjdGlvbiB0YWtlcyBwbGFjZSwgYWxsb3dpbmcgZGV2ZWxvcGVycyB0byBleGVjdXRlIGN1c3RvbSBsb2dpY+KAlHN1Y2ggYXMgcGF1c2luZyBiYWNrZ3JvdW5kIHByb2Nlc3Nlcywgc2F2aW5nIHN0YXRlLCBvciB1cGRhdGluZyB0aGUgVUnigJRpbiByZXNwb25zZSB0byB0aGUgd2luZG93IGJlaW5nIG1pbmltaXplZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbk1pbmltaXplOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBjb21wbGV0ZXMgcmVzaXppbmcgdGhlIGJyb3dzZXIgd2luZG93LCBzcGVjaWZpY2FsbHkgYWZ0ZXIgdGhlIHJlc2l6aW5nIGFjdGlvbiBoYXMgZmluaXNoZWQgYW5kIHRoZSB3aW5kb3cgc2l6ZSBpcyBubyBsb25nZXIgY2hhbmdpbmcuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25SZXNpemVFbmQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB1c2VyIGluaXRpYXRlcyBhIHdpbmRvdyByZXNpemUgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIGFuZCBkcmFnZ2luZyB0aGUgd2luZG934oCZcyBlZGdlIG9yIGNvcm5lciB0byBjaGFuZ2UgaXRzIGRpbWVuc2lvbnMuIEl0IG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdpbmRvdyByZXNpemluZyBwcm9jZXNzLCBhbGxvd2luZyB5b3UgdG8gZXhlY3V0ZSBzY3JpcHRzIG9yIGhhbmRsZSBVSSB1cGRhdGVzIGFzIHNvb24gYXMgcmVzaXppbmcgc3RhcnRzLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uUmVzaXplU3RhcnQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgcmV0dXJuZWQgdG8gaXRzIG9yaWdpbmFsIHNpemUgYW5kIHBvc2l0aW9uIGFmdGVyIGJlaW5nIG1heGltaXplZCwgZWZmZWN0aXZlbHkgcmVzdG9yaW5nIGl0IHRvIHRoZSBzdGF0ZSBpdCB3YXMgaW4gcHJpb3IgdG8gbWF4aW1pemF0aW9uLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uUmVzdG9yZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIEFwcGVuZHMgYSBuZXcgdGFiIGl0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgZXhpc3RpbmcgbGlzdCBvZiB0YWIgaXRlbXMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcGFyZW50IGVsZW1lbnQuIFRoaXMgb3BlcmF0aW9uIHVwZGF0ZXMgdGhlIHBhcmVudCBlbGVtZW50J3MgdGFiIGl0ZW0gY29sbGVjdGlvbiwgZW5zdXJpbmcgdGhlIG5ldyB0YWIgYXBwZWFycyBhcyB0aGUgbGFzdCBpdGVtIGluIHRoZSB0YWIgbmF2aWdhdGlvbi4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBBIFRhYkl0ZW0gZWxlbWVudCB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmVzdCBvZiB0aGUgaXRlbXMgYXMgdGhlIGxhc3QgaXRlbS5cblx0KiBAcmV0dXJucyB7Tm9kZX1cbiAgKi9cblx0cHVibGljIGFzeW5jIGFwcGVuZENoaWxkKG5vZGUpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cblx0cHVibGljIGFwcGVuZENoaWxkU3luYyhub2RlKTogTm9kZSB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuIFx0ICAgICAgIHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgd2luZG93IHRvIHRoZSBoaWdoZXN0IHotb3JkZXIgbGV2ZWwsIGJyaW5naW5nIGl0IHRvIHRoZSBmb3JlZ3JvdW5kIGFuZCBlbnN1cmluZyBpdCBpcyB2aXNpYmxlIGFuZCBhY2Nlc3NpYmxlIGZvciB1c2VyIGludGVyYWN0aW9uIGFib3ZlIGFsbCBvdGhlciBvcGVuIHdpbmRvd3MuIFxuXHQqL1xuICAgIHB1YmxpYyBicmluZ1RvRnJvbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmJyaW5nVG9Gcm9udCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmJyaW5nVG9Gcm9udCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGFsbCBleGlzdGluZyBjb250ZW50IGZyb20gdGhlIHdpbmRvdywgZWZmZWN0aXZlbHkgcmVzZXR0aW5nIHRoZSB3aW5kb3figJlzIGRpc3BsYXkgYXJlYSB0byBhbiBlbXB0eSBzdGF0ZS4gVGhpcyBvcGVyYXRpb24gY2xlYXJzIGFueSB0ZXh0LCBpbWFnZXMsIG9yIGVsZW1lbnRzIGN1cnJlbnRseSB2aXNpYmxlIHdpdGhpbiB0aGUgd2luZG93LiBcblx0Ki9cbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsZWFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xlYXIoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHdpbmRvdyBpbiB0aGUgYXBwbGljYXRpb24sIHRlcm1pbmF0aW5nIGl0cyB1c2VyIGludGVyZmFjZSBhbmQgcmVsZWFzaW5nIGFueSBhc3NvY2lhdGVkIHJlc291cmNlcy4gSWYgdGhlcmUgYXJlIHVuc2F2ZWQgY2hhbmdlcyBvciBwcm9tcHRzLCB0aGUgdXNlciBtYXkgYmUgYXNrZWQgdG8gY29uZmlybSBiZWZvcmUgdGhlIHdpbmRvdyBpcyBjbG9zZWQuIFxuXHQqL1xuICAgIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBNaW5pbWl6ZXMgdGhlIHdpbmRvdywgcmVkdWNpbmcgaXQgdG8gYSBzbWFsbGVyIGljb24gb3IgaGlkZGVuIHN0YXRlLCB3aXRob3V0IGNsb3NpbmcgdGhlIGFwcGxpY2F0aW9uLiBcblx0KiBAcmV0dXJucyB7SFRNTEVsZW1lbnR9XG4gICovXG5cdHB1YmxpYyBhc3luYyBjb2xsYXBzZSgpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuY29sbGFwc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHRwdWJsaWMgY29sbGFwc2VTeW5jKCk6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gXHQgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5jb2xsYXBzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEVuc3VyZXMgdGhlIHNwZWNpZmllZCB0YWIgaXRlbSBpcyBicm91Z2h0IGludG8gdmlldyBieSBhdXRvbWF0aWNhbGx5IHNjcm9sbGluZyB0aGUgdGFiIGJhciBhcyBuZWVkZWQuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBleGNsdXNpdmUgdG8gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50LiBcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHNjcm9sbCB0by5cblx0Ki9cbiAgICBwdWJsaWMgZW5zdXJlVmlzaWJsZShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmVuc3VyZVZpc2libGUoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmVuc3VyZVZpc2libGUoaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBmdWxsIHNpemUgYW5kIHZpc2liaWxpdHkgYWZ0ZXIgaXQgaGFzIGJlZW4gY29sbGFwc2VkIG9yIG1pbmltaXplZCwgYWxsb3dpbmcgdXNlcnMgdG8gdmlldyBhbmQgaW50ZXJhY3Qgd2l0aCBpdHMgY29udGVudHMgYWdhaW4uIFxuXHQqIEByZXR1cm5zIHthbnlbXX1cbiAgKi9cblx0cHVibGljIGFzeW5jIGV4cGFuZCgpOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuZXhwYW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cblx0cHVibGljIGV4cGFuZFN5bmMoKTogYW55W10ge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiBcdCAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50LmV4cGFuZCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluc2VydHMgYSBuZXcgdGFiIGFsb25nIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgY29udGVudCBzZWN0aW9uIGludG8gdGhlIHVzZXIgaW50ZXJmYWNlLiBUaGlzIGZ1bmN0aW9uIGlzIHNwZWNpZmljYWxseSBkZXNpZ25lZCBmb3IgdXNlIHdpdGhpbiB0aGUgVGFic1dpbmRvdyBjb21wb25lbnQgYW5kIHdpbGwgbm90IG9wZXJhdGUgb3V0c2lkZSBvZiB0aGlzIGNvbnRleHQuIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBpbmRleC4gVGhlIGluZGV4IHRvIGluc2VydCBhIG5ldyB0YWIgYXQuXG5cdCogQHBhcmFtIHthbnl9IGRldGFpbHMuIEFuIE9iamVjdCB3aXRoIHRoZSBmaWVsZHMgXCJsYWJlbFwiLCBcImxhYmVsU2l6ZVwiLCBcImNvbnRlbnRcIiBhbmQgXCJncm91cFwiLlxuXHQqL1xuICAgIHB1YmxpYyBpbnNlcnQoaW5kZXg6IG51bWJlciwgZGV0YWlsczogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydChpbmRleCwgZGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0KGluZGV4LCBkZXRhaWxzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIGRpcmVjdGx5IGJlZm9yZSB0aGUgcmVmZXJlbmNlIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIHdpdGhpbiB0aGUgdGFiIGNvbGxlY3Rpb24uIFRoaXMgb3BlcmF0aW9uIGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIG1hbmlwdWxhdGluZyB0YWIgaXRlbXMgaW5zaWRlIGEgVGFic1dpbmRvdyBjb21wb25lbnQuIFxuXHQqIEBwYXJhbSB7Tm9kZX0gbmV3Tm9kZS4gVGhlIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIHRvIGluc2VydC5cblx0KiBAcGFyYW0ge05vZGUgfCBudWxsfSByZWZlcmVuY2VOb2RlPy4gVGhlIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIGJlZm9yZSB3aGljaCBuZXdOb2RlIGlzIGluc2VydGVkLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGU/KTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHRwdWJsaWMgaW5zZXJ0QmVmb3JlU3luYyhuZXdOb2RlLCByZWZlcmVuY2VOb2RlPyk6IE5vZGUge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiBcdCAgICAgICByZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZXZpc2VkIERlc2NyaXB0aW9uOlwiU2V0cyB0aGUgd2luZG93J3MgcG9zaXRpb24gb24gdGhlIHNjcmVlbiBieSBtb3ZpbmcgaXQgdG8gc3BlY2lmaWVkIFggYW5kIFkgY29vcmRpbmF0ZXMsIGVmZmVjdGl2ZWx5IHJlbG9jYXRpbmcgdGhlIHdpbmRvdyB0byBhIG5ldyBsb2NhdGlvbi5cIiBcblx0KiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gbGVmdC4gTGVmdCBwb3NpdGlvbi4gRm9yIGV4YW1wbGU6ICcxMDBweCcuIFxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSB0b3AuIFRvcCBwb3NpdGlvbi4gRm9yIGV4YW1wbGU6ICcxMDBweCcuIFxuXHQqL1xuICAgIHB1YmxpYyBtb3ZlKGxlZnQ6IHN0cmluZyB8IG51bWJlciwgdG9wOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQubW92ZShsZWZ0LCB0b3ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm1vdmUobGVmdCwgdG9wKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRXhwYW5kcyB0aGUgd2luZG93IHRvIG9jY3VweSB0aGUgZW50aXJlIGF2YWlsYWJsZSB2aWV3aW5nIGFyZWEsIGVuc3VyaW5nIGl0IGZpbGxzIGFsbCB1c2FibGUgc2NyZWVuIHNwYWNlIHdpdGhvdXQgb3ZlcmxhcHBpbmcgc3lzdGVtIHRhc2tiYXJzIG9yIG1lbnVzLiBcblx0Ki9cbiAgICBwdWJsaWMgbWF4aW1pemUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4aW1pemUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVkdWNlcyB0aGUgd2luZG93IHRvIHRoZSB0YXNrYmFyIG9yIGRvY2ssIHRlbXBvcmFyaWx5IGhpZGluZyBpdCBmcm9tIHZpZXcgd2l0aG91dCBjbG9zaW5nIHRoZSBhcHBsaWNhdGlvbi4gXG5cdCovXG4gICAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm1pbmltaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE9wZW5zIGEgbmV3IGJyb3dzZXIgd2luZG93IG9yIHRhYiB3aXRoIHRoZSBzcGVjaWZpZWQgVVJMIG9yIGNvbnRlbnQsIGFsbG93aW5nIGFkZGl0aW9uYWwgd2ViIHBhZ2VzIG9yIHJlc291cmNlcyB0byBiZSBkaXNwbGF5ZWQgYWxvbmdzaWRlIHRoZSBjdXJyZW50IHBhZ2UuIFxuXHQqL1xuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBQcmV2ZW50cyB0aGUgd2luZG93IGZyb20gYmVpbmcgbW92ZWQgYnkgbG9ja2luZyBpdHMgcG9zaXRpb24uIERpc2FibGVzIHRoZSBhYmlsaXR5IHRvIGRyYWcgb3IgcmVwb3NpdGlvbiB0aGUgd2luZG93LCBlbnN1cmluZyBpdCByZW1haW5zIGZpeGVkIGluIHBsYWNlLiBcblx0Ki9cbiAgICBwdWJsaWMgcGluKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIHRhYiBhbG9uZyB3aXRoIGl0cyBjb3JyZXNwb25kaW5nIGNvbnRlbnQgc2VjdGlvbiBmcm9tIHRoZSBpbnRlcmZhY2UuIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gd29yayBleGNsdXNpdmVseSB3aXRoaW4gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50LiBcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHJlbW92ZS5cblx0Ki9cbiAgICBwdWJsaWMgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVBdChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIGEgY2hpbGQgbm9kZSB3aXRoIHRoZSBcInNtYXJ0LXRhYi1pdGVtXCIgdGFnIGZyb20gdGhlIHBhcmVudCBjb250YWluZXIuICBOb3RlOiBUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYnNXaW5kb3cgY29tcG9uZW50OyBhdHRlbXB0aW5nIHRvIHVzZSBpdCBlbHNld2hlcmUgd2lsbCBoYXZlIG5vIGVmZmVjdC4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBUaGUgXCJzbWFydC10YWItaXRlbVwiIG5vZGUgdG8gcmVtb3ZlLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgcmVtb3ZlQ2hpbGQobm9kZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHRwdWJsaWMgcmVtb3ZlQ2hpbGRTeW5jKG5vZGUpOiBOb2RlIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gXHQgICAgICAgcmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBSZXN0b3JlcyB0aGUgd2luZG93IHRvIGl0cyBwcmV2aW91cyBkaW1lbnNpb25zIGFuZCBwb3NpdGlvbiBiZWZvcmUgaXQgd2FzIG1heGltaXplZCBvciBtaW5pbWl6ZWQsIHJldHVybmluZyBpdCB0byB0aGUgZXhhY3Qgc2l6ZSBhbmQgbG9jYXRpb24gaXQgaGFkIHByaW9yIHRvIHRob3NlIGFjdGlvbnMuIFxuXHQqL1xuICAgIHB1YmxpYyByZXN0b3JlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzdG9yZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgdGFiIHdpdGhpbiB0aGUgaW50ZXJmYWNlLiBUaGlzIGFjdGlvbiBhcHBsaWVzIGV4Y2x1c2l2ZWx5IHRvIGVsZW1lbnRzIG9mIHR5cGUgVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IGluZGV4LiBUaGUgaW5kZXggb2YgdGhlIHRhYiB0byBzZWxlY3QuXG5cdCovXG4gICAgcHVibGljIHNlbGVjdChpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdChpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0KGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyB0aGUgcGlubmVkIChmaXhlZCkgc3RhdGUgZnJvbSB0aGUgd2luZG93LCBhbGxvd2luZyB0aGUgdXNlciB0byBmcmVlbHkgbW92ZSBvciBkcmFnIHRoZSB3aW5kb3cgdG8gYSBkaWZmZXJlbnQgcG9zaXRpb24gb24gdGhlIHNjcmVlbi4gXG5cdCovXG4gICAgcHVibGljIHVucGluKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51bnBpbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVucGluKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgdGhlIHRleHQgZGlzcGxheWVkIGluIHRoZSBoZWFkZXIgbGFiZWwgdG8gcmVmbGVjdCBuZXcgaW5mb3JtYXRpb24gb3IgY2hhbmdlcywgZW5zdXJpbmcgdGhhdCB0aGUgaGVhZGVyIGFjY3VyYXRlbHkgcmVwcmVzZW50cyB0aGUgY3VycmVudCBjb250ZW50IG9yIGNvbnRleHQgb2YgdGhlIHNlY3Rpb24uIFxuXHQqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbC4gVGhlIG5ldyBsYWJlbCBvZiB0aGUgSGVhZGVyLlxuXHQqL1xuICAgIHB1YmxpYyB1cGRhdGVMYWJlbChsYWJlbDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVwZGF0ZUxhYmVsKGxhYmVsKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51cGRhdGVMYWJlbChsYWJlbCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHRoZSBleGlzdGluZyBjb250ZW50IHdpdGggbmV3IG9yIG1vZGlmaWVkIGluZm9ybWF0aW9uLCBlbnN1cmluZyB0aGF0IHRoZSBkaXNwbGF5ZWQgZGF0YSByZWZsZWN0cyB0aGUgbGF0ZXN0IHVwZGF0ZXMgb3IgY2hhbmdlcy4gXG5cdCogQHBhcmFtIHtzdHJpbmcgfCBIVE1MRWxlbWVudH0gY29udGVudC4gVGhlIG5ldyBjb250ZW50IG9mIHRoZSB3aW5kb3cuXG5cdCovXG4gICAgcHVibGljIHVwZGF0ZUNvbnRlbnQoY29udGVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlQ29udGVudChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51cGRhdGVDb250ZW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBVcGRhdGVzIGFuIGluZGl2aWR1YWwgdGFiIHdpdGhpbiBhIFRhYnNXaW5kb3cgY29tcG9uZW50IGFuZCBtb2RpZmllcyBpdHMgY29ycmVzcG9uZGluZyBjb250ZW50IHNlY3Rpb24uIFRoaXMgb3BlcmF0aW9uIGV4Y2x1c2l2ZWx5IGFwcGxpZXMgdG8gZWxlbWVudHMgb2YgdGhlIFRhYnNXaW5kb3cgdHlwZS4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gY2hhbmdlIHRhYiBsYWJlbHMsIHVwZGF0ZSBhY3RpdmUgc3RhdGVzLCBvciByZWZyZXNoIHRoZSBjb250ZW50IGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRhYiB3aXRoaW4gdGhlIFRhYnNXaW5kb3cgaW50ZXJmYWNlLiBcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHVwZGF0ZS5cblx0KiBAcGFyYW0ge3N0cmluZ30gbGFiZWwuIFRoZSBuZXcgbGFiZWwgb2YgdGhlIHRhYi4gVGhlIHZhbHVlIGNhbiBiZSB0aGUgaWQgb2YgYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgSFRNTEVsZW1lbnR9IGNvbnRlbnQuIFRoZSBuZXcgY29udGVudCBvZiB0aGUgdGFiLlxuXHQqL1xuICAgIHB1YmxpYyB1cGRhdGUoaW5kZXg6IG51bWJlciwgbGFiZWw6IHN0cmluZywgY29udGVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlKGluZGV4LCBsYWJlbCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlKGluZGV4LCBsYWJlbCwgY29udGVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cdGdldCBpc1JlbmRlcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCA6IGZhbHNlO1xuXHR9XG5cblx0bmdPbkluaXQoKSB7XG5cdH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgICB0aGF0Lm9uQ3JlYXRlLmVtaXQodGhhdC5uYXRpdmVFbGVtZW50KTtcblxuXHRcdGlmIChTbWFydCkgU21hcnQuUmVuZGVyKCk7XG5cblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnc21hcnQtYW5ndWxhcicpO1xuXG5cdFx0aWYgKHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQpIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4geyB0aGF0Lm9uUmVhZHkuZW1pdCh0aGF0Lm5hdGl2ZUVsZW1lbnQpOyB9KTtcblx0XHR0aGlzLmxpc3RlbigpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKSB7XG5cdFx0dGhpcy51bmxpc3RlbigpO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcblx0XHRcdGZvciAoY29uc3QgcHJvcE5hbWUgaW4gY2hhbmdlcykge1xuXHRcdFx0XHRpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcblx0XHRcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcE5hbWVdID0gY2hhbmdlc1twcm9wTmFtZV0uY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBZGQgZXZlbnQgbGlzdGVuZXJzLiAqL1xuXHRwcml2YXRlIGxpc3RlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uT3BlbmluZy5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdvcGVuaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk9wZW4uZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25DbG9zaW5nLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NpbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkNsb3NlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2NvbGxhcHNlSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uQ29sbGFwc2UuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29sbGFwc2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2NvbGxhcHNlSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ0VuZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkRyYWdFbmQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ0VuZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ0VuZEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkRyYWdTdGFydC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnU3RhcnQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkV4cGFuZC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdleHBhbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uTWF4aW1pemUuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWF4aW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snbWluaW1pemVIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25NaW5pbWl6ZS5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtaW5pbWl6ZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snbWluaW1pemVIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25SZXNpemVFbmQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplRW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblJlc2l6ZVN0YXJ0LmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZVN0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25SZXN0b3JlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc3RvcmUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10pO1xuXG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMuICovXG5cdHByaXZhdGUgdW5saXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdvcGVuaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydvcGVuSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2luZ0hhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NpbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbGxhcHNlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ0VuZEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ1N0YXJ0SGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdleHBhbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snbWF4aW1pemVIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYXhpbWl6ZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snbWF4aW1pemVIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWluaW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemVFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemVTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXN0b3JlJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXN0b3JlSGFuZGxlciddKTtcblx0XHR9XG5cblx0fVxufVxuIl19