barsa-tiles 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/README.md +25 -0
  2. package/esm2020/barsa-tiles.mjs +5 -0
  3. package/esm2020/lib/action-item/action-item.component.mjs +17 -0
  4. package/esm2020/lib/action-links.pipe.mjs +16 -0
  5. package/esm2020/lib/actions-link/actions-link.component.mjs +19 -0
  6. package/esm2020/lib/app-finder/app-finder.component.mjs +53 -0
  7. package/esm2020/lib/app-finder-app-list/app-finder-app-list.component.mjs +40 -0
  8. package/esm2020/lib/app-finder-group/app-finder-group.component.mjs +42 -0
  9. package/esm2020/lib/app-finder.service.mjs +121 -0
  10. package/esm2020/lib/barsa-tiles.module.mjs +196 -0
  11. package/esm2020/lib/change-app-tile/change-app-tile.component.mjs +47 -0
  12. package/esm2020/lib/create-app-group/create-app-group.component.mjs +44 -0
  13. package/esm2020/lib/directives/emptylist.directive.mjs +36 -0
  14. package/esm2020/lib/feed-tile/feed-tile.component.mjs +31 -0
  15. package/esm2020/lib/footer-edit-tile/footer-edit-tile.component.mjs +13 -0
  16. package/esm2020/lib/footer-tile/footer-tile.component.mjs +28 -0
  17. package/esm2020/lib/form-app-finder/form-app-finder.component.mjs +94 -0
  18. package/esm2020/lib/form-tile/form-tile.component.mjs +34 -0
  19. package/esm2020/lib/logo-tile/logo-tile.component.mjs +22 -0
  20. package/esm2020/lib/micro-tile-chart-area/micro-tile-chart-area.component.mjs +39 -0
  21. package/esm2020/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.mjs +28 -0
  22. package/esm2020/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.mjs +26 -0
  23. package/esm2020/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.mjs +19 -0
  24. package/esm2020/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.mjs +30 -0
  25. package/esm2020/lib/micro-tile-chart-line/micro-tile-chart-line.component.mjs +31 -0
  26. package/esm2020/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.mjs +26 -0
  27. package/esm2020/lib/models/app-tile-footer-section.mjs +2 -0
  28. package/esm2020/lib/models/app-tile-footer.mjs +2 -0
  29. package/esm2020/lib/models/app-tile-group-pin.mjs +2 -0
  30. package/esm2020/lib/models/base-bt-tile-component.mjs +20 -0
  31. package/esm2020/lib/models/base-tile-component.mjs +57 -0
  32. package/esm2020/lib/models/base-tile-setting.mjs +2 -0
  33. package/esm2020/lib/models/feed-tile-setting.mjs +2 -0
  34. package/esm2020/lib/models/index.mjs +14 -0
  35. package/esm2020/lib/models/logo-tile-setting.mjs +2 -0
  36. package/esm2020/lib/models/micro-tile-chart-bullet-setting.mjs +2 -0
  37. package/esm2020/lib/models/news-tile-setting.mjs +2 -0
  38. package/esm2020/lib/models/numeric-tile-setting.mjs +2 -0
  39. package/esm2020/lib/models/profile-tile-setting.mjs +2 -0
  40. package/esm2020/lib/models/tile-setting.mjs +2 -0
  41. package/esm2020/lib/models/user-portal-settings.mjs +2 -0
  42. package/esm2020/lib/news-tile/news-tile.component.mjs +59 -0
  43. package/esm2020/lib/numeric-tile/numeric-tile.component.mjs +33 -0
  44. package/esm2020/lib/pin-tile/pin-tile.component.mjs +111 -0
  45. package/esm2020/lib/pipes/group-tiles.pipe.mjs +31 -0
  46. package/esm2020/lib/pipes/home-group.pipe.mjs +17 -0
  47. package/esm2020/lib/pipes/tile-home-filter.pipe.mjs +28 -0
  48. package/esm2020/lib/profile-tile/profile-tile.component.mjs +25 -0
  49. package/esm2020/lib/shellbar/shellbar.component.mjs +159 -0
  50. package/esm2020/lib/simple-tile/simple-tile.component.mjs +17 -0
  51. package/esm2020/lib/tile/tile.component.mjs +47 -0
  52. package/esm2020/lib/tile-renderer.directive.mjs +69 -0
  53. package/esm2020/lib/tiles-viewer/tiles-viewer.component.mjs +118 -0
  54. package/esm2020/lib/tiles-viewer-container/tiles-viewer-container.component.mjs +158 -0
  55. package/esm2020/lib/tiles-viewer-group/tiles-viewer-group.component.mjs +75 -0
  56. package/esm2020/lib/tiles-viewer.service.mjs +130 -0
  57. package/esm2020/lib/tiles.service.mjs +500 -0
  58. package/esm2020/public-api.mjs +43 -0
  59. package/fesm2015/barsa-tiles.mjs +2415 -0
  60. package/fesm2015/barsa-tiles.mjs.map +1 -0
  61. package/fesm2020/barsa-tiles.mjs +2386 -0
  62. package/fesm2020/barsa-tiles.mjs.map +1 -0
  63. package/index.d.ts +5 -0
  64. package/lib/action-item/action-item.component.d.ts +6 -0
  65. package/lib/action-links.pipe.d.ts +7 -0
  66. package/lib/actions-link/actions-link.component.d.ts +8 -0
  67. package/lib/app-finder/app-finder.component.d.ts +24 -0
  68. package/lib/app-finder-app-list/app-finder-app-list.component.d.ts +20 -0
  69. package/lib/app-finder-group/app-finder-group.component.d.ts +14 -0
  70. package/lib/app-finder.service.d.ts +33 -0
  71. package/lib/barsa-tiles.module.d.ts +65 -0
  72. package/lib/change-app-tile/change-app-tile.component.d.ts +20 -0
  73. package/lib/create-app-group/create-app-group.component.d.ts +19 -0
  74. package/lib/directives/emptylist.directive.d.ts +14 -0
  75. package/lib/feed-tile/feed-tile.component.d.ts +11 -0
  76. package/lib/footer-edit-tile/footer-edit-tile.component.d.ts +6 -0
  77. package/lib/footer-tile/footer-tile.component.d.ts +11 -0
  78. package/lib/form-app-finder/form-app-finder.component.d.ts +38 -0
  79. package/lib/form-tile/form-tile.component.d.ts +24 -0
  80. package/lib/logo-tile/logo-tile.component.d.ts +7 -0
  81. package/lib/micro-tile-chart-area/micro-tile-chart-area.component.d.ts +8 -0
  82. package/lib/micro-tile-chart-bar/micro-tile-chart-bar.component.d.ts +12 -0
  83. package/lib/micro-tile-chart-bullet/micro-tile-chart-bullet.component.d.ts +16 -0
  84. package/lib/micro-tile-chart-circular/micro-tile-chart-circular.component.d.ts +7 -0
  85. package/lib/micro-tile-chart-comparison/micro-tile-chart-comparison.component.d.ts +8 -0
  86. package/lib/micro-tile-chart-line/micro-tile-chart-line.component.d.ts +8 -0
  87. package/lib/micro-tile-chart-stackbar/micro-tile-chart-stackbar.component.d.ts +8 -0
  88. package/lib/models/app-tile-footer-section.d.ts +6 -0
  89. package/lib/models/app-tile-footer.d.ts +8 -0
  90. package/lib/models/app-tile-group-pin.d.ts +5 -0
  91. package/lib/models/base-bt-tile-component.d.ts +9 -0
  92. package/lib/models/base-tile-component.d.ts +26 -0
  93. package/lib/models/base-tile-setting.d.ts +5 -0
  94. package/lib/models/feed-tile-setting.d.ts +7 -0
  95. package/lib/models/index.d.ts +13 -0
  96. package/lib/models/logo-tile-setting.d.ts +6 -0
  97. package/lib/models/micro-tile-chart-bullet-setting.d.ts +10 -0
  98. package/lib/models/news-tile-setting.d.ts +4 -0
  99. package/lib/models/numeric-tile-setting.d.ts +9 -0
  100. package/lib/models/profile-tile-setting.d.ts +7 -0
  101. package/lib/models/tile-setting.d.ts +9 -0
  102. package/lib/models/user-portal-settings.d.ts +9 -0
  103. package/lib/news-tile/news-tile.component.d.ts +24 -0
  104. package/lib/numeric-tile/numeric-tile.component.d.ts +12 -0
  105. package/lib/pin-tile/pin-tile.component.d.ts +30 -0
  106. package/lib/pipes/group-tiles.pipe.d.ts +14 -0
  107. package/lib/pipes/home-group.pipe.d.ts +9 -0
  108. package/lib/pipes/tile-home-filter.pipe.d.ts +8 -0
  109. package/lib/profile-tile/profile-tile.component.d.ts +7 -0
  110. package/lib/shellbar/shellbar.component.d.ts +64 -0
  111. package/lib/simple-tile/simple-tile.component.d.ts +6 -0
  112. package/lib/tile/tile.component.d.ts +12 -0
  113. package/lib/tile-renderer.directive.d.ts +27 -0
  114. package/lib/tiles-viewer/tiles-viewer.component.d.ts +51 -0
  115. package/lib/tiles-viewer-container/tiles-viewer-container.component.d.ts +55 -0
  116. package/lib/tiles-viewer-group/tiles-viewer-group.component.d.ts +34 -0
  117. package/lib/tiles-viewer.service.d.ts +42 -0
  118. package/lib/tiles.service.d.ts +68 -0
  119. package/package.json +31 -0
  120. package/public-api.d.ts +39 -0
@@ -0,0 +1,500 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { Subject, BehaviorSubject, of, from } from 'rxjs';
3
+ import { concatMap, distinctUntilChanged, filter, shareReplay, startWith, takeUntil, tap } from 'rxjs/operators';
4
+ import { BarsaApi } from 'barsa-novin-ray-core';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "barsa-novin-ray-core";
7
+ import * as i2 from "@fundamental-ngx/core";
8
+ export class TilesService {
9
+ constructor(_portalService, _rtlService, _bbbTranslatePipe) {
10
+ this._portalService = _portalService;
11
+ this._rtlService = _rtlService;
12
+ this._bbbTranslatePipe = _bbbTranslatePipe;
13
+ this.shellbarSource = new Subject();
14
+ this._OnDestroy$ = new Subject();
15
+ this._homeAppTileGroupsSource = new BehaviorSubject([]);
16
+ this.pinTilesSource = new Subject();
17
+ this._appTileGroupsSource = new BehaviorSubject(null);
18
+ this._edithomeSource = new BehaviorSubject(false);
19
+ BarsaApi.Bw.TilesService = this;
20
+ this.homeAppTileGroups$ = this._homeAppTileGroupsSource.asObservable();
21
+ this.pinTiles$ = this.pinTilesSource.asObservable().pipe(startWith(null));
22
+ this.shellbarSource = new Subject();
23
+ this.shellbar$ = this.shellbarSource.asObservable().pipe(shareReplay(1));
24
+ this.appTileGroups$ = this._appTileGroupsSource.pipe(shareReplay(1));
25
+ this.editHome$ = this._edithomeSource.asObservable().pipe(takeUntil(this._OnDestroy$), distinctUntilChanged());
26
+ this.deviceSize$ = this._portalService.deviceSize$;
27
+ this._rtlService.rtl.next(BarsaApi.LoginFormData.IsRtl);
28
+ this.loadAllAppTileGroups();
29
+ this.appTileGroups$
30
+ .pipe(filter((moForReportModel) => moForReportModel !== null), tap((moForReportModel) => {
31
+ if (moForReportModel) {
32
+ this._allAppsLoaded(moForReportModel);
33
+ }
34
+ }))
35
+ .subscribe();
36
+ }
37
+ get appTileGroups() {
38
+ return this._appTileGroupsSource.getValue();
39
+ }
40
+ ngOnDestroy() {
41
+ this._OnDestroy$.next();
42
+ }
43
+ loadAppTileGroups(appTileGroup) {
44
+ if (!appTileGroup || appTileGroup.$TilesLoaded) {
45
+ return;
46
+ }
47
+ const allApps = this._appTileGroupsSource.getValue();
48
+ if (allApps) {
49
+ const selectedAppTilegroup = allApps?.MoDataList.find((c) => c.Id === appTileGroup.Id);
50
+ if (selectedAppTilegroup) {
51
+ this._loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps);
52
+ selectedAppTilegroup.$Children?.forEach((subGroup) => {
53
+ this._loadAppTilesOfAppTileGroup(subGroup, allApps);
54
+ });
55
+ }
56
+ }
57
+ }
58
+ saveTilesStackContent(tilesStackContent) {
59
+ const userPortalSettings = this._portalService.userPortalSettings;
60
+ if (userPortalSettings == null) {
61
+ return Promise.resolve();
62
+ }
63
+ userPortalSettings.TilesStackContent = tilesStackContent;
64
+ userPortalSettings.$State = 'Modified';
65
+ return this._saveUserPortalSettings(userPortalSettings).then(() => this._portalService.setUserPortalSettings(userPortalSettings));
66
+ }
67
+ loadUserPortalSettings() {
68
+ return this._portalService.getData('UserPortalSetting').pipe(concatMap((data) => {
69
+ if (data) {
70
+ return of(data);
71
+ }
72
+ else {
73
+ return this.loadFromServerUserPortalSetting();
74
+ }
75
+ }));
76
+ }
77
+ loadFromServerUserPortalSetting() {
78
+ return from(new Promise((resolve, reject) => {
79
+ BarsaApi.Bw.RunBlMethodAsync({
80
+ Parameters: [],
81
+ Method: 'GetUserPortalSettings',
82
+ SuccessFn: (userPortalSetting) => {
83
+ this._portalService.setData('UserPortalSetting', userPortalSetting);
84
+ resolve(userPortalSetting);
85
+ },
86
+ FailFn: () => {
87
+ reject(null);
88
+ }
89
+ });
90
+ }));
91
+ }
92
+ toggleAppGroupSettingVisible(appGroup) {
93
+ return from(new Promise((resolve, reject) => {
94
+ BarsaApi.Bw.RunBlMethodAsync({
95
+ Parameters: [appGroup.Id],
96
+ Method: 'ToggleAppTileGroupSettingVisible',
97
+ SuccessFn: (appGroupSetting) => {
98
+ this._updateAppTileGroupSettings(appGroup, appGroupSetting);
99
+ resolve(appGroupSetting);
100
+ },
101
+ FailFn: () => {
102
+ reject(null);
103
+ }
104
+ });
105
+ })).pipe(tap((appGroupSetting) => {
106
+ this._updateAppGroupSetting(appGroup, appGroupSetting);
107
+ }));
108
+ }
109
+ resetAppGroupSetting(appGroup) {
110
+ return from(new Promise((resolve, reject) => {
111
+ BarsaApi.Bw.RunBlMethodAsync({
112
+ Parameters: [appGroup.Id],
113
+ Method: 'ResetAppTileGroupSettingVisible',
114
+ SuccessFn: (appGroupSetting) => {
115
+ this._updateAppTileGroupSettings(appGroup, appGroupSetting);
116
+ resolve(appGroupSetting);
117
+ },
118
+ FailFn: () => {
119
+ reject(null);
120
+ }
121
+ });
122
+ })).pipe(tap((appGroupSetting) => {
123
+ this._updateAppGroupSetting(appGroup, appGroupSetting);
124
+ }));
125
+ }
126
+ deleteAppGroup(appGroup) {
127
+ return from(new Promise((resolve, reject) => {
128
+ BarsaApi.Bw.RunBlMethodAsync({
129
+ Parameters: [appGroup.Id],
130
+ Method: 'DeleteAppGroup',
131
+ SuccessFn: () => {
132
+ resolve(appGroup.Id);
133
+ },
134
+ FailFn: () => {
135
+ reject(null);
136
+ }
137
+ });
138
+ })).pipe(tap((appGroupId) => {
139
+ const allApps = this.appTileGroups;
140
+ if (allApps) {
141
+ allApps.MoDataList = allApps.MoDataList.filter((c) => c.Id !== appGroupId);
142
+ this._appTileGroupsSource.next(allApps);
143
+ }
144
+ }));
145
+ }
146
+ changeAppTileSetting(appTile) {
147
+ const allApps = this.appTileGroups;
148
+ const selectedGroup = this.findGroupWithAppTileId(allApps, appTile.Id);
149
+ if (selectedGroup === null) {
150
+ return of(null);
151
+ }
152
+ return from(new Promise((resolve, reject) => {
153
+ BarsaApi.Bw.RunBlMethodAsync({
154
+ Parameters: [selectedGroup.Id, appTile.Id, appTile.Title, appTile.Subtitle],
155
+ Method: 'ChangeAppTileSetting',
156
+ SuccessFn: () => {
157
+ this._nextAllAppTileGroups(allApps);
158
+ resolve(selectedGroup);
159
+ },
160
+ FailFn: () => {
161
+ reject(null);
162
+ }
163
+ });
164
+ })).pipe(tap((appGroupSetting) => this.updataAppTileSetting(selectedGroup, appGroupSetting)));
165
+ }
166
+ saveAppGroupOrders(appGroups) {
167
+ const groupOrders = appGroups.map((c) => c.Id);
168
+ return from(new Promise((resolve, reject) => {
169
+ BarsaApi.Bw.RunBlMethodAsync({
170
+ Parameters: [groupOrders],
171
+ Method: 'ChangeOrderAppTileGroups',
172
+ SuccessFn: () => {
173
+ resolve();
174
+ },
175
+ FailFn: () => {
176
+ reject(null);
177
+ }
178
+ });
179
+ })).pipe();
180
+ }
181
+ createAppGroup(title) {
182
+ return from(new Promise((resolve, reject) => {
183
+ BarsaApi.Bw.RunBlMethodAsync({
184
+ Parameters: [title],
185
+ Method: 'CreateAppTileGroup',
186
+ SuccessFn: (mo) => {
187
+ resolve(mo);
188
+ },
189
+ FailFn: () => {
190
+ reject(null);
191
+ }
192
+ });
193
+ })).pipe(tap((mo) => this.addAppGroup(mo)));
194
+ }
195
+ saveOrderAppTiles(appGroup, appTiles, isActionLink = false, appTileIdTransferedId = '0') {
196
+ BarsaApi.Bw.RunBlMethodAsync({
197
+ Parameters: [appGroup.Id, appTiles, isActionLink, appTileIdTransferedId],
198
+ Method: 'ChangeOrderAppTiles',
199
+ SuccessFn: () => { },
200
+ FailFn: () => { }
201
+ });
202
+ }
203
+ updataAppTileSetting(selectedGroup, appGroupSetting) {
204
+ const allApps = this.appTileGroups;
205
+ allApps?.MoDataList.forEach((appGroup) => {
206
+ if (appGroup.Id === selectedGroup.Id) {
207
+ appGroup.UserAppTileGroupSetting = appGroupSetting;
208
+ }
209
+ });
210
+ this._appTileGroupsSource.next(allApps);
211
+ }
212
+ addAppGroup(mo) {
213
+ const allApps = this.appTileGroups;
214
+ if (allApps) {
215
+ allApps.MoDataList.push(mo);
216
+ this._appTileGroupsSource.next(allApps);
217
+ }
218
+ }
219
+ singlePinTileChanged(appTileId) {
220
+ const allApps = this.appTileGroups;
221
+ const group = this.findGroupWithAppTileId(allApps, appTileId);
222
+ if (group === null) {
223
+ return of(false);
224
+ }
225
+ return from(new Promise((resolve, reject) => {
226
+ BarsaApi.Bw.RunBlMethodAsync({
227
+ Parameters: [group.Id, appTileId],
228
+ Method: 'RemoveAppTileFromTileGroup',
229
+ SuccessFn: (setting) => {
230
+ this._updateAppTileGroupSettings(group, setting);
231
+ this._nextAllAppTileGroups(allApps);
232
+ resolve(true);
233
+ },
234
+ FailFn: () => {
235
+ reject(false);
236
+ }
237
+ });
238
+ }));
239
+ }
240
+ pinTileChanged(appTileGroupsPin, app, callback) {
241
+ const allApps = this.appTileGroups;
242
+ const visible = appTileGroupsPin.map((c) => c.visible);
243
+ const groupChanges = appTileGroupsPin.map((c) => new BarsaApi.Common.MetaObjectWeb({
244
+ Id: c.appTileGroup.Id,
245
+ TypeDefId: allApps?.TypeDefId
246
+ }));
247
+ BarsaApi.Bw.RunBlMethodAsync({
248
+ Parameters: [groupChanges, visible, app.Id],
249
+ Method: 'TilePinChanged',
250
+ SuccessFn: (settings) => {
251
+ this._tilePinChange(appTileGroupsPin, allApps);
252
+ callback(settings);
253
+ },
254
+ FailFn: () => {
255
+ // TODO show error
256
+ }
257
+ });
258
+ }
259
+ _tilePinChange(appTileGroupsPin, allApps) {
260
+ for (const appTileGroupPin of appTileGroupsPin) {
261
+ let selectedAppGroup;
262
+ const appGroupId = appTileGroupPin.appTileGroup.Id;
263
+ allApps?.MoDataList.forEach((c) => {
264
+ if (c.Id === appGroupId) {
265
+ selectedAppGroup = c;
266
+ }
267
+ else if (!selectedAppGroup) {
268
+ selectedAppGroup = c.$Children?.find((child) => child.Id === appGroupId);
269
+ }
270
+ });
271
+ if (selectedAppGroup && selectedAppGroup.$TilesLoaded) {
272
+ // let moDataList = selectedAppGroup.AppTiles.MoDataList;
273
+ // if (appTileGroups[i].visible)
274
+ // selectedAppGroup.AppTiles.MoDataList = [...moDataList, settings[i]];
275
+ // else
276
+ // selectedAppGroup.AppTiles.MoDataList = moDataList.filter(
277
+ // (c) => c.App.Id !== app.Id
278
+ // );
279
+ this._loadAppTilesOfAppTileGroup(selectedAppGroup, allApps);
280
+ }
281
+ }
282
+ this._nextAllAppTileGroups(allApps);
283
+ }
284
+ loadShellbar() {
285
+ this._portalService
286
+ .ReportExecutePromise('Shellbar')
287
+ .then((moForReportModel) => this.shellbarSource.next(moForReportModel.MoDataList[0]));
288
+ }
289
+ loadAllAppTileGroups() {
290
+ this._portalService
291
+ .ReportExecute('AllAppTileGroups')
292
+ .subscribe((allApps) => this._nextAllAppTileGroups(allApps));
293
+ }
294
+ _setTileInfo(appTile) {
295
+ {
296
+ const title = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Title', null);
297
+ appTile.TileTitle = !appTile.Title ? title : appTile.Title;
298
+ const subtitle = BarsaApi.Common.Util.TryGetValue(appTile, 'Component.Settings.TileSetting.Subtitle', null);
299
+ appTile.Subtitle = !appTile.Subtitle ? subtitle : appTile.Subtitle;
300
+ }
301
+ }
302
+ getTileGroups() {
303
+ return this._appTileGroupsSource.getValue();
304
+ }
305
+ setEditHome(edit) {
306
+ this._edithomeSource.next(edit);
307
+ }
308
+ _allAppsLoaded(moForReportModel) {
309
+ moForReportModel.MoDataList.forEach((c) => {
310
+ this._prepareNavigator(c);
311
+ });
312
+ this._setHomeAppTileGroups(moForReportModel.MoDataList);
313
+ }
314
+ _loadAppTilesOfAppTileGroup(selectedAppTilegroup, allApps) {
315
+ const callback = () => {
316
+ this._nextAllAppTileGroups(allApps);
317
+ };
318
+ if (!selectedAppTilegroup.UserAppTileGroupSetting) {
319
+ this._loadAppTilesByAppTileGroup(selectedAppTilegroup, callback);
320
+ }
321
+ else {
322
+ this._loadAppTilesByAppTileGroupSetting(selectedAppTilegroup, callback);
323
+ }
324
+ }
325
+ _loadAppTilesByAppTileGroup(appGroup, callback) {
326
+ BarsaApi.Bw.RunBlMethodAsync({
327
+ Parameters: [appGroup.Id],
328
+ Method: 'LoadAllAppTilesByAppTileGroup',
329
+ SuccessFn: (appTiles) => {
330
+ this._updateAppTilesOfAppTileGroup(appGroup, appTiles);
331
+ callback();
332
+ },
333
+ FailFn: () => {
334
+ // TODO show error
335
+ }
336
+ });
337
+ }
338
+ _updateAppTilesOfAppTileGroup(selectedAppTilegroup, appTiles) {
339
+ if (this.appTileGroups) {
340
+ selectedAppTilegroup = { ...selectedAppTilegroup, $TilesLoaded: true };
341
+ appTiles.MoDataList.forEach((element) => {
342
+ element.Component = element.A_App_Component ?? element.A_AppTile_App_Component;
343
+ element.DynamicCommand = element.A_App_DynamicCommand ?? element.A_AppTile_App_DynamicCommand;
344
+ element.Predefined = element.Predefined ?? element.A_AppTile_Predefined;
345
+ });
346
+ const apptileGroupIndex = this.appTileGroups?.MoDataList.findIndex((c) => c.Id === selectedAppTilegroup.Id || c.Id === selectedAppTilegroup.$ParentId);
347
+ selectedAppTilegroup.AppTiles = appTiles;
348
+ const tileGroup = this.appTileGroups.MoDataList[apptileGroupIndex];
349
+ if (selectedAppTilegroup.$ParentId) {
350
+ if (tileGroup.$Children) {
351
+ const idOfSubGroup = tileGroup.$Children.findIndex((c) => c.Id === selectedAppTilegroup.Id);
352
+ tileGroup.$Children[idOfSubGroup] = selectedAppTilegroup;
353
+ }
354
+ this.appTileGroups.MoDataList[apptileGroupIndex] = { ...tileGroup };
355
+ }
356
+ else {
357
+ this.appTileGroups.MoDataList[apptileGroupIndex] = selectedAppTilegroup;
358
+ }
359
+ }
360
+ }
361
+ _loadAppTilesByAppTileGroupSetting(appTileGroup, callback) {
362
+ BarsaApi.Bw.RunBlMethodAsync({
363
+ Parameters: [appTileGroup.Id],
364
+ Method: 'LoadAllAppTilesByUserAppTileGroupSettings',
365
+ SuccessFn: (appTiles) => {
366
+ this._updateAppTilesOfAppTileGroup(appTileGroup, appTiles);
367
+ callback();
368
+ },
369
+ FailFn: () => {
370
+ // TODO show error
371
+ }
372
+ });
373
+ }
374
+ _nextAllAppTileGroups(newAllApps = null) {
375
+ const allApps = newAllApps ?? this._appTileGroupsSource.getValue();
376
+ this._appTileGroupsSource.next(allApps ? { ...allApps } : null);
377
+ }
378
+ _setHomeAppTileGroups(appGroups) {
379
+ let newAppGroups = [...appGroups];
380
+ newAppGroups = newAppGroups
381
+ .filter((c) => c.Visible)
382
+ .sort((a, b) => Number(a.navigatorOrderItem) - Number(b.navigatorOrderItem));
383
+ this._homeAppTileGroupsSource.next(newAppGroups);
384
+ }
385
+ _saveUserPortalSettings(userPortalSettings) {
386
+ return new Promise((resolve, reject) => {
387
+ BarsaApi.Bw.RunBlMethodAsync({
388
+ Parameters: [new BarsaApi.Common.MetaObjectWeb(userPortalSettings)],
389
+ Method: 'SaveUserPortalSettings',
390
+ SuccessFn: () => {
391
+ resolve();
392
+ },
393
+ FailFn: () => {
394
+ reject(null);
395
+ }
396
+ });
397
+ });
398
+ }
399
+ _updateAppGroupSetting(appGroup, appGroupSetting) {
400
+ const allApps = this.appTileGroups;
401
+ const selectedAppGroup = allApps?.MoDataList.find((c) => c.Id === appGroup.Id);
402
+ if (selectedAppGroup && allApps) {
403
+ selectedAppGroup.UserAppTileGroupSetting = appGroupSetting;
404
+ this._nextAllAppTileGroups(allApps);
405
+ }
406
+ }
407
+ findGroupWithAppTileId(allApps, appTileId) {
408
+ let selectedGroup;
409
+ if (!allApps) {
410
+ return null;
411
+ }
412
+ allApps.MoDataList.forEach((appGroup) => {
413
+ if (selectedGroup) {
414
+ return;
415
+ }
416
+ if (appGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
417
+ selectedGroup = appGroup;
418
+ return;
419
+ }
420
+ appGroup.$Children?.forEach((subGroup) => {
421
+ if (subGroup.navigatorTiles.some((appTile) => appTile.Id === appTileId)) {
422
+ selectedGroup = subGroup;
423
+ return;
424
+ }
425
+ });
426
+ });
427
+ return selectedGroup;
428
+ }
429
+ _findGroupWithAppGroupId(allApps, appGroupId) {
430
+ let selectedGroup;
431
+ if (!allApps) {
432
+ return null;
433
+ }
434
+ allApps.MoDataList.forEach((appGroup) => {
435
+ if (selectedGroup) {
436
+ return;
437
+ }
438
+ if (appGroup.Id === appGroupId) {
439
+ selectedGroup = appGroup;
440
+ return;
441
+ }
442
+ appGroup.$Children?.forEach((subGroup) => {
443
+ if (subGroup.Id === appGroupId) {
444
+ selectedGroup = subGroup;
445
+ return;
446
+ }
447
+ });
448
+ });
449
+ return selectedGroup;
450
+ }
451
+ _updateAppTileGroupSettings(appTileGroup, setting) {
452
+ appTileGroup.UserAppTileGroupSetting = setting;
453
+ appTileGroup = JSON.parse(JSON.stringify(appTileGroup));
454
+ this._nextAllAppTileGroups();
455
+ return appTileGroup;
456
+ }
457
+ _prepareNavigator(appTileGroup) {
458
+ appTileGroup.$TileSettingChanged = false;
459
+ appTileGroup.$Disabledpin = false;
460
+ appTileGroup.navigatorTitle = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Title', appTileGroup.Title);
461
+ appTileGroup.navigatorTitle = appTileGroup.navigatorTitle =
462
+ appTileGroup.navigatorTitle === '' ? appTileGroup.Title : appTileGroup.navigatorTitle;
463
+ appTileGroup.navigatorTitle = this._bbbTranslatePipe.transform(appTileGroup.navigatorTitle);
464
+ const orderItem = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.OrderItem', null);
465
+ if (orderItem !== null) {
466
+ appTileGroup.navigatorOrderItem = orderItem;
467
+ }
468
+ else {
469
+ appTileGroup.navigatorOrderItem = appTileGroup.OrderItem;
470
+ }
471
+ const visible = BarsaApi.Common.Util.TryGetValue(appTileGroup, 'UserAppTileGroupSetting.Visible', null);
472
+ if (visible !== null) {
473
+ appTileGroup.navigatorVisible = visible;
474
+ }
475
+ else {
476
+ appTileGroup.navigatorVisible = appTileGroup.Visible;
477
+ }
478
+ const appTiles = appTileGroup.AppTiles?.MoDataList ?? [];
479
+ appTileGroup.navigatorTiles = appTiles
480
+ .filter((c) => c.Visible && !c.IsActionLink)
481
+ .sort((a, b) => Number(a.OrderItem) - Number(b.OrderItem));
482
+ appTileGroup.navigatorActionLinks = appTiles
483
+ .filter((c) => c.Visible && c.IsActionLink)
484
+ .sort((a, b) => Number(a.OrderItemActionLink) - Number(b.OrderItemActionLink));
485
+ appTileGroup.navigatorTiles.forEach((appTile) => this._setTileInfo(appTile));
486
+ appTileGroup.navigatorActionLinks.forEach((appTile) => this._setTileInfo(appTile));
487
+ appTileGroup.$Children?.forEach((subAppTileGroup) => {
488
+ this._prepareNavigator(subAppTileGroup);
489
+ });
490
+ }
491
+ }
492
+ TilesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, deps: [{ token: i1.PortalService }, { token: i2.RtlService }, { token: i1.BbbTranslatePipe }], target: i0.ɵɵFactoryTarget.Injectable });
493
+ TilesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, providedIn: 'root' });
494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: TilesService, decorators: [{
495
+ type: Injectable,
496
+ args: [{
497
+ providedIn: 'root'
498
+ }]
499
+ }], ctorParameters: function () { return [{ type: i1.PortalService }, { type: i2.RtlService }, { type: i1.BbbTranslatePipe }]; } });
500
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLXRpbGVzL3NyYy9saWIvdGlsZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHakgsT0FBTyxFQUFFLFFBQVEsRUFBMEUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQU14SCxNQUFNLE9BQU8sWUFBWTtJQWVyQixZQUNZLGNBQTZCLEVBQzdCLFdBQXVCLEVBQ3ZCLGlCQUFtQztRQUZuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZTtRQUM3QixnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUN2QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBZC9DLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXVCLENBQUM7UUFLNUMsZ0JBQVcsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2xDLDZCQUF3QixHQUFHLElBQUksZUFBZSxDQUF3QixFQUFFLENBQUMsQ0FBQztRQUMxRSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDNUMseUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQTBCLElBQUksQ0FBQyxDQUFDO1FBQzFFLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFPMUQsUUFBUSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENB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QUFPLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQzthQUMxQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7UUFDbkYsWUFBWSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM3RSxZQUFZLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFbkYsWUFBWSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxlQUFlLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOzt5R0E5aUJRLFlBQVk7NkdBQVosWUFBWSxjQUZULE1BQU07MkZBRVQsWUFBWTtrQkFIeEIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgU3ViamVjdCwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBvZiwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjb25jYXRNYXAsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHRha2VVbnRpbCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgUnRsU2VydmljZSB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZSc7XHJcbmltcG9ydCB7IEJhcnNhQXBpLCBCYmJUcmFuc2xhdGVQaXBlLCBNZXRhb2JqZWN0RGF0YU1vZGVsLCBNb0ZvclJlcG9ydE1vZGVsLCBQb3J0YWxTZXJ2aWNlIH0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xyXG5pbXBvcnQgeyBBcHBUaWxlR3JvdXBQaW4sIFVzZXJQb3J0YWxTZXR0aW5ncyB9IGZyb20gJy4vbW9kZWxzJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICAgIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGlsZXNTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcclxuICAgIGRldmljZVNpemUkOiBPYnNlcnZhYmxlPCdzJyB8ICdtJyB8ICdsJyB8ICd4bCc+O1xyXG4gICAgaG9tZUFwcFRpbGVHcm91cHMkOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWxbXT47XHJcbiAgICBwaW5UaWxlcyQ6IE9ic2VydmFibGU8UGluVGlsZUluZm8gfCBudWxsPjtcclxuICAgIHNoZWxsYmFyU291cmNlID0gbmV3IFN1YmplY3Q8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcclxuICAgIHNoZWxsYmFyJDogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsPjtcclxuICAgIGFwcFRpbGVHcm91cHMkOiBPYnNlcnZhYmxlPE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsPjtcclxuICAgIGVkaXRIb21lJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcclxuXHJcbiAgICBwcml2YXRlIF9PbkRlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2hvbWVBcHBUaWxlR3JvdXBzU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcclxuICAgIHByaXZhdGUgcGluVGlsZXNTb3VyY2UgPSBuZXcgU3ViamVjdDxQaW5UaWxlSW5mbz4oKTtcclxuICAgIHByaXZhdGUgX2FwcFRpbGVHcm91cHNTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsPihudWxsKTtcclxuICAgIHByaXZhdGUgX2VkaXRob21lU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBfcG9ydGFsU2VydmljZTogUG9ydGFsU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIF9ydGxTZXJ2aWNlOiBSdGxTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgX2JiYlRyYW5zbGF0ZVBpcGU6IEJiYlRyYW5zbGF0ZVBpcGVcclxuICAgICkge1xyXG4gICAgICAgIEJhcnNhQXBpLkJ3LlRpbGVzU2VydmljZSA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5ob21lQXBwVGlsZUdyb3VwcyQgPSB0aGlzLl9ob21lQXBwVGlsZUdyb3Vwc1NvdXJjZS5hc09ic2VydmFibGUoKTtcclxuICAgICAgICB0aGlzLnBpblRpbGVzJCA9IHRoaXMucGluVGlsZXNTb3VyY2UuYXNPYnNlcnZhYmxlKCkucGlwZShzdGFydFdpdGgobnVsbCkpO1xyXG4gICAgICAgIHRoaXMuc2hlbGxiYXJTb3VyY2UgPSBuZXcgU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xyXG4gICAgICAgIHRoaXMuc2hlbGxiYXIkID0gdGhpcy5zaGVsbGJhclNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuICAgICAgICB0aGlzLmFwcFRpbGVHcm91cHMkID0gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5waXBlKHNoYXJlUmVwbGF5KDEpKTtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0SG9tZSQgPSB0aGlzLl9lZGl0aG9tZVNvdXJjZS5hc09ic2VydmFibGUoKS5waXBlKHRha2VVbnRpbCh0aGlzLl9PbkRlc3Ryb3kkKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VTaXplJCA9IHRoaXMuX3BvcnRhbFNlcnZpY2UuZGV2aWNlU2l6ZSQ7XHJcbiAgICAgICAgdGhpcy5fcnRsU2VydmljZS5ydGwubmV4dChCYXJzYUFwaS5Mb2dpbkZvcm1EYXRhLklzUnRsKTtcclxuICAgICAgICB0aGlzLmxvYWRBbGxBcHBUaWxlR3JvdXBzKCk7XHJcbiAgICAgICAgdGhpcy5hcHBUaWxlR3JvdXBzJFxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICAgIGZpbHRlcigobW9Gb3JSZXBvcnRNb2RlbCkgPT4gbW9Gb3JSZXBvcnRNb2RlbCAhPT0gbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0YXAoKG1vRm9yUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobW9Gb3JSZXBvcnRNb2RlbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbGxBcHBzTG9hZGVkKG1vRm9yUmVwb3J0TW9kZWwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gICAgZ2V0IGFwcFRpbGVHcm91cHMoKTogTW9Gb3JSZXBvcnRNb2RlbCB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLmdldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9PbkRlc3Ryb3kkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQXBwVGlsZUdyb3VwcyhhcHBUaWxlR3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIWFwcFRpbGVHcm91cCB8fCBhcHBUaWxlR3JvdXAuJFRpbGVzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoYWxsQXBwcykge1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZEFwcFRpbGVncm91cCA9IGFsbEFwcHM/Lk1vRGF0YUxpc3QuZmluZCgoYykgPT4gYy5JZCA9PT0gYXBwVGlsZUdyb3VwLklkKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQXBwVGlsZWdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcFRpbGVncm91cCwgYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEFwcFRpbGVncm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZEFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc3ViR3JvdXAsIGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBzYXZlVGlsZXNTdGFja0NvbnRlbnQodGlsZXNTdGFja0NvbnRlbnQ6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCB1c2VyUG9ydGFsU2V0dGluZ3MgPSB0aGlzLl9wb3J0YWxTZXJ2aWNlLnVzZXJQb3J0YWxTZXR0aW5ncztcclxuICAgICAgICBpZiAodXNlclBvcnRhbFNldHRpbmdzID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ3MuVGlsZXNTdGFja0NvbnRlbnQgPSB0aWxlc1N0YWNrQ29udGVudDtcclxuICAgICAgICB1c2VyUG9ydGFsU2V0dGluZ3MuJFN0YXRlID0gJ01vZGlmaWVkJztcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2F2ZVVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3MpLnRoZW4oKCkgPT5cclxuICAgICAgICAgICAgdGhpcy5fcG9ydGFsU2VydmljZS5zZXRVc2VyUG9ydGFsU2V0dGluZ3ModXNlclBvcnRhbFNldHRpbmdzKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFVzZXJQb3J0YWxTZXR0aW5ncygpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9wb3J0YWxTZXJ2aWNlLmdldERhdGEoJ1VzZXJQb3J0YWxTZXR0aW5nJykucGlwZShcclxuICAgICAgICAgICAgY29uY2F0TWFwKChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihkYXRhKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZEZyb21TZXJ2ZXJVc2VyUG9ydGFsU2V0dGluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZEZyb21TZXJ2ZXJVc2VyUG9ydGFsU2V0dGluZygpOiBPYnNlcnZhYmxlPE1ldGFvYmplY3REYXRhTW9kZWw+IHtcclxuICAgICAgICByZXR1cm4gZnJvbShcclxuICAgICAgICAgICAgbmV3IFByb21pc2U8VXNlclBvcnRhbFNldHRpbmdzPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdHZXRVc2VyUG9ydGFsU2V0dGluZ3MnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKHVzZXJQb3J0YWxTZXR0aW5nOiBNZXRhb2JqZWN0RGF0YU1vZGVsKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvcnRhbFNlcnZpY2Uuc2V0RGF0YSgnVXNlclBvcnRhbFNldHRpbmcnLCB1c2VyUG9ydGFsU2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodXNlclBvcnRhbFNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG4gICAgdG9nZ2xlQXBwR3JvdXBTZXR0aW5nVmlzaWJsZShhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWRdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ1RvZ2dsZUFwcFRpbGVHcm91cFNldHRpbmdWaXNpYmxlJyxcclxuICAgICAgICAgICAgICAgICAgICBTdWNjZXNzRm46IChhcHBHcm91cFNldHRpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwVGlsZUdyb3VwU2V0dGluZ3MoYXBwR3JvdXAsIGFwcEdyb3VwU2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXBTZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKFxyXG4gICAgICAgICAgICB0YXAoKGFwcEdyb3VwU2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwR3JvdXBTZXR0aW5nKGFwcEdyb3VwLCBhcHBHcm91cFNldHRpbmcpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXNldEFwcEdyb3VwU2V0dGluZyhhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbYXBwR3JvdXAuSWRdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ1Jlc2V0QXBwVGlsZUdyb3VwU2V0dGluZ1Zpc2libGUnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKGFwcEdyb3VwU2V0dGluZzogTWV0YW9iamVjdERhdGFNb2RlbCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhhcHBHcm91cCwgYXBwR3JvdXBTZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShhcHBHcm91cFNldHRpbmcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCgoYXBwR3JvdXBTZXR0aW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBHcm91cFNldHRpbmcoYXBwR3JvdXAsIGFwcEdyb3VwU2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGVBcHBHcm91cChhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCk6IE9ic2VydmFibGU8c3RyaW5nPiB7XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdEZWxldGVBcHBHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYXBwR3JvdXAuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICApLnBpcGUoXHJcbiAgICAgICAgICAgIHRhcCgoYXBwR3JvdXBJZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcclxuICAgICAgICAgICAgICAgIGlmIChhbGxBcHBzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0ID0gYWxsQXBwcy5Nb0RhdGFMaXN0LmZpbHRlcigoYykgPT4gYy5JZCAhPT0gYXBwR3JvdXBJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5uZXh0KGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjaGFuZ2VBcHBUaWxlU2V0dGluZyhhcHBUaWxlOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogT2JzZXJ2YWJsZTxNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbD4ge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRHcm91cCA9IHRoaXMuZmluZEdyb3VwV2l0aEFwcFRpbGVJZChhbGxBcHBzLCBhcHBUaWxlLklkKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRHcm91cCA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbc2VsZWN0ZWRHcm91cC5JZCwgYXBwVGlsZS5JZCwgYXBwVGlsZS5UaXRsZSwgYXBwVGlsZS5TdWJ0aXRsZV0sXHJcbiAgICAgICAgICAgICAgICAgICAgTWV0aG9kOiAnQ2hhbmdlQXBwVGlsZVNldHRpbmcnLFxyXG4gICAgICAgICAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShzZWxlY3RlZEdyb3VwKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKHRhcCgoYXBwR3JvdXBTZXR0aW5nKSA9PiB0aGlzLnVwZGF0YUFwcFRpbGVTZXR0aW5nKHNlbGVjdGVkR3JvdXAsIGFwcEdyb3VwU2V0dGluZykpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQXBwR3JvdXBPcmRlcnMoYXBwR3JvdXBzOiBNZXRhb2JqZWN0RGF0YU1vZGVsW10pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICBjb25zdCBncm91cE9yZGVycyA9IGFwcEdyb3Vwcy5tYXAoKGMpID0+IGMuSWQpO1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbZ3JvdXBPcmRlcnNdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0NoYW5nZU9yZGVyQXBwVGlsZUdyb3VwcycsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKS5waXBlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlQXBwR3JvdXAodGl0bGU6IHN0cmluZyk6IE9ic2VydmFibGU8TWV0YW9iamVjdERhdGFNb2RlbD4ge1xyXG4gICAgICAgIHJldHVybiBmcm9tKFxyXG4gICAgICAgICAgICBuZXcgUHJvbWlzZTxNZXRhb2JqZWN0RGF0YU1vZGVsPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzOiBbdGl0bGVdLFxyXG4gICAgICAgICAgICAgICAgICAgIE1ldGhvZDogJ0NyZWF0ZUFwcFRpbGVHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAobW86IE1ldGFvYmplY3REYXRhTW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICkucGlwZSh0YXAoKG1vKSA9PiB0aGlzLmFkZEFwcEdyb3VwKG1vKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVPcmRlckFwcFRpbGVzKFxyXG4gICAgICAgIGFwcEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLFxyXG4gICAgICAgIGFwcFRpbGVzOiBudW1iZXJbXSxcclxuICAgICAgICBpc0FjdGlvbkxpbmsgPSBmYWxzZSxcclxuICAgICAgICBhcHBUaWxlSWRUcmFuc2ZlcmVkSWQ6IHN0cmluZyA9ICcwJ1xyXG4gICAgKTogdm9pZCB7XHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFthcHBHcm91cC5JZCwgYXBwVGlsZXMsIGlzQWN0aW9uTGluaywgYXBwVGlsZUlkVHJhbnNmZXJlZElkXSxcclxuICAgICAgICAgICAgTWV0aG9kOiAnQ2hhbmdlT3JkZXJBcHBUaWxlcycsXHJcbiAgICAgICAgICAgIFN1Y2Nlc3NGbjogKCkgPT4ge30sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge31cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGFBcHBUaWxlU2V0dGluZyhzZWxlY3RlZEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xyXG4gICAgICAgIGFsbEFwcHM/Lk1vRGF0YUxpc3QuZm9yRWFjaCgoYXBwR3JvdXApID0+IHtcclxuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLklkID09PSBzZWxlY3RlZEdyb3VwLklkKSB7XHJcbiAgICAgICAgICAgICAgICBhcHBHcm91cC5Vc2VyQXBwVGlsZUdyb3VwU2V0dGluZyA9IGFwcEdyb3VwU2V0dGluZztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzKTtcclxuICAgIH1cclxuXHJcbiAgICBhZGRBcHBHcm91cChtbzogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgaWYgKGFsbEFwcHMpIHtcclxuICAgICAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LnB1c2gobW8pO1xyXG4gICAgICAgICAgICB0aGlzLl9hcHBUaWxlR3JvdXBzU291cmNlLm5leHQoYWxsQXBwcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNpbmdsZVBpblRpbGVDaGFuZ2VkKGFwcFRpbGVJZCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIGNvbnN0IGFsbEFwcHMgPSB0aGlzLmFwcFRpbGVHcm91cHM7XHJcbiAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZUlkKTtcclxuICAgICAgICBpZiAoZ3JvdXAgPT09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZyb20oXHJcbiAgICAgICAgICAgIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cC5JZCwgYXBwVGlsZUlkXSxcclxuICAgICAgICAgICAgICAgICAgICBNZXRob2Q6ICdSZW1vdmVBcHBUaWxlRnJvbVRpbGVHcm91cCcsXHJcbiAgICAgICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoc2V0dGluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcHBUaWxlR3JvdXBTZXR0aW5ncyhncm91cCwgc2V0dGluZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgRmFpbEZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuICAgIHBpblRpbGVDaGFuZ2VkKGFwcFRpbGVHcm91cHNQaW46IEFwcFRpbGVHcm91cFBpbltdLCBhcHA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGNhbGxiYWNrKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IHRoaXMuYXBwVGlsZUdyb3VwcztcclxuICAgICAgICBjb25zdCB2aXNpYmxlID0gYXBwVGlsZUdyb3Vwc1Bpbi5tYXAoKGMpID0+IGMudmlzaWJsZSk7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBDaGFuZ2VzID0gYXBwVGlsZUdyb3Vwc1Bpbi5tYXAoXHJcbiAgICAgICAgICAgIChjKSA9PlxyXG4gICAgICAgICAgICAgICAgbmV3IEJhcnNhQXBpLkNvbW1vbi5NZXRhT2JqZWN0V2ViKHtcclxuICAgICAgICAgICAgICAgICAgICBJZDogYy5hcHBUaWxlR3JvdXAuSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgVHlwZURlZklkOiBhbGxBcHBzPy5UeXBlRGVmSWRcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgQmFyc2FBcGkuQncuUnVuQmxNZXRob2RBc3luYyh7XHJcbiAgICAgICAgICAgIFBhcmFtZXRlcnM6IFtncm91cENoYW5nZXMsIHZpc2libGUsIGFwcC5JZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ1RpbGVQaW5DaGFuZ2VkJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoc2V0dGluZ3MpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3RpbGVQaW5DaGFuZ2UoYXBwVGlsZUdyb3Vwc1BpbiwgYWxsQXBwcyk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjayhzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG93IGVycm9yXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIF90aWxlUGluQ2hhbmdlKGFwcFRpbGVHcm91cHNQaW4sIGFsbEFwcHMpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IGFwcFRpbGVHcm91cFBpbiBvZiBhcHBUaWxlR3JvdXBzUGluKSB7XHJcbiAgICAgICAgICAgIGxldCBzZWxlY3RlZEFwcEdyb3VwO1xyXG4gICAgICAgICAgICBjb25zdCBhcHBHcm91cElkID0gYXBwVGlsZUdyb3VwUGluLmFwcFRpbGVHcm91cC5JZDtcclxuICAgICAgICAgICAgYWxsQXBwcz8uTW9EYXRhTGlzdC5mb3JFYWNoKChjKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYy5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc2VsZWN0ZWRBcHBHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAgPSBjLiRDaGlsZHJlbj8uZmluZCgoY2hpbGQpID0+IGNoaWxkLklkID09PSBhcHBHcm91cElkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEFwcEdyb3VwICYmIHNlbGVjdGVkQXBwR3JvdXAuJFRpbGVzTG9hZGVkKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBsZXQgbW9EYXRhTGlzdCA9IHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdDtcclxuICAgICAgICAgICAgICAgIC8vIGlmIChhcHBUaWxlR3JvdXBzW2ldLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IFsuLi5tb0RhdGFMaXN0LCBzZXR0aW5nc1tpXV07XHJcbiAgICAgICAgICAgICAgICAvLyBlbHNlXHJcbiAgICAgICAgICAgICAgICAvLyAgIHNlbGVjdGVkQXBwR3JvdXAuQXBwVGlsZXMuTW9EYXRhTGlzdCA9IG1vRGF0YUxpc3QuZmlsdGVyKFxyXG4gICAgICAgICAgICAgICAgLy8gICAgIChjKSA9PiBjLkFwcC5JZCAhPT0gYXBwLklkXHJcbiAgICAgICAgICAgICAgICAvLyAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcEdyb3VwLCBhbGxBcHBzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2hlbGxiYXIoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fcG9ydGFsU2VydmljZVxyXG4gICAgICAgICAgICAuUmVwb3J0RXhlY3V0ZVByb21pc2UoJ1NoZWxsYmFyJylcclxuICAgICAgICAgICAgLnRoZW4oKG1vRm9yUmVwb3J0TW9kZWwpID0+IHRoaXMuc2hlbGxiYXJTb3VyY2UubmV4dChtb0ZvclJlcG9ydE1vZGVsLk1vRGF0YUxpc3RbMF0pKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkQWxsQXBwVGlsZUdyb3VwcygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9wb3J0YWxTZXJ2aWNlXHJcbiAgICAgICAgICAgIC5SZXBvcnRFeGVjdXRlKCdBbGxBcHBUaWxlR3JvdXBzJylcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoYWxsQXBwcykgPT4gdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoYWxsQXBwcykpO1xyXG4gICAgfVxyXG4gICAgX3NldFRpbGVJbmZvKGFwcFRpbGUpOiB2b2lkIHtcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZSwgJ0NvbXBvbmVudC5TZXR0aW5ncy5UaWxlU2V0dGluZy5UaXRsZScsIG51bGwpO1xyXG4gICAgICAgICAgICBhcHBUaWxlLlRpbGVUaXRsZSA9ICFhcHBUaWxlLlRpdGxlID8gdGl0bGUgOiBhcHBUaWxlLlRpdGxlO1xyXG4gICAgICAgICAgICBjb25zdCBzdWJ0aXRsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGFwcFRpbGUsICdDb21wb25lbnQuU2V0dGluZ3MuVGlsZVNldHRpbmcuU3VidGl0bGUnLCBudWxsKTtcclxuICAgICAgICAgICAgYXBwVGlsZS5TdWJ0aXRsZSA9ICFhcHBUaWxlLlN1YnRpdGxlID8gc3VidGl0bGUgOiBhcHBUaWxlLlN1YnRpdGxlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWxlR3JvdXBzKCk6IE1vRm9yUmVwb3J0TW9kZWwgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEVkaXRIb21lKGVkaXQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLl9lZGl0aG9tZVNvdXJjZS5uZXh0KGVkaXQpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfYWxsQXBwc0xvYWRlZChtb0ZvclJlcG9ydE1vZGVsOiBNb0ZvclJlcG9ydE1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgbW9Gb3JSZXBvcnRNb2RlbC5Nb0RhdGFMaXN0LmZvckVhY2goKGMpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZU5hdmlnYXRvcihjKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9zZXRIb21lQXBwVGlsZUdyb3Vwcyhtb0ZvclJlcG9ydE1vZGVsLk1vRGF0YUxpc3QpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfbG9hZEFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXA6IE1ldGFvYmplY3REYXRhTW9kZWwsIGFsbEFwcHM6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLl9uZXh0QWxsQXBwVGlsZUdyb3VwcyhhbGxBcHBzKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmICghc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcpIHtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZEFwcFRpbGVzQnlBcHBUaWxlR3JvdXAoc2VsZWN0ZWRBcHBUaWxlZ3JvdXAsIGNhbGxiYWNrKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkQXBwVGlsZXNCeUFwcFRpbGVHcm91cFNldHRpbmcoc2VsZWN0ZWRBcHBUaWxlZ3JvdXAsIGNhbGxiYWNrKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwcml2YXRlIF9sb2FkQXBwVGlsZXNCeUFwcFRpbGVHcm91cChhcHBHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcEdyb3VwLklkXSxcclxuICAgICAgICAgICAgTWV0aG9kOiAnTG9hZEFsbEFwcFRpbGVzQnlBcHBUaWxlR3JvdXAnLFxyXG4gICAgICAgICAgICBTdWNjZXNzRm46IChhcHBUaWxlczogTW9Gb3JSZXBvcnRNb2RlbCk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXBwVGlsZXNPZkFwcFRpbGVHcm91cChhcHBHcm91cCwgYXBwVGlsZXMpO1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgRmFpbEZuOiAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3cgZXJyb3JcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXBwVGlsZXNPZkFwcFRpbGVHcm91cChzZWxlY3RlZEFwcFRpbGVncm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgYXBwVGlsZXM6IE1vRm9yUmVwb3J0TW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5hcHBUaWxlR3JvdXBzKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZWdyb3VwID0geyAuLi5zZWxlY3RlZEFwcFRpbGVncm91cCwgJFRpbGVzTG9hZGVkOiB0cnVlIH07XHJcbiAgICAgICAgICAgIGFwcFRpbGVzLk1vRGF0YUxpc3QuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5Db21wb25lbnQgPSBlbGVtZW50LkFfQXBwX0NvbXBvbmVudCA/PyBlbGVtZW50LkFfQXBwVGlsZV9BcHBfQ29tcG9uZW50O1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5EeW5hbWljQ29tbWFuZCA9IGVsZW1lbnQuQV9BcHBfRHluYW1pY0NvbW1hbmQgPz8gZWxlbWVudC5BX0FwcFRpbGVfQXBwX0R5bmFtaWNDb21tYW5kO1xyXG4gICAgICAgICAgICAgICAgZWxlbWVudC5QcmVkZWZpbmVkID0gZWxlbWVudC5QcmVkZWZpbmVkID8/IGVsZW1lbnQuQV9BcHBUaWxlX1ByZWRlZmluZWQ7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBjb25zdCBhcHB0aWxlR3JvdXBJbmRleCA9IHRoaXMuYXBwVGlsZUdyb3Vwcz8uTW9EYXRhTGlzdC5maW5kSW5kZXgoXHJcbiAgICAgICAgICAgICAgICAoYykgPT4gYy5JZCA9PT0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuSWQgfHwgYy5JZCA9PT0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuJFBhcmVudElkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwVGlsZWdyb3VwLkFwcFRpbGVzID0gYXBwVGlsZXM7XHJcbiAgICAgICAgICAgIGNvbnN0IHRpbGVHcm91cCA9IHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkQXBwVGlsZWdyb3VwLiRQYXJlbnRJZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRpbGVHcm91cC4kQ2hpbGRyZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZE9mU3ViR3JvdXAgPSB0aWxlR3JvdXAuJENoaWxkcmVuLmZpbmRJbmRleCgoYykgPT4gYy5JZCA9PT0gc2VsZWN0ZWRBcHBUaWxlZ3JvdXAuSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbGVHcm91cC4kQ2hpbGRyZW5baWRPZlN1Ykdyb3VwXSA9IHNlbGVjdGVkQXBwVGlsZWdyb3VwO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBUaWxlR3JvdXBzLk1vRGF0YUxpc3RbYXBwdGlsZUdyb3VwSW5kZXhdID0geyAuLi50aWxlR3JvdXAgfTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXBwVGlsZUdyb3Vwcy5Nb0RhdGFMaXN0W2FwcHRpbGVHcm91cEluZGV4XSA9IHNlbGVjdGVkQXBwVGlsZWdyb3VwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfbG9hZEFwcFRpbGVzQnlBcHBUaWxlR3JvdXBTZXR0aW5nKGFwcFRpbGVHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgICAgICBCYXJzYUFwaS5Cdy5SdW5CbE1ldGhvZEFzeW5jKHtcclxuICAgICAgICAgICAgUGFyYW1ldGVyczogW2FwcFRpbGVHcm91cC5JZF0sXHJcbiAgICAgICAgICAgIE1ldGhvZDogJ0xvYWRBbGxBcHBUaWxlc0J5VXNlckFwcFRpbGVHcm91cFNldHRpbmdzJyxcclxuICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoYXBwVGlsZXM6IE1vRm9yUmVwb3J0TW9kZWwpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFwcFRpbGVzT2ZBcHBUaWxlR3JvdXAoYXBwVGlsZUdyb3VwLCBhcHBUaWxlcyk7XHJcbiAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBGYWlsRm46ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIFRPRE8gc2hvdyBlcnJvclxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbmV4dEFsbEFwcFRpbGVHcm91cHMobmV3QWxsQXBwczogTW9Gb3JSZXBvcnRNb2RlbCB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgYWxsQXBwcyA9IG5ld0FsbEFwcHMgPz8gdGhpcy5fYXBwVGlsZUdyb3Vwc1NvdXJjZS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIHRoaXMuX2FwcFRpbGVHcm91cHNTb3VyY2UubmV4dChhbGxBcHBzID8geyAuLi5hbGxBcHBzIH0gOiBudWxsKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgX3NldEhvbWVBcHBUaWxlR3JvdXBzKGFwcEdyb3VwczogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogdm9pZCB7XHJcbiAgICAgICAgbGV0IG5ld0FwcEdyb3VwcyA9IFsuLi5hcHBHcm91cHNdO1xyXG4gICAgICAgIG5ld0FwcEdyb3VwcyA9IG5ld0FwcEdyb3Vwc1xyXG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLlZpc2libGUpXHJcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBOdW1iZXIoYS5uYXZpZ2F0b3JPcmRlckl0ZW0pIC0gTnVtYmVyKGIubmF2aWdhdG9yT3JkZXJJdGVtKSk7XHJcbiAgICAgICAgdGhpcy5faG9tZUFwcFRpbGVHcm91cHNTb3VyY2UubmV4dChuZXdBcHBHcm91cHMpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfc2F2ZVVzZXJQb3J0YWxTZXR0aW5ncyh1c2VyUG9ydGFsU2V0dGluZ3M6IFVzZXJQb3J0YWxTZXR0aW5ncyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgIEJhcnNhQXBpLkJ3LlJ1bkJsTWV0aG9kQXN5bmMoe1xyXG4gICAgICAgICAgICAgICAgUGFyYW1ldGVyczogW25ldyBCYXJzYUFwaS5Db21tb24uTWV0YU9iamVjdFdlYih1c2VyUG9ydGFsU2V0dGluZ3MpXSxcclxuICAgICAgICAgICAgICAgIE1ldGhvZDogJ1NhdmVVc2VyUG9ydGFsU2V0dGluZ3MnLFxyXG4gICAgICAgICAgICAgICAgU3VjY2Vzc0ZuOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIEZhaWxGbjogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChudWxsKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfdXBkYXRlQXBwR3JvdXBTZXR0aW5nKGFwcEdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsLCBhcHBHcm91cFNldHRpbmc6IE1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBhbGxBcHBzID0gdGhpcy5hcHBUaWxlR3JvdXBzO1xyXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkQXBwR3JvdXAgPSBhbGxBcHBzPy5Nb0RhdGFMaXN0LmZpbmQoKGMpID0+IGMuSWQgPT09IGFwcEdyb3VwLklkKTtcclxuICAgICAgICBpZiAoc2VsZWN0ZWRBcHBHcm91cCAmJiBhbGxBcHBzKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQXBwR3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcgPSBhcHBHcm91cFNldHRpbmc7XHJcbiAgICAgICAgICAgIHRoaXMuX25leHRBbGxBcHBUaWxlR3JvdXBzKGFsbEFwcHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZpbmRHcm91cFdpdGhBcHBUaWxlSWQoYWxsQXBwcywgYXBwVGlsZUlkOiBzdHJpbmcpOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHwgbnVsbCB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkR3JvdXA7XHJcblxyXG4gICAgICAgIGlmICghYWxsQXBwcykge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYWxsQXBwcy5Nb0RhdGFMaXN0LmZvckVhY2goKGFwcEdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzZWxlY3RlZEdyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGFwcEdyb3VwLm5hdmlnYXRvclRpbGVzLnNvbWUoKGFwcFRpbGUpID0+IGFwcFRpbGUuSWQgPT09IGFwcFRpbGVJZCkpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBhcHBHcm91cDtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhcHBHcm91cC4kQ2hpbGRyZW4/LmZvckVhY2goKHN1Ykdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3ViR3JvdXAubmF2aWdhdG9yVGlsZXMuc29tZSgoYXBwVGlsZSkgPT4gYXBwVGlsZS5JZCA9PT0gYXBwVGlsZUlkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBzdWJHcm91cDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZEdyb3VwO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBfZmluZEdyb3VwV2l0aEFwcEdyb3VwSWQoYWxsQXBwcywgYXBwR3JvdXBJZDogc3RyaW5nKTogTWV0YW9iamVjdERhdGFNb2RlbCB8IG51bGwge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEdyb3VwO1xyXG5cclxuICAgICAgICBpZiAoIWFsbEFwcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGFsbEFwcHMuTW9EYXRhTGlzdC5mb3JFYWNoKChhcHBHcm91cCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChhcHBHcm91cC5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cCA9IGFwcEdyb3VwO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGFwcEdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViR3JvdXApID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWJHcm91cC5JZCA9PT0gYXBwR3JvdXBJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXAgPSBzdWJHcm91cDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZEdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3VwZGF0ZUFwcFRpbGVHcm91cFNldHRpbmdzKFxyXG4gICAgICAgIGFwcFRpbGVHcm91cDogTWV0YW9iamVjdERhdGFNb2RlbCxcclxuICAgICAgICBzZXR0aW5nOiBNZXRhb2JqZWN0RGF0YU1vZGVsXHJcbiAgICApOiBNZXRhb2JqZWN0RGF0YU1vZGVsIHtcclxuICAgICAgICBhcHBUaWxlR3JvdXAuVXNlckFwcFRpbGVHcm91cFNldHRpbmcgPSBzZXR0aW5nO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYXBwVGlsZUdyb3VwKSk7XHJcbiAgICAgICAgdGhpcy5fbmV4dEFsbEFwcFRpbGVHcm91cHMoKTtcclxuICAgICAgICByZXR1cm4gYXBwVGlsZUdyb3VwO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3ByZXBhcmVOYXZpZ2F0b3IoYXBwVGlsZUdyb3VwOiBNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLiRUaWxlU2V0dGluZ0NoYW5nZWQgPSBmYWxzZTtcclxuICAgICAgICBhcHBUaWxlR3JvdXAuJERpc2FibGVkcGluID0gZmFsc2U7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoXHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cCxcclxuICAgICAgICAgICAgJ1VzZXJBcHBUaWxlR3JvdXBTZXR0aW5nLlRpdGxlJyxcclxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLlRpdGxlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPSBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPVxyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGl0bGUgPT09ICcnID8gYXBwVGlsZUdyb3VwLlRpdGxlIDogYXBwVGlsZUdyb3VwLm5hdmlnYXRvclRpdGxlO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSA9IHRoaXMuX2JiYlRyYW5zbGF0ZVBpcGUudHJhbnNmb3JtKGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaXRsZSk7XHJcbiAgICAgICAgY29uc3Qgb3JkZXJJdGVtID0gQmFyc2FBcGkuQ29tbW9uLlV0aWwuVHJ5R2V0VmFsdWUoYXBwVGlsZUdyb3VwLCAnVXNlckFwcFRpbGVHcm91cFNldHRpbmcuT3JkZXJJdGVtJywgbnVsbCk7XHJcbiAgICAgICAgaWYgKG9yZGVySXRlbSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yT3JkZXJJdGVtID0gb3JkZXJJdGVtO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JPcmRlckl0ZW0gPSBhcHBUaWxlR3JvdXAuT3JkZXJJdGVtO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgdmlzaWJsZSA9IEJhcnNhQXBpLkNvbW1vbi5VdGlsLlRyeUdldFZhbHVlKGFwcFRpbGVHcm91cCwgJ1VzZXJBcHBUaWxlR3JvdXBTZXR0aW5nLlZpc2libGUnLCBudWxsKTtcclxuICAgICAgICBpZiAodmlzaWJsZSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvclZpc2libGUgPSBhcHBUaWxlR3JvdXAuVmlzaWJsZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGFwcFRpbGVzID0gYXBwVGlsZUdyb3VwLkFwcFRpbGVzPy5Nb0RhdGFMaXN0ID8/IFtdO1xyXG5cclxuICAgICAgICBhcHBUaWxlR3JvdXAubmF2aWdhdG9yVGlsZXMgPSBhcHBUaWxlc1xyXG4gICAgICAgICAgICAuZmlsdGVyKChjKSA9PiBjLlZpc2libGUgJiYgIWMuSXNBY3Rpb25MaW5rKVxyXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gTnVtYmVyKGEuT3JkZXJJdGVtKSAtIE51bWJlcihiLk9yZGVySXRlbSkpO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JBY3Rpb25MaW5rcyA9IGFwcFRpbGVzXHJcbiAgICAgICAgICAgIC5maWx0ZXIoKGMpID0+IGMuVmlzaWJsZSAmJiBjLklzQWN0aW9uTGluaylcclxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IE51bWJlcihhLk9yZGVySXRlbUFjdGlvbkxpbmspIC0gTnVtYmVyKGIuT3JkZXJJdGVtQWN0aW9uTGluaykpO1xyXG4gICAgICAgIGFwcFRpbGVHcm91cC5uYXZpZ2F0b3JUaWxlcy5mb3JFYWNoKChhcHBUaWxlKSA9PiB0aGlzLl9zZXRUaWxlSW5mbyhhcHBUaWxlKSk7XHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLm5hdmlnYXRvckFjdGlvbkxpbmtzLmZvckVhY2goKGFwcFRpbGUpID0+IHRoaXMuX3NldFRpbGVJbmZvKGFwcFRpbGUpKTtcclxuXHJcbiAgICAgICAgYXBwVGlsZUdyb3VwLiRDaGlsZHJlbj8uZm9yRWFjaCgoc3ViQXBwVGlsZUdyb3VwKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVOYXZpZ2F0b3Ioc3ViQXBwVGlsZUdyb3VwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufVxyXG5pbnRlcmZhY2UgUGluVGlsZUluZm8ge1xyXG4gICAgZ3JvdXBzOiBNZXRhb2JqZWN0RGF0YU1vZGVsW107XHJcbiAgICB2aXNpYmxlOiBib29sZWFuW107XHJcbiAgICB0aWxlSWQ6IHN0cmluZztcclxufVxyXG4iXX0=