@smart-webcomponents-angular/window 9.2.73 → 13.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -2
- package/common/i18n.phonenumbers.min.js +501 -0
- package/common/runtime.js +748 -0
- package/esm2020/window/index.mjs +2 -0
- package/{esm2015/window/public_api.js → esm2020/window/public_api.mjs} +1 -1
- package/{esm2015/window/smart-webcomponents-angular-window.js → esm2020/window/smart-webcomponents-angular-window.mjs} +2 -3
- package/esm2020/window/smart.element.mjs +99 -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} +209 -111
- package/fesm2015/smart-webcomponents-angular-window.mjs.map +1 -0
- package/fesm2020/smart-webcomponents-angular-window.mjs +1176 -0
- package/fesm2020/smart-webcomponents-angular-window.mjs.map +1 -0
- package/images/flags.png +0 -0
- package/index.d.ts +31835 -28915
- package/package.json +26 -24
- package/source/modules/smart.window.js +2 -1
- package/source/smart.button.js +2 -2
- package/source/smart.combobox.js +2 -2
- package/source/smart.dropdownlist.js +2 -2
- package/source/smart.element.js +2 -2
- package/source/smart.listbox.js +2 -2
- package/source/smart.multilinetextbox.js +2 -2
- package/source/smart.progressbar.js +2 -2
- package/source/smart.scrollbar.js +2 -2
- package/source/smart.textbox.js +2 -2
- package/source/smart.window.js +2 -2
- package/styles/font/smart-icons.eot +0 -0
- package/styles/font/smart-icons.svg +64 -2
- 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 +4 -4
- package/styles/smart.common.css +1 -1
- package/styles/smart.window.css +4 -4
- 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
|
@@ -1,983 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Directive, ElementRef, Input, Output, EventEmitter } from '@angular/core';
|
|
3
|
-
import { BaseElement, Smart } from './smart.element';
|
|
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
|
-
appendChild(node) {
|
|
534
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
535
|
-
const getResultOnRender = () => {
|
|
536
|
-
return new Promise(resolve => {
|
|
537
|
-
this.nativeElement.whenRendered(() => {
|
|
538
|
-
const result = this.nativeElement.appendChild(node);
|
|
539
|
-
resolve(result);
|
|
540
|
-
});
|
|
541
|
-
});
|
|
542
|
-
};
|
|
543
|
-
const result = yield getResultOnRender();
|
|
544
|
-
return result;
|
|
545
|
-
});
|
|
546
|
-
}
|
|
547
|
-
/** @description Sets the window to the top level so the user can interact with it.
|
|
548
|
-
*/
|
|
549
|
-
bringToFront() {
|
|
550
|
-
if (this.nativeElement.isRendered) {
|
|
551
|
-
this.nativeElement.bringToFront();
|
|
552
|
-
}
|
|
553
|
-
else {
|
|
554
|
-
this.nativeElement.whenRendered(() => {
|
|
555
|
-
this.nativeElement.bringToFront();
|
|
556
|
-
});
|
|
557
|
-
}
|
|
558
|
-
}
|
|
559
|
-
/** @description Clears the content of the Window.
|
|
560
|
-
*/
|
|
561
|
-
clear() {
|
|
562
|
-
if (this.nativeElement.isRendered) {
|
|
563
|
-
this.nativeElement.clear();
|
|
564
|
-
}
|
|
565
|
-
else {
|
|
566
|
-
this.nativeElement.whenRendered(() => {
|
|
567
|
-
this.nativeElement.clear();
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
/** @description Closes the window.
|
|
572
|
-
*/
|
|
573
|
-
close() {
|
|
574
|
-
if (this.nativeElement.isRendered) {
|
|
575
|
-
this.nativeElement.close();
|
|
576
|
-
}
|
|
577
|
-
else {
|
|
578
|
-
this.nativeElement.whenRendered(() => {
|
|
579
|
-
this.nativeElement.close();
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
/** @description Collapses the window.
|
|
584
|
-
* @returns {HTMLElement}
|
|
585
|
-
*/
|
|
586
|
-
collapse() {
|
|
587
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
588
|
-
const getResultOnRender = () => {
|
|
589
|
-
return new Promise(resolve => {
|
|
590
|
-
this.nativeElement.whenRendered(() => {
|
|
591
|
-
const result = this.nativeElement.collapse();
|
|
592
|
-
resolve(result);
|
|
593
|
-
});
|
|
594
|
-
});
|
|
595
|
-
};
|
|
596
|
-
const result = yield getResultOnRender();
|
|
597
|
-
return result;
|
|
598
|
-
});
|
|
599
|
-
}
|
|
600
|
-
/** @description Makes sure a tab item is visible by scrolling to it. Applicable only to TabsWindow.
|
|
601
|
-
* @param {number} index. The index of the tab to scroll to.
|
|
602
|
-
*/
|
|
603
|
-
ensureVisible(index) {
|
|
604
|
-
if (this.nativeElement.isRendered) {
|
|
605
|
-
this.nativeElement.ensureVisible(index);
|
|
606
|
-
}
|
|
607
|
-
else {
|
|
608
|
-
this.nativeElement.whenRendered(() => {
|
|
609
|
-
this.nativeElement.ensureVisible(index);
|
|
610
|
-
});
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
/** @description Expands the window after being collapsed.
|
|
614
|
-
* @returns {any[]}
|
|
615
|
-
*/
|
|
616
|
-
expand() {
|
|
617
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
618
|
-
const getResultOnRender = () => {
|
|
619
|
-
return new Promise(resolve => {
|
|
620
|
-
this.nativeElement.whenRendered(() => {
|
|
621
|
-
const result = this.nativeElement.expand();
|
|
622
|
-
resolve(result);
|
|
623
|
-
});
|
|
624
|
-
});
|
|
625
|
-
};
|
|
626
|
-
const result = yield getResultOnRender();
|
|
627
|
-
return result;
|
|
628
|
-
});
|
|
629
|
-
}
|
|
630
|
-
/** @description Inserts a new tab and an associated content section. Applicable only to TabsWindow.
|
|
631
|
-
* @param {number} index. The index to insert a new tab at.
|
|
632
|
-
* @param {any} details. An Object with the fields "label", "labelSize", "content" and "group".
|
|
633
|
-
*/
|
|
634
|
-
insert(index, details) {
|
|
635
|
-
if (this.nativeElement.isRendered) {
|
|
636
|
-
this.nativeElement.insert(index, details);
|
|
637
|
-
}
|
|
638
|
-
else {
|
|
639
|
-
this.nativeElement.whenRendered(() => {
|
|
640
|
-
this.nativeElement.insert(index, details);
|
|
641
|
-
});
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
/** @description Inserts the specified "smart-tab-item" node before the reference "smart-tab-item" node. Applicable only to TabsWindow.
|
|
645
|
-
* @param {Node} newNode. The "smart-tab-item" node to insert.
|
|
646
|
-
* @param {Node | null} referenceNode?. The "smart-tab-item" node before which newNode is inserted.
|
|
647
|
-
* @returns {Node}
|
|
648
|
-
*/
|
|
649
|
-
insertBefore(newNode, referenceNode) {
|
|
650
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
651
|
-
const getResultOnRender = () => {
|
|
652
|
-
return new Promise(resolve => {
|
|
653
|
-
this.nativeElement.whenRendered(() => {
|
|
654
|
-
const result = this.nativeElement.insertBefore(newNode, referenceNode);
|
|
655
|
-
resolve(result);
|
|
656
|
-
});
|
|
657
|
-
});
|
|
658
|
-
};
|
|
659
|
-
const result = yield getResultOnRender();
|
|
660
|
-
return result;
|
|
661
|
-
});
|
|
662
|
-
}
|
|
663
|
-
/** @description Removes a tab and its associated content section. Applicable only to TabsWindow.
|
|
664
|
-
* @param {number} index. The index of the tab to remove.
|
|
665
|
-
*/
|
|
666
|
-
removeAt(index) {
|
|
667
|
-
if (this.nativeElement.isRendered) {
|
|
668
|
-
this.nativeElement.removeAt(index);
|
|
669
|
-
}
|
|
670
|
-
else {
|
|
671
|
-
this.nativeElement.whenRendered(() => {
|
|
672
|
-
this.nativeElement.removeAt(index);
|
|
673
|
-
});
|
|
674
|
-
}
|
|
675
|
-
}
|
|
676
|
-
/** @description Removes a child "smart-tab-item" node. Applicable only to TabsWindow.
|
|
677
|
-
* @param {Node} node. The "smart-tab-item" node to remove.
|
|
678
|
-
* @returns {Node}
|
|
679
|
-
*/
|
|
680
|
-
removeChild(node) {
|
|
681
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
682
|
-
const getResultOnRender = () => {
|
|
683
|
-
return new Promise(resolve => {
|
|
684
|
-
this.nativeElement.whenRendered(() => {
|
|
685
|
-
const result = this.nativeElement.removeChild(node);
|
|
686
|
-
resolve(result);
|
|
687
|
-
});
|
|
688
|
-
});
|
|
689
|
-
};
|
|
690
|
-
const result = yield getResultOnRender();
|
|
691
|
-
return result;
|
|
692
|
-
});
|
|
693
|
-
}
|
|
694
|
-
/** @description Maximizes the window to fill the area.
|
|
695
|
-
*/
|
|
696
|
-
maximize() {
|
|
697
|
-
if (this.nativeElement.isRendered) {
|
|
698
|
-
this.nativeElement.maximize();
|
|
699
|
-
}
|
|
700
|
-
else {
|
|
701
|
-
this.nativeElement.whenRendered(() => {
|
|
702
|
-
this.nativeElement.maximize();
|
|
703
|
-
});
|
|
704
|
-
}
|
|
705
|
-
}
|
|
706
|
-
/** @description Minimizes the window.
|
|
707
|
-
*/
|
|
708
|
-
minimize() {
|
|
709
|
-
if (this.nativeElement.isRendered) {
|
|
710
|
-
this.nativeElement.minimize();
|
|
711
|
-
}
|
|
712
|
-
else {
|
|
713
|
-
this.nativeElement.whenRendered(() => {
|
|
714
|
-
this.nativeElement.minimize();
|
|
715
|
-
});
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
/** @description Opens the window
|
|
719
|
-
*/
|
|
720
|
-
open() {
|
|
721
|
-
if (this.nativeElement.isRendered) {
|
|
722
|
-
this.nativeElement.open();
|
|
723
|
-
}
|
|
724
|
-
else {
|
|
725
|
-
this.nativeElement.whenRendered(() => {
|
|
726
|
-
this.nativeElement.open();
|
|
727
|
-
});
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
/** @description Pins the window. Disables window dragging.
|
|
731
|
-
*/
|
|
732
|
-
pin() {
|
|
733
|
-
if (this.nativeElement.isRendered) {
|
|
734
|
-
this.nativeElement.pin();
|
|
735
|
-
}
|
|
736
|
-
else {
|
|
737
|
-
this.nativeElement.whenRendered(() => {
|
|
738
|
-
this.nativeElement.pin();
|
|
739
|
-
});
|
|
740
|
-
}
|
|
741
|
-
}
|
|
742
|
-
/** @description Restores the window to it's previous size before maximization/minimization.
|
|
743
|
-
*/
|
|
744
|
-
restore() {
|
|
745
|
-
if (this.nativeElement.isRendered) {
|
|
746
|
-
this.nativeElement.restore();
|
|
747
|
-
}
|
|
748
|
-
else {
|
|
749
|
-
this.nativeElement.whenRendered(() => {
|
|
750
|
-
this.nativeElement.restore();
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
/** @description Selects a tab. Applicalbe only to TabsWindow elements.
|
|
755
|
-
* @param {number} index. The index of the tab to select.
|
|
756
|
-
*/
|
|
757
|
-
select(index) {
|
|
758
|
-
if (this.nativeElement.isRendered) {
|
|
759
|
-
this.nativeElement.select(index);
|
|
760
|
-
}
|
|
761
|
-
else {
|
|
762
|
-
this.nativeElement.whenRendered(() => {
|
|
763
|
-
this.nativeElement.select(index);
|
|
764
|
-
});
|
|
765
|
-
}
|
|
766
|
-
}
|
|
767
|
-
/** @description Unpins the window. Enables window dragging.
|
|
768
|
-
*/
|
|
769
|
-
unpin() {
|
|
770
|
-
if (this.nativeElement.isRendered) {
|
|
771
|
-
this.nativeElement.unpin();
|
|
772
|
-
}
|
|
773
|
-
else {
|
|
774
|
-
this.nativeElement.whenRendered(() => {
|
|
775
|
-
this.nativeElement.unpin();
|
|
776
|
-
});
|
|
777
|
-
}
|
|
778
|
-
}
|
|
779
|
-
/** @description Updates a tab and its associated content section. Applicalbe only to TabsWindow elements.
|
|
780
|
-
* @param {number} index. The index of the tab to update.
|
|
781
|
-
* @param {string} label. The new label of the tab. The value can be the id of an HTMLTemplateElement
|
|
782
|
-
* @param {string | HTMLElement} content. The new content of the tab.
|
|
783
|
-
*/
|
|
784
|
-
update(index, label, content) {
|
|
785
|
-
if (this.nativeElement.isRendered) {
|
|
786
|
-
this.nativeElement.update(index, label, content);
|
|
787
|
-
}
|
|
788
|
-
else {
|
|
789
|
-
this.nativeElement.whenRendered(() => {
|
|
790
|
-
this.nativeElement.update(index, label, content);
|
|
791
|
-
});
|
|
792
|
-
}
|
|
793
|
-
}
|
|
794
|
-
get isRendered() {
|
|
795
|
-
return this.nativeElement ? this.nativeElement.isRendered : false;
|
|
796
|
-
}
|
|
797
|
-
ngOnInit() {
|
|
798
|
-
}
|
|
799
|
-
ngAfterViewInit() {
|
|
800
|
-
const that = this;
|
|
801
|
-
that.onCreate.emit(that.nativeElement);
|
|
802
|
-
Smart.Render();
|
|
803
|
-
this.nativeElement.classList.add('smart-angular');
|
|
804
|
-
this.nativeElement.whenRendered(() => { that.onReady.emit(that.nativeElement); });
|
|
805
|
-
this.listen();
|
|
806
|
-
}
|
|
807
|
-
ngOnDestroy() {
|
|
808
|
-
this.unlisten();
|
|
809
|
-
}
|
|
810
|
-
ngOnChanges(changes) {
|
|
811
|
-
if (this.nativeElement && this.nativeElement.isRendered) {
|
|
812
|
-
for (const propName in changes) {
|
|
813
|
-
if (changes.hasOwnProperty(propName)) {
|
|
814
|
-
this.nativeElement[propName] = changes[propName].currentValue;
|
|
815
|
-
}
|
|
816
|
-
}
|
|
817
|
-
}
|
|
818
|
-
}
|
|
819
|
-
/** @description Add event listeners. */
|
|
820
|
-
listen() {
|
|
821
|
-
const that = this;
|
|
822
|
-
that.eventHandlers['openingHandler'] = (event) => { that.onOpening.emit(event); };
|
|
823
|
-
that.nativeElement.addEventListener('opening', that.eventHandlers['openingHandler']);
|
|
824
|
-
that.eventHandlers['openHandler'] = (event) => { that.onOpen.emit(event); };
|
|
825
|
-
that.nativeElement.addEventListener('open', that.eventHandlers['openHandler']);
|
|
826
|
-
that.eventHandlers['closingHandler'] = (event) => { that.onClosing.emit(event); };
|
|
827
|
-
that.nativeElement.addEventListener('closing', that.eventHandlers['closingHandler']);
|
|
828
|
-
that.eventHandlers['closeHandler'] = (event) => { that.onClose.emit(event); };
|
|
829
|
-
that.nativeElement.addEventListener('close', that.eventHandlers['closeHandler']);
|
|
830
|
-
that.eventHandlers['collapseHandler'] = (event) => { that.onCollapse.emit(event); };
|
|
831
|
-
that.nativeElement.addEventListener('collapse', that.eventHandlers['collapseHandler']);
|
|
832
|
-
that.eventHandlers['dragEndHandler'] = (event) => { that.onDragEnd.emit(event); };
|
|
833
|
-
that.nativeElement.addEventListener('dragEnd', that.eventHandlers['dragEndHandler']);
|
|
834
|
-
that.eventHandlers['dragStartHandler'] = (event) => { that.onDragStart.emit(event); };
|
|
835
|
-
that.nativeElement.addEventListener('dragStart', that.eventHandlers['dragStartHandler']);
|
|
836
|
-
that.eventHandlers['expandHandler'] = (event) => { that.onExpand.emit(event); };
|
|
837
|
-
that.nativeElement.addEventListener('expand', that.eventHandlers['expandHandler']);
|
|
838
|
-
that.eventHandlers['maximizeHandler'] = (event) => { that.onMaximize.emit(event); };
|
|
839
|
-
that.nativeElement.addEventListener('maximize', that.eventHandlers['maximizeHandler']);
|
|
840
|
-
that.eventHandlers['minimizeHandler'] = (event) => { that.onMinimize.emit(event); };
|
|
841
|
-
that.nativeElement.addEventListener('minimize', that.eventHandlers['minimizeHandler']);
|
|
842
|
-
that.eventHandlers['resizeEndHandler'] = (event) => { that.onResizeEnd.emit(event); };
|
|
843
|
-
that.nativeElement.addEventListener('resizeEnd', that.eventHandlers['resizeEndHandler']);
|
|
844
|
-
that.eventHandlers['resizeStartHandler'] = (event) => { that.onResizeStart.emit(event); };
|
|
845
|
-
that.nativeElement.addEventListener('resizeStart', that.eventHandlers['resizeStartHandler']);
|
|
846
|
-
that.eventHandlers['restoreHandler'] = (event) => { that.onRestore.emit(event); };
|
|
847
|
-
that.nativeElement.addEventListener('restore', that.eventHandlers['restoreHandler']);
|
|
848
|
-
}
|
|
849
|
-
/** @description Remove event listeners. */
|
|
850
|
-
unlisten() {
|
|
851
|
-
const that = this;
|
|
852
|
-
if (that.eventHandlers['openingHandler']) {
|
|
853
|
-
that.nativeElement.removeEventListener('opening', that.eventHandlers['openingHandler']);
|
|
854
|
-
}
|
|
855
|
-
if (that.eventHandlers['openHandler']) {
|
|
856
|
-
that.nativeElement.removeEventListener('open', that.eventHandlers['openHandler']);
|
|
857
|
-
}
|
|
858
|
-
if (that.eventHandlers['closingHandler']) {
|
|
859
|
-
that.nativeElement.removeEventListener('closing', that.eventHandlers['closingHandler']);
|
|
860
|
-
}
|
|
861
|
-
if (that.eventHandlers['closeHandler']) {
|
|
862
|
-
that.nativeElement.removeEventListener('close', that.eventHandlers['closeHandler']);
|
|
863
|
-
}
|
|
864
|
-
if (that.eventHandlers['collapseHandler']) {
|
|
865
|
-
that.nativeElement.removeEventListener('collapse', that.eventHandlers['collapseHandler']);
|
|
866
|
-
}
|
|
867
|
-
if (that.eventHandlers['dragEndHandler']) {
|
|
868
|
-
that.nativeElement.removeEventListener('dragEnd', that.eventHandlers['dragEndHandler']);
|
|
869
|
-
}
|
|
870
|
-
if (that.eventHandlers['dragStartHandler']) {
|
|
871
|
-
that.nativeElement.removeEventListener('dragStart', that.eventHandlers['dragStartHandler']);
|
|
872
|
-
}
|
|
873
|
-
if (that.eventHandlers['expandHandler']) {
|
|
874
|
-
that.nativeElement.removeEventListener('expand', that.eventHandlers['expandHandler']);
|
|
875
|
-
}
|
|
876
|
-
if (that.eventHandlers['maximizeHandler']) {
|
|
877
|
-
that.nativeElement.removeEventListener('maximize', that.eventHandlers['maximizeHandler']);
|
|
878
|
-
}
|
|
879
|
-
if (that.eventHandlers['minimizeHandler']) {
|
|
880
|
-
that.nativeElement.removeEventListener('minimize', that.eventHandlers['minimizeHandler']);
|
|
881
|
-
}
|
|
882
|
-
if (that.eventHandlers['resizeEndHandler']) {
|
|
883
|
-
that.nativeElement.removeEventListener('resizeEnd', that.eventHandlers['resizeEndHandler']);
|
|
884
|
-
}
|
|
885
|
-
if (that.eventHandlers['resizeStartHandler']) {
|
|
886
|
-
that.nativeElement.removeEventListener('resizeStart', that.eventHandlers['resizeStartHandler']);
|
|
887
|
-
}
|
|
888
|
-
if (that.eventHandlers['restoreHandler']) {
|
|
889
|
-
that.nativeElement.removeEventListener('restore', that.eventHandlers['restoreHandler']);
|
|
890
|
-
}
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
WindowComponent.decorators = [
|
|
894
|
-
{ type: Directive, args: [{
|
|
895
|
-
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'
|
|
896
|
-
},] }
|
|
897
|
-
];
|
|
898
|
-
WindowComponent.ctorParameters = () => [
|
|
899
|
-
{ type: ElementRef }
|
|
900
|
-
];
|
|
901
|
-
WindowComponent.propDecorators = {
|
|
902
|
-
addNewTab: [{ type: Input }],
|
|
903
|
-
animation: [{ type: Input }],
|
|
904
|
-
autoCapitalize: [{ type: Input }],
|
|
905
|
-
autoExpand: [{ type: Input }],
|
|
906
|
-
cancelLabel: [{ type: Input }],
|
|
907
|
-
completeLabel: [{ type: Input }],
|
|
908
|
-
confirmLabel: [{ type: Input }],
|
|
909
|
-
collapsed: [{ type: Input }],
|
|
910
|
-
closeOnMaskClick: [{ type: Input }],
|
|
911
|
-
dataSource: [{ type: Input }],
|
|
912
|
-
disabled: [{ type: Input }],
|
|
913
|
-
disableSnap: [{ type: Input }],
|
|
914
|
-
displayMode: [{ type: Input }],
|
|
915
|
-
dropPosition: [{ type: Input }],
|
|
916
|
-
formatFunction: [{ type: Input }],
|
|
917
|
-
footerPosition: [{ type: Input }],
|
|
918
|
-
footerTemplate: [{ type: Input }],
|
|
919
|
-
headerButtons: [{ type: Input }],
|
|
920
|
-
headerTemplate: [{ type: Input }],
|
|
921
|
-
headerPosition: [{ type: Input }],
|
|
922
|
-
hint: [{ type: Input }],
|
|
923
|
-
indeterminate: [{ type: Input }],
|
|
924
|
-
inverted: [{ type: Input }],
|
|
925
|
-
label: [{ type: Input }],
|
|
926
|
-
liveResize: [{ type: Input }],
|
|
927
|
-
layout: [{ type: Input }],
|
|
928
|
-
locale: [{ type: Input }],
|
|
929
|
-
locked: [{ type: Input }],
|
|
930
|
-
localizeFormatFunction: [{ type: Input }],
|
|
931
|
-
maximized: [{ type: Input }],
|
|
932
|
-
messages: [{ type: Input }],
|
|
933
|
-
modal: [{ type: Input }],
|
|
934
|
-
max: [{ type: Input }],
|
|
935
|
-
min: [{ type: Input }],
|
|
936
|
-
minimized: [{ type: Input }],
|
|
937
|
-
maxLength: [{ type: Input }],
|
|
938
|
-
minLength: [{ type: Input }],
|
|
939
|
-
opened: [{ type: Input }],
|
|
940
|
-
pinned: [{ type: Input }],
|
|
941
|
-
placeholder: [{ type: Input }],
|
|
942
|
-
promptLabel: [{ type: Input }],
|
|
943
|
-
readonly: [{ type: Input }],
|
|
944
|
-
resizeIndicator: [{ type: Input }],
|
|
945
|
-
resizeMode: [{ type: Input }],
|
|
946
|
-
rightToLeft: [{ type: Input }],
|
|
947
|
-
required: [{ type: Input }],
|
|
948
|
-
requiredMessage: [{ type: Input }],
|
|
949
|
-
selectAllOnFocus: [{ type: Input }],
|
|
950
|
-
selectedIndex: [{ type: Input }],
|
|
951
|
-
selectionMode: [{ type: Input }],
|
|
952
|
-
selectionEnd: [{ type: Input }],
|
|
953
|
-
selectionStart: [{ type: Input }],
|
|
954
|
-
showProgressValue: [{ type: Input }],
|
|
955
|
-
siblings: [{ type: Input }],
|
|
956
|
-
size: [{ type: Input }],
|
|
957
|
-
spellCheck: [{ type: Input }],
|
|
958
|
-
tabCloseButtons: [{ type: Input }],
|
|
959
|
-
tabCloseButtonMode: [{ type: Input }],
|
|
960
|
-
tabOverflow: [{ type: Input }],
|
|
961
|
-
tabPosition: [{ type: Input }],
|
|
962
|
-
tabScrollButtonsPosition: [{ type: Input }],
|
|
963
|
-
tabTextOrientation: [{ type: Input }],
|
|
964
|
-
theme: [{ type: Input }],
|
|
965
|
-
unfocusable: [{ type: Input }],
|
|
966
|
-
value: [{ type: Input }],
|
|
967
|
-
windowParent: [{ type: Input }],
|
|
968
|
-
wrap: [{ type: Input }],
|
|
969
|
-
onOpening: [{ type: Output }],
|
|
970
|
-
onOpen: [{ type: Output }],
|
|
971
|
-
onClosing: [{ type: Output }],
|
|
972
|
-
onClose: [{ type: Output }],
|
|
973
|
-
onCollapse: [{ type: Output }],
|
|
974
|
-
onDragEnd: [{ type: Output }],
|
|
975
|
-
onDragStart: [{ type: Output }],
|
|
976
|
-
onExpand: [{ type: Output }],
|
|
977
|
-
onMaximize: [{ type: Output }],
|
|
978
|
-
onMinimize: [{ type: Output }],
|
|
979
|
-
onResizeEnd: [{ type: Output }],
|
|
980
|
-
onResizeStart: [{ type: Output }],
|
|
981
|
-
onRestore: [{ type: Output }]
|
|
982
|
-
};
|
|
983
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQud2luZG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vd2luZG93L3NyYy9zbWFydC53aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUVBLE9BQU8sRUFBYSxTQUFTLEVBQWlCLFVBQVUsRUFBRSxLQUFLLEVBQStDLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUosT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFReEMsTUFBTSxPQUFPLGVBQWdCLFNBQVEsV0FBVztJQUMvQyxZQUFZLEdBQXVCO1FBQ2xDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUlKLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBd21CbEM7OENBQ3NDO1FBQzVCLGNBQVMsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVwRTs4Q0FDc0M7UUFDNUIsV0FBTSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWpFOzhDQUNzQztRQUM1QixjQUFTLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEU7OENBQ3NDO1FBQzVCLFlBQU8sR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVsRTs4Q0FDc0M7UUFDNUIsZUFBVSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXJFOzhDQUNzQztRQUM1QixjQUFTLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFcEU7OENBQ3NDO1FBQzVCLGdCQUFXLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFFdEU7OENBQ3NDO1FBQzVCLGFBQVEsR0FBOEIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUVuRTs4Q0FDc0M7UUFDNUIsZUFBVSxHQUE4QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXJFOzhDQUNzQztRQUM1QixlQUFVLEdBQThCLElBQUks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LFFBQVEsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFFbkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDaEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7UUFFdkYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDbEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7UUFFekYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsS0FBa0IsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWEs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LEtBQUs7eUJBU0wsS0FBSzswQkFTTCxLQUFLO3VCQVNMLEtBQUs7OEJBU0wsS0FBSzsrQkFTTCxLQUFLOzRCQVNMLEtBQUs7NEJBU0wsS0FBSzsyQkFTTCxLQUFLOzZCQVNMLEtBQUs7Z0NBU0wsS0FBSzt1QkFTTCxLQUFLO21CQVNMLEtBQUs7eUJBU0wsS0FBSzs4QkFTTCxLQUFLO2lDQVNMLEtBQUs7MEJBU0wsS0FBSzswQkFTTCxLQUFLO3VDQVNMLEtBQUs7aUNBU0wsS0FBSztvQkFTTCxLQUFLOzBCQVNMLEtBQUs7b0JBU0wsS0FBSzsyQkFTTCxLQUFLO21CQVNMLEtBQUs7d0JBVUwsTUFBTTtxQkFJTixNQUFNO3dCQUlOLE1BQU07c0JBSU4sTUFBTTt5QkFJTixNQUFNO3dCQUlOLE1BQU07MEJBSU4sTUFBTTt1QkFJTixNQUFNO3lCQUlOLE1BQU07eUJBSU4sTUFBTTswQkFJTixNQUFNOzRCQUlOLE1BQU07d0JBSU4sTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdpbmRvdyB9IGZyb20gJy4vLi4vaW5kZXgnO1xyXG5pbXBvcnQgeyBBbmltYXRpb24sIFdpbmRvd0F1dG9DYXBpdGFsaXplLCBXaW5kb3dEaXNwbGF5TW9kZSwgV2luZG93RHJvcFBvc2l0aW9uLCBXaW5kb3dGb290ZXJQb3NpdGlvbiwgVGFiUG9zaXRpb24sIFdpbmRvd1Jlc2l6ZU1vZGUsIFRhYlNlbGVjdGlvbk1vZGUsIFdpbmRvd1RhYkNsb3NlQnV0dG9uTW9kZSwgT3ZlcmZsb3csIExheW91dFBvc2l0aW9uLCBPcmllbnRhdGlvbiwgV2luZG93V3JhcCwgRWxlbWVudFJlbmRlck1vZGV9IGZyb20gJy4vLi4vaW5kZXgnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIERpcmVjdGl2ZSwgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJhc2VFbGVtZW50LCBTbWFydCB9IGZyb20gJy4vc21hcnQuZWxlbWVudCc7XHJcbmV4cG9ydCB7IEFuaW1hdGlvbiwgV2luZG93QXV0b0NhcGl0YWxpemUsIFdpbmRvd0Rpc3BsYXlNb2RlLCBXaW5kb3dEcm9wUG9zaXRpb24sIFdpbmRvd0Zvb3RlclBvc2l0aW9uLCBUYWJQb3NpdGlvbiwgV2luZG93UmVzaXplTW9kZSwgVGFiU2VsZWN0aW9uTW9kZSwgV2luZG93VGFiQ2xvc2VCdXR0b25Nb2RlLCBPdmVyZmxvdywgTGF5b3V0UG9zaXRpb24sIE9yaWVudGF0aW9uLCBXaW5kb3dXcmFwLCBFbGVtZW50UmVuZGVyTW9kZX0gZnJvbSAnLi8uLi9pbmRleCc7XHJcbmV4cG9ydCB7IFNtYXJ0IH0gZnJvbSAnLi9zbWFydC5lbGVtZW50JztcclxuZXhwb3J0IHsgV2luZG93IH0gZnJvbSAnLi8uLi9pbmRleCc7XHJcblxyXG5cclxuQERpcmVjdGl2ZSh7XHJcblx0c2VsZWN0b3I6ICdzbWFydC13aW5kb3csIFtzbWFydC13aW5kb3ddLCBzbWFydC10YWJzLXdpbmRvdywgc21hcnQtcHJvbXB0LXdpbmRvdywgc21hcnQtbXVsdGlsaW5lcHJvbXB0LXdpbmRvdywgc21hcnQtZGlhbG9nLXdpbmRvdywgIHNtYXJ0LWFsZXJ0LXdpbmRvdywgc21hcnQtcHJvZ3Jlc3Mtd2luZG93LCBzbWFydC13YWl0LXdpbmRvdydcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBXaW5kb3dDb21wb25lbnQgZXh0ZW5kcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xyXG5cdGNvbnN0cnVjdG9yKHJlZjogRWxlbWVudFJlZjxXaW5kb3c+KSB7XHJcblx0XHRzdXBlcihyZWYpO1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID0gcmVmLm5hdGl2ZUVsZW1lbnQgYXMgV2luZG93O1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBldmVudEhhbmRsZXJzOiBhbnlbXSA9IFtdO1xyXG5cclxuXHRwdWJsaWMgbmF0aXZlRWxlbWVudDogV2luZG93O1xyXG5cdC8qKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyB0aGUgY29tcG9uZW50IG9uIGRlbWFuZC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydGllcyBBbiBvcHRpb25hbCBvYmplY3Qgb2YgcHJvcGVydGllcywgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byB0aGUgdGVtcGxhdGUgYmluZGVkIG9uZXMuXHJcblx0ICovXHJcblx0cHVibGljIGNyZWF0ZUNvbXBvbmVudChwcm9wZXJ0aWVzID0ge30pOiBhbnkge1xyXG4gICAgXHR0aGlzLm5hdGl2ZUVsZW1lbnQgPSA8V2luZG93PmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NtYXJ0LXdpbmRvdycpO1xyXG5cdFx0Zm9yIChsZXQgcHJvcGVydHlOYW1lIGluIHByb3BlcnRpZXMpIHsgXHJcbiBcdFx0XHR0aGlzLm5hdGl2ZUVsZW1lbnRbcHJvcGVydHlOYW1lXSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTtcclxuXHRcdH1cclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQ7XHJcblx0fVxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiAnQWRkIE5ldycgVGFiIGluc2lkZSB0aGUgVGFicyBlbGVtZW50IGlzIHZpc2libGUuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgYWRkTmV3VGFiKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hZGROZXdUYWIgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBhZGROZXdUYWIodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hZGROZXdUYWIgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBhbmltYXRpb24gbW9kZS4gQW5pbWF0aW9uIGlzIGRpc2FibGVkIHdoZW4gdGhlIHByb3BlcnR5IGlzIHNldCB0byAnbm9uZScgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBhbmltYXRpb24oKTogQW5pbWF0aW9uIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYW5pbWF0aW9uIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgYW5pbWF0aW9uKHZhbHVlOiBBbmltYXRpb24pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hbmltYXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB3aGV0aGVyIGFuZCBob3cgdGhlIHZhbHVlIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNhcGl0YWxpemVkIGFzIGl0IGlzIGVudGVyZWQvZWRpdGVkIGJ5IHRoZSB1c2VyLiBBcHBsaWNhYmxlIG9ubHkgdG8gTXVsdGlsaW5lUHJvbXB0V2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGF1dG9DYXBpdGFsaXplKCk6IFdpbmRvd0F1dG9DYXBpdGFsaXplIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0NhcGl0YWxpemUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBhdXRvQ2FwaXRhbGl6ZSh2YWx1ZTogV2luZG93QXV0b0NhcGl0YWxpemUpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5hdXRvQ2FwaXRhbGl6ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHdoZXRoZXIgZWxlbWVudCB3aWxsIGF1dG8gZXhwYW5kIHdoZW4gdGhlIGlucHV0IG92ZXJmbG93cyB2ZXJ0aWNhbGx5LiBBcHBsaWNhYmxlIG9ubHkgdG8gTXVsdGlsaW5lUHJvbXB0V2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGF1dG9FeHBhbmQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmF1dG9FeHBhbmQgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBhdXRvRXhwYW5kKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuYXV0b0V4cGFuZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBsYWJlbCBmb3IgdGhlICdjYW5jZWwnIGJ1dHRvbiBpbnNpZGUgdGhlIFByb21wdCBXaW5kb3cuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgY2FuY2VsTGFiZWwoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2FuY2VsTGFiZWwgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBjYW5jZWxMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2FuY2VsTGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgbGFiZWwgZm9yIHRoZSAnQ29tcGxldGUnIGJ1dHRvbiBpbnNpbmRlIHRoZSBQcm9ncmVzcyBXaW5kb3cuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgY29tcGxldGVMYWJlbCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb21wbGV0ZUxhYmVsIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgY29tcGxldGVMYWJlbCh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29tcGxldGVMYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBsYWJlbCBmb3IgdGhlICdDb25maXJtJyBidXR0b24gaW5zaW5kZSB0aGUgUHJvbXB0IFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBjb25maXJtTGFiZWwoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29uZmlybUxhYmVsIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgY29uZmlybUxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5jb25maXJtTGFiZWwgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIGNvbGxhcHNlZCBvciBub3QuIFdoZW4gY29sbGFwc2VkIHRoZSBvbmx5IHRoZSBoZWFkZXIgb2YgdGhlIHdpbmRvdyBpcyB2aXNpYmxlLiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29sbGFwc2VkIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgY29sbGFwc2VkKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY29sbGFwc2VkID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFdoZW4gYSBtb2RhbCB3aW5kb3cgaXMgb3BlbmVkLCB0aGlkIHByb3BlcnR5IGRldGVybWluZXMgaWYgY2xpY2tpbmcgb24gdGhlIG1hc2sgY2xvc2VzIHRoZSB3aW5kb3cgb3Igbm90LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGNsb3NlT25NYXNrQ2xpY2soKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmNsb3NlT25NYXNrQ2xpY2sgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBjbG9zZU9uTWFza0NsaWNrKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuY2xvc2VPbk1hc2tDbGljayA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSBkYXRhIHNvdXJjZSB0aGF0IHdpbGwgYmUgbG9hZGVkIHRvIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBkYXRhU291cmNlKCk6IHtsYWJlbDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmd9W10ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kYXRhU291cmNlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgZGF0YVNvdXJjZSh2YWx1ZToge2xhYmVsOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZ31bXSkge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRhdGFTb3VyY2UgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlZCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgd2luZG93IHNuYXBwaW5nIGZlYXR1cmUuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgZGlzYWJsZVNuYXAoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc2FibGVTbmFwIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgZGlzYWJsZVNuYXAodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kaXNhYmxlU25hcCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGhvdyB0aGUgY2hhcmFjdGVycyBhcmUgZGlzcGxheWVkIGluc2lkZSB0aGUgaW5wdXQuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBkaXNwbGF5TW9kZSgpOiBXaW5kb3dEaXNwbGF5TW9kZSB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRpc3BsYXlNb2RlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgZGlzcGxheU1vZGUodmFsdWU6IFdpbmRvd0Rpc3BsYXlNb2RlKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZGlzcGxheU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuICBEZXRlcm1pbmVzIHdoZXJlIHRoZSB3aW5kb3coaXQncyB0YWIgaXRlbXMgYXMgd2VsbCkgY2FuIGJlIGRyb3BwZWQgaW5zaWRlIHRoZSBEb2NraW5nTGF5b3V0LiAgVGhlIHByb3BlcnR5IGlzIGFuIGFycmF5IHRoYXQgYWNjZXB0cyBtdWx0aXBsZSBwb3NpdGlvbnMuIE5vdGU6IFBvc2l0aW9ucyB3aXRoIHByZWZpeCAnbGF5b3V0LScgYXJlIGFwcGxpZWQgdG8gdGhlIFRhYiBpdGVtIGNoaWxkcmVuIG9mIHRoZSBUYWJzV2lkbm93IG93bmVyIHRoYXQgaXMgYmVpbmcgZHJhZ2dlZC4gVGhlIHJlc3Qgb2YgdGhlIHBvc2l0aW9ucyBpbmRpY2F0ZSB0aGUgYWxsb3dlZCBkcm9wIHBvc2l0aW9uIGluc2lkZSB0aGUgaG92ZXJlZCB0YXJnZXQoVGFic1dpbmRvdykuIFVzZWQgb25seSBieSBqcXhEb2NraW5nTGF5b3V0IGN1c3RvbSBlbGVtZW50cy4gRGV0ZXJtaW5lcyB0aGUgcG9zc2libGUgZHJvcCBwb3NpdGlvbiBpbnNpZGUgdGhlIERvY2tpbmdMYXlvdXQuIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBhbGxvd2VkLiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGRyb3BQb3NpdGlvbigpOiBXaW5kb3dEcm9wUG9zaXRpb24ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5kcm9wUG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBkcm9wUG9zaXRpb24odmFsdWU6IFdpbmRvd0Ryb3BQb3NpdGlvbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmRyb3BQb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBBIGNhbGxiYWNrIGZ1bmN0aW9uIGRlZmluaW5nIHRoZSBuZXcgZm9ybWF0IGZvciB0aGUgbGFiZWwgb2YgdGhlIFByb2dyZXNzIEJhci4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzV2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGZvcm1hdEZ1bmN0aW9uKCk6IGFueSB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvcm1hdEZ1bmN0aW9uIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgZm9ybWF0RnVuY3Rpb24odmFsdWU6IGFueSkge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmZvcm1hdEZ1bmN0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmb290ZXIgb2YgdGhlIHdpbmRvdyBlbGVtZW50LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGZvb3RlclBvc2l0aW9uKCk6IFdpbmRvd0Zvb3RlclBvc2l0aW9uIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuZm9vdGVyUG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBmb290ZXJQb3NpdGlvbih2YWx1ZTogV2luZG93Rm9vdGVyUG9zaXRpb24pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJQb3NpdGlvbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIERpYWxvZyBzZWN0aW9uIG9mIHRoZSB3aW5kb3cuIEJ5IGRlZmF1bHQgZm9vdGVyVGVtcGxhdGUgaXMgbnVsbC4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBmb290ZXJUZW1wbGF0ZSgpOiBhbnkge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJUZW1wbGF0ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGZvb3RlclRlbXBsYXRlKHZhbHVlOiBhbnkpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5mb290ZXJUZW1wbGF0ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBTZXQncyB0aGUgYnV0dG9ucyB0aGF0IHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgaGVhZGVyIHNlY3Rpb24uICovXHJcblx0QElucHV0KClcclxuXHRnZXQgaGVhZGVyQnV0dG9ucygpOiBzdHJpbmdbXSB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlckJ1dHRvbnMgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBoZWFkZXJCdXR0b25zKHZhbHVlOiBzdHJpbmdbXSkge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlckJ1dHRvbnMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBEaWFsb2cgc2VjdGlvbiBvZiB0aGUgd2luZG93LiBCeSBkZWZhdWx0IGhlYWRlclRlbXBsYXRlIGlzIG51bGwuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgaGVhZGVyVGVtcGxhdGUoKTogYW55IHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyVGVtcGxhdGUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBoZWFkZXJUZW1wbGF0ZSh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaGVhZGVyVGVtcGxhdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIGhlYWRlciBvZiB0aGUgd2luZG93IGVsZW1lbnQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgaGVhZGVyUG9zaXRpb24oKTogVGFiUG9zaXRpb24ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oZWFkZXJQb3NpdGlvbiA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGhlYWRlclBvc2l0aW9uKHZhbHVlOiBUYWJQb3NpdGlvbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhlYWRlclBvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgYWRkaXRpb25hbCBoZWxwZXIgdGV4dCBiZWxvdyB0aGUgdGV4dCBib3guIFRoZSBoaW50IGlzIHZpc2libGUgb25seSB3aGVuIHRoZSB0ZXh0IGJveCBpcyBmb2N1ZWQuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBoaW50KCk6IGFueSB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmhpbnQgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBoaW50KHZhbHVlOiBhbnkpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5oaW50ID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBQcm9ncmVzcyBiYXIgdG8gaW5kZXRlcm1pbmF0ZSBzdGF0ZShudWxsKSBhbmQgc3RhcnRzIHRoZSBhbmltYXRpb24uIEFwcGxpY2FibGUgb25seSB0byBQcm9ncmVzc1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBpbmRldGVybWluYXRlKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbmRldGVybWluYXRlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgaW5kZXRlcm1pbmF0ZSh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZmlsbGluZyBkaXJlY3Rpb24gb2YgdGhlIFByb2dyZXNzIEJhci4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzV2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGludmVydGVkKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pbnZlcnRlZCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGludmVydGVkKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuaW52ZXJ0ZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhlIGxhYmVsIG9mIHRoZSB3aW5kb3cgdGhhdCBhcHBlYXJzIGluIHRoZSBoZWFkZXIgYXJlYS4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBsYWJlbCgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYWJlbCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGxhYmVsKHZhbHVlOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sYWJlbCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBXaGVuIGVuYWJsZWQgdGhlIHJlc2l6aW5nIG9wZXJhdGlvbiBoYXBwZW5zIGxpdmUuIEJ5IGRlZmF1bHQgaXQncyBub3QgZW5hYmxlZCBhbmQgZHVyaW5nIHJlc2l6aW5nIGEgaGlnaGxpZ2h0ZXIgYXJvdW5kIHRoZSBlZGdlcyBvZiB0aGUgd2luZG93IGFwcGVhcnMgdG8gb3V0bGluZSAgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgZWxlbWVudC4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBsaXZlUmVzaXplKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5saXZlUmVzaXplIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgbGl2ZVJlc2l6ZSh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxpdmVSZXNpemUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cgd2hlbiB1c2VkIHdpdGggYSBEb2NraW5nTGF5b3V0IGN1c3RvbSBlbGVtZW50LlVzZWQgb25seSBieSBqcXhEb2NraW5nTGF5b3V0LiBEZXRlcm1pbmVzIHRoZSBvd25lciBqcXhEb2NraW5nTGF5b3V0ICB0aGF0IHRoZSB3aW5kb3cgYmVsb25ncyB0by4gV2hlbiB0aGUgdGFic1dpbmRvdyBoYXMgYmVlbiByZW1vdmVkIGZyb20gYSBEb2NraW5nTGF5b3V0IGVsZW1lbnQsIHRoZSBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgaXQgYmVsb25ncyB0byB0aGF0IHBhcnRpY3VsYXIgRG9ja2luZ2xheW91dC4gQWNjZXB0cyBhIHN0cmluZywgcmVwcmVzZW50aW5nIHRoZSBJRCBvZiBhIGpxeERvY2tpbmdMYXlvdXQgb24gdGhlIHBhZ2UsIG9yIGFuIGluc3RhbmNlIG9mIGpxeERva2NpbmdMYXlvdXQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgbGF5b3V0KCk6IGFueSB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxheW91dCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGxheW91dCh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubGF5b3V0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgbGFuZ3VhZ2UuIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJvcGVydHkgbWVzc2FnZXMuICAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGxvY2FsZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5sb2NhbGUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBsb2NhbGUodmFsdWU6IHN0cmluZykge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdyB3aGVuIGRvY2tlZCBpbnNpZGUgYSBEb2NraW5nTGF5b3V0IEN1c3RvbSBFbGVtZW50LkRldGVybWluZXMgb2YgdGhlIGl0ZW0gY2FuIGJlIHJlc2l6ZWQgb3Igbm90LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGxvY2tlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9ja2VkIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgbG9ja2VkKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9ja2VkID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIENhbGxiYWNrLCByZWxhdGVkIHRvIGxvY2FsaXphdGlvbiBtb2R1bGUuICAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IGxvY2FsaXplRm9ybWF0RnVuY3Rpb24oKTogYW55IHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubG9jYWxpemVGb3JtYXRGdW5jdGlvbiA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IGxvY2FsaXplRm9ybWF0RnVuY3Rpb24odmFsdWU6IGFueSkge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LmxvY2FsaXplRm9ybWF0RnVuY3Rpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIG1heGltaXplZCBvciBub3QuIFdoZW4gbWF4aW1pemVkIHRoZSB3aW5kb3cgY292ZXJzIHRoZSB3aG9sZSB2aWV3cG9ydC4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBtYXhpbWl6ZWQoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplZCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IG1heGltaXplZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heGltaXplZCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgYW4gb2JqZWN0IHNwZWNpZnlpbmcgc3RyaW5ncyB1c2VkIGluIHRoZSB3aWRnZXQgdGhhdCBjYW4gYmUgbG9jYWxpemVkLiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHByb3BlcnR5IGxvY2FsZS4gICovXHJcblx0QElucHV0KClcclxuXHRnZXQgbWVzc2FnZXMoKTogYW55IHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBtZXNzYWdlcyh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWVzc2FnZXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIG1vZGFsIG9yIG5vdC4gSWYgdHJ1ZSB0aGUgdXNlciBjYW4gb25seSBpbnRlcmFjdCB3aXRoIHRoZSB3aW5kb3cgYW5kIG5vdGhpbmcgZWxzZSBvbiB0aGUgcGFnZS4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBtb2RhbCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubW9kYWwgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBtb2RhbCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1vZGFsID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEFwcGxpY2FibGUgdG8gVGFic1dpbmRvdyB3aGVuIGRvY2tlZCBpbnNpZGUgYSBEb2NraW5nTGF5b3V0IEN1c3RvbSBFbGVtZW50LiBEZXRlcm1pbmVzIHRoZSBtYXggc2l6ZSBvZiB0aGUgaXRlbS4gQXBwbGljYWJsZSB0byBQcm9ncmVzcyBXaW5kb3cgYnkgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBvZiB0aGUgUHJvZ3Jlc3NCYXIuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgbWF4KCk6IHN0cmluZyB8IG51bWJlciB8IG51bGwge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXggOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBtYXgodmFsdWU6IHN0cmluZyB8IG51bWJlciB8IG51bGwpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBEb2NraW5nTGF5b3V0IEN1c3RvbSBFbGVtZW50LiBEZXRlcm1pbmVzIHRoZSBtaW4gc2l6ZSBvZiB0aGUgaXRlbS4gQXBwbGljYWJsZSB0byBQcm9ncmVzcyBXaW5kb3cgYnkgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgbWluaW11IG9mIHRoZSBQcm9ncmVzc0Jhci4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBtaW4oKTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbiA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IG1pbih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1pbiA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSB3aW5kb3cgaXMgbWluaW1pemVkIG9yIG5vdC4gV2hlbiBtaW5pbWl6ZWQgdGhlIHdpbmRvdyBpcyBkb2NrZWQgYXQgdGhlIGJvdHRvbSBsZWZ0IGNvcm5lciBvZiB0aGUgdmlld3BvcnQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgbWluaW1pemVkKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZWQgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBtaW5pbWl6ZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIHVzZXIgY2FuIGVudGVyLiBBcHBsaWNhYmxlIHRvIFByb21wdC9NdWx0aWxpbmVQcm9tcHQgV2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IG1heExlbmd0aCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5tYXhMZW5ndGggOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBtYXhMZW5ndGgodmFsdWU6IG51bWJlcikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50Lm1heExlbmd0aCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBTZXRzIG9yIGdldHMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgdXNlciBoYXZlIHRvIGVudGVyIHRvIHRyaWdnZXIgdGhlIGF1dG8gY29tcGxldGUgZnVuY3Rpb25hbGl0eS4gQXBwbGljYWJsZSB0byBQcm9tcHQvTXVsdGlsaW5lUHJvbXB0IFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBtaW5MZW5ndGgoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQubWluTGVuZ3RoIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgbWluTGVuZ3RoKHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5taW5MZW5ndGggPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgd2luZG93IGlzIHZpc2libGUgb3Igbm90LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IG9wZW5lZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgb3BlbmVkKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQub3BlbmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgaWYgdGhlIHdpbmRvdyBpcyBwaW5uZWQgb3Igbm90LiBQaW5uZWQgd2luZG93IGlzIGEgd2luZG93IHRoYXQgY2FuJ3QgYmUgZHJhZ2dlZCBidXQgY2FuIGJlIHJlc2l6ZWQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcGlubmVkKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5waW5uZWQgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBwaW5uZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5waW5uZWQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgaW5wdXQncyBwbGFjZWhvbGRlci4gQXBwbGljYWJsZSB0byBQcm9tcHQgV2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgcGxhY2Vob2xkZXIodmFsdWU6IHN0cmluZykge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnBsYWNlaG9sZGVyID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGxhYmVsIGZvciB0aGUgSW5wdXQgaW5zaW5kZSB0aGUgUHJvbXB0V2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHByb21wdExhYmVsKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnByb21wdExhYmVsIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgcHJvbXB0TGFiZWwodmFsdWU6IHN0cmluZykge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnByb21wdExhYmVsID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIElmIHRoZSBlbGVtZW50IGlzIHJlYWRvbmx5LCB1c2VycyBjYW5ub3QgaW50ZXJhY3Qgd2l0aCBpdC4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByZWFkb25seSgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVhZG9ubHkgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCByZWFkb25seSh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlYWRvbmx5ID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFdoZW4gYXBwbGllZCBhIHJlc2l6ZSBpbmRpY2F0b3IgaXMgZGlzcGxheWVkIGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyIG9mIHRoZSB3aW5kb3cgYW5kIHJlc2l6aW5nIG9wZXJhdGlvbiBjYW4gYmUgaW5pdGlhdGVkIG9ubHkgZnJvbSBpdHMgcG9zaXRpb24uICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcmVzaXplSW5kaWNhdG9yKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVJbmRpY2F0b3IgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCByZXNpemVJbmRpY2F0b3IodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVJbmRpY2F0b3IgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgcmVzaXppbmcgbW9kZSBvZiB0aGUgd2luZG93LiAgU2V2ZXJhbCBtb2RlcyBhcmUgYXZhaWxhYmxlOiAgIG5vbmUgLSByZXNpemluZyBpcyBkaXNhYmxlZC4gIHZlcnRpY2FsIC0gdmVydGljYWwgcmVzaXppbmcgaXMgYWxsb3dlZC4gIGhvcml6b250YWwgLSBob3Jpem9udGFsIHJlc2l6aW5nIGlzIGFsbG93ZWQuIGJvdGggLSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCByZXNpemluZyBpcyBhbGxvd2VkLiB0b3AgLSB0aGUgd2luZG93IGNhbiBvbmx5IGJlIHJlc2l6ZWQgZnJvbSB0aGUgdG9wIHNpZGUuIGJvdHRvbSAtIHRoZSB3aW5kb3cgaXMgcmVzaXphYmxlIG9ubHkgZnJvbSB0aGUgYm90dG9tIHNpZGUuIGxlZnQgLSB0aGUgd2luZG93IGNhbiBiZSByZXNpemVkIG9ubHkgZnJvbSB0aGUgbGVmdCBzaWRlLiByaWdodCAtIHRoZSB3aW5kb3cgY2FuIGJlIHJlc2l6ZWQgb25seSBmcm9tIHRoZSByaWdodCBzaWRlLiAgKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByZXNpemVNb2RlKCk6IFdpbmRvd1Jlc2l6ZU1vZGUge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5yZXNpemVNb2RlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgcmVzaXplTW9kZSh2YWx1ZTogV2luZG93UmVzaXplTW9kZSkge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlc2l6ZU1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgYWxpZ25lZCB0byBzdXBwb3J0IGxvY2FsZXMgdXNpbmcgcmlnaHQtdG8tbGVmdCBmb250cy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByaWdodFRvTGVmdCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmlnaHRUb0xlZnQgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCByaWdodFRvTGVmdCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJpZ2h0VG9MZWZ0ID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGF0IHRoZSB1c2VyIG11c3QgZmlsbCB0aGUgaW5wdXQgYmVmb3JlIHN1Ym1pdHRpbmcgYSBmb3JtIHdpdGggdGhlIHRleHQgYm94LkFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWQgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCByZXF1aXJlZCh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0aGF0IHdpbGwgYXBwZWFyIGlmIHJlcXVpcmVkIGlzIHNldCBhbmQgbm8gdmFsdWUgaXMgcHJvdmlkZWQgaW4gdGhlIGlucHV0LiBBcHBsaWNhYmxlIHRvIFByb21wdCBXaW5kb3cuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgcmVxdWlyZWRNZXNzYWdlKCk6IHN0cmluZyB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnJlcXVpcmVkTWVzc2FnZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHJlcXVpcmVkTWVzc2FnZSh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQucmVxdWlyZWRNZXNzYWdlID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgd2hldGhlciB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgd2lsbCBiZSBzZWxlY3RlZCBvbiBmb2N1cyBvciBub3QuIEFwcGxpY2FibGUgdG8gUHJvbXB0IFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBzZWxlY3RBbGxPbkZvY3VzKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RBbGxPbkZvY3VzIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgc2VsZWN0QWxsT25Gb2N1cyh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNlbGVjdEFsbE9uRm9jdXMgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHdoaWNoIHRhYiBpcyBzZWxlY3RlZC4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgc2VsZWN0ZWRJbmRleCgpOiBudW1iZXIgfCBudWxsIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRJbmRleCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHNlbGVjdGVkSW5kZXgodmFsdWU6IG51bWJlciB8IG51bGwpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3RlZEluZGV4ID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHdheSB0aGUgdXNlciBjYW4gc3dpdGNoIGJldHdlZW4gdGFicy4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgc2VsZWN0aW9uTW9kZSgpOiBUYWJTZWxlY3Rpb25Nb2RlIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uTW9kZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHNlbGVjdGlvbk1vZGUodmFsdWU6IFRhYlNlbGVjdGlvbk1vZGUpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25Nb2RlID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBzZWxlY3Rpb25FbmQoKTogbnVtYmVyIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uRW5kIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgc2VsZWN0aW9uRW5kKHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25FbmQgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5kaWNhdGVzIHRoZSBpbmRleCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBzZWxlY3Rpb25TdGFydCgpOiBudW1iZXIge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHNlbGVjdGlvblN0YXJ0KHZhbHVlOiBudW1iZXIpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBFbmFibGVzL0Rpc2FibGVkIHRoZSBsYWJlbCBmb3IgdGhlIFByb2dyZXNzIEJhci4gQXBwbGljYWJsZSBvbmx5IHRvIFByb2dyZXNzIFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBzaG93UHJvZ3Jlc3NWYWx1ZSgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2hvd1Byb2dyZXNzVmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBzaG93UHJvZ3Jlc3NWYWx1ZSh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNob3dQcm9ncmVzc1ZhbHVlID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEEgZ2V0dGVyIHRoYXQgcmV0dXJucyB0aGUgc2libGluZ3MgKHRoYXQgc2hhcmUgdGhlIHNhbWUgcGFyZW50KSBvZiBhIExheW91dFBhbmVsIGl0ZW0gdGhhdCBpcyBkb2NrZWQgaW5zaWRlIGEgRG9ja2luZ0xheW91dC4gVGhlIHNpYmxpbmdzIGFyZSBhbHNvIERvY2tpbmdMYXlvdXQgaXRlbXMgKCBMYXlvdXRQYW5lbHMpLkFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93IHdoZW4gZG9ja2VkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgc2libGluZ3MoKTogYW55IHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2libGluZ3MgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCBzaWJsaW5ncyh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2libGluZ3MgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwbGljYWJsZSB0byBUYWJzV2luZG93IHdoZW4gbmVzdGVkIGluc2lkZSBhIERvY2tpbmdMYXlvdXQgQ3VzdG9tIEVsZW1lbnQuIERldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGl0ZW0uICovXHJcblx0QElucHV0KClcclxuXHRnZXQgc2l6ZSgpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zaXplIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgc2l6ZSh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQuc2l6ZSA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBTcGVjaWZpZXMgd2hldGhlciB0aGUgZWxlbWVudCBpcyB0byBoYXZlIGl0cyBzcGVsbGluZyBhbmQgZ3JhbW1hciBjaGVja2VkIG9yIG5vdC4gQXBwbGljYWJsZSBvbmx5IHRvIE11bHRpbGluZVByb21wdFdpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCBzcGVsbENoZWNrKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5zcGVsbENoZWNrIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgc3BlbGxDaGVjayh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnNwZWxsQ2hlY2sgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHdoZXRoZXIgY2xvc2UgYnV0dG9ucyBhcmUgZGlzcGxheWVkIGluc2lkZSB0aGUgVGFiIFN0cmlwIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCB0YWJDbG9zZUJ1dHRvbnMoKTogYm9vbGVhbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYkNsb3NlQnV0dG9ucyA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHRhYkNsb3NlQnV0dG9ucyh2YWx1ZTogYm9vbGVhbikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYkNsb3NlQnV0dG9ucyA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSBjbG9zZSBidXR0b24gaXMgdmlzaWJsZSBvbiBzZWxlY3Qgb3IgYWx3YXlzLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCB0YWJDbG9zZUJ1dHRvbk1vZGUoKTogV2luZG93VGFiQ2xvc2VCdXR0b25Nb2RlIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiQ2xvc2VCdXR0b25Nb2RlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgdGFiQ2xvc2VCdXR0b25Nb2RlKHZhbHVlOiBXaW5kb3dUYWJDbG9zZUJ1dHRvbk1vZGUpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJDbG9zZUJ1dHRvbk1vZGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBUYWJzIHNjcm9sbCBidXR0b25zIGJlaGF2aW9yLiBBcHBsaWNhYmxlIG9ubHkgd2hlbiB0YWJMYXlvdXQgaXMgJ3Njcm9sbCcuIEFwcGxpY2FibGUgb25seSB0byBUYWJzV2luZG93LiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHRhYk92ZXJmbG93KCk6IE92ZXJmbG93IHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiT3ZlcmZsb3cgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCB0YWJPdmVyZmxvdyh2YWx1ZTogT3ZlcmZsb3cpIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJPdmVyZmxvdyA9IHZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBEZXRldG1pbmVzIFRhYiBTdHJpcCBpcyBwb3NpdGlvbmVkIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCB0YWJQb3NpdGlvbigpOiBUYWJQb3NpdGlvbiB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnRhYlBvc2l0aW9uIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgdGFiUG9zaXRpb24odmFsdWU6IFRhYlBvc2l0aW9uKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiUG9zaXRpb24gPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyBvciBnZXRzIHRoZSBwb3NpdGlvbiBvZiB0aGUgc2Nyb2xsIGJ1dHRvbnMgaW5zaWRlIHRoZSBUYWIgaGVhZGVyIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCB0YWJTY3JvbGxCdXR0b25zUG9zaXRpb24oKTogTGF5b3V0UG9zaXRpb24ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJTY3JvbGxCdXR0b25zUG9zaXRpb24gOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCB0YWJTY3JvbGxCdXR0b25zUG9zaXRpb24odmFsdWU6IExheW91dFBvc2l0aW9uKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiU2Nyb2xsQnV0dG9uc1Bvc2l0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNldHMgb3IgZ2V0cyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHRleHQgaW4gdGhlIHRhYnMgbGFiZWxzIG9mIHRoZSBUYWJzV2luZG93LiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gKi9cclxuXHRASW5wdXQoKVxyXG5cdGdldCB0YWJUZXh0T3JpZW50YXRpb24oKTogT3JpZW50YXRpb24ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC50YWJUZXh0T3JpZW50YXRpb24gOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCB0YWJUZXh0T3JpZW50YXRpb24odmFsdWU6IE9yaWVudGF0aW9uKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGFiVGV4dE9yaWVudGF0aW9uID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIHRoZW1lLiBUaGVtZSBkZWZpbmVzIHRoZSBsb29rIG9mIHRoZSBlbGVtZW50ICovXHJcblx0QElucHV0KClcclxuXHRnZXQgdGhlbWUoKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGhlbWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cdHNldCB0aGVtZSh2YWx1ZTogc3RyaW5nKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudGhlbWUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gSWYgaXMgc2V0IHRvIHRydWUsIHRoZSBlbGVtZW50IGNhbm5vdCBiZSBmb2N1c2VkLiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHVuZm9jdXNhYmxlKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC51bmZvY3VzYWJsZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHVuZm9jdXNhYmxlKHZhbHVlOiBib29sZWFuKSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQudW5mb2N1c2FibGUgPSB2YWx1ZSA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyB0aGUgdmFsdWUgb2YgdGhlIFRleHRCb3gvUHJvZ3Jlc3NCYXIgaW5zaWRlIHRoZSBEaWFsb2cvUHJvbXB0L1Byb2dyZXNzIFdpbmRvdyAqL1xyXG5cdEBJbnB1dCgpXHJcblx0Z2V0IHZhbHVlKCk6IHN0cmluZyB8IG51bWJlciB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlIDogdW5kZWZpbmVkO1xyXG5cdH1cclxuXHRzZXQgdmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIERldGVybWluZXMgdGhlIGFjdHVhbCBwYXJlbnQgb2YgdGhlIGVsZW1lbnQuIFRoZSB3aW5kb3cgY2FuIHNpemUgYW5kIG1vdmUgb25seSBpbiB0aGUgYXJlYSBvZiB0aGF0IGVsZW1lbnQuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgd2luZG93UGFyZW50KCk6IGFueSB7XHJcblx0XHRyZXR1cm4gdGhpcy5uYXRpdmVFbGVtZW50ID8gdGhpcy5uYXRpdmVFbGVtZW50LndpbmRvd1BhcmVudCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHdpbmRvd1BhcmVudCh2YWx1ZTogYW55KSB7XHJcblx0XHR0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud2luZG93UGFyZW50ID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEluZGljYXRlcyBob3cgdGhlIGlucHV0IHdyYXBzIHRleHQuIEFwcGxpY2FibGUgb25seSB0byBNdWx0aWxpbmVQcm9tcHRXaW5kb3cuICovXHJcblx0QElucHV0KClcclxuXHRnZXQgd3JhcCgpOiBXaW5kb3dXcmFwIHtcclxuXHRcdHJldHVybiB0aGlzLm5hdGl2ZUVsZW1lbnQgPyB0aGlzLm5hdGl2ZUVsZW1lbnQud3JhcCA6IHVuZGVmaW5lZDtcclxuXHR9XHJcblx0c2V0IHdyYXAodmFsdWU6IFdpbmRvd1dyYXApIHtcclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC53cmFwID0gdmFsdWUgOiB1bmRlZmluZWQ7XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGp1c3QgYmVmb3JlIHRoZSB3aW5kb3cgc3RhcnRzIG9wZW5pbmcuXHJcblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXHJcblx0QE91dHB1dCgpIG9uT3BlbmluZzogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgb3BlbmVkKCB2aXNpYmxlICkuXHJcblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXHJcblx0QE91dHB1dCgpIG9uT3BlbjogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBqdXN0IGJlZm9yZSB0aGUgd2luZG93IHN0YXJ0cyBjbG9zaW5nLlxyXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xyXG5cdEBPdXRwdXQoKSBvbkNsb3Npbmc6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgd2luZG93IGlzIGNsb3NlZCggaGlkZGVuIClcclxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cclxuXHRAT3V0cHV0KCkgb25DbG9zZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgY29sbGFwc2VkLlxyXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xyXG5cdEBPdXRwdXQoKSBvbkNvbGxhcHNlOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gd2luZG93J3MgZHJhZ2dpbmcgaXMgZW5kZWQuXHJcblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXHJcblx0QE91dHB1dCgpIG9uRHJhZ0VuZDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHdpbmRvdydzIGRyYWdnaW5nIGlzIHN0YXJ0ZWQuXHJcblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXHJcblx0QE91dHB1dCgpIG9uRHJhZ1N0YXJ0OiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHdpbmRvdyBpcyBleHBhbmRlZC5cclxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cclxuXHRAT3V0cHV0KCkgb25FeHBhbmQ6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgd2luZG93IGlzIG1heGltaXplZC5cclxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cclxuXHRAT3V0cHV0KCkgb25NYXhpbWl6ZTogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgbWluaW1pemVkLlxyXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xyXG5cdEBPdXRwdXQoKSBvbk1pbmltaXplOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gd2luZG93J3MgcmVzaXppbmcgaXMgZW5kZWQuXHJcblx0KiAgQHBhcmFtIGV2ZW50LiBUaGUgY3VzdG9tIGV2ZW50LiBcdCovXHJcblx0QE91dHB1dCgpIG9uUmVzaXplRW5kOiBFdmVudEVtaXR0ZXI8Q3VzdG9tRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gd2luZG93J3MgcmVzaXppbmcgaXMgc3RhcnRlZC5cclxuXHQqICBAcGFyYW0gZXZlbnQuIFRoZSBjdXN0b20gZXZlbnQuIFx0Ki9cclxuXHRAT3V0cHV0KCkgb25SZXNpemVTdGFydDogRXZlbnRFbWl0dGVyPEN1c3RvbUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcblx0LyoqIEBkZXNjcmlwdGlvbiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzdG9yZWQgdG8gaXQncyBwcmV2aW91cyBzdGF0ZSBiZWZvcmUgbWF4aW1pemF0aW9uLlxyXG5cdCogIEBwYXJhbSBldmVudC4gVGhlIGN1c3RvbSBldmVudC4gXHQqL1xyXG5cdEBPdXRwdXQoKSBvblJlc3RvcmU6IEV2ZW50RW1pdHRlcjxDdXN0b21FdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQXBwZW5kcyBhIHRhYml0ZW0gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBvZiB0YWIgaXRlbXMgaW5zaWRlIGVsZW1lbnQuIFxyXG5cdCogQHBhcmFtIHtOb2RlfSBub2RlLiBBIFRhYkl0ZW0gZWxlbWVudCB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmVzdCBvZiB0aGUgaXRlbXMgYXMgdGhlIGxhc3QgaXRlbS5cclxuXHQqIEByZXR1cm5zIHtOb2RlfVxyXG4gICovXHJcblx0cHVibGljIGFzeW5jIGFwcGVuZENoaWxkKG5vZGUpOiBQcm9taXNlPGFueT4ge1xyXG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgd2luZG93IHRvIHRoZSB0b3AgbGV2ZWwgc28gdGhlIHVzZXIgY2FuIGludGVyYWN0IHdpdGggaXQuIFxyXG5cdCovXHJcbiAgICBwdWJsaWMgYnJpbmdUb0Zyb250KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuYnJpbmdUb0Zyb250KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmJyaW5nVG9Gcm9udCgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2xlYXJzIHRoZSBjb250ZW50IG9mIHRoZSBXaW5kb3cuIFxyXG5cdCovXHJcbiAgICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGVhcigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbGVhcigpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQ2xvc2VzIHRoZSB3aW5kb3cuIFxyXG5cdCovXHJcbiAgICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5jbG9zZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gQ29sbGFwc2VzIHRoZSB3aW5kb3cuIFxyXG5cdCogQHJldHVybnMge0hUTUxFbGVtZW50fVxyXG4gICovXHJcblx0cHVibGljIGFzeW5jIGNvbGxhcHNlKCk6IFByb21pc2U8YW55PiB7XHJcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50LmNvbGxhcHNlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIE1ha2VzIHN1cmUgYSB0YWIgaXRlbSBpcyB2aXNpYmxlIGJ5IHNjcm9sbGluZyB0byBpdC4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuIFxyXG5cdCogQHBhcmFtIHtudW1iZXJ9IGluZGV4LiBUaGUgaW5kZXggb2YgdGhlIHRhYiB0byBzY3JvbGwgdG8uXHJcblx0Ki9cclxuICAgIHB1YmxpYyBlbnN1cmVWaXNpYmxlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LmVuc3VyZVZpc2libGUoaW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5lbnN1cmVWaXNpYmxlKGluZGV4KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEV4cGFuZHMgdGhlIHdpbmRvdyBhZnRlciBiZWluZyBjb2xsYXBzZWQuIFxyXG5cdCogQHJldHVybnMge2FueVtdfVxyXG4gICovXHJcblx0cHVibGljIGFzeW5jIGV4cGFuZCgpOiBQcm9taXNlPGFueT4ge1xyXG5cdFx0Y29uc3QgZ2V0UmVzdWx0T25SZW5kZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubmF0aXZlRWxlbWVudC5leHBhbmQoKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gSW5zZXJ0cyBhIG5ldyB0YWIgYW5kIGFuIGFzc29jaWF0ZWQgY29udGVudCBzZWN0aW9uLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXHJcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCB0byBpbnNlcnQgYSBuZXcgdGFiIGF0LlxyXG5cdCogQHBhcmFtIHthbnl9IGRldGFpbHMuIEFuIE9iamVjdCB3aXRoIHRoZSBmaWVsZHMgXCJsYWJlbFwiLCBcImxhYmVsU2l6ZVwiLCBcImNvbnRlbnRcIiBhbmQgXCJncm91cFwiLlxyXG5cdCovXHJcbiAgICBwdWJsaWMgaW5zZXJ0KGluZGV4OiBudW1iZXIsIGRldGFpbHM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0KGluZGV4LCBkZXRhaWxzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQuaW5zZXJ0KGluZGV4LCBkZXRhaWxzKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEluc2VydHMgdGhlIHNwZWNpZmllZCBcInNtYXJ0LXRhYi1pdGVtXCIgbm9kZSBiZWZvcmUgdGhlIHJlZmVyZW5jZSBcInNtYXJ0LXRhYi1pdGVtXCIgbm9kZS4gQXBwbGljYWJsZSBvbmx5IHRvIFRhYnNXaW5kb3cuIFxyXG5cdCogQHBhcmFtIHtOb2RlfSBuZXdOb2RlLiBUaGUgXCJzbWFydC10YWItaXRlbVwiIG5vZGUgdG8gaW5zZXJ0LlxyXG5cdCogQHBhcmFtIHtOb2RlIHwgbnVsbH0gcmVmZXJlbmNlTm9kZT8uIFRoZSBcInNtYXJ0LXRhYi1pdGVtXCIgbm9kZSBiZWZvcmUgd2hpY2ggbmV3Tm9kZSBpcyBpbnNlcnRlZC5cclxuXHQqIEByZXR1cm5zIHtOb2RlfVxyXG4gICovXHJcblx0cHVibGljIGFzeW5jIGluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlPyk6IFByb21pc2U8YW55PiB7XHJcblx0XHRjb25zdCBnZXRSZXN1bHRPblJlbmRlciA9ICgpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uYXRpdmVFbGVtZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZlcmVuY2VOb2RlKTtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFJlc3VsdE9uUmVuZGVyKCk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIHRhYiBhbmQgaXRzIGFzc29jaWF0ZWQgY29udGVudCBzZWN0aW9uLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXHJcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHJlbW92ZS5cclxuXHQqL1xyXG4gICAgcHVibGljIHJlbW92ZUF0KGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlbW92ZUF0KGluZGV4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQXQoaW5kZXgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBhIGNoaWxkIFwic21hcnQtdGFiLWl0ZW1cIiBub2RlLiBBcHBsaWNhYmxlIG9ubHkgdG8gVGFic1dpbmRvdy4gXHJcblx0KiBAcGFyYW0ge05vZGV9IG5vZGUuIFRoZSBcInNtYXJ0LXRhYi1pdGVtXCIgbm9kZSB0byByZW1vdmUuXHJcblx0KiBAcmV0dXJucyB7Tm9kZX1cclxuICAqL1xyXG5cdHB1YmxpYyBhc3luYyByZW1vdmVDaGlsZChub2RlKTogUHJvbWlzZTxhbnk+IHtcclxuXHRcdGNvbnN0IGdldFJlc3VsdE9uUmVuZGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucmVtb3ZlQ2hpbGQobm9kZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHQpXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRSZXN1bHRPblJlbmRlcigpO1xyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIE1heGltaXplcyB0aGUgd2luZG93IHRvIGZpbGwgdGhlIGFyZWEuIFxyXG5cdCovXHJcbiAgICBwdWJsaWMgbWF4aW1pemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5tYXhpbWl6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5tYXhpbWl6ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gTWluaW1pemVzIHRoZSB3aW5kb3cuIFxyXG5cdCovXHJcbiAgICBwdWJsaWMgbWluaW1pemUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5taW5pbWl6ZSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gT3BlbnMgdGhlIHdpbmRvdyBcclxuXHQqL1xyXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5vcGVuKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50Lm9wZW4oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFBpbnMgdGhlIHdpbmRvdy4gRGlzYWJsZXMgd2luZG93IGRyYWdnaW5nLiBcclxuXHQqL1xyXG4gICAgcHVibGljIHBpbigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmlzUmVuZGVyZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnBpbigpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5waW4oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFJlc3RvcmVzIHRoZSB3aW5kb3cgdG8gaXQncyBwcmV2aW91cyBzaXplIGJlZm9yZSBtYXhpbWl6YXRpb24vbWluaW1pemF0aW9uLiBcclxuXHQqL1xyXG4gICAgcHVibGljIHJlc3RvcmUoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5yZXN0b3JlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC53aGVuUmVuZGVyZWQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LnJlc3RvcmUoKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFNlbGVjdHMgYSB0YWIuICBBcHBsaWNhbGJlIG9ubHkgdG8gVGFic1dpbmRvdyBlbGVtZW50cy4gXHJcblx0KiBAcGFyYW0ge251bWJlcn0gaW5kZXguIFRoZSBpbmRleCBvZiB0aGUgdGFiIHRvIHNlbGVjdC5cclxuXHQqL1xyXG4gICAgcHVibGljIHNlbGVjdChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3QoaW5kZXgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQud2hlblJlbmRlcmVkKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC5zZWxlY3QoaW5kZXgpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG5cdC8qKiBAZGVzY3JpcHRpb24gVW5waW5zIHRoZSB3aW5kb3cuIEVuYWJsZXMgd2luZG93IGRyYWdnaW5nLiBcclxuXHQqL1xyXG4gICAgcHVibGljIHVucGluKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xyXG4gICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudW5waW4oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudW5waW4oKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFVwZGF0ZXMgYSB0YWIgYW5kIGl0cyBhc3NvY2lhdGVkIGNvbnRlbnQgc2VjdGlvbi4gIEFwcGxpY2FsYmUgb25seSB0byBUYWJzV2luZG93IGVsZW1lbnRzLiBcclxuXHQqIEBwYXJhbSB7bnVtYmVyfSBpbmRleC4gVGhlIGluZGV4IG9mIHRoZSB0YWIgdG8gdXBkYXRlLlxyXG5cdCogQHBhcmFtIHtzdHJpbmd9IGxhYmVsLiBUaGUgbmV3IGxhYmVsIG9mIHRoZSB0YWIuIFRoZSB2YWx1ZSBjYW4gYmUgdGhlIGlkIG9mIGFuIEhUTUxUZW1wbGF0ZUVsZW1lbnRcclxuXHQqIEBwYXJhbSB7c3RyaW5nIHwgSFRNTEVsZW1lbnR9IGNvbnRlbnQuIFRoZSBuZXcgY29udGVudCBvZiB0aGUgdGFiLlxyXG5cdCovXHJcbiAgICBwdWJsaWMgdXBkYXRlKGluZGV4OiBudW1iZXIsIGxhYmVsOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyB8IEhUTUxFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF0aXZlRWxlbWVudC51cGRhdGUoaW5kZXgsIGxhYmVsLCBjb250ZW50KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQudXBkYXRlKGluZGV4LCBsYWJlbCwgY29udGVudCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG5cdGdldCBpc1JlbmRlcmVkKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubmF0aXZlRWxlbWVudCA/IHRoaXMubmF0aXZlRWxlbWVudC5pc1JlbmRlcmVkIDogZmFsc2U7XHJcblx0fVxyXG5cclxuXHRuZ09uSW5pdCgpIHtcclxuXHR9XHJcblxyXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuXHJcbiAgICAgIHRoYXQub25DcmVhdGUuZW1pdCh0aGF0Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cclxuXHRcdFNtYXJ0LlJlbmRlcigpO1xyXG5cclxuXHRcdHRoaXMubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzbWFydC1hbmd1bGFyJyk7XHJcblxyXG5cdFx0dGhpcy5uYXRpdmVFbGVtZW50LndoZW5SZW5kZXJlZCgoKSA9PiB7IHRoYXQub25SZWFkeS5lbWl0KHRoYXQubmF0aXZlRWxlbWVudCk7IH0pO1xyXG5cdFx0dGhpcy5saXN0ZW4oKTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCkge1xyXG5cdFx0dGhpcy51bmxpc3RlbigpO1xyXG5cdH1cclxuXHJcblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKHRoaXMubmF0aXZlRWxlbWVudCAmJiB0aGlzLm5hdGl2ZUVsZW1lbnQuaXNSZW5kZXJlZCkge1xyXG5cdFx0XHRmb3IgKGNvbnN0IHByb3BOYW1lIGluIGNoYW5nZXMpIHtcclxuXHRcdFx0XHRpZiAoY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHtcclxuXHRcdFx0XHRcdHRoaXMubmF0aXZlRWxlbWVudFtwcm9wTmFtZV0gPSBjaGFuZ2VzW3Byb3BOYW1lXS5jdXJyZW50VmFsdWU7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIEFkZCBldmVudCBsaXN0ZW5lcnMuICovXHJcblx0cHJpdmF0ZSBsaXN0ZW4oKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdGhhdCA9IHRoaXM7XHJcblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25PcGVuaW5nLmVtaXQoZXZlbnQpOyB9XHJcblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignb3BlbmluZycsIHRoYXQuZXZlbnRIYW5kbGVyc1snb3BlbmluZ0hhbmRsZXInXSk7XHJcblxyXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydvcGVuSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uT3Blbi5lbWl0KGV2ZW50KTsgfVxyXG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pO1xyXG5cclxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2luZ0hhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbkNsb3NpbmcuZW1pdChldmVudCk7IH1cclxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zaW5nJywgdGhhdC5ldmVudEhhbmRsZXJzWydjbG9zaW5nSGFuZGxlciddKTtcclxuXHJcblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uQ2xvc2UuZW1pdChldmVudCk7IH1cclxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10pO1xyXG5cclxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snY29sbGFwc2VIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25Db2xsYXBzZS5lbWl0KGV2ZW50KTsgfVxyXG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbGxhcHNlJywgdGhhdC5ldmVudEhhbmRsZXJzWydjb2xsYXBzZUhhbmRsZXInXSk7XHJcblxyXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydkcmFnRW5kSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uRHJhZ0VuZC5lbWl0KGV2ZW50KTsgfVxyXG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pO1xyXG5cclxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snZHJhZ1N0YXJ0SGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uRHJhZ1N0YXJ0LmVtaXQoZXZlbnQpOyB9XHJcblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ1N0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydkcmFnU3RhcnRIYW5kbGVyJ10pO1xyXG5cclxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snZXhwYW5kSGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uRXhwYW5kLmVtaXQoZXZlbnQpOyB9XHJcblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXhwYW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10pO1xyXG5cclxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1snbWF4aW1pemVIYW5kbGVyJ10gPSAoZXZlbnQ6IEN1c3RvbUV2ZW50KSA9PiB7IHRoYXQub25NYXhpbWl6ZS5lbWl0KGV2ZW50KTsgfVxyXG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21heGltaXplJywgdGhhdC5ldmVudEhhbmRsZXJzWydtYXhpbWl6ZUhhbmRsZXInXSk7XHJcblxyXG5cdFx0dGhhdC5ldmVudEhhbmRsZXJzWydtaW5pbWl6ZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vbk1pbmltaXplLmVtaXQoZXZlbnQpOyB9XHJcblx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbWluaW1pemUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKTtcclxuXHJcblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblJlc2l6ZUVuZC5lbWl0KGV2ZW50KTsgfVxyXG5cdFx0dGhhdC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZUVuZCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplRW5kSGFuZGxlciddKTtcclxuXHJcblx0XHR0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZVN0YXJ0SGFuZGxlciddID0gKGV2ZW50OiBDdXN0b21FdmVudCkgPT4geyB0aGF0Lm9uUmVzaXplU3RhcnQuZW1pdChldmVudCk7IH1cclxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXNpemVTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pO1xyXG5cclxuXHRcdHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzdG9yZUhhbmRsZXInXSA9IChldmVudDogQ3VzdG9tRXZlbnQpID0+IHsgdGhhdC5vblJlc3RvcmUuZW1pdChldmVudCk7IH1cclxuXHRcdHRoYXQubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdyZXN0b3JlJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXN0b3JlSGFuZGxlciddKTtcclxuXHJcblx0fVxyXG5cclxuXHQvKiogQGRlc2NyaXB0aW9uIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMuICovXHJcblx0cHJpdmF0ZSB1bmxpc3RlbigpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10pIHtcclxuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW5pbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5pbmdIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pIHtcclxuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29wZW4nLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ29wZW5IYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pIHtcclxuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Nsb3NpbmcnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NpbmdIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2Nsb3NlSGFuZGxlciddKSB7XHJcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY2xvc2VIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2NvbGxhcHNlSGFuZGxlciddKSB7XHJcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjb2xsYXBzZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snY29sbGFwc2VIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pIHtcclxuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2RyYWdFbmQnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdFbmRIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2RyYWdTdGFydEhhbmRsZXInXSkge1xyXG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ1N0YXJ0JywgdGhhdC5ldmVudEhhbmRsZXJzWydkcmFnU3RhcnRIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ2V4cGFuZEhhbmRsZXInXSkge1xyXG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXhwYW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydleHBhbmRIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ21heGltaXplSGFuZGxlciddKSB7XHJcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtYXhpbWl6ZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snbWF4aW1pemVIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ21pbmltaXplSGFuZGxlciddKSB7XHJcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtaW5pbWl6ZScsIHRoYXQuZXZlbnRIYW5kbGVyc1snbWluaW1pemVIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZUVuZEhhbmRsZXInXSkge1xyXG5cdFx0XHR0aGF0Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplRW5kJywgdGhhdC5ldmVudEhhbmRsZXJzWydyZXNpemVFbmRIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc2l6ZVN0YXJ0SGFuZGxlciddKSB7XHJcblx0XHRcdHRoYXQubmF0aXZlRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemVTdGFydCcsIHRoYXQuZXZlbnRIYW5kbGVyc1sncmVzaXplU3RhcnRIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10pIHtcclxuXHRcdFx0dGhhdC5uYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc3RvcmUnLCB0aGF0LmV2ZW50SGFuZGxlcnNbJ3Jlc3RvcmVIYW5kbGVyJ10pO1xyXG5cdFx0fVxyXG5cclxuXHR9XHJcbn1cclxuIl19
|