@smart-webcomponents-angular/window 11.0.1 → 13.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/window/index.mjs +2 -0
- package/{esm2015/window/public_api.js → esm2020/window/public_api.mjs} +0 -0
- package/{esm2015/window/smart-webcomponents-angular-window.js → esm2020/window/smart-webcomponents-angular-window.mjs} +2 -3
- package/esm2020/window/smart.element.mjs +96 -0
- package/esm2020/window/smart.window.mjs +1051 -0
- package/esm2020/window/smart.window.module.mjs +18 -0
- package/fesm2015/{smart-webcomponents-angular-window.js → smart-webcomponents-angular-window.mjs} +206 -111
- package/fesm2015/smart-webcomponents-angular-window.mjs.map +1 -0
- package/fesm2020/smart-webcomponents-angular-window.mjs +1173 -0
- package/fesm2020/smart-webcomponents-angular-window.mjs.map +1 -0
- package/index.d.ts +275 -18
- package/package.json +26 -24
- package/source/modules/smart.window.js +1 -1
- package/source/smart.button.js +1 -1
- package/source/smart.combobox.js +1 -1
- package/source/smart.dropdownlist.js +2 -2
- package/source/smart.element.js +2 -2
- package/source/smart.listbox.js +1 -1
- package/source/smart.multilinetextbox.js +1 -1
- package/source/smart.progressbar.js +1 -1
- package/source/smart.scrollbar.js +1 -1
- package/source/smart.textbox.js +1 -1
- package/source/smart.window.js +1 -1
- package/styles/font/smart-icons.eot +0 -0
- package/styles/font/smart-icons.svg +11 -3
- package/styles/font/smart-icons.ttf +0 -0
- package/styles/font/smart-icons.woff +0 -0
- package/styles/font/smart-icons.woff2 +0 -0
- package/styles/smart.base.css +2 -2
- package/styles/smart.window.css +3 -3
- package/window/index.d.ts +1 -0
- package/window/smart-webcomponents-angular-window.d.ts +2 -2
- package/window/smart.element.d.ts +4 -1
- package/window/smart.window.d.ts +3 -0
- package/window/smart.window.module.d.ts +5 -0
- package/bundles/smart-webcomponents-angular-window.umd.js +0 -1769
- package/bundles/smart-webcomponents-angular-window.umd.min.js +0 -25
- package/esm2015/window/smart.element.js +0 -83
- package/esm2015/window/smart.window.js +0 -983
- package/esm2015/window/smart.window.module.js +0 -13
- package/fesm2015/smart-webcomponents-angular-window.js.map +0 -1
- package/window/smart-webcomponents-angular-window.metadata.json +0 -1
|
@@ -0,0 +1,1051 @@
|
|
|
1
|
+
import { Directive, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
+
import { BaseElement, Smart } from './smart.element';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export { Smart } from './smart.element';
|
|
5
|
+
export class WindowComponent extends BaseElement {
|
|
6
|
+
constructor(ref) {
|
|
7
|
+
super(ref);
|
|
8
|
+
this.eventHandlers = [];
|
|
9
|
+
/** @description This event is triggered just before the window starts opening.
|
|
10
|
+
* @param event. The custom event. */
|
|
11
|
+
this.onOpening = new EventEmitter();
|
|
12
|
+
/** @description This event is triggered when the window is opened( visible ).
|
|
13
|
+
* @param event. The custom event. */
|
|
14
|
+
this.onOpen = new EventEmitter();
|
|
15
|
+
/** @description This event is triggered just before the window starts closing.
|
|
16
|
+
* @param event. The custom event. */
|
|
17
|
+
this.onClosing = new EventEmitter();
|
|
18
|
+
/** @description This event is triggered when the window is closed( hidden )
|
|
19
|
+
* @param event. The custom event. */
|
|
20
|
+
this.onClose = new EventEmitter();
|
|
21
|
+
/** @description This event is triggered when the window is collapsed.
|
|
22
|
+
* @param event. The custom event. */
|
|
23
|
+
this.onCollapse = new EventEmitter();
|
|
24
|
+
/** @description This event is triggered when window's dragging is ended.
|
|
25
|
+
* @param event. The custom event. */
|
|
26
|
+
this.onDragEnd = new EventEmitter();
|
|
27
|
+
/** @description This event is triggered when window's dragging is started.
|
|
28
|
+
* @param event. The custom event. */
|
|
29
|
+
this.onDragStart = new EventEmitter();
|
|
30
|
+
/** @description This event is triggered when the window is expanded.
|
|
31
|
+
* @param event. The custom event. */
|
|
32
|
+
this.onExpand = new EventEmitter();
|
|
33
|
+
/** @description This event is triggered when the window is maximized.
|
|
34
|
+
* @param event. The custom event. */
|
|
35
|
+
this.onMaximize = new EventEmitter();
|
|
36
|
+
/** @description This event is triggered when the window is minimized.
|
|
37
|
+
* @param event. The custom event. */
|
|
38
|
+
this.onMinimize = new EventEmitter();
|
|
39
|
+
/** @description This event is triggered when window's resizing is ended.
|
|
40
|
+
* @param event. The custom event. */
|
|
41
|
+
this.onResizeEnd = new EventEmitter();
|
|
42
|
+
/** @description This event is triggered when window's resizing is started.
|
|
43
|
+
* @param event. The custom event. */
|
|
44
|
+
this.onResizeStart = new EventEmitter();
|
|
45
|
+
/** @description This event is triggered when the window is restored to it's previous state before maximization.
|
|
46
|
+
* @param event. The custom event. */
|
|
47
|
+
this.onRestore = new EventEmitter();
|
|
48
|
+
this.nativeElement = ref.nativeElement;
|
|
49
|
+
}
|
|
50
|
+
/** @description Creates the component on demand.
|
|
51
|
+
* @param properties An optional object of properties, which will be added to the template binded ones.
|
|
52
|
+
*/
|
|
53
|
+
createComponent(properties = {}) {
|
|
54
|
+
this.nativeElement = document.createElement('smart-window');
|
|
55
|
+
for (let propertyName in properties) {
|
|
56
|
+
this.nativeElement[propertyName] = properties[propertyName];
|
|
57
|
+
}
|
|
58
|
+
return this.nativeElement;
|
|
59
|
+
}
|
|
60
|
+
/** @description Determines if 'Add New' Tab inside the Tabs element is visible. Applicable only to TabsWindow */
|
|
61
|
+
get addNewTab() {
|
|
62
|
+
return this.nativeElement ? this.nativeElement.addNewTab : undefined;
|
|
63
|
+
}
|
|
64
|
+
set addNewTab(value) {
|
|
65
|
+
this.nativeElement ? this.nativeElement.addNewTab = value : undefined;
|
|
66
|
+
}
|
|
67
|
+
/** @description Sets or gets the animation mode. Animation is disabled when the property is set to 'none' */
|
|
68
|
+
get animation() {
|
|
69
|
+
return this.nativeElement ? this.nativeElement.animation : undefined;
|
|
70
|
+
}
|
|
71
|
+
set animation(value) {
|
|
72
|
+
this.nativeElement ? this.nativeElement.animation = value : undefined;
|
|
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. */
|
|
75
|
+
get autoCapitalize() {
|
|
76
|
+
return this.nativeElement ? this.nativeElement.autoCapitalize : undefined;
|
|
77
|
+
}
|
|
78
|
+
set autoCapitalize(value) {
|
|
79
|
+
this.nativeElement ? this.nativeElement.autoCapitalize = value : undefined;
|
|
80
|
+
}
|
|
81
|
+
/** @description Determines whether element will auto expand when the input overflows vertically. Applicable only to MultilinePromptWindow. */
|
|
82
|
+
get autoExpand() {
|
|
83
|
+
return this.nativeElement ? this.nativeElement.autoExpand : undefined;
|
|
84
|
+
}
|
|
85
|
+
set autoExpand(value) {
|
|
86
|
+
this.nativeElement ? this.nativeElement.autoExpand = value : undefined;
|
|
87
|
+
}
|
|
88
|
+
/** @description Determines the label for the 'cancel' button inside the Prompt Window. */
|
|
89
|
+
get cancelLabel() {
|
|
90
|
+
return this.nativeElement ? this.nativeElement.cancelLabel : undefined;
|
|
91
|
+
}
|
|
92
|
+
set cancelLabel(value) {
|
|
93
|
+
this.nativeElement ? this.nativeElement.cancelLabel = value : undefined;
|
|
94
|
+
}
|
|
95
|
+
/** @description Determines the label for the 'Complete' button insinde the Progress Window. */
|
|
96
|
+
get completeLabel() {
|
|
97
|
+
return this.nativeElement ? this.nativeElement.completeLabel : undefined;
|
|
98
|
+
}
|
|
99
|
+
set completeLabel(value) {
|
|
100
|
+
this.nativeElement ? this.nativeElement.completeLabel = value : undefined;
|
|
101
|
+
}
|
|
102
|
+
/** @description Determines the label for the 'Confirm' button insinde the Prompt Window. */
|
|
103
|
+
get confirmLabel() {
|
|
104
|
+
return this.nativeElement ? this.nativeElement.confirmLabel : undefined;
|
|
105
|
+
}
|
|
106
|
+
set confirmLabel(value) {
|
|
107
|
+
this.nativeElement ? this.nativeElement.confirmLabel = value : undefined;
|
|
108
|
+
}
|
|
109
|
+
/** @description Determines if the window is collapsed or not. When collapsed the only the header of the window is visible. */
|
|
110
|
+
get collapsed() {
|
|
111
|
+
return this.nativeElement ? this.nativeElement.collapsed : undefined;
|
|
112
|
+
}
|
|
113
|
+
set collapsed(value) {
|
|
114
|
+
this.nativeElement ? this.nativeElement.collapsed = value : undefined;
|
|
115
|
+
}
|
|
116
|
+
/** @description When a modal window is opened, thid property determines if clicking on the mask closes the window or not. */
|
|
117
|
+
get closeOnMaskClick() {
|
|
118
|
+
return this.nativeElement ? this.nativeElement.closeOnMaskClick : undefined;
|
|
119
|
+
}
|
|
120
|
+
set closeOnMaskClick(value) {
|
|
121
|
+
this.nativeElement ? this.nativeElement.closeOnMaskClick = value : undefined;
|
|
122
|
+
}
|
|
123
|
+
/** @description Determines the data source that will be loaded to the TabsWindow. Applicable only to TabsWindow. */
|
|
124
|
+
get dataSource() {
|
|
125
|
+
return this.nativeElement ? this.nativeElement.dataSource : undefined;
|
|
126
|
+
}
|
|
127
|
+
set dataSource(value) {
|
|
128
|
+
this.nativeElement ? this.nativeElement.dataSource = value : undefined;
|
|
129
|
+
}
|
|
130
|
+
/** @description Enables or disables the window. */
|
|
131
|
+
get disabled() {
|
|
132
|
+
return this.nativeElement ? this.nativeElement.disabled : undefined;
|
|
133
|
+
}
|
|
134
|
+
set disabled(value) {
|
|
135
|
+
this.nativeElement ? this.nativeElement.disabled = value : undefined;
|
|
136
|
+
}
|
|
137
|
+
/** @description Enables or disables the window snapping feature. */
|
|
138
|
+
get disableSnap() {
|
|
139
|
+
return this.nativeElement ? this.nativeElement.disableSnap : undefined;
|
|
140
|
+
}
|
|
141
|
+
set disableSnap(value) {
|
|
142
|
+
this.nativeElement ? this.nativeElement.disableSnap = value : undefined;
|
|
143
|
+
}
|
|
144
|
+
/** @description Determines how the characters are displayed inside the input. Applicable to Prompt Window. */
|
|
145
|
+
get displayMode() {
|
|
146
|
+
return this.nativeElement ? this.nativeElement.displayMode : undefined;
|
|
147
|
+
}
|
|
148
|
+
set displayMode(value) {
|
|
149
|
+
this.nativeElement ? this.nativeElement.displayMode = value : undefined;
|
|
150
|
+
}
|
|
151
|
+
/** @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. */
|
|
152
|
+
get dropPosition() {
|
|
153
|
+
return this.nativeElement ? this.nativeElement.dropPosition : undefined;
|
|
154
|
+
}
|
|
155
|
+
set dropPosition(value) {
|
|
156
|
+
this.nativeElement ? this.nativeElement.dropPosition = value : undefined;
|
|
157
|
+
}
|
|
158
|
+
/** @description A callback function defining the new format for the label of the Progress Bar. Applicable only to ProgressWindow. */
|
|
159
|
+
get formatFunction() {
|
|
160
|
+
return this.nativeElement ? this.nativeElement.formatFunction : undefined;
|
|
161
|
+
}
|
|
162
|
+
set formatFunction(value) {
|
|
163
|
+
this.nativeElement ? this.nativeElement.formatFunction = value : undefined;
|
|
164
|
+
}
|
|
165
|
+
/** @description Determines the position of the footer of the window element. */
|
|
166
|
+
get footerPosition() {
|
|
167
|
+
return this.nativeElement ? this.nativeElement.footerPosition : undefined;
|
|
168
|
+
}
|
|
169
|
+
set footerPosition(value) {
|
|
170
|
+
this.nativeElement ? this.nativeElement.footerPosition = value : undefined;
|
|
171
|
+
}
|
|
172
|
+
/** @description Determines the template for the Dialog section of the window. By default footerTemplate is null. */
|
|
173
|
+
get footerTemplate() {
|
|
174
|
+
return this.nativeElement ? this.nativeElement.footerTemplate : undefined;
|
|
175
|
+
}
|
|
176
|
+
set footerTemplate(value) {
|
|
177
|
+
this.nativeElement ? this.nativeElement.footerTemplate = value : undefined;
|
|
178
|
+
}
|
|
179
|
+
/** @description Set's the buttons that will be visible in the header section. */
|
|
180
|
+
get headerButtons() {
|
|
181
|
+
return this.nativeElement ? this.nativeElement.headerButtons : undefined;
|
|
182
|
+
}
|
|
183
|
+
set headerButtons(value) {
|
|
184
|
+
this.nativeElement ? this.nativeElement.headerButtons = value : undefined;
|
|
185
|
+
}
|
|
186
|
+
/** @description Determines the template for the Dialog section of the window. By default headerTemplate is null. */
|
|
187
|
+
get headerTemplate() {
|
|
188
|
+
return this.nativeElement ? this.nativeElement.headerTemplate : undefined;
|
|
189
|
+
}
|
|
190
|
+
set headerTemplate(value) {
|
|
191
|
+
this.nativeElement ? this.nativeElement.headerTemplate = value : undefined;
|
|
192
|
+
}
|
|
193
|
+
/** @description Determines the position of the header of the window element. */
|
|
194
|
+
get headerPosition() {
|
|
195
|
+
return this.nativeElement ? this.nativeElement.headerPosition : undefined;
|
|
196
|
+
}
|
|
197
|
+
set headerPosition(value) {
|
|
198
|
+
this.nativeElement ? this.nativeElement.headerPosition = value : undefined;
|
|
199
|
+
}
|
|
200
|
+
/** @description Sets additional helper text below the text box. The hint is visible only when the text box is focued. Applicable to Prompt Window. */
|
|
201
|
+
get hint() {
|
|
202
|
+
return this.nativeElement ? this.nativeElement.hint : undefined;
|
|
203
|
+
}
|
|
204
|
+
set hint(value) {
|
|
205
|
+
this.nativeElement ? this.nativeElement.hint = value : undefined;
|
|
206
|
+
}
|
|
207
|
+
/** @description Sets the value of the Progress bar to indeterminate state(null) and starts the animation. Applicable only to ProgressWindow. */
|
|
208
|
+
get indeterminate() {
|
|
209
|
+
return this.nativeElement ? this.nativeElement.indeterminate : undefined;
|
|
210
|
+
}
|
|
211
|
+
set indeterminate(value) {
|
|
212
|
+
this.nativeElement ? this.nativeElement.indeterminate = value : undefined;
|
|
213
|
+
}
|
|
214
|
+
/** @description Sets the filling direction of the Progress Bar. Applicable only to ProgressWindow. */
|
|
215
|
+
get inverted() {
|
|
216
|
+
return this.nativeElement ? this.nativeElement.inverted : undefined;
|
|
217
|
+
}
|
|
218
|
+
set inverted(value) {
|
|
219
|
+
this.nativeElement ? this.nativeElement.inverted = value : undefined;
|
|
220
|
+
}
|
|
221
|
+
/** @description The label of the window that appears in the header area. */
|
|
222
|
+
get label() {
|
|
223
|
+
return this.nativeElement ? this.nativeElement.label : undefined;
|
|
224
|
+
}
|
|
225
|
+
set label(value) {
|
|
226
|
+
this.nativeElement ? this.nativeElement.label = value : undefined;
|
|
227
|
+
}
|
|
228
|
+
/** @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. */
|
|
229
|
+
get liveResize() {
|
|
230
|
+
return this.nativeElement ? this.nativeElement.liveResize : undefined;
|
|
231
|
+
}
|
|
232
|
+
set liveResize(value) {
|
|
233
|
+
this.nativeElement ? this.nativeElement.liveResize = value : undefined;
|
|
234
|
+
}
|
|
235
|
+
/** @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. */
|
|
236
|
+
get layout() {
|
|
237
|
+
return this.nativeElement ? this.nativeElement.layout : undefined;
|
|
238
|
+
}
|
|
239
|
+
set layout(value) {
|
|
240
|
+
this.nativeElement ? this.nativeElement.layout = value : undefined;
|
|
241
|
+
}
|
|
242
|
+
/** @description Sets or gets the language. Used in conjunction with the property messages. */
|
|
243
|
+
get locale() {
|
|
244
|
+
return this.nativeElement ? this.nativeElement.locale : undefined;
|
|
245
|
+
}
|
|
246
|
+
set locale(value) {
|
|
247
|
+
this.nativeElement ? this.nativeElement.locale = value : undefined;
|
|
248
|
+
}
|
|
249
|
+
/** @description Applicable only to TabsWindow when docked inside a DockingLayout Custom Element.Determines of the item can be resized or not. */
|
|
250
|
+
get locked() {
|
|
251
|
+
return this.nativeElement ? this.nativeElement.locked : undefined;
|
|
252
|
+
}
|
|
253
|
+
set locked(value) {
|
|
254
|
+
this.nativeElement ? this.nativeElement.locked = value : undefined;
|
|
255
|
+
}
|
|
256
|
+
/** @description Callback, related to localization module. */
|
|
257
|
+
get localizeFormatFunction() {
|
|
258
|
+
return this.nativeElement ? this.nativeElement.localizeFormatFunction : undefined;
|
|
259
|
+
}
|
|
260
|
+
set localizeFormatFunction(value) {
|
|
261
|
+
this.nativeElement ? this.nativeElement.localizeFormatFunction = value : undefined;
|
|
262
|
+
}
|
|
263
|
+
/** @description Determines if the window is maximized or not. When maximized the window covers the whole viewport. */
|
|
264
|
+
get maximized() {
|
|
265
|
+
return this.nativeElement ? this.nativeElement.maximized : undefined;
|
|
266
|
+
}
|
|
267
|
+
set maximized(value) {
|
|
268
|
+
this.nativeElement ? this.nativeElement.maximized = value : undefined;
|
|
269
|
+
}
|
|
270
|
+
/** @description Sets or gets an object specifying strings used in the widget that can be localized. Used in conjunction with the property locale. */
|
|
271
|
+
get messages() {
|
|
272
|
+
return this.nativeElement ? this.nativeElement.messages : undefined;
|
|
273
|
+
}
|
|
274
|
+
set messages(value) {
|
|
275
|
+
this.nativeElement ? this.nativeElement.messages = value : undefined;
|
|
276
|
+
}
|
|
277
|
+
/** @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. */
|
|
278
|
+
get modal() {
|
|
279
|
+
return this.nativeElement ? this.nativeElement.modal : undefined;
|
|
280
|
+
}
|
|
281
|
+
set modal(value) {
|
|
282
|
+
this.nativeElement ? this.nativeElement.modal = value : undefined;
|
|
283
|
+
}
|
|
284
|
+
/** @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. */
|
|
285
|
+
get max() {
|
|
286
|
+
return this.nativeElement ? this.nativeElement.max : undefined;
|
|
287
|
+
}
|
|
288
|
+
set max(value) {
|
|
289
|
+
this.nativeElement ? this.nativeElement.max = value : undefined;
|
|
290
|
+
}
|
|
291
|
+
/** @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. */
|
|
292
|
+
get min() {
|
|
293
|
+
return this.nativeElement ? this.nativeElement.min : undefined;
|
|
294
|
+
}
|
|
295
|
+
set min(value) {
|
|
296
|
+
this.nativeElement ? this.nativeElement.min = value : undefined;
|
|
297
|
+
}
|
|
298
|
+
/** @description Determines if the window is minimized or not. When minimized the window is docked at the bottom left corner of the viewport. */
|
|
299
|
+
get minimized() {
|
|
300
|
+
return this.nativeElement ? this.nativeElement.minimized : undefined;
|
|
301
|
+
}
|
|
302
|
+
set minimized(value) {
|
|
303
|
+
this.nativeElement ? this.nativeElement.minimized = value : undefined;
|
|
304
|
+
}
|
|
305
|
+
/** @description Sets or gets the maximum number of characters that the user can enter. Applicable to Prompt/MultilinePrompt Window. */
|
|
306
|
+
get maxLength() {
|
|
307
|
+
return this.nativeElement ? this.nativeElement.maxLength : undefined;
|
|
308
|
+
}
|
|
309
|
+
set maxLength(value) {
|
|
310
|
+
this.nativeElement ? this.nativeElement.maxLength = value : undefined;
|
|
311
|
+
}
|
|
312
|
+
/** @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. */
|
|
313
|
+
get minLength() {
|
|
314
|
+
return this.nativeElement ? this.nativeElement.minLength : undefined;
|
|
315
|
+
}
|
|
316
|
+
set minLength(value) {
|
|
317
|
+
this.nativeElement ? this.nativeElement.minLength = value : undefined;
|
|
318
|
+
}
|
|
319
|
+
/** @description Determines if the window is visible or not. */
|
|
320
|
+
get opened() {
|
|
321
|
+
return this.nativeElement ? this.nativeElement.opened : undefined;
|
|
322
|
+
}
|
|
323
|
+
set opened(value) {
|
|
324
|
+
this.nativeElement ? this.nativeElement.opened = value : undefined;
|
|
325
|
+
}
|
|
326
|
+
/** @description Determines if the window is pinned or not. Pinned window is a window that can't be dragged but can be resized. */
|
|
327
|
+
get pinned() {
|
|
328
|
+
return this.nativeElement ? this.nativeElement.pinned : undefined;
|
|
329
|
+
}
|
|
330
|
+
set pinned(value) {
|
|
331
|
+
this.nativeElement ? this.nativeElement.pinned = value : undefined;
|
|
332
|
+
}
|
|
333
|
+
/** @description Determines the input's placeholder. Applicable to Prompt Window. */
|
|
334
|
+
get placeholder() {
|
|
335
|
+
return this.nativeElement ? this.nativeElement.placeholder : undefined;
|
|
336
|
+
}
|
|
337
|
+
set placeholder(value) {
|
|
338
|
+
this.nativeElement ? this.nativeElement.placeholder = value : undefined;
|
|
339
|
+
}
|
|
340
|
+
/** @description Determines the label for the Input insinde the PromptWindow. */
|
|
341
|
+
get promptLabel() {
|
|
342
|
+
return this.nativeElement ? this.nativeElement.promptLabel : undefined;
|
|
343
|
+
}
|
|
344
|
+
set promptLabel(value) {
|
|
345
|
+
this.nativeElement ? this.nativeElement.promptLabel = value : undefined;
|
|
346
|
+
}
|
|
347
|
+
/** @description If the element is readonly, users cannot interact with it. */
|
|
348
|
+
get readonly() {
|
|
349
|
+
return this.nativeElement ? this.nativeElement.readonly : undefined;
|
|
350
|
+
}
|
|
351
|
+
set readonly(value) {
|
|
352
|
+
this.nativeElement ? this.nativeElement.readonly = value : undefined;
|
|
353
|
+
}
|
|
354
|
+
/** @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. */
|
|
355
|
+
get resizeIndicator() {
|
|
356
|
+
return this.nativeElement ? this.nativeElement.resizeIndicator : undefined;
|
|
357
|
+
}
|
|
358
|
+
set resizeIndicator(value) {
|
|
359
|
+
this.nativeElement ? this.nativeElement.resizeIndicator = value : undefined;
|
|
360
|
+
}
|
|
361
|
+
/** @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. */
|
|
362
|
+
get resizeMode() {
|
|
363
|
+
return this.nativeElement ? this.nativeElement.resizeMode : undefined;
|
|
364
|
+
}
|
|
365
|
+
set resizeMode(value) {
|
|
366
|
+
this.nativeElement ? this.nativeElement.resizeMode = value : undefined;
|
|
367
|
+
}
|
|
368
|
+
/** @description Sets or gets the value indicating whether the element is aligned to support locales using right-to-left fonts. */
|
|
369
|
+
get rightToLeft() {
|
|
370
|
+
return this.nativeElement ? this.nativeElement.rightToLeft : undefined;
|
|
371
|
+
}
|
|
372
|
+
set rightToLeft(value) {
|
|
373
|
+
this.nativeElement ? this.nativeElement.rightToLeft = value : undefined;
|
|
374
|
+
}
|
|
375
|
+
/** @description Specifies that the user must fill the input before submitting a form with the text box.Applicable to Prompt Window. */
|
|
376
|
+
get required() {
|
|
377
|
+
return this.nativeElement ? this.nativeElement.required : undefined;
|
|
378
|
+
}
|
|
379
|
+
set required(value) {
|
|
380
|
+
this.nativeElement ? this.nativeElement.required = value : undefined;
|
|
381
|
+
}
|
|
382
|
+
/** @description Specifies the message that will appear if required is set and no value is provided in the input. Applicable to Prompt Window. */
|
|
383
|
+
get requiredMessage() {
|
|
384
|
+
return this.nativeElement ? this.nativeElement.requiredMessage : undefined;
|
|
385
|
+
}
|
|
386
|
+
set requiredMessage(value) {
|
|
387
|
+
this.nativeElement ? this.nativeElement.requiredMessage = value : undefined;
|
|
388
|
+
}
|
|
389
|
+
/** @description Determines whether the content of the input will be selected on focus or not. Applicable to Prompt Window. */
|
|
390
|
+
get selectAllOnFocus() {
|
|
391
|
+
return this.nativeElement ? this.nativeElement.selectAllOnFocus : undefined;
|
|
392
|
+
}
|
|
393
|
+
set selectAllOnFocus(value) {
|
|
394
|
+
this.nativeElement ? this.nativeElement.selectAllOnFocus = value : undefined;
|
|
395
|
+
}
|
|
396
|
+
/** @description Sets or gets which tab is selected. Applicable only to TabsWindow. */
|
|
397
|
+
get selectedIndex() {
|
|
398
|
+
return this.nativeElement ? this.nativeElement.selectedIndex : undefined;
|
|
399
|
+
}
|
|
400
|
+
set selectedIndex(value) {
|
|
401
|
+
this.nativeElement ? this.nativeElement.selectedIndex = value : undefined;
|
|
402
|
+
}
|
|
403
|
+
/** @description Determines the way the user can switch between tabs. Applicable only to TabsWindow. */
|
|
404
|
+
get selectionMode() {
|
|
405
|
+
return this.nativeElement ? this.nativeElement.selectionMode : undefined;
|
|
406
|
+
}
|
|
407
|
+
set selectionMode(value) {
|
|
408
|
+
this.nativeElement ? this.nativeElement.selectionMode = value : undefined;
|
|
409
|
+
}
|
|
410
|
+
/** @description Indicates the index of the last character in the current selection. Applicable only to MultilinePromptWindow. */
|
|
411
|
+
get selectionEnd() {
|
|
412
|
+
return this.nativeElement ? this.nativeElement.selectionEnd : undefined;
|
|
413
|
+
}
|
|
414
|
+
set selectionEnd(value) {
|
|
415
|
+
this.nativeElement ? this.nativeElement.selectionEnd = value : undefined;
|
|
416
|
+
}
|
|
417
|
+
/** @description Indicates the index to the first character in the current selection. Applicable only to MultilinePromptWindow. */
|
|
418
|
+
get selectionStart() {
|
|
419
|
+
return this.nativeElement ? this.nativeElement.selectionStart : undefined;
|
|
420
|
+
}
|
|
421
|
+
set selectionStart(value) {
|
|
422
|
+
this.nativeElement ? this.nativeElement.selectionStart = value : undefined;
|
|
423
|
+
}
|
|
424
|
+
/** @description Enables/Disabled the label for the Progress Bar. Applicable only to Progress Window. */
|
|
425
|
+
get showProgressValue() {
|
|
426
|
+
return this.nativeElement ? this.nativeElement.showProgressValue : undefined;
|
|
427
|
+
}
|
|
428
|
+
set showProgressValue(value) {
|
|
429
|
+
this.nativeElement ? this.nativeElement.showProgressValue = value : undefined;
|
|
430
|
+
}
|
|
431
|
+
/** @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. */
|
|
432
|
+
get siblings() {
|
|
433
|
+
return this.nativeElement ? this.nativeElement.siblings : undefined;
|
|
434
|
+
}
|
|
435
|
+
set siblings(value) {
|
|
436
|
+
this.nativeElement ? this.nativeElement.siblings = value : undefined;
|
|
437
|
+
}
|
|
438
|
+
/** @description Applicable to TabsWindow when nested inside a DockingLayout Custom Element. Determines the size of the item. */
|
|
439
|
+
get size() {
|
|
440
|
+
return this.nativeElement ? this.nativeElement.size : undefined;
|
|
441
|
+
}
|
|
442
|
+
set size(value) {
|
|
443
|
+
this.nativeElement ? this.nativeElement.size = value : undefined;
|
|
444
|
+
}
|
|
445
|
+
/** @description Specifies whether the element is to have its spelling and grammar checked or not. Applicable only to MultilinePromptWindow. */
|
|
446
|
+
get spellCheck() {
|
|
447
|
+
return this.nativeElement ? this.nativeElement.spellCheck : undefined;
|
|
448
|
+
}
|
|
449
|
+
set spellCheck(value) {
|
|
450
|
+
this.nativeElement ? this.nativeElement.spellCheck = value : undefined;
|
|
451
|
+
}
|
|
452
|
+
/** @description Sets or gets whether close buttons are displayed inside the Tab Strip of the TabsWindow. Applicable only to TabsWindow. */
|
|
453
|
+
get tabCloseButtons() {
|
|
454
|
+
return this.nativeElement ? this.nativeElement.tabCloseButtons : undefined;
|
|
455
|
+
}
|
|
456
|
+
set tabCloseButtons(value) {
|
|
457
|
+
this.nativeElement ? this.nativeElement.tabCloseButtons = value : undefined;
|
|
458
|
+
}
|
|
459
|
+
/** @description Determines if the close button is visible on select or always. Applicable only to TabsWindow. */
|
|
460
|
+
get tabCloseButtonMode() {
|
|
461
|
+
return this.nativeElement ? this.nativeElement.tabCloseButtonMode : undefined;
|
|
462
|
+
}
|
|
463
|
+
set tabCloseButtonMode(value) {
|
|
464
|
+
this.nativeElement ? this.nativeElement.tabCloseButtonMode = value : undefined;
|
|
465
|
+
}
|
|
466
|
+
/** @description Sets or gets the Tabs scroll buttons behavior. Applicable only when tabLayout is 'scroll'. Applicable only to TabsWindow. */
|
|
467
|
+
get tabOverflow() {
|
|
468
|
+
return this.nativeElement ? this.nativeElement.tabOverflow : undefined;
|
|
469
|
+
}
|
|
470
|
+
set tabOverflow(value) {
|
|
471
|
+
this.nativeElement ? this.nativeElement.tabOverflow = value : undefined;
|
|
472
|
+
}
|
|
473
|
+
/** @description Detetmines Tab Strip is positioned of the TabsWindow. Applicable only to TabsWindow. */
|
|
474
|
+
get tabPosition() {
|
|
475
|
+
return this.nativeElement ? this.nativeElement.tabPosition : undefined;
|
|
476
|
+
}
|
|
477
|
+
set tabPosition(value) {
|
|
478
|
+
this.nativeElement ? this.nativeElement.tabPosition = value : undefined;
|
|
479
|
+
}
|
|
480
|
+
/** @description Sets or gets the position of the scroll buttons inside the Tab header of the TabsWindow. Applicable only to TabsWindow. */
|
|
481
|
+
get tabScrollButtonsPosition() {
|
|
482
|
+
return this.nativeElement ? this.nativeElement.tabScrollButtonsPosition : undefined;
|
|
483
|
+
}
|
|
484
|
+
set tabScrollButtonsPosition(value) {
|
|
485
|
+
this.nativeElement ? this.nativeElement.tabScrollButtonsPosition = value : undefined;
|
|
486
|
+
}
|
|
487
|
+
/** @description Sets or gets the orientation of the text in the tabs labels of the TabsWindow. Applicable only to TabsWindow. */
|
|
488
|
+
get tabTextOrientation() {
|
|
489
|
+
return this.nativeElement ? this.nativeElement.tabTextOrientation : undefined;
|
|
490
|
+
}
|
|
491
|
+
set tabTextOrientation(value) {
|
|
492
|
+
this.nativeElement ? this.nativeElement.tabTextOrientation = value : undefined;
|
|
493
|
+
}
|
|
494
|
+
/** @description Determines the theme. Theme defines the look of the element */
|
|
495
|
+
get theme() {
|
|
496
|
+
return this.nativeElement ? this.nativeElement.theme : undefined;
|
|
497
|
+
}
|
|
498
|
+
set theme(value) {
|
|
499
|
+
this.nativeElement ? this.nativeElement.theme = value : undefined;
|
|
500
|
+
}
|
|
501
|
+
/** @description If is set to true, the element cannot be focused. */
|
|
502
|
+
get unfocusable() {
|
|
503
|
+
return this.nativeElement ? this.nativeElement.unfocusable : undefined;
|
|
504
|
+
}
|
|
505
|
+
set unfocusable(value) {
|
|
506
|
+
this.nativeElement ? this.nativeElement.unfocusable = value : undefined;
|
|
507
|
+
}
|
|
508
|
+
/** @description Determines the value of the TextBox/ProgressBar inside the Dialog/Prompt/Progress Window */
|
|
509
|
+
get value() {
|
|
510
|
+
return this.nativeElement ? this.nativeElement.value : undefined;
|
|
511
|
+
}
|
|
512
|
+
set value(value) {
|
|
513
|
+
this.nativeElement ? this.nativeElement.value = value : undefined;
|
|
514
|
+
}
|
|
515
|
+
/** @description Determines the actual parent of the element. The window can size and move only in the area of that element. */
|
|
516
|
+
get windowParent() {
|
|
517
|
+
return this.nativeElement ? this.nativeElement.windowParent : undefined;
|
|
518
|
+
}
|
|
519
|
+
set windowParent(value) {
|
|
520
|
+
this.nativeElement ? this.nativeElement.windowParent = value : undefined;
|
|
521
|
+
}
|
|
522
|
+
/** @description Indicates how the input wraps text. Applicable only to MultilinePromptWindow. */
|
|
523
|
+
get wrap() {
|
|
524
|
+
return this.nativeElement ? this.nativeElement.wrap : undefined;
|
|
525
|
+
}
|
|
526
|
+
set wrap(value) {
|
|
527
|
+
this.nativeElement ? this.nativeElement.wrap = value : undefined;
|
|
528
|
+
}
|
|
529
|
+
/** @description Appends a tabitem to the end of the list of tab items inside element.
|
|
530
|
+
* @param {Node} node. A TabItem element that should be added to the rest of the items as the last item.
|
|
531
|
+
* @returns {Node}
|
|
532
|
+
*/
|
|
533
|
+
async appendChild(node) {
|
|
534
|
+
const getResultOnRender = () => {
|
|
535
|
+
return new Promise(resolve => {
|
|
536
|
+
this.nativeElement.whenRendered(() => {
|
|
537
|
+
const result = this.nativeElement.appendChild(node);
|
|
538
|
+
resolve(result);
|
|
539
|
+
});
|
|
540
|
+
});
|
|
541
|
+
};
|
|
542
|
+
const result = await getResultOnRender();
|
|
543
|
+
return result;
|
|
544
|
+
}
|
|
545
|
+
/** @description Sets the window to the top level so the user can interact with it.
|
|
546
|
+
*/
|
|
547
|
+
bringToFront() {
|
|
548
|
+
if (this.nativeElement.isRendered) {
|
|
549
|
+
this.nativeElement.bringToFront();
|
|
550
|
+
}
|
|
551
|
+
else {
|
|
552
|
+
this.nativeElement.whenRendered(() => {
|
|
553
|
+
this.nativeElement.bringToFront();
|
|
554
|
+
});
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
/** @description Clears the content of the Window.
|
|
558
|
+
*/
|
|
559
|
+
clear() {
|
|
560
|
+
if (this.nativeElement.isRendered) {
|
|
561
|
+
this.nativeElement.clear();
|
|
562
|
+
}
|
|
563
|
+
else {
|
|
564
|
+
this.nativeElement.whenRendered(() => {
|
|
565
|
+
this.nativeElement.clear();
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
/** @description Closes the window.
|
|
570
|
+
*/
|
|
571
|
+
close() {
|
|
572
|
+
if (this.nativeElement.isRendered) {
|
|
573
|
+
this.nativeElement.close();
|
|
574
|
+
}
|
|
575
|
+
else {
|
|
576
|
+
this.nativeElement.whenRendered(() => {
|
|
577
|
+
this.nativeElement.close();
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
/** @description Collapses the window.
|
|
582
|
+
* @returns {HTMLElement}
|
|
583
|
+
*/
|
|
584
|
+
async collapse() {
|
|
585
|
+
const getResultOnRender = () => {
|
|
586
|
+
return new Promise(resolve => {
|
|
587
|
+
this.nativeElement.whenRendered(() => {
|
|
588
|
+
const result = this.nativeElement.collapse();
|
|
589
|
+
resolve(result);
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
};
|
|
593
|
+
const result = await getResultOnRender();
|
|
594
|
+
return result;
|
|
595
|
+
}
|
|
596
|
+
/** @description Makes sure a tab item is visible by scrolling to it. Applicable only to TabsWindow.
|
|
597
|
+
* @param {number} index. The index of the tab to scroll to.
|
|
598
|
+
*/
|
|
599
|
+
ensureVisible(index) {
|
|
600
|
+
if (this.nativeElement.isRendered) {
|
|
601
|
+
this.nativeElement.ensureVisible(index);
|
|
602
|
+
}
|
|
603
|
+
else {
|
|
604
|
+
this.nativeElement.whenRendered(() => {
|
|
605
|
+
this.nativeElement.ensureVisible(index);
|
|
606
|
+
});
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
/** @description Expands the window after being collapsed.
|
|
610
|
+
* @returns {any[]}
|
|
611
|
+
*/
|
|
612
|
+
async expand() {
|
|
613
|
+
const getResultOnRender = () => {
|
|
614
|
+
return new Promise(resolve => {
|
|
615
|
+
this.nativeElement.whenRendered(() => {
|
|
616
|
+
const result = this.nativeElement.expand();
|
|
617
|
+
resolve(result);
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
};
|
|
621
|
+
const result = await getResultOnRender();
|
|
622
|
+
return result;
|
|
623
|
+
}
|
|
624
|
+
/** @description Inserts a new tab and an associated content section. Applicable only to TabsWindow.
|
|
625
|
+
* @param {number} index. The index to insert a new tab at.
|
|
626
|
+
* @param {any} details. An Object with the fields "label", "labelSize", "content" and "group".
|
|
627
|
+
*/
|
|
628
|
+
insert(index, details) {
|
|
629
|
+
if (this.nativeElement.isRendered) {
|
|
630
|
+
this.nativeElement.insert(index, details);
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
this.nativeElement.whenRendered(() => {
|
|
634
|
+
this.nativeElement.insert(index, details);
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
/** @description Inserts the specified "smart-tab-item" node before the reference "smart-tab-item" node. Applicable only to TabsWindow.
|
|
639
|
+
* @param {Node} newNode. The "smart-tab-item" node to insert.
|
|
640
|
+
* @param {Node | null} referenceNode?. The "smart-tab-item" node before which newNode is inserted.
|
|
641
|
+
* @returns {Node}
|
|
642
|
+
*/
|
|
643
|
+
async insertBefore(newNode, referenceNode) {
|
|
644
|
+
const getResultOnRender = () => {
|
|
645
|
+
return new Promise(resolve => {
|
|
646
|
+
this.nativeElement.whenRendered(() => {
|
|
647
|
+
const result = this.nativeElement.insertBefore(newNode, referenceNode);
|
|
648
|
+
resolve(result);
|
|
649
|
+
});
|
|
650
|
+
});
|
|
651
|
+
};
|
|
652
|
+
const result = await getResultOnRender();
|
|
653
|
+
return result;
|
|
654
|
+
}
|
|
655
|
+
/** @description Removes a tab and its associated content section. Applicable only to TabsWindow.
|
|
656
|
+
* @param {number} index. The index of the tab to remove.
|
|
657
|
+
*/
|
|
658
|
+
removeAt(index) {
|
|
659
|
+
if (this.nativeElement.isRendered) {
|
|
660
|
+
this.nativeElement.removeAt(index);
|
|
661
|
+
}
|
|
662
|
+
else {
|
|
663
|
+
this.nativeElement.whenRendered(() => {
|
|
664
|
+
this.nativeElement.removeAt(index);
|
|
665
|
+
});
|
|
666
|
+
}
|
|
667
|
+
}
|
|
668
|
+
/** @description Removes a child "smart-tab-item" node. Applicable only to TabsWindow.
|
|
669
|
+
* @param {Node} node. The "smart-tab-item" node to remove.
|
|
670
|
+
* @returns {Node}
|
|
671
|
+
*/
|
|
672
|
+
async removeChild(node) {
|
|
673
|
+
const getResultOnRender = () => {
|
|
674
|
+
return new Promise(resolve => {
|
|
675
|
+
this.nativeElement.whenRendered(() => {
|
|
676
|
+
const result = this.nativeElement.removeChild(node);
|
|
677
|
+
resolve(result);
|
|
678
|
+
});
|
|
679
|
+
});
|
|
680
|
+
};
|
|
681
|
+
const result = await getResultOnRender();
|
|
682
|
+
return result;
|
|
683
|
+
}
|
|
684
|
+
/** @description Maximizes the window to fill the area.
|
|
685
|
+
*/
|
|
686
|
+
maximize() {
|
|
687
|
+
if (this.nativeElement.isRendered) {
|
|
688
|
+
this.nativeElement.maximize();
|
|
689
|
+
}
|
|
690
|
+
else {
|
|
691
|
+
this.nativeElement.whenRendered(() => {
|
|
692
|
+
this.nativeElement.maximize();
|
|
693
|
+
});
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
/** @description Minimizes the window.
|
|
697
|
+
*/
|
|
698
|
+
minimize() {
|
|
699
|
+
if (this.nativeElement.isRendered) {
|
|
700
|
+
this.nativeElement.minimize();
|
|
701
|
+
}
|
|
702
|
+
else {
|
|
703
|
+
this.nativeElement.whenRendered(() => {
|
|
704
|
+
this.nativeElement.minimize();
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
/** @description Opens the window
|
|
709
|
+
*/
|
|
710
|
+
open() {
|
|
711
|
+
if (this.nativeElement.isRendered) {
|
|
712
|
+
this.nativeElement.open();
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
this.nativeElement.whenRendered(() => {
|
|
716
|
+
this.nativeElement.open();
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
/** @description Pins the window. Disables window dragging.
|
|
721
|
+
*/
|
|
722
|
+
pin() {
|
|
723
|
+
if (this.nativeElement.isRendered) {
|
|
724
|
+
this.nativeElement.pin();
|
|
725
|
+
}
|
|
726
|
+
else {
|
|
727
|
+
this.nativeElement.whenRendered(() => {
|
|
728
|
+
this.nativeElement.pin();
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
/** @description Restores the window to it's previous size before maximization/minimization.
|
|
733
|
+
*/
|
|
734
|
+
restore() {
|
|
735
|
+
if (this.nativeElement.isRendered) {
|
|
736
|
+
this.nativeElement.restore();
|
|
737
|
+
}
|
|
738
|
+
else {
|
|
739
|
+
this.nativeElement.whenRendered(() => {
|
|
740
|
+
this.nativeElement.restore();
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
/** @description Selects a tab. Applicalbe only to TabsWindow elements.
|
|
745
|
+
* @param {number} index. The index of the tab to select.
|
|
746
|
+
*/
|
|
747
|
+
select(index) {
|
|
748
|
+
if (this.nativeElement.isRendered) {
|
|
749
|
+
this.nativeElement.select(index);
|
|
750
|
+
}
|
|
751
|
+
else {
|
|
752
|
+
this.nativeElement.whenRendered(() => {
|
|
753
|
+
this.nativeElement.select(index);
|
|
754
|
+
});
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
/** @description Unpins the window. Enables window dragging.
|
|
758
|
+
*/
|
|
759
|
+
unpin() {
|
|
760
|
+
if (this.nativeElement.isRendered) {
|
|
761
|
+
this.nativeElement.unpin();
|
|
762
|
+
}
|
|
763
|
+
else {
|
|
764
|
+
this.nativeElement.whenRendered(() => {
|
|
765
|
+
this.nativeElement.unpin();
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
/** @description Updates a tab and its associated content section. Applicalbe only to TabsWindow elements.
|
|
770
|
+
* @param {number} index. The index of the tab to update.
|
|
771
|
+
* @param {string} label. The new label of the tab. The value can be the id of an HTMLTemplateElement
|
|
772
|
+
* @param {string | HTMLElement} content. The new content of the tab.
|
|
773
|
+
*/
|
|
774
|
+
update(index, label, content) {
|
|
775
|
+
if (this.nativeElement.isRendered) {
|
|
776
|
+
this.nativeElement.update(index, label, content);
|
|
777
|
+
}
|
|
778
|
+
else {
|
|
779
|
+
this.nativeElement.whenRendered(() => {
|
|
780
|
+
this.nativeElement.update(index, label, content);
|
|
781
|
+
});
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
get isRendered() {
|
|
785
|
+
return this.nativeElement ? this.nativeElement.isRendered : false;
|
|
786
|
+
}
|
|
787
|
+
ngOnInit() {
|
|
788
|
+
}
|
|
789
|
+
ngAfterViewInit() {
|
|
790
|
+
const that = this;
|
|
791
|
+
that.onCreate.emit(that.nativeElement);
|
|
792
|
+
Smart.Render();
|
|
793
|
+
this.nativeElement.classList.add('smart-angular');
|
|
794
|
+
this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });
|
|
795
|
+
this.listen();
|
|
796
|
+
}
|
|
797
|
+
ngOnDestroy() {
|
|
798
|
+
this.unlisten();
|
|
799
|
+
}
|
|
800
|
+
ngOnChanges(changes) {
|
|
801
|
+
if (this.nativeElement && this.nativeElement.isRendered) {
|
|
802
|
+
for (const propName in changes) {
|
|
803
|
+
if (changes.hasOwnProperty(propName)) {
|
|
804
|
+
this.nativeElement[propName] = changes[propName].currentValue;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
/** @description Add event listeners. */
|
|
810
|
+
listen() {
|
|
811
|
+
const that = this;
|
|
812
|
+
that.eventHandlers['openingHandler'] = (event) => { that.onOpening.emit(event); };
|
|
813
|
+
that.nativeElement.addEventListener('opening', that.eventHandlers['openingHandler']);
|
|
814
|
+
that.eventHandlers['openHandler'] = (event) => { that.onOpen.emit(event); };
|
|
815
|
+
that.nativeElement.addEventListener('open', that.eventHandlers['openHandler']);
|
|
816
|
+
that.eventHandlers['closingHandler'] = (event) => { that.onClosing.emit(event); };
|
|
817
|
+
that.nativeElement.addEventListener('closing', that.eventHandlers['closingHandler']);
|
|
818
|
+
that.eventHandlers['closeHandler'] = (event) => { that.onClose.emit(event); };
|
|
819
|
+
that.nativeElement.addEventListener('close', that.eventHandlers['closeHandler']);
|
|
820
|
+
that.eventHandlers['collapseHandler'] = (event) => { that.onCollapse.emit(event); };
|
|
821
|
+
that.nativeElement.addEventListener('collapse', that.eventHandlers['collapseHandler']);
|
|
822
|
+
that.eventHandlers['dragEndHandler'] = (event) => { that.onDragEnd.emit(event); };
|
|
823
|
+
that.nativeElement.addEventListener('dragEnd', that.eventHandlers['dragEndHandler']);
|
|
824
|
+
that.eventHandlers['dragStartHandler'] = (event) => { that.onDragStart.emit(event); };
|
|
825
|
+
that.nativeElement.addEventListener('dragStart', that.eventHandlers['dragStartHandler']);
|
|
826
|
+
that.eventHandlers['expandHandler'] = (event) => { that.onExpand.emit(event); };
|
|
827
|
+
that.nativeElement.addEventListener('expand', that.eventHandlers['expandHandler']);
|
|
828
|
+
that.eventHandlers['maximizeHandler'] = (event) => { that.onMaximize.emit(event); };
|
|
829
|
+
that.nativeElement.addEventListener('maximize', that.eventHandlers['maximizeHandler']);
|
|
830
|
+
that.eventHandlers['minimizeHandler'] = (event) => { that.onMinimize.emit(event); };
|
|
831
|
+
that.nativeElement.addEventListener('minimize', that.eventHandlers['minimizeHandler']);
|
|
832
|
+
that.eventHandlers['resizeEndHandler'] = (event) => { that.onResizeEnd.emit(event); };
|
|
833
|
+
that.nativeElement.addEventListener('resizeEnd', that.eventHandlers['resizeEndHandler']);
|
|
834
|
+
that.eventHandlers['resizeStartHandler'] = (event) => { that.onResizeStart.emit(event); };
|
|
835
|
+
that.nativeElement.addEventListener('resizeStart', that.eventHandlers['resizeStartHandler']);
|
|
836
|
+
that.eventHandlers['restoreHandler'] = (event) => { that.onRestore.emit(event); };
|
|
837
|
+
that.nativeElement.addEventListener('restore', that.eventHandlers['restoreHandler']);
|
|
838
|
+
}
|
|
839
|
+
/** @description Remove event listeners. */
|
|
840
|
+
unlisten() {
|
|
841
|
+
const that = this;
|
|
842
|
+
if (that.eventHandlers['openingHandler']) {
|
|
843
|
+
that.nativeElement.removeEventListener('opening', that.eventHandlers['openingHandler']);
|
|
844
|
+
}
|
|
845
|
+
if (that.eventHandlers['openHandler']) {
|
|
846
|
+
that.nativeElement.removeEventListener('open', that.eventHandlers['openHandler']);
|
|
847
|
+
}
|
|
848
|
+
if (that.eventHandlers['closingHandler']) {
|
|
849
|
+
that.nativeElement.removeEventListener('closing', that.eventHandlers['closingHandler']);
|
|
850
|
+
}
|
|
851
|
+
if (that.eventHandlers['closeHandler']) {
|
|
852
|
+
that.nativeElement.removeEventListener('close', that.eventHandlers['closeHandler']);
|
|
853
|
+
}
|
|
854
|
+
if (that.eventHandlers['collapseHandler']) {
|
|
855
|
+
that.nativeElement.removeEventListener('collapse', that.eventHandlers['collapseHandler']);
|
|
856
|
+
}
|
|
857
|
+
if (that.eventHandlers['dragEndHandler']) {
|
|
858
|
+
that.nativeElement.removeEventListener('dragEnd', that.eventHandlers['dragEndHandler']);
|
|
859
|
+
}
|
|
860
|
+
if (that.eventHandlers['dragStartHandler']) {
|
|
861
|
+
that.nativeElement.removeEventListener('dragStart', that.eventHandlers['dragStartHandler']);
|
|
862
|
+
}
|
|
863
|
+
if (that.eventHandlers['expandHandler']) {
|
|
864
|
+
that.nativeElement.removeEventListener('expand', that.eventHandlers['expandHandler']);
|
|
865
|
+
}
|
|
866
|
+
if (that.eventHandlers['maximizeHandler']) {
|
|
867
|
+
that.nativeElement.removeEventListener('maximize', that.eventHandlers['maximizeHandler']);
|
|
868
|
+
}
|
|
869
|
+
if (that.eventHandlers['minimizeHandler']) {
|
|
870
|
+
that.nativeElement.removeEventListener('minimize', that.eventHandlers['minimizeHandler']);
|
|
871
|
+
}
|
|
872
|
+
if (that.eventHandlers['resizeEndHandler']) {
|
|
873
|
+
that.nativeElement.removeEventListener('resizeEnd', that.eventHandlers['resizeEndHandler']);
|
|
874
|
+
}
|
|
875
|
+
if (that.eventHandlers['resizeStartHandler']) {
|
|
876
|
+
that.nativeElement.removeEventListener('resizeStart', that.eventHandlers['resizeStartHandler']);
|
|
877
|
+
}
|
|
878
|
+
if (that.eventHandlers['restoreHandler']) {
|
|
879
|
+
that.nativeElement.removeEventListener('restore', that.eventHandlers['restoreHandler']);
|
|
880
|
+
}
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
WindowComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: WindowComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
|
884
|
+
WindowComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.2.2", type: WindowComponent, selector: "smart-window, [smart-window], smart-tabs-window, smart-prompt-window, smart-multilineprompt-window, smart-dialog-window, smart-alert-window, smart-progress-window, smart-wait-window", inputs: { addNewTab: "addNewTab", animation: "animation", autoCapitalize: "autoCapitalize", autoExpand: "autoExpand", cancelLabel: "cancelLabel", completeLabel: "completeLabel", confirmLabel: "confirmLabel", collapsed: "collapsed", closeOnMaskClick: "closeOnMaskClick", dataSource: "dataSource", disabled: "disabled", disableSnap: "disableSnap", displayMode: "displayMode", dropPosition: "dropPosition", formatFunction: "formatFunction", footerPosition: "footerPosition", footerTemplate: "footerTemplate", headerButtons: "headerButtons", headerTemplate: "headerTemplate", headerPosition: "headerPosition", hint: "hint", indeterminate: "indeterminate", inverted: "inverted", label: "label", liveResize: "liveResize", layout: "layout", locale: "locale", locked: "locked", localizeFormatFunction: "localizeFormatFunction", maximized: "maximized", messages: "messages", modal: "modal", max: "max", min: "min", minimized: "minimized", maxLength: "maxLength", minLength: "minLength", opened: "opened", pinned: "pinned", placeholder: "placeholder", promptLabel: "promptLabel", readonly: "readonly", resizeIndicator: "resizeIndicator", resizeMode: "resizeMode", rightToLeft: "rightToLeft", required: "required", requiredMessage: "requiredMessage", selectAllOnFocus: "selectAllOnFocus", selectedIndex: "selectedIndex", selectionMode: "selectionMode", selectionEnd: "selectionEnd", selectionStart: "selectionStart", showProgressValue: "showProgressValue", siblings: "siblings", size: "size", spellCheck: "spellCheck", tabCloseButtons: "tabCloseButtons", tabCloseButtonMode: "tabCloseButtonMode", tabOverflow: "tabOverflow", tabPosition: "tabPosition", tabScrollButtonsPosition: "tabScrollButtonsPosition", tabTextOrientation: "tabTextOrientation", theme: "theme", unfocusable: "unfocusable", value: "value", windowParent: "windowParent", wrap: "wrap" }, outputs: { onOpening: "onOpening", onOpen: "onOpen", onClosing: "onClosing", onClose: "onClose", onCollapse: "onCollapse", onDragEnd: "onDragEnd", onDragStart: "onDragStart", onExpand: "onExpand", onMaximize: "onMaximize", onMinimize: "onMinimize", onResizeEnd: "onResizeEnd", onResizeStart: "onResizeStart", onRestore: "onRestore" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
885
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: WindowComponent, decorators: [{
|
|
886
|
+
type: Directive,
|
|
887
|
+
args: [{
|
|
888
|
+
selector: 'smart-window, [smart-window], smart-tabs-window, smart-prompt-window, smart-multilineprompt-window, smart-dialog-window, smart-alert-window, smart-progress-window, smart-wait-window'
|
|
889
|
+
}]
|
|
890
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { addNewTab: [{
|
|
891
|
+
type: Input
|
|
892
|
+
}], animation: [{
|
|
893
|
+
type: Input
|
|
894
|
+
}], autoCapitalize: [{
|
|
895
|
+
type: Input
|
|
896
|
+
}], autoExpand: [{
|
|
897
|
+
type: Input
|
|
898
|
+
}], cancelLabel: [{
|
|
899
|
+
type: Input
|
|
900
|
+
}], completeLabel: [{
|
|
901
|
+
type: Input
|
|
902
|
+
}], confirmLabel: [{
|
|
903
|
+
type: Input
|
|
904
|
+
}], collapsed: [{
|
|
905
|
+
type: Input
|
|
906
|
+
}], closeOnMaskClick: [{
|
|
907
|
+
type: Input
|
|
908
|
+
}], dataSource: [{
|
|
909
|
+
type: Input
|
|
910
|
+
}], disabled: [{
|
|
911
|
+
type: Input
|
|
912
|
+
}], disableSnap: [{
|
|
913
|
+
type: Input
|
|
914
|
+
}], displayMode: [{
|
|
915
|
+
type: Input
|
|
916
|
+
}], dropPosition: [{
|
|
917
|
+
type: Input
|
|
918
|
+
}], formatFunction: [{
|
|
919
|
+
type: Input
|
|
920
|
+
}], footerPosition: [{
|
|
921
|
+
type: Input
|
|
922
|
+
}], footerTemplate: [{
|
|
923
|
+
type: Input
|
|
924
|
+
}], headerButtons: [{
|
|
925
|
+
type: Input
|
|
926
|
+
}], headerTemplate: [{
|
|
927
|
+
type: Input
|
|
928
|
+
}], headerPosition: [{
|
|
929
|
+
type: Input
|
|
930
|
+
}], hint: [{
|
|
931
|
+
type: Input
|
|
932
|
+
}], indeterminate: [{
|
|
933
|
+
type: Input
|
|
934
|
+
}], inverted: [{
|
|
935
|
+
type: Input
|
|
936
|
+
}], label: [{
|
|
937
|
+
type: Input
|
|
938
|
+
}], liveResize: [{
|
|
939
|
+
type: Input
|
|
940
|
+
}], layout: [{
|
|
941
|
+
type: Input
|
|
942
|
+
}], locale: [{
|
|
943
|
+
type: Input
|
|
944
|
+
}], locked: [{
|
|
945
|
+
type: Input
|
|
946
|
+
}], localizeFormatFunction: [{
|
|
947
|
+
type: Input
|
|
948
|
+
}], maximized: [{
|
|
949
|
+
type: Input
|
|
950
|
+
}], messages: [{
|
|
951
|
+
type: Input
|
|
952
|
+
}], modal: [{
|
|
953
|
+
type: Input
|
|
954
|
+
}], max: [{
|
|
955
|
+
type: Input
|
|
956
|
+
}], min: [{
|
|
957
|
+
type: Input
|
|
958
|
+
}], minimized: [{
|
|
959
|
+
type: Input
|
|
960
|
+
}], maxLength: [{
|
|
961
|
+
type: Input
|
|
962
|
+
}], minLength: [{
|
|
963
|
+
type: Input
|
|
964
|
+
}], opened: [{
|
|
965
|
+
type: Input
|
|
966
|
+
}], pinned: [{
|
|
967
|
+
type: Input
|
|
968
|
+
}], placeholder: [{
|
|
969
|
+
type: Input
|
|
970
|
+
}], promptLabel: [{
|
|
971
|
+
type: Input
|
|
972
|
+
}], readonly: [{
|
|
973
|
+
type: Input
|
|
974
|
+
}], resizeIndicator: [{
|
|
975
|
+
type: Input
|
|
976
|
+
}], resizeMode: [{
|
|
977
|
+
type: Input
|
|
978
|
+
}], rightToLeft: [{
|
|
979
|
+
type: Input
|
|
980
|
+
}], required: [{
|
|
981
|
+
type: Input
|
|
982
|
+
}], requiredMessage: [{
|
|
983
|
+
type: Input
|
|
984
|
+
}], selectAllOnFocus: [{
|
|
985
|
+
type: Input
|
|
986
|
+
}], selectedIndex: [{
|
|
987
|
+
type: Input
|
|
988
|
+
}], selectionMode: [{
|
|
989
|
+
type: Input
|
|
990
|
+
}], selectionEnd: [{
|
|
991
|
+
type: Input
|
|
992
|
+
}], selectionStart: [{
|
|
993
|
+
type: Input
|
|
994
|
+
}], showProgressValue: [{
|
|
995
|
+
type: Input
|
|
996
|
+
}], siblings: [{
|
|
997
|
+
type: Input
|
|
998
|
+
}], size: [{
|
|
999
|
+
type: Input
|
|
1000
|
+
}], spellCheck: [{
|
|
1001
|
+
type: Input
|
|
1002
|
+
}], tabCloseButtons: [{
|
|
1003
|
+
type: Input
|
|
1004
|
+
}], tabCloseButtonMode: [{
|
|
1005
|
+
type: Input
|
|
1006
|
+
}], tabOverflow: [{
|
|
1007
|
+
type: Input
|
|
1008
|
+
}], tabPosition: [{
|
|
1009
|
+
type: Input
|
|
1010
|
+
}], tabScrollButtonsPosition: [{
|
|
1011
|
+
type: Input
|
|
1012
|
+
}], tabTextOrientation: [{
|
|
1013
|
+
type: Input
|
|
1014
|
+
}], theme: [{
|
|
1015
|
+
type: Input
|
|
1016
|
+
}], unfocusable: [{
|
|
1017
|
+
type: Input
|
|
1018
|
+
}], value: [{
|
|
1019
|
+
type: Input
|
|
1020
|
+
}], windowParent: [{
|
|
1021
|
+
type: Input
|
|
1022
|
+
}], wrap: [{
|
|
1023
|
+
type: Input
|
|
1024
|
+
}], onOpening: [{
|
|
1025
|
+
type: Output
|
|
1026
|
+
}], onOpen: [{
|
|
1027
|
+
type: Output
|
|
1028
|
+
}], onClosing: [{
|
|
1029
|
+
type: Output
|
|
1030
|
+
}], onClose: [{
|
|
1031
|
+
type: Output
|
|
1032
|
+
}], onCollapse: [{
|
|
1033
|
+
type: Output
|
|
1034
|
+
}], onDragEnd: [{
|
|
1035
|
+
type: Output
|
|
1036
|
+
}], onDragStart: [{
|
|
1037
|
+
type: Output
|
|
1038
|
+
}], onExpand: [{
|
|
1039
|
+
type: Output
|
|
1040
|
+
}], onMaximize: [{
|
|
1041
|
+
type: Output
|
|
1042
|
+
}], onMinimize: [{
|
|
1043
|
+
type: Output
|
|
1044
|
+
}], onResizeEnd: [{
|
|
1045
|
+
type: Output
|
|
1046
|
+
}], onResizeStart: [{
|
|
1047
|
+
type: Output
|
|
1048
|
+
}], onRestore: [{
|
|
1049
|
+
type: Output
|
|
1050
|
+
}] } });
|
|
1051
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQud2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vd2luZG93L3NyYy9zbWFydC53aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFhLFNBQVMsRUFBNkIsS0FBSyxFQUErQyxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFKLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXJELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVF4QyxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxXQUFXO0lBQy9DLFlBQVksR0FBdUI7UUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSUosa0JBQWEsR0FBVSxFQUFFLENBQUM7UUF3bUJsQzs4Q0FDc0M7UUFDNUIsY0FBUyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXBFOzhDQUNzQztRQUM1QixXQUFNLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFakU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsWUFBTyxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWxFOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsZ0JBQVcsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV0RTs4Q0FDc0M7UUFDNUIsYUFBUSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRW5FOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFckU7OENBQ3NDO1FBQzVCLGVBQVUsR0FBOEIsSUFBSSxZQUFZLEVBQUUs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LFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEs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QUs7Z0JBVUYsd0JBQXdCO3NCQUQzQixLQUFLO2dCQVVGLGtCQUFrQjtzQkFEckIsS0FBSztnQkFVRixLQUFLO3NCQURSLEtBQUs7Z0JBVUYsV0FBVztzQkFEZCxLQUFLO2dCQVVGLEtBQUs7c0JBRFIsS0FBSztnQkFVRixZQUFZO3NCQURmLEtBQUs7Z0JBVUYsSUFBSTtzQkFEUCxLQUFLO2dCQVVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBSUcsTUFBTTtzQkFBZixNQUFNO2dCQUlHLFNBQVM7c0JBQWxCLE1BQU07Z0JBSUcsT0FBTztzQkFBaEIsTUFBTTtnQkFJRyxVQUFVO3NCQUFuQixNQUFNO2dCQUlHLFNBQVM7c0JBQWxCLE1BQU07Z0JBSUcsV0FBVztzQkFBcEIsTUFBTTtnQkFJRyxRQUFRO3NCQUFqQixNQUFNO2dCQUlHLFVBQVU7c0JBQW5CLE1BQU07Z0JBSUcsVUFBVTtzQkFBbkIsTUFBTTtnQkFJRyxXQUFXO3NCQUFwQixNQUFNO2dCQUlHLGFBQWE7c0JBQXRCLE1BQU07Z0JBSUcsU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdpbmRvdyB9IGZyb20gJy4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQW5pbWF0aW9uLCBXaW5kb3dBdXRvQ2FwaXRhbGl6ZSwgV2luZG93RGlzcGxheU1vZGUsIFdpbmRvd0Ryb3BQb3NpdGlvbiwgV2luZG93Rm9vdGVyUG9zaXRpb24sIFRhYlBvc2l0aW9uLCBXaW5kb3dSZXNpemVNb2RlLCBUYWJTZWxlY3Rpb25Nb2RlLCBXaW5kb3dUYWJDbG9zZUJ1dHRvbk1vZGUsIE92ZXJmbG93LCBMYXlvdXRQb3NpdGlvbiwgT3JpZW50YXRpb24sIFdpbmRvd1dyYXAsIEVsZW1lbnRSZW5kZXJNb2RlfSBmcm9tICcuLy4uL2luZGV4JztcbmltcG9ydCB7IENvbXBvbmVudCwgRGlyZWN0aXZlLCBBZnRlclZpZXdJbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcywgT3V0cHV0LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJhc2VFbGVtZW50LCBTbWFydCB9IGZyb20gJy4vc21hcnQuZWxlbWVudCc7XG5leHBvcnQgeyBBbmltYXRpb24sIFdpbmRvd0F1dG9DYXBpdGFsaXplLCBXaW5kb3dEaXNwbGF5TW9kZSwgV2luZG93RHJvcFBvc2l0aW9uLCBXaW5kb3dGb290ZXJQb3NpdGlvbiwgVGFiUG9zaXRpb24sIFdpbmRvd1Jlc2l6ZU1vZGUsIFRhYlNlbGVjdGlvbk1vZGUsIFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSwgT3ZlcmZsb3csIExheW91dFBvc2l0aW9uLCBPcmllbnRhdGlvbiwgV2luZG93V3JhcCwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xuZXhwb3J0IHsgU21hcnQgfSBmcm9tICcuL3NtYXJ0LmVsZW1lbnQnO1xuZXhwb3J0IHsgV2luZG93IH0gZnJvbSAnLi8uLi9pbmRleCc7XG5cblxuQERpcmVjdGl2ZSh7XG5cdHNlbGVjdG9yOiAnc21hcnQtd2luZG93LCBbc21hcnQtd2luZG93XSwgc21hcnQtdGFicy13aW5kb3csIHNtYXJ0LXByb21wdC13aW5kb3csIHNtYXJ0LW11bHRpbGluZXByb21wdC13aW5kb3csIHNtYXJ0LWRpYWxvZy13aW5kb3csICBzbWFydC1hbGVydC13aW5kb3csIHNtYXJ0LXByb2dyZXNzLXdpbmRvdywgc21hcnQtd2FpdC13aW5kb3cnXG59KVxuXG5leHBvcnQgY2xhc3MgV2luZG93Q29tcG9uZW50IGV4dGVuZHMgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblx0Y29uc3RydWN0b3IocmVmOiBFbGVtZW50UmVmPFdpbmRvdz4pIHtcblx0XHRzdXBlcihyZWYpO1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA9IHJlZi5uYXRpdmVFbGVtZW50IGFzIFdpbmRvdztcblx0fVxuXG5cdHByaXZhdGUgZXZlbnRIYW5kbGVyczogYW55W10gPSBbXTtcblxuXHRwdWJsaWMgbmF0aXZlRWxlbWVudDogV2luZG93O1xuXHQvKiogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGNvbXBvbmVudCBvbiBkZW1hbmQuXG5cdCAqIEBwYXJhbSBwcm9wZXJ0aWVzIEFuIG9wdGlvbmFsIG9iamVjdCBvZiBwcm9wZXJ0aWVzLCB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0ZW1wbGF0ZSBiaW5kZWQgb25lcy5cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVDb21wb25lbnQocHJvcGVydGllcyA9IHt9KTogYW55IHtcbiAgICBcdHRoaXMubmF0aXZlRWxlbWVudCA9IDxXaW5kb3c+ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc21hcnQtd2luZG93Jyk7XG5cdFx0Zm9yIChsZXQgcHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHsgXG4gXHRcdFx0dGhpcy5uYXRpdmVFbGVtZW50W3Byb3BlcnR5TmFtZV0gPSBwcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQ7XG5cdH1cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmICdBZGQgTmV3JyBUYWIgaW5zaWRlIHRoZSBUYWJzIGVsZW1lbnQgaXMgdmlzaWJsZS4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cgKi9cblx0QElucHV0KClcblx0Z2V0IGFkZE5ld1RhYigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmFkZE5ld1RhYiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYWRkTmV3VGFiKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmFkZE5ld1RhYiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIGFuaW1hdGlvbiBtb2RlLiBBbmltYXRpb24gaXMgZGlzYWJsZWQgd2hlbiB0aGUgcHJvcGVydHkgaXMgc2V0IHRvICdub25lJyAqL1xuXHRASW5wdXQoKVxuXHRnZXQgYW5pbWF0aW9uKCk6IEFuaW1hdGlvbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hbmltYXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGFuaW1hdGlvbih2YWx1ZTogQW5pbWF0aW9uKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmFuaW1hdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHdoZXRoZXIgYW5kIGhvdyB0aGUgdmFsdWUgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY2FwaXRhbGl6ZWQgYXMgaXQgaXMgZW50ZXJlZC9lZGl0ZWQgYnkgdGhlIHVzZXIuIEFwcGxpY2FibGUgb25seSB0byBNdWx0aWxpbmVQcm9tcHRXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvQ2FwaXRhbGl6ZSgpOiBXaW5kb3dBdXRvQ2FwaXRhbGl6ZSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ2FwaXRhbGl6ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0NhcGl0YWxpemUodmFsdWU6IFdpbmRvd0F1dG9DYXBpdGFsaXplKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9DYXBpdGFsaXplID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciBlbGVtZW50IHdpbGwgYXV0byBleHBhbmQgd2hlbiB0aGUgaW5wdXQgb3ZlcmZsb3dzIHZlcnRpY2FsbHkuIEFwcGxpY2FibGUgb25seSB0byBNdWx0aWxpbmVQcm9tcHRXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBhdXRvRXhwYW5kKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0V4cGFuZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgYXV0b0V4cGFuZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvRXhwYW5kID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGxhYmVsIGZvciB0aGUgJ2NhbmNlbCcgYnV0dG9uIGluc2lkZSB0aGUgUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGNhbmNlbExhYmVsKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jYW5jZWxMYWJlbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgY2FuY2VsTGFiZWwodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jYW5jZWxMYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBsYWJlbCBmb3IgdGhlICdDb21wbGV0ZScgYnV0dG9uIGluc2luZGUgdGhlIFByb2dyZXNzIFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IGNvbXBsZXRlTGFiZWwoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbXBsZXRlTGFiZWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGNvbXBsZXRlTGFiZWwodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb21wbGV0ZUxhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGxhYmVsIGZvciB0aGUgJ0NvbmZpcm0nIGJ1dHRvbiBpbnNpbmRlIHRoZSBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgY29uZmlybUxhYmVsKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb25maXJtTGFiZWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGNvbmZpcm1MYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNvbmZpcm1MYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkIG9yIG5vdC4gV2hlbiBjb2xsYXBzZWQgdGhlIG9ubHkgdGhlIGhlYWRlciBvZiB0aGUgd2luZG93IGlzIHZpc2libGUuICovXG5cdEBJbnB1dCgpXG5cdGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb2xsYXBzZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGNvbGxhcHNlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb2xsYXBzZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gV2hlbiBhIG1vZGFsIHdpbmRvdyBpcyBvcGVuZWQsIHRoaWQgcHJvcGVydHkgZGV0ZXJtaW5lcyBpZiBjbGlja2luZyBvbiB0aGUgbWFzayBjbG9zZXMgdGhlIHdpbmRvdyBvciBub3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCBjbG9zZU9uTWFza0NsaWNrKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2VPbk1hc2tDbGljayA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgY2xvc2VPbk1hc2tDbGljayh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZU9uTWFza0NsaWNrID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGRhdGEgc291cmNlIHRoYXQgd2lsbCBiZSBsb2FkZWQgdG8gdGhlIFRhYnNXaW5kb3cuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGF0YVNvdXJjZSgpOiB7bGFiZWw6IHN0cmluZywgY29udGVudDogc3RyaW5nfVtdIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRhdGFTb3VyY2UgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRhdGFTb3VyY2UodmFsdWU6IHtsYWJlbDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmd9W10pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGF0YVNvdXJjZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB3aW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB3aW5kb3cgc25hcHBpbmcgZmVhdHVyZS4gKi9cblx0QElucHV0KClcblx0Z2V0IGRpc2FibGVTbmFwKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZVNuYXAgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRpc2FibGVTbmFwKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVTbmFwID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaG93IHRoZSBjaGFyYWN0ZXJzIGFyZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBpbnB1dC4gQXBwbGljYWJsZSB0byBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZGlzcGxheU1vZGUoKTogV2luZG93RGlzcGxheU1vZGUge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzcGxheU1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGRpc3BsYXlNb2RlKHZhbHVlOiBXaW5kb3dEaXNwbGF5TW9kZSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNwbGF5TW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBsaWNhYmxlIHRvIFRhYnNXaW5kb3cgd2hlbiBkb2NrZWQgaW5zaWRlIGEgRG9ja2luZ0xheW91dCBDdXN0b20gRWxlbWVudC4gIERldGVybWluZXMgd2hlcmUgdGhlIHdpbmRvdyhpdCdzIHRhYiBpdGVtcyBhcyB3ZWxsKSBjYW4gYmUgZHJvcHBlZCBpbnNpZGUgdGhlIERvY2tpbmdMYXlvdXQuICBUaGUgcHJvcGVydHkgaXMgYW4gYXJyYXkgdGhhdCBhY2NlcHRzIG11bHRpcGxlIHBvc2l0aW9ucy4gTm90ZTogUG9zaXRpb25zIHdpdGggcHJlZml4ICdsYXlvdXQtJyBhcmUgYXBwbGllZCB0byB0aGUgVGFiIGl0ZW0gY2hpbGRyZW4gb2YgdGhlIFRhYnNXaWRub3cgb3duZXIgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLiBUaGUgcmVzdCBvZiB0aGUgcG9zaXRpb25zIGluZGljYXRlIHRoZSBhbGxvd2VkIGRyb3AgcG9zaXRpb24gaW5zaWRlIHRoZSBob3ZlcmVkIHRhcmdldChUYWJzV2luZG93KS4gVXNlZCBvbmx5IGJ5IGpxeERvY2tpbmdMYXlvdXQgY3VzdG9tIGVsZW1lbnRzLiBEZXRlcm1pbmVzIHRoZSBwb3NzaWJsZSBkcm9wIHBvc2l0aW9uIGluc2lkZSB0aGUgRG9ja2luZ0xheW91dC4gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGFsbG93ZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBkcm9wUG9zaXRpb24oKTogV2luZG93RHJvcFBvc2l0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZHJvcFBvc2l0aW9uKHZhbHVlOiBXaW5kb3dEcm9wUG9zaXRpb24pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZHJvcFBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEEgY2FsbGJhY2sgZnVuY3Rpb24gZGVmaW5pbmcgdGhlIG5ldyBmb3JtYXQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgUHJvZ3Jlc3MgQmFyLiBBcHBsaWNhYmxlIG9ubHkgdG8gUHJvZ3Jlc3NXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBmb3JtYXRGdW5jdGlvbigpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9ybWF0RnVuY3Rpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGZvcm1hdEZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9ybWF0RnVuY3Rpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIGZvb3RlciBvZiB0aGUgd2luZG93IGVsZW1lbnQuICovXG5cdEBJbnB1dCgpXG5cdGdldCBmb290ZXJQb3NpdGlvbigpOiBXaW5kb3dGb290ZXJQb3NpdGlvbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgZm9vdGVyUG9zaXRpb24odmFsdWU6IFdpbmRvd0Zvb3RlclBvc2l0aW9uKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvb3RlclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHRlbXBsYXRlIGZvciB0aGUgRGlhbG9nIHNlY3Rpb24gb2YgdGhlIHdpbmRvdy4gQnkgZGVmYXVsdCBmb290ZXJUZW1wbGF0ZSBpcyBudWxsLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgZm9vdGVyVGVtcGxhdGUoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvb3RlclRlbXBsYXRlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBmb290ZXJUZW1wbGF0ZSh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvb3RlclRlbXBsYXRlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldCdzIHRoZSBidXR0b25zIHRoYXQgd2lsbCBiZSB2aXNpYmxlIGluIHRoZSBoZWFkZXIgc2VjdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IGhlYWRlckJ1dHRvbnMoKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyQnV0dG9ucyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaGVhZGVyQnV0dG9ucyh2YWx1ZTogc3RyaW5nW10pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyQnV0dG9ucyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIERpYWxvZyBzZWN0aW9uIG9mIHRoZSB3aW5kb3cuIEJ5IGRlZmF1bHQgaGVhZGVyVGVtcGxhdGUgaXMgbnVsbC4gKi9cblx0QElucHV0KClcblx0Z2V0IGhlYWRlclRlbXBsYXRlKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oZWFkZXJUZW1wbGF0ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaGVhZGVyVGVtcGxhdGUodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oZWFkZXJUZW1wbGF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaGVhZGVyIG9mIHRoZSB3aW5kb3cgZWxlbWVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IGhlYWRlclBvc2l0aW9uKCk6IFRhYlBvc2l0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlclBvc2l0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBoZWFkZXJQb3NpdGlvbih2YWx1ZTogVGFiUG9zaXRpb24pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyUG9zaXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBhZGRpdGlvbmFsIGhlbHBlciB0ZXh0IGJlbG93IHRoZSB0ZXh0IGJveC4gVGhlIGhpbnQgaXMgdmlzaWJsZSBvbmx5IHdoZW4gdGhlIHRleHQgYm94IGlzIGZvY3VlZC4gQXBwbGljYWJsZSB0byBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaGludCgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGludCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgaGludCh2YWx1ZTogYW55KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhpbnQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdmFsdWUgb2YgdGhlIFByb2dyZXNzIGJhciB0byBpbmRldGVybWluYXRlIHN0YXRlKG51bGwpIGFuZCBzdGFydHMgdGhlIGFuaW1hdGlvbi4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgaW5kZXRlcm1pbmF0ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGluZGV0ZXJtaW5hdGUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBmaWxsaW5nIGRpcmVjdGlvbiBvZiB0aGUgUHJvZ3Jlc3MgQmFyLiBBcHBsaWNhYmxlIG9ubHkgdG8gUHJvZ3Jlc3NXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBpbnZlcnRlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmludmVydGVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBpbnZlcnRlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbnZlcnRlZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGUgbGFiZWwgb2YgdGhlIHdpbmRvdyB0aGF0IGFwcGVhcnMgaW4gdGhlIGhlYWRlciBhcmVhLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbGFiZWwoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxhYmVsIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsYWJlbCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFdoZW4gZW5hYmxlZCB0aGUgcmVzaXppbmcgb3BlcmF0aW9uIGhhcHBlbnMgbGl2ZS4gQnkgZGVmYXVsdCBpdCdzIG5vdCBlbmFibGVkIGFuZCBkdXJpbmcgcmVzaXppbmcgYSBoaWdobGlnaHRlciBhcm91bmQgdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cgYXBwZWFycyB0byBvdXRsaW5lICB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBlbGVtZW50LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbGl2ZVJlc2l6ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxpdmVSZXNpemUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxpdmVSZXNpemUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGl2ZVJlc2l6ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdyB3aGVuIHVzZWQgd2l0aCBhIERvY2tpbmdMYXlvdXQgY3VzdG9tIGVsZW1lbnQuVXNlZCBvbmx5IGJ5IGpxeERvY2tpbmdMYXlvdXQuIERldGVybWluZXMgdGhlIG93bmVyIGpxeERvY2tpbmdMYXlvdXQgIHRoYXQgdGhlIHdpbmRvdyBiZWxvbmdzIHRvLiBXaGVuIHRoZSB0YWJzV2luZG93IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhIERvY2tpbmdMYXlvdXQgZWxlbWVudCwgdGhlIHByb3BlcnR5IGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBpdCBiZWxvbmdzIHRvIHRoYXQgcGFydGljdWxhciBEb2NraW5nbGF5b3V0LiBBY2NlcHRzIGEgc3RyaW5nLCByZXByZXNlbnRpbmcgdGhlIElEIG9mIGEganF4RG9ja2luZ0xheW91dCBvbiB0aGUgcGFnZSwgb3IgYW4gaW5zdGFuY2Ugb2YganF4RG9rY2luZ0xheW91dC4gKi9cblx0QElucHV0KClcblx0Z2V0IGxheW91dCgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGF5b3V0IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsYXlvdXQodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYXlvdXQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBsYW5ndWFnZS4gVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcm9wZXJ0eSBtZXNzYWdlcy4gICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2NhbGUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbG9jYWxlKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxlID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuRGV0ZXJtaW5lcyBvZiB0aGUgaXRlbSBjYW4gYmUgcmVzaXplZCBvciBub3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2NrZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NrZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IGxvY2tlZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NrZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2FsbGJhY2ssIHJlbGF0ZWQgdG8gbG9jYWxpemF0aW9uIG1vZHVsZS4gICovXG5cdEBJbnB1dCgpXG5cdGdldCBsb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBsb2NhbGl6ZUZvcm1hdEZ1bmN0aW9uKHZhbHVlOiBhbnkpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxpemVGb3JtYXRGdW5jdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSB3aW5kb3cgaXMgbWF4aW1pemVkIG9yIG5vdC4gV2hlbiBtYXhpbWl6ZWQgdGhlIHdpbmRvdyBjb3ZlcnMgdGhlIHdob2xlIHZpZXdwb3J0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWF4aW1pemVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4aW1pemVkIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtYXhpbWl6ZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4aW1pemVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyBhbiBvYmplY3Qgc3BlY2lmeWluZyBzdHJpbmdzIHVzZWQgaW4gdGhlIHdpZGdldCB0aGF0IGNhbiBiZSBsb2NhbGl6ZWQuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJvcGVydHkgbG9jYWxlLiAgKi9cblx0QElucHV0KClcblx0Z2V0IG1lc3NhZ2VzKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tZXNzYWdlcyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWVzc2FnZXModmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tZXNzYWdlcyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSB3aW5kb3cgaXMgbW9kYWwgb3Igbm90LiBJZiB0cnVlIHRoZSB1c2VyIGNhbiBvbmx5IGludGVyYWN0IHdpdGggdGhlIHdpbmRvdyBhbmQgbm90aGluZyBlbHNlIG9uIHRoZSBwYWdlLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbW9kYWwoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tb2RhbCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbW9kYWwodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubW9kYWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuIERldGVybWluZXMgdGhlIG1heCBzaXplIG9mIHRoZSBpdGVtLiBBcHBsaWNhYmxlIHRvIFByb2dyZXNzIFdpbmRvdyBieSBhbGxvd2luZyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBtYXhpbXVtIG9mIHRoZSBQcm9ncmVzc0Jhci4gKi9cblx0QElucHV0KClcblx0Z2V0IG1heCgpOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWF4KHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBsaWNhYmxlIHRvIFRhYnNXaW5kb3cgd2hlbiBkb2NrZWQgaW5zaWRlIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuIERldGVybWluZXMgdGhlIG1pbiBzaXplIG9mIHRoZSBpdGVtLiBBcHBsaWNhYmxlIHRvIFByb2dyZXNzIFdpbmRvdyBieSBhbGxvd2luZyB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBtaW5pbXUgb2YgdGhlIFByb2dyZXNzQmFyLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWluKCk6IHN0cmluZyB8IG51bWJlciB8IG51bGwge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBtaW4odmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIHdpbmRvdyBpcyBtaW5pbWl6ZWQgb3Igbm90LiBXaGVuIG1pbmltaXplZCB0aGUgd2luZG93IGlzIGRvY2tlZCBhdCB0aGUgYm90dG9tIGxlZnQgY29ybmVyIG9mIHRoZSB2aWV3cG9ydC4gKi9cblx0QElucHV0KClcblx0Z2V0IG1pbmltaXplZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbmltaXplZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWluaW1pemVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbmltaXplZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgdXNlciBjYW4gZW50ZXIuIEFwcGxpY2FibGUgdG8gUHJvbXB0L011bHRpbGluZVByb21wdCBXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBtYXhMZW5ndGgoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heExlbmd0aCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgbWF4TGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4TGVuZ3RoID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHRoZSB1c2VyIGhhdmUgdG8gZW50ZXIgdG8gdHJpZ2dlciB0aGUgYXV0byBjb21wbGV0ZSBmdW5jdGlvbmFsaXR5LiBBcHBsaWNhYmxlIHRvIFByb21wdC9NdWx0aWxpbmVQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgbWluTGVuZ3RoKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5MZW5ndGggOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG1pbkxlbmd0aCh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbkxlbmd0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSB3aW5kb3cgaXMgdmlzaWJsZSBvciBub3QuICovXG5cdEBJbnB1dCgpXG5cdGdldCBvcGVuZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5vcGVuZWQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IG9wZW5lZCh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5vcGVuZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIHBpbm5lZCBvciBub3QuIFBpbm5lZCB3aW5kb3cgaXMgYSB3aW5kb3cgdGhhdCBjYW4ndCBiZSBkcmFnZ2VkIGJ1dCBjYW4gYmUgcmVzaXplZC4gKi9cblx0QElucHV0KClcblx0Z2V0IHBpbm5lZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBpbm5lZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcGlubmVkKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBpbm5lZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBpbnB1dCdzIHBsYWNlaG9sZGVyLiBBcHBsaWNhYmxlIHRvIFByb21wdCBXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucGxhY2Vob2xkZXIgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHBsYWNlaG9sZGVyKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucGxhY2Vob2xkZXIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgbGFiZWwgZm9yIHRoZSBJbnB1dCBpbnNpbmRlIHRoZSBQcm9tcHRXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCBwcm9tcHRMYWJlbCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucHJvbXB0TGFiZWwgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHByb21wdExhYmVsKHZhbHVlOiBzdHJpbmcpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucHJvbXB0TGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSWYgdGhlIGVsZW1lbnQgaXMgcmVhZG9ubHksIHVzZXJzIGNhbm5vdCBpbnRlcmFjdCB3aXRoIGl0LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZWFkb25seSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVhZG9ubHkodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVhZG9ubHkgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gV2hlbiBhcHBsaWVkIGEgcmVzaXplIGluZGljYXRvciBpcyBkaXNwbGF5ZWQgaW4gdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YgdGhlIHdpbmRvdyBhbmQgcmVzaXppbmcgb3BlcmF0aW9uIGNhbiBiZSBpbml0aWF0ZWQgb25seSBmcm9tIGl0cyBwb3NpdGlvbi4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlc2l6ZUluZGljYXRvcigpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZUluZGljYXRvciA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVzaXplSW5kaWNhdG9yKHZhbHVlOiBib29sZWFuKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZUluZGljYXRvciA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSByZXNpemluZyBtb2RlIG9mIHRoZSB3aW5kb3cuICBTZXZlcmFsIG1vZGVzIGFyZSBhdmFpbGFibGU6ICAgbm9uZSAtIHJlc2l6aW5nIGlzIGRpc2FibGVkLiAgdmVydGljYWwgLSB2ZXJ0aWNhbCByZXNpemluZyBpcyBhbGxvd2VkLiAgaG9yaXpvbnRhbCAtIGhvcml6b250YWwgcmVzaXppbmcgaXMgYWxsb3dlZC4gYm90aCAtIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHJlc2l6aW5nIGlzIGFsbG93ZWQuIHRvcCAtIHRoZSB3aW5kb3cgY2FuIG9ubHkgYmUgcmVzaXplZCBmcm9tIHRoZSB0b3Agc2lkZS4gYm90dG9tIC0gdGhlIHdpbmRvdyBpcyByZXNpemFibGUgb25seSBmcm9tIHRoZSBib3R0b20gc2lkZS4gbGVmdCAtIHRoZSB3aW5kb3cgY2FuIGJlIHJlc2l6ZWQgb25seSBmcm9tIHRoZSBsZWZ0IHNpZGUuIHJpZ2h0IC0gdGhlIHdpbmRvdyBjYW4gYmUgcmVzaXplZCBvbmx5IGZyb20gdGhlIHJpZ2h0IHNpZGUuICAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcmVzaXplTW9kZSgpOiBXaW5kb3dSZXNpemVNb2RlIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZU1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHJlc2l6ZU1vZGUodmFsdWU6IFdpbmRvd1Jlc2l6ZU1vZGUpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzaXplTW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBpcyBhbGlnbmVkIHRvIHN1cHBvcnQgbG9jYWxlcyB1c2luZyByaWdodC10by1sZWZ0IGZvbnRzLiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcmlnaHRUb0xlZnQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yaWdodFRvTGVmdCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmlnaHRUb0xlZnQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmlnaHRUb0xlZnQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoYXQgdGhlIHVzZXIgbXVzdCBmaWxsIHRoZSBpbnB1dCBiZWZvcmUgc3VibWl0dGluZyBhIGZvcm0gd2l0aCB0aGUgdGV4dCBib3guQXBwbGljYWJsZSB0byBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXF1aXJlZCA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgcmVxdWlyZWQodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU3BlY2lmaWVzIHRoZSBtZXNzYWdlIHRoYXQgd2lsbCBhcHBlYXIgaWYgcmVxdWlyZWQgaXMgc2V0IGFuZCBubyB2YWx1ZSBpcyBwcm92aWRlZCBpbiB0aGUgaW5wdXQuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHJlcXVpcmVkTWVzc2FnZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWRNZXNzYWdlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCByZXF1aXJlZE1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXF1aXJlZE1lc3NhZ2UgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjb250ZW50IG9mIHRoZSBpbnB1dCB3aWxsIGJlIHNlbGVjdGVkIG9uIGZvY3VzIG9yIG5vdC4gQXBwbGljYWJsZSB0byBQcm9tcHQgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0QWxsT25Gb2N1cygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdEFsbE9uRm9jdXMgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNlbGVjdEFsbE9uRm9jdXModmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0QWxsT25Gb2N1cyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgd2hpY2ggdGFiIGlzIHNlbGVjdGVkLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGVkSW5kZXgoKTogbnVtYmVyIHwgbnVsbCB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZEluZGV4IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3RlZEluZGV4KHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGVkSW5kZXggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgd2F5IHRoZSB1c2VyIGNhbiBzd2l0Y2ggYmV0d2VlbiB0YWJzLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHNlbGVjdGlvbk1vZGUoKTogVGFiU2VsZWN0aW9uTW9kZSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25Nb2RlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25Nb2RlKHZhbHVlOiBUYWJTZWxlY3Rpb25Nb2RlKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbk1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBBcHBsaWNhYmxlIG9ubHkgdG8gTXVsdGlsaW5lUHJvbXB0V2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0aW9uRW5kKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNlbGVjdGlvbkVuZCh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvbkVuZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJbmRpY2F0ZXMgdGhlIGluZGV4IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnQgc2VsZWN0aW9uLiBBcHBsaWNhYmxlIG9ubHkgdG8gTXVsdGlsaW5lUHJvbXB0V2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2VsZWN0aW9uU3RhcnQoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCBzZWxlY3Rpb25TdGFydCh2YWx1ZTogbnVtYmVyKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdGlvblN0YXJ0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEVuYWJsZXMvRGlzYWJsZWQgdGhlIGxhYmVsIGZvciB0aGUgUHJvZ3Jlc3MgQmFyLiBBcHBsaWNhYmxlIG9ubHkgdG8gUHJvZ3Jlc3MgV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc2hvd1Byb2dyZXNzVmFsdWUoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaG93UHJvZ3Jlc3NWYWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2hvd1Byb2dyZXNzVmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2hvd1Byb2dyZXNzVmFsdWUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQSBnZXR0ZXIgdGhhdCByZXR1cm5zIHRoZSBzaWJsaW5ncyAodGhhdCBzaGFyZSB0aGUgc2FtZSBwYXJlbnQpIG9mIGEgTGF5b3V0UGFuZWwgaXRlbSB0aGF0IGlzIGRvY2tlZCBpbnNpZGUgYSBEb2NraW5nTGF5b3V0LiBUaGUgc2libGluZ3MgYXJlIGFsc28gRG9ja2luZ0xheW91dCBpdGVtcyAoIExheW91dFBhbmVscykuQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cgd2hlbiBkb2NrZWQgaW5zaWRlIGEgRG9ja2luZ0xheW91dC4gKi9cblx0QElucHV0KClcblx0Z2V0IHNpYmxpbmdzKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaWJsaW5ncyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgc2libGluZ3ModmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaWJsaW5ncyA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBsaWNhYmxlIHRvIFRhYnNXaW5kb3cgd2hlbiBuZXN0ZWQgaW5zaWRlIGEgRG9ja2luZ0xheW91dCBDdXN0b20gRWxlbWVudC4gRGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaXRlbS4gKi9cblx0QElucHV0KClcblx0Z2V0IHNpemUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNpemUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNpemUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaXplID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzIHRvIGhhdmUgaXRzIHNwZWxsaW5nIGFuZCBncmFtbWFyIGNoZWNrZWQgb3Igbm90LiBBcHBsaWNhYmxlIG9ubHkgdG8gTXVsdGlsaW5lUHJvbXB0V2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgc3BlbGxDaGVjaygpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNwZWxsQ2hlY2sgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHNwZWxsQ2hlY2sodmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc3BlbGxDaGVjayA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgd2hldGhlciBjbG9zZSBidXR0b25zIGFyZSBkaXNwbGF5ZWQgaW5zaWRlIHRoZSBUYWIgU3RyaXAgb2YgdGhlIFRhYnNXaW5kb3cuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiQ2xvc2VCdXR0b25zKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiQ2xvc2VCdXR0b25zIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB0YWJDbG9zZUJ1dHRvbnModmFsdWU6IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiQ2xvc2VCdXR0b25zID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIGNsb3NlIGJ1dHRvbiBpcyB2aXNpYmxlIG9uIHNlbGVjdCBvciBhbHdheXMuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiQ2xvc2VCdXR0b25Nb2RlKCk6IFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJDbG9zZUJ1dHRvbk1vZGUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYkNsb3NlQnV0dG9uTW9kZSh2YWx1ZTogV2luZG93VGFiQ2xvc2VCdXR0b25Nb2RlKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYkNsb3NlQnV0dG9uTW9kZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIFRhYnMgc2Nyb2xsIGJ1dHRvbnMgYmVoYXZpb3IuIEFwcGxpY2FibGUgb25seSB3aGVuIHRhYkxheW91dCBpcyAnc2Nyb2xsJy4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuICovXG5cdEBJbnB1dCgpXG5cdGdldCB0YWJPdmVyZmxvdygpOiBPdmVyZmxvdyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJPdmVyZmxvdyA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGFiT3ZlcmZsb3codmFsdWU6IE92ZXJmbG93KSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYk92ZXJmbG93ID0gdmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIERldGV0bWluZXMgVGFiIFN0cmlwIGlzIHBvc2l0aW9uZWQgb2YgdGhlIFRhYnNXaW5kb3cuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiUG9zaXRpb24oKTogVGFiUG9zaXRpb24ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiUG9zaXRpb24gOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHRhYlBvc2l0aW9uKHZhbHVlOiBUYWJQb3NpdGlvbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJQb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzY3JvbGwgYnV0dG9ucyBpbnNpZGUgdGhlIFRhYiBoZWFkZXIgb2YgdGhlIFRhYnNXaW5kb3cuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiU2Nyb2xsQnV0dG9uc1Bvc2l0aW9uKCk6IExheW91dFBvc2l0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYlNjcm9sbEJ1dHRvbnNQb3NpdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGFiU2Nyb2xsQnV0dG9uc1Bvc2l0aW9uKHZhbHVlOiBMYXlvdXRQb3NpdGlvbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJTY3JvbGxCdXR0b25zUG9zaXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBvcmllbnRhdGlvbiBvZiB0aGUgdGV4dCBpbiB0aGUgdGFicyBsYWJlbHMgb2YgdGhlIFRhYnNXaW5kb3cuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xuXHRASW5wdXQoKVxuXHRnZXQgdGFiVGV4dE9yaWVudGF0aW9uKCk6IE9yaWVudGF0aW9uIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYlRleHRPcmllbnRhdGlvbiA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGFiVGV4dE9yaWVudGF0aW9uKHZhbHVlOiBPcmllbnRhdGlvbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJUZXh0T3JpZW50YXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdGhlbWUuIFRoZW1lIGRlZmluZXMgdGhlIGxvb2sgb2YgdGhlIGVsZW1lbnQgKi9cblx0QElucHV0KClcblx0Z2V0IHRoZW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA6IHVuZGVmaW5lZDtcblx0fVxuXHRzZXQgdGhlbWUodmFsdWU6IHN0cmluZykge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50aGVtZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBJZiBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGVsZW1lbnQgY2Fubm90IGJlIGZvY3VzZWQuICovXG5cdEBJbnB1dCgpXG5cdGdldCB1bmZvY3VzYWJsZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnVuZm9jdXNhYmxlIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB1bmZvY3VzYWJsZSh2YWx1ZTogYm9vbGVhbikge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmZvY3VzYWJsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSB2YWx1ZSBvZiB0aGUgVGV4dEJveC9Qcm9ncmVzc0JhciBpbnNpZGUgdGhlIERpYWxvZy9Qcm9tcHQvUHJvZ3Jlc3MgV2luZG93ICovXG5cdEBJbnB1dCgpXG5cdGdldCB2YWx1ZSgpOiBzdHJpbmcgfCBudW1iZXIge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWUgOiB1bmRlZmluZWQ7XG5cdH1cblx0c2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIpIHtcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgYWN0dWFsIHBhcmVudCBvZiB0aGUgZWxlbWVudC4gVGhlIHdpbmRvdyBjYW4gc2l6ZSBhbmQgbW92ZSBvbmx5IGluIHRoZSBhcmVhIG9mIHRoYXQgZWxlbWVudC4gKi9cblx0QElucHV0KClcblx0Z2V0IHdpbmRvd1BhcmVudCgpOiBhbnkge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud2luZG93UGFyZW50IDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB3aW5kb3dQYXJlbnQodmFsdWU6IGFueSkge1xuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC53aW5kb3dQYXJlbnQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIGhvdyB0aGUgaW5wdXQgd3JhcHMgdGV4dC4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cblx0QElucHV0KClcblx0Z2V0IHdyYXAoKTogV2luZG93V3JhcCB7XG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC53cmFwIDogdW5kZWZpbmVkO1xuXHR9XG5cdHNldCB3cmFwKHZhbHVlOiBXaW5kb3dXcmFwKSB7XG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LndyYXAgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQganVzdCBiZWZvcmUgdGhlIHdpbmRvdyBzdGFydHMgb3BlbmluZy5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbk9wZW5pbmc6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgb3BlbmVkKCB2aXNpYmxlICkuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25PcGVuOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQganVzdCBiZWZvcmUgdGhlIHdpbmRvdyBzdGFydHMgY2xvc2luZy5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkNsb3Npbmc6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgY2xvc2VkKCBoaWRkZW4gKVxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uQ2xvc2U6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uQ29sbGFwc2U6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHdpbmRvdydzIGRyYWdnaW5nIGlzIGVuZGVkLlxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cblx0QE91dHB1dCgpIG9uRHJhZ0VuZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gd2luZG93J3MgZHJhZ2dpbmcgaXMgc3RhcnRlZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkRyYWdTdGFydDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHdpbmRvdyBpcyBleHBhbmRlZC5cblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXG5cdEBPdXRwdXQoKSBvbkV4cGFuZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHdpbmRvdyBpcyBtYXhpbWl6ZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25NYXhpbWl6ZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHdpbmRvdyBpcyBtaW5pbWl6ZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25NaW5pbWl6ZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gd2luZG93J3MgcmVzaXppbmcgaXMgZW5kZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25SZXNpemVFbmQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHdpbmRvdydzIHJlc2l6aW5nIGlzIHN0YXJ0ZWQuXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25SZXNpemVTdGFydDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHdpbmRvdyBpcyByZXN0b3JlZCB0byBpdCdzIHByZXZpb3VzIHN0YXRlIGJlZm9yZSBtYXhpbWl6YXRpb24uXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xuXHRAT3V0cHV0KCkgb25SZXN0b3JlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwZW5kcyBhIHRhYml0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiB0YWIgaXRlbXMgaW5zaWRlIGVsZW1lbnQuIFxuXHQqIEBwYXJhbSB7Tm9kZX0gbm9kZS4gQSBUYWJJdGVtIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIHJlc3Qgb2YgdGhlIGl0ZW1zIGFzIHRoZSBsYXN0IGl0ZW0uXG5cdCogQHJldHVybnMge05vZGV9XG4gICovXG5cdHB1YmxpYyBhc3luYyBhcHBlbmRDaGlsZChub2RlKTogUHJvbWlzZTxhbnk+IHtcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgd2luZG93IHRvIHRoZSB0b3AgbGV2ZWwgc28gdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggaXQuIFxuXHQqL1xuICAgIHB1YmxpYyBicmluZ1RvRnJvbnQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmJyaW5nVG9Gcm9udCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmJyaW5nVG9Gcm9udCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBDbGVhcnMgdGhlIGNvbnRlbnQgb2YgdGhlIFdpbmRvdy4gXG5cdCovXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsZWFyKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIENsb3NlcyB0aGUgd2luZG93LiBcblx0Ki9cbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gQ29sbGFwc2VzIHRoZSB3aW5kb3cuIFxuXHQqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cbiAgKi9cblx0cHVibGljIGFzeW5jIGNvbGxhcHNlKCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5jb2xsYXBzZSgpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gTWFrZXMgc3VyZSBhIHRhYiBpdGVtIGlzIHZpc2libGUgYnkgc2Nyb2xsaW5nIHRvIGl0LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IGluZGV4LiBUaGUgaW5kZXggb2YgdGhlIHRhYiB0byBzY3JvbGwgdG8uXG5cdCovXG4gICAgcHVibGljIGVuc3VyZVZpc2libGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5lbnN1cmVWaXNpYmxlKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5lbnN1cmVWaXNpYmxlKGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gRXhwYW5kcyB0aGUgd2luZG93IGFmdGVyIGJlaW5nIGNvbGxhcHNlZC4gXG5cdCogQHJldHVybnMge2FueVtdfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgZXhwYW5kKCk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5leHBhbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIEluc2VydHMgYSBuZXcgdGFiIGFuZCBhbiBhc3NvY2lhdGVkIGNvbnRlbnQgc2VjdGlvbi4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBpbmRleC4gVGhlIGluZGV4IHRvIGluc2VydCBhIG5ldyB0YWIgYXQuXG5cdCogQHBhcmFtIHthbnl9IGRldGFpbHMuIEFuIE9iamVjdCB3aXRoIHRoZSBmaWVsZHMgXCJsYWJlbFwiLCBcImxhYmVsU2l6ZVwiLCBcImNvbnRlbnRcIiBhbmQgXCJncm91cFwiLlxuXHQqL1xuICAgIHB1YmxpYyBpbnNlcnQoaW5kZXg6IG51bWJlciwgZGV0YWlsczogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydChpbmRleCwgZGV0YWlscyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0KGluZGV4LCBkZXRhaWxzKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlIGJlZm9yZSB0aGUgcmVmZXJlbmNlIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtOb2RlfSBuZXdOb2RlLiBUaGUgXCJzbWFydC10YWItaXRlbVwiIG5vZGUgdG8gaW5zZXJ0LlxuXHQqIEBwYXJhbSB7Tm9kZSB8IG51bGx9IHJlZmVyZW5jZU5vZGU/LiBUaGUgXCJzbWFydC10YWItaXRlbVwiIG5vZGUgYmVmb3JlIHdoaWNoIG5ld05vZGUgaXMgaW5zZXJ0ZWQuXG5cdCogQHJldHVybnMge05vZGV9XG4gICovXG5cdHB1YmxpYyBhc3luYyBpbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZT8pOiBQcm9taXNlPGFueT4ge1xuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIHRhYiBhbmQgaXRzIGFzc29jaWF0ZWQgY29udGVudCBzZWN0aW9uLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtudW1iZXJ9IGluZGV4LiBUaGUgaW5kZXggb2YgdGhlIHRhYiB0byByZW1vdmUuXG5cdCovXG4gICAgcHVibGljIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXQoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlbW92ZUF0KGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIGNoaWxkIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBUaGUgXCJzbWFydC10YWItaXRlbVwiIG5vZGUgdG8gcmVtb3ZlLlxuXHQqIEByZXR1cm5zIHtOb2RlfVxuICAqL1xuXHRwdWJsaWMgYXN5bmMgcmVtb3ZlQ2hpbGQobm9kZSk6IFByb21pc2U8YW55PiB7XG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0UmVzdWx0T25SZW5kZXIoKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE1heGltaXplcyB0aGUgd2luZG93IHRvIGZpbGwgdGhlIGFyZWEuIFxuXHQqL1xuICAgIHB1YmxpYyBtYXhpbWl6ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQubWF4aW1pemUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5tYXhpbWl6ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBNaW5pbWl6ZXMgdGhlIHdpbmRvdy4gXG5cdCovXG4gICAgcHVibGljIG1pbmltaXplKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm1pbmltaXplKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIE9wZW5zIHRoZSB3aW5kb3cgXG5cdCovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFBpbnMgdGhlIHdpbmRvdy4gRGlzYWJsZXMgd2luZG93IGRyYWdnaW5nLiBcblx0Ki9cbiAgICBwdWJsaWMgcGluKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVzdG9yZXMgdGhlIHdpbmRvdyB0byBpdCdzIHByZXZpb3VzIHNpemUgYmVmb3JlIG1heGltaXphdGlvbi9taW5pbWl6YXRpb24uIFxuXHQqL1xuICAgIHB1YmxpYyByZXN0b3JlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVzdG9yZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBTZWxlY3RzIGEgdGFiLiAgQXBwbGljYWxiZSBvbmx5IHRvIFRhYnNXaW5kb3cgZWxlbWVudHMuIFxuXHQqIEBwYXJhbSB7bnVtYmVyfSBpbmRleC4gVGhlIGluZGV4IG9mIHRoZSB0YWIgdG8gc2VsZWN0LlxuXHQqL1xuICAgIHB1YmxpYyBzZWxlY3QoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3QoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdChpbmRleCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFVucGlucyB0aGUgd2luZG93LiBFbmFibGVzIHdpbmRvdyBkcmFnZ2luZy4gXG5cdCovXG4gICAgcHVibGljIHVucGluKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51bnBpbigpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnVucGluKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSB0YWIgYW5kIGl0cyBhc3NvY2lhdGVkIGNvbnRlbnQgc2VjdGlvbi4gIEFwcGxpY2FsYmUgb25seSB0byBUYWJzV2luZG93IGVsZW1lbnRzLiBcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHVwZGF0ZS5cblx0KiBAcGFyYW0ge3N0cmluZ30gbGFiZWwuIFRoZSBuZXcgbGFiZWwgb2YgdGhlIHRhYi4gVGhlIHZhbHVlIGNhbiBiZSB0aGUgaWQgb2YgYW4gSFRNTFRlbXBsYXRlRWxlbWVudFxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgSFRNTEVsZW1lbnR9IGNvbnRlbnQuIFRoZSBuZXcgY29udGVudCBvZiB0aGUgdGFiLlxuXHQqL1xuICAgIHB1YmxpYyB1cGRhdGUoaW5kZXg6IG51bWJlciwgbGFiZWw6IHN0cmluZywgY29udGVudDogc3RyaW5nIHwgSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlKGluZGV4LCBsYWJlbCwgY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZVxuICAgICAgICB7XG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlKGluZGV4LCBsYWJlbCwgY29udGVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuXG5cdGdldCBpc1JlbmRlcmVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCA6IGZhbHNlO1xuXHR9XG5cblx0bmdPbkluaXQoKSB7XG5cdH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXG4gICAgICB0aGF0Lm9uQ3JlYXRlLmVtaXQodGhhdC5uYXRpdmVFbGVtZW50KTtcblxuXHRcdFNtYXJ0LlJlbmRlcigpO1xuXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3NtYXJ0LWFuZ3VsYXInKTtcblxuXHRcdHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4geyB0aGF0Lm9uUmVhZHkuZW1pdCh0aGF0Lm5hdGl2ZUVsZW1lbnQpOyB9KTtcblx0XHR0aGlzLmxpc3RlbigpO1xuXHR9XG5cblx0bmdPbkRlc3Ryb3koKSB7XG5cdFx0dGhpcy51bmxpc3RlbigpO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQgJiYgdGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcblx0XHRcdGZvciAoY29uc3QgcHJvcE5hbWUgaW4gY2hhbmdlcykge1xuXHRcdFx0XHRpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcblx0XHRcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcE5hbWVdID0gY2hhbmdlc1twcm9wTmFtZV0uY3VycmVudFZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqIEBkZXNjcmlwdGlvbiBBZGQgZXZlbnQgbGlzdGVuZXJzLiAqL1xuXHRwcml2YXRlIGxpc3RlbigpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uT3BlbmluZy5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdvcGVuaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk9wZW4uZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25DbG9zaW5nLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NpbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkNsb3NlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zZUhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2NvbGxhcHNlSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uQ29sbGFwc2UuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY29sbGFwc2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2NvbGxhcHNlSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ0VuZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkRyYWdFbmQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ0VuZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ0VuZEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkRyYWdTdGFydC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdkcmFnU3RhcnQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkV4cGFuZC5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdleHBhbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uTWF4aW1pemUuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWF4aW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddKTtcblxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snbWluaW1pemVIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25NaW5pbWl6ZS5lbWl0KGV2ZW50KTsgfVxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtaW5pbWl6ZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snbWluaW1pemVIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25SZXNpemVFbmQuZW1pdChldmVudCk7IH1cblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplRW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pO1xuXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblJlc2l6ZVN0YXJ0LmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZVN0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVTdGFydEhhbmRsZXInXSk7XG5cblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25SZXN0b3JlLmVtaXQoZXZlbnQpOyB9XG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc3RvcmUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10pO1xuXG5cdH1cblxuXHQvKiogQGRlc2NyaXB0aW9uIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMuICovXG5cdHByaXZhdGUgdW5saXN0ZW4oKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdvcGVuaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydvcGVuaW5nSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydvcGVuSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignb3BlbicsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbkhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2luZ0hhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NpbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NvbGxhcHNlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ0VuZEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSkge1xuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ1N0YXJ0SGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdleHBhbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1snbWF4aW1pemVIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYXhpbWl6ZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snbWF4aW1pemVIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKSB7XG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWluaW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKTtcblx0XHR9XG5cblx0XHRpZiAodGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemVFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemVTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pO1xuXHRcdH1cblxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10pIHtcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXN0b3JlJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXN0b3JlSGFuZGxlciddKTtcblx0XHR9XG5cblx0fVxufVxuIl19
|