@magic-xpa/angular 4.1100.0-dev4110.25 → 4.1100.0-dev4110.252

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/{esm2020 → esm2022}/index.mjs +59 -59
  2. package/{esm2020 → esm2022}/magic-xpa-angular.mjs +1 -1
  3. package/esm2022/src/controls.metadata.model.mjs +183 -0
  4. package/{esm2020 → esm2022}/src/interfaces/sub-form-definition.iterface.mjs +1 -1
  5. package/{esm2020 → esm2022}/src/magic.core.module.mjs +159 -160
  6. package/{esm2020 → esm2022}/src/services/ISubformMagicService.mjs +1 -1
  7. package/esm2022/src/services/OverlayWindowService.mjs +244 -0
  8. package/esm2022/src/services/StylesMapManager.mjs +28 -0
  9. package/esm2022/src/services/accessor.magic.service.mjs +358 -0
  10. package/esm2022/src/services/commands-collector.magic.service.mjs +47 -0
  11. package/esm2022/src/services/component-list.magic.service.mjs +45 -0
  12. package/{esm2020 → esm2022}/src/services/confirmation.components.magic.provider.mjs +21 -21
  13. package/esm2022/src/services/engine.magic.service.mjs +80 -0
  14. package/{esm2020 → esm2022}/src/services/exit.magic.service.mjs +13 -13
  15. package/esm2022/src/services/magic-color.service.mjs +101 -0
  16. package/{esm2020 → esm2022}/src/services/magic.lazy.loader.service.mjs +16 -16
  17. package/{esm2020 → esm2022}/src/services/magic.providers.mjs +24 -24
  18. package/esm2022/src/services/magic.services.mjs +36 -0
  19. package/esm2022/src/services/mg-date-adapter.mjs +108 -0
  20. package/{esm2020 → esm2022}/src/services/overlay.conainer.magic.provider.mjs +14 -14
  21. package/esm2022/src/services/router-commands.magic.service.mjs +31 -0
  22. package/esm2022/src/services/subform.magic.service.mjs +194 -0
  23. package/esm2022/src/services/table.magic.service.mjs +81 -0
  24. package/esm2022/src/services/task.magics.service.mjs +637 -0
  25. package/esm2022/src/services/title.magic.service.mjs +19 -0
  26. package/esm2022/src/ui/GuiInteractiveExecutor.mjs +109 -0
  27. package/esm2022/src/ui/components/base-magic-alert.component.mjs +24 -0
  28. package/esm2022/src/ui/components/base-magic-confirm.component.mjs +24 -0
  29. package/esm2022/src/ui/components/magic-alert.component.mjs +36 -0
  30. package/esm2022/src/ui/components/magic-confirmation-box.component.mjs +42 -0
  31. package/esm2022/src/ui/directives/NonMagicControlDirective.mjs +58 -0
  32. package/esm2022/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +29 -0
  33. package/esm2022/src/ui/directives/magic/checkbox.magic.directive.mjs +29 -0
  34. package/esm2022/src/ui/directives/magic/combobox.magic.directive.mjs +37 -0
  35. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +27 -0
  36. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +85 -0
  37. package/esm2022/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +32 -0
  38. package/esm2022/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +28 -0
  39. package/esm2022/src/ui/directives/magic/nocontrol.magic.directive.mjs +193 -0
  40. package/esm2022/src/ui/directives/magic/row.magic.directive.mjs +62 -0
  41. package/esm2022/src/ui/directives/magic-focus.directive.mjs +20 -0
  42. package/esm2022/src/ui/directives/magic.directive.mjs +229 -0
  43. package/esm2022/src/ui/directives/magicViewContainerRef.directive.mjs +20 -0
  44. package/esm2022/src/ui/directives/mgformat.magic.directive.mjs +579 -0
  45. package/esm2022/src/ui/directives/range-validator.magic.directive.mjs +60 -0
  46. package/{esm2020 → esm2022}/src/ui/magic-confirmationBox.mjs +42 -42
  47. package/{esm2020 → esm2022}/src/ui/magic-modal/base-magic-overlay-container.mjs +22 -22
  48. package/esm2022/src/ui/magic-modal/magic-modal-form.mjs +6 -0
  49. package/{esm2020 → esm2022}/src/ui/magic-modal/magic-modal-interface.mjs +1 -1
  50. package/esm2022/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +124 -0
  51. package/esm2022/src/ui/magic-modal/magic-overlay-container.mjs +162 -0
  52. package/esm2022/src/ui/magic-root.component.mjs +236 -0
  53. package/esm2022/src/ui/mgerror.magic.component.mjs +125 -0
  54. package/esm2022/src/ui/pipes/date.magic.pipe.mjs +106 -0
  55. package/esm2022/src/ui/pipes/time.magic.pipe.mjs +52 -0
  56. package/esm2022/src/ui/pipes/time24.magic.pipe.mjs +35 -0
  57. package/esm2022/src/ui/router-container.magic.component.mjs +115 -0
  58. package/{esm2020 → esm2022}/src/ui/subform.magic.component.mjs +50 -46
  59. package/esm2022/src/ui/task-base.magic.component.mjs +91 -0
  60. package/esm2022/src/ui/utils.mjs +54 -0
  61. package/{fesm2020 → fesm2022}/magic-xpa-angular.mjs +4827 -4444
  62. package/fesm2022/magic-xpa-angular.mjs.map +1 -0
  63. package/index.d.ts +58 -58
  64. package/package.json +10 -16
  65. package/src/controls.metadata.model.d.ts +62 -62
  66. package/src/interfaces/sub-form-definition.iterface.d.ts +12 -12
  67. package/src/magic.core.module.d.ts +41 -41
  68. package/src/services/ISubformMagicService.d.ts +4 -4
  69. package/src/services/OverlayWindowService.d.ts +30 -25
  70. package/src/services/StylesMapManager.d.ts +5 -5
  71. package/src/services/accessor.magic.service.d.ts +69 -69
  72. package/src/services/commands-collector.magic.service.d.ts +15 -15
  73. package/src/services/component-list.magic.service.d.ts +23 -23
  74. package/src/services/confirmation.components.magic.provider.d.ts +8 -8
  75. package/src/services/engine.magic.service.d.ts +27 -27
  76. package/src/services/exit.magic.service.d.ts +6 -6
  77. package/src/services/magic-color.service.d.ts +19 -19
  78. package/src/services/magic.lazy.loader.service.d.ts +6 -6
  79. package/src/services/magic.providers.d.ts +107 -107
  80. package/src/services/magic.services.d.ts +16 -16
  81. package/src/services/mg-date-adapter.d.ts +38 -40
  82. package/src/services/overlay.conainer.magic.provider.d.ts +7 -7
  83. package/src/services/router-commands.magic.service.d.ts +17 -17
  84. package/src/services/subform.magic.service.d.ts +43 -43
  85. package/src/services/table.magic.service.d.ts +30 -30
  86. package/src/services/task.magics.service.d.ts +100 -100
  87. package/src/services/title.magic.service.d.ts +9 -9
  88. package/src/ui/GuiInteractiveExecutor.d.ts +22 -21
  89. package/src/ui/components/base-magic-alert.component.d.ts +10 -10
  90. package/src/ui/components/base-magic-confirm.component.d.ts +10 -10
  91. package/src/ui/components/magic-alert.component.d.ts +6 -6
  92. package/src/ui/components/magic-confirmation-box.component.d.ts +6 -6
  93. package/src/ui/directives/NonMagicControlDirective.d.ts +26 -26
  94. package/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.d.ts +9 -9
  95. package/src/ui/directives/magic/checkbox.magic.directive.d.ts +9 -9
  96. package/src/ui/directives/magic/combobox.magic.directive.d.ts +10 -10
  97. package/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.d.ts +7 -7
  98. package/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.d.ts +23 -17
  99. package/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.d.ts +7 -7
  100. package/src/ui/directives/magic/input.noformcontrol.magic.directive.d.ts +9 -9
  101. package/src/ui/directives/magic/nocontrol.magic.directive.d.ts +18 -18
  102. package/src/ui/directives/magic/row.magic.directive.d.ts +17 -17
  103. package/src/ui/directives/magic-focus.directive.d.ts +9 -9
  104. package/src/ui/directives/magic.directive.d.ts +44 -44
  105. package/src/ui/directives/magicViewContainerRef.directive.d.ts +8 -8
  106. package/src/ui/directives/mgformat.magic.directive.d.ts +38 -31
  107. package/src/ui/directives/range-validator.magic.directive.d.ts +17 -17
  108. package/src/ui/magic-confirmationBox.d.ts +6 -6
  109. package/src/ui/magic-modal/base-magic-overlay-container.d.ts +5 -5
  110. package/src/ui/magic-modal/magic-modal-form.d.ts +5 -5
  111. package/src/ui/magic-modal/magic-modal-interface.d.ts +10 -10
  112. package/src/ui/magic-modal/magic-overlay-container-wrapper.d.ts +30 -31
  113. package/src/ui/magic-modal/magic-overlay-container.d.ts +24 -25
  114. package/src/ui/magic-root.component.d.ts +43 -40
  115. package/src/ui/mgerror.magic.component.d.ts +20 -20
  116. package/src/ui/pipes/date.magic.pipe.d.ts +17 -17
  117. package/src/ui/pipes/time.magic.pipe.d.ts +11 -11
  118. package/src/ui/pipes/time24.magic.pipe.d.ts +10 -10
  119. package/src/ui/router-container.magic.component.d.ts +29 -30
  120. package/src/ui/subform.magic.component.d.ts +16 -16
  121. package/src/ui/task-base.magic.component.d.ts +34 -34
  122. package/src/ui/utils.d.ts +9 -9
  123. package/esm2020/src/controls.metadata.model.mjs +0 -180
  124. package/esm2020/src/services/OverlayWindowService.mjs +0 -208
  125. package/esm2020/src/services/StylesMapManager.mjs +0 -28
  126. package/esm2020/src/services/accessor.magic.service.mjs +0 -356
  127. package/esm2020/src/services/commands-collector.magic.service.mjs +0 -46
  128. package/esm2020/src/services/component-list.magic.service.mjs +0 -46
  129. package/esm2020/src/services/engine.magic.service.mjs +0 -82
  130. package/esm2020/src/services/magic-color.service.mjs +0 -99
  131. package/esm2020/src/services/magic.services.mjs +0 -31
  132. package/esm2020/src/services/mg-date-adapter.mjs +0 -109
  133. package/esm2020/src/services/router-commands.magic.service.mjs +0 -28
  134. package/esm2020/src/services/subform.magic.service.mjs +0 -184
  135. package/esm2020/src/services/table.magic.service.mjs +0 -77
  136. package/esm2020/src/services/task.magics.service.mjs +0 -624
  137. package/esm2020/src/services/title.magic.service.mjs +0 -18
  138. package/esm2020/src/ui/GuiInteractiveExecutor.mjs +0 -98
  139. package/esm2020/src/ui/components/base-magic-alert.component.mjs +0 -23
  140. package/esm2020/src/ui/components/base-magic-confirm.component.mjs +0 -23
  141. package/esm2020/src/ui/components/magic-alert.component.mjs +0 -35
  142. package/esm2020/src/ui/components/magic-confirmation-box.component.mjs +0 -41
  143. package/esm2020/src/ui/directives/NonMagicControlDirective.mjs +0 -49
  144. package/esm2020/src/ui/directives/magic/checkbox-noformcontrol.magic.directive.mjs +0 -28
  145. package/esm2020/src/ui/directives/magic/checkbox.magic.directive.mjs +0 -28
  146. package/esm2020/src/ui/directives/magic/combobox.magic.directive.mjs +0 -36
  147. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/checkbox.cva.directive.mjs +0 -27
  148. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/date.cva.directive.mjs +0 -52
  149. package/esm2020/src/ui/directives/magic/form-controls/control-value-accessors/default.cva.directive.mjs +0 -32
  150. package/esm2020/src/ui/directives/magic/input.noformcontrol.magic.directive.mjs +0 -27
  151. package/esm2020/src/ui/directives/magic/nocontrol.magic.directive.mjs +0 -193
  152. package/esm2020/src/ui/directives/magic/row.magic.directive.mjs +0 -58
  153. package/esm2020/src/ui/directives/magic-focus.directive.mjs +0 -19
  154. package/esm2020/src/ui/directives/magic.directive.mjs +0 -215
  155. package/esm2020/src/ui/directives/magicViewContainerRef.directive.mjs +0 -19
  156. package/esm2020/src/ui/directives/mgformat.magic.directive.mjs +0 -408
  157. package/esm2020/src/ui/directives/range-validator.magic.directive.mjs +0 -58
  158. package/esm2020/src/ui/magic-modal/magic-modal-form.mjs +0 -8
  159. package/esm2020/src/ui/magic-modal/magic-overlay-container-wrapper.mjs +0 -121
  160. package/esm2020/src/ui/magic-modal/magic-overlay-container.mjs +0 -159
  161. package/esm2020/src/ui/magic-root.component.mjs +0 -203
  162. package/esm2020/src/ui/mgerror.magic.component.mjs +0 -119
  163. package/esm2020/src/ui/pipes/date.magic.pipe.mjs +0 -105
  164. package/esm2020/src/ui/pipes/time.magic.pipe.mjs +0 -51
  165. package/esm2020/src/ui/pipes/time24.magic.pipe.mjs +0 -34
  166. package/esm2020/src/ui/router-container.magic.component.mjs +0 -108
  167. package/esm2020/src/ui/task-base.magic.component.mjs +0 -86
  168. package/esm2020/src/ui/utils.mjs +0 -54
  169. package/fesm2015/magic-xpa-angular.mjs +0 -4832
  170. package/fesm2015/magic-xpa-angular.mjs.map +0 -1
  171. package/fesm2020/magic-xpa-angular.mjs.map +0 -1
@@ -0,0 +1,637 @@
1
+ import { EventEmitter, Injectable } from '@angular/core';
2
+ import { FormControl, FormGroup } from '@angular/forms';
3
+ import { filter } from 'rxjs/operators';
4
+ import { Subject } from 'rxjs';
5
+ import { isNullOrUndefined, isUndefined } from '@magic-xpa/mscorelib';
6
+ import { StylesMapManager } from './StylesMapManager';
7
+ import { EngineMagicService } from './engine.magic.service';
8
+ import { Records } from '../controls.metadata.model';
9
+ import { CommandType, GuiConstants, HtmlProperties } from '@magic-xpa/gui';
10
+ import { NString, StringBuilder } from '@magic-xpa/mscorelib';
11
+ import { StorageAttribute } from '@magic-xpa/utils';
12
+ import { getGuiEventObj } from '@magic-xpa/engine';
13
+ import { GuiInteractiveExecutor } from '../ui/GuiInteractiveExecutor';
14
+ import { OverlayWindowService } from './OverlayWindowService';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "./engine.magic.service";
17
+ import * as i2 from "./OverlayWindowService";
18
+ export class TaskMagicService {
19
+ magic;
20
+ overlayWindowService;
21
+ tableService;
22
+ Records = new Records();
23
+ formGroups = [];
24
+ ScreenModeControls;
25
+ refreshDom = new Subject();
26
+ subscribeRefreshDom;
27
+ detectChanges = new Subject();
28
+ subscribeInteractiveCommands;
29
+ interactiveCommands = new Subject();
30
+ OnSelectedRowChanged = new EventEmitter();
31
+ customPropertiesSubject = new Subject();
32
+ recordsCountChangeSubject = new Subject();
33
+ mgLoadSubject = new Subject();
34
+ template;
35
+ mgSubformService;
36
+ mgTitleService;
37
+ mgAccessorService;
38
+ mgInputDateFormat;
39
+ oldPageSize = 0;
40
+ constructor(magic, overlayWindowService) {
41
+ this.magic = magic;
42
+ this.overlayWindowService = overlayWindowService;
43
+ this.Records.setGuiTopIndex(0);
44
+ this.mgInputDateFormat = null;
45
+ }
46
+ getIsLoggenIn() {
47
+ return this.magic.getIsLoggedIn();
48
+ }
49
+ _taskId;
50
+ get taskId() {
51
+ return this._taskId;
52
+ }
53
+ set taskId(value) {
54
+ this._taskId = value;
55
+ }
56
+ get ScreenControlsData() {
57
+ return this.Records.list['0'];
58
+ }
59
+ settemplate(value) {
60
+ this.template = value;
61
+ }
62
+ buildScreenModeControls() {
63
+ const group = new FormGroup({});
64
+ for (const key in this.template) {
65
+ if (this.template[key] == '0') {
66
+ let fc = new FormControl('');
67
+ this.setStubValue(0, fc, key);
68
+ group.addControl(key, fc);
69
+ }
70
+ }
71
+ this.ScreenModeControls = group;
72
+ }
73
+ isTableControl(id) {
74
+ return this.template[id] == '1';
75
+ }
76
+ getMgInputDateFormat() { return this.mgInputDateFormat; }
77
+ getFormControl(guiRowid, id) {
78
+ let c;
79
+ let group = this.isTableControl(id) ? this.formGroups[guiRowid] : this.ScreenModeControls;
80
+ if (!isNullOrUndefined(group)) {
81
+ group.get(id);
82
+ c = group.controls[id];
83
+ }
84
+ return c;
85
+ }
86
+ setInputTextValue(controlId, guiRowid, val) {
87
+ this.setValue(controlId, guiRowid, this.ConvertValToNative(controlId, 0, val));
88
+ const fc = this.getFormControl(guiRowid, controlId);
89
+ if (!isNullOrUndefined(val))
90
+ fc.setValue(val);
91
+ }
92
+ buildTableRowControls(guiRowId) {
93
+ const group = new FormGroup({});
94
+ for (const key in this.template) {
95
+ if (this.template[key] == '1') {
96
+ let fc = new FormControl('');
97
+ this.setStubValue(guiRowId, fc, key);
98
+ group.addControl(key, fc);
99
+ }
100
+ }
101
+ this.formGroups[guiRowId] = group;
102
+ }
103
+ updateRecordsBeforeCurrentView(value) {
104
+ this.Records.recordsBeforeCurrentView = value;
105
+ }
106
+ setIncludesFirst(value) {
107
+ this.Records.includesFirst = value;
108
+ }
109
+ setIncludesLast(value) {
110
+ this.Records.includesLast = value;
111
+ }
112
+ markRowAsCreated(guiRowId) {
113
+ this.Records.markRowAsCreated(guiRowId);
114
+ }
115
+ markRowAsNotCreated(guiRowId) {
116
+ this.Records.markRowAsNotCreated(guiRowId);
117
+ }
118
+ startRowEditing(guiRowId) {
119
+ this.Records.startRowEditing(guiRowId);
120
+ }
121
+ stopRowEditing(guiRowId) {
122
+ this.Records.stopRowEditing(guiRowId);
123
+ }
124
+ isRowInRowEditing(guiRowId) {
125
+ return this.Records.isRowInRowEditing(guiRowId);
126
+ }
127
+ setIsEmptyDataView(isEmpty) {
128
+ if (this.Records.isEmptyDataView !== isEmpty) {
129
+ if (isEmpty)
130
+ this.recordsCountChangeSubject.next(0);
131
+ this.Records.isEmptyDataView = isEmpty;
132
+ this.tableService.refreshDataSource();
133
+ this.refreshView();
134
+ }
135
+ }
136
+ initTask(taskId, taskDescription) {
137
+ this.Records.createFirst();
138
+ this.oldPageSize = 0;
139
+ if (this.IsStub()) {
140
+ this.loadData();
141
+ }
142
+ else {
143
+ this.taskId = taskId;
144
+ this.settemplate(taskDescription);
145
+ }
146
+ this.buildScreenModeControls();
147
+ if (!isNullOrUndefined(this.subscribeRefreshDom))
148
+ this.subscribeRefreshDom.unsubscribe();
149
+ if (!isNullOrUndefined(this.subscribeInteractiveCommands))
150
+ this.subscribeInteractiveCommands.unsubscribe();
151
+ this.subscribeRefreshDom = this.magic.refreshDom.pipe(filter(command => command.TaskTag === this.taskId))
152
+ .subscribe(command => {
153
+ this.executeCommand(command);
154
+ });
155
+ this.subscribeInteractiveCommands = this.magic.interactiveCommands
156
+ .pipe(filter(command => command.TaskTag === this.taskId))
157
+ .subscribe(command => {
158
+ this.executeInteractiveCommand(command);
159
+ });
160
+ }
161
+ refreshView() {
162
+ this.detectChanges.next('');
163
+ }
164
+ insertEvent(guiEvent) {
165
+ guiEvent.TaskID = this.taskId;
166
+ this.magic.insertEvent(guiEvent);
167
+ }
168
+ GetControlPictureMask(controlName) {
169
+ return this.magic.GetControlPictureMask(this.taskId, controlName);
170
+ }
171
+ ValidateControlValue(controlName, value) {
172
+ return this.magic.ValidateControlValue(this.taskId, controlName, value);
173
+ }
174
+ GetRangedValue(controlName, value) {
175
+ return this.magic.GetRangedValue(this.taskId, controlName, value);
176
+ }
177
+ GetFldRanges(controlName) {
178
+ return this.magic.GetFldRanges(this.taskId, controlName);
179
+ }
180
+ getProperty(controlId, prop, guiRowId) {
181
+ if (isNullOrUndefined(guiRowId))
182
+ guiRowId = '0';
183
+ if (this.IsStub())
184
+ return this.getPropertyStub(this.Records.list[guiRowId], controlId, prop);
185
+ else {
186
+ let rec = this.Records.list[guiRowId];
187
+ if (isNullOrUndefined(rec))
188
+ debugger;
189
+ else
190
+ return this.Records.list[guiRowId].getProperty(controlId, prop);
191
+ }
192
+ }
193
+ getPropertyStub(ControlsProperties, controlId, prop) {
194
+ ControlsProperties = ControlsProperties.ControlsProperties;
195
+ if (controlId in ControlsProperties) {
196
+ if (prop in ControlsProperties[controlId].properties) {
197
+ return ControlsProperties[controlId].properties[prop];
198
+ }
199
+ }
200
+ return '';
201
+ }
202
+ getStyleStub(ControlsProperties, controlId, styleName) {
203
+ ControlsProperties = ControlsProperties.ControlsProperties;
204
+ return ControlsProperties[controlId].stylesMap.get(styleName);
205
+ }
206
+ getClasses(controlId, guiRowId) {
207
+ if (isNullOrUndefined(guiRowId))
208
+ guiRowId = '0';
209
+ return this.Records.list[guiRowId].getControlMetadata(controlId).classes;
210
+ }
211
+ getStyle(controlId, styleName, guiRowId) {
212
+ if (isNullOrUndefined(guiRowId))
213
+ guiRowId = '0';
214
+ if (this.IsStub())
215
+ return this.getStyleStub(this.Records.list[guiRowId], controlId, styleName);
216
+ else {
217
+ let magicValue = this.Records.list[guiRowId].getControlMetadata(controlId).stylesMap.get(styleName);
218
+ return StylesMapManager.magicValueGetStyle(styleName, magicValue);
219
+ }
220
+ }
221
+ getValue(controlId, guiRowId) {
222
+ if (isNullOrUndefined(guiRowId))
223
+ guiRowId = '0';
224
+ return this.Records.list.length > +guiRowId ? this.Records.list[guiRowId].values[controlId] : '';
225
+ }
226
+ getFormattedValue(controlName, val, rowId) {
227
+ return this.magic.GetFormattedValue(this.taskId, controlName, val, rowId);
228
+ }
229
+ setValue(controlId, guiRowId, value) {
230
+ return this.Records.list[guiRowId].setValue(controlId, value);
231
+ }
232
+ executeInteractiveCommand(guiInteractiveCommand) {
233
+ GuiInteractiveExecutor.executeInteractiveCommand(this, guiInteractiveCommand, this.overlayWindowService);
234
+ this.interactiveCommands.next(guiInteractiveCommand);
235
+ }
236
+ handleSetProperty(command, isTableChild) {
237
+ let controlId = command.CtrlName;
238
+ let dvRowId = (command.line || 0);
239
+ let guiRowId = this.getGuiRowId(dvRowId, isTableChild);
240
+ let properties;
241
+ if (command.Operation === HtmlProperties.SelectedRow) {
242
+ if (command.obj1 !== GuiConstants.NO_ROW_SELECTED) {
243
+ guiRowId = this.getGuiRowId(command.obj1, true);
244
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
245
+ properties.properties.set(command.Operation, command.line);
246
+ this.tableService.selectRow(guiRowId.toString());
247
+ this.OnSelectedRowChanged.emit(guiRowId.toString());
248
+ }
249
+ }
250
+ else if (command.Operation === HtmlProperties.Enabled) {
251
+ let c = this.getFormControl(guiRowId.toString(), controlId);
252
+ if (!isNullOrUndefined(c)) {
253
+ if (command.obj1)
254
+ c.enable();
255
+ else
256
+ c.disable();
257
+ }
258
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
259
+ properties.properties.set(command.Operation, command.obj1);
260
+ }
261
+ else {
262
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
263
+ properties.properties.set(command.Operation, command.obj1);
264
+ }
265
+ }
266
+ executeCommand(command) {
267
+ let dvRowId = (command.line || 0);
268
+ let guiRowId = 0;
269
+ let controlId = command.CtrlName;
270
+ let properties;
271
+ let isTableChild = this.isTableControl(controlId);
272
+ if (command.obj !== null)
273
+ isTableChild = isTableChild || command.obj.IsTableChild;
274
+ guiRowId = this.getGuiRowId(dvRowId, isTableChild);
275
+ switch (command.CommandType) {
276
+ case CommandType.SET_IS_LOGGED_IN:
277
+ break;
278
+ case CommandType.SET_TABLE_TOP_INDEX:
279
+ this.tableService.setTableTopIndex(command.number);
280
+ break;
281
+ case CommandType.REFRESH_TASK:
282
+ this.tableService.refreshDataSource();
283
+ this.refreshView();
284
+ break;
285
+ case CommandType.SET_TABLE_ITEMS_COUNT:
286
+ if (!isUndefined(command.number)) {
287
+ this.tableService.updateTableSize(command.number);
288
+ if (command.number > 0 && this.Records.sizeUpdated &&
289
+ !this.Records.isEmptyDataView) {
290
+ this.recordsCountChangeSubject.next(command.number);
291
+ this.Records.sizeUpdated = false;
292
+ }
293
+ }
294
+ break;
295
+ case CommandType.SET_CHUNK_SIZE:
296
+ if (!isUndefined(command.number)) {
297
+ this.tableService.setChunkSize(command.number);
298
+ }
299
+ break;
300
+ case CommandType.SET_RECORDS_BEFORE_CURRENT_VIEW:
301
+ this.updateRecordsBeforeCurrentView(command.number);
302
+ break;
303
+ case CommandType.CREATE_TABLE_ROW:
304
+ guiRowId = this.getGuiRowId(command.number, true);
305
+ this.buildTableRowControls(guiRowId);
306
+ this.markRowAsCreated(guiRowId);
307
+ break;
308
+ case CommandType.SET_IS_ROW_EDITING:
309
+ guiRowId = this.getGuiRowId(command.line, command.value);
310
+ this.startRowEditing(guiRowId);
311
+ break;
312
+ case CommandType.SET_NOT_IS_ROW_EDITING:
313
+ guiRowId = this.getGuiRowId(command.line, command.value);
314
+ this.stopRowEditing(guiRowId);
315
+ break;
316
+ case CommandType.UNDO_CREATE_TABLE_ROW:
317
+ this.markRowAsNotCreated(this.getGuiRowId(command.number, true));
318
+ break;
319
+ case CommandType.SET_TABLE_INCLUDES_FIRST:
320
+ this.setIncludesFirst(command.Bool1);
321
+ break;
322
+ case CommandType.SET_TABLE_INCLUDES_LAST:
323
+ this.setIncludesLast(command.Bool1);
324
+ break;
325
+ case CommandType.SET_PROPERTY:
326
+ this.handleSetProperty(command, isTableChild);
327
+ if (command.Operation == HtmlProperties.ReadOnly ||
328
+ command.Operation == HtmlProperties.ItemsList)
329
+ this.refreshDom.next(command);
330
+ break;
331
+ case CommandType.PROP_SET_USER_PROPERTY:
332
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
333
+ if (properties.userProperties.get(command.Operation) !== command.obj1) {
334
+ properties.userProperties.set(command.Operation, command.obj1);
335
+ this.customPropertiesSubject.next({ propertyName: controlId + '~' + command.Operation, value: command.obj1, rowId: guiRowId });
336
+ }
337
+ break;
338
+ case CommandType.PROP_SET_CUSTOM_VALIDATOR:
339
+ {
340
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
341
+ let control = this.getFormControl(guiRowId.toString(), controlId);
342
+ if (control != null) {
343
+ properties.customValidators.set(command.Operation, command.obj1);
344
+ if (control.validator != null)
345
+ control.setValidators([control.validator, this.customValidator(guiRowId.toString(), controlId)]);
346
+ else
347
+ control.setValidators(this.customValidator(guiRowId.toString(), controlId));
348
+ control.updateValueAndValidity();
349
+ }
350
+ }
351
+ break;
352
+ case CommandType.SET_CLASS:
353
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
354
+ properties.setClass(command.Operation, command.obj1);
355
+ break;
356
+ case CommandType.SET_STYLE:
357
+ properties = this.Records.list[guiRowId].getControlMetadata(controlId);
358
+ properties.setStyle(command.Operation, command.obj1);
359
+ break;
360
+ case CommandType.SET_ATTRIBUTE:
361
+ properties = this.Records.list[0].getControlMetadata(controlId);
362
+ properties.dataType = String.fromCharCode(command.number);
363
+ break;
364
+ case CommandType.SET_VALUE:
365
+ this.Records.list[guiRowId].values[controlId] = command.value;
366
+ let c = this.getFormControl(guiRowId.toString(), controlId);
367
+ if (!isNullOrUndefined(c)) {
368
+ c.setValue(this.ConvertValFromNative(controlId, command.line, command.value));
369
+ }
370
+ break;
371
+ case CommandType.CREATE_SUB_FORM:
372
+ this.mgSubformService.addSubformComp(command.CtrlName, command.userDropFormat.toString(), command.str, command.fileName, command.contextID, command.params, command.Bool1);
373
+ break;
374
+ case CommandType.CLOSE_SUB_FORM:
375
+ this.mgSubformService.deleteSubformComp(command.CtrlName, command.userDropFormat.toString());
376
+ break;
377
+ case CommandType.SET_EMPTY_DATAVIEW:
378
+ this.setIsEmptyDataView(command.Bool1);
379
+ break;
380
+ case CommandType.SET_FOCUS:
381
+ this.refreshDom.next(command);
382
+ break;
383
+ case CommandType.SET_WC_IDLE:
384
+ this.mgLoadSubject.next();
385
+ break;
386
+ }
387
+ }
388
+ customValidator(rowid, id) {
389
+ return (control) => {
390
+ let controlMetadata;
391
+ controlMetadata = this.Records.list[rowid].getControlMetadata(id);
392
+ for (let key of controlMetadata.customValidators.keys()) {
393
+ let validator = controlMetadata.customValidators.get(key);
394
+ if (!validator.isValid()) {
395
+ return { [key]: true };
396
+ }
397
+ }
398
+ return null;
399
+ };
400
+ }
401
+ ConvertValToNative(controlId, rowId, val) {
402
+ let properties;
403
+ properties = this.Records.list[0].getControlMetadata(controlId);
404
+ switch (properties.dataType) {
405
+ case StorageAttribute.BOOLEAN: {
406
+ if (typeof val === 'string') {
407
+ let ranges = this.GetFldRanges(controlId);
408
+ let found = ranges.indexOf(',');
409
+ let trueOption = ranges.substr(0, found);
410
+ let falseOption = ranges.substr(found + 1);
411
+ if (NString.Equals(val, trueOption, true))
412
+ return true;
413
+ else if (NString.Equals(val, falseOption, true))
414
+ return false;
415
+ else
416
+ return val;
417
+ }
418
+ else
419
+ return val;
420
+ }
421
+ case StorageAttribute.TIME: {
422
+ if (typeof val === 'string') {
423
+ let idx = val.indexOf(':', 0);
424
+ let hours = +val.substr(0, idx);
425
+ let minutes = +val.substr(idx + 1, 2);
426
+ let seconds = 0;
427
+ if (val.length > 5) {
428
+ idx = val.indexOf(':', idx + 1);
429
+ if (idx >= 0)
430
+ seconds = +val.substr(idx + 1, 2);
431
+ }
432
+ if (val.indexOf('PM') > 0)
433
+ hours += 12;
434
+ let dt = new Date();
435
+ dt.setHours(hours);
436
+ dt.setMinutes(minutes);
437
+ dt.setSeconds(seconds);
438
+ return dt;
439
+ }
440
+ else
441
+ return val;
442
+ }
443
+ case StorageAttribute.NUMERIC:
444
+ if (isUndefined(val))
445
+ return val;
446
+ else
447
+ return (val != null) ? (typeof val === 'string') ? val : +val : null;
448
+ default:
449
+ return val;
450
+ }
451
+ }
452
+ ConvertValFromNative(controlId, rowId, val) {
453
+ let properties;
454
+ properties = this.Records.list[0].getControlMetadata(controlId);
455
+ switch (properties.dataType) {
456
+ case StorageAttribute.TIME: {
457
+ if (val instanceof Date) {
458
+ let str = new StringBuilder();
459
+ let format = val.getHours() > 9 ? '{0}' : '0{0}';
460
+ str.AppendFormat(format, val.getHours().toString());
461
+ str.Append(':');
462
+ format = val.getMinutes() > 9 ? '{0}' : '0{0}';
463
+ str.AppendFormat(format, val.getMinutes().toString());
464
+ if (val.getSeconds() > 0) {
465
+ str.Append(':');
466
+ format = val.getSeconds() > 9 ? '{0}' : '0{0}';
467
+ str.AppendFormat(format, val.getSeconds().toString());
468
+ }
469
+ return str.ToString();
470
+ }
471
+ else
472
+ return val;
473
+ }
474
+ case StorageAttribute.BOOLEAN: {
475
+ let properties;
476
+ properties = this.Records.list['0'].getControlMetadata(controlId);
477
+ if (typeof val === 'boolean' && properties.rangeValidator) {
478
+ let ranges = this.GetFldRanges(controlId);
479
+ let found = ranges.indexOf(',');
480
+ let trueOption = ranges.substr(0, found);
481
+ let falseOption = ranges.substr(found + 1);
482
+ if (val)
483
+ return trueOption;
484
+ else
485
+ return falseOption;
486
+ }
487
+ else
488
+ return val;
489
+ }
490
+ default:
491
+ return val;
492
+ }
493
+ }
494
+ resize(pageSize, topGuiRowId) {
495
+ let guiEvent = getGuiEventObj('resize', 'table', 0);
496
+ guiEvent.PageSize = pageSize;
497
+ guiEvent.Line = topGuiRowId;
498
+ this.insertEvent(guiEvent);
499
+ }
500
+ onScrollDown() {
501
+ if (!this.Records.includesLast) {
502
+ let guiEvent = getGuiEventObj('getRows', '', 0);
503
+ guiEvent.Line = this.formGroups.length;
504
+ this.insertEvent(guiEvent);
505
+ }
506
+ }
507
+ setTitle(newTitle) {
508
+ this.mgTitleService.setTitle(newTitle);
509
+ }
510
+ getGuiRowId(dvRowId, isTableControl) {
511
+ return (isTableControl ? dvRowId + this.Records.recordsBeforeCurrentView : 0);
512
+ }
513
+ getDvRowId(guiRowId) {
514
+ return (guiRowId - this.Records.recordsBeforeCurrentView);
515
+ }
516
+ dispose() {
517
+ this.refreshDom.complete();
518
+ this.detectChanges.complete();
519
+ this.subscribeInteractiveCommands.unsubscribe();
520
+ this.subscribeRefreshDom.unsubscribe();
521
+ this.interactiveCommands.complete();
522
+ this.customPropertiesSubject.complete();
523
+ this.OnSelectedRowChanged.complete();
524
+ }
525
+ onComboboxSelectionChanged(event, idx, line) {
526
+ let guiEvent = getGuiEventObj('selectionchanged', idx, line);
527
+ if (typeof (event) == 'number') {
528
+ guiEvent.Value = event;
529
+ }
530
+ else {
531
+ if (!isNullOrUndefined(event.target)) {
532
+ let indexes = new Array(event.target.selectedOptions.length);
533
+ for (let i = 0; i < event.target.selectedOptions.length; i++) {
534
+ indexes[i] = event.target.selectedOptions[i].index;
535
+ }
536
+ guiEvent.Value = indexes.join(',');
537
+ }
538
+ else
539
+ guiEvent.Value = event.value;
540
+ }
541
+ this.insertEvent(guiEvent);
542
+ }
543
+ onListBoxSelectionChanged(event, idx) {
544
+ let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
545
+ let selectedOptions;
546
+ if (!isNullOrUndefined(event.target))
547
+ selectedOptions = event.target.selectedOptions;
548
+ else
549
+ selectedOptions = event.source.selectedOptions.selected;
550
+ let length = selectedOptions.length;
551
+ let indexes = new Array(length);
552
+ for (let i = 0; i < length; i++) {
553
+ if (!isNullOrUndefined(event.target))
554
+ indexes[i] = (selectedOptions[i]).index;
555
+ else
556
+ indexes[i] = (selectedOptions[i]).value;
557
+ }
558
+ guiEvent.Value = indexes;
559
+ this.insertEvent(guiEvent);
560
+ }
561
+ onCheckChanged(event, idx, rowId) {
562
+ if (typeof rowId === 'undefined')
563
+ rowId = 0;
564
+ let guiEvent = getGuiEventObj('selectionchanged', idx, rowId);
565
+ if (typeof (event) == 'boolean') {
566
+ guiEvent.Value = event;
567
+ }
568
+ else {
569
+ if (typeof event.target === 'undefined')
570
+ guiEvent.Value = (event).checked;
571
+ else
572
+ guiEvent.Value = (event.target).checked;
573
+ }
574
+ this.insertEvent(guiEvent);
575
+ }
576
+ mgOnTabSelectionChanged(idx, layer) {
577
+ let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
578
+ guiEvent.Value = layer.toString();
579
+ this.insertEvent(guiEvent);
580
+ }
581
+ mgOnRadioSelectionChanged(idx) {
582
+ let result = this.getFormControl('0', idx);
583
+ let guiEvent = getGuiEventObj('selectionchanged', idx, 0);
584
+ if (typeof result.value !== 'number')
585
+ guiEvent.Value = result.value.index;
586
+ else
587
+ guiEvent.Value = result.value.toString();
588
+ this.insertEvent(guiEvent);
589
+ }
590
+ close() {
591
+ this.insertEvent(getGuiEventObj('close', null, 0));
592
+ }
593
+ IsStub() {
594
+ return this.magic.isStub;
595
+ }
596
+ jsonData;
597
+ saveData(data) {
598
+ this.magic.saveData(data);
599
+ }
600
+ createData() {
601
+ let myData = {
602
+ records: this.Records,
603
+ template: this.template
604
+ };
605
+ let text = 'loadData():any {\n' +
606
+ ' let stubData = ' + JSON.stringify(myData) + ';\n' +
607
+ ' this.loadStubData(stubData);}';
608
+ console.log(text);
609
+ this.saveData(text);
610
+ }
611
+ loadStubData(stubData) {
612
+ this.Records = stubData.records;
613
+ this.settemplate(stubData.template);
614
+ this.taskId = '1';
615
+ for (let i = 0; i < this.Records.list.length; i++)
616
+ this.buildTableRowControls(i);
617
+ }
618
+ loadData() {
619
+ alert('Please, overwrite method loadData');
620
+ }
621
+ setStubValue(guiRowId, fc, name) {
622
+ if (this.IsStub()) {
623
+ try {
624
+ let val = this.Records.list[guiRowId].values[name];
625
+ fc.setValue(val);
626
+ }
627
+ catch (e) {
628
+ }
629
+ }
630
+ }
631
+ static ɵfac = function TaskMagicService_Factory(t) { return new (t || TaskMagicService)(i0.ɵɵinject(i1.EngineMagicService), i0.ɵɵinject(i2.OverlayWindowService)); };
632
+ static ɵprov = i0.ɵɵdefineInjectable({ token: TaskMagicService, factory: TaskMagicService.ɵfac });
633
+ }
634
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaskMagicService, [{
635
+ type: Injectable
636
+ }], () => [{ type: i1.EngineMagicService }, { type: i2.OverlayWindowService }], null); })();
637
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay5tYWdpY3Muc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL3NlcnZpY2VzL3Rhc2subWFnaWNzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdkQsT0FBTyxFQUFrQixXQUFXLEVBQUUsU0FBUyxFQUFnQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBRTNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVwRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQWtCLE9BQU8sRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxXQUFXLEVBQStCLFlBQVksRUFBa0IsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEgsT0FBTyxFQUFDLE9BQU8sRUFBRSxhQUFhLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsY0FBYyxFQUFZLE1BQU0sbUJBQW1CLENBQUM7QUFJNUQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDcEUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7Ozs7QUFNNUQsTUFBTSxPQUFPLGdCQUFnQjtJQXVGTDtJQUFtQztJQWxGbEQsWUFBWSxDQUFNO0lB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dEIsQ0FBQztJQUtNLFlBQVksQ0FBQyxRQUFhO1FBRS9CLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztRQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUtNLFFBQVE7UUFDYixLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBS0QsWUFBWSxDQUFDLFFBQWdCLEVBQUUsRUFBZSxFQUFFLElBQVk7UUFDMUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNuRCxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLENBQUM7WUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDOzBFQXBpQ1UsZ0JBQWdCO2tEQUFoQixnQkFBZ0IsV0FBaEIsZ0JBQWdCOztpRkFBaEIsZ0JBQWdCO2NBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0V2ZW50RW1pdHRlciwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7QWJzdHJhY3RDb250cm9sLCBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3JGbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge2ZpbHRlcn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQge1N1YmplY3QsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcblxyXG5pbXBvcnQge2lzTnVsbE9yVW5kZWZpbmVkLCBpc1VuZGVmaW5lZH0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1N0eWxlc01hcE1hbmFnZXJ9IGZyb20gJy4vU3R5bGVzTWFwTWFuYWdlcic7XHJcblxyXG5pbXBvcnQge0VuZ2luZU1hZ2ljU2VydmljZX0gZnJvbSAnLi9lbmdpbmUubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7Q29udHJvbE1ldGFkYXRhLCBSZWNvcmRzfSBmcm9tICcuLi9jb250cm9scy5tZXRhZGF0YS5tb2RlbCc7XHJcbmltcG9ydCB7Q29tbWFuZFR5cGUsIEN1c3RvbVZhbGlkYXRvciwgR3VpQ29tbWFuZCwgR3VpQ29uc3RhbnRzLCBHdWlJbnRlcmFjdGl2ZSwgSHRtbFByb3BlcnRpZXN9IGZyb20gJ0BtYWdpYy14cGEvZ3VpJztcclxuXHJcbmltcG9ydCB7TlN0cmluZywgU3RyaW5nQnVpbGRlcn0gZnJvbSAnQG1hZ2ljLXhwYS9tc2NvcmVsaWInO1xyXG5pbXBvcnQge1N0b3JhZ2VBdHRyaWJ1dGV9IGZyb20gJ0BtYWdpYy14cGEvdXRpbHMnO1xyXG5pbXBvcnQge2dldEd1aUV2ZW50T2JqLCBJR3VpRXZlbnR9IGZyb20gJ0BtYWdpYy14cGEvZW5naW5lJztcclxuaW1wb3J0IHtTdWJmb3JtTWFnaWNTZXJ2aWNlfSBmcm9tICcuL3N1YmZvcm0ubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7VGl0bGVNYWdpY1NlcnZpY2V9IGZyb20gJy4vdGl0bGUubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7QWNjZXNzb3JNYWdpY1NlcnZpY2V9IGZyb20gJy4vYWNjZXNzb3IubWFnaWMuc2VydmljZSc7XHJcbmltcG9ydCB7R3VpSW50ZXJhY3RpdmVFeGVjdXRvcn0gZnJvbSAnLi4vdWkvR3VpSW50ZXJhY3RpdmVFeGVjdXRvcic7XHJcbmltcG9ydCB7T3ZlcmxheVdpbmRvd1NlcnZpY2V9IGZyb20gJy4vT3ZlcmxheVdpbmRvd1NlcnZpY2UnO1xyXG5cclxuLyoqXHJcbiAqIE1haW4gc2VydmljZSB0byBjb25uZWN0IHRoZSBVSSB3aXRoIHRoZSBNYWdpYyBXZWJDTGllbnRcclxuICovXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFRhc2tNYWdpY1NlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHRvIHByb3ZpZGUgdGFibGUtcmVsYXRlZCBmdW5jdGlvbmFsaXRpZXNcclxuICAgKi9cclxuICBwdWJsaWMgdGFibGVTZXJ2aWNlOiBhbnk7XHJcbiAgLyoqXHJcbiAgICogQ29sbGVjdGlvbiBvZiBkYXRhIGZvciBhbGwgY29udHJvbHNcclxuICAgKi9cclxuICBSZWNvcmRzOiBhbnkgPSBuZXcgUmVjb3JkcygpO1xyXG4gIC8qKlxyXG4gICAqIEZvcm1Hcm91cCBjb2xsZWN0aW9uIGZvciBsaW5lIG1vZGVcclxuICAgKi9cclxuICBmb3JtR3JvdXBzOiBBcnJheTxGb3JtR3JvdXA+ID0gW107XHJcbiAgLyoqXHJcbiAgICogRm9ybUdyb3VwIGZvciBhbGwgY29udHJvbHMgaW4gc2NyZWVuIG1vZGVcclxuICAgKi9cclxuICBTY3JlZW5Nb2RlQ29udHJvbHM6IEZvcm1Hcm91cDtcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcmVmcmVzaERvbTogU3ViamVjdDxHdWlDb21tYW5kPiA9IG5ldyBTdWJqZWN0KCk7XHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN1YnNjcmliZVJlZnJlc2hEb206IFN1YnNjcmlwdGlvbjtcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZGV0ZWN0Q2hhbmdlczogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKTtcclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc3Vic2NyaWJlSW50ZXJhY3RpdmVDb21tYW5kczogU3Vic2NyaXB0aW9uO1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgaW50ZXJhY3RpdmVDb21tYW5kczogU3ViamVjdDxHdWlJbnRlcmFjdGl2ZT49IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBUaGlzIGV2ZW50IGlzIGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgcm93IGluIGEgdGFibGUgY2hhbmdlcy5cclxuICAgKi9cclxuICBPblNlbGVjdGVkUm93Q2hhbmdlZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGN1c3RvbVByb3BlcnRpZXNTdWJqZWN0OiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlY29yZHNDb3VudENoYW5nZVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIG1nTG9hZFN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwdWJsaWMgdGVtcGxhdGU6IHsgW2lkOiBzdHJpbmddOiBzdHJpbmc7IH07XHJcbiAgLyoqXHJcbiAgICogU2VydmljZSB0byBwcm92aWRlIHN1YmZvcm0tcmVsYXRlZCBmdW5jdGlvbmFsaXRpZXNcclxuICAgKi9cclxuICBwdWJsaWMgbWdTdWJmb3JtU2VydmljZTogU3ViZm9ybU1hZ2ljU2VydmljZTtcclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHRvIHByb3ZpZGUgdGhlIHRpdGxlLWNoYW5nZSBmdW5jdGlvbmFsaXR5XHJcbiAgICovXHJcbiAgcHVibGljIG1nVGl0bGVTZXJ2aWNlOiBUaXRsZU1hZ2ljU2VydmljZTtcclxuICAvKipcclxuICAgKiBTZXJ2aWNlIHdoaWNoIGVuYWJsZXMgZ2V0dGluZy9zZXR0aW5nIHZhbHVlcyBmcm9tL3RvIHRoZSBNYWdpYyBXZWJDbGllbnQgZW5naW5lXHJcbiAgICovXHJcbiAgcHVibGljIG1nQWNjZXNzb3JTZXJ2aWNlOiBBY2Nlc3Nvck1hZ2ljU2VydmljZTtcclxuXHJcbiAgcHVibGljIG1nSW5wdXREYXRlRm9ybWF0O1xyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgb2xkUGFnZVNpemUgPSAwO1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBwYXJhbSAgbWFnaWNcclxuICAgKi9cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbWFnaWM6IEVuZ2luZU1hZ2ljU2VydmljZSwgcHJpdmF0ZSBvdmVybGF5V2luZG93U2VydmljZTogT3ZlcmxheVdpbmRvd1NlcnZpY2UpIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5zZXRHdWlUb3BJbmRleCgwKTtcclxuICAgIHRoaXMubWdJbnB1dERhdGVGb3JtYXQgPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgIC8qKlxyXG4gICAqIHJldHVybnMgdHJ1ZSBpZiB1c2VkIGlzIGxvZ2dlZCBpblxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgcHVibGljIGdldElzTG9nZ2VuSW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5nZXRJc0xvZ2dlZEluKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJZCBvZiB0YXNrIHRvIHdoaWNoIHRoaXMgc2VydmljZSByZWZlcnNcclxuICAgKi9cclxuICBfdGFza0lkOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgdGhlIHRhc2sgSWRcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldCB0YXNrSWQoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGFza0lkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2V0cyB0aGUgdGFzayBJZFxyXG4gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGFzayBpZCB0byBzZXRcclxuICAgKi9cclxuICBzZXQgdGFza0lkKHZhbHVlKSB7XHJcbiAgICAvLyBkZWJ1Z2dlcjtcclxuICAgIHRoaXMuX3Rhc2tJZCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgdGFzaydzIGRhdGEgaW4gU2NyZWVuIG1vZGVcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGdldCBTY3JlZW5Db250cm9sc0RhdGEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbJzAnXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzZXR0ZW1wbGF0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLnRlbXBsYXRlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRoZSBGb3JtQ29udHJvbCBmb3IgZWFjaCBhbmQgZXZlcnkgY29udHJvbFxyXG4gICAqL1xyXG4gIGJ1aWxkU2NyZWVuTW9kZUNvbnRyb2xzKCkge1xyXG4gICAgY29uc3QgZ3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZW1wbGF0ZSkge1xyXG5cclxuICAgICAgaWYgKHRoaXMudGVtcGxhdGVba2V5XSA9PSAnMCcpIHtcclxuICAgICAgICBsZXQgZmMgPSBuZXcgRm9ybUNvbnRyb2woJycpO1xyXG4gICAgICAgIHRoaXMuc2V0U3R1YlZhbHVlKDAsIGZjLCBrZXkpO1xyXG4gICAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBmYyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLlNjcmVlbk1vZGVDb250cm9scyA9IGdyb3VwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSXMgdGhlIGNvbnRyb2wgYSB0YWJsZSBjb250cm9sXHJcbiAgICogQHBhcmFtIGlkIElkIG9mIHRoZSBjb250cm9sXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBpc1RhYmxlQ29udHJvbChpZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZVtpZF0gPT0gJzEnO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWdJbnB1dERhdGVGb3JtYXQoKTogc3RyaW5nIHtyZXR1cm4gdGhpcy5tZ0lucHV0RGF0ZUZvcm1hdDt9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIEZvcm1Db250cm9sIG9mIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dpZCBJZCBvZiB0aGUgcmVxdWVzdGVkIHJvd1xyXG4gICAqIEBwYXJhbSBpZCBJZCBvZiB0aGUgY29udHJvbFxyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgZ2V0Rm9ybUNvbnRyb2woZ3VpUm93aWQ6IHN0cmluZywgaWQ6IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICBsZXQgYzogQWJzdHJhY3RDb250cm9sO1xyXG4gICAgbGV0IGdyb3VwOiBGb3JtR3JvdXAgPSB0aGlzLmlzVGFibGVDb250cm9sKGlkKSA/IHRoaXMuZm9ybUdyb3Vwc1tndWlSb3dpZF0gOiB0aGlzLlNjcmVlbk1vZGVDb250cm9scztcclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoZ3JvdXApKSB7XHJcbiAgICAgIGdyb3VwLmdldChpZCk7XHJcbiAgICAgIGMgPSBncm91cC5jb250cm9sc1tpZF07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGhhbmRsZSB0aGUgY2hhbmdlIG9mIHRleHQgZm9yIGlucHV0IGNvbnRyb2wgaW5zaWRlIHRhYmxlXHJcbiAgICogQHBhcmFtICBndWlSb3dJZCBJZCBvZiB0aGUgcm93IGZvciB3aGljaCB0aGUgRm9ybUNvbnRyb2xzIGFyZSBidWlsdFxyXG4gICAqIHNldCB0aGUgbmV3IHZhbHVlIG9mIHRoZSBmb3JtY29udHJvbFxyXG4gICAqL1xyXG4gIHNldElucHV0VGV4dFZhbHVlKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dpZDogc3RyaW5nLCB2YWw6IGFueSkge1xyXG4gICAgdGhpcy5zZXRWYWx1ZShjb250cm9sSWQsIGd1aVJvd2lkLCB0aGlzLkNvbnZlcnRWYWxUb05hdGl2ZShjb250cm9sSWQsIDAsIHZhbCkpO1xyXG5cclxuICAgIGNvbnN0IGZjID0gdGhpcy5nZXRGb3JtQ29udHJvbChndWlSb3dpZCwgY29udHJvbElkKTtcclxuICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQodmFsKSlcclxuICAgICAgZmMuc2V0VmFsdWUodmFsKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEJ1aWxkIHRoZSBGb3JtQ29udHJvbHMgZm9yIGEgdGFibGUgcm93XHJcbiAgICogQHBhcmFtICBndWlSb3dJZCBJZCBvZiB0aGUgcm93IGZvciB3aGljaCB0aGUgRm9ybUNvbnRyb2xzIGFyZSBidWlsdFxyXG4gICAqL1xyXG4gIGJ1aWxkVGFibGVSb3dDb250cm9scyhndWlSb3dJZDogbnVtYmVyKSB7XHJcblxyXG4gICAgY29uc3QgZ3JvdXA6IEZvcm1Hcm91cCA9IG5ldyBGb3JtR3JvdXAoe30pO1xyXG5cclxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMudGVtcGxhdGUpIHtcclxuXHJcbiAgICAgIGlmICh0aGlzLnRlbXBsYXRlW2tleV0gPT0gJzEnKSB7XHJcbiAgICAgICAgbGV0IGZjID0gbmV3IEZvcm1Db250cm9sKCcnKTtcclxuICAgICAgICB0aGlzLnNldFN0dWJWYWx1ZShndWlSb3dJZCwgZmMsIGtleSk7XHJcbiAgICAgICAgZ3JvdXAuYWRkQ29udHJvbChrZXksIGZjKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5mb3JtR3JvdXBzW2d1aVJvd0lkXSA9IGdyb3VwO1xyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHVwZGF0ZVJlY29yZHNCZWZvcmVDdXJyZW50Vmlldyh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLlJlY29yZHMucmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3ID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0SW5jbHVkZXNGaXJzdCh2YWx1ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5SZWNvcmRzLmluY2x1ZGVzRmlyc3QgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzZXRJbmNsdWRlc0xhc3QodmFsdWU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5pbmNsdWRlc0xhc3QgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBtYXJrUm93QXNDcmVhdGVkKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5tYXJrUm93QXNDcmVhdGVkKGd1aVJvd0lkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBtYXJrUm93QXNOb3RDcmVhdGVkKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5tYXJrUm93QXNOb3RDcmVhdGVkKGd1aVJvd0lkKTtcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc3RhcnRSb3dFZGl0aW5nKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5zdGFydFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHN0b3BSb3dFZGl0aW5nKGd1aVJvd0lkOiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5zdG9wUm93RWRpdGluZyhndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgaXNSb3dJblJvd0VkaXRpbmcoZ3VpUm93SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuUmVjb3Jkcy5pc1Jvd0luUm93RWRpdGluZyhndWlSb3dJZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgc2V0SXNFbXB0eURhdGFWaWV3KGlzRW1wdHk6IGJvb2xlYW4pIHtcclxuICAgIGlmICh0aGlzLlJlY29yZHMuaXNFbXB0eURhdGFWaWV3ICE9PSBpc0VtcHR5KSB7XHJcblxyXG4gICAgICBpZiAoaXNFbXB0eSlcclxuICAgICAgICB0aGlzLnJlY29yZHNDb3VudENoYW5nZVN1YmplY3QubmV4dCgwKTtcclxuXHJcbiAgICAgIHRoaXMuUmVjb3Jkcy5pc0VtcHR5RGF0YVZpZXcgPSBpc0VtcHR5O1xyXG4gICAgICB0aGlzLnRhYmxlU2VydmljZS5yZWZyZXNoRGF0YVNvdXJjZSgpO1xyXG4gICAgICB0aGlzLnJlZnJlc2hWaWV3KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIHRoZSBzZXJ2aWNlIHRvIHdvcmsgd2l0aCB0aGUgdGFza1xyXG4gICAqIEBwYXJhbSB0YXNrSWQgSWQgb2YgdGhlIHRhc2tcclxuICAgKiBAcGFyYW0gdGFza0Rlc2NyaXB0aW9uXHJcbiAgICovXHJcbiAgaW5pdFRhc2sodGFza0lkLCB0YXNrRGVzY3JpcHRpb24pIHtcclxuICAgIHRoaXMuUmVjb3Jkcy5jcmVhdGVGaXJzdCgpO1xyXG4gICAgdGhpcy5vbGRQYWdlU2l6ZSA9IDA7XHJcbiAgICBpZiAodGhpcy5Jc1N0dWIoKSkge1xyXG4gICAgICB0aGlzLmxvYWREYXRhKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRhc2tJZCA9IHRhc2tJZDtcclxuICAgICAgdGhpcy5zZXR0ZW1wbGF0ZSh0YXNrRGVzY3JpcHRpb24pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5idWlsZFNjcmVlbk1vZGVDb250cm9scygpO1xyXG5cclxuICAgIC8vIHJlbW92ZSBwcmV2aW91cyBzdWJzY3JpcHRpb25zXHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tKSlcclxuICAgICAgdGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tLnVuc3Vic2NyaWJlKCk7XHJcbiAgICBpZighaXNOdWxsT3JVbmRlZmluZWQodGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzKSlcclxuICAgICAgdGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgdGhpcy5zdWJzY3JpYmVSZWZyZXNoRG9tID0gdGhpcy5tYWdpYy5yZWZyZXNoRG9tLnBpcGUoZmlsdGVyKGNvbW1hbmQgPT4gY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLnRhc2tJZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJUYXNrIFwiICsgY29tbWFuZC5UYXNrVGFnICsgXCJjb21tYW5kIFwiICsgY29tbWFuZC5Db21tYW5kVHlwZSk7XHJcbiAgICAgICAgdGhpcy5leGVjdXRlQ29tbWFuZChjb21tYW5kKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmliZUludGVyYWN0aXZlQ29tbWFuZHMgPSB0aGlzLm1hZ2ljLmludGVyYWN0aXZlQ29tbWFuZHNcclxuICAgICAgLnBpcGUoZmlsdGVyKGNvbW1hbmQgPT4gY29tbWFuZC5UYXNrVGFnID09PSB0aGlzLnRhc2tJZCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XHJcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJUYXNrIFwiICsgY29tbWFuZC5UYXNrVGFnICsgXCJjb21tYW5kIFwiICsgY29tbWFuZC5Db21tYW5kVHlwZSk7XHJcbiAgICAgICAgdGhpcy5leGVjdXRlSW50ZXJhY3RpdmVDb21tYW5kKGNvbW1hbmQpO1xyXG4gICAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHJlZnJlc2hWaWV3KCkge1xyXG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzLm5leHQoJycpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0IGFuIGV2ZW50IHRvIHRoZSBNYWdpYyBXZWJDbGllbnQgZXZlbnQgcXVldWVcclxuICAgKiBAcGFyYW0gZ3VpRXZlbnQgVGhlIGV2ZW50IHRvIGluc2VydFxyXG4gICAqL1xyXG4gIGluc2VydEV2ZW50KGd1aUV2ZW50OiBJR3VpRXZlbnQpOiB2b2lkIHtcclxuICAgIGd1aUV2ZW50LlRhc2tJRCA9IHRoaXMudGFza0lkO1xyXG4gICAgdGhpcy5tYWdpYy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgR2V0Q29udHJvbFBpY3R1cmVNYXNrKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuR2V0Q29udHJvbFBpY3R1cmVNYXNrKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWYWxpZGF0ZXMgdGhlIGNvbnRyb2wgdmFsdWUsIHVzaW5nIHRoZSBNYWdpYyBXZWJDbGllbnRcclxuICAgKiBAcGFyYW0gY29udHJvbE5hbWUgSWQgb2YgdmFsaWRhdGVkIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gYmUgdmFsaWRhdGVkXHJcbiAgICogQHJldHVybnMgSWYgdmFsaWRhdGlvbiBmYWlscywgcmV0dXJucyBlcnJvciBtZXNzYWdlLCBlbHNlIHJldHVybnMgbnVsbFxyXG4gICAqL1xyXG4gIFZhbGlkYXRlQ29udHJvbFZhbHVlKGNvbnRyb2xOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFnaWMuVmFsaWRhdGVDb250cm9sVmFsdWUodGhpcy50YXNrSWQsIGNvbnRyb2xOYW1lLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgR2V0UmFuZ2VkVmFsdWUoY29udHJvbE5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5HZXRSYW5nZWRWYWx1ZSh0aGlzLnRhc2tJZCwgY29udHJvbE5hbWUsIHZhbHVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBHZXRGbGRSYW5nZXMoY29udHJvbE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5HZXRGbGRSYW5nZXModGhpcy50YXNrSWQsIGNvbnRyb2xOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHJldHVybnMgdGhlIHZhbHVlIG9mIGEgcHJvcGVydHkgb2YgdGhlIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gcHJvcCBQcm9wZXJ0eVxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcmV0dXJucyBQcm9wZXJ0eSB2YWx1ZVxyXG4gICAqL1xyXG4gIGdldFByb3BlcnR5KGNvbnRyb2xJZDogc3RyaW5nLCBwcm9wOiBIdG1sUHJvcGVydGllcywgZ3VpUm93SWQ/OiBzdHJpbmcpIHtcclxuICAgIGlmIChpc051bGxPclVuZGVmaW5lZChndWlSb3dJZCkpXHJcbiAgICAgIGd1aVJvd0lkID0gJzAnO1xyXG4gICAgaWYgKHRoaXMuSXNTdHViKCkpXHJcbiAgICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5U3R1Yih0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0sIGNvbnRyb2xJZCwgcHJvcCk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IHJlYyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXTtcclxuICAgICAgaWYgKGlzTnVsbE9yVW5kZWZpbmVkKHJlYykpXHJcbiAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgIGVsc2VcclxuICAgICAgICByZXR1cm4gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldFByb3BlcnR5KGNvbnRyb2xJZCwgcHJvcCk7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldFByb3BlcnR5U3R1YihDb250cm9sc1Byb3BlcnRpZXM6IGFueSwgY29udHJvbElkLCBwcm9wKSB7XHJcbiAgICBDb250cm9sc1Byb3BlcnRpZXMgPSBDb250cm9sc1Byb3BlcnRpZXMuQ29udHJvbHNQcm9wZXJ0aWVzO1xyXG4gICAgaWYgKGNvbnRyb2xJZCBpbiBDb250cm9sc1Byb3BlcnRpZXMpIHtcclxuICAgICAgaWYgKHByb3AgaW4gQ29udHJvbHNQcm9wZXJ0aWVzW2NvbnRyb2xJZF0ucHJvcGVydGllcykge1xyXG4gICAgICAgIHJldHVybiBDb250cm9sc1Byb3BlcnRpZXNbY29udHJvbElkXS5wcm9wZXJ0aWVzW3Byb3BdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgZ2V0U3R5bGVTdHViKENvbnRyb2xzUHJvcGVydGllczogYW55LCBjb250cm9sSWQsIHN0eWxlTmFtZTogc3RyaW5nKSB7XHJcbiAgICBDb250cm9sc1Byb3BlcnRpZXMgPSBDb250cm9sc1Byb3BlcnRpZXMuQ29udHJvbHNQcm9wZXJ0aWVzO1xyXG4gICAgcmV0dXJuIENvbnRyb2xzUHJvcGVydGllc1tjb250cm9sSWRdLnN0eWxlc01hcC5nZXQoc3R5bGVOYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgQ1NTIGNsYXNzZXMgdXNlZCBmb3IgdGhpcyBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIFN0cmluZyBjb250YWluaW5nIHRoZSBjbGFzc2VzIGN1cnJlbnRseSBkZWZpbmVkIGZvciB0aGlzIGNvbnRyb2xcclxuICAgKi9cclxuICBnZXRDbGFzc2VzKGNvbnRyb2xJZDogc3RyaW5nLCBndWlSb3dJZD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCkuY2xhc3NlcztcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc3R5bGUgdXNlZCBmb3IgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIHN0eWxlTmFtZSBOYW1lIG9mIHN0eWxlXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIHZhbHVlIG9mIHN0eWxlIG9mIHRoZSBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0U3R5bGUoY29udHJvbElkOiBzdHJpbmcsIHN0eWxlTmFtZTogc3RyaW5nLCBndWlSb3dJZD86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIGlmICh0aGlzLklzU3R1YigpKVxyXG4gICAgICByZXR1cm4gdGhpcy5nZXRTdHlsZVN0dWIodGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLCBjb250cm9sSWQsIHN0eWxlTmFtZSk7XHJcbiAgICBlbHNlIHtcclxuICAgICAgbGV0IG1hZ2ljVmFsdWUgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCkuc3R5bGVzTWFwLmdldChzdHlsZU5hbWUpO1xyXG4gICAgICByZXR1cm4gU3R5bGVzTWFwTWFuYWdlci5tYWdpY1ZhbHVlR2V0U3R5bGUoc3R5bGVOYW1lLCBtYWdpY1ZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgdmFsdWUgb2YgYSBjb250cm9sXHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtIGd1aVJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEByZXR1cm5zIHZhbHVlIG9mIHRoZSBjb250cm9sXHJcbiAgICovXHJcbiAgZ2V0VmFsdWUoY29udHJvbElkOiBzdHJpbmcsIGd1aVJvd0lkPzogc3RyaW5nKSB7XHJcbiAgICBpZiAoaXNOdWxsT3JVbmRlZmluZWQoZ3VpUm93SWQpKVxyXG4gICAgICBndWlSb3dJZCA9ICcwJztcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMubGlzdC5sZW5ndGggPiArZ3VpUm93SWQgPyB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0udmFsdWVzW2NvbnRyb2xJZF0gOiAnJztcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gdGhlIGZvcm1hdHRlZCB2YWx1ZSBvZiBhIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gZ3VpUm93SWQgUm93IElkLCBpZiBhcHBsaWNhYmxlXHJcbiAgICogQHJldHVybnMgdmFsdWUgb2YgdGhlIGNvbnRyb2xcclxuICAgKi9cclxuICBnZXRGb3JtYXR0ZWRWYWx1ZShjb250cm9sTmFtZTogc3RyaW5nLCB2YWw6IGFueSwgcm93SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG5cclxuICAgIHJldHVybiB0aGlzLm1hZ2ljLkdldEZvcm1hdHRlZFZhbHVlKHRoaXMudGFza0lkLCBjb250cm9sTmFtZSwgdmFsLCByb3dJZCk7XHJcbiB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHZhbHVlIG9mIGEgY29udHJvbFxyXG4gICAqIEBwYXJhbSBjb250cm9sSWQgSWQgb2YgY29udHJvbFxyXG4gICAqIEBwYXJhbSBndWlSb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcGFyYW0gdmFsdWUgVmFsdWUgdG8gc2V0XHJcbiAgICovXHJcbiAgc2V0VmFsdWUoY29udHJvbElkOiBzdHJpbmcsIGd1aVJvd0lkOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuICAgIHJldHVybiB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uc2V0VmFsdWUoY29udHJvbElkLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGV4ZWN1dGVJbnRlcmFjdGl2ZUNvbW1hbmQoZ3VpSW50ZXJhY3RpdmVDb21tYW5kOiBHdWlJbnRlcmFjdGl2ZSlcclxuICB7XHJcbiAgICBHdWlJbnRlcmFjdGl2ZUV4ZWN1dG9yLmV4ZWN1dGVJbnRlcmFjdGl2ZUNvbW1hbmQodGhpcywgZ3VpSW50ZXJhY3RpdmVDb21tYW5kLCB0aGlzLm92ZXJsYXlXaW5kb3dTZXJ2aWNlKTtcclxuICAgIHRoaXMuaW50ZXJhY3RpdmVDb21tYW5kcy5uZXh0KGd1aUludGVyYWN0aXZlQ29tbWFuZClcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBoYW5kbGVTZXRQcm9wZXJ0eShjb21tYW5kOiBHdWlDb21tYW5kLCBpc1RhYmxlQ2hpbGQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGxldCBjb250cm9sSWQgPSBjb21tYW5kLkN0cmxOYW1lO1xyXG4gICAgbGV0IGR2Um93SWQ6IG51bWJlciA9IChjb21tYW5kLmxpbmUgfHwgMCk7XHJcbiAgICBsZXQgZ3VpUm93SWQ6IG51bWJlciA9IHRoaXMuZ2V0R3VpUm93SWQoZHZSb3dJZCwgaXNUYWJsZUNoaWxkKTtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcblxyXG4gICAgaWYgKGNvbW1hbmQuT3BlcmF0aW9uID09PSBIdG1sUHJvcGVydGllcy5TZWxlY3RlZFJvdykge1xyXG4gICAgICBpZiAoY29tbWFuZC5vYmoxICE9PSBHdWlDb25zdGFudHMuTk9fUk9XX1NFTEVDVEVEKSB7XHJcbiAgICAgICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQub2JqMSwgdHJ1ZSk7XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgICBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLmxpbmUpO1xyXG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnNlbGVjdFJvdyhndWlSb3dJZC50b1N0cmluZygpKTtcclxuICAgICAgICB0aGlzLk9uU2VsZWN0ZWRSb3dDaGFuZ2VkLmVtaXQoZ3VpUm93SWQudG9TdHJpbmcoKSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoY29tbWFuZC5PcGVyYXRpb24gPT09IEh0bWxQcm9wZXJ0aWVzLkVuYWJsZWQpIHtcclxuICAgICAgbGV0IGMgPSB0aGlzLmdldEZvcm1Db250cm9sKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCk7XHJcbiAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoYykpIHtcclxuICAgICAgICBpZiAoY29tbWFuZC5vYmoxKVxyXG4gICAgICAgICAgYy5lbmFibGUoKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICBjLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG4gICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICBwcm9wZXJ0aWVzLnByb3BlcnRpZXMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS5nZXRDb250cm9sTWV0YWRhdGEoY29udHJvbElkKTtcclxuICAgICAgcHJvcGVydGllcy5wcm9wZXJ0aWVzLnNldCg8SHRtbFByb3BlcnRpZXM+Y29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZXhlY3V0ZUNvbW1hbmQoY29tbWFuZDogR3VpQ29tbWFuZCk6IHZvaWQge1xyXG4gICAgbGV0IGR2Um93SWQ6IG51bWJlciA9IChjb21tYW5kLmxpbmUgfHwgMCk7XHJcbiAgICBsZXQgZ3VpUm93SWQ6IG51bWJlciA9IDA7XHJcbiAgICBsZXQgY29udHJvbElkID0gY29tbWFuZC5DdHJsTmFtZTtcclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICBsZXQgaXNUYWJsZUNoaWxkOiBib29sZWFuID0gdGhpcy5pc1RhYmxlQ29udHJvbChjb250cm9sSWQpO1xyXG5cclxuICAgIC8vIEZvciBub24taW5wdXQgdHlwZSBjb250cm9scyBvbiB0YWJsZS5cclxuICAgIGlmIChjb21tYW5kLm9iaiAhPT0gbnVsbClcclxuICAgICAgaXNUYWJsZUNoaWxkID0gaXNUYWJsZUNoaWxkIHx8IGNvbW1hbmQub2JqLklzVGFibGVDaGlsZDtcclxuXHJcbiAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoZHZSb3dJZCwgaXNUYWJsZUNoaWxkKTtcclxuXHJcbiAgICBzd2l0Y2ggKGNvbW1hbmQuQ29tbWFuZFR5cGUpIHtcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfSVNfTE9HR0VEX0lOOlxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfVEFCTEVfVE9QX0lOREVYOlxyXG4gICAgICAgIHRoaXMudGFibGVTZXJ2aWNlLnNldFRhYmxlVG9wSW5kZXgoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlJFRlJFU0hfVEFTSzpcclxuICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5yZWZyZXNoRGF0YVNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMucmVmcmVzaFZpZXcoKTtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1RBQkxFX0lURU1TX0NPVU5UOlxyXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoY29tbWFuZC5udW1iZXIpKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS51cGRhdGVUYWJsZVNpemUoY29tbWFuZC5udW1iZXIpO1xyXG5cclxuICAgICAgICAgIGlmIChjb21tYW5kLm51bWJlciA+IDAgJiYgdGhpcy5SZWNvcmRzLnNpemVVcGRhdGVkICYmXHJcbiAgICAgICAgICAgICF0aGlzLlJlY29yZHMuaXNFbXB0eURhdGFWaWV3KSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVjb3Jkc0NvdW50Q2hhbmdlU3ViamVjdC5uZXh0KGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICAgICAgdGhpcy5SZWNvcmRzLnNpemVVcGRhdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9DSFVOS19TSVpFOlxyXG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoY29tbWFuZC5udW1iZXIpKSB7XHJcbiAgICAgICAgICB0aGlzLnRhYmxlU2VydmljZS5zZXRDaHVua1NpemUoY29tbWFuZC5udW1iZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfUkVDT1JEU19CRUZPUkVfQ1VSUkVOVF9WSUVXOlxyXG4gICAgICAgIHRoaXMudXBkYXRlUmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3KGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuQ1JFQVRFX1RBQkxFX1JPVzpcclxuICAgICAgICBndWlSb3dJZCA9IHRoaXMuZ2V0R3VpUm93SWQoY29tbWFuZC5udW1iZXIsIHRydWUpO1xyXG4gICAgICAgIHRoaXMuYnVpbGRUYWJsZVJvd0NvbnRyb2xzKGd1aVJvd0lkKTtcclxuICAgICAgICB0aGlzLm1hcmtSb3dBc0NyZWF0ZWQoZ3VpUm93SWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfSVNfUk9XX0VESVRJTkc6XHJcbiAgICAgICAgZ3VpUm93SWQgPSB0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQubGluZSwgY29tbWFuZC52YWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zdGFydFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfTk9UX0lTX1JPV19FRElUSU5HOlxyXG4gICAgICAgIGd1aVJvd0lkID0gdGhpcy5nZXRHdWlSb3dJZChjb21tYW5kLmxpbmUsIGNvbW1hbmQudmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc3RvcFJvd0VkaXRpbmcoZ3VpUm93SWQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuVU5ET19DUkVBVEVfVEFCTEVfUk9XOlxyXG4gICAgICAgIHRoaXMubWFya1Jvd0FzTm90Q3JlYXRlZCh0aGlzLmdldEd1aVJvd0lkKGNvbW1hbmQubnVtYmVyLCB0cnVlKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfVEFCTEVfSU5DTFVERVNfRklSU1Q6XHJcbiAgICAgICAgdGhpcy5zZXRJbmNsdWRlc0ZpcnN0KGNvbW1hbmQuQm9vbDEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9UQUJMRV9JTkNMVURFU19MQVNUOlxyXG4gICAgICAgIHRoaXMuc2V0SW5jbHVkZXNMYXN0KGNvbW1hbmQuQm9vbDEpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX1BST1BFUlRZOlxyXG4gICAgICAgIHRoaXMuaGFuZGxlU2V0UHJvcGVydHkoY29tbWFuZCwgaXNUYWJsZUNoaWxkKTtcclxuICAgICAgICBpZiAoY29tbWFuZC5PcGVyYXRpb24gPT0gSHRtbFByb3BlcnRpZXMuUmVhZE9ubHkgfHxcclxuICAgICAgICAgIGNvbW1hbmQuT3BlcmF0aW9uID09IEh0bWxQcm9wZXJ0aWVzLkl0ZW1zTGlzdClcclxuICAgICAgICAgIHRoaXMucmVmcmVzaERvbS5uZXh0KGNvbW1hbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5QUk9QX1NFVF9VU0VSX1BST1BFUlRZOlxyXG4gICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgLy8gaWYgdGhlIHByb3BlcnR5IGhhcyBjaGFuZ2VkLCBzZXQgdGhlIHByb3BlcnR5IGFuZCByYWlzZSB0aGUgc3ViamVjdFxyXG4gICAgICAgIGlmKHByb3BlcnRpZXMudXNlclByb3BlcnRpZXMuZ2V0KGNvbW1hbmQuT3BlcmF0aW9uKSE9PSBjb21tYW5kLm9iajEpIHtcclxuICAgICAgICAgIHByb3BlcnRpZXMudXNlclByb3BlcnRpZXMuc2V0KGNvbW1hbmQuT3BlcmF0aW9uLCBjb21tYW5kLm9iajEpO1xyXG4gICAgICAgICAgLy8gdGhlIHByb3BlcnR5IG5hbWUgaXMgb2YgZm9ybWF0IDxjb250cm9sTmFtZT5+PHByb3BlcnR5TmFtZT5cclxuICAgICAgICAgIHRoaXMuY3VzdG9tUHJvcGVydGllc1N1YmplY3QubmV4dCh7IHByb3BlcnR5TmFtZTogY29udHJvbElkICsgJ34nICsgY29tbWFuZC5PcGVyYXRpb24sIHZhbHVlOiBjb21tYW5kLm9iajEsIHJvd0lkOiBndWlSb3dJZCB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlBST1BfU0VUX0NVU1RPTV9WQUxJREFUT1I6IHtcclxuICAgICAgICAgIHByb3BlcnRpZXMgPSB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgICAgICAgbGV0IGNvbnRyb2wgPSB0aGlzLmdldEZvcm1Db250cm9sKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCk7XHJcbiAgICAgICAgICBpZiAoY29udHJvbCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHByb3BlcnRpZXMuY3VzdG9tVmFsaWRhdG9ycy5zZXQoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgICAgIGlmIChjb250cm9sLnZhbGlkYXRvciAhPSBudWxsKVxyXG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbY29udHJvbC52YWxpZGF0b3IsIHRoaXMuY3VzdG9tVmFsaWRhdG9yKGd1aVJvd0lkLnRvU3RyaW5nKCksIGNvbnRyb2xJZCldKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLmN1c3RvbVZhbGlkYXRvcihndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpKTtcclxuXHJcbiAgICAgICAgICAgICBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9DTEFTUzpcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMuc2V0Q2xhc3MoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9TVFlMRTpcclxuICAgICAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbZ3VpUm93SWRdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMuc2V0U3R5bGUoY29tbWFuZC5PcGVyYXRpb24sIGNvbW1hbmQub2JqMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9BVFRSSUJVVEU6XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0WzBdLmdldENvbnRyb2xNZXRhZGF0YShjb250cm9sSWQpO1xyXG4gICAgICAgIHByb3BlcnRpZXMuZGF0YVR5cGUgPSA8U3RvcmFnZUF0dHJpYnV0ZT5TdHJpbmcuZnJvbUNoYXJDb2RlKGNvbW1hbmQubnVtYmVyKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgIENvbW1hbmRUeXBlLlNFVF9WQUxVRTpcclxuICAgICAgICB0aGlzLlJlY29yZHMubGlzdFtndWlSb3dJZF0udmFsdWVzW2NvbnRyb2xJZF0gPSBjb21tYW5kLnZhbHVlO1xyXG4gICAgICAgIGxldCBjID0gdGhpcy5nZXRGb3JtQ29udHJvbChndWlSb3dJZC50b1N0cmluZygpLCBjb250cm9sSWQpO1xyXG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoYykpIHtcclxuICAgICAgICAgIGMuc2V0VmFsdWUodGhpcy5Db252ZXJ0VmFsRnJvbU5hdGl2ZShjb250cm9sSWQsIGNvbW1hbmQubGluZSwgY29tbWFuZC52YWx1ZSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLkNSRUFURV9TVUJfRk9STTpcclxuICAgICAgICB0aGlzLm1nU3ViZm9ybVNlcnZpY2UuYWRkU3ViZm9ybUNvbXAoY29tbWFuZC5DdHJsTmFtZSwgY29tbWFuZC51c2VyRHJvcEZvcm1hdC50b1N0cmluZygpLCBjb21tYW5kLnN0ciwgY29tbWFuZC5maWxlTmFtZSwgY29tbWFuZC5jb250ZXh0SUQsIGNvbW1hbmQucGFyYW1zLCBjb21tYW5kLkJvb2wxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuQ0xPU0VfU1VCX0ZPUk06XHJcbiAgICAgICAgdGhpcy5tZ1N1YmZvcm1TZXJ2aWNlLmRlbGV0ZVN1YmZvcm1Db21wKGNvbW1hbmQuQ3RybE5hbWUsIGNvbW1hbmQudXNlckRyb3BGb3JtYXQudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIENvbW1hbmRUeXBlLlNFVF9FTVBUWV9EQVRBVklFVzpcclxuICAgICAgICB0aGlzLnNldElzRW1wdHlEYXRhVmlldyhjb21tYW5kLkJvb2wxKTtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgQ29tbWFuZFR5cGUuU0VUX0ZPQ1VTOlxyXG4gICAgICAgIHRoaXMucmVmcmVzaERvbS5uZXh0KGNvbW1hbmQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBDb21tYW5kVHlwZS5TRVRfV0NfSURMRTpcclxuICAgICAgICB0aGlzLm1nTG9hZFN1YmplY3QubmV4dCgpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIGN1c3RvbSB2YWxpZGF0b3JcclxuICAqL1xyXG4gIGN1c3RvbVZhbGlkYXRvcihyb3dpZDogc3RyaW5nLCBpZDogc3RyaW5nKTogVmFsaWRhdG9yRm4ge1xyXG5cclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyA9PiB7XHJcbiAgICAgIGxldCBjb250cm9sTWV0YWRhdGE6IENvbnRyb2xNZXRhZGF0YTtcclxuICAgICAgY29udHJvbE1ldGFkYXRhID0gdGhpcy5SZWNvcmRzLmxpc3Rbcm93aWRdLmdldENvbnRyb2xNZXRhZGF0YShpZCk7XHJcbiAgICAgIGZvciAobGV0IGtleSBvZiBjb250cm9sTWV0YWRhdGEuY3VzdG9tVmFsaWRhdG9ycy5rZXlzKCkpIHtcclxuICAgICAgICBsZXQgdmFsaWRhdG9yID0gY29udHJvbE1ldGFkYXRhLmN1c3RvbVZhbGlkYXRvcnMuZ2V0KGtleSk7XHJcbiAgICAgICAgaWYgKCEoPEN1c3RvbVZhbGlkYXRvcj52YWxpZGF0b3IpLmlzVmFsaWQoKSkge1xyXG4gICAgICAgICAgcmV0dXJuIHsgW2tleV06IHRydWUgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ09udmVydCBhIHZhbHVlIGZyb20gTWFnaWMgZm9ybWF0IHRvIG5hdGl2ZSBmb3JtYXRcclxuICAgKiBAcGFyYW0gY29udHJvbElkIElkIG9mIGNvbnRyb2xcclxuICAgKiBAcGFyYW0gIHJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqIEBwYXJhbSB2YWwgVmFsdWUgdG8gY29udmVydFxyXG4gICAqIEByZXR1cm5zIENvbnZlcnRlZCB2YWx1ZVxyXG4gICAqL1xyXG4gIENvbnZlcnRWYWxUb05hdGl2ZShjb250cm9sSWQ6IHN0cmluZywgcm93SWQ6IG51bWJlciwgdmFsOiBhbnkpOiBhbnkge1xyXG5cclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbMF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgc3dpdGNoIChwcm9wZXJ0aWVzLmRhdGFUeXBlKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjoge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgbGV0IHJhbmdlczogc3RyaW5nID0gdGhpcy5HZXRGbGRSYW5nZXMoY29udHJvbElkKTtcclxuICAgICAgICAgIGxldCBmb3VuZDogbnVtYmVyID0gcmFuZ2VzLmluZGV4T2YoJywnKTtcclxuICAgICAgICAgIGxldCB0cnVlT3B0aW9uOiBzdHJpbmcgPSByYW5nZXMuc3Vic3RyKDAsIGZvdW5kKTtcclxuICAgICAgICAgIGxldCBmYWxzZU9wdGlvbjogc3RyaW5nID0gcmFuZ2VzLnN1YnN0cihmb3VuZCArIDEpO1xyXG4gICAgICAgICAgaWYgKE5TdHJpbmcuRXF1YWxzKHZhbCwgdHJ1ZU9wdGlvbiwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgZWxzZSBpZiAoTlN0cmluZy5FcXVhbHModmFsLCBmYWxzZU9wdGlvbiwgdHJ1ZSkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9IGVsc2VcclxuICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNhc2UgU3RvcmFnZUF0dHJpYnV0ZS5USU1FOiB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKXtcclxuICAgICAgICBsZXQgaWR4ID0gdmFsLmluZGV4T2YoJzonLDApO1xyXG4gICAgICAgIGxldCBob3VyczogbnVtYmVyID0gK3ZhbC5zdWJzdHIoMCwgaWR4KTtcclxuICAgICAgICBsZXQgbWludXRlczogbnVtYmVyID0gK3ZhbC5zdWJzdHIoaWR4KzEsIDIpO1xyXG4gICAgICAgIGxldCBzZWNvbmRzID0gMDtcclxuICAgICAgICBpZiAodmFsLmxlbmd0aCA+IDUpIHtcclxuICAgICAgICAgIGlkeCA9IHZhbC5pbmRleE9mKCc6JywgaWR4ICsgMSk7XHJcbiAgICAgICAgICBpZiAoaWR4ID49IDApXHJcbiAgICAgICAgICAgIHNlY29uZHMgPSArdmFsLnN1YnN0cihpZHggKyAxLCAyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbC5pbmRleE9mKCdQTScpPjApXHJcbiAgICAgICAgICBob3VycyArPSAxMjtcclxuICAgICAgICBsZXQgZHQ6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgICAgIGR0LnNldEhvdXJzKGhvdXJzKTtcclxuICAgICAgICBkdC5zZXRNaW51dGVzKG1pbnV0ZXMpO1xyXG4gICAgICAgIGR0LnNldFNlY29uZHMoc2Vjb25kcyk7XHJcblxyXG5cclxuICAgICAgICByZXR1cm4gZHQ7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuTlVNRVJJQzpcclxuICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWwpKVxyXG4gICAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgICBlbHNlIHJldHVybiAodmFsICE9IG51bGwpID8gKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSA/IHZhbCA6ICt2YWwgOiBudWxsO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiB2YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb252ZXJ0IGEgdmFsdWUgZnJvbSBuYXRpdmUgdG8gTWFnaWMgZm9ybWF0XHJcbiAgICogQHBhcmFtIGNvbnRyb2xJZCBJZCBvZiBjb250cm9sXHJcbiAgICogQHBhcmFtICByb3dJZCBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKiBAcGFyYW0gdmFsIFZhbHVlIHRvIGNvbnZlcnRcclxuICAgKiBAcmV0dXJucyBDb252ZXJ0ZWQgdmFsdWVcclxuICAgKi9cclxuICBDb252ZXJ0VmFsRnJvbU5hdGl2ZShjb250cm9sSWQ6IHN0cmluZywgcm93SWQ6IG51bWJlciwgdmFsOiBhbnkpOiBhbnkge1xyXG5cclxuICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICBwcm9wZXJ0aWVzID0gdGhpcy5SZWNvcmRzLmxpc3RbMF0uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcblxyXG4gICAgc3dpdGNoIChwcm9wZXJ0aWVzLmRhdGFUeXBlKSB7XHJcblxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuVElNRToge1xyXG4gICAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICBsZXQgc3RyOiBTdHJpbmdCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTtcclxuICAgICAgICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IHZhbC5nZXRIb3VycygpID4gOSA/ICd7MH0nIDogJzB7MH0nO1xyXG4gICAgICAgICAgc3RyLkFwcGVuZEZvcm1hdChmb3JtYXQsIHZhbC5nZXRIb3VycygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgc3RyLkFwcGVuZCgnOicpO1xyXG4gICAgICAgICAgZm9ybWF0ID0gdmFsLmdldE1pbnV0ZXMoKSA+IDkgPyAnezB9JyA6ICcwezB9JztcclxuICAgICAgICAgIHN0ci5BcHBlbmRGb3JtYXQoZm9ybWF0LCB2YWwuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgaWYgKCB2YWwuZ2V0U2Vjb25kcygpID4gMCkge1xyXG4gICAgICAgICAgICBzdHIuQXBwZW5kKCc6Jyk7XHJcbiAgICAgICAgICAgIGZvcm1hdCA9IHZhbC5nZXRTZWNvbmRzKCkgPiA5ID8gJ3swfScgOiAnMHswfSc7XHJcbiAgICAgICAgICAgIHN0ci5BcHBlbmRGb3JtYXQoZm9ybWF0LCB2YWwuZ2V0U2Vjb25kcygpLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHN0ci5Ub1N0cmluZygpO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgfVxyXG4gICAgICBjYXNlIFN0b3JhZ2VBdHRyaWJ1dGUuQk9PTEVBTjoge1xyXG4gICAgICAgIGxldCBwcm9wZXJ0aWVzOiBDb250cm9sTWV0YWRhdGE7XHJcbiAgICAgICAgcHJvcGVydGllcyA9IHRoaXMuUmVjb3Jkcy5saXN0WycwJ10uZ2V0Q29udHJvbE1ldGFkYXRhKGNvbnRyb2xJZCk7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdib29sZWFuJyAmJiBwcm9wZXJ0aWVzLnJhbmdlVmFsaWRhdG9yKSB7XHJcbiAgICAgICAgICBsZXQgcmFuZ2VzOiBzdHJpbmcgPSB0aGlzLkdldEZsZFJhbmdlcyhjb250cm9sSWQpO1xyXG4gICAgICAgICAgbGV0IGZvdW5kOiBudW1iZXIgPSByYW5nZXMuaW5kZXhPZignLCcpO1xyXG4gICAgICAgICAgbGV0IHRydWVPcHRpb246IHN0cmluZyA9IHJhbmdlcy5zdWJzdHIoMCwgZm91bmQpO1xyXG4gICAgICAgICAgbGV0IGZhbHNlT3B0aW9uOiBzdHJpbmcgPSByYW5nZXMuc3Vic3RyKGZvdW5kICsgMSk7XHJcbiAgICAgICAgICBpZiAodmFsKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZU9wdGlvbjtcclxuICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlT3B0aW9uO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHJlc2l6ZSBhbmQgYWxzbyBmZXRjaCBjaHVuayBvZiByZWNvcmRzIGlmIGhhdmluZyBhbiBlbXB0eSB2aWV3LlxyXG4gICAqIEBpZ25vcmVcclxuICAgKiBAcGFyYW0gcGFnZVNpemUgOiBQYWdlU2l6ZVxyXG4gICAqIEBwYXJhbSB0b3BHdWlSb3dJZCA6IEd1aVJvd0lkIG9mIGZpcnN0IHJlY29yZCBpbiB2aWV3LlxyXG4gICAqL1xyXG4gICByZXNpemUocGFnZVNpemU6IG51bWJlciwgdG9wR3VpUm93SWQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGd1aUV2ZW50OiBJR3VpRXZlbnQgPSBnZXRHdWlFdmVudE9iaigncmVzaXplJywgJ3RhYmxlJywgMCk7XHJcbiAgICBndWlFdmVudC5QYWdlU2l6ZSA9IHBhZ2VTaXplO1xyXG5cclxuICAgIC8vQXMgJ2dldFJvd3MnIGV2ZW50IGFsc28gZ2V0cyBleGVjdXRlZCwgc2V0IHRoZSBndWlFdmVudC5MaW5lIHBhcmFtZXRlci5cclxuICAgIGd1aUV2ZW50LkxpbmUgPSB0b3BHdWlSb3dJZDtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRmV0Y2hlcyBkYXRhIGZvciBuZXcgdGFibGUgcm93cyB3aGVuIHNjcm9sbGluZyBkb25lXHJcbiAgICovXHJcbiAgb25TY3JvbGxEb3duKCkge1xyXG4gICAgaWYgKCF0aGlzLlJlY29yZHMuaW5jbHVkZXNMYXN0KSB7XHJcbiAgICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ2dldFJvd3MnLCAnJywgMCk7XHJcbiAgICAgIGd1aUV2ZW50LkxpbmUgPSB0aGlzLmZvcm1Hcm91cHMubGVuZ3RoO1xyXG4gICAgICB0aGlzLmluc2VydEV2ZW50KGd1aUV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIG5ldyBicm93c2VyIHdpbmRvdyB0aXRsZVxyXG4gICAqIEBwYXJhbSBuZXdUaXRsZSBOZXcgd2luZG93IHRpdGxlXHJcbiAgICovXHJcbiAgc2V0VGl0bGUobmV3VGl0bGU6IHN0cmluZykge1xyXG4gICAgdGhpcy5tZ1RpdGxlU2VydmljZS5zZXRUaXRsZShuZXdUaXRsZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGdldEd1aVJvd0lkKGR2Um93SWQ6IG51bWJlciwgaXNUYWJsZUNvbnRyb2w6IGJvb2xlYW4pOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChpc1RhYmxlQ29udHJvbCA/IGR2Um93SWQgKyB0aGlzLlJlY29yZHMucmVjb3Jkc0JlZm9yZUN1cnJlbnRWaWV3IDogMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBnZXREdlJvd0lkKGd1aVJvd0lkOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChndWlSb3dJZCAtIHRoaXMuUmVjb3Jkcy5yZWNvcmRzQmVmb3JlQ3VycmVudFZpZXcpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYW4gdXAgdGhlIHNlcnZpY2Ugd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkXHJcbiAgICovXHJcbiAgZGlzcG9zZSgpIHtcclxuICAgICB0aGlzLnJlZnJlc2hEb20uY29tcGxldGUoKTtcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlcy5jb21wbGV0ZSgpO1xyXG4gICAgdGhpcy5zdWJzY3JpYmVJbnRlcmFjdGl2ZUNvbW1hbmRzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLnN1YnNjcmliZVJlZnJlc2hEb20udW5zdWJzY3JpYmUoKTtcclxuICAgICB0aGlzLmludGVyYWN0aXZlQ29tbWFuZHMuY29tcGxldGUoKTtcclxuICAgICB0aGlzLmN1c3RvbVByb3BlcnRpZXNTdWJqZWN0LmNvbXBsZXRlKCk7XHJcbiAgICAgdGhpcy5PblNlbGVjdGVkUm93Q2hhbmdlZC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xyXG4gIC8vRXZlbnRzOlxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGhlIENvbWJvYm94IFwiY2hhbmdlXCIgZXZlbnRcclxuICAgKiBAcGFyYW0gZXZlbnQgIFRoZSBldmVudCByZWNlaXZlZCBmcm9tIHRoZSBVSVxyXG4gICAqIEBwYXJhbSBpZHggSWQgb2YgdGhlIGNvbnRyb2wgcmFpc2luZyB0aGUgZXZlbnRcclxuICAgKiBAcGFyYW0gbGluZSBSb3cgSWQsIGlmIGFwcGxpY2FibGVcclxuICAgKi9cclxuICBvbkNvbWJvYm94U2VsZWN0aW9uQ2hhbmdlZChldmVudDogRXZlbnQsIGlkeDogc3RyaW5nLCBsaW5lOiBudW1iZXIpIHtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIGxpbmUpO1xyXG5cclxuICAgIGlmICh0eXBlb2YgKGV2ZW50KSA9PSAnbnVtYmVyJykge1xyXG4gICAgICAgIGd1aUV2ZW50LlZhbHVlID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGV2ZW50LnRhcmdldCkpIHtcclxuICAgICAgICAgICAgbGV0IGluZGV4ZXM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4oKDxhbnk+ZXZlbnQudGFyZ2V0KS5zZWxlY3RlZE9wdGlvbnMubGVuZ3RoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAoPGFueT5ldmVudC50YXJnZXQpLnNlbGVjdGVkT3B0aW9ucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaW5kZXhlc1tpXSA9ICg8SFRNTE9wdGlvbkVsZW1lbnQ+KDxhbnk+ZXZlbnQudGFyZ2V0KS5zZWxlY3RlZE9wdGlvbnNbaV0pLmluZGV4O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGd1aUV2ZW50LlZhbHVlID0gaW5kZXhlcy5qb2luKCcsJyk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIGd1aUV2ZW50LlZhbHVlID0gKDxhbnk+ZXZlbnQpLnZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHRoZSBMaXN0Ym94IFwiY2hhbmdlXCIgZXZlbnRcclxuICAgKiBAcGFyYW0gIGV2ZW50IFRoZSBldmVudCByZWNlaXZlZCBmcm9tIHRoZSBVSVxyXG4gICAqIEBwYXJhbSBpZHggSWQgb2YgdGhlIGNvbnRyb2wgcmFpc2luZyB0aGUgZXZlbnRcclxuICAgKi9cclxuICBvbkxpc3RCb3hTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50OiBFdmVudCwgaWR4OiBzdHJpbmcpIHtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIDApO1xyXG5cclxuICAgIGxldCBzZWxlY3RlZE9wdGlvbnM7XHJcbiAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGV2ZW50LnRhcmdldCkpXHJcbiAgICAgIHNlbGVjdGVkT3B0aW9ucyA9ICg8YW55PmV2ZW50LnRhcmdldCkuc2VsZWN0ZWRPcHRpb25zO1xyXG4gICAgZWxzZVxyXG4gICAgICBzZWxlY3RlZE9wdGlvbnMgPSAoPGFueT5ldmVudCkuc291cmNlLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZDtcclxuXHJcbiAgICBsZXQgbGVuZ3RoID0gc2VsZWN0ZWRPcHRpb25zLmxlbmd0aDtcclxuICAgIGxldCBpbmRleGVzOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KGxlbmd0aCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGV2ZW50LnRhcmdldCkpXHJcbiAgICAgICAgaW5kZXhlc1tpXSA9IChzZWxlY3RlZE9wdGlvbnNbaV0pLmluZGV4O1xyXG4gICAgICBlbHNlXHJcbiAgICAgICAgaW5kZXhlc1tpXSA9IChzZWxlY3RlZE9wdGlvbnNbaV0pLnZhbHVlO1xyXG4gICAgfVxyXG4gICAgZ3VpRXZlbnQuVmFsdWUgPSA8YW55PmluZGV4ZXM7IC8vIFRPRE86IGZpeFxyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGhlIENoZWNrYm94IFwiY2hhbmdlXCIgZXZlbnRcclxuICAgKiBAcGFyYW0gIGV2ZW50IFRoZSBldmVudCByZWNlaXZlZCBmcm9tIHRoZSBVSVxyXG4gICAqIEBwYXJhbSBpZHggSWQgb2YgdGhlIGNvbnRyb2wgcmFpc2luZyB0aGUgZXZlbnRcclxuICAgKiBAcGFyYW0gIHJvd0lkIFJvdyBJZCwgaWYgYXBwbGljYWJsZVxyXG4gICAqL1xyXG4gIG9uQ2hlY2tDaGFuZ2VkKGV2ZW50OiBFdmVudCwgaWR4OiBzdHJpbmcsIHJvd0lkOiBudW1iZXIpIHtcclxuICAgIGlmICh0eXBlb2Ygcm93SWQgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICByb3dJZCA9IDA7XHJcbiAgICBsZXQgZ3VpRXZlbnQ6IElHdWlFdmVudCA9IGdldEd1aUV2ZW50T2JqKCdzZWxlY3Rpb25jaGFuZ2VkJywgaWR4LCByb3dJZCk7XHJcblxyXG4gICAgaWYgKHR5cGVvZiAoZXZlbnQpID09ICdib29sZWFuJykge1xyXG4gICAgICAgIGd1aUV2ZW50LlZhbHVlID0gZXZlbnQ7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgICBpZiAodHlwZW9mIGV2ZW50LnRhcmdldCA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIGd1aUV2ZW50LlZhbHVlID0gKDxhbnk+KGV2ZW50KSkuY2hlY2tlZDtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGd1aUV2ZW50LlZhbHVlID0gKDxhbnk+KGV2ZW50LnRhcmdldCkpLmNoZWNrZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBIYW5kbGUgdGFiIHNlbGVjdGlvbiBjaGFuZ2UsIGNhdXNlZCBieSBVSSBldmVudHNcclxuICAgKiBAcGFyYW0gaWR4IElkIG9mIHRoZSBjb250cm9sIHJhaXNpbmcgdGhlIGV2ZW50XHJcbiAgICogQHBhcmFtICBsYXllciBJZCBvZiBzZWxlY3RlZCB0YWJwYWdlXHJcbiAgICovXHJcbiAgbWdPblRhYlNlbGVjdGlvbkNoYW5nZWQoaWR4OiBzdHJpbmcsIGxheWVyOiBudW1iZXIpIHtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIDApO1xyXG4gICAgZ3VpRXZlbnQuVmFsdWUgPSBsYXllci50b1N0cmluZygpO1xyXG4gICAgdGhpcy5pbnNlcnRFdmVudChndWlFdmVudCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIHRoZSBSYWRpbyBidXR0b24gXCJjaGFuZ2VcIiBldmVudFxyXG4gICAqIEBwYXJhbSAgZXZlbnQgVGhlIGV2ZW50IHJlY2VpdmVkIGZyb20gdGhlIFVJXHJcbiAgICogQHBhcmFtIGlkeCBJZCBvZiB0aGUgY29udHJvbCByYWlzaW5nIHRoZSBldmVudFxyXG4gICAqL1xyXG4gIG1nT25SYWRpb1NlbGVjdGlvbkNoYW5nZWQoaWR4OiBzdHJpbmcpIHtcclxuICAgIGxldCByZXN1bHQgPSB0aGlzLmdldEZvcm1Db250cm9sKCcwJywgaWR4KTtcclxuICAgIGxldCBndWlFdmVudDogSUd1aUV2ZW50ID0gZ2V0R3VpRXZlbnRPYmooJ3NlbGVjdGlvbmNoYW5nZWQnLCBpZHgsIDApO1xyXG4gICAgaWYodHlwZW9mIHJlc3VsdC52YWx1ZSAhPT0gJ251bWJlcicpXHJcbiAgICAgIGd1aUV2ZW50LlZhbHVlID0gcmVzdWx0LnZhbHVlLmluZGV4O1xyXG4gICAgZWxzZVxyXG4gICAgICBndWlFdmVudC5WYWx1ZSA9ICByZXN1bHQudmFsdWUudG9TdHJpbmcoKTtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ3VpRXZlbnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5zZXJ0cyB0aGUgXCJjbG9zZVwiIGV2ZW50IHRvIHRoZSBtYWdpYyBXZWJDbGllbnQgZXZlbnQgcXVldWVcclxuICAgKi9cclxuICBjbG9zZSgpIHtcclxuICAgIHRoaXMuaW5zZXJ0RXZlbnQoZ2V0R3VpRXZlbnRPYmooJ2Nsb3NlJywgbnVsbCwgMCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBJc1N0dWIoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYWdpYy5pc1N0dWI7XHJcblxyXG4gIH1cclxuXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxuICAvLy9TdHViIGhhbmRsaW5nXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGpzb25EYXRhOiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzYXZlRGF0YShkYXRhOiBzdHJpbmcpIHtcclxuICAgIHRoaXMubWFnaWMuc2F2ZURhdGEoZGF0YSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaWdub3JlXHJcbiAgICovXHJcbiAgcHVibGljIGNyZWF0ZURhdGEoKSB7XHJcbiAgICBsZXQgbXlEYXRhID0ge1xyXG4gICAgICByZWNvcmRzOiB0aGlzLlJlY29yZHMsXHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRlbXBsYXRlXHJcbiAgICB9O1xyXG4gICAgbGV0IHRleHQ6IHN0cmluZyA9ICdsb2FkRGF0YSgpOmFueSAgIHtcXG4nICtcclxuICAgICAgJyAgICBsZXQgc3R1YkRhdGEgPSAnICsgSlNPTi5zdHJpbmdpZnkobXlEYXRhKSArICc7XFxuJyArXHJcbiAgICAgICcgICAgdGhpcy5sb2FkU3R1YkRhdGEoc3R1YkRhdGEpO30nO1xyXG4gICAgY29uc29sZS5sb2codGV4dCk7XHJcbiAgICB0aGlzLnNhdmVEYXRhKHRleHQpO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBwdWJsaWMgbG9hZFN0dWJEYXRhKHN0dWJEYXRhOiBhbnkpIHtcclxuXHJcbiAgICB0aGlzLlJlY29yZHMgPSBzdHViRGF0YS5yZWNvcmRzO1xyXG4gICAgdGhpcy5zZXR0ZW1wbGF0ZShzdHViRGF0YS50ZW1wbGF0ZSk7XHJcbiAgICB0aGlzLnRhc2tJZCA9ICcxJztcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5SZWNvcmRzLmxpc3QubGVuZ3RoOyBpKyspXHJcbiAgICAgIHRoaXMuYnVpbGRUYWJsZVJvd0NvbnRyb2xzKGkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIHB1YmxpYyBsb2FkRGF0YSgpIHtcclxuICAgIGFsZXJ0KCdQbGVhc2UsIG92ZXJ3cml0ZSBtZXRob2QgbG9hZERhdGEnKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBpZ25vcmVcclxuICAgKi9cclxuICBzZXRTdHViVmFsdWUoZ3VpUm93SWQ6IG51bWJlciwgZmM6IEZvcm1Db250cm9sLCBuYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLklzU3R1YigpKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuUmVjb3Jkcy5saXN0W2d1aVJvd0lkXS52YWx1ZXNbbmFtZV07XHJcbiAgICAgICAgZmMuc2V0VmFsdWUodmFsKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBFbmQgb2Ygc3R1YiBoYW5kbGluXHJcbiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cclxufVxyXG5cclxuIl19