@sunbird-cb/consumption 0.0.44 → 0.0.46

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 (40) hide show
  1. package/bundles/sunbird-cb-consumption.umd.js +4429 -68
  2. package/bundles/sunbird-cb-consumption.umd.js.map +1 -1
  3. package/bundles/sunbird-cb-consumption.umd.min.js +1 -1
  4. package/bundles/sunbird-cb-consumption.umd.min.js.map +1 -1
  5. package/esm2015/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.js +34 -24
  6. package/esm2015/lib/_common/cards/cards.component.js +2 -2
  7. package/esm2015/lib/_common/cards/cards.module.js +3 -1
  8. package/esm2015/lib/_common/cards/provider-card/provider-card.component.js +168 -0
  9. package/esm2015/lib/_common/dialog-components/certificate-dialog/certificate-dialog.component.js +3 -3
  10. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.js +2794 -0
  11. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.model.js +218 -0
  12. package/esm2015/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.module.js +69 -0
  13. package/esm2015/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +2 -2
  14. package/esm2015/public-api.js +2 -1
  15. package/esm2015/sunbird-cb-consumption.js +37 -35
  16. package/esm5/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.js +46 -30
  17. package/esm5/lib/_common/cards/cards.component.js +2 -2
  18. package/esm5/lib/_common/cards/cards.module.js +3 -1
  19. package/esm5/lib/_common/cards/provider-card/provider-card.component.js +177 -0
  20. package/esm5/lib/_common/dialog-components/certificate-dialog/certificate-dialog.component.js +3 -3
  21. package/esm5/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.js +4119 -0
  22. package/esm5/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.model.js +218 -0
  23. package/esm5/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.module.js +73 -0
  24. package/esm5/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.js +3 -3
  25. package/esm5/public-api.js +2 -1
  26. package/esm5/sunbird-cb-consumption.js +37 -35
  27. package/fesm2015/sunbird-cb-consumption.js +3044 -28
  28. package/fesm2015/sunbird-cb-consumption.js.map +1 -1
  29. package/fesm5/sunbird-cb-consumption.js +4392 -35
  30. package/fesm5/sunbird-cb-consumption.js.map +1 -1
  31. package/lib/_common/cards/card-assessment/card-assessment/card-assessment.component.d.ts +4 -3
  32. package/lib/_common/cards/provider-card/provider-card.component.d.ts +12 -0
  33. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.component.d.ts +202 -0
  34. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.model.d.ts +149 -0
  35. package/lib/_common/strips/content-strip-with-tabs-pills/content-strip-with-tabs-pills.module.d.ts +5 -0
  36. package/lib/_pipes/pipe-duration-transform/pipe-duration-transform.pipe.d.ts +1 -1
  37. package/package.json +1 -1
  38. package/public-api.d.ts +1 -0
  39. package/sunbird-cb-consumption.d.ts +35 -33
  40. package/sunbird-cb-consumption.metadata.json +1 -1
@@ -0,0 +1,4119 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Component, Input, HostBinding, Inject, EventEmitter, Output } from '@angular/core';
7
+ import { WidgetBaseComponent } from '@sunbird-cb/resolver-v2';
8
+ // import { HttpClient } from '@angular/common/http'
9
+ import { WidgetContentService } from '../../../_services/widget-content.service';
10
+ import { MultilingualTranslationsService } from '../../../_services/multilingual-translations.service';
11
+ import { LoggerService, EventService, ConfigurationsService, UtilityService, WsEvents, } from '@sunbird-cb/utils-v2';
12
+ import { filter } from 'rxjs/operators';
13
+ import { WidgetUserService } from '../../../_services/widget-user.service';
14
+ // import { environment } from 'src/environments/environment'
15
+ // tslint:disable-next-line
16
+ import * as _ from 'lodash';
17
+ import { NsCardContent } from '../../../_models/card-content-v2.model';
18
+ import { TranslateService } from '@ngx-translate/core';
19
+ import { Router } from '@angular/router';
20
+ /**
21
+ * @record
22
+ */
23
+ function IStripUnitContentData() { }
24
+ if (false) {
25
+ /** @type {?} */
26
+ IStripUnitContentData.prototype.key;
27
+ /** @type {?} */
28
+ IStripUnitContentData.prototype.canHideStrip;
29
+ /** @type {?|undefined} */
30
+ IStripUnitContentData.prototype.mode;
31
+ /** @type {?} */
32
+ IStripUnitContentData.prototype.showStrip;
33
+ /** @type {?} */
34
+ IStripUnitContentData.prototype.disableTranslate;
35
+ /** @type {?|undefined} */
36
+ IStripUnitContentData.prototype.widgets;
37
+ /** @type {?} */
38
+ IStripUnitContentData.prototype.stripTitle;
39
+ /** @type {?|undefined} */
40
+ IStripUnitContentData.prototype.stripTitleLink;
41
+ /** @type {?|undefined} */
42
+ IStripUnitContentData.prototype.sliderConfig;
43
+ /** @type {?} */
44
+ IStripUnitContentData.prototype.stripConfig;
45
+ /** @type {?|undefined} */
46
+ IStripUnitContentData.prototype.tabs;
47
+ /** @type {?|undefined} */
48
+ IStripUnitContentData.prototype.stripName;
49
+ /** @type {?|undefined} */
50
+ IStripUnitContentData.prototype.stripLogo;
51
+ /** @type {?|undefined} */
52
+ IStripUnitContentData.prototype.description;
53
+ /** @type {?|undefined} */
54
+ IStripUnitContentData.prototype.stripInfo;
55
+ /** @type {?|undefined} */
56
+ IStripUnitContentData.prototype.noDataWidget;
57
+ /** @type {?|undefined} */
58
+ IStripUnitContentData.prototype.errorWidget;
59
+ /** @type {?} */
60
+ IStripUnitContentData.prototype.showOnNoData;
61
+ /** @type {?} */
62
+ IStripUnitContentData.prototype.showOnLoader;
63
+ /** @type {?} */
64
+ IStripUnitContentData.prototype.showOnError;
65
+ /** @type {?|undefined} */
66
+ IStripUnitContentData.prototype.loaderWidgets;
67
+ /** @type {?|undefined} */
68
+ IStripUnitContentData.prototype.stripBackground;
69
+ /** @type {?|undefined} */
70
+ IStripUnitContentData.prototype.secondaryHeading;
71
+ /** @type {?} */
72
+ IStripUnitContentData.prototype.viewMoreUrl;
73
+ /** @type {?|undefined} */
74
+ IStripUnitContentData.prototype.request;
75
+ }
76
+ var ContentStripWithTabsPillsComponent = /** @class */ (function (_super) {
77
+ tslib_1.__extends(ContentStripWithTabsPillsComponent, _super);
78
+ function ContentStripWithTabsPillsComponent(
79
+ // private contentStripSvc: ContentStripNewMultipleService,
80
+ environment, contentSvc, loggerSvc, eventSvc, configSvc, utilitySvc, router, userSvc, translate, langtranslations) {
81
+ var _this = _super.call(this) || this;
82
+ _this.contentSvc = contentSvc;
83
+ _this.loggerSvc = loggerSvc;
84
+ _this.eventSvc = eventSvc;
85
+ _this.configSvc = configSvc;
86
+ _this.utilitySvc = utilitySvc;
87
+ _this.router = router;
88
+ _this.userSvc = userSvc;
89
+ _this.translate = translate;
90
+ _this.langtranslations = langtranslations;
91
+ _this.emptyResponse = new EventEmitter();
92
+ _this.viewAllResponse = new EventEmitter();
93
+ _this.telemtryResponse = new EventEmitter();
94
+ _this.providerId = '';
95
+ _this.emitViewAll = false;
96
+ _this.channnelName = '';
97
+ _this.id = "ws-strip-miltiple_" + Math.random();
98
+ _this.stripsResultDataMap = {};
99
+ _this.stripsKeyOrder = [];
100
+ _this.showAccordionData = true;
101
+ _this.showParentLoader = false;
102
+ _this.showParentError = false;
103
+ _this.showParentNoData = false;
104
+ _this.errorDataCount = 0;
105
+ _this.noDataCount = 0;
106
+ _this.successDataCount = 0;
107
+ _this.contentAvailable = true;
108
+ _this.baseUrl = _this.configSvc.sitePath || '';
109
+ _this.veifiedKarmayogi = false;
110
+ _this.changeEventSubscription = null;
111
+ _this.defaultMaxWidgets = 12;
112
+ _this.todaysEvents = [];
113
+ if (localStorage.getItem('websiteLanguage')) {
114
+ _this.translate.setDefaultLang('en');
115
+ /** @type {?} */
116
+ var lang = JSON.stringify(localStorage.getItem('websiteLanguage'));
117
+ lang = lang.replace(/\"/g, '');
118
+ _this.translate.use(lang);
119
+ }
120
+ _this.environment = environment;
121
+ return _this;
122
+ }
123
+ /**
124
+ * @return {?}
125
+ */
126
+ ContentStripWithTabsPillsComponent.prototype.ngOnInit = /**
127
+ * @return {?}
128
+ */
129
+ function () {
130
+ var _this = this;
131
+ // const url = window.location.href
132
+ this.initData();
133
+ this.contentSvc.telemetryData$.subscribe((/**
134
+ * @param {?} data
135
+ * @return {?}
136
+ */
137
+ function (data) {
138
+ _this.telemtryResponse.emit(data);
139
+ }));
140
+ };
141
+ /**
142
+ * @return {?}
143
+ */
144
+ ContentStripWithTabsPillsComponent.prototype.ngOnDestroy = /**
145
+ * @return {?}
146
+ */
147
+ function () {
148
+ if (this.changeEventSubscription) {
149
+ this.changeEventSubscription.unsubscribe();
150
+ }
151
+ };
152
+ /**
153
+ * @param {?} key
154
+ * @return {?}
155
+ */
156
+ ContentStripWithTabsPillsComponent.prototype.showAccordion = /**
157
+ * @param {?} key
158
+ * @return {?}
159
+ */
160
+ function (key) {
161
+ if (this.utilitySvc.isMobile && this.stripsResultDataMap[key].mode === 'accordion') {
162
+ return this.showAccordionData;
163
+ }
164
+ return true;
165
+ };
166
+ /**
167
+ * @param {?} key
168
+ * @return {?}
169
+ */
170
+ ContentStripWithTabsPillsComponent.prototype.setHiddenForStrip = /**
171
+ * @param {?} key
172
+ * @return {?}
173
+ */
174
+ function (key) {
175
+ this.stripsResultDataMap[key].showStrip = false;
176
+ sessionStorage.setItem("cstrip_" + key, '1');
177
+ };
178
+ /**
179
+ * @private
180
+ * @param {?} key
181
+ * @return {?}
182
+ */
183
+ ContentStripWithTabsPillsComponent.prototype.getIfStripHidden = /**
184
+ * @private
185
+ * @param {?} key
186
+ * @return {?}
187
+ */
188
+ function (key) {
189
+ /** @type {?} */
190
+ var storageItem = sessionStorage.getItem("cstrip_" + key);
191
+ return Boolean(storageItem !== '1');
192
+ };
193
+ /**
194
+ * @private
195
+ * @return {?}
196
+ */
197
+ ContentStripWithTabsPillsComponent.prototype.initData = /**
198
+ * @private
199
+ * @return {?}
200
+ */
201
+ function () {
202
+ var e_1, _a;
203
+ var _this = this;
204
+ this.stripsKeyOrder = this.widgetData && this.widgetData.strips && this.widgetData.strips.map((/**
205
+ * @param {?} strip
206
+ * @return {?}
207
+ */
208
+ function (strip) { return strip.key; })) || [];
209
+ if (this.widgetData.loader && this.widgetData.strips.length) {
210
+ this.showParentLoader = true;
211
+ }
212
+ try {
213
+ // Fetch the data
214
+ for (var _b = tslib_1.__values(this.widgetData.strips), _c = _b.next(); !_c.done; _c = _b.next()) {
215
+ var strip = _c.value;
216
+ if (this.checkForEmptyWidget(strip)) {
217
+ this.fetchStripFromRequestData(strip, false);
218
+ }
219
+ else {
220
+ this.processStrip(strip, [], 'done', true, null);
221
+ }
222
+ }
223
+ }
224
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
225
+ finally {
226
+ try {
227
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
228
+ }
229
+ finally { if (e_1) throw e_1.error; }
230
+ }
231
+ // Subscription for changes
232
+ /** @type {?} */
233
+ var keyAndEvent = this.widgetData.strips
234
+ .map((/**
235
+ * @param {?} strip
236
+ * @return {?}
237
+ */
238
+ function (strip) { return ({
239
+ key: strip.key,
240
+ type: (strip.refreshEvent && strip.refreshEvent.eventType) || '',
241
+ from: (strip.refreshEvent && strip.refreshEvent.from.toString()) || '',
242
+ }); }))
243
+ .filter((/**
244
+ * @param {?} __0
245
+ * @return {?}
246
+ */
247
+ function (_a) {
248
+ var key = _a.key, type = _a.type, from = _a.from;
249
+ return key && type && from;
250
+ }));
251
+ /** @type {?} */
252
+ var eventTypeSet = new Set(keyAndEvent.map((/**
253
+ * @param {?} e
254
+ * @return {?}
255
+ */
256
+ function (e) { return e.type; })));
257
+ this.changeEventSubscription = this.eventSvc.events$
258
+ .pipe(filter((/**
259
+ * @param {?} event
260
+ * @return {?}
261
+ */
262
+ function (event) { return eventTypeSet.has(event.eventType); })))
263
+ .subscribe((/**
264
+ * @param {?} event
265
+ * @return {?}
266
+ */
267
+ function (event) {
268
+ keyAndEvent
269
+ .filter((/**
270
+ * @param {?} e
271
+ * @return {?}
272
+ */
273
+ function (e) { return e.type === event.eventType && e.from === event.from; }))
274
+ .map((/**
275
+ * @param {?} e
276
+ * @return {?}
277
+ */
278
+ function (e) { return e.key; }))
279
+ .forEach((/**
280
+ * @param {?} k
281
+ * @return {?}
282
+ */
283
+ function (k) { return _this.fetchStripFromKey(k, false); }));
284
+ }));
285
+ };
286
+ /**
287
+ * @private
288
+ * @param {?} key
289
+ * @param {?=} calculateParentStatus
290
+ * @return {?}
291
+ */
292
+ ContentStripWithTabsPillsComponent.prototype.fetchStripFromKey = /**
293
+ * @private
294
+ * @param {?} key
295
+ * @param {?=} calculateParentStatus
296
+ * @return {?}
297
+ */
298
+ function (key, calculateParentStatus) {
299
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
300
+ /** @type {?} */
301
+ var stripData = this.widgetData.strips.find((/**
302
+ * @param {?} strip
303
+ * @return {?}
304
+ */
305
+ function (strip) { return strip.key === key; }));
306
+ if (stripData) {
307
+ this.fetchStripFromRequestData(stripData, calculateParentStatus);
308
+ }
309
+ };
310
+ /**
311
+ * @param {?} data
312
+ * @return {?}
313
+ */
314
+ ContentStripWithTabsPillsComponent.prototype.isStripShowing = /**
315
+ * @param {?} data
316
+ * @return {?}
317
+ */
318
+ function (data) {
319
+ var _this = this;
320
+ /** @type {?} */
321
+ var count = 0;
322
+ if (data && data.key === this.environment.programStripKey && (!data.tabs || !data.tabs.length) &&
323
+ data.stripTitle === this.environment.programStripName && data.widgets.length > 0) {
324
+ data.widgets.forEach((/**
325
+ * @param {?} key
326
+ * @return {?}
327
+ */
328
+ function (key) {
329
+ if (key && key.widgetData.content.primaryCategory === _this.environment.programStripPrimaryCategory) {
330
+ count = count + 1;
331
+ }
332
+ }));
333
+ if (count > 0) {
334
+ data.showStrip = true;
335
+ }
336
+ else {
337
+ data.showStrip = false;
338
+ }
339
+ }
340
+ // console.log('data.key', data, data.key, data.widgets);
341
+ return data.showStrip;
342
+ };
343
+ Object.defineProperty(ContentStripWithTabsPillsComponent.prototype, "isMobile", {
344
+ get: /**
345
+ * @return {?}
346
+ */
347
+ function () {
348
+ return this.utilitySvc.isMobile || false;
349
+ },
350
+ enumerable: true,
351
+ configurable: true
352
+ });
353
+ /**
354
+ * @param {?} data
355
+ * @return {?}
356
+ */
357
+ ContentStripWithTabsPillsComponent.prototype.getdata = /**
358
+ * @param {?} data
359
+ * @return {?}
360
+ */
361
+ function (data) {
362
+ if (data.stripInfo) {
363
+ return data.stripInfo.widget;
364
+ }
365
+ return {};
366
+ };
367
+ /**
368
+ * @param {?} wData
369
+ * @param {?} data
370
+ * @return {?}
371
+ */
372
+ ContentStripWithTabsPillsComponent.prototype.checkCondition = /**
373
+ * @param {?} wData
374
+ * @param {?} data
375
+ * @return {?}
376
+ */
377
+ function (wData, data) {
378
+ if (wData.strips[0].stripConfig && wData.strips[0].stripConfig.hideShowAll) {
379
+ return !wData.strips[0].stripConfig.hideShowAll;
380
+ }
381
+ return wData.strips[0].viewMoreUrl && data.widgets && data.widgets.length >= 4;
382
+ };
383
+ /**
384
+ * @param {?} data
385
+ * @return {?}
386
+ */
387
+ ContentStripWithTabsPillsComponent.prototype.checkVisible = /**
388
+ * @param {?} data
389
+ * @return {?}
390
+ */
391
+ function (data) {
392
+ return data.stripInfo && data.stripInfo.visibilityMode === 'visible';
393
+ };
394
+ /**
395
+ * @param {?} data
396
+ * @return {?}
397
+ */
398
+ ContentStripWithTabsPillsComponent.prototype.getContineuLearningLenth = /**
399
+ * @param {?} data
400
+ * @return {?}
401
+ */
402
+ function (data) {
403
+ return data.widgets ? data.widgets.length : 0;
404
+ };
405
+ /**
406
+ * @param {?} data
407
+ * @return {?}
408
+ */
409
+ ContentStripWithTabsPillsComponent.prototype.getLength = /**
410
+ * @param {?} data
411
+ * @return {?}
412
+ */
413
+ function (data) {
414
+ if (!data.tabs || !data.tabs.length) {
415
+ return data.widgets ? data.widgets.length : 0;
416
+ }
417
+ {
418
+ // if tabs are there check if each tab has widgets and get the tab with max widgets
419
+ /** @type {?} */
420
+ var tabWithMaxWidgets_1 = {};
421
+ data.tabs.forEach((/**
422
+ * @param {?} tab
423
+ * @return {?}
424
+ */
425
+ function (tab) {
426
+ if (tab.pillsData && tab.pillsData.length) {
427
+ tabWithMaxWidgets_1 = tab.pillsData.reduce((/**
428
+ * @param {?} prev
429
+ * @param {?} current
430
+ * @return {?}
431
+ */
432
+ function (prev, current) {
433
+ if (!prev.widgets && !current.widgets) {
434
+ return current;
435
+ }
436
+ if (prev.widgets && current.widgets) {
437
+ return (prev.widgets.length > current.widgets.length) ? prev : current;
438
+ }
439
+ if (current.widgets && !prev.widgets) {
440
+ return current;
441
+ }
442
+ if (!current.widgets && prev.widgets) {
443
+ return prev;
444
+ }
445
+ return current;
446
+ // return (prev.widgets && current.widgets && (prev.widgets.length > current.widgets.length) ) ? prev : current
447
+ // tslint:disable-next-line: align
448
+ }), data.tabs[0]);
449
+ }
450
+ }));
451
+ // if tabs has atleast 1 widgets then strip will show or else not
452
+ return tabWithMaxWidgets_1.widgets ? tabWithMaxWidgets_1.widgets.length : 0;
453
+ }
454
+ };
455
+ /**
456
+ * @private
457
+ * @param {?} v6filters
458
+ * @return {?}
459
+ */
460
+ ContentStripWithTabsPillsComponent.prototype.getFiltersFromArray = /**
461
+ * @private
462
+ * @param {?} v6filters
463
+ * @return {?}
464
+ */
465
+ function (v6filters) {
466
+ /** @type {?} */
467
+ var filters = {};
468
+ if (v6filters.constructor === Array) {
469
+ v6filters.forEach(((/**
470
+ * @param {?} f
471
+ * @return {?}
472
+ */
473
+ function (f) {
474
+ Object.keys(f).forEach((/**
475
+ * @param {?} key
476
+ * @return {?}
477
+ */
478
+ function (key) {
479
+ filters[key] = f[key];
480
+ }));
481
+ })));
482
+ return filters;
483
+ }
484
+ return v6filters;
485
+ };
486
+ /**
487
+ * @private
488
+ * @param {?} v6filters
489
+ * @return {?}
490
+ */
491
+ ContentStripWithTabsPillsComponent.prototype.transformSearchV6FiltersV2 = /**
492
+ * @private
493
+ * @param {?} v6filters
494
+ * @return {?}
495
+ */
496
+ function (v6filters) {
497
+ /** @type {?} */
498
+ var filters = {};
499
+ if (v6filters.constructor === Array) {
500
+ v6filters.forEach(((/**
501
+ * @param {?} f
502
+ * @return {?}
503
+ */
504
+ function (f) {
505
+ Object.keys(f).forEach((/**
506
+ * @param {?} key
507
+ * @return {?}
508
+ */
509
+ function (key) {
510
+ filters[key] = f[key];
511
+ }));
512
+ })));
513
+ return filters;
514
+ }
515
+ return v6filters;
516
+ };
517
+ /**
518
+ * @param {?} filters
519
+ * @return {?}
520
+ */
521
+ ContentStripWithTabsPillsComponent.prototype.checkForDateFilters = /**
522
+ * @param {?} filters
523
+ * @return {?}
524
+ */
525
+ function (filters) {
526
+ /** @type {?} */
527
+ var userData;
528
+ if (this.configSvc.userProfile) {
529
+ userData = this.configSvc.userProfile;
530
+ }
531
+ if (filters && filters.hasOwnProperty('batches.endDate')) {
532
+ // tslint:disable-next-line
533
+ filters['batches.endDate']['>='] = eval(filters['batches.endDate']['>=']);
534
+ }
535
+ else if (filters && filters.hasOwnProperty('batches.enrollmentEndDate')) {
536
+ // tslint:disable-next-line
537
+ filters['batches.enrollmentEndDate']['>='] = eval(filters['batches.enrollmentEndDate']['>=']);
538
+ }
539
+ else if (filters.organisation &&
540
+ filters.organisation.indexOf('<orgID>') >= 0) {
541
+ if (this.providerId) {
542
+ filters.organisation = this.providerId;
543
+ }
544
+ else {
545
+ filters.organisation = userData && userData.rootOrgId;
546
+ if (filters && filters.hasOwnProperty('designation')) {
547
+ filters.designation = userData.professionalDetails.length > 0 ?
548
+ userData.professionalDetails[0].designation : '';
549
+ }
550
+ }
551
+ }
552
+ return filters;
553
+ };
554
+ /**
555
+ * @private
556
+ * @param {?} strip
557
+ * @param {?=} calculateParentStatus
558
+ * @return {?}
559
+ */
560
+ ContentStripWithTabsPillsComponent.prototype.fetchStripFromRequestData = /**
561
+ * @private
562
+ * @param {?} strip
563
+ * @param {?=} calculateParentStatus
564
+ * @return {?}
565
+ */
566
+ function (strip, calculateParentStatus) {
567
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
568
+ // setting initial values
569
+ strip.loaderWidgets = this.transformSkeletonToWidgets(strip);
570
+ this.processStrip(strip, [], 'fetching', false, null);
571
+ this.fetchFromEnrollmentList(strip, calculateParentStatus);
572
+ this.fetchFromSearchV6(strip, calculateParentStatus);
573
+ this.fetchFromTrendingContent(strip, calculateParentStatus);
574
+ this.fetchAllTopContent(strip, calculateParentStatus);
575
+ this.fetchAllFeaturedContent(strip, calculateParentStatus);
576
+ this.fetchAllBookMarkData(strip, calculateParentStatus);
577
+ this.fetchAllPlaylistSearch(strip, calculateParentStatus);
578
+ this.fetchPlaylistReadData(strip, calculateParentStatus);
579
+ this.fetchCiosContentData(strip, calculateParentStatus);
580
+ this.fetchForYouData(strip, calculateParentStatus);
581
+ this.fetchAllCbpPlans(strip, calculateParentStatus);
582
+ // this.enrollInterval = setInterval(() => {
583
+ // this.fetchAllCbpPlans(strip, calculateParentStatus)
584
+ // }, 1000)
585
+ };
586
+ /**
587
+ * @param {?} strip
588
+ * @param {?=} calculateParentStatus
589
+ * @return {?}
590
+ */
591
+ ContentStripWithTabsPillsComponent.prototype.fetchFromEnrollmentList = /**
592
+ * @param {?} strip
593
+ * @param {?=} calculateParentStatus
594
+ * @return {?}
595
+ */
596
+ function (strip, calculateParentStatus) {
597
+ var _this = this;
598
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
599
+ if (strip.request && strip.request.enrollmentList && Object.keys(strip.request.enrollmentList).length) {
600
+ /** @type {?} */
601
+ var userId = '';
602
+ /** @type {?} */
603
+ var content_1;
604
+ /** @type {?} */
605
+ var contentNew_1;
606
+ /** @type {?} */
607
+ var tabResults_1 = [];
608
+ /** @type {?} */
609
+ var queryParams = _.get(strip.request.enrollmentList, 'queryParams');
610
+ if (this.configSvc.userProfile) {
611
+ userId = this.configSvc.userProfile.userId;
612
+ }
613
+ // tslint:disable-next-line: deprecation
614
+ this.userSvc.fetchUserBatchList(userId, queryParams).subscribe((/**
615
+ * @param {?} result
616
+ * @return {?}
617
+ */
618
+ function (result) {
619
+ /** @type {?} */
620
+ var courses = result && result.courses;
621
+ /** @type {?} */
622
+ var showViewMore = Boolean(courses.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
623
+ /** @type {?} */
624
+ var viewMoreUrl = showViewMore
625
+ ? {
626
+ path: (strip.viewMoreUrl && strip.viewMoreUrl.path) || '',
627
+ queryParams: {
628
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
629
+ f: strip.request && strip.request.searchV6 && strip.request.searchV6.filters
630
+ ? JSON.stringify(
631
+ // this.searchServSvc.transformSearchV6Filters(
632
+ strip.request.searchV6.filters
633
+ // ),
634
+ )
635
+ : {},
636
+ },
637
+ }
638
+ : null;
639
+ if (courses && courses.length) {
640
+ content_1 = courses.map((/**
641
+ * @param {?} c
642
+ * @return {?}
643
+ */
644
+ function (c) {
645
+ /** @type {?} */
646
+ var contentTemp = c.content;
647
+ contentTemp.completionPercentage = c.completionPercentage || c.progress || 0;
648
+ contentTemp.completionStatus = c.completionStatus || c.status || 0;
649
+ contentTemp.enrolledDate = c.enrolledDate || '';
650
+ contentTemp.lastContentAccessTime = c.lastContentAccessTime || '';
651
+ contentTemp.lastReadContentStatus = c.lastReadContentStatus || '';
652
+ contentTemp.lastReadContentId = c.lastReadContentId || '';
653
+ contentTemp.lrcProgressDetails = c.lrcProgressDetails || '';
654
+ contentTemp.issuedCertificates = c.issuedCertificates || [];
655
+ contentTemp.batchId = c.batchId || '';
656
+ return contentTemp;
657
+ }));
658
+ }
659
+ // To filter content with completionPercentage > 0,
660
+ // so that only those content will show in home page
661
+ // continue learing strip
662
+ // if (content && content.length) {
663
+ // contentNew = content.filter((c: any) => {
664
+ // /** commented as both are 0 after enrolll */
665
+ // if (c.completionPercentage && c.completionPercentage > 0) {
666
+ // return c
667
+ // }
668
+ // })
669
+ // }
670
+ // To sort in descending order of the enrolled date
671
+ contentNew_1 = (content_1 || []).sort((/**
672
+ * @param {?} a
673
+ * @param {?} b
674
+ * @return {?}
675
+ */
676
+ function (a, b) {
677
+ /** @type {?} */
678
+ var dateA = new Date(a.lastContentAccessTime || 0);
679
+ /** @type {?} */
680
+ var dateB = new Date(b.lastContentAccessTime || 0);
681
+ return dateB - dateA;
682
+ }));
683
+ if (strip.tabs && strip.tabs.length) {
684
+ tabResults_1 = _this.splitEnrollmentTabsData(contentNew_1, strip);
685
+ _this.processStrip(strip, _this.transformContentsToWidgets(contentNew_1, strip), 'done', calculateParentStatus, viewMoreUrl, tabResults_1);
686
+ }
687
+ else {
688
+ _this.processStrip(strip, _this.transformContentsToWidgets(contentNew_1, strip), 'done', calculateParentStatus, viewMoreUrl);
689
+ }
690
+ }), (/**
691
+ * @return {?}
692
+ */
693
+ function () {
694
+ _this.processStrip(strip, [], 'error', calculateParentStatus, null);
695
+ }));
696
+ }
697
+ };
698
+ /**
699
+ * @param {?} contentNew
700
+ * @param {?} strip
701
+ * @return {?}
702
+ */
703
+ ContentStripWithTabsPillsComponent.prototype.splitEnrollmentTabsData = /**
704
+ * @param {?} contentNew
705
+ * @param {?} strip
706
+ * @return {?}
707
+ */
708
+ function (contentNew, strip) {
709
+ /** @type {?} */
710
+ var tabResults = [];
711
+ /** @type {?} */
712
+ var splitData = this.getInprogressAndCompleted(contentNew, (/**
713
+ * @param {?} e
714
+ * @return {?}
715
+ */
716
+ function (e) { return e.completionStatus === 1 || e.completionPercentage < 100; }), strip);
717
+ if (strip.tabs && strip.tabs.length) {
718
+ var _loop_1 = function (i) {
719
+ if (strip.tabs[i]) {
720
+ tabResults.push(tslib_1.__assign({}, strip.tabs[i], { fetchTabStatus: 'done' }, (splitData.find((/**
721
+ * @param {?} itmInner
722
+ * @return {?}
723
+ */
724
+ function (itmInner) {
725
+ if (strip.tabs && strip.tabs[i] && itmInner.value === strip.tabs[i].value) {
726
+ return itmInner;
727
+ }
728
+ return undefined;
729
+ })))));
730
+ }
731
+ };
732
+ for (var i = 0; i < strip.tabs.length; i += 1) {
733
+ _loop_1(i);
734
+ }
735
+ }
736
+ return tabResults;
737
+ };
738
+ /**
739
+ * @param {?} array
740
+ * @param {?} customFilter
741
+ * @param {?} strip
742
+ * @return {?}
743
+ */
744
+ ContentStripWithTabsPillsComponent.prototype.getInprogressAndCompleted = /**
745
+ * @param {?} array
746
+ * @param {?} customFilter
747
+ * @param {?} strip
748
+ * @return {?}
749
+ */
750
+ function (array, customFilter, strip) {
751
+ /** @type {?} */
752
+ var inprogress = [];
753
+ /** @type {?} */
754
+ var completed = [];
755
+ array.forEach((/**
756
+ * @param {?} e
757
+ * @param {?} idx
758
+ * @param {?} arr
759
+ * @return {?}
760
+ */
761
+ function (e, idx, arr) { return (customFilter(e, idx, arr) ? inprogress : completed).push(e); }));
762
+ return [
763
+ { value: 'inprogress', widgets: this.transformContentsToWidgets(inprogress, strip) },
764
+ { value: 'completed', widgets: this.transformContentsToWidgets(completed, strip) }
765
+ ];
766
+ };
767
+ // async fetchFromSearchV6(strip: NsContentStripWithTabs.IContentStripUnit, calculateParentStatus = true) {
768
+ // if (strip.request && strip.request.searchV6 && Object.keys(strip.request.searchV6).length) {
769
+ // // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
770
+ // // if (this.configSvc.activeLocale) {
771
+ // // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
772
+ // // } else {
773
+ // // strip.request.searchV6.locale = ['en']
774
+ // // }
775
+ // // }
776
+ // let originalFilters: any = [];
777
+ // // tslint:disable:no-console
778
+ // console.log(originalFilters);
779
+ // if (strip.request &&
780
+ // strip.request.searchV6 &&
781
+ // strip.request.searchV6.request &&
782
+ // strip.request.searchV6.request.filters) {
783
+ // originalFilters = strip.request.searchV6.request.filters;
784
+ // strip.request.searchV6.request.filters = this.checkForDateFilters(strip.request.searchV6.request.filters);
785
+ // strip.request.searchV6.request.filters = this.getFiltersFromArray(
786
+ // strip.request.searchV6.request.filters,
787
+ // );
788
+ // }
789
+ // if (strip.tabs && strip.tabs.length) {
790
+ // // TODO: Have to extract requestRequired to outer level of tabs config
791
+ // const firstTab = strip.tabs[0];
792
+ // if (firstTab.requestRequired) {
793
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
794
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
795
+ // const currentTabFromMap = (allTabs && allTabs.length && allTabs[0]) as NsContentStripWithTabs.IContentStripTab;
796
+ // this.getTabDataByNewReqSearchV6(strip, 0, currentTabFromMap, calculateParentStatus);
797
+ // }
798
+ // }
799
+ // } else {
800
+ // try {
801
+ // const response = await this.searchV6Request(strip, strip.request, calculateParentStatus);
802
+ // // console.log('calling after - response, ', response)
803
+ // if (response && response.results) {
804
+ // // console.log('calling after-- ')
805
+ // if (response.results.result.content) {
806
+ // if(strip.key === 'scheduledAssessment') {
807
+ // this.enrollInterval = setInterval(() => {
808
+ // this.checkInvitOnlyAssessments(response.results.result.content, strip, calculateParentStatus, response.viewMoreUrl)
809
+ // // tslint:disable-next-line
810
+ // }, 1000)
811
+ // } else {
812
+ // this.processStrip(
813
+ // strip,
814
+ // this.transformContentsToWidgets(response.results.result.content, strip),
815
+ // 'done',
816
+ // calculateParentStatus,
817
+ // response.viewMoreUrl,
818
+ // );
819
+ // }
820
+ // } else if (response.results.result.Event) {
821
+ // this.processStrip(
822
+ // strip,
823
+ // this.transformEventsToWidgets(response.results.result.Event, strip),
824
+ // 'done',
825
+ // calculateParentStatus,
826
+ // response.viewMoreUrl,
827
+ // );
828
+ // } else {
829
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
830
+ // }
831
+ // } else {
832
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
833
+ // }
834
+ // } catch (error) {
835
+ // // Handle errors
836
+ // // console.error('Error:', error);
837
+ // }
838
+ // }
839
+ // }
840
+ // }
841
+ // async fetchFromSearchV6(strip: NsContentStripWithTabs.IContentStripUnit, calculateParentStatus = true) {
842
+ // if (strip.request && strip.request.searchV6 && Object.keys(strip.request.searchV6).length) {
843
+ // // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
844
+ // // if (this.configSvc.activeLocale) {
845
+ // // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
846
+ // // } else {
847
+ // // strip.request.searchV6.locale = ['en']
848
+ // // }
849
+ // // }
850
+ // let originalFilters: any = [];
851
+ // // tslint:disable:no-console
852
+ // console.log(originalFilters);
853
+ // if (strip.request &&
854
+ // strip.request.searchV6 &&
855
+ // strip.request.searchV6.request &&
856
+ // strip.request.searchV6.request.filters) {
857
+ // originalFilters = strip.request.searchV6.request.filters;
858
+ // strip.request.searchV6.request.filters = this.checkForDateFilters(strip.request.searchV6.request.filters);
859
+ // strip.request.searchV6.request.filters = this.getFiltersFromArray(
860
+ // strip.request.searchV6.request.filters,
861
+ // );
862
+ // }
863
+ // if (strip.tabs && strip.tabs.length) {
864
+ // // TODO: Have to extract requestRequired to outer level of tabs config
865
+ // const firstTab = strip.tabs[0];
866
+ // if (firstTab.requestRequired) {
867
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
868
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
869
+ // const currentTabFromMap = (allTabs && allTabs.length && allTabs[0]) as NsContentStripWithTabs.IContentStripTab;
870
+ // this.getTabDataByNewReqSearchV6(strip, 0, currentTabFromMap, calculateParentStatus);
871
+ // }
872
+ // }
873
+ // } else {
874
+ // try {
875
+ // const response = await this.searchV6Request(strip, strip.request, calculateParentStatus);
876
+ // // console.log('calling after - response, ', response)
877
+ // if (response && response.results) {
878
+ // // console.log('calling after-- ')
879
+ // if (response.results.result.content) {
880
+ // if(strip.key === 'scheduledAssessment') {
881
+ // this.enrollInterval = setInterval(() => {
882
+ // this.checkInvitOnlyAssessments(response.results.result.content, strip, calculateParentStatus, response.viewMoreUrl)
883
+ // // tslint:disable-next-line
884
+ // }, 1000)
885
+ // } else {
886
+ // this.processStrip(
887
+ // strip,
888
+ // this.transformContentsToWidgets(response.results.result.content, strip),
889
+ // 'done',
890
+ // calculateParentStatus,
891
+ // response.viewMoreUrl,
892
+ // );
893
+ // }
894
+ // } else if (response.results.result.Event) {
895
+ // this.processStrip(
896
+ // strip,
897
+ // this.transformEventsToWidgets(response.results.result.Event, strip),
898
+ // 'done',
899
+ // calculateParentStatus,
900
+ // response.viewMoreUrl,
901
+ // );
902
+ // } else {
903
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
904
+ // }
905
+ // } else {
906
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
907
+ // }
908
+ // } catch (error) {
909
+ // // Handle errors
910
+ // // console.error('Error:', error);
911
+ // }
912
+ // }
913
+ // }
914
+ // }
915
+ /**
916
+ * @param {?} content
917
+ * @param {?} strip
918
+ * @param {?} calculateParentStatus
919
+ * @param {?} viewMoreUrl
920
+ * @return {?}
921
+ */
922
+ ContentStripWithTabsPillsComponent.prototype.checkInvitOnlyAssessments =
923
+ // async fetchFromSearchV6(strip: NsContentStripWithTabs.IContentStripUnit, calculateParentStatus = true) {
924
+ // if (strip.request && strip.request.searchV6 && Object.keys(strip.request.searchV6).length) {
925
+ // // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
926
+ // // if (this.configSvc.activeLocale) {
927
+ // // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
928
+ // // } else {
929
+ // // strip.request.searchV6.locale = ['en']
930
+ // // }
931
+ // // }
932
+ // let originalFilters: any = [];
933
+ // // tslint:disable:no-console
934
+ // console.log(originalFilters);
935
+ // if (strip.request &&
936
+ // strip.request.searchV6 &&
937
+ // strip.request.searchV6.request &&
938
+ // strip.request.searchV6.request.filters) {
939
+ // originalFilters = strip.request.searchV6.request.filters;
940
+ // strip.request.searchV6.request.filters = this.checkForDateFilters(strip.request.searchV6.request.filters);
941
+ // strip.request.searchV6.request.filters = this.getFiltersFromArray(
942
+ // strip.request.searchV6.request.filters,
943
+ // );
944
+ // }
945
+ // if (strip.tabs && strip.tabs.length) {
946
+ // // TODO: Have to extract requestRequired to outer level of tabs config
947
+ // const firstTab = strip.tabs[0];
948
+ // if (firstTab.requestRequired) {
949
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
950
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
951
+ // const currentTabFromMap = (allTabs && allTabs.length && allTabs[0]) as NsContentStripWithTabs.IContentStripTab;
952
+ // this.getTabDataByNewReqSearchV6(strip, 0, currentTabFromMap, calculateParentStatus);
953
+ // }
954
+ // }
955
+ // } else {
956
+ // try {
957
+ // const response = await this.searchV6Request(strip, strip.request, calculateParentStatus);
958
+ // // console.log('calling after - response, ', response)
959
+ // if (response && response.results) {
960
+ // // console.log('calling after-- ')
961
+ // if (response.results.result.content) {
962
+ // if(strip.key === 'scheduledAssessment') {
963
+ // this.enrollInterval = setInterval(() => {
964
+ // this.checkInvitOnlyAssessments(response.results.result.content, strip, calculateParentStatus, response.viewMoreUrl)
965
+ // // tslint:disable-next-line
966
+ // }, 1000)
967
+ // } else {
968
+ // this.processStrip(
969
+ // strip,
970
+ // this.transformContentsToWidgets(response.results.result.content, strip),
971
+ // 'done',
972
+ // calculateParentStatus,
973
+ // response.viewMoreUrl,
974
+ // );
975
+ // }
976
+ // } else if (response.results.result.Event) {
977
+ // this.processStrip(
978
+ // strip,
979
+ // this.transformEventsToWidgets(response.results.result.Event, strip),
980
+ // 'done',
981
+ // calculateParentStatus,
982
+ // response.viewMoreUrl,
983
+ // );
984
+ // } else {
985
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
986
+ // }
987
+ // } else {
988
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
989
+ // }
990
+ // } catch (error) {
991
+ // // Handle errors
992
+ // // console.error('Error:', error);
993
+ // }
994
+ // }
995
+ // }
996
+ // }
997
+ /**
998
+ * @param {?} content
999
+ * @param {?} strip
1000
+ * @param {?} calculateParentStatus
1001
+ * @param {?} viewMoreUrl
1002
+ * @return {?}
1003
+ */
1004
+ function (content, strip, calculateParentStatus, viewMoreUrl) {
1005
+ var _this = this;
1006
+ if (localStorage.getItem('enrollmentMapData')) {
1007
+ this.enrollmentMapData = JSON.parse(localStorage.getItem('enrollmentMapData') || '{}');
1008
+ /** @type {?} */
1009
+ var filteredArray_1 = [];
1010
+ content.forEach((/**
1011
+ * @param {?} data
1012
+ * @return {?}
1013
+ */
1014
+ function (data) {
1015
+ if (_this.enrollmentMapData[data.identifier]) {
1016
+ data['batch'] = _this.enrollmentMapData[data.identifier].batch;
1017
+ data['completionPercentage'] = _this.enrollmentMapData[data.identifier].completionPercentage;
1018
+ filteredArray_1.push(data);
1019
+ }
1020
+ }));
1021
+ this.processStrip(strip, this.transformContentsToWidgets(filteredArray_1, strip), 'done', calculateParentStatus, viewMoreUrl);
1022
+ clearInterval(this.enrollInterval);
1023
+ }
1024
+ };
1025
+ // async searchV6Request(strip: NsContentStripWithTabs.IContentStripUnit,
1026
+ // request: NsContentStripWithTabs.IContentStripUnit['request'],
1027
+ // calculateParentStatus: boolean
1028
+ // ): Promise<any> {
1029
+ // const originalFilters: any = [];
1030
+ // return new Promise<any>((resolve, reject) => {
1031
+ // if (request && request.searchV6) {
1032
+ // this.contentSvc.searchV6(request.searchV6).subscribe(results => {
1033
+ // const showViewMore = Boolean(
1034
+ // results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch,
1035
+ // );
1036
+ // const viewMoreUrl = showViewMore
1037
+ // ? {
1038
+ // path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
1039
+ // queryParams: {
1040
+ // tab: 'Learn',
1041
+ // q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
1042
+ // f:
1043
+ // request &&
1044
+ // request.searchV6 &&
1045
+ // request.searchV6.request &&
1046
+ // request.searchV6.request.filters
1047
+ // ? JSON.stringify(
1048
+ // this.transformSearchV6FiltersV2(
1049
+ // originalFilters,
1050
+ // )
1051
+ // )
1052
+ // : {},
1053
+ // },
1054
+ // }
1055
+ // : null;
1056
+ // // if (viewMoreUrl && viewMoreUrl.queryParams) {
1057
+ // // viewMoreUrl.queryParams = viewMoreUrl.queryParams
1058
+ // // }
1059
+ // resolve({ results, viewMoreUrl });
1060
+ // }, (error: any) => {
1061
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1062
+ // reject(error);
1063
+ // },
1064
+ // );
1065
+ // }
1066
+ // });
1067
+ // }
1068
+ // async searchV6Request(strip: NsContentStripWithTabs.IContentStripUnit,
1069
+ // request: NsContentStripWithTabs.IContentStripUnit['request'],
1070
+ // calculateParentStatus: boolean
1071
+ // ): Promise<any> {
1072
+ // const originalFilters: any = [];
1073
+ // return new Promise<any>((resolve, reject) => {
1074
+ // if (request && request.searchV6) {
1075
+ // this.contentSvc.searchV6(request.searchV6).subscribe(results => {
1076
+ // const showViewMore = Boolean(
1077
+ // results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch,
1078
+ // );
1079
+ // const viewMoreUrl = showViewMore
1080
+ // ? {
1081
+ // path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
1082
+ // queryParams: {
1083
+ // tab: 'Learn',
1084
+ // q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
1085
+ // f:
1086
+ // request &&
1087
+ // request.searchV6 &&
1088
+ // request.searchV6.request &&
1089
+ // request.searchV6.request.filters
1090
+ // ? JSON.stringify(
1091
+ // this.transformSearchV6FiltersV2(
1092
+ // originalFilters,
1093
+ // )
1094
+ // )
1095
+ // : {},
1096
+ // },
1097
+ // }
1098
+ // : null;
1099
+ // // if (viewMoreUrl && viewMoreUrl.queryParams) {
1100
+ // // viewMoreUrl.queryParams = viewMoreUrl.queryParams
1101
+ // // }
1102
+ // resolve({ results, viewMoreUrl });
1103
+ // }, (error: any) => {
1104
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1105
+ // reject(error);
1106
+ // },
1107
+ // );
1108
+ // }
1109
+ // });
1110
+ // }
1111
+ /**
1112
+ * @param {?} strip
1113
+ * @param {?=} calculateParentStatus
1114
+ * @return {?}
1115
+ */
1116
+ ContentStripWithTabsPillsComponent.prototype.fetchFromTrendingContent =
1117
+ // async searchV6Request(strip: NsContentStripWithTabs.IContentStripUnit,
1118
+ // request: NsContentStripWithTabs.IContentStripUnit['request'],
1119
+ // calculateParentStatus: boolean
1120
+ // ): Promise<any> {
1121
+ // const originalFilters: any = [];
1122
+ // return new Promise<any>((resolve, reject) => {
1123
+ // if (request && request.searchV6) {
1124
+ // this.contentSvc.searchV6(request.searchV6).subscribe(results => {
1125
+ // const showViewMore = Boolean(
1126
+ // results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch,
1127
+ // );
1128
+ // const viewMoreUrl = showViewMore
1129
+ // ? {
1130
+ // path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
1131
+ // queryParams: {
1132
+ // tab: 'Learn',
1133
+ // q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
1134
+ // f:
1135
+ // request &&
1136
+ // request.searchV6 &&
1137
+ // request.searchV6.request &&
1138
+ // request.searchV6.request.filters
1139
+ // ? JSON.stringify(
1140
+ // this.transformSearchV6FiltersV2(
1141
+ // originalFilters,
1142
+ // )
1143
+ // )
1144
+ // : {},
1145
+ // },
1146
+ // }
1147
+ // : null;
1148
+ // // if (viewMoreUrl && viewMoreUrl.queryParams) {
1149
+ // // viewMoreUrl.queryParams = viewMoreUrl.queryParams
1150
+ // // }
1151
+ // resolve({ results, viewMoreUrl });
1152
+ // }, (error: any) => {
1153
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1154
+ // reject(error);
1155
+ // },
1156
+ // );
1157
+ // }
1158
+ // });
1159
+ // }
1160
+ /**
1161
+ * @param {?} strip
1162
+ * @param {?=} calculateParentStatus
1163
+ * @return {?}
1164
+ */
1165
+ function (strip, calculateParentStatus) {
1166
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
1167
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1168
+ var originalFilters, firstTab, allTabs, currentTabFromMap, response, content, error_1;
1169
+ return tslib_1.__generator(this, function (_a) {
1170
+ switch (_a.label) {
1171
+ case 0:
1172
+ if (!(strip.request && strip.request.trendingSearch && Object.keys(strip.request.trendingSearch).length)) return [3 /*break*/, 4];
1173
+ // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
1174
+ // if (this.configSvc.activeLocale) {
1175
+ // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
1176
+ // } else {
1177
+ // strip.request.searchV6.locale = ['en']
1178
+ // }
1179
+ // }
1180
+ originalFilters = [];
1181
+ // tslint:disable:no-console
1182
+ if (strip.request &&
1183
+ strip.request.trendingSearch &&
1184
+ strip.request.trendingSearch.request &&
1185
+ strip.request.trendingSearch.request.filters) {
1186
+ originalFilters = strip.request.trendingSearch.request.filters;
1187
+ strip.request.trendingSearch.request.filters = this.checkForDateFilters(strip.request.trendingSearch.request.filters);
1188
+ strip.request.trendingSearch.request.filters = this.getFiltersFromArray(strip.request.trendingSearch.request.filters);
1189
+ }
1190
+ if (!(strip.tabs && strip.tabs.length)) return [3 /*break*/, 1];
1191
+ // TODO: Have to extract requestRequired to outer level of tabs config
1192
+ firstTab = strip.tabs[0];
1193
+ if (firstTab.requestRequired) {
1194
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1195
+ allTabs = this.stripsResultDataMap[strip.key].tabs;
1196
+ currentTabFromMap = (/** @type {?} */ ((allTabs && allTabs.length && allTabs[0])));
1197
+ this.getTabDataByNewReqTrending(strip, 0, 0, currentTabFromMap, calculateParentStatus);
1198
+ }
1199
+ }
1200
+ return [3 /*break*/, 4];
1201
+ case 1:
1202
+ _a.trys.push([1, 3, , 4]);
1203
+ return [4 /*yield*/, this.trendingSearchRequest(strip, strip.request, calculateParentStatus)];
1204
+ case 2:
1205
+ response = _a.sent();
1206
+ if (response && response.results && response.results.response) {
1207
+ content = response.results.response[strip.request.trendingSearch.responseKey] || [];
1208
+ this.processStrip(strip, this.transformContentsToWidgets(content, strip), 'done', calculateParentStatus, response.viewMoreUrl || '');
1209
+ if (!content.length) {
1210
+ this.emptyResponse.emit(true);
1211
+ }
1212
+ }
1213
+ else {
1214
+ this.emptyResponse.emit(true);
1215
+ this.processStrip(strip, [], 'done', calculateParentStatus, null);
1216
+ }
1217
+ return [3 /*break*/, 4];
1218
+ case 3:
1219
+ error_1 = _a.sent();
1220
+ // Handle errors
1221
+ this.emptyResponse.emit(true);
1222
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
1223
+ return [3 /*break*/, 4];
1224
+ case 4: return [2 /*return*/];
1225
+ }
1226
+ });
1227
+ });
1228
+ };
1229
+ // async trendingSearchRequest(strip: NsContentStripWithTabs.IContentStripUnit,
1230
+ // request: NsContentStripWithTabs.IContentStripUnit['request'],
1231
+ // calculateParentStatus: boolean
1232
+ // ): Promise<any> {
1233
+ // const originalFilters: any = [];
1234
+ // return new Promise<any>((resolve, reject) => {
1235
+ // if (request && request.trendingSearch) {
1236
+ // // check for the request if it has dynamic values]
1237
+ // if (request.trendingSearch.request.filters.organisation &&
1238
+ // request.trendingSearch.request.filters.organisation.indexOf('<orgID>') >= 0
1239
+ // ) {
1240
+ // let userRootOrgId;
1241
+ // if (this.configSvc.userProfile) {
1242
+ // userRootOrgId = this.configSvc.userProfile.rootOrgId;
1243
+ // }
1244
+ // request.trendingSearch.request.filters.organisation = userRootOrgId;
1245
+ // }
1246
+ // this.contentSvc.trendingContentSearch(request.trendingSearch).subscribe(results => {
1247
+ // const showViewMore = Boolean(
1248
+ // results.result &&
1249
+ // strip.request &&
1250
+ // results.result[strip.request.trendingSearch.responseKey] &&
1251
+ // results.result[strip.request.trendingSearch.responseKey].length > 5 &&
1252
+ // strip.stripConfig && strip.stripConfig.postCardForSearch,
1253
+ // );
1254
+ // const viewMoreUrl = showViewMore
1255
+ // ? {
1256
+ // path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
1257
+ // queryParams: {
1258
+ // tab: 'Learn',
1259
+ // q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
1260
+ // f:
1261
+ // request &&
1262
+ // request.trendingSearch &&
1263
+ // request.trendingSearch.request &&
1264
+ // request.trendingSearch.request.filters
1265
+ // ? JSON.stringify(
1266
+ // this.transformSearchV6FiltersV2(
1267
+ // originalFilters,
1268
+ // )
1269
+ // )
1270
+ // : {},
1271
+ // },
1272
+ // }
1273
+ // : null;
1274
+ // let proccesedResult: any = []
1275
+ // if (results && results.response && results.response.certifications) {
1276
+ // results.response.certifications.map((result: any) => {
1277
+ // if (result.source === this.channnelName) {
1278
+ // proccesedResult.push(result)
1279
+ // }
1280
+ // })
1281
+ // }
1282
+ // results = {response: {certifications: proccesedResult}}
1283
+ // resolve({ results, viewMoreUrl });
1284
+ // }, (error: any) => {
1285
+ // if (error.error && error.error.status === 400) {
1286
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null);
1287
+ // }
1288
+ // // this.processStrip(strip, [], 'done', calculateParentStatus, null)
1289
+ // reject(error);
1290
+ // },
1291
+ // );
1292
+ // }
1293
+ // });
1294
+ // }
1295
+ // async trendingSearchRequest(strip: NsContentStripWithTabs.IContentStripUnit,
1296
+ // request: NsContentStripWithTabs.IContentStripUnit['request'],
1297
+ // calculateParentStatus: boolean
1298
+ // ): Promise<any> {
1299
+ // const originalFilters: any = [];
1300
+ // return new Promise<any>((resolve, reject) => {
1301
+ // if (request && request.trendingSearch) {
1302
+ // // check for the request if it has dynamic values]
1303
+ // if (request.trendingSearch.request.filters.organisation &&
1304
+ // request.trendingSearch.request.filters.organisation.indexOf('<orgID>') >= 0
1305
+ // ) {
1306
+ // let userRootOrgId;
1307
+ // if (this.configSvc.userProfile) {
1308
+ // userRootOrgId = this.configSvc.userProfile.rootOrgId;
1309
+ // }
1310
+ // request.trendingSearch.request.filters.organisation = userRootOrgId;
1311
+ // }
1312
+ // this.contentSvc.trendingContentSearch(request.trendingSearch).subscribe(results => {
1313
+ // const showViewMore = Boolean(
1314
+ // results.result &&
1315
+ // strip.request &&
1316
+ // results.result[strip.request.trendingSearch.responseKey] &&
1317
+ // results.result[strip.request.trendingSearch.responseKey].length > 5 &&
1318
+ // strip.stripConfig && strip.stripConfig.postCardForSearch,
1319
+ // );
1320
+ // const viewMoreUrl = showViewMore
1321
+ // ? {
1322
+ // path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
1323
+ // queryParams: {
1324
+ // tab: 'Learn',
1325
+ // q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
1326
+ // f:
1327
+ // request &&
1328
+ // request.trendingSearch &&
1329
+ // request.trendingSearch.request &&
1330
+ // request.trendingSearch.request.filters
1331
+ // ? JSON.stringify(
1332
+ // this.transformSearchV6FiltersV2(
1333
+ // originalFilters,
1334
+ // )
1335
+ // )
1336
+ // : {},
1337
+ // },
1338
+ // }
1339
+ // : null;
1340
+ // let proccesedResult: any = []
1341
+ // if (results && results.response && results.response.certifications) {
1342
+ // results.response.certifications.map((result: any) => {
1343
+ // if (result.source === this.channnelName) {
1344
+ // proccesedResult.push(result)
1345
+ // }
1346
+ // })
1347
+ // }
1348
+ // results = {response: {certifications: proccesedResult}}
1349
+ // resolve({ results, viewMoreUrl });
1350
+ // }, (error: any) => {
1351
+ // if (error.error && error.error.status === 400) {
1352
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null);
1353
+ // }
1354
+ // // this.processStrip(strip, [], 'done', calculateParentStatus, null)
1355
+ // reject(error);
1356
+ // },
1357
+ // );
1358
+ // }
1359
+ // });
1360
+ // }
1361
+ /**
1362
+ * @param {?} data
1363
+ * @return {?}
1364
+ */
1365
+ ContentStripWithTabsPillsComponent.prototype.toggleInfo =
1366
+ // async trendingSearchRequest(strip: NsContentStripWithTabs.IContentStripUnit,
1367
+ // request: NsContentStripWithTabs.IContentStripUnit['request'],
1368
+ // calculateParentStatus: boolean
1369
+ // ): Promise<any> {
1370
+ // const originalFilters: any = [];
1371
+ // return new Promise<any>((resolve, reject) => {
1372
+ // if (request && request.trendingSearch) {
1373
+ // // check for the request if it has dynamic values]
1374
+ // if (request.trendingSearch.request.filters.organisation &&
1375
+ // request.trendingSearch.request.filters.organisation.indexOf('<orgID>') >= 0
1376
+ // ) {
1377
+ // let userRootOrgId;
1378
+ // if (this.configSvc.userProfile) {
1379
+ // userRootOrgId = this.configSvc.userProfile.rootOrgId;
1380
+ // }
1381
+ // request.trendingSearch.request.filters.organisation = userRootOrgId;
1382
+ // }
1383
+ // this.contentSvc.trendingContentSearch(request.trendingSearch).subscribe(results => {
1384
+ // const showViewMore = Boolean(
1385
+ // results.result &&
1386
+ // strip.request &&
1387
+ // results.result[strip.request.trendingSearch.responseKey] &&
1388
+ // results.result[strip.request.trendingSearch.responseKey].length > 5 &&
1389
+ // strip.stripConfig && strip.stripConfig.postCardForSearch,
1390
+ // );
1391
+ // const viewMoreUrl = showViewMore
1392
+ // ? {
1393
+ // path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
1394
+ // queryParams: {
1395
+ // tab: 'Learn',
1396
+ // q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
1397
+ // f:
1398
+ // request &&
1399
+ // request.trendingSearch &&
1400
+ // request.trendingSearch.request &&
1401
+ // request.trendingSearch.request.filters
1402
+ // ? JSON.stringify(
1403
+ // this.transformSearchV6FiltersV2(
1404
+ // originalFilters,
1405
+ // )
1406
+ // )
1407
+ // : {},
1408
+ // },
1409
+ // }
1410
+ // : null;
1411
+ // let proccesedResult: any = []
1412
+ // if (results && results.response && results.response.certifications) {
1413
+ // results.response.certifications.map((result: any) => {
1414
+ // if (result.source === this.channnelName) {
1415
+ // proccesedResult.push(result)
1416
+ // }
1417
+ // })
1418
+ // }
1419
+ // results = {response: {certifications: proccesedResult}}
1420
+ // resolve({ results, viewMoreUrl });
1421
+ // }, (error: any) => {
1422
+ // if (error.error && error.error.status === 400) {
1423
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null);
1424
+ // }
1425
+ // // this.processStrip(strip, [], 'done', calculateParentStatus, null)
1426
+ // reject(error);
1427
+ // },
1428
+ // );
1429
+ // }
1430
+ // });
1431
+ // }
1432
+ /**
1433
+ * @param {?} data
1434
+ * @return {?}
1435
+ */
1436
+ function (data) {
1437
+ /** @type {?} */
1438
+ var stripInfo = this.stripsResultDataMap[data.key].stripInfo;
1439
+ if (stripInfo) {
1440
+ if (stripInfo.mode !== 'below') {
1441
+ this.loggerSvc.warn("strip info mode: " + stripInfo.mode + " not implemented yet");
1442
+ stripInfo.mode = 'below';
1443
+ }
1444
+ if (stripInfo.mode === 'below') {
1445
+ this.stripsResultDataMap[data.key].stripInfo = tslib_1.__assign({}, stripInfo, { visibilityMode: stripInfo.visibilityMode === 'hidden' ? 'visible' : 'hidden' });
1446
+ }
1447
+ }
1448
+ };
1449
+ /**
1450
+ * @private
1451
+ * @param {?} contents
1452
+ * @param {?} strip
1453
+ * @return {?}
1454
+ */
1455
+ ContentStripWithTabsPillsComponent.prototype.transformContentsToWidgets = /**
1456
+ * @private
1457
+ * @param {?} contents
1458
+ * @param {?} strip
1459
+ * @return {?}
1460
+ */
1461
+ function (contents, strip) {
1462
+ return (contents || []).map((/**
1463
+ * @param {?} content
1464
+ * @param {?} idx
1465
+ * @return {?}
1466
+ */
1467
+ function (content, idx) { return (content ? {
1468
+ widgetType: 'cardLib',
1469
+ widgetSubType: 'cardContentLib',
1470
+ widgetHostClass: 'mb-2',
1471
+ widgetData: tslib_1.__assign({ content: content }, (content.batch && { batch: content.batch }), { cardSubType: strip.stripConfig && strip.stripConfig.cardSubType, cardCustomeClass: strip.customeClass ? strip.customeClass : '', context: { pageSection: strip.key, position: idx }, intranetMode: strip.stripConfig && strip.stripConfig.intranetMode, deletedMode: strip.stripConfig && strip.stripConfig.deletedMode, contentTags: strip.stripConfig && strip.stripConfig.contentTags }),
1472
+ } : {
1473
+ widgetType: 'card',
1474
+ widgetSubType: 'cardContent',
1475
+ widgetHostClass: 'mb-2',
1476
+ widgetData: {},
1477
+ }); }));
1478
+ };
1479
+ /**
1480
+ * @private
1481
+ * @param {?} contents
1482
+ * @param {?} strip
1483
+ * @return {?}
1484
+ */
1485
+ ContentStripWithTabsPillsComponent.prototype.transformEventsToWidgets = /**
1486
+ * @private
1487
+ * @param {?} contents
1488
+ * @param {?} strip
1489
+ * @return {?}
1490
+ */
1491
+ function (contents, strip) {
1492
+ this.eventSvc.setEventListData(contents);
1493
+ return (this.eventSvc.todaysEvents || []).map((/**
1494
+ * @param {?} content
1495
+ * @param {?} idx
1496
+ * @return {?}
1497
+ */
1498
+ function (content, idx) { return (content ? {
1499
+ widgetType: 'card',
1500
+ widgetSubType: 'eventHubCard',
1501
+ widgetHostClass: 'mb-2',
1502
+ widgetData: {
1503
+ content: content,
1504
+ cardSubType: strip.stripConfig && strip.stripConfig.cardSubType,
1505
+ cardCustomeClass: strip.customeClass ? strip.customeClass : '',
1506
+ context: { pageSection: strip.key, position: idx },
1507
+ intranetMode: strip.stripConfig && strip.stripConfig.intranetMode,
1508
+ deletedMode: strip.stripConfig && strip.stripConfig.deletedMode,
1509
+ contentTags: strip.stripConfig && strip.stripConfig.contentTags,
1510
+ },
1511
+ } : {
1512
+ widgetType: 'card',
1513
+ widgetSubType: 'eventHubCard',
1514
+ widgetHostClass: 'mb-2',
1515
+ widgetData: {},
1516
+ }); }));
1517
+ };
1518
+ /**
1519
+ * @private
1520
+ * @param {?} strip
1521
+ * @return {?}
1522
+ */
1523
+ ContentStripWithTabsPillsComponent.prototype.transformSkeletonToWidgets = /**
1524
+ * @private
1525
+ * @param {?} strip
1526
+ * @return {?}
1527
+ */
1528
+ function (strip) {
1529
+ return [1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10].map((/**
1530
+ * @param {?} _content
1531
+ * @return {?}
1532
+ */
1533
+ function (_content) { return ({
1534
+ widgetType: 'cardLib',
1535
+ widgetSubType: 'cardContentLib',
1536
+ widgetHostClass: 'mb-2',
1537
+ widgetData: {
1538
+ cardSubType: strip.loaderConfig && strip.loaderConfig.cardSubType || 'card-standard-skeleton',
1539
+ cardCustomeClass: strip.customeClass ? strip.customeClass : '',
1540
+ },
1541
+ }); }));
1542
+ };
1543
+ /**
1544
+ * @private
1545
+ * @param {?} strip
1546
+ * @param {?=} results
1547
+ * @param {?=} fetchStatus
1548
+ * @param {?=} calculateParentStatus
1549
+ * @param {?=} _viewMoreUrl
1550
+ * @param {?=} tabsResults
1551
+ * @return {?}
1552
+ */
1553
+ ContentStripWithTabsPillsComponent.prototype.processStrip = /**
1554
+ * @private
1555
+ * @param {?} strip
1556
+ * @param {?=} results
1557
+ * @param {?=} fetchStatus
1558
+ * @param {?=} calculateParentStatus
1559
+ * @param {?=} _viewMoreUrl
1560
+ * @param {?=} tabsResults
1561
+ * @return {?}
1562
+ */
1563
+ function (strip, results, fetchStatus, calculateParentStatus, _viewMoreUrl, tabsResults) {
1564
+ if (results === void 0) { results = []; }
1565
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
1566
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1567
+ var stripData;
1568
+ var _a;
1569
+ return tslib_1.__generator(this, function (_b) {
1570
+ stripData = {
1571
+ viewMoreUrl: strip.viewMoreUrl,
1572
+ key: strip.key,
1573
+ canHideStrip: Boolean(strip.canHideStrip),
1574
+ showStrip: this.getIfStripHidden(strip.key),
1575
+ noDataWidget: strip.noDataWidget,
1576
+ errorWidget: strip.errorWidget,
1577
+ stripInfo: strip.info,
1578
+ stripTitle: strip.title,
1579
+ stripTitleLink: strip.stripTitleLink,
1580
+ disableTranslate: strip.disableTranslate,
1581
+ sliderConfig: strip.sliderConfig,
1582
+ tabs: tabsResults ? tabsResults : strip.tabs,
1583
+ stripName: strip.name,
1584
+ mode: strip.mode,
1585
+ stripConfig: strip.stripConfig,
1586
+ stripBackground: strip.stripBackground,
1587
+ secondaryHeading: strip.secondaryHeading,
1588
+ loaderWidgets: strip.loaderWidgets || [],
1589
+ widgets: fetchStatus === 'done'
1590
+ ? tslib_1.__spread((strip.preWidgets || []).map((/**
1591
+ * @param {?} w
1592
+ * @return {?}
1593
+ */
1594
+ function (w) { return (tslib_1.__assign({}, w, { widgetHostClass: "mb-2 " + w.widgetHostClass })); })), results, (strip.postWidgets || []).map((/**
1595
+ * @param {?} w
1596
+ * @return {?}
1597
+ */
1598
+ function (w) { return (tslib_1.__assign({}, w, { widgetHostClass: "mb-2 " + w.widgetHostClass })); }))) : [],
1599
+ showOnNoData: Boolean(strip.noDataWidget &&
1600
+ !((strip.preWidgets || []).length + results.length + (strip.postWidgets || []).length) &&
1601
+ fetchStatus === 'done'),
1602
+ showOnLoader: Boolean(strip.loader && fetchStatus === 'fetching'),
1603
+ showOnError: Boolean(strip.errorWidget && fetchStatus === 'error'),
1604
+ };
1605
+ // const stripData = this.stripsResultDataMap[strip.key]
1606
+ this.stripsResultDataMap = tslib_1.__assign({}, this.stripsResultDataMap, (_a = {}, _a[strip.key] = stripData, _a));
1607
+ if (!tabsResults) {
1608
+ if (calculateParentStatus &&
1609
+ (fetchStatus === 'done' || fetchStatus === 'error') &&
1610
+ stripData.widgets) {
1611
+ this.checkParentStatus(fetchStatus, stripData.widgets.length);
1612
+ }
1613
+ if (calculateParentStatus && !(results && results.length > 0)) {
1614
+ this.contentAvailable = false;
1615
+ }
1616
+ else if (results && results.length > 0) {
1617
+ this.contentAvailable = true;
1618
+ }
1619
+ }
1620
+ else {
1621
+ this.contentAvailable = true;
1622
+ }
1623
+ return [2 /*return*/];
1624
+ });
1625
+ });
1626
+ };
1627
+ /**
1628
+ * @private
1629
+ * @param {?} fetchStatus
1630
+ * @param {?} stripWidgetsCount
1631
+ * @return {?}
1632
+ */
1633
+ ContentStripWithTabsPillsComponent.prototype.checkParentStatus = /**
1634
+ * @private
1635
+ * @param {?} fetchStatus
1636
+ * @param {?} stripWidgetsCount
1637
+ * @return {?}
1638
+ */
1639
+ function (fetchStatus, stripWidgetsCount) {
1640
+ if (fetchStatus === 'done' && !stripWidgetsCount) {
1641
+ this.noDataCount += 1;
1642
+ }
1643
+ else if (fetchStatus === 'done' && stripWidgetsCount) {
1644
+ this.successDataCount += 1;
1645
+ }
1646
+ else if (fetchStatus === 'error') {
1647
+ this.errorDataCount += 1;
1648
+ }
1649
+ /** @type {?} */
1650
+ var settledCount = this.noDataCount + this.successDataCount + this.errorDataCount;
1651
+ /** @type {?} */
1652
+ var totalCount = this.widgetData.strips.length;
1653
+ if (this.successDataCount > 0 && settledCount < totalCount) {
1654
+ return;
1655
+ }
1656
+ this.showParentLoader = settledCount !== totalCount;
1657
+ this.showParentNoData =
1658
+ this.noDataCount > 0 && this.noDataCount + this.errorDataCount === totalCount;
1659
+ this.showParentError = this.errorDataCount === totalCount;
1660
+ };
1661
+ /**
1662
+ * @param {?} strip
1663
+ * @return {?}
1664
+ */
1665
+ ContentStripWithTabsPillsComponent.prototype.checkForEmptyWidget = /**
1666
+ * @param {?} strip
1667
+ * @return {?}
1668
+ */
1669
+ function (strip) {
1670
+ if (strip.request &&
1671
+ ((strip.request.api && Object.keys(strip.request.api).length) ||
1672
+ (strip.request.search && Object.keys(strip.request.search).length) ||
1673
+ (strip.request.searchRegionRecommendation &&
1674
+ Object.keys(strip.request.searchRegionRecommendation).length) ||
1675
+ (strip.request.searchV6 && Object.keys(strip.request.searchV6).length) ||
1676
+ (strip.request.enrollmentList && Object.keys(strip.request.enrollmentList).length) ||
1677
+ (strip.request.cbpList && Object.keys(strip.request.cbpList).length) ||
1678
+ (strip.request.trendingSearch && Object.keys(strip.request.trendingSearch).length) ||
1679
+ (strip.request.topContent && Object.keys(strip.request.topContent).length) ||
1680
+ (strip.request.featureContent && Object.keys(strip.request.featureContent).length) ||
1681
+ (strip.request.bookmarkRead && Object.keys(strip.request.bookmarkRead).length) ||
1682
+ (strip.request.playlistSearch && Object.keys(strip.request.playlistSearch).length) ||
1683
+ (strip.request.playlistRead && Object.keys(strip.request.playlistRead).length) ||
1684
+ (strip.request.ciosContent && Object.keys(strip.request.ciosContent).length) ||
1685
+ (strip && strip.tabs.length))) {
1686
+ return true;
1687
+ }
1688
+ return false;
1689
+ };
1690
+ // public tabClicked(tabEvent: MatTabChangeEvent, stripMap: IStripUnitContentData, stripKey: string) {
1691
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1692
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'inprogress';
1693
+ // stripMap.tabs[tabEvent.index].tabLoading = true;
1694
+ // stripMap.showOnLoader = true;
1695
+ // }
1696
+ // const data: WsEvents.ITelemetryTabData = {
1697
+ // label: `${tabEvent.tab.textLabel}`,
1698
+ // index: tabEvent.index,
1699
+ // };
1700
+ // this.eventSvc.raiseInteractTelemetry(
1701
+ // {
1702
+ // type: WsEvents.EnumInteractTypes.CLICK,
1703
+ // subType: WsEvents.EnumInteractSubTypes.HOME_PAGE_STRIP_TABS,
1704
+ // id: `${_.camelCase(data.label)}-tab`,
1705
+ // },
1706
+ // {},
1707
+ // {
1708
+ // module: WsEvents.EnumTelemetrymodules.HOME,
1709
+ // }
1710
+ // );
1711
+ // const currentTabFromMap: any = stripMap.tabs && stripMap.tabs[tabEvent.index];
1712
+ // const currentStrip = this.widgetData.strips.find(s => s.key === stripKey);
1713
+ // if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
1714
+ // this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = {
1715
+ // ...this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams,
1716
+ // tabSelected: currentTabFromMap.label,
1717
+ // };
1718
+ // }
1719
+ // if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick) {
1720
+ // if (currentTabFromMap.requestRequired && currentTabFromMap.request) {
1721
+ // // call API to get tab data and process
1722
+ // // this.processStrip(currentStrip, [], 'fetching', true, null)
1723
+ // if (currentTabFromMap.request.searchV6) {
1724
+ // this.getTabDataByNewReqSearchV6(currentStrip, tabEvent.index, currentTabFromMap, true);
1725
+ // } else if (currentTabFromMap.request.trendingSearch) {
1726
+ // this.getTabDataByNewReqTrending(currentStrip, tabEvent.index, 0, currentTabFromMap, true);
1727
+ // }
1728
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1729
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
1730
+ // }
1731
+ // } else {
1732
+ // this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
1733
+ // setTimeout(() => {
1734
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1735
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
1736
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'done';
1737
+ // stripMap.showOnLoader = false;
1738
+ // }
1739
+ // }, 200);
1740
+ // }
1741
+ // }
1742
+ // }
1743
+ // async getTabDataByNewReqSearchV6(
1744
+ // strip: NsContentStripWithTabs.IContentStripUnit,
1745
+ // tabIndex: number,
1746
+ // currentTab: NsContentStripWithTabs.IContentStripTab,
1747
+ // calculateParentStatus: boolean
1748
+ // ) {
1749
+ // try {
1750
+ // const response = await this.searchV6Request(strip, currentTab.request, calculateParentStatus);
1751
+ // if (response && response.results) {
1752
+ // const widgets = this.transformContentsToWidgets(response.results.result.content, strip);
1753
+ // let tabResults: any[] = [];
1754
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1755
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
1756
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
1757
+ // allTabs[tabIndex] = {
1758
+ // ...allTabs[tabIndex],
1759
+ // widgets,
1760
+ // fetchTabStatus: 'done',
1761
+ // };
1762
+ // tabResults = allTabs;
1763
+ // }
1764
+ // }
1765
+ // this.processStrip(
1766
+ // strip,
1767
+ // widgets,
1768
+ // 'done',
1769
+ // calculateParentStatus,
1770
+ // response.viewMoreUrl,
1771
+ // tabResults // tabResults as widgets
1772
+ // );
1773
+ // } else {
1774
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1775
+ // }
1776
+ // } catch (error) {
1777
+ // // Handle errors
1778
+ // // console.error('Error:', error);
1779
+ // }
1780
+ // }
1781
+ // async getTabDataByNewReqTrending(
1782
+ // strip: NsContentStripWithTabs.IContentStripUnit,
1783
+ // tabIndex: number,
1784
+ // currentTab: NsContentStripWithTabs.IContentStripTab,
1785
+ // calculateParentStatus: boolean
1786
+ // ) {
1787
+ // try {
1788
+ // const response = await this.trendingSearchRequest(strip, currentTab.request, calculateParentStatus);
1789
+ // if (response && response.results && response.results.response) {
1790
+ // const content = response.results.response[currentTab.value] || [];
1791
+ // const widgets = this.transformContentsToWidgets(content, strip);
1792
+ // // console.log('currentTab --- widgets', widgets)
1793
+ // let tabResults: any[] = [];
1794
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1795
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
1796
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
1797
+ // allTabs[tabIndex] = {
1798
+ // ...allTabs[tabIndex],
1799
+ // widgets,
1800
+ // fetchTabStatus: 'done',
1801
+ // };
1802
+ // tabResults = allTabs;
1803
+ // }
1804
+ // }
1805
+ // // console.log('tabResults -++++***--', tabResults)
1806
+ // // console.log('calling after-- ')
1807
+ // this.processStrip(
1808
+ // strip,
1809
+ // widgets,
1810
+ // 'done',
1811
+ // calculateParentStatus,
1812
+ // response.viewMoreUrl,
1813
+ // tabResults // tabResults as widgets
1814
+ // );
1815
+ // } else {
1816
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null);
1817
+ // }
1818
+ // } catch (error) {
1819
+ // // Handle errors
1820
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1821
+ // }
1822
+ // }
1823
+ // public tabClicked(tabEvent: MatTabChangeEvent, stripMap: IStripUnitContentData, stripKey: string) {
1824
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1825
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'inprogress';
1826
+ // stripMap.tabs[tabEvent.index].tabLoading = true;
1827
+ // stripMap.showOnLoader = true;
1828
+ // }
1829
+ // const data: WsEvents.ITelemetryTabData = {
1830
+ // label: `${tabEvent.tab.textLabel}`,
1831
+ // index: tabEvent.index,
1832
+ // };
1833
+ // this.eventSvc.raiseInteractTelemetry(
1834
+ // {
1835
+ // type: WsEvents.EnumInteractTypes.CLICK,
1836
+ // subType: WsEvents.EnumInteractSubTypes.HOME_PAGE_STRIP_TABS,
1837
+ // id: `${_.camelCase(data.label)}-tab`,
1838
+ // },
1839
+ // {},
1840
+ // {
1841
+ // module: WsEvents.EnumTelemetrymodules.HOME,
1842
+ // }
1843
+ // );
1844
+ // const currentTabFromMap: any = stripMap.tabs && stripMap.tabs[tabEvent.index];
1845
+ // const currentStrip = this.widgetData.strips.find(s => s.key === stripKey);
1846
+ // if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
1847
+ // this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = {
1848
+ // ...this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams,
1849
+ // tabSelected: currentTabFromMap.label,
1850
+ // };
1851
+ // }
1852
+ // if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick) {
1853
+ // if (currentTabFromMap.requestRequired && currentTabFromMap.request) {
1854
+ // // call API to get tab data and process
1855
+ // // this.processStrip(currentStrip, [], 'fetching', true, null)
1856
+ // if (currentTabFromMap.request.searchV6) {
1857
+ // this.getTabDataByNewReqSearchV6(currentStrip, tabEvent.index, currentTabFromMap, true);
1858
+ // } else if (currentTabFromMap.request.trendingSearch) {
1859
+ // this.getTabDataByNewReqTrending(currentStrip, tabEvent.index, 0, currentTabFromMap, true);
1860
+ // }
1861
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1862
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
1863
+ // }
1864
+ // } else {
1865
+ // this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
1866
+ // setTimeout(() => {
1867
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1868
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
1869
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'done';
1870
+ // stripMap.showOnLoader = false;
1871
+ // }
1872
+ // }, 200);
1873
+ // }
1874
+ // }
1875
+ // }
1876
+ // async getTabDataByNewReqSearchV6(
1877
+ // strip: NsContentStripWithTabs.IContentStripUnit,
1878
+ // tabIndex: number,
1879
+ // currentTab: NsContentStripWithTabs.IContentStripTab,
1880
+ // calculateParentStatus: boolean
1881
+ // ) {
1882
+ // try {
1883
+ // const response = await this.searchV6Request(strip, currentTab.request, calculateParentStatus);
1884
+ // if (response && response.results) {
1885
+ // const widgets = this.transformContentsToWidgets(response.results.result.content, strip);
1886
+ // let tabResults: any[] = [];
1887
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1888
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
1889
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
1890
+ // allTabs[tabIndex] = {
1891
+ // ...allTabs[tabIndex],
1892
+ // widgets,
1893
+ // fetchTabStatus: 'done',
1894
+ // };
1895
+ // tabResults = allTabs;
1896
+ // }
1897
+ // }
1898
+ // this.processStrip(
1899
+ // strip,
1900
+ // widgets,
1901
+ // 'done',
1902
+ // calculateParentStatus,
1903
+ // response.viewMoreUrl,
1904
+ // tabResults // tabResults as widgets
1905
+ // );
1906
+ // } else {
1907
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1908
+ // }
1909
+ // } catch (error) {
1910
+ // // Handle errors
1911
+ // // console.error('Error:', error);
1912
+ // }
1913
+ // }
1914
+ // async getTabDataByNewReqTrending(
1915
+ // strip: NsContentStripWithTabs.IContentStripUnit,
1916
+ // tabIndex: number,
1917
+ // currentTab: NsContentStripWithTabs.IContentStripTab,
1918
+ // calculateParentStatus: boolean
1919
+ // ) {
1920
+ // try {
1921
+ // const response = await this.trendingSearchRequest(strip, currentTab.request, calculateParentStatus);
1922
+ // if (response && response.results && response.results.response) {
1923
+ // const content = response.results.response[currentTab.value] || [];
1924
+ // const widgets = this.transformContentsToWidgets(content, strip);
1925
+ // // console.log('currentTab --- widgets', widgets)
1926
+ // let tabResults: any[] = [];
1927
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
1928
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
1929
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
1930
+ // allTabs[tabIndex] = {
1931
+ // ...allTabs[tabIndex],
1932
+ // widgets,
1933
+ // fetchTabStatus: 'done',
1934
+ // };
1935
+ // tabResults = allTabs;
1936
+ // }
1937
+ // }
1938
+ // // console.log('tabResults -++++***--', tabResults)
1939
+ // // console.log('calling after-- ')
1940
+ // this.processStrip(
1941
+ // strip,
1942
+ // widgets,
1943
+ // 'done',
1944
+ // calculateParentStatus,
1945
+ // response.viewMoreUrl,
1946
+ // tabResults // tabResults as widgets
1947
+ // );
1948
+ // } else {
1949
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null);
1950
+ // }
1951
+ // } catch (error) {
1952
+ // // Handle errors
1953
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
1954
+ // }
1955
+ // }
1956
+ /**
1957
+ * @param {?} strip
1958
+ * @param {?} currentTab
1959
+ * @param {?} calculateParentStatus
1960
+ * @return {?}
1961
+ */
1962
+ ContentStripWithTabsPillsComponent.prototype.getTabDataByfilter =
1963
+ // public tabClicked(tabEvent: MatTabChangeEvent, stripMap: IStripUnitContentData, stripKey: string) {
1964
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
1965
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'inprogress';
1966
+ // stripMap.tabs[tabEvent.index].tabLoading = true;
1967
+ // stripMap.showOnLoader = true;
1968
+ // }
1969
+ // const data: WsEvents.ITelemetryTabData = {
1970
+ // label: `${tabEvent.tab.textLabel}`,
1971
+ // index: tabEvent.index,
1972
+ // };
1973
+ // this.eventSvc.raiseInteractTelemetry(
1974
+ // {
1975
+ // type: WsEvents.EnumInteractTypes.CLICK,
1976
+ // subType: WsEvents.EnumInteractSubTypes.HOME_PAGE_STRIP_TABS,
1977
+ // id: `${_.camelCase(data.label)}-tab`,
1978
+ // },
1979
+ // {},
1980
+ // {
1981
+ // module: WsEvents.EnumTelemetrymodules.HOME,
1982
+ // }
1983
+ // );
1984
+ // const currentTabFromMap: any = stripMap.tabs && stripMap.tabs[tabEvent.index];
1985
+ // const currentStrip = this.widgetData.strips.find(s => s.key === stripKey);
1986
+ // if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
1987
+ // this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = {
1988
+ // ...this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams,
1989
+ // tabSelected: currentTabFromMap.label,
1990
+ // };
1991
+ // }
1992
+ // if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick) {
1993
+ // if (currentTabFromMap.requestRequired && currentTabFromMap.request) {
1994
+ // // call API to get tab data and process
1995
+ // // this.processStrip(currentStrip, [], 'fetching', true, null)
1996
+ // if (currentTabFromMap.request.searchV6) {
1997
+ // this.getTabDataByNewReqSearchV6(currentStrip, tabEvent.index, currentTabFromMap, true);
1998
+ // } else if (currentTabFromMap.request.trendingSearch) {
1999
+ // this.getTabDataByNewReqTrending(currentStrip, tabEvent.index, 0, currentTabFromMap, true);
2000
+ // }
2001
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
2002
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
2003
+ // }
2004
+ // } else {
2005
+ // this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
2006
+ // setTimeout(() => {
2007
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
2008
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
2009
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'done';
2010
+ // stripMap.showOnLoader = false;
2011
+ // }
2012
+ // }, 200);
2013
+ // }
2014
+ // }
2015
+ // }
2016
+ // async getTabDataByNewReqSearchV6(
2017
+ // strip: NsContentStripWithTabs.IContentStripUnit,
2018
+ // tabIndex: number,
2019
+ // currentTab: NsContentStripWithTabs.IContentStripTab,
2020
+ // calculateParentStatus: boolean
2021
+ // ) {
2022
+ // try {
2023
+ // const response = await this.searchV6Request(strip, currentTab.request, calculateParentStatus);
2024
+ // if (response && response.results) {
2025
+ // const widgets = this.transformContentsToWidgets(response.results.result.content, strip);
2026
+ // let tabResults: any[] = [];
2027
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
2028
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
2029
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
2030
+ // allTabs[tabIndex] = {
2031
+ // ...allTabs[tabIndex],
2032
+ // widgets,
2033
+ // fetchTabStatus: 'done',
2034
+ // };
2035
+ // tabResults = allTabs;
2036
+ // }
2037
+ // }
2038
+ // this.processStrip(
2039
+ // strip,
2040
+ // widgets,
2041
+ // 'done',
2042
+ // calculateParentStatus,
2043
+ // response.viewMoreUrl,
2044
+ // tabResults // tabResults as widgets
2045
+ // );
2046
+ // } else {
2047
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
2048
+ // }
2049
+ // } catch (error) {
2050
+ // // Handle errors
2051
+ // // console.error('Error:', error);
2052
+ // }
2053
+ // }
2054
+ // async getTabDataByNewReqTrending(
2055
+ // strip: NsContentStripWithTabs.IContentStripUnit,
2056
+ // tabIndex: number,
2057
+ // currentTab: NsContentStripWithTabs.IContentStripTab,
2058
+ // calculateParentStatus: boolean
2059
+ // ) {
2060
+ // try {
2061
+ // const response = await this.trendingSearchRequest(strip, currentTab.request, calculateParentStatus);
2062
+ // if (response && response.results && response.results.response) {
2063
+ // const content = response.results.response[currentTab.value] || [];
2064
+ // const widgets = this.transformContentsToWidgets(content, strip);
2065
+ // // console.log('currentTab --- widgets', widgets)
2066
+ // let tabResults: any[] = [];
2067
+ // if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
2068
+ // const allTabs = this.stripsResultDataMap[strip.key].tabs;
2069
+ // if (allTabs && allTabs.length && allTabs[tabIndex]) {
2070
+ // allTabs[tabIndex] = {
2071
+ // ...allTabs[tabIndex],
2072
+ // widgets,
2073
+ // fetchTabStatus: 'done',
2074
+ // };
2075
+ // tabResults = allTabs;
2076
+ // }
2077
+ // }
2078
+ // // console.log('tabResults -++++***--', tabResults)
2079
+ // // console.log('calling after-- ')
2080
+ // this.processStrip(
2081
+ // strip,
2082
+ // widgets,
2083
+ // 'done',
2084
+ // calculateParentStatus,
2085
+ // response.viewMoreUrl,
2086
+ // tabResults // tabResults as widgets
2087
+ // );
2088
+ // } else {
2089
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null);
2090
+ // }
2091
+ // } catch (error) {
2092
+ // // Handle errors
2093
+ // this.processStrip(strip, [], 'error', calculateParentStatus, null);
2094
+ // }
2095
+ // }
2096
+ /**
2097
+ * @param {?} strip
2098
+ * @param {?} currentTab
2099
+ * @param {?} calculateParentStatus
2100
+ * @return {?}
2101
+ */
2102
+ function (strip, currentTab, calculateParentStatus) {
2103
+ // tslint:disable:no-console
2104
+ console.log('strip -- ', strip);
2105
+ // tslint:disable:no-console
2106
+ console.log('currentTab -- ', currentTab);
2107
+ // tslint:disable:no-console
2108
+ console.log('calculateParentStatus-- ', calculateParentStatus);
2109
+ // TODO: Write logic for individual filter if passed in config
2110
+ // add switch case based on config key passed
2111
+ };
2112
+ // async fetchAllCbpPlans(strip: any, calculateParentStatus = true) {
2113
+ // if (strip.request && strip.request.cbpList && Object.keys(strip.request.cbpList).length) {
2114
+ // let courses: NsContent.IContent[];
2115
+ // let tabResults: any[] = [];
2116
+ // const response = await this.userSvc.fetchCbpPlanList().toPromise();
2117
+ // if (response) {
2118
+ // courses = response;
2119
+ // if (strip.tabs && strip.tabs.length) {
2120
+ // tabResults = this.splitCbpTabsData(courses, strip);
2121
+ // await this.processStrip(
2122
+ // strip,
2123
+ // this.transformContentsToWidgets(courses, strip),
2124
+ // 'done',
2125
+ // calculateParentStatus,
2126
+ // '',
2127
+ // tabResults
2128
+ // );
2129
+ // } else {
2130
+ // this.processStrip(
2131
+ // strip,
2132
+ // this.transformContentsToWidgets(courses, strip),
2133
+ // 'done',
2134
+ // calculateParentStatus,
2135
+ // 'viewMoreUrl',
2136
+ // );
2137
+ // }
2138
+ // }
2139
+ // // this.userSvc.fetchCbpPlanList().subscribe( async (res: any) => {
2140
+ // // if (res) {
2141
+ // // console.log(res,'===============================>')
2142
+ // // courses = res
2143
+ // // if (strip.tabs && strip.tabs.length) {
2144
+ // // tabResults = this.splitCbpTabsData(courses, strip)
2145
+ // // await this.processStrip(
2146
+ // // strip,
2147
+ // // this.transformContentsToWidgets(courses, strip),
2148
+ // // 'done',
2149
+ // // calculateParentStatus,
2150
+ // // '',
2151
+ // // tabResults
2152
+ // // )
2153
+ // // } else {
2154
+ // // this.processStrip(
2155
+ // // strip,
2156
+ // // this.transformContentsToWidgets(courses, strip),
2157
+ // // 'done',
2158
+ // // calculateParentStatus,
2159
+ // // 'viewMoreUrl',
2160
+ // // )
2161
+ // // }
2162
+ // // }
2163
+ // // }, (_err: any) => {
2164
+ // // })
2165
+ // clearInterval(this.enrollInterval);
2166
+ // }
2167
+ // }
2168
+ // splitCbpTabsData(contentNew: NsContent.IContent[], strip: NsContentStripWithTabs.IContentStripUnit) {
2169
+ // const tabResults: any[] = [];
2170
+ // const splitData = this.getTabsList(
2171
+ // contentNew,
2172
+ // strip,
2173
+ // );
2174
+ // if (strip.tabs && strip.tabs.length) {
2175
+ // for (let i = 0; i < strip.tabs.length; i += 1) {
2176
+ // if (strip.tabs[i]) {
2177
+ // tabResults.push(
2178
+ // {
2179
+ // ...strip.tabs[i],
2180
+ // fetchTabStatus: 'done',
2181
+ // ...(splitData.find(itmInner => {
2182
+ // if (strip.tabs && strip.tabs[i] && itmInner.value === strip.tabs[i].value) {
2183
+ // return itmInner;
2184
+ // }
2185
+ // return undefined;
2186
+ // })),
2187
+ // }
2188
+ // );
2189
+ // }
2190
+ // }
2191
+ // }
2192
+ // return tabResults;
2193
+ // }
2194
+ // getTabsList(array: NsContent.IContent[],
2195
+ // strip: NsContentStripWithTabs.IContentStripUnit) {
2196
+ // let all: any[] = [];
2197
+ // let upcoming: any[] = [];
2198
+ // let overdue: any[] = [];
2199
+ // array.forEach((e: any) => {
2200
+ // all.push(e);
2201
+ // if (e.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2202
+ // overdue.push(e);
2203
+ // } else if (e.planDuration === NsCardContent.ACBPConst.UPCOMING) {
2204
+ // upcoming.push(e);
2205
+ // }
2206
+ // });
2207
+ // const allCompleted = all.filter((allData: any) => allData.contentStatus === 2);
2208
+ // let allInCompleted = all.filter((allData: any) => allData.contentStatus < 2);
2209
+ // let allCompletedOverDue = allCompleted.filter((allData: any) => allData.planDuration === NsCardContent.ACBPConst.OVERDUE);
2210
+ // const allCompletedAll = allCompleted.filter((allData: any) => allData.planDuration !== NsCardContent.ACBPConst.OVERDUE);
2211
+ // allCompletedOverDue = allCompletedOverDue.sort((a: any, b: any): any => {
2212
+ // if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2213
+ // const firstDate: any = new Date(a.endDate);
2214
+ // const secondDate: any = new Date(b.endDate);
2215
+ // return firstDate > secondDate ? -1 : 1;
2216
+ // }
2217
+ // });
2218
+ // allInCompleted = allInCompleted.sort((a: any, b: any): any => {
2219
+ // if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2220
+ // const firstDate: any = new Date(a.endDate);
2221
+ // const secondDate: any = new Date(b.endDate);
2222
+ // return firstDate > secondDate ? -1 : 1;
2223
+ // }
2224
+ // });
2225
+ // all = [...allInCompleted, ...allCompletedAll, ...allCompletedOverDue];
2226
+ // overdue = overdue.filter((data: any): any => {
2227
+ // return data.contentStatus < 2;
2228
+ // });
2229
+ // overdue = overdue.sort((a: any, b: any): any => {
2230
+ // const firstDate: any = new Date(a.endDate);
2231
+ // const secondDate: any = new Date(b.endDate);
2232
+ // return firstDate > secondDate ? -1 : 1;
2233
+ // });
2234
+ // upcoming = upcoming.filter((data: any): any => {
2235
+ // return data.contentStatus < 2;
2236
+ // });
2237
+ // // this.getSelectedIndex(1)
2238
+ // return [
2239
+ // { value: 'all', widgets: this.transformContentsToWidgets(all, strip) },
2240
+ // { value: 'upcoming', widgets: this.transformContentsToWidgets(upcoming, strip) },
2241
+ // { value: 'overdue', widgets: this.transformContentsToWidgets(overdue, strip) }];
2242
+ // }
2243
+ // async fetchAllCbpPlans(strip: any, calculateParentStatus = true) {
2244
+ // if (strip.request && strip.request.cbpList && Object.keys(strip.request.cbpList).length) {
2245
+ // let courses: NsContent.IContent[];
2246
+ // let tabResults: any[] = [];
2247
+ // const response = await this.userSvc.fetchCbpPlanList().toPromise();
2248
+ // if (response) {
2249
+ // courses = response;
2250
+ // if (strip.tabs && strip.tabs.length) {
2251
+ // tabResults = this.splitCbpTabsData(courses, strip);
2252
+ // await this.processStrip(
2253
+ // strip,
2254
+ // this.transformContentsToWidgets(courses, strip),
2255
+ // 'done',
2256
+ // calculateParentStatus,
2257
+ // '',
2258
+ // tabResults
2259
+ // );
2260
+ // } else {
2261
+ // this.processStrip(
2262
+ // strip,
2263
+ // this.transformContentsToWidgets(courses, strip),
2264
+ // 'done',
2265
+ // calculateParentStatus,
2266
+ // 'viewMoreUrl',
2267
+ // );
2268
+ // }
2269
+ // }
2270
+ // // this.userSvc.fetchCbpPlanList().subscribe( async (res: any) => {
2271
+ // // if (res) {
2272
+ // // console.log(res,'===============================>')
2273
+ // // courses = res
2274
+ // // if (strip.tabs && strip.tabs.length) {
2275
+ // // tabResults = this.splitCbpTabsData(courses, strip)
2276
+ // // await this.processStrip(
2277
+ // // strip,
2278
+ // // this.transformContentsToWidgets(courses, strip),
2279
+ // // 'done',
2280
+ // // calculateParentStatus,
2281
+ // // '',
2282
+ // // tabResults
2283
+ // // )
2284
+ // // } else {
2285
+ // // this.processStrip(
2286
+ // // strip,
2287
+ // // this.transformContentsToWidgets(courses, strip),
2288
+ // // 'done',
2289
+ // // calculateParentStatus,
2290
+ // // 'viewMoreUrl',
2291
+ // // )
2292
+ // // }
2293
+ // // }
2294
+ // // }, (_err: any) => {
2295
+ // // })
2296
+ // clearInterval(this.enrollInterval);
2297
+ // }
2298
+ // }
2299
+ // splitCbpTabsData(contentNew: NsContent.IContent[], strip: NsContentStripWithTabs.IContentStripUnit) {
2300
+ // const tabResults: any[] = [];
2301
+ // const splitData = this.getTabsList(
2302
+ // contentNew,
2303
+ // strip,
2304
+ // );
2305
+ // if (strip.tabs && strip.tabs.length) {
2306
+ // for (let i = 0; i < strip.tabs.length; i += 1) {
2307
+ // if (strip.tabs[i]) {
2308
+ // tabResults.push(
2309
+ // {
2310
+ // ...strip.tabs[i],
2311
+ // fetchTabStatus: 'done',
2312
+ // ...(splitData.find(itmInner => {
2313
+ // if (strip.tabs && strip.tabs[i] && itmInner.value === strip.tabs[i].value) {
2314
+ // return itmInner;
2315
+ // }
2316
+ // return undefined;
2317
+ // })),
2318
+ // }
2319
+ // );
2320
+ // }
2321
+ // }
2322
+ // }
2323
+ // return tabResults;
2324
+ // }
2325
+ // getTabsList(array: NsContent.IContent[],
2326
+ // strip: NsContentStripWithTabs.IContentStripUnit) {
2327
+ // let all: any[] = [];
2328
+ // let upcoming: any[] = [];
2329
+ // let overdue: any[] = [];
2330
+ // array.forEach((e: any) => {
2331
+ // all.push(e);
2332
+ // if (e.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2333
+ // overdue.push(e);
2334
+ // } else if (e.planDuration === NsCardContent.ACBPConst.UPCOMING) {
2335
+ // upcoming.push(e);
2336
+ // }
2337
+ // });
2338
+ // const allCompleted = all.filter((allData: any) => allData.contentStatus === 2);
2339
+ // let allInCompleted = all.filter((allData: any) => allData.contentStatus < 2);
2340
+ // let allCompletedOverDue = allCompleted.filter((allData: any) => allData.planDuration === NsCardContent.ACBPConst.OVERDUE);
2341
+ // const allCompletedAll = allCompleted.filter((allData: any) => allData.planDuration !== NsCardContent.ACBPConst.OVERDUE);
2342
+ // allCompletedOverDue = allCompletedOverDue.sort((a: any, b: any): any => {
2343
+ // if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2344
+ // const firstDate: any = new Date(a.endDate);
2345
+ // const secondDate: any = new Date(b.endDate);
2346
+ // return firstDate > secondDate ? -1 : 1;
2347
+ // }
2348
+ // });
2349
+ // allInCompleted = allInCompleted.sort((a: any, b: any): any => {
2350
+ // if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2351
+ // const firstDate: any = new Date(a.endDate);
2352
+ // const secondDate: any = new Date(b.endDate);
2353
+ // return firstDate > secondDate ? -1 : 1;
2354
+ // }
2355
+ // });
2356
+ // all = [...allInCompleted, ...allCompletedAll, ...allCompletedOverDue];
2357
+ // overdue = overdue.filter((data: any): any => {
2358
+ // return data.contentStatus < 2;
2359
+ // });
2360
+ // overdue = overdue.sort((a: any, b: any): any => {
2361
+ // const firstDate: any = new Date(a.endDate);
2362
+ // const secondDate: any = new Date(b.endDate);
2363
+ // return firstDate > secondDate ? -1 : 1;
2364
+ // });
2365
+ // upcoming = upcoming.filter((data: any): any => {
2366
+ // return data.contentStatus < 2;
2367
+ // });
2368
+ // // this.getSelectedIndex(1)
2369
+ // return [
2370
+ // { value: 'all', widgets: this.transformContentsToWidgets(all, strip) },
2371
+ // { value: 'upcoming', widgets: this.transformContentsToWidgets(upcoming, strip) },
2372
+ // { value: 'overdue', widgets: this.transformContentsToWidgets(overdue, strip) }];
2373
+ // }
2374
+ /**
2375
+ * @param {?} stripsResultDataMap
2376
+ * @param {?} key
2377
+ * @return {?}
2378
+ */
2379
+ ContentStripWithTabsPillsComponent.prototype.getSelectedIndex =
2380
+ // async fetchAllCbpPlans(strip: any, calculateParentStatus = true) {
2381
+ // if (strip.request && strip.request.cbpList && Object.keys(strip.request.cbpList).length) {
2382
+ // let courses: NsContent.IContent[];
2383
+ // let tabResults: any[] = [];
2384
+ // const response = await this.userSvc.fetchCbpPlanList().toPromise();
2385
+ // if (response) {
2386
+ // courses = response;
2387
+ // if (strip.tabs && strip.tabs.length) {
2388
+ // tabResults = this.splitCbpTabsData(courses, strip);
2389
+ // await this.processStrip(
2390
+ // strip,
2391
+ // this.transformContentsToWidgets(courses, strip),
2392
+ // 'done',
2393
+ // calculateParentStatus,
2394
+ // '',
2395
+ // tabResults
2396
+ // );
2397
+ // } else {
2398
+ // this.processStrip(
2399
+ // strip,
2400
+ // this.transformContentsToWidgets(courses, strip),
2401
+ // 'done',
2402
+ // calculateParentStatus,
2403
+ // 'viewMoreUrl',
2404
+ // );
2405
+ // }
2406
+ // }
2407
+ // // this.userSvc.fetchCbpPlanList().subscribe( async (res: any) => {
2408
+ // // if (res) {
2409
+ // // console.log(res,'===============================>')
2410
+ // // courses = res
2411
+ // // if (strip.tabs && strip.tabs.length) {
2412
+ // // tabResults = this.splitCbpTabsData(courses, strip)
2413
+ // // await this.processStrip(
2414
+ // // strip,
2415
+ // // this.transformContentsToWidgets(courses, strip),
2416
+ // // 'done',
2417
+ // // calculateParentStatus,
2418
+ // // '',
2419
+ // // tabResults
2420
+ // // )
2421
+ // // } else {
2422
+ // // this.processStrip(
2423
+ // // strip,
2424
+ // // this.transformContentsToWidgets(courses, strip),
2425
+ // // 'done',
2426
+ // // calculateParentStatus,
2427
+ // // 'viewMoreUrl',
2428
+ // // )
2429
+ // // }
2430
+ // // }
2431
+ // // }, (_err: any) => {
2432
+ // // })
2433
+ // clearInterval(this.enrollInterval);
2434
+ // }
2435
+ // }
2436
+ // splitCbpTabsData(contentNew: NsContent.IContent[], strip: NsContentStripWithTabs.IContentStripUnit) {
2437
+ // const tabResults: any[] = [];
2438
+ // const splitData = this.getTabsList(
2439
+ // contentNew,
2440
+ // strip,
2441
+ // );
2442
+ // if (strip.tabs && strip.tabs.length) {
2443
+ // for (let i = 0; i < strip.tabs.length; i += 1) {
2444
+ // if (strip.tabs[i]) {
2445
+ // tabResults.push(
2446
+ // {
2447
+ // ...strip.tabs[i],
2448
+ // fetchTabStatus: 'done',
2449
+ // ...(splitData.find(itmInner => {
2450
+ // if (strip.tabs && strip.tabs[i] && itmInner.value === strip.tabs[i].value) {
2451
+ // return itmInner;
2452
+ // }
2453
+ // return undefined;
2454
+ // })),
2455
+ // }
2456
+ // );
2457
+ // }
2458
+ // }
2459
+ // }
2460
+ // return tabResults;
2461
+ // }
2462
+ // getTabsList(array: NsContent.IContent[],
2463
+ // strip: NsContentStripWithTabs.IContentStripUnit) {
2464
+ // let all: any[] = [];
2465
+ // let upcoming: any[] = [];
2466
+ // let overdue: any[] = [];
2467
+ // array.forEach((e: any) => {
2468
+ // all.push(e);
2469
+ // if (e.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2470
+ // overdue.push(e);
2471
+ // } else if (e.planDuration === NsCardContent.ACBPConst.UPCOMING) {
2472
+ // upcoming.push(e);
2473
+ // }
2474
+ // });
2475
+ // const allCompleted = all.filter((allData: any) => allData.contentStatus === 2);
2476
+ // let allInCompleted = all.filter((allData: any) => allData.contentStatus < 2);
2477
+ // let allCompletedOverDue = allCompleted.filter((allData: any) => allData.planDuration === NsCardContent.ACBPConst.OVERDUE);
2478
+ // const allCompletedAll = allCompleted.filter((allData: any) => allData.planDuration !== NsCardContent.ACBPConst.OVERDUE);
2479
+ // allCompletedOverDue = allCompletedOverDue.sort((a: any, b: any): any => {
2480
+ // if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2481
+ // const firstDate: any = new Date(a.endDate);
2482
+ // const secondDate: any = new Date(b.endDate);
2483
+ // return firstDate > secondDate ? -1 : 1;
2484
+ // }
2485
+ // });
2486
+ // allInCompleted = allInCompleted.sort((a: any, b: any): any => {
2487
+ // if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
2488
+ // const firstDate: any = new Date(a.endDate);
2489
+ // const secondDate: any = new Date(b.endDate);
2490
+ // return firstDate > secondDate ? -1 : 1;
2491
+ // }
2492
+ // });
2493
+ // all = [...allInCompleted, ...allCompletedAll, ...allCompletedOverDue];
2494
+ // overdue = overdue.filter((data: any): any => {
2495
+ // return data.contentStatus < 2;
2496
+ // });
2497
+ // overdue = overdue.sort((a: any, b: any): any => {
2498
+ // const firstDate: any = new Date(a.endDate);
2499
+ // const secondDate: any = new Date(b.endDate);
2500
+ // return firstDate > secondDate ? -1 : 1;
2501
+ // });
2502
+ // upcoming = upcoming.filter((data: any): any => {
2503
+ // return data.contentStatus < 2;
2504
+ // });
2505
+ // // this.getSelectedIndex(1)
2506
+ // return [
2507
+ // { value: 'all', widgets: this.transformContentsToWidgets(all, strip) },
2508
+ // { value: 'upcoming', widgets: this.transformContentsToWidgets(upcoming, strip) },
2509
+ // { value: 'overdue', widgets: this.transformContentsToWidgets(overdue, strip) }];
2510
+ // }
2511
+ /**
2512
+ * @param {?} stripsResultDataMap
2513
+ * @param {?} key
2514
+ * @return {?}
2515
+ */
2516
+ function (stripsResultDataMap, key) {
2517
+ /** @type {?} */
2518
+ var returnValue = 0;
2519
+ // if (key === 'cbpPlan') {
2520
+ // if (stripsResultDataMap.tabs.length) {
2521
+ // const data = stripsResultDataMap.tabs.filter((ele: any) => ele.value === 'upcoming');
2522
+ // returnValue = data[0].widgets && data[0].widgets.length > 0 ? 1 : 0;
2523
+ // }
2524
+ // }
2525
+ return returnValue;
2526
+ };
2527
+ /**
2528
+ * @param {?} label
2529
+ * @param {?} type
2530
+ * @return {?}
2531
+ */
2532
+ ContentStripWithTabsPillsComponent.prototype.translateLabels = /**
2533
+ * @param {?} label
2534
+ * @param {?} type
2535
+ * @return {?}
2536
+ */
2537
+ function (label, type) {
2538
+ return this.langtranslations.translateLabel(label, type, '');
2539
+ };
2540
+ /**
2541
+ * @param {?} index
2542
+ * @param {?} item
2543
+ * @return {?}
2544
+ */
2545
+ ContentStripWithTabsPillsComponent.prototype.identify = /**
2546
+ * @param {?} index
2547
+ * @param {?} item
2548
+ * @return {?}
2549
+ */
2550
+ function (index, item) {
2551
+ if (index >= 0) { }
2552
+ return item;
2553
+ };
2554
+ /**
2555
+ * @param {?} index
2556
+ * @param {?} item
2557
+ * @return {?}
2558
+ */
2559
+ ContentStripWithTabsPillsComponent.prototype.tracker = /**
2560
+ * @param {?} index
2561
+ * @param {?} item
2562
+ * @return {?}
2563
+ */
2564
+ function (index, item) {
2565
+ if (index >= 0) { }
2566
+ return _.get(item, 'widgetData.content.identifier');
2567
+ };
2568
+ /**
2569
+ * @param {?} strip
2570
+ * @param {?=} calculateParentStatus
2571
+ * @return {?}
2572
+ */
2573
+ ContentStripWithTabsPillsComponent.prototype.fetchAllTopContent = /**
2574
+ * @param {?} strip
2575
+ * @param {?=} calculateParentStatus
2576
+ * @return {?}
2577
+ */
2578
+ function (strip, calculateParentStatus) {
2579
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
2580
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2581
+ var originalFilters, response, error_2;
2582
+ return tslib_1.__generator(this, function (_a) {
2583
+ switch (_a.label) {
2584
+ case 0:
2585
+ if (!(strip.request && strip.request.topContent && Object.keys(strip.request.topContent).length)) return [3 /*break*/, 4];
2586
+ originalFilters = [];
2587
+ if (strip.request &&
2588
+ strip.request.topContent &&
2589
+ strip.request.topContent.request &&
2590
+ strip.request.topContent.request.filters) {
2591
+ originalFilters = strip.request.topContent.request.filters;
2592
+ strip.request.topContent.request.filters = this.postMethodFilters(strip.request.topContent.request.filters);
2593
+ }
2594
+ _a.label = 1;
2595
+ case 1:
2596
+ _a.trys.push([1, 3, , 4]);
2597
+ return [4 /*yield*/, this.postRequestMethod(strip, strip.request.topContent, strip.request.apiUrl, calculateParentStatus)];
2598
+ case 2:
2599
+ response = _a.sent();
2600
+ // console.log('calling after - response, ', response)
2601
+ if (response && response.results) {
2602
+ // console.log('calling after-- ')
2603
+ if (response.results.result.content && response.results.result.content.length) {
2604
+ this.processStrip(strip, this.transformContentsToWidgets(response.results.result.content, strip), 'done', calculateParentStatus, response.viewMoreUrl);
2605
+ }
2606
+ else {
2607
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
2608
+ this.emptyResponse.emit(true);
2609
+ }
2610
+ }
2611
+ else {
2612
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
2613
+ this.emptyResponse.emit(true);
2614
+ }
2615
+ return [3 /*break*/, 4];
2616
+ case 3:
2617
+ error_2 = _a.sent();
2618
+ return [3 /*break*/, 4];
2619
+ case 4: return [2 /*return*/];
2620
+ }
2621
+ });
2622
+ });
2623
+ };
2624
+ /**
2625
+ * @param {?} strip
2626
+ * @param {?=} calculateParentStatus
2627
+ * @return {?}
2628
+ */
2629
+ ContentStripWithTabsPillsComponent.prototype.fetchAllFeaturedContent = /**
2630
+ * @param {?} strip
2631
+ * @param {?=} calculateParentStatus
2632
+ * @return {?}
2633
+ */
2634
+ function (strip, calculateParentStatus) {
2635
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
2636
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2637
+ var originalFilters, response, error_3;
2638
+ return tslib_1.__generator(this, function (_a) {
2639
+ switch (_a.label) {
2640
+ case 0:
2641
+ if (!(strip.request && strip.request.featureContent && Object.keys(strip.request.featureContent).length)) return [3 /*break*/, 4];
2642
+ originalFilters = [];
2643
+ if (strip.request &&
2644
+ strip.request.featureContent &&
2645
+ strip.request.featureContent.request &&
2646
+ strip.request.featureContent.request.filters) {
2647
+ originalFilters = strip.request.featureContent.request.filters;
2648
+ strip.request.featureContent.request.filters = this.postMethodFilters(strip.request.featureContent.request.filters);
2649
+ }
2650
+ _a.label = 1;
2651
+ case 1:
2652
+ _a.trys.push([1, 3, , 4]);
2653
+ return [4 /*yield*/, this.postRequestMethod(strip, strip.request.featureContent, strip.request.apiUrl, calculateParentStatus)];
2654
+ case 2:
2655
+ response = _a.sent();
2656
+ // console.log('calling after - response, ', response)
2657
+ if (response && response.results) {
2658
+ // console.log('calling after-- ')
2659
+ if (response.results.result.content && response.results.result.content.length) {
2660
+ this.processStrip(strip, this.transformContentsToWidgets(response.results.result.content, strip), 'done', calculateParentStatus, response.viewMoreUrl);
2661
+ }
2662
+ else {
2663
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
2664
+ this.emptyResponse.emit(true);
2665
+ }
2666
+ }
2667
+ else {
2668
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
2669
+ this.emptyResponse.emit(true);
2670
+ }
2671
+ return [3 /*break*/, 4];
2672
+ case 3:
2673
+ error_3 = _a.sent();
2674
+ this.emptyResponse.emit(true);
2675
+ return [3 /*break*/, 4];
2676
+ case 4: return [2 /*return*/];
2677
+ }
2678
+ });
2679
+ });
2680
+ };
2681
+ /**
2682
+ * @param {?} stripData
2683
+ * @return {?}
2684
+ */
2685
+ ContentStripWithTabsPillsComponent.prototype.raiseTelemetry = /**
2686
+ * @param {?} stripData
2687
+ * @return {?}
2688
+ */
2689
+ function (stripData) {
2690
+ this.telemtryResponse.emit(stripData);
2691
+ };
2692
+ /**
2693
+ * @param {?} strip
2694
+ * @param {?} request
2695
+ * @param {?} apiUrl
2696
+ * @param {?} calculateParentStatus
2697
+ * @return {?}
2698
+ */
2699
+ ContentStripWithTabsPillsComponent.prototype.postRequestMethod = /**
2700
+ * @param {?} strip
2701
+ * @param {?} request
2702
+ * @param {?} apiUrl
2703
+ * @param {?} calculateParentStatus
2704
+ * @return {?}
2705
+ */
2706
+ function (strip, request, apiUrl, calculateParentStatus) {
2707
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2708
+ var _this = this;
2709
+ return tslib_1.__generator(this, function (_a) {
2710
+ return [2 /*return*/, new Promise((/**
2711
+ * @param {?} resolve
2712
+ * @param {?} reject
2713
+ * @return {?}
2714
+ */
2715
+ function (resolve, reject) {
2716
+ if (request && request) {
2717
+ _this.contentSvc.postApiMethod(apiUrl, request).subscribe((/**
2718
+ * @param {?} results
2719
+ * @return {?}
2720
+ */
2721
+ function (results) {
2722
+ if (results.result && results.result.content) {
2723
+ /** @type {?} */
2724
+ var showViewMore = Boolean(results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
2725
+ /** @type {?} */
2726
+ var viewMoreUrl = showViewMore
2727
+ ? {
2728
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
2729
+ queryParams: {
2730
+ tab: 'Learn',
2731
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
2732
+ f: {},
2733
+ },
2734
+ }
2735
+ : null;
2736
+ resolve({ results: results, viewMoreUrl: viewMoreUrl });
2737
+ }
2738
+ else if (results && results.data) {
2739
+ /** @type {?} */
2740
+ var showViewMore = Boolean(results.data && results.data.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
2741
+ /** @type {?} */
2742
+ var viewMoreUrl = showViewMore ? {
2743
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
2744
+ queryParams: {
2745
+ tab: 'Learn',
2746
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
2747
+ f: {},
2748
+ },
2749
+ }
2750
+ : null;
2751
+ resolve({ results: results, viewMoreUrl: viewMoreUrl });
2752
+ }
2753
+ else if (results.result && results.result.data) {
2754
+ /** @type {?} */
2755
+ var showViewMore = Boolean(results.data && results.result.data && results.result.data.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
2756
+ /** @type {?} */
2757
+ var viewMoreUrl = showViewMore ? {
2758
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
2759
+ queryParams: {
2760
+ tab: 'Learn',
2761
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
2762
+ f: {},
2763
+ },
2764
+ }
2765
+ : null;
2766
+ resolve({ results: results, viewMoreUrl: viewMoreUrl });
2767
+ }
2768
+ }), (/**
2769
+ * @param {?} error
2770
+ * @return {?}
2771
+ */
2772
+ function (error) {
2773
+ _this.processStrip(strip, [], 'error', calculateParentStatus, null);
2774
+ reject(error);
2775
+ }));
2776
+ }
2777
+ }))];
2778
+ });
2779
+ });
2780
+ };
2781
+ /**
2782
+ * @param {?} strip
2783
+ * @param {?} request
2784
+ * @param {?} apiUrl
2785
+ * @param {?} calculateParentStatus
2786
+ * @return {?}
2787
+ */
2788
+ ContentStripWithTabsPillsComponent.prototype.getRequestMethod = /**
2789
+ * @param {?} strip
2790
+ * @param {?} request
2791
+ * @param {?} apiUrl
2792
+ * @param {?} calculateParentStatus
2793
+ * @return {?}
2794
+ */
2795
+ function (strip, request, apiUrl, calculateParentStatus) {
2796
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2797
+ var originalFilters;
2798
+ var _this = this;
2799
+ return tslib_1.__generator(this, function (_a) {
2800
+ originalFilters = [];
2801
+ return [2 /*return*/, new Promise((/**
2802
+ * @param {?} resolve
2803
+ * @param {?} reject
2804
+ * @return {?}
2805
+ */
2806
+ function (resolve, reject) {
2807
+ if (request && request) {
2808
+ _this.contentSvc.getApiMethod(apiUrl).subscribe((/**
2809
+ * @param {?} results
2810
+ * @return {?}
2811
+ */
2812
+ function (results) {
2813
+ /** @type {?} */
2814
+ var showViewMore = Boolean(results.result.data && results.result.data.orgList.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
2815
+ /** @type {?} */
2816
+ var viewMoreUrl = showViewMore
2817
+ ? {
2818
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
2819
+ }
2820
+ : null;
2821
+ resolve({ results: results, viewMoreUrl: viewMoreUrl });
2822
+ }), (/**
2823
+ * @param {?} error
2824
+ * @return {?}
2825
+ */
2826
+ function (error) {
2827
+ _this.processStrip(strip, [], 'error', calculateParentStatus, null);
2828
+ reject(error);
2829
+ }));
2830
+ }
2831
+ }))];
2832
+ });
2833
+ });
2834
+ };
2835
+ /**
2836
+ * @param {?} filters
2837
+ * @return {?}
2838
+ */
2839
+ ContentStripWithTabsPillsComponent.prototype.postMethodFilters = /**
2840
+ * @param {?} filters
2841
+ * @return {?}
2842
+ */
2843
+ function (filters) {
2844
+ if (filters.organisation &&
2845
+ filters.organisation.indexOf('<orgID>') >= 0) {
2846
+ filters.organisation = this.providerId;
2847
+ }
2848
+ return filters;
2849
+ };
2850
+ /**
2851
+ * @param {?} apiUrl
2852
+ * @param {?} id
2853
+ * @return {?}
2854
+ */
2855
+ ContentStripWithTabsPillsComponent.prototype.getFullUrl = /**
2856
+ * @param {?} apiUrl
2857
+ * @param {?} id
2858
+ * @return {?}
2859
+ */
2860
+ function (apiUrl, id) {
2861
+ /** @type {?} */
2862
+ var formedUrl = '';
2863
+ if (apiUrl.indexOf('<bookmarkId>') >= 0) {
2864
+ formedUrl = apiUrl.replace('<bookmarkId>', this.environment.mdoChannelsBookmarkId);
2865
+ }
2866
+ else if (apiUrl.indexOf('<playlistKey>') >= 0 && apiUrl.indexOf('<orgID>') >= 0) {
2867
+ formedUrl = apiUrl.replace('<playlistKey>', this.providerId + id);
2868
+ formedUrl = formedUrl.replace('<orgID>', this.providerId);
2869
+ }
2870
+ return formedUrl;
2871
+ };
2872
+ /**
2873
+ * @param {?} stripData
2874
+ * @param {?} path
2875
+ * @param {?} queryParamsData
2876
+ * @return {?}
2877
+ */
2878
+ ContentStripWithTabsPillsComponent.prototype.redirectViewAll = /**
2879
+ * @param {?} stripData
2880
+ * @param {?} path
2881
+ * @param {?} queryParamsData
2882
+ * @return {?}
2883
+ */
2884
+ function (stripData, path, queryParamsData) {
2885
+ if (this.emitViewAll) {
2886
+ this.viewAllResponse.emit(stripData);
2887
+ }
2888
+ else {
2889
+ this.router.navigate([path], { queryParams: queryParamsData });
2890
+ }
2891
+ };
2892
+ /**
2893
+ * @param {?} strip
2894
+ * @param {?=} calculateParentStatus
2895
+ * @return {?}
2896
+ */
2897
+ ContentStripWithTabsPillsComponent.prototype.fetchAllBookMarkData = /**
2898
+ * @param {?} strip
2899
+ * @param {?=} calculateParentStatus
2900
+ * @return {?}
2901
+ */
2902
+ function (strip, calculateParentStatus) {
2903
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
2904
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2905
+ var originalFilters, response, content, error_4;
2906
+ return tslib_1.__generator(this, function (_a) {
2907
+ switch (_a.label) {
2908
+ case 0:
2909
+ if (!(strip.request && strip.request.bookmarkRead && Object.keys(strip.request.bookmarkRead).length)) return [3 /*break*/, 4];
2910
+ originalFilters = [];
2911
+ if (strip.request &&
2912
+ strip.request.bookmarkRead &&
2913
+ strip.request.bookmarkRead.bookmarkId) {
2914
+ strip.request.apiUrl = this.getFullUrl(strip.request.apiUrl, strip.request.bookmarkRead.bookmarkId);
2915
+ }
2916
+ _a.label = 1;
2917
+ case 1:
2918
+ _a.trys.push([1, 3, , 4]);
2919
+ return [4 /*yield*/, this.getRequestMethod(strip, strip.request.bookmarkRead, strip.request.apiUrl, calculateParentStatus)];
2920
+ case 2:
2921
+ response = _a.sent();
2922
+ content = response.results.result.data.orgList;
2923
+ if (response) {
2924
+ this.processStrip(strip, this.transformAllContentsToWidgets(content, strip), 'done', calculateParentStatus, response);
2925
+ }
2926
+ else {
2927
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
2928
+ this.emptyResponse.emit(true);
2929
+ }
2930
+ return [3 /*break*/, 4];
2931
+ case 3:
2932
+ error_4 = _a.sent();
2933
+ this.emptyResponse.emit(true);
2934
+ return [3 /*break*/, 4];
2935
+ case 4: return [2 /*return*/];
2936
+ }
2937
+ });
2938
+ });
2939
+ };
2940
+ /**
2941
+ * @private
2942
+ * @param {?} contents
2943
+ * @param {?} strip
2944
+ * @return {?}
2945
+ */
2946
+ ContentStripWithTabsPillsComponent.prototype.transformAllContentsToWidgets = /**
2947
+ * @private
2948
+ * @param {?} contents
2949
+ * @param {?} strip
2950
+ * @return {?}
2951
+ */
2952
+ function (contents, strip) {
2953
+ return (contents || []).map((/**
2954
+ * @param {?} content
2955
+ * @param {?} idx
2956
+ * @return {?}
2957
+ */
2958
+ function (content, idx) { return (content ? {
2959
+ widgetType: 'cardLib',
2960
+ widgetSubType: 'cardContentLib',
2961
+ widgetHostClass: 'mb-2',
2962
+ widgetData: tslib_1.__assign({ content: content }, (content.batch && { batch: content.batch }), { cardSubType: strip.stripConfig && strip.stripConfig.cardSubType, cardCustomeClass: strip.customeClass ? strip.customeClass : '', context: { pageSection: strip.key, position: idx }, intranetMode: strip.stripConfig && strip.stripConfig.intranetMode, deletedMode: strip.stripConfig && strip.stripConfig.deletedMode, contentTags: strip.stripConfig && strip.stripConfig.contentTags }),
2963
+ } : {
2964
+ widgetType: 'card',
2965
+ widgetSubType: 'cardContent',
2966
+ widgetHostClass: 'mb-2',
2967
+ widgetData: {},
2968
+ }); }));
2969
+ };
2970
+ /**
2971
+ * @param {?} strip
2972
+ * @param {?=} calculateParentStatus
2973
+ * @return {?}
2974
+ */
2975
+ ContentStripWithTabsPillsComponent.prototype.fetchAllPlaylistSearch = /**
2976
+ * @param {?} strip
2977
+ * @param {?=} calculateParentStatus
2978
+ * @return {?}
2979
+ */
2980
+ function (strip, calculateParentStatus) {
2981
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
2982
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
2983
+ var originalFilters, response, finalPlaylistData_1, programData, error_5;
2984
+ return tslib_1.__generator(this, function (_a) {
2985
+ switch (_a.label) {
2986
+ case 0:
2987
+ if (!(strip.request && strip.request.playlistSearch && Object.keys(strip.request.playlistSearch).length)) return [3 /*break*/, 4];
2988
+ originalFilters = [];
2989
+ if (strip.request &&
2990
+ strip.request.playlistSearch &&
2991
+ strip.request.playlistSearch.request &&
2992
+ strip.request.playlistSearch.request.filters) {
2993
+ originalFilters = strip.request.playlistSearch.request.filters;
2994
+ strip.request.playlistSearch.request.filters = this.postMethodFilters(strip.request.playlistSearch.request.filters);
2995
+ }
2996
+ _a.label = 1;
2997
+ case 1:
2998
+ _a.trys.push([1, 3, , 4]);
2999
+ return [4 /*yield*/, this.postRequestMethod(strip, strip.request.playlistSearch.request, strip.request.apiUrl, calculateParentStatus)];
3000
+ case 2:
3001
+ response = _a.sent();
3002
+ // console.log('calling after - response, ', response)
3003
+ if (response && response.results) {
3004
+ // console.log('calling after-- ')
3005
+ if (response.results.result.data && response.results.result.data.length) {
3006
+ finalPlaylistData_1 = [];
3007
+ programData = response.results.result.data;
3008
+ programData.forEach((/**
3009
+ * @param {?} prgData
3010
+ * @return {?}
3011
+ */
3012
+ function (prgData) {
3013
+ if (prgData.children && prgData.children.length) {
3014
+ finalPlaylistData_1.push(prgData);
3015
+ }
3016
+ }));
3017
+ if (finalPlaylistData_1.length) {
3018
+ this.processStrip(strip, this.transformContentsToWidgets(finalPlaylistData_1, strip), 'done', calculateParentStatus, response.viewMoreUrl);
3019
+ }
3020
+ else {
3021
+ this.emptyResponse.emit(true);
3022
+ }
3023
+ }
3024
+ else {
3025
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3026
+ this.emptyResponse.emit(true);
3027
+ }
3028
+ }
3029
+ else {
3030
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3031
+ this.emptyResponse.emit(true);
3032
+ }
3033
+ return [3 /*break*/, 4];
3034
+ case 3:
3035
+ error_5 = _a.sent();
3036
+ this.emptyResponse.emit(true);
3037
+ return [3 /*break*/, 4];
3038
+ case 4: return [2 /*return*/];
3039
+ }
3040
+ });
3041
+ });
3042
+ };
3043
+ /**
3044
+ * @param {?} strip
3045
+ * @param {?=} calculateParentStatus
3046
+ * @return {?}
3047
+ */
3048
+ ContentStripWithTabsPillsComponent.prototype.fetchPlaylistReadData = /**
3049
+ * @param {?} strip
3050
+ * @param {?=} calculateParentStatus
3051
+ * @return {?}
3052
+ */
3053
+ function (strip, calculateParentStatus) {
3054
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
3055
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3056
+ var originalFilters, response, content, error_6;
3057
+ return tslib_1.__generator(this, function (_a) {
3058
+ switch (_a.label) {
3059
+ case 0:
3060
+ if (!(strip.request && strip.request.playlistRead && Object.keys(strip.request.playlistRead).length)) return [3 /*break*/, 4];
3061
+ originalFilters = [];
3062
+ if (strip.request &&
3063
+ strip.request.playlistRead &&
3064
+ strip.request.playlistRead.type) {
3065
+ strip.request.apiUrl = this.getFullUrl(strip.request.apiUrl, strip.request.playlistRead.type);
3066
+ }
3067
+ _a.label = 1;
3068
+ case 1:
3069
+ _a.trys.push([1, 3, , 4]);
3070
+ return [4 /*yield*/, this.getRequestMethod(strip, strip.request.playlistRead, strip.request.apiUrl, calculateParentStatus)];
3071
+ case 2:
3072
+ response = _a.sent();
3073
+ if (response && response.results.result.content) {
3074
+ content = response.results.result.content;
3075
+ this.processStrip(strip, this.transformAllContentsToWidgets(content, strip), 'done', calculateParentStatus, response);
3076
+ }
3077
+ else {
3078
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3079
+ this.emptyResponse.emit(true);
3080
+ }
3081
+ return [3 /*break*/, 4];
3082
+ case 3:
3083
+ error_6 = _a.sent();
3084
+ this.emptyResponse.emit(true);
3085
+ return [3 /*break*/, 4];
3086
+ case 4: return [2 /*return*/];
3087
+ }
3088
+ });
3089
+ });
3090
+ };
3091
+ /**
3092
+ * @param {?} strip
3093
+ * @param {?=} calculateParentStatus
3094
+ * @return {?}
3095
+ */
3096
+ ContentStripWithTabsPillsComponent.prototype.fetchCiosContentData = /**
3097
+ * @param {?} strip
3098
+ * @param {?=} calculateParentStatus
3099
+ * @return {?}
3100
+ */
3101
+ function (strip, calculateParentStatus) {
3102
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
3103
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3104
+ var originalFilters, response, extContentData, error_7;
3105
+ return tslib_1.__generator(this, function (_a) {
3106
+ switch (_a.label) {
3107
+ case 0:
3108
+ if (!(strip.request && strip.request.ciosContent && Object.keys(strip.request.ciosContent).length)) return [3 /*break*/, 4];
3109
+ originalFilters = [];
3110
+ if (strip.request &&
3111
+ strip.request.ciosContent &&
3112
+ strip.request.ciosContent.filterCriteriaMap) {
3113
+ originalFilters = strip.request.ciosContent.filterCriteriaMap;
3114
+ strip.request.ciosContent.filterCriteriaMap = this.postMethodFilters(strip.request.ciosContent.filterCriteriaMap);
3115
+ }
3116
+ _a.label = 1;
3117
+ case 1:
3118
+ _a.trys.push([1, 3, , 4]);
3119
+ return [4 /*yield*/, this.postRequestMethod(strip, strip.request.ciosContent, strip.request.apiUrl, calculateParentStatus)];
3120
+ case 2:
3121
+ response = _a.sent();
3122
+ // console.log('calling after - response, ', response)
3123
+ if (response && response.results) {
3124
+ // console.log('calling after-- ')
3125
+ if (response.results.data && response.results.data.length) {
3126
+ extContentData = response.results.data;
3127
+ if (extContentData.length) {
3128
+ this.processStrip(strip, this.transformContentsToWidgets(extContentData, strip), 'done', calculateParentStatus, response.viewMoreUrl);
3129
+ }
3130
+ else {
3131
+ this.emptyResponse.emit(true);
3132
+ }
3133
+ }
3134
+ else {
3135
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3136
+ this.emptyResponse.emit(true);
3137
+ }
3138
+ }
3139
+ else {
3140
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3141
+ this.emptyResponse.emit(true);
3142
+ }
3143
+ return [3 /*break*/, 4];
3144
+ case 3:
3145
+ error_7 = _a.sent();
3146
+ this.emptyResponse.emit(true);
3147
+ return [3 /*break*/, 4];
3148
+ case 4: return [2 /*return*/];
3149
+ }
3150
+ });
3151
+ });
3152
+ };
3153
+ // new code writting from here====new====
3154
+ // new code writting from here====new====
3155
+ /**
3156
+ * @param {?} strip
3157
+ * @param {?=} calculateParentStatus
3158
+ * @return {?}
3159
+ */
3160
+ ContentStripWithTabsPillsComponent.prototype.fetchForYouData =
3161
+ // new code writting from here====new====
3162
+ /**
3163
+ * @param {?} strip
3164
+ * @param {?=} calculateParentStatus
3165
+ * @return {?}
3166
+ */
3167
+ function (strip, calculateParentStatus) {
3168
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
3169
+ if (strip && strip.type === 'forYou') {
3170
+ if (strip.tabs && strip.tabs.length) {
3171
+ /** @type {?} */
3172
+ var firstTab = strip.tabs[0];
3173
+ /** @type {?} */
3174
+ var pillData = firstTab.pillsData[0];
3175
+ if (pillData.requestRequired) {
3176
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
3177
+ /** @type {?} */
3178
+ var allPills = this.stripsResultDataMap[strip.key].tabs[0].pillsData;
3179
+ /** @type {?} */
3180
+ var currenPillsFromMap = (/** @type {?} */ ((allPills && allPills.length && allPills[0])));
3181
+ this.getTabDataByNewReqTrending(strip, 0, 0, currenPillsFromMap, calculateParentStatus);
3182
+ if (this.stripsResultDataMap[strip.key] && currenPillsFromMap) {
3183
+ this.stripsResultDataMap[strip.key].viewMoreUrl.queryParams = tslib_1.__assign({}, this.stripsResultDataMap[strip.key].viewMoreUrl.queryParams, { key: strip.key, tabSelected: firstTab.value, pillSelected: pillData.value });
3184
+ }
3185
+ }
3186
+ }
3187
+ }
3188
+ }
3189
+ };
3190
+ /**
3191
+ * @param {?} strip
3192
+ * @param {?=} calculateParentStatus
3193
+ * @return {?}
3194
+ */
3195
+ ContentStripWithTabsPillsComponent.prototype.fetchFromSearchV6 = /**
3196
+ * @param {?} strip
3197
+ * @param {?=} calculateParentStatus
3198
+ * @return {?}
3199
+ */
3200
+ function (strip, calculateParentStatus) {
3201
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
3202
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3203
+ var originalFilters, firstTab, allTabs, currentTabFromMap, response_1, error_8;
3204
+ var _this = this;
3205
+ return tslib_1.__generator(this, function (_a) {
3206
+ switch (_a.label) {
3207
+ case 0:
3208
+ if (!(strip.request && strip.request.searchV6 && Object.keys(strip.request.searchV6).length)) return [3 /*break*/, 4];
3209
+ // if (!(strip.request.searchV6.locale && strip.request.searchV6.locale.length > 0)) {
3210
+ // if (this.configSvc.activeLocale) {
3211
+ // strip.request.searchV6.locale = [this.configSvc.activeLocale.locals[0]]
3212
+ // } else {
3213
+ // strip.request.searchV6.locale = ['en']
3214
+ // }
3215
+ // }
3216
+ originalFilters = [];
3217
+ // tslint:disable:no-console
3218
+ if (strip.request &&
3219
+ strip.request.searchV6 &&
3220
+ strip.request.searchV6.request &&
3221
+ strip.request.searchV6.request.filters) {
3222
+ originalFilters = strip.request.searchV6.request.filters;
3223
+ strip.request.searchV6.request.filters = this.checkForDateFilters(strip.request.searchV6.request.filters);
3224
+ strip.request.searchV6.request.filters = this.getFiltersFromArray(strip.request.searchV6.request.filters);
3225
+ }
3226
+ if (!(strip.tabs && strip.tabs.length)) return [3 /*break*/, 1];
3227
+ // TODO: Have to extract requestRequired to outer level of tabs config
3228
+ firstTab = strip.tabs[0];
3229
+ if (firstTab.requestRequired) {
3230
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
3231
+ allTabs = this.stripsResultDataMap[strip.key].tabs;
3232
+ currentTabFromMap = (/** @type {?} */ ((allTabs && allTabs.length && allTabs[0])));
3233
+ this.getTabDataByNewReqSearchV6(strip, 0, 0, currentTabFromMap, calculateParentStatus);
3234
+ }
3235
+ }
3236
+ return [3 /*break*/, 4];
3237
+ case 1:
3238
+ _a.trys.push([1, 3, , 4]);
3239
+ return [4 /*yield*/, this.searchV6Request(strip, strip.request, calculateParentStatus)];
3240
+ case 2:
3241
+ response_1 = _a.sent();
3242
+ // console.log('calling after - response, ', response)
3243
+ if (response_1 && response_1.results) {
3244
+ // console.log('calling after-- ')
3245
+ if (response_1.results.result.content) {
3246
+ if (strip.key === 'scheduledAssessment') {
3247
+ this.enrollInterval = setInterval((/**
3248
+ * @return {?}
3249
+ */
3250
+ function () {
3251
+ _this.checkInvitOnlyAssessments(response_1.results.result.content, strip, calculateParentStatus, response_1.viewMoreUrl);
3252
+ // tslint:disable-next-line
3253
+ }), 1000);
3254
+ }
3255
+ else {
3256
+ this.processStrip(strip, this.transformContentsToWidgets(response_1.results.result.content, strip), 'done', calculateParentStatus, response_1.viewMoreUrl);
3257
+ }
3258
+ }
3259
+ else if (response_1.results.result.Event) {
3260
+ this.processStrip(strip, this.transformEventsToWidgets(response_1.results.result.Event, strip), 'done', calculateParentStatus, response_1.viewMoreUrl);
3261
+ }
3262
+ else {
3263
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3264
+ }
3265
+ }
3266
+ else {
3267
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3268
+ }
3269
+ return [3 /*break*/, 4];
3270
+ case 3:
3271
+ error_8 = _a.sent();
3272
+ return [3 /*break*/, 4];
3273
+ case 4: return [2 /*return*/];
3274
+ }
3275
+ });
3276
+ });
3277
+ };
3278
+ /**
3279
+ * @param {?} strip
3280
+ * @param {?} tabIndex
3281
+ * @param {?} pillIndex
3282
+ * @param {?} currentTab
3283
+ * @param {?} calculateParentStatus
3284
+ * @return {?}
3285
+ */
3286
+ ContentStripWithTabsPillsComponent.prototype.getTabDataByNewReqTrending = /**
3287
+ * @param {?} strip
3288
+ * @param {?} tabIndex
3289
+ * @param {?} pillIndex
3290
+ * @param {?} currentTab
3291
+ * @param {?} calculateParentStatus
3292
+ * @return {?}
3293
+ */
3294
+ function (strip, tabIndex, pillIndex, currentTab, calculateParentStatus) {
3295
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3296
+ var response, tabResults, content, widgets, allTabs, allPills, allTabs, allPills, error_9;
3297
+ return tslib_1.__generator(this, function (_a) {
3298
+ switch (_a.label) {
3299
+ case 0:
3300
+ _a.trys.push([0, 2, , 3]);
3301
+ return [4 /*yield*/, this.trendingSearchRequest(strip, currentTab.request, calculateParentStatus)];
3302
+ case 1:
3303
+ response = _a.sent();
3304
+ tabResults = [];
3305
+ if (response && response.results && response.results.response) {
3306
+ content = response.results.response[currentTab.value] || [];
3307
+ widgets = this.transformContentsToWidgets(content, strip);
3308
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
3309
+ allTabs = this.stripsResultDataMap[strip.key].tabs;
3310
+ allPills = this.stripsResultDataMap[strip.key].tabs[tabIndex].pillsData;
3311
+ this.resetSelectedPill(allPills);
3312
+ if (allTabs && allTabs.length && allTabs[tabIndex]) {
3313
+ if (allPills && allPills.length && allPills[pillIndex]) {
3314
+ allPills[pillIndex] = tslib_1.__assign({}, allPills[pillIndex], { widgets: widgets, fetchTabStatus: 'done', selected: true });
3315
+ }
3316
+ allTabs[tabIndex] = tslib_1.__assign({}, allTabs[tabIndex], { widgets: widgets, fetchTabStatus: 'done' });
3317
+ tabResults = allTabs;
3318
+ }
3319
+ }
3320
+ this.processStrip(strip, widgets, 'done', calculateParentStatus, response.viewMoreUrl, tabResults // tabResults as widgets
3321
+ );
3322
+ }
3323
+ else {
3324
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
3325
+ allTabs = this.stripsResultDataMap[strip.key].tabs;
3326
+ allPills = this.stripsResultDataMap[strip.key].tabs[tabIndex].pillsData;
3327
+ this.resetSelectedPill(allPills);
3328
+ if (allTabs && allTabs.length && allTabs[tabIndex]) {
3329
+ if (allPills && allPills.length && allPills[pillIndex]) {
3330
+ allPills[pillIndex] = tslib_1.__assign({}, allPills[pillIndex], { widgets: [], fetchTabStatus: 'done', selected: true });
3331
+ }
3332
+ allTabs[tabIndex] = tslib_1.__assign({}, allTabs[tabIndex], { widgets: [], fetchTabStatus: 'done' });
3333
+ tabResults = allTabs;
3334
+ }
3335
+ }
3336
+ this.processStrip(strip, [], 'done', calculateParentStatus, null);
3337
+ }
3338
+ return [3 /*break*/, 3];
3339
+ case 2:
3340
+ error_9 = _a.sent();
3341
+ // Handle errors
3342
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3343
+ return [3 /*break*/, 3];
3344
+ case 3: return [2 /*return*/];
3345
+ }
3346
+ });
3347
+ });
3348
+ };
3349
+ /**
3350
+ * @param {?} strip
3351
+ * @param {?} tabIndex
3352
+ * @param {?} pillIndex
3353
+ * @param {?} currentTab
3354
+ * @param {?} calculateParentStatus
3355
+ * @return {?}
3356
+ */
3357
+ ContentStripWithTabsPillsComponent.prototype.getTabDataByNewReqSearchV6 = /**
3358
+ * @param {?} strip
3359
+ * @param {?} tabIndex
3360
+ * @param {?} pillIndex
3361
+ * @param {?} currentTab
3362
+ * @param {?} calculateParentStatus
3363
+ * @return {?}
3364
+ */
3365
+ function (strip, tabIndex, pillIndex, currentTab, calculateParentStatus) {
3366
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3367
+ var response, widgets, tabResults, allTabs, allPills, error_10;
3368
+ return tslib_1.__generator(this, function (_a) {
3369
+ switch (_a.label) {
3370
+ case 0:
3371
+ _a.trys.push([0, 2, , 3]);
3372
+ return [4 /*yield*/, this.searchV6Request(strip, currentTab.request, calculateParentStatus)];
3373
+ case 1:
3374
+ response = _a.sent();
3375
+ if (response && response.results) {
3376
+ widgets = this.transformContentsToWidgets(response.results.result.content, strip);
3377
+ tabResults = [];
3378
+ if (this.stripsResultDataMap[strip.key] && this.stripsResultDataMap[strip.key].tabs) {
3379
+ allTabs = this.stripsResultDataMap[strip.key].tabs;
3380
+ allPills = this.stripsResultDataMap[strip.key].tabs[tabIndex].pillsData;
3381
+ this.resetSelectedPill(allPills);
3382
+ if (allTabs && allTabs.length && allTabs[tabIndex]) {
3383
+ if (allPills && allPills.length && allPills[pillIndex]) {
3384
+ allPills[pillIndex] = tslib_1.__assign({}, allPills[pillIndex], { widgets: widgets, fetchTabStatus: 'done', selected: true });
3385
+ }
3386
+ allTabs[tabIndex] = tslib_1.__assign({}, allTabs[tabIndex], { widgets: widgets, fetchTabStatus: 'done' });
3387
+ tabResults = allTabs;
3388
+ }
3389
+ }
3390
+ this.processStrip(strip, widgets, 'done', calculateParentStatus, response.viewMoreUrl, tabResults // tabResults as widgets
3391
+ );
3392
+ }
3393
+ else {
3394
+ this.processStrip(strip, [], 'error', calculateParentStatus, null);
3395
+ }
3396
+ return [3 /*break*/, 3];
3397
+ case 2:
3398
+ error_10 = _a.sent();
3399
+ return [3 /*break*/, 3];
3400
+ case 3: return [2 /*return*/];
3401
+ }
3402
+ });
3403
+ });
3404
+ };
3405
+ /**
3406
+ * @param {?} strip
3407
+ * @param {?} request
3408
+ * @param {?} calculateParentStatus
3409
+ * @return {?}
3410
+ */
3411
+ ContentStripWithTabsPillsComponent.prototype.trendingSearchRequest = /**
3412
+ * @param {?} strip
3413
+ * @param {?} request
3414
+ * @param {?} calculateParentStatus
3415
+ * @return {?}
3416
+ */
3417
+ function (strip, request, calculateParentStatus) {
3418
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3419
+ var originalFilters;
3420
+ var _this = this;
3421
+ return tslib_1.__generator(this, function (_a) {
3422
+ originalFilters = [];
3423
+ return [2 /*return*/, new Promise((/**
3424
+ * @param {?} resolve
3425
+ * @param {?} reject
3426
+ * @return {?}
3427
+ */
3428
+ function (resolve, reject) {
3429
+ if (request && request.trendingSearch) {
3430
+ // check for the request if it has dynamic values]
3431
+ if (request.trendingSearch.request.filters.organisation &&
3432
+ request.trendingSearch.request.filters.organisation.indexOf('<orgID>') >= 0) {
3433
+ /** @type {?} */
3434
+ var userRootOrgId = void 0;
3435
+ if (_this.configSvc.userProfile) {
3436
+ userRootOrgId = _this.configSvc.userProfile.rootOrgId;
3437
+ }
3438
+ request.trendingSearch.request.filters.organisation = userRootOrgId;
3439
+ }
3440
+ _this.contentSvc.trendingContentSearch(request.trendingSearch).subscribe((/**
3441
+ * @param {?} results
3442
+ * @return {?}
3443
+ */
3444
+ function (results) {
3445
+ /** @type {?} */
3446
+ var showViewMore = Boolean(results.result &&
3447
+ strip.request &&
3448
+ results.result[strip.request.trendingSearch.responseKey] &&
3449
+ results.result[strip.request.trendingSearch.responseKey].length > 5 &&
3450
+ strip.stripConfig && strip.stripConfig.postCardForSearch);
3451
+ /** @type {?} */
3452
+ var viewMoreUrl = showViewMore
3453
+ ? {
3454
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
3455
+ queryParams: {
3456
+ tab: 'Learn',
3457
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
3458
+ f: request &&
3459
+ request.trendingSearch &&
3460
+ request.trendingSearch.request &&
3461
+ request.trendingSearch.request.filters
3462
+ ? JSON.stringify(_this.transformSearchV6FiltersV2(originalFilters))
3463
+ : {},
3464
+ },
3465
+ }
3466
+ : null;
3467
+ /** @type {?} */
3468
+ var proccesedResult = [];
3469
+ if (results && results.response && results.response.certifications) {
3470
+ results.response.certifications.map((/**
3471
+ * @param {?} result
3472
+ * @return {?}
3473
+ */
3474
+ function (result) {
3475
+ if (result.source === _this.channnelName) {
3476
+ proccesedResult.push(result);
3477
+ }
3478
+ }));
3479
+ results = { response: { certifications: proccesedResult } };
3480
+ }
3481
+ resolve({ results: results, viewMoreUrl: viewMoreUrl });
3482
+ }), (/**
3483
+ * @param {?} error
3484
+ * @return {?}
3485
+ */
3486
+ function (error) {
3487
+ if (error.error && error.error.status === 400) {
3488
+ _this.processStrip(strip, [], 'done', calculateParentStatus, null);
3489
+ }
3490
+ // this.processStrip(strip, [], 'done', calculateParentStatus, null)
3491
+ reject(error);
3492
+ }));
3493
+ }
3494
+ }))];
3495
+ });
3496
+ });
3497
+ };
3498
+ /**
3499
+ * @param {?} tabEvent
3500
+ * @param {?} pillIndex
3501
+ * @param {?} stripMap
3502
+ * @param {?} stripKey
3503
+ * @return {?}
3504
+ */
3505
+ ContentStripWithTabsPillsComponent.prototype.tabClicked = /**
3506
+ * @param {?} tabEvent
3507
+ * @param {?} pillIndex
3508
+ * @param {?} stripMap
3509
+ * @param {?} stripKey
3510
+ * @return {?}
3511
+ */
3512
+ function (tabEvent, pillIndex, stripMap, stripKey) {
3513
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
3514
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].fetchTabStatus = 'inprogress';
3515
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].tabLoading = true;
3516
+ stripMap.showOnLoader = true;
3517
+ }
3518
+ /** @type {?} */
3519
+ var data = {
3520
+ label: "" + tabEvent.tab.textLabel,
3521
+ index: tabEvent.index,
3522
+ };
3523
+ this.eventSvc.raiseInteractTelemetry({
3524
+ type: WsEvents.EnumInteractTypes.CLICK,
3525
+ subType: WsEvents.EnumInteractSubTypes.HOME_PAGE_STRIP_TABS,
3526
+ id: _.camelCase(data.label) + "-tab",
3527
+ }, {}, {
3528
+ module: WsEvents.EnumTelemetrymodules.HOME,
3529
+ });
3530
+ /** @type {?} */
3531
+ var currentTabFromMap = stripMap.tabs && stripMap.tabs[tabEvent.index];
3532
+ /** @type {?} */
3533
+ var currentPillFromMap = stripMap.tabs && stripMap.tabs[tabEvent.index].pillsData[pillIndex];
3534
+ /** @type {?} */
3535
+ var currentStrip = this.widgetData.strips.find((/**
3536
+ * @param {?} s
3537
+ * @return {?}
3538
+ */
3539
+ function (s) { return s.key === stripKey; }));
3540
+ if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
3541
+ this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = tslib_1.__assign({}, this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams, { tabSelected: currentTabFromMap.value, pillSelected: currentPillFromMap.value });
3542
+ }
3543
+ if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick && currentPillFromMap) {
3544
+ if (currentPillFromMap.requestRequired && currentPillFromMap.request) {
3545
+ // call API to get tab data and process
3546
+ // this.processStrip(currentStrip, [], 'fetching', true, null)
3547
+ if (currentPillFromMap.request.searchV6) {
3548
+ this.getTabDataByNewReqSearchV6(currentStrip, tabEvent.index, 0, currentPillFromMap, true);
3549
+ }
3550
+ else if (currentPillFromMap.request.trendingSearch) {
3551
+ this.getTabDataByNewReqTrending(currentStrip, tabEvent.index, 0, currentPillFromMap, true);
3552
+ }
3553
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
3554
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
3555
+ // }
3556
+ stripMap.tabs[tabEvent.index].pillsData[pillIndex].tabLoading = false;
3557
+ }
3558
+ else {
3559
+ // this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
3560
+ // setTimeout(() => {
3561
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
3562
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
3563
+ // stripMap.tabs[tabEvent.index].fetchTabStatus = 'done';
3564
+ // stripMap.showOnLoader = false;
3565
+ // }
3566
+ // }, 200);
3567
+ }
3568
+ }
3569
+ };
3570
+ /**
3571
+ * @param {?} event
3572
+ * @param {?} stripMap
3573
+ * @param {?} stripKey
3574
+ * @param {?} pillIndex
3575
+ * @param {?} tabIndex
3576
+ * @return {?}
3577
+ */
3578
+ ContentStripWithTabsPillsComponent.prototype.pillClicked = /**
3579
+ * @param {?} event
3580
+ * @param {?} stripMap
3581
+ * @param {?} stripKey
3582
+ * @param {?} pillIndex
3583
+ * @param {?} tabIndex
3584
+ * @return {?}
3585
+ */
3586
+ function (event, stripMap, stripKey, pillIndex, tabIndex) {
3587
+ var _this = this;
3588
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
3589
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'inprogress';
3590
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = true;
3591
+ stripMap.showOnLoader = true;
3592
+ }
3593
+ /** @type {?} */
3594
+ var currentTabFromMap = stripMap.tabs && stripMap.tabs[tabIndex];
3595
+ /** @type {?} */
3596
+ var currentPillFromMap = stripMap.tabs && stripMap.tabs[tabIndex].pillsData[pillIndex];
3597
+ /** @type {?} */
3598
+ var currentStrip = this.widgetData.strips.find((/**
3599
+ * @param {?} s
3600
+ * @return {?}
3601
+ */
3602
+ function (s) { return s.key === stripKey; }));
3603
+ if (this.stripsResultDataMap[stripKey] && currentTabFromMap) {
3604
+ this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams = tslib_1.__assign({}, this.stripsResultDataMap[stripKey].viewMoreUrl.queryParams, { tabSelected: currentTabFromMap.value, pillSelected: currentPillFromMap.value });
3605
+ }
3606
+ if (currentStrip && currentTabFromMap && !currentTabFromMap.computeDataOnClick && currentPillFromMap) {
3607
+ if (currentPillFromMap.requestRequired && currentPillFromMap.request) {
3608
+ // call API to get tab data and process
3609
+ // this.processStrip(currentStrip, [], 'fetching', true, null)
3610
+ if (currentPillFromMap.request.searchV6) {
3611
+ this.getTabDataByNewReqSearchV6(currentStrip, tabIndex, pillIndex, currentPillFromMap, true);
3612
+ }
3613
+ else if (currentPillFromMap.request.trendingSearch) {
3614
+ this.getTabDataByNewReqTrending(currentStrip, tabIndex, pillIndex, currentPillFromMap, true);
3615
+ }
3616
+ // if (stripMap && stripMap.tabs && stripMap.tabs[tabEvent.index]) {
3617
+ // stripMap.tabs[tabEvent.index].tabLoading = false;
3618
+ // }
3619
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
3620
+ }
3621
+ else {
3622
+ this.getTabDataByfilter(currentStrip, currentTabFromMap, true);
3623
+ setTimeout((/**
3624
+ * @return {?}
3625
+ */
3626
+ function () {
3627
+ if (stripMap && stripMap.tabs && stripMap.tabs[tabIndex]) {
3628
+ stripMap.tabs[tabIndex].pillsData[pillIndex].fetchTabStatus = 'inprogress';
3629
+ stripMap.tabs[tabIndex].pillsData[pillIndex].tabLoading = false;
3630
+ stripMap.showOnLoader = false;
3631
+ _this.resetSelectedPill(stripMap.tabs[tabIndex].pillsData);
3632
+ stripMap.tabs[tabIndex].pillsData[pillIndex]['selected'] = true;
3633
+ }
3634
+ }), 200);
3635
+ }
3636
+ }
3637
+ };
3638
+ /**
3639
+ * @param {?} strip
3640
+ * @param {?} request
3641
+ * @param {?} calculateParentStatus
3642
+ * @return {?}
3643
+ */
3644
+ ContentStripWithTabsPillsComponent.prototype.searchV6Request = /**
3645
+ * @param {?} strip
3646
+ * @param {?} request
3647
+ * @param {?} calculateParentStatus
3648
+ * @return {?}
3649
+ */
3650
+ function (strip, request, calculateParentStatus) {
3651
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3652
+ var originalFilters;
3653
+ var _this = this;
3654
+ return tslib_1.__generator(this, function (_a) {
3655
+ originalFilters = [];
3656
+ return [2 /*return*/, new Promise((/**
3657
+ * @param {?} resolve
3658
+ * @param {?} reject
3659
+ * @return {?}
3660
+ */
3661
+ function (resolve, reject) {
3662
+ if (request && request.searchV6) {
3663
+ _this.contentSvc.searchV6(request.searchV6).subscribe((/**
3664
+ * @param {?} results
3665
+ * @return {?}
3666
+ */
3667
+ function (results) {
3668
+ /** @type {?} */
3669
+ var showViewMore = Boolean(results.result.content && results.result.content.length > 5 && strip.stripConfig && strip.stripConfig.postCardForSearch);
3670
+ /** @type {?} */
3671
+ var viewMoreUrl = showViewMore
3672
+ ? {
3673
+ path: strip.viewMoreUrl && strip.viewMoreUrl.path || '',
3674
+ queryParams: {
3675
+ tab: 'Learn',
3676
+ q: strip.viewMoreUrl && strip.viewMoreUrl.queryParams,
3677
+ f: request &&
3678
+ request.searchV6 &&
3679
+ request.searchV6.request &&
3680
+ request.searchV6.request.filters
3681
+ ? JSON.stringify(_this.transformSearchV6FiltersV2(originalFilters))
3682
+ : {},
3683
+ },
3684
+ }
3685
+ : null;
3686
+ // if (viewMoreUrl && viewMoreUrl.queryParams) {
3687
+ // viewMoreUrl.queryParams = viewMoreUrl.queryParams
3688
+ // }
3689
+ resolve({ results: results, viewMoreUrl: viewMoreUrl });
3690
+ }), (/**
3691
+ * @param {?} error
3692
+ * @return {?}
3693
+ */
3694
+ function (error) {
3695
+ _this.processStrip(strip, [], 'error', calculateParentStatus, null);
3696
+ reject(error);
3697
+ }));
3698
+ }
3699
+ }))];
3700
+ });
3701
+ });
3702
+ };
3703
+ /**
3704
+ * @param {?} tabdata
3705
+ * @param {?} tabIndex
3706
+ * @return {?}
3707
+ */
3708
+ ContentStripWithTabsPillsComponent.prototype.getSelectedPillIndex = /**
3709
+ * @param {?} tabdata
3710
+ * @param {?} tabIndex
3711
+ * @return {?}
3712
+ */
3713
+ function (tabdata, tabIndex) {
3714
+ if (tabdata.pillsData && tabdata.pillsData.length) {
3715
+ // tabdata.pillsData.forEach((ele: any, index: any) => {
3716
+ // if(ele.selected) {
3717
+ // console.log(ele,'---------')
3718
+ // return index
3719
+ // }
3720
+ // // })
3721
+ // console.log(tabdata,'==========123')
3722
+ /** @type {?} */
3723
+ var index = tabdata.pillsData.findIndex((/**
3724
+ * @param {?} pill
3725
+ * @return {?}
3726
+ */
3727
+ function (pill) {
3728
+ // if(pill.selected){
3729
+ return pill.selected;
3730
+ // }
3731
+ }));
3732
+ return index;
3733
+ }
3734
+ return 0;
3735
+ };
3736
+ // cbp plans
3737
+ // cbp plans
3738
+ /**
3739
+ * @param {?} strip
3740
+ * @param {?=} calculateParentStatus
3741
+ * @return {?}
3742
+ */
3743
+ ContentStripWithTabsPillsComponent.prototype.fetchAllCbpPlans =
3744
+ // cbp plans
3745
+ /**
3746
+ * @param {?} strip
3747
+ * @param {?=} calculateParentStatus
3748
+ * @return {?}
3749
+ */
3750
+ function (strip, calculateParentStatus) {
3751
+ if (calculateParentStatus === void 0) { calculateParentStatus = true; }
3752
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
3753
+ var courses, tabResults, response;
3754
+ return tslib_1.__generator(this, function (_a) {
3755
+ switch (_a.label) {
3756
+ case 0:
3757
+ if (!(strip.request && strip.request.cbpList && Object.keys(strip.request.cbpList).length)) return [3 /*break*/, 5];
3758
+ courses = void 0;
3759
+ tabResults = [];
3760
+ return [4 /*yield*/, this.userSvc.fetchCbpPlanList().toPromise()];
3761
+ case 1:
3762
+ response = _a.sent();
3763
+ if (!response) return [3 /*break*/, 4];
3764
+ courses = response;
3765
+ if (!(strip.tabs && strip.tabs.length)) return [3 /*break*/, 3];
3766
+ tabResults = this.splitCbpTabsData(courses, strip);
3767
+ return [4 /*yield*/, this.processStrip(strip, this.transformContentsToWidgets(courses, strip), 'done', calculateParentStatus, '', tabResults)];
3768
+ case 2:
3769
+ _a.sent();
3770
+ return [3 /*break*/, 4];
3771
+ case 3:
3772
+ this.processStrip(strip, this.transformContentsToWidgets(courses, strip), 'done', calculateParentStatus, 'viewMoreUrl');
3773
+ _a.label = 4;
3774
+ case 4:
3775
+ // this.userSvc.fetchCbpPlanList().subscribe( async (res: any) => {
3776
+ // if (res) {
3777
+ // console.log(res,'===============================>')
3778
+ // courses = res
3779
+ // if (strip.tabs && strip.tabs.length) {
3780
+ // tabResults = this.splitCbpTabsData(courses, strip)
3781
+ // await this.processStrip(
3782
+ // strip,
3783
+ // this.transformContentsToWidgets(courses, strip),
3784
+ // 'done',
3785
+ // calculateParentStatus,
3786
+ // '',
3787
+ // tabResults
3788
+ // )
3789
+ // } else {
3790
+ // this.processStrip(
3791
+ // strip,
3792
+ // this.transformContentsToWidgets(courses, strip),
3793
+ // 'done',
3794
+ // calculateParentStatus,
3795
+ // 'viewMoreUrl',
3796
+ // )
3797
+ // }
3798
+ // }
3799
+ // }, (_err: any) => {
3800
+ // })
3801
+ clearInterval(this.enrollInterval);
3802
+ _a.label = 5;
3803
+ case 5: return [2 /*return*/];
3804
+ }
3805
+ });
3806
+ });
3807
+ };
3808
+ /**
3809
+ * @param {?} contentNew
3810
+ * @param {?} strip
3811
+ * @return {?}
3812
+ */
3813
+ ContentStripWithTabsPillsComponent.prototype.splitCbpTabsData = /**
3814
+ * @param {?} contentNew
3815
+ * @param {?} strip
3816
+ * @return {?}
3817
+ */
3818
+ function (contentNew, strip) {
3819
+ /** @type {?} */
3820
+ var tabResults = [];
3821
+ /** @type {?} */
3822
+ var splitData = this.getTabsList(contentNew, strip);
3823
+ if (strip.tabs && strip.tabs.length) {
3824
+ var _loop_2 = function (i) {
3825
+ if (strip.tabs[i].value === "myIgotPlans") {
3826
+ if (strip.tabs[i].pillsData && strip.tabs[i].pillsData.length) {
3827
+ var _loop_3 = function (j) {
3828
+ if (j === 0) {
3829
+ strip.tabs[i].pillsData[j].selected = true;
3830
+ }
3831
+ if (strip.tabs[i].pillsData[j]) {
3832
+ tabResults.push(tslib_1.__assign({}, strip.tabs[i].pillsData[j], { fetchTabStatus: 'done' }, (splitData.find((/**
3833
+ * @param {?} itmInner
3834
+ * @return {?}
3835
+ */
3836
+ function (itmInner) {
3837
+ if (strip.tabs[i].pillsData && strip.tabs[i].pillsData[j] && itmInner.value === strip.tabs[i].pillsData[j].value) {
3838
+ return itmInner;
3839
+ }
3840
+ return undefined;
3841
+ })))));
3842
+ }
3843
+ };
3844
+ for (var j = 0; j < strip.tabs[i].pillsData.length; j += 1) {
3845
+ _loop_3(j);
3846
+ }
3847
+ strip.tabs[i].pillsData = tabResults;
3848
+ }
3849
+ }
3850
+ };
3851
+ for (var i = 0; i < strip.tabs.length; i += 1) {
3852
+ _loop_2(i);
3853
+ }
3854
+ }
3855
+ return strip.tabs;
3856
+ };
3857
+ /**
3858
+ * @param {?} array
3859
+ * @param {?} strip
3860
+ * @return {?}
3861
+ */
3862
+ ContentStripWithTabsPillsComponent.prototype.getTabsList = /**
3863
+ * @param {?} array
3864
+ * @param {?} strip
3865
+ * @return {?}
3866
+ */
3867
+ function (array, strip) {
3868
+ /** @type {?} */
3869
+ var all = [];
3870
+ /** @type {?} */
3871
+ var upcoming = [];
3872
+ /** @type {?} */
3873
+ var overdue = [];
3874
+ array.forEach((/**
3875
+ * @param {?} e
3876
+ * @return {?}
3877
+ */
3878
+ function (e) {
3879
+ all.push(e);
3880
+ if (e.planDuration === NsCardContent.ACBPConst.OVERDUE) {
3881
+ overdue.push(e);
3882
+ }
3883
+ else if (e.planDuration === NsCardContent.ACBPConst.UPCOMING) {
3884
+ upcoming.push(e);
3885
+ }
3886
+ }));
3887
+ /** @type {?} */
3888
+ var allCompleted = all.filter((/**
3889
+ * @param {?} allData
3890
+ * @return {?}
3891
+ */
3892
+ function (allData) { return allData.contentStatus === 2; }));
3893
+ /** @type {?} */
3894
+ var allInCompleted = all.filter((/**
3895
+ * @param {?} allData
3896
+ * @return {?}
3897
+ */
3898
+ function (allData) { return allData.contentStatus < 2; }));
3899
+ /** @type {?} */
3900
+ var allCompletedOverDue = allCompleted.filter((/**
3901
+ * @param {?} allData
3902
+ * @return {?}
3903
+ */
3904
+ function (allData) { return allData.planDuration === NsCardContent.ACBPConst.OVERDUE; }));
3905
+ /** @type {?} */
3906
+ var allCompletedAll = allCompleted.filter((/**
3907
+ * @param {?} allData
3908
+ * @return {?}
3909
+ */
3910
+ function (allData) { return allData.planDuration !== NsCardContent.ACBPConst.OVERDUE; }));
3911
+ allCompletedOverDue = allCompletedOverDue.sort((/**
3912
+ * @param {?} a
3913
+ * @param {?} b
3914
+ * @return {?}
3915
+ */
3916
+ function (a, b) {
3917
+ if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
3918
+ /** @type {?} */
3919
+ var firstDate = new Date(a.endDate);
3920
+ /** @type {?} */
3921
+ var secondDate = new Date(b.endDate);
3922
+ return firstDate > secondDate ? -1 : 1;
3923
+ }
3924
+ }));
3925
+ allInCompleted = allInCompleted.sort((/**
3926
+ * @param {?} a
3927
+ * @param {?} b
3928
+ * @return {?}
3929
+ */
3930
+ function (a, b) {
3931
+ if (a.planDuration === NsCardContent.ACBPConst.OVERDUE && b.planDuration === NsCardContent.ACBPConst.OVERDUE) {
3932
+ /** @type {?} */
3933
+ var firstDate = new Date(a.endDate);
3934
+ /** @type {?} */
3935
+ var secondDate = new Date(b.endDate);
3936
+ return firstDate > secondDate ? -1 : 1;
3937
+ }
3938
+ }));
3939
+ all = tslib_1.__spread(allInCompleted, allCompletedAll, allCompletedOverDue);
3940
+ overdue = overdue.filter((/**
3941
+ * @param {?} data
3942
+ * @return {?}
3943
+ */
3944
+ function (data) {
3945
+ return data.contentStatus < 2;
3946
+ }));
3947
+ overdue = overdue.sort((/**
3948
+ * @param {?} a
3949
+ * @param {?} b
3950
+ * @return {?}
3951
+ */
3952
+ function (a, b) {
3953
+ /** @type {?} */
3954
+ var firstDate = new Date(a.endDate);
3955
+ /** @type {?} */
3956
+ var secondDate = new Date(b.endDate);
3957
+ return firstDate > secondDate ? -1 : 1;
3958
+ }));
3959
+ upcoming = upcoming.filter((/**
3960
+ * @param {?} data
3961
+ * @return {?}
3962
+ */
3963
+ function (data) {
3964
+ return data.contentStatus < 2;
3965
+ }));
3966
+ // this.getSelectedIndex(1)
3967
+ return [
3968
+ { value: 'all', widgets: this.transformContentsToWidgets(all, strip) },
3969
+ { value: 'upcoming', widgets: this.transformContentsToWidgets(upcoming, strip) },
3970
+ { value: 'completed', widgets: this.transformContentsToWidgets(allCompleted, strip) },
3971
+ { value: 'overdue', widgets: this.transformContentsToWidgets(overdue, strip) }
3972
+ ];
3973
+ };
3974
+ /**
3975
+ * @param {?} pillData
3976
+ * @return {?}
3977
+ */
3978
+ ContentStripWithTabsPillsComponent.prototype.resetSelectedPill = /**
3979
+ * @param {?} pillData
3980
+ * @return {?}
3981
+ */
3982
+ function (pillData) {
3983
+ if (pillData && pillData.length) {
3984
+ pillData.forEach((/**
3985
+ * @param {?} pill
3986
+ * @return {?}
3987
+ */
3988
+ function (pill) {
3989
+ pill['selected'] = false;
3990
+ }));
3991
+ }
3992
+ };
3993
+ ContentStripWithTabsPillsComponent.decorators = [
3994
+ { type: Component, args: [{
3995
+ selector: 'sb-uic-content-strip-with-tabs-pills',
3996
+ template: "<ng-container *ngIf=\"!contentAvailable; else otherTemplate\"></ng-container>\n<ng-template #otherTemplate>\n <!-- <div *ngIf=\"showParentLoader\" class=\"text-center my-2\">\n <mat-spinner class=\"inline-block\"></mat-spinner>\n </div> -->\n <ng-container *ngIf=\"showParentError\" [sbUiResolverWidget]=\"widgetData.errorWidget\"></ng-container>\n <ng-container *ngIf=\"showParentNoData\" [sbUiResolverWidget]=\"widgetData.noDataWidget\"></ng-container>\n <ng-container *ngFor=\"let key of stripsKeyOrder; let i = index; trackBy: identify\">\n <ng-container *ngIf=\"isStripShowing(stripsResultDataMap[key])\">\n <a name=\"{{stripsResultDataMap[key]?.stripTitle}}\" [class]=\"key\">\n <div *ngIf=\"stripsResultDataMap && (getLength(stripsResultDataMap[key]) ||\n stripsResultDataMap[key]?.showOnNoData ||\n stripsResultDataMap[key]?.showOnLoader ||\n stripsResultDataMap[key]?.showOnError)\n \" [ngClass]=\"\n !widgetData?.isChannelStrip ? 'xs:px-8 sx:px-10ss' : i > 0 ? 'mt-12' : ''\n \" [id]=\"key\" [ngClass]=\"!widgetData?.isChannelStrip ? margin-bottom-custom : margin-bottom-xs\">\n <div [ngClass]=\"{ pad: stripsResultDataMap[key]?.stripBackground }\"\n [ngStyle]=\"{ 'background-color': stripsResultDataMap[key]?.stripBackground }\">\n <div class=\"flex flex-col pl-4 pr-4 md:pr-0 md:pl-0 \" [ngClass]=\"\n !widgetData?.isChannelStrip\n ? ''\n : stripsResultDataMap[key]?.stripTitle\n ? 'mb-8'\n : ''\n \">\n <div class=\"flex flex-1 items-center\">\n <p class=\"mat-subheading-1 margin-remove inline-block \" *ngIf=\"stripsResultDataMap[key]?.stripTitle\">\n <span class=\"capitalize\" *ngIf=\"stripsResultDataMap[key]?.disableTranslate\">\n {{stripsResultDataMap[key]?.stripTitle}}\n </span>\n <span *ngIf=\"!stripsResultDataMap[key]?.disableTranslate\">\n {{ translateLabels(stripsResultDataMap[key]?.stripTitle, 'home') }}\n </span>\n </p>\n\n <button *ngIf=\"stripsResultDataMap[key]?.stripInfo?.icon\" type=\"button\" mat-icon-button\n (click)=\"toggleInfo(stripsResultDataMap[key])\" i18n-matTooltip matTooltip=\"info\"\n class=\"margin-left-xs\">\n <mat-icon>{{ stripsResultDataMap[key]?.stripInfo?.icon.icon }}</mat-icon>\n </button>\n <a *ngIf=\"stripsResultDataMap[key]?.stripTitleLink?.link\"\n [routerLink]=\"stripsResultDataMap[key]?.stripTitleLink?.link\"\n [queryParams]=\"stripsResultDataMap[key]?.stripTitleLink?.link?.queryParams\">\n <mat-icon class=\"ws-mat-primary-primary-text ws-mat-default-text\" [color]=\"'accent'\">{{\n stripsResultDataMap[key]?.stripTitleLink?.icon }}</mat-icon>\n </a>\n <span class=\"spacer\"></span>\n <!-- viewAll start-->\n <!-- <div *ngIf=\"checkCondition(widgetData , stripsResultDataMap[key])\"\n class=\"ml-4 pl-2 view-more ws-mat-default-text\">\n <a class=\"flex ws-mat-default-text items-center justify-center mat-body-1 cursor-pointer\" \n (click)=\"raiseTelemetry(stripsResultDataMap[key]);redirectViewAll(stripsResultDataMap[key], stripsResultDataMap[key]?.viewMoreUrl?.path, stripsResultDataMap[key]?.viewMoreUrl?.queryParams )\">\n <span i18n class=\"ws-mat-default-text\">{{translateLabels(widgetData.strips[0].viewMoreUrl.viewMoreText,'home') || 'See all'}}</span>\n <mat-icon class=\"ws-mat-default-text mat-icon notranslate material-icons mat-icon-no-color\" color=\"accent\">navigate_next</mat-icon>\n </a>\n </div> -->\n <!-- viewAll end-->\n </div>\n <button mat-icon-button (click)=\"setHiddenForStrip(key)\" *ngIf=\"stripsResultDataMap[key]?.canHideStrip\">\n <mat-icon>close</mat-icon>\n </button>\n <mat-icon class=\"cursor-pointer\" *ngIf=\"stripsResultDataMap[key]?.mode === 'accordion' && isMobile\"\n (click)=\"showAccordionData = !showAccordionData\">{{ showAccordionData ? 'expand_less' : 'expand_more' }}\n </mat-icon>\n </div>\n\n <div class=\"mb-4\" *ngIf=\"checkVisible(stripsResultDataMap[key])\">\n <ng-container [sbUiResolverWidget]=\"getdata(stripsResultDataMap[key])\">\n </ng-container>\n </div>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnNoData\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.noDataWidget\"></ng-container>\n <ng-container *ngIf=\"stripsResultDataMap[key]?.showOnError\"\n [sbUiResolverWidget]=\"stripsResultDataMap[key]?.errorWidget\"></ng-container>\n <!-- IF no errors then proceed to show tabs or non tabs strip -->\n <ng-container *ngIf=\"!stripsResultDataMap[key]?.showOnNoData && !stripsResultDataMap[key]?.showOnError\">\n <ng-container *ngIf=\"stripsResultDataMap[key].tabs && stripsResultDataMap[key].tabs.length\">\n <mat-tab-group animationDuration=\"0ms\" [selectedIndex]=\"getSelectedIndex(stripsResultDataMap[key], key)\"\n class=\"mat-tab-labels w-full strips-tabgroup\" dynamicHeight\n (selectedTabChange)=\"tabClicked($event, 0, stripsResultDataMap[key], key)\">\n <mat-tab label=\"{{tab?.label}}\" *ngFor=\"let tab of stripsResultDataMap[key].tabs; let last = last;let tabIndex = index\">\n <ng-template mat-tab-label>\n <span>{{ translateLabels(tab?.label, 'home') }} &nbsp;</span>\n <span *ngIf=\"tab?.showTabDataCount && tab?.widgets?.length\">({{tab?.widgets?.length}})</span>\n </ng-template>\n\n <div class=\"wfull\" *ngIf=\"tab?.pillsData && tab?.pillsData?.length\">\n <div class=\"flex justify-between\">\n <div>\n <ng-container >\n <mat-chip-list class=\"content-pill\" aria-label=\"Fish selection\">\n <ng-container *ngFor=\"let pill of tab?.pillsData;let p = index\">\n <mat-chip [selected]=\"pill?.selected\" (click)=\"pillClicked($event, stripsResultDataMap[key], key, p, tabIndex)\">\n <span class=\"pill-name\">{{pill?.label}}</span></mat-chip>\n </ng-container>\n </mat-chip-list>\n </ng-container>\n </div>\n <!-- viewAll start-->\n <!-- <div *ngIf=\"checkCondition(widgetData , stripsResultDataMap[key])\"\n class=\"ml-4 pl-2 view-more ws-mat-default-text\">\n <a class=\"flex ws-mat-default-text items-center justify-center mat-body-1 cursor-pointer\" \n (click)=\"raiseTelemetry(stripsResultDataMap[key]);redirectViewAll(stripsResultDataMap[key], stripsResultDataMap[key]?.viewMoreUrl?.path, stripsResultDataMap[key]?.viewMoreUrl?.queryParams )\">\n <span i18n class=\"ws-mat-default-text\">{{translateLabels(widgetData.strips[0].viewMoreUrl.viewMoreText,'home') || 'See all'}}</span>\n <mat-icon class=\"ws-mat-default-text mat-icon notranslate material-icons mat-icon-no-color\" color=\"accent\">navigate_next</mat-icon>\n </a>\n </div> -->\n <!-- viewAll end-->\n </div>\n <div *ngIf=\"stripsResultDataMap && stripsResultDataMap[key]?.showOnLoader ||\n !tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus\"\n class=\"text-center my-2\">\n <sb-uic-horizontal-scroller-v2 [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [id]=\"key+'-scroller'\"\n [loadStatus]=\"'fetching'\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of stripsResultDataMap[key]?.loaderWidgets; trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </div>\n <ng-container *ngIf=\"tab?.pillsData && tab?.pillsData.length && tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]\">\n <div *ngIf=\"((tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus && tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus === 'done') &&\n (!tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets || !tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets?.length))\">\n <ng-container *ngIf=\"tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.value === 'inprogress'; else msgTemp\">\n <div class=\"w-full flex flex-col items-center justify-center\">\n <img alt=\"\" class=\"mt-4 mb-4\" src=\"assets/icons/home/nodataDefault.svg\">\n <div class=\"mat-subheading-1 text-center info-content\">{{ 'contentstripmultiple.getReadyForLearningAdventure' | translate }} -\n <a class=\"click-here\" [routerLink]=\"'/page/learn'\">{{ 'contentstripmultiple.clickHere' | translate }}</a> {{ 'contentstripmultiple.toEnrollNextCourse' | translate }}</div>\n </div>\n </ng-container>\n <ng-template #msgTemp>\n <div class=\"w-full flex flex-col items-center justify-center\">\n <img alt=\"\" class=\"mt-4 mb-4\" src=\"assets/icons/home/nodataDefault.png\">\n <div class=\"mat-subheading-1 text-center\">{{ translateLabels(tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.nodataMsg, 'home') }}</div>\n </div>\n </ng-template>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.fetchTabStatus === 'done' || tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets?.length)\">\n <ng-container *ngIf=\"!tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.tabLoading\">\n <sb-uic-horizontal-scroller-v2 [id]=\"key+'-scroller'\" [sliderConfig]=\"stripsResultDataMap[key]?.sliderConfig\" [widgetsLength]=\"tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets?.length\"\n *ngIf=\"getContineuLearningLenth(stripsResultDataMap[key]) && showAccordion(key)\"\n [loadStatus]=\"'done'\" [defaultMaxWidgets]=\"tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets\" [stripConfig]=\"stripsResultDataMap[key]?.stripConfig\">\n <ng-container *ngFor=\"let widget of tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.widgets| slice:0:(tab?.pillsData[getSelectedPillIndex(tab ,tabIndex)]?.maxWidgets ||\n stripsResultDataMap[key]?.sliderConfig?.maxWidgets || defaultMaxWidgets); trackBy: tracker\">\n <ng-container [sbUiResolverWidget]=\"widget\"></ng-container>\n </ng-container>\n </sb-uic-horizontal-scroller-v2>\n </ng-container>\n </ng-container>\n </div>\n </mat-tab>\n </mat-tab-group>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </a>\n\n </ng-container>\n </ng-container>\n</ng-template>",
3997
+ styles: [".view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.view-more .icon{font-size:24px;width:24px;height:24px;border:1px solid;border-radius:50%;padding:8px;margin-bottom:8px}.margin-bottom-custom{margin-bottom:60px}.view-more:hover{background-color:#dcdfe5}::ng-deep.strips-tabgroup .mat-tab-header{border-bottom:2px solid rgba(0,0,0,.12)}::ng-deep.strips-tabgroup .mat-tab-body{padding:20px 0!important;box-sizing:border-box;overflow-y:initial!important}::ng-deep.strips-tabgroup .mat-tab-body-wrapper{overflow:inherit!important}::ng-deep.strips-tabgroup .mat-tab-label{border-bottom:0 solid rgba(0,0,0,.1);margin-right:0;opacity:1}::ng-deep.strips-tabgroup .mat-tab-label .mat-tab-label-content{text-transform:inherit;font:400 14px/20px Lato}::ng-deep.strips-tabgroup .mat-tab-label-active .mat-tab-label-content{font-weight:700!important}.click-here{color:#1b4ca1}.info-content{opacity:1;color:rgba(0,0,0,.87);font:700 14px/20px Lato-Bold;text-align:center}.active{background:#1b4ca1!important}.active .pill-name{color:#fff!important}::ng-deep .content-pill .mat-chip-selected{background-color:#1b4ca1!important}::ng-deep .content-pill .mat-chip-selected .pill-name{color:#fff!important}"]
3998
+ }] }
3999
+ ];
4000
+ /** @nocollapse */
4001
+ ContentStripWithTabsPillsComponent.ctorParameters = function () { return [
4002
+ { type: undefined, decorators: [{ type: Inject, args: ['environment',] }] },
4003
+ { type: WidgetContentService },
4004
+ { type: LoggerService },
4005
+ { type: EventService },
4006
+ { type: ConfigurationsService },
4007
+ { type: UtilityService },
4008
+ { type: Router },
4009
+ { type: WidgetUserService },
4010
+ { type: TranslateService },
4011
+ { type: MultilingualTranslationsService }
4012
+ ]; };
4013
+ ContentStripWithTabsPillsComponent.propDecorators = {
4014
+ widgetData: [{ type: Input }],
4015
+ emptyResponse: [{ type: Output }],
4016
+ viewAllResponse: [{ type: Output }],
4017
+ telemtryResponse: [{ type: Output }],
4018
+ providerId: [{ type: Input }],
4019
+ emitViewAll: [{ type: Input }],
4020
+ channnelName: [{ type: Input }],
4021
+ id: [{ type: HostBinding, args: ['id',] }]
4022
+ };
4023
+ return ContentStripWithTabsPillsComponent;
4024
+ }(WidgetBaseComponent));
4025
+ export { ContentStripWithTabsPillsComponent };
4026
+ if (false) {
4027
+ /** @type {?} */
4028
+ ContentStripWithTabsPillsComponent.prototype.widgetData;
4029
+ /** @type {?} */
4030
+ ContentStripWithTabsPillsComponent.prototype.emptyResponse;
4031
+ /** @type {?} */
4032
+ ContentStripWithTabsPillsComponent.prototype.viewAllResponse;
4033
+ /** @type {?} */
4034
+ ContentStripWithTabsPillsComponent.prototype.telemtryResponse;
4035
+ /** @type {?} */
4036
+ ContentStripWithTabsPillsComponent.prototype.providerId;
4037
+ /** @type {?} */
4038
+ ContentStripWithTabsPillsComponent.prototype.emitViewAll;
4039
+ /** @type {?} */
4040
+ ContentStripWithTabsPillsComponent.prototype.channnelName;
4041
+ /** @type {?} */
4042
+ ContentStripWithTabsPillsComponent.prototype.id;
4043
+ /** @type {?} */
4044
+ ContentStripWithTabsPillsComponent.prototype.stripsResultDataMap;
4045
+ /** @type {?} */
4046
+ ContentStripWithTabsPillsComponent.prototype.stripsKeyOrder;
4047
+ /** @type {?} */
4048
+ ContentStripWithTabsPillsComponent.prototype.showAccordionData;
4049
+ /** @type {?} */
4050
+ ContentStripWithTabsPillsComponent.prototype.showParentLoader;
4051
+ /** @type {?} */
4052
+ ContentStripWithTabsPillsComponent.prototype.showParentError;
4053
+ /** @type {?} */
4054
+ ContentStripWithTabsPillsComponent.prototype.showParentNoData;
4055
+ /** @type {?} */
4056
+ ContentStripWithTabsPillsComponent.prototype.errorDataCount;
4057
+ /** @type {?} */
4058
+ ContentStripWithTabsPillsComponent.prototype.noDataCount;
4059
+ /** @type {?} */
4060
+ ContentStripWithTabsPillsComponent.prototype.successDataCount;
4061
+ /** @type {?} */
4062
+ ContentStripWithTabsPillsComponent.prototype.contentAvailable;
4063
+ /** @type {?} */
4064
+ ContentStripWithTabsPillsComponent.prototype.baseUrl;
4065
+ /** @type {?} */
4066
+ ContentStripWithTabsPillsComponent.prototype.veifiedKarmayogi;
4067
+ /** @type {?} */
4068
+ ContentStripWithTabsPillsComponent.prototype.environment;
4069
+ /** @type {?} */
4070
+ ContentStripWithTabsPillsComponent.prototype.changeEventSubscription;
4071
+ /** @type {?} */
4072
+ ContentStripWithTabsPillsComponent.prototype.defaultMaxWidgets;
4073
+ /** @type {?} */
4074
+ ContentStripWithTabsPillsComponent.prototype.enrollInterval;
4075
+ /** @type {?} */
4076
+ ContentStripWithTabsPillsComponent.prototype.todaysEvents;
4077
+ /** @type {?} */
4078
+ ContentStripWithTabsPillsComponent.prototype.enrollmentMapData;
4079
+ /**
4080
+ * @type {?}
4081
+ * @private
4082
+ */
4083
+ ContentStripWithTabsPillsComponent.prototype.contentSvc;
4084
+ /**
4085
+ * @type {?}
4086
+ * @private
4087
+ */
4088
+ ContentStripWithTabsPillsComponent.prototype.loggerSvc;
4089
+ /**
4090
+ * @type {?}
4091
+ * @private
4092
+ */
4093
+ ContentStripWithTabsPillsComponent.prototype.eventSvc;
4094
+ /**
4095
+ * @type {?}
4096
+ * @private
4097
+ */
4098
+ ContentStripWithTabsPillsComponent.prototype.configSvc;
4099
+ /** @type {?} */
4100
+ ContentStripWithTabsPillsComponent.prototype.utilitySvc;
4101
+ /** @type {?} */
4102
+ ContentStripWithTabsPillsComponent.prototype.router;
4103
+ /**
4104
+ * @type {?}
4105
+ * @private
4106
+ */
4107
+ ContentStripWithTabsPillsComponent.prototype.userSvc;
4108
+ /**
4109
+ * @type {?}
4110
+ * @private
4111
+ */
4112
+ ContentStripWithTabsPillsComponent.prototype.translate;
4113
+ /**
4114
+ * @type {?}
4115
+ * @private
4116
+ */
4117
+ ContentStripWithTabsPillsComponent.prototype.langtranslations;
4118
+ }
4119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1zdHJpcC13aXRoLXRhYnMtcGlsbHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHN1bmJpcmQtY2IvY29uc3VtcHRpb24vIiwic291cmNlcyI6WyJsaWIvX2NvbW1vbi9zdHJpcHMvY29udGVudC1zdHJpcC13aXRoLXRhYnMtcGlsbHMvY29udGVudC1zdHJpcC13aXRoLXRhYnMtcGlsbHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQWEsV0FBVyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQy9HLE9BQU8sRUFBb0IsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7QUFHaEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFFakYsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDdkcsT0FBTyxFQUVMLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxRQUFRLEdBQ1QsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7OztBQUczRSxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUUzQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBRXpDLG9DQXNDQzs7O0lBckNDLG9DQUFZOztJQUNaLDZDQUFzQjs7SUFDdEIscUNBQWM7O0lBQ2QsMENBQW1COztJQUNuQixpREFBMEI7O0lB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O0lBQ25DLDhEQUF5RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgT25EZXN0cm95LCBIb3N0QmluZGluZywgSW5qZWN0LCBFdmVudEVtaXR0ZXIsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciwgV2lkZ2V0QmFzZUNvbXBvbmVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJztcbmltcG9ydCB7IE5zQ29udGVudFN0cmlwV2l0aFRhYnMgfSBmcm9tICcuL2NvbnRlbnQtc3RyaXAtd2l0aC10YWJzLXBpbGxzLm1vZGVsJztcbi8vIGltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCdcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vLi4vLi4vX21vZGVscy93aWRnZXQtY29udGVudC5tb2RlbCc7XG5pbXBvcnQgeyBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX3NlcnZpY2VzL211bHRpbGluZ3VhbC10cmFuc2xhdGlvbnMuc2VydmljZSc7XG5pbXBvcnQge1xuICBURmV0Y2hTdGF0dXMsXG4gIExvZ2dlclNlcnZpY2UsXG4gIEV2ZW50U2VydmljZSxcbiAgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICBVdGlsaXR5U2VydmljZSxcbiAgV3NFdmVudHMsXG59IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgV2lkZ2V0VXNlclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fc2VydmljZXMvd2lkZ2V0LXVzZXIuc2VydmljZSc7XG4vLyBpbXBvcnQgeyBlbnZpcm9ubWVudCB9IGZyb20gJ3NyYy9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQnXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgTWF0VGFiQ2hhbmdlRXZlbnQgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbCc7XG5pbXBvcnQgeyBOc0NhcmRDb250ZW50IH0gZnJvbSAnLi4vLi4vLi4vX21vZGVscy9jYXJkLWNvbnRlbnQtdjIubW9kZWwnO1xuaW1wb3J0IHsgSVRvZGF5RXZlbnRzIH0gZnJvbSAnLi4vLi4vLi4vX21vZGVscy9ldmVudCc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbnRlcmZhY2UgSVN0cmlwVW5pdENvbnRlbnREYXRhIHtcbiAga2V5OiBzdHJpbmc7XG4gIGNhbkhpZGVTdHJpcDogYm9vbGVhbjtcbiAgbW9kZT86IHN0cmluZztcbiAgc2hvd1N0cmlwOiBib29sZWFuO1xuICBkaXNhYmxlVHJhbnNsYXRlOiBib29sZWFuO1xuICB3aWRnZXRzPzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGFbXTtcbiAgc3RyaXBUaXRsZTogc3RyaW5nO1xuICBzdHJpcFRpdGxlTGluaz86IHtcbiAgICBsaW5rOiAge1xuICAgICAgcXVlcnlQYXJhbXM6IHN0cmluZ1xuICAgIH0sXG4gICAgaWNvbjogc3RyaW5nLFxuICAgIHF1ZXJ5UGFyYW1zOiBzdHJpbmdcbiAgfTtcbiAgc2xpZGVyQ29uZmlnPzoge1xuICAgIHNob3dOYXZzOiBib29sZWFuLFxuICAgIHNob3dEb3RzOiBib29sZWFuLFxuICAgIG1heFdpZGdldHM/OiBudW1iZXJcbiAgICBjZXJpZmljYXRlQ2FyZE1hcmdpbj86IGJvb2xlYW5cbiAgfTtcbiAgc3RyaXBDb25maWc6IGFueTtcbiAgdGFicz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYltdIHwgdW5kZWZpbmVkO1xuICBzdHJpcE5hbWU/OiBzdHJpbmc7XG4gIHN0cmlwTG9nbz86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHN0cmlwSW5mbz86IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSVN0cmlwSW5mbztcbiAgbm9EYXRhV2lkZ2V0PzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGE7XG4gIGVycm9yV2lkZ2V0PzogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aEFueURhdGE7XG4gIHNob3dPbk5vRGF0YTogYm9vbGVhbjtcbiAgc2hvd09uTG9hZGVyOiBib29sZWFuO1xuICBzaG93T25FcnJvcjogYm9vbGVhbjtcbiAgbG9hZGVyV2lkZ2V0cz86IGFueTtcbiAgc3RyaXBCYWNrZ3JvdW5kPzogc3RyaW5nO1xuICBzZWNvbmRhcnlIZWFkaW5nPzogYW55O1xuICB2aWV3TW9yZVVybDogYW55O1xuICByZXF1ZXN0PzogYW55XG4gIFxufVxuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NiLXVpYy1jb250ZW50LXN0cmlwLXdpdGgtdGFicy1waWxscycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250ZW50LXN0cmlwLXdpdGgtdGFicy1waWxscy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbnRlbnQtc3RyaXAtd2l0aC10YWJzLXBpbGxzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQ29udGVudFN0cmlwV2l0aFRhYnNQaWxsc0NvbXBvbmVudCBleHRlbmRzIFdpZGdldEJhc2VDb21wb25lbnRcbmltcGxlbWVudHNcbk9uSW5pdCxcbk9uRGVzdHJveSxcbk5zV2lkZ2V0UmVzb2x2ZXIuSVdpZGdldERhdGE8TnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwTXVsdGlwbGU+IHtcbiAgQElucHV0KCkgd2lkZ2V0RGF0YSE6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcE11bHRpcGxlO1xuICBAT3V0cHV0KCkgZW1wdHlSZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBPdXRwdXQoKSB2aWV3QWxsUmVzcG9uc2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKVxuICBAT3V0cHV0KCkgdGVsZW10cnlSZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpXG4gIEBJbnB1dCgpIHByb3ZpZGVySWQgOiBhbnkgPSAnJ1xuICBASW5wdXQoKSBlbWl0Vmlld0FsbCA6IGJvb2xlYW4gPSBmYWxzZVxuICBASW5wdXQoKSBjaGFubm5lbE5hbWU6IGFueSA9ICcnXG4gIEBIb3N0QmluZGluZygnaWQnKVxuICBwdWJsaWMgaWQgPSBgd3Mtc3RyaXAtbWlsdGlwbGVfJHtNYXRoLnJhbmRvbSgpfWA7XG4gIHN0cmlwc1Jlc3VsdERhdGFNYXA6IHsgW2tleTogc3RyaW5nXTogSVN0cmlwVW5pdENvbnRlbnREYXRhIH0gPSB7fTtcbiAgc3RyaXBzS2V5T3JkZXI6IHN0cmluZ1tdID0gW107XG4gIHNob3dBY2NvcmRpb25EYXRhID0gdHJ1ZTtcbiAgc2hvd1BhcmVudExvYWRlciA9IGZhbHNlO1xuICBzaG93UGFyZW50RXJyb3IgPSBmYWxzZTtcbiAgc2hvd1BhcmVudE5vRGF0YSA9IGZhbHNlO1xuICBlcnJvckRhdGFDb3VudCA9IDA7XG4gIG5vRGF0YUNvdW50ID0gMDtcbiAgc3VjY2Vzc0RhdGFDb3VudCA9IDA7XG4gIGNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICBiYXNlVXJsID0gdGhpcy5jb25maWdTdmMuc2l0ZVBhdGggfHwgJyc7XG4gIHZlaWZpZWRLYXJtYXlvZ2kgPSBmYWxzZTtcbiAgZW52aXJvbm1lbnQhOiBhbnk7XG4gIGNoYW5nZUV2ZW50U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbDtcbiAgZGVmYXVsdE1heFdpZGdldHMgPSAxMjtcbiAgZW5yb2xsSW50ZXJ2YWw6IGFueTtcbiAgdG9kYXlzRXZlbnRzOiBhbnkgPSBbXTtcbiAgZW5yb2xsbWVudE1hcERhdGE6IGFueVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIC8vIHByaXZhdGUgY29udGVudFN0cmlwU3ZjOiBDb250ZW50U3RyaXBOZXdNdWx0aXBsZVNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55LFxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFN2YzogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHVibGljIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICAvLyBwcml2YXRlIHNlYXJjaFNlcnZTdmM6IFNlYXJjaFNlcnZTZXJ2aWNlLFxuICAgIHB1YmxpYyByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHVzZXJTdmM6IFdpZGdldFVzZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3RyYW5zbGF0aW9uczogTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZVxuICApIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpIHtcbiAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCdlbicpO1xuICAgICAgbGV0IGxhbmcgPSBKU09OLnN0cmluZ2lmeShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykpO1xuICAgICAgbGFuZyA9IGxhbmcucmVwbGFjZSgvXFxcIi9nLCAnJyk7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobGFuZyk7XG4gICAgfVxuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gY29uc3QgdXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICB0aGlzLmluaXREYXRhKCk7XG4gICAgdGhpcy5jb250ZW50U3ZjLnRlbGVtZXRyeURhdGEkLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLnRlbGVtdHJ5UmVzcG9uc2UuZW1pdChkYXRhKVxuICAgIH0pXG5cbiAgXG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5jaGFuZ2VFdmVudFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGFuZ2VFdmVudFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIHNob3dBY2NvcmRpb24oa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLm1vZGUgPT09ICdhY2NvcmRpb24nKSB7XG4gICAgICByZXR1cm4gdGhpcy5zaG93QWNjb3JkaW9uRGF0YTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzZXRIaWRkZW5Gb3JTdHJpcChrZXk6IHN0cmluZykge1xuICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtrZXldLnNob3dTdHJpcCA9IGZhbHNlO1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oYGNzdHJpcF8ke2tleX1gLCAnMScpO1xuICB9XG4gIHByaXZhdGUgZ2V0SWZTdHJpcEhpZGRlbihrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHN0b3JhZ2VJdGVtID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShgY3N0cmlwXyR7a2V5fWApO1xuICAgIHJldHVybiBCb29sZWFuKHN0b3JhZ2VJdGVtICE9PSAnMScpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RGF0YSgpIHtcbiAgICB0aGlzLnN0cmlwc0tleU9yZGVyID0gdGhpcy53aWRnZXREYXRhICYmIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMgJiYgdGhpcy53aWRnZXREYXRhLnN0cmlwcy5tYXAoc3RyaXAgPT4gc3RyaXAua2V5KSB8fCBbXTtcbiAgICBpZiAodGhpcy53aWRnZXREYXRhLmxvYWRlciAmJiB0aGlzLndpZGdldERhdGEuc3RyaXBzLmxlbmd0aCkge1xuICAgICAgdGhpcy5zaG93UGFyZW50TG9hZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRmV0Y2ggdGhlIGRhdGFcbiAgICBmb3IgKGNvbnN0IHN0cmlwIG9mIHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMpIHtcbiAgICAgIGlmICh0aGlzLmNoZWNrRm9yRW1wdHlXaWRnZXQoc3RyaXApKSB7XG4gICAgICAgIHRoaXMuZmV0Y2hTdHJpcEZyb21SZXF1ZXN0RGF0YShzdHJpcCwgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZG9uZScsIHRydWUsIG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBTdWJzY3JpcHRpb24gZm9yIGNoYW5nZXNcbiAgICBjb25zdCBrZXlBbmRFdmVudDogeyBrZXk6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBmcm9tOiBzdHJpbmcgfVtdID0gdGhpcy53aWRnZXREYXRhLnN0cmlwc1xuICAgICAgLm1hcChzdHJpcCA9PiAoe1xuICAgICAgICBrZXk6IHN0cmlwLmtleSxcbiAgICAgICAgdHlwZTogKHN0cmlwLnJlZnJlc2hFdmVudCAmJiBzdHJpcC5yZWZyZXNoRXZlbnQuZXZlbnRUeXBlKSB8fCAnJyxcbiAgICAgICAgZnJvbTogKHN0cmlwLnJlZnJlc2hFdmVudCAmJiBzdHJpcC5yZWZyZXNoRXZlbnQuZnJvbS50b1N0cmluZygpKSB8fCAnJyxcbiAgICAgIH0pKVxuICAgICAgLmZpbHRlcigoeyBrZXksIHR5cGUsIGZyb20gfSkgPT4ga2V5ICYmIHR5cGUgJiYgZnJvbSk7XG4gICAgY29uc3QgZXZlbnRUeXBlU2V0ID0gbmV3IFNldChrZXlBbmRFdmVudC5tYXAoZSA9PiBlLnR5cGUpKTtcbiAgICB0aGlzLmNoYW5nZUV2ZW50U3Vic2NyaXB0aW9uID0gdGhpcy5ldmVudFN2Yy5ldmVudHMkXG4gICAgICAucGlwZShmaWx0ZXIoZXZlbnQgPT4gZXZlbnRUeXBlU2V0LmhhcyhldmVudC5ldmVudFR5cGUpKSlcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgICBrZXlBbmRFdmVudFxuICAgICAgICAgIC5maWx0ZXIoZSA9PiBlLnR5cGUgPT09IGV2ZW50LmV2ZW50VHlwZSAmJiBlLmZyb20gPT09IGV2ZW50LmZyb20pXG4gICAgICAgICAgLm1hcChlID0+IGUua2V5KVxuICAgICAgICAgIC5mb3JFYWNoKGsgPT4gdGhpcy5mZXRjaFN0cmlwRnJvbUtleShrLCBmYWxzZSkpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZldGNoU3RyaXBGcm9tS2V5KGtleTogc3RyaW5nLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgY29uc3Qgc3RyaXBEYXRhID0gdGhpcy53aWRnZXREYXRhLnN0cmlwcy5maW5kKHN0cmlwID0+IHN0cmlwLmtleSA9PT0ga2V5KTtcbiAgICBpZiAoc3RyaXBEYXRhKSB7XG4gICAgICB0aGlzLmZldGNoU3RyaXBGcm9tUmVxdWVzdERhdGEoc3RyaXBEYXRhLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIH1cbiAgfVxuXG4gIGlzU3RyaXBTaG93aW5nKGRhdGE6IGFueSkge1xuICAgIGxldCBjb3VudCA9IDA7XG4gICAgXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5rZXkgPT09IHRoaXMuZW52aXJvbm1lbnQucHJvZ3JhbVN0cmlwS2V5ICYmICghZGF0YS50YWJzIHx8ICFkYXRhLnRhYnMubGVuZ3RoKSAmJlxuICAgICAgZGF0YS5zdHJpcFRpdGxlID09PSB0aGlzLmVudmlyb25tZW50LnByb2dyYW1TdHJpcE5hbWUgJiYgZGF0YS53aWRnZXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGRhdGEud2lkZ2V0cy5mb3JFYWNoKChrZXk6IGFueSkgPT4ge1xuICAgICAgICBpZiAoa2V5ICYmIGtleS53aWRnZXREYXRhLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLmVudmlyb25tZW50LnByb2dyYW1TdHJpcFByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmIChjb3VudCA+IDApIHtcbiAgICAgICAgZGF0YS5zaG93U3RyaXAgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5zaG93U3RyaXAgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJ2RhdGEua2V5JywgZGF0YSwgZGF0YS5rZXksIGRhdGEud2lkZ2V0cyk7XG4gICAgcmV0dXJuIGRhdGEuc2hvd1N0cmlwO1xuICB9XG5cbiAgZ2V0IGlzTW9iaWxlKCkge1xuICAgIHJldHVybiB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGUgfHwgZmFsc2U7XG4gIH1cblxuICBnZXRkYXRhKGRhdGE6IElTdHJpcFVuaXRDb250ZW50RGF0YSkge1xuICAgIGlmIChkYXRhLnN0cmlwSW5mbykge1xuICAgICAgcmV0dXJuIGRhdGEuc3RyaXBJbmZvLndpZGdldDtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuXG4gIH1cbiAgY2hlY2tDb25kaXRpb24od0RhdGE6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcE11bHRpcGxlLCBkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICBpZiAod0RhdGEuc3RyaXBzWzBdLnN0cmlwQ29uZmlnICYmIHdEYXRhLnN0cmlwc1swXS5zdHJpcENvbmZpZy5oaWRlU2hvd0FsbCkge1xuICAgICAgcmV0dXJuICF3RGF0YS5zdHJpcHNbMF0uc3RyaXBDb25maWcuaGlkZVNob3dBbGw7XG4gICAgfVxuICAgIHJldHVybiB3RGF0YS5zdHJpcHNbMF0udmlld01vcmVVcmwgJiYgZGF0YS53aWRnZXRzICYmIGRhdGEud2lkZ2V0cy5sZW5ndGggPj0gNDtcbiAgfVxuICBjaGVja1Zpc2libGUoZGF0YTogSVN0cmlwVW5pdENvbnRlbnREYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEuc3RyaXBJbmZvICYmIGRhdGEuc3RyaXBJbmZvLnZpc2liaWxpdHlNb2RlID09PSAndmlzaWJsZSc7XG4gIH1cblxuICBnZXRDb250aW5ldUxlYXJuaW5nTGVudGgoZGF0YTogSVN0cmlwVW5pdENvbnRlbnREYXRhKSB7XG4gICAgcmV0dXJuIGRhdGEud2lkZ2V0cyA/IGRhdGEud2lkZ2V0cy5sZW5ndGggOiAwO1xuICB9XG4gIGdldExlbmd0aChkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICBpZiAoIWRhdGEudGFicyB8fCAhZGF0YS50YWJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGRhdGEud2lkZ2V0cyA/IGRhdGEud2lkZ2V0cy5sZW5ndGggOiAwO1xuICAgIH0ge1xuICAgICAgLy8gaWYgdGFicyBhcmUgdGhlcmUgY2hlY2sgaWYgZWFjaCB0YWIgaGFzIHdpZGdldHMgYW5kIGdldCB0aGUgdGFiIHdpdGggbWF4IHdpZGdldHNcbiAgICAgIGxldCB0YWJXaXRoTWF4V2lkZ2V0czogYW55ID0ge31cbiAgICAgIGRhdGEudGFicy5mb3JFYWNoKCh0YWI6IGFueSk9PntcbiAgICAgICAgaWYodGFiLnBpbGxzRGF0YSAmJiB0YWIucGlsbHNEYXRhLmxlbmd0aCl7XG4gICAgICAgICAgdGFiV2l0aE1heFdpZGdldHMgPSB0YWIucGlsbHNEYXRhLnJlZHVjZShcbiAgICAgICAgICAgIChwcmV2OiBhbnksIGN1cnJlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIXByZXYud2lkZ2V0cyAmJiAhY3VycmVudC53aWRnZXRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHByZXYud2lkZ2V0cyAmJiBjdXJyZW50LndpZGdldHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHByZXYud2lkZ2V0cy5sZW5ndGggPiBjdXJyZW50LndpZGdldHMubGVuZ3RoKSA/IHByZXYgOiBjdXJyZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50LndpZGdldHMgJiYgIXByZXYud2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICghY3VycmVudC53aWRnZXRzICYmIHByZXYud2lkZ2V0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgICAgICAvLyByZXR1cm4gKHByZXYud2lkZ2V0cyAmJiBjdXJyZW50LndpZGdldHMgJiYgKHByZXYud2lkZ2V0cy5sZW5ndGggPiBjdXJyZW50LndpZGdldHMubGVuZ3RoKSApID8gcHJldiA6IGN1cnJlbnRcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBhbGlnblxuICAgICAgICAgICAgfSwgZGF0YS50YWJzWzBdKTtcblxuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLy8gaWYgdGFicyBoYXMgYXRsZWFzdCAxIHdpZGdldHMgdGhlbiBzdHJpcCB3aWxsIHNob3cgb3IgZWxzZSBub3RcbiAgICAgIHJldHVybiB0YWJXaXRoTWF4V2lkZ2V0cy53aWRnZXRzID8gdGFiV2l0aE1heFdpZGdldHMud2lkZ2V0cy5sZW5ndGggOiAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyc0Zyb21BcnJheSh2NmZpbHRlcnM6IGFueSkge1xuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHt9O1xuICAgIGlmICh2NmZpbHRlcnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICB2NmZpbHRlcnMuZm9yRWFjaCgoKGY6IGFueSkgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgZmlsdGVyc1trZXldID0gZltrZXldO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH1cbiAgICByZXR1cm4gdjZmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1TZWFyY2hWNkZpbHRlcnNWMih2NmZpbHRlcnM6IGFueSkge1xuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHt9O1xuICAgIGlmICh2NmZpbHRlcnMuY29uc3RydWN0b3IgPT09IEFycmF5KSB7XG4gICAgICB2NmZpbHRlcnMuZm9yRWFjaCgoKGY6IGFueSkgPT4ge1xuICAgICAgICBPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgZmlsdGVyc1trZXldID0gZltrZXldO1xuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICAgIHJldHVybiBmaWx0ZXJzO1xuICAgIH1cbiAgICByZXR1cm4gdjZmaWx0ZXJzO1xuICB9XG5cbiAgY2hlY2tGb3JEYXRlRmlsdGVycyhmaWx0ZXJzOiBhbnkpIHtcbiAgICBsZXQgdXNlckRhdGE6IGFueTtcbiAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgIHVzZXJEYXRhID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU7XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlcnMgJiYgZmlsdGVycy5oYXNPd25Qcm9wZXJ0eSgnYmF0Y2hlcy5lbmREYXRlJykpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgZmlsdGVyc1snYmF0Y2hlcy5lbmREYXRlJ11bJz49J10gPSBldmFsKGZpbHRlcnNbJ2JhdGNoZXMuZW5kRGF0ZSddWyc+PSddKVxuICAgIH0gZWxzZSBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmhhc093blByb3BlcnR5KCdiYXRjaGVzLmVucm9sbG1lbnRFbmREYXRlJykpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgZmlsdGVyc1snYmF0Y2hlcy5lbnJvbGxtZW50RW5kRGF0ZSddWyc+PSddID0gZXZhbChmaWx0ZXJzWydiYXRjaGVzLmVucm9sbG1lbnRFbmREYXRlJ11bJz49J10pXG4gICAgfSBlbHNlIGlmIChmaWx0ZXJzLm9yZ2FuaXNhdGlvbiAmJlxuICAgICAgZmlsdGVycy5vcmdhbmlzYXRpb24uaW5kZXhPZignPG9yZ0lEPicpID49IDBcbiAgICApIHtcbiAgICAgIGlmKHRoaXMucHJvdmlkZXJJZCkge1xuICAgICAgICBmaWx0ZXJzLm9yZ2FuaXNhdGlvbiA9IHRoaXMucHJvdmlkZXJJZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbHRlcnMub3JnYW5pc2F0aW9uID0gdXNlckRhdGEgJiYgdXNlckRhdGEucm9vdE9yZ0lkO1xuXG4gICAgICAgIGlmIChmaWx0ZXJzICYmIGZpbHRlcnMuaGFzT3duUHJvcGVydHkoJ2Rlc2lnbmF0aW9uJykpIHtcbiAgICAgICAgICBmaWx0ZXJzLmRlc2lnbmF0aW9uID0gdXNlckRhdGEucHJvZmVzc2lvbmFsRGV0YWlscy5sZW5ndGggPiAwID9cbiAgICAgICAgICAgIHVzZXJEYXRhLnByb2Zlc3Npb25hbERldGFpbHNbMF0uZGVzaWduYXRpb24gOiAnJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgXG4gICAgfVxuICAgIHJldHVybiBmaWx0ZXJzO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFN0cmlwRnJvbVJlcXVlc3REYXRhKFxuICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LFxuICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUsXG4gICkge1xuICAgIC8vIHNldHRpbmcgaW5pdGlhbCB2YWx1ZXNcbiAgICBzdHJpcC5sb2FkZXJXaWRnZXRzID0gdGhpcy50cmFuc2Zvcm1Ta2VsZXRvblRvV2lkZ2V0cyhzdHJpcCk7XG4gICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZmV0Y2hpbmcnLCBmYWxzZSwgbnVsbCk7XG4gICAgdGhpcy5mZXRjaEZyb21FbnJvbGxtZW50TGlzdChzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICB0aGlzLmZldGNoRnJvbVNlYXJjaFY2KHN0cmlwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIHRoaXMuZmV0Y2hGcm9tVHJlbmRpbmdDb250ZW50KHN0cmlwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIHRoaXMuZmV0Y2hBbGxUb3BDb250ZW50KHN0cmlwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgIHRoaXMuZmV0Y2hBbGxGZWF0dXJlZENvbnRlbnQoc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgdGhpcy5mZXRjaEFsbEJvb2tNYXJrRGF0YShzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICB0aGlzLmZldGNoQWxsUGxheWxpc3RTZWFyY2goc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgdGhpcy5mZXRjaFBsYXlsaXN0UmVhZERhdGEoc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgdGhpcy5mZXRjaENpb3NDb250ZW50RGF0YShzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICB0aGlzLmZldGNoRm9yWW91RGF0YShzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKVxuICAgIHRoaXMuZmV0Y2hBbGxDYnBQbGFucyhzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICBcbiAgICAvLyB0aGlzLmVucm9sbEludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIC8vICAgdGhpcy5mZXRjaEFsbENicFBsYW5zKHN0cmlwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpXG4gICAgLy8gfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApXG4gIH1cblxuICBmZXRjaEZyb21FbnJvbGxtZW50TGlzdChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3QuZW5yb2xsbWVudExpc3QgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5lbnJvbGxtZW50TGlzdCkubGVuZ3RoKSB7XG4gICAgICBsZXQgdXNlcklkID0gJyc7XG4gICAgICBsZXQgY29udGVudDogTnNDb250ZW50LklDb250ZW50W107XG4gICAgICBsZXQgY29udGVudE5ldzogTnNDb250ZW50LklDb250ZW50W107XG4gICAgICBsZXQgdGFiUmVzdWx0czogYW55W10gPSBbXTtcbiAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gXy5nZXQoc3RyaXAucmVxdWVzdC5lbnJvbGxtZW50TGlzdCwgJ3F1ZXJ5UGFyYW1zJyk7XG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkO1xuICAgICAgfVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkZXByZWNhdGlvblxuICAgICAgdGhpcy51c2VyU3ZjLmZldGNoVXNlckJhdGNoTGlzdCh1c2VySWQsIHF1ZXJ5UGFyYW1zKS5zdWJzY3JpYmUoXG4gICAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvdXJzZXMgPSByZXN1bHQgJiYgcmVzdWx0LmNvdXJzZXM7XG4gICAgICAgICAgY29uc3Qgc2hvd1ZpZXdNb3JlID0gQm9vbGVhbihcbiAgICAgICAgICAgIGNvdXJzZXMubGVuZ3RoID4gNSAmJiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgcGF0aDogKHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnBhdGgpIHx8ICcnLFxuICAgICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgICAgIHE6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgICAgIGY6XG4gICAgICAgICAgICAgICAgICBzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYgJiYgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5maWx0ZXJzXG4gICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zZWFyY2hTZXJ2U3ZjLnRyYW5zZm9ybVNlYXJjaFY2RmlsdGVycyhcbiAgICAgICAgICAgICAgICAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmZpbHRlcnNcbiAgICAgICAgICAgICAgICAgICAgICAvLyApLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgaWYgKGNvdXJzZXMgJiYgY291cnNlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb3Vyc2VzLm1hcCgoYzogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRUZW1wOiBOc0NvbnRlbnQuSUNvbnRlbnQgPSBjLmNvbnRlbnQ7XG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wLmNvbXBsZXRpb25QZXJjZW50YWdlID0gYy5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjLnByb2dyZXNzIHx8IDA7XG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wLmNvbXBsZXRpb25TdGF0dXMgPSBjLmNvbXBsZXRpb25TdGF0dXMgfHwgYy5zdGF0dXMgfHwgMDtcbiAgICAgICAgICAgICAgY29udGVudFRlbXAuZW5yb2xsZWREYXRlID0gYy5lbnJvbGxlZERhdGUgfHwgJyc7XG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wLmxhc3RDb250ZW50QWNjZXNzVGltZSA9IGMubGFzdENvbnRlbnRBY2Nlc3NUaW1lIHx8ICcnO1xuICAgICAgICAgICAgICBjb250ZW50VGVtcC5sYXN0UmVhZENvbnRlbnRTdGF0dXMgPSBjLmxhc3RSZWFkQ29udGVudFN0YXR1cyB8fCAnJztcbiAgICAgICAgICAgICAgY29udGVudFRlbXAubGFzdFJlYWRDb250ZW50SWQgPSBjLmxhc3RSZWFkQ29udGVudElkIHx8ICcnO1xuICAgICAgICAgICAgICBjb250ZW50VGVtcC5scmNQcm9ncmVzc0RldGFpbHMgPSBjLmxyY1Byb2dyZXNzRGV0YWlscyB8fCAnJztcbiAgICAgICAgICAgICAgY29udGVudFRlbXAuaXNzdWVkQ2VydGlmaWNhdGVzID0gYy5pc3N1ZWRDZXJ0aWZpY2F0ZXMgfHwgW107XG4gICAgICAgICAgICAgIGNvbnRlbnRUZW1wLmJhdGNoSWQgPSBjLmJhdGNoSWQgfHwgJyc7XG4gICAgICAgICAgICAgIHJldHVybiBjb250ZW50VGVtcDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUbyBmaWx0ZXIgY29udGVudCB3aXRoIGNvbXBsZXRpb25QZXJjZW50YWdlID4gMCxcbiAgICAgICAgICAvLyBzbyB0aGF0IG9ubHkgdGhvc2UgY29udGVudCB3aWxsIHNob3cgaW4gaG9tZSBwYWdlXG4gICAgICAgICAgLy8gY29udGludWUgbGVhcmluZyBzdHJpcFxuICAgICAgICAgIC8vIGlmIChjb250ZW50ICYmIGNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gICBjb250ZW50TmV3ID0gY29udGVudC5maWx0ZXIoKGM6IGFueSkgPT4ge1xuICAgICAgICAgIC8vICAgICAvKiogY29tbWVudGVkIGFzIGJvdGggYXJlIDAgYWZ0ZXIgZW5yb2xsbCAqL1xuICAgICAgICAgIC8vICAgICBpZiAoYy5jb21wbGV0aW9uUGVyY2VudGFnZSAmJiBjLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCkge1xuICAgICAgICAgIC8vICAgICAgIHJldHVybiBjXG4gICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAvLyAgIH0pXG4gICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgLy8gVG8gc29ydCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZSBlbnJvbGxlZCBkYXRlXG4gICAgICAgICAgY29udGVudE5ldyA9IChjb250ZW50IHx8IFtdKS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0ZUE6IGFueSA9IG5ldyBEYXRlKGEubGFzdENvbnRlbnRBY2Nlc3NUaW1lIHx8IDApO1xuICAgICAgICAgICAgY29uc3QgZGF0ZUI6IGFueSA9IG5ldyBEYXRlKGIubGFzdENvbnRlbnRBY2Nlc3NUaW1lIHx8IDApO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGVCIC0gZGF0ZUE7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoc3RyaXAudGFicyAmJiBzdHJpcC50YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGFiUmVzdWx0cyA9IHRoaXMuc3BsaXRFbnJvbGxtZW50VGFic0RhdGEoY29udGVudE5ldywgc3RyaXApO1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvbnRlbnROZXcsIHN0cmlwKSxcbiAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgICAgIHZpZXdNb3JlVXJsLFxuICAgICAgICAgICAgICB0YWJSZXN1bHRzXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudE5ldywgc3RyaXApLFxuICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgdmlld01vcmVVcmwsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBzcGxpdEVucm9sbG1lbnRUYWJzRGF0YShjb250ZW50TmV3OiBOc0NvbnRlbnQuSUNvbnRlbnRbXSwgc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQpIHtcbiAgICBjb25zdCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHNwbGl0RGF0YSA9IHRoaXMuZ2V0SW5wcm9ncmVzc0FuZENvbXBsZXRlZChcbiAgICAgIGNvbnRlbnROZXcsXG4gICAgICAoZTogYW55KSA9PiBlLmNvbXBsZXRpb25TdGF0dXMgPT09IDEgfHwgZS5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCxcbiAgICAgIHN0cmlwLFxuICAgICk7XG5cbiAgICBpZiAoc3RyaXAudGFicyAmJiBzdHJpcC50YWJzLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpcC50YWJzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGlmIChzdHJpcC50YWJzW2ldKSB7XG4gICAgICAgICAgdGFiUmVzdWx0cy5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5zdHJpcC50YWJzW2ldLFxuICAgICAgICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgICAuLi4oc3BsaXREYXRhLmZpbmQoaXRtSW5uZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnNbaV0gJiYgaXRtSW5uZXIudmFsdWUgPT09IHN0cmlwLnRhYnNbaV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpdG1Jbm5lcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRhYlJlc3VsdHM7XG4gIH1cblxuICBnZXRJbnByb2dyZXNzQW5kQ29tcGxldGVkKGFycmF5OiBOc0NvbnRlbnQuSUNvbnRlbnRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GaWx0ZXI6IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAgIGNvbnN0IGlucHJvZ3Jlc3M6IGFueVtdID0gW107XG4gICAgY29uc3QgY29tcGxldGVkOiBhbnlbXSA9IFtdO1xuICAgIGFycmF5LmZvckVhY2goKGU6IGFueSwgaWR4OiBudW1iZXIsIGFycjogYW55W10pID0+IChjdXN0b21GaWx0ZXIoZSwgaWR4LCBhcnIpID8gaW5wcm9ncmVzcyA6IGNvbXBsZXRlZCkucHVzaChlKSk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgdmFsdWU6ICdpbnByb2dyZXNzJywgd2lkZ2V0czogdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhpbnByb2dyZXNzLCBzdHJpcCkgfSxcbiAgICAgIHsgdmFsdWU6ICdjb21wbGV0ZWQnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvbXBsZXRlZCwgc3RyaXApIH1dO1xuICB9XG5cbiAgLy8gYXN5bmMgZmV0Y2hGcm9tU2VhcmNoVjYoc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUpIHtcbiAgLy8gICBpZiAoc3RyaXAucmVxdWVzdCAmJiBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYpLmxlbmd0aCkge1xuICAvLyAgICAgLy8gaWYgKCEoc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgJiYgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUubGVuZ3RoID4gMCkpIHtcbiAgLy8gICAgIC8vICAgaWYgKHRoaXMuY29uZmlnU3ZjLmFjdGl2ZUxvY2FsZSkge1xuICAvLyAgICAgLy8gICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYubG9jYWxlID0gW3RoaXMuY29uZmlnU3ZjLmFjdGl2ZUxvY2FsZS5sb2NhbHNbMF1dXG4gIC8vICAgICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICAvLyAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgPSBbJ2VuJ11cbiAgLy8gICAgIC8vICAgfVxuICAvLyAgICAgLy8gfVxuICAvLyAgICAgbGV0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gIC8vICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gIC8vICAgICBjb25zb2xlLmxvZyhvcmlnaW5hbEZpbHRlcnMpO1xuICAvLyAgICAgaWYgKHN0cmlwLnJlcXVlc3QgJiZcbiAgLy8gICAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNiAmJlxuICAvLyAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QgJiZcbiAgLy8gICAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMpIHtcbiAgLy8gICAgICAgb3JpZ2luYWxGaWx0ZXJzID0gc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnM7XG4gIC8vICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzID0gdGhpcy5jaGVja0ZvckRhdGVGaWx0ZXJzKHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzKTtcbiAgLy8gICAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMgPSB0aGlzLmdldEZpbHRlcnNGcm9tQXJyYXkoXG4gIC8vICAgICAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0LmZpbHRlcnMsXG4gIC8vICAgICAgICk7XG4gIC8vICAgICB9XG4gIC8vICAgICBpZiAoc3RyaXAudGFicyAmJiBzdHJpcC50YWJzLmxlbmd0aCkge1xuICAvLyAgICAgICAvLyBUT0RPOiBIYXZlIHRvIGV4dHJhY3QgcmVxdWVzdFJlcXVpcmVkIHRvIG91dGVyIGxldmVsIG9mIHRhYnMgY29uZmlnXG4gIC8vICAgICAgIGNvbnN0IGZpcnN0VGFiID0gc3RyaXAudGFic1swXTtcbiAgLy8gICAgICAgaWYgKGZpcnN0VGFiLnJlcXVlc3RSZXF1aXJlZCkge1xuICAvLyAgICAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzKSB7XG4gIC8vICAgICAgICAgICBjb25zdCBhbGxUYWJzID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicztcbiAgLy8gICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGcm9tTWFwID0gKGFsbFRhYnMgJiYgYWxsVGFicy5sZW5ndGggJiYgYWxsVGFic1swXSkgYXMgTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVGFiO1xuXG4gIC8vICAgICAgICAgICB0aGlzLmdldFRhYkRhdGFCeU5ld1JlcVNlYXJjaFY2KHN0cmlwLCAwLCBjdXJyZW50VGFiRnJvbU1hcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cblxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgdHJ5IHtcbiAgLy8gICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VhcmNoVjZSZXF1ZXN0KHN0cmlwLCBzdHJpcC5yZXF1ZXN0LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAvLyAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsaW5nICBhZnRlciAtIHJlc3BvbnNlLCAnLCByZXNwb25zZSlcbiAgLy8gICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0cykge1xuICAvLyAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyLS0gJylcbiAgLy8gICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50KSB7XG4gIC8vICAgICAgICAgICAgIGlmKHN0cmlwLmtleSA9PT0gJ3NjaGVkdWxlZEFzc2Vzc21lbnQnKSB7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5lbnJvbGxJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgLy8gICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJbnZpdE9ubHlBc3Nlc3NtZW50cyhyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50LCBzdHJpcCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCByZXNwb25zZS52aWV3TW9yZVVybClcblxuICAvLyAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAvLyAgICAgICAgICAgICAgIH0sIDEwMDApXG4gICAgICAgICAgXG4gICAgICAgICAgICBcbiAgLy8gICAgICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgLy8gICAgICAgICAgICAgICAgIHN0cmlwLFxuICAvLyAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50LCBzdHJpcCksXG4gIC8vICAgICAgICAgICAgICAgICAnZG9uZScsXG4gIC8vICAgICAgICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gIC8vICAgICAgICAgICAgICAgICByZXNwb25zZS52aWV3TW9yZVVybCxcbiAgLy8gICAgICAgICAgICAgICApO1xuICAvLyAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgLy8gICAgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuRXZlbnQpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gIC8vICAgICAgICAgICAgICAgc3RyaXAsXG4gIC8vICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1FdmVudHNUb1dpZGdldHMocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuRXZlbnQsIHN0cmlwKSxcbiAgLy8gICAgICAgICAgICAgICAnZG9uZScsXG4gIC8vICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAvLyAgICAgICAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAvLyAgICAgICAgICAgICApO1xuICAvLyAgICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAvLyAgICAgICAgICAgfVxuXG4gIC8vICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAvLyAgICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGNoZWNrSW52aXRPbmx5QXNzZXNzbWVudHMoY29udGVudDphbnksIHN0cmlwOmFueSwgY2FsY3VsYXRlUGFyZW50U3RhdHVzOmFueSwgdmlld01vcmVVcmw6YW55KSB7XG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdlbnJvbGxtZW50TWFwRGF0YScpKSB7XG4gICAgICB0aGlzLmVucm9sbG1lbnRNYXBEYXRhID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZW5yb2xsbWVudE1hcERhdGEnKSB8fCAne30nKVxuICAgICAgbGV0IGZpbHRlcmVkQXJyYXk6IGFueSA9IFtdXG4gICAgICAgIGNvbnRlbnQuZm9yRWFjaCgoZGF0YTphbnkpPT4ge1xuICAgICAgICAgIGlmKHRoaXMuZW5yb2xsbWVudE1hcERhdGFbZGF0YS5pZGVudGlmaWVyXSl7XG4gICAgICAgICAgICBkYXRhWydiYXRjaCddID0gdGhpcy5lbnJvbGxtZW50TWFwRGF0YVtkYXRhLmlkZW50aWZpZXJdLmJhdGNoXG4gICAgICAgICAgICBkYXRhWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gdGhpcy5lbnJvbGxtZW50TWFwRGF0YVtkYXRhLmlkZW50aWZpZXJdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgICBmaWx0ZXJlZEFycmF5LnB1c2goZGF0YSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pIFxuICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgIHN0cmlwLFxuICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGZpbHRlcmVkQXJyYXksIHN0cmlwKSxcbiAgICAgICAgJ2RvbmUnLFxuICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgIHZpZXdNb3JlVXJsLFxuICAgICAgKTtcbiAgICBjbGVhckludGVydmFsKHRoaXMuZW5yb2xsSW50ZXJ2YWwpXG4gIH1cbiAgXG4gICAgXG4gIH1cblxuICAvLyBhc3luYyBzZWFyY2hWNlJlcXVlc3Qoc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0WydyZXF1ZXN0J10sXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgLy8gKTogUHJvbWlzZTxhbnk+IHtcbiAgLy8gICBjb25zdCBvcmlnaW5hbEZpbHRlcnM6IGFueSA9IFtdO1xuICAvLyAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgLy8gICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3Quc2VhcmNoVjYpIHtcbiAgLy8gICAgICAgdGhpcy5jb250ZW50U3ZjLnNlYXJjaFY2KHJlcXVlc3Quc2VhcmNoVjYpLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgLy8gICAgICAgICBjb25zdCBzaG93Vmlld01vcmUgPSBCb29sZWFuKFxuICAvLyAgICAgICAgICAgcmVzdWx0cy5yZXN1bHQuY29udGVudCAmJiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lmxlbmd0aCA+IDUgJiYgc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcucG9zdENhcmRGb3JTZWFyY2gsXG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgICBjb25zdCB2aWV3TW9yZVVybCA9IHNob3dWaWV3TW9yZVxuICAvLyAgICAgICAgICAgPyB7XG4gIC8vICAgICAgICAgICAgIHBhdGg6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnBhdGggfHwgJycsXG4gIC8vICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gIC8vICAgICAgICAgICAgICAgdGFiOiAnTGVhcm4nLFxuICAvLyAgICAgICAgICAgICAgIHE6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zLFxuICAvLyAgICAgICAgICAgICAgIGY6XG4gIC8vICAgICAgICAgICAgICAgICByZXF1ZXN0ICYmXG4gIC8vICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VhcmNoVjYgJiZcbiAgLy8gICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0ICYmXG4gIC8vICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzXG4gIC8vICAgICAgICAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1TZWFyY2hWNkZpbHRlcnNWMihcbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRmlsdGVycyxcbiAgLy8gICAgICAgICAgICAgICAgICAgICApXG4gIC8vICAgICAgICAgICAgICAgICAgIClcbiAgLy8gICAgICAgICAgICAgICAgICAgOiB7fSxcbiAgLy8gICAgICAgICAgICAgfSxcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIDogbnVsbDtcbiAgLy8gICAgICAgICAvLyBpZiAodmlld01vcmVVcmwgJiYgdmlld01vcmVVcmwucXVlcnlQYXJhbXMpIHtcbiAgLy8gICAgICAgICAvLyAgIHZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zID0gdmlld01vcmVVcmwucXVlcnlQYXJhbXNcbiAgLy8gICAgICAgICAvLyB9XG4gIC8vICAgICAgICAgcmVzb2x2ZSh7IHJlc3VsdHMsIHZpZXdNb3JlVXJsIH0pO1xuICAvLyAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAvLyAgICAgICAgIHJlamVjdChlcnJvcik7XG4gIC8vICAgICAgIH0sXG4gIC8vICAgICAgICk7XG4gIC8vICAgICB9XG4gIC8vICAgfSk7XG4gIC8vIH1cblxuICBhc3luYyBmZXRjaEZyb21UcmVuZGluZ0NvbnRlbnQoc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUpIHtcbiAgICBpZiAoc3RyaXAucmVxdWVzdCAmJiBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gpLmxlbmd0aCkge1xuICAgICAgLy8gaWYgKCEoc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgJiYgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUubGVuZ3RoID4gMCkpIHtcbiAgICAgIC8vICAgaWYgKHRoaXMuY29uZmlnU3ZjLmFjdGl2ZUxvY2FsZSkge1xuICAgICAgLy8gICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYubG9jYWxlID0gW3RoaXMuY29uZmlnU3ZjLmFjdGl2ZUxvY2FsZS5sb2NhbHNbMF1dXG4gICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAvLyAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgPSBbJ2VuJ11cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgbGV0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgICBpZiAoc3RyaXAucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoICYmXG4gICAgICAgIHN0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycykge1xuICAgICAgICBvcmlnaW5hbEZpbHRlcnMgPSBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycztcbiAgICAgICAgc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMgPSB0aGlzLmNoZWNrRm9yRGF0ZUZpbHRlcnMoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMpO1xuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycyA9IHRoaXMuZ2V0RmlsdGVyc0Zyb21BcnJheShcbiAgICAgICAgICBzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgIC8vIFRPRE86IEhhdmUgdG8gZXh0cmFjdCByZXF1ZXN0UmVxdWlyZWQgdG8gb3V0ZXIgbGV2ZWwgb2YgdGFicyBjb25maWdcbiAgICAgICAgY29uc3QgZmlyc3RUYWIgPSBzdHJpcC50YWJzWzBdO1xuICAgICAgICBpZiAoZmlyc3RUYWIucmVxdWVzdFJlcXVpcmVkKSB7XG4gICAgICAgICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZyb21NYXAgPSAoYWxsVGFicyAmJiBhbGxUYWJzLmxlbmd0aCAmJiBhbGxUYWJzWzBdKSBhcyBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWI7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxVHJlbmRpbmcoc3RyaXAsIDAsIDAsIGN1cnJlbnRUYWJGcm9tTWFwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50cmVuZGluZ1NlYXJjaFJlcXVlc3Qoc3RyaXAsIHN0cmlwLnJlcXVlc3QsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdHMgJiYgcmVzcG9uc2UucmVzdWx0cy5yZXNwb25zZSkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHJlc3BvbnNlLnJlc3VsdHMucmVzcG9uc2Vbc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXNwb25zZUtleV0gfHwgW107XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudCwgc3RyaXApLFxuICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgcmVzcG9uc2Uudmlld01vcmVVcmwgfHwgJycsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYoIWNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgdHJlbmRpbmdTZWFyY2hSZXF1ZXN0KHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdFsncmVxdWVzdCddLFxuICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBib29sZWFuXG4gIC8vICk6IFByb21pc2U8YW55PiB7XG4gIC8vICAgY29uc3Qgb3JpZ2luYWxGaWx0ZXJzOiBhbnkgPSBbXTtcbiAgLy8gICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gIC8vICAgICBpZiAocmVxdWVzdCAmJiByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoKSB7XG4gIC8vICAgICAgIC8vIGNoZWNrIGZvciB0aGUgcmVxdWVzdCBpZiBpdCBoYXMgZHluYW1pYyB2YWx1ZXNdXG4gIC8vICAgICAgIGlmIChyZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycy5vcmdhbmlzYXRpb24gJiZcbiAgLy8gICAgICAgICByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycy5vcmdhbmlzYXRpb24uaW5kZXhPZignPG9yZ0lEPicpID49IDBcbiAgLy8gICAgICAgKSB7XG4gIC8vICAgICAgICAgbGV0IHVzZXJSb290T3JnSWQ7XG4gIC8vICAgICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gIC8vICAgICAgICAgICB1c2VyUm9vdE9yZ0lkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgICByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVycy5vcmdhbmlzYXRpb24gPSB1c2VyUm9vdE9yZ0lkO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHRoaXMuY29udGVudFN2Yy50cmVuZGluZ0NvbnRlbnRTZWFyY2gocmVxdWVzdC50cmVuZGluZ1NlYXJjaCkuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAvLyAgICAgICAgIGNvbnN0IHNob3dWaWV3TW9yZSA9IEJvb2xlYW4oXG4gIC8vICAgICAgICAgICByZXN1bHRzLnJlc3VsdCAmJlxuICAvLyAgICAgICAgICAgc3RyaXAucmVxdWVzdCAmJlxuICAvLyAgICAgICAgICAgcmVzdWx0cy5yZXN1bHRbc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXNwb25zZUtleV0gJiZcbiAgLy8gICAgICAgICAgIHJlc3VsdHMucmVzdWx0W3N0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gucmVzcG9uc2VLZXldLmxlbmd0aCA+IDUgJiZcbiAgLy8gICAgICAgICAgIHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLnBvc3RDYXJkRm9yU2VhcmNoLFxuICAvLyAgICAgICAgICk7XG4gIC8vICAgICAgICAgY29uc3Qgdmlld01vcmVVcmwgPSBzaG93Vmlld01vcmVcbiAgLy8gICAgICAgICAgID8ge1xuICAvLyAgICAgICAgICAgICBwYXRoOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5wYXRoIHx8ICcnLFxuICAvLyAgICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAvLyAgICAgICAgICAgICAgIHRhYjogJ0xlYXJuJyxcbiAgLy8gICAgICAgICAgICAgICBxOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgLy8gICAgICAgICAgICAgICBmOlxuICAvLyAgICAgICAgICAgICAgICAgcmVxdWVzdCAmJlxuICAvLyAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoICYmXG4gIC8vICAgICAgICAgICAgICAgICAgIHJlcXVlc3QudHJlbmRpbmdTZWFyY2gucmVxdWVzdCAmJlxuICAvLyAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVyc1xuICAvLyAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KFxuICAvLyAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtU2VhcmNoVjZGaWx0ZXJzVjIoXG4gIC8vICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEZpbHRlcnMsXG4gIC8vICAgICAgICAgICAgICAgICAgICAgKVxuICAvLyAgICAgICAgICAgICAgICAgICApXG4gIC8vICAgICAgICAgICAgICAgICAgIDoge30sXG4gIC8vICAgICAgICAgICAgIH0sXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICA6IG51bGw7XG4gIC8vICAgICAgICAgICBsZXQgcHJvY2Nlc2VkUmVzdWx0OiBhbnkgPSBbXVxuICAvLyAgICAgICAgICAgaWYgKHJlc3VsdHMgJiYgcmVzdWx0cy5yZXNwb25zZSAmJiByZXN1bHRzLnJlc3BvbnNlLmNlcnRpZmljYXRpb25zKSB7XG4gIC8vICAgICAgICAgICAgIHJlc3VsdHMucmVzcG9uc2UuY2VydGlmaWNhdGlvbnMubWFwKChyZXN1bHQ6IGFueSkgPT4ge1xuICAvLyAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc291cmNlID09PSB0aGlzLmNoYW5ubmVsTmFtZSkge1xuICAvLyAgICAgICAgICAgICAgICAgcHJvY2Nlc2VkUmVzdWx0LnB1c2gocmVzdWx0KVxuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgfSlcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHJlc3VsdHMgPSB7cmVzcG9uc2U6IHtjZXJ0aWZpY2F0aW9uczogcHJvY2Nlc2VkUmVzdWx0fX1cbiAgLy8gICAgICAgICByZXNvbHZlKHsgcmVzdWx0cywgdmlld01vcmVVcmwgfSk7XG4gIC8vICAgICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAgICAgaWYgKGVycm9yLmVycm9yICYmIGVycm9yLmVycm9yLnN0YXR1cyA9PT0gNDAwKSB7XG4gIC8vICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgICAgLy8gdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZG9uZScsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbClcbiAgLy8gICAgICAgICByZWplY3QoZXJyb3IpO1xuICAvLyAgICAgICB9LFxuICAvLyAgICAgICApO1xuICAvLyAgICAgfVxuICAvLyAgIH0pO1xuICAvLyB9XG5cbiAgdG9nZ2xlSW5mbyhkYXRhOiBJU3RyaXBVbml0Q29udGVudERhdGEpIHtcbiAgICBjb25zdCBzdHJpcEluZm8gPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbZGF0YS5rZXldLnN0cmlwSW5mbztcbiAgICBpZiAoc3RyaXBJbmZvKSB7XG4gICAgICBpZiAoc3RyaXBJbmZvLm1vZGUgIT09ICdiZWxvdycpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2Fybihgc3RyaXAgaW5mbyBtb2RlOiAke3N0cmlwSW5mby5tb2RlfSBub3QgaW1wbGVtZW50ZWQgeWV0YCk7XG4gICAgICAgIHN0cmlwSW5mby5tb2RlID0gJ2JlbG93JztcbiAgICAgIH1cbiAgICAgIGlmIChzdHJpcEluZm8ubW9kZSA9PT0gJ2JlbG93Jykge1xuICAgICAgICB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbZGF0YS5rZXldLnN0cmlwSW5mbyA9IHtcbiAgICAgICAgICAuLi5zdHJpcEluZm8sXG4gICAgICAgICAgdmlzaWJpbGl0eU1vZGU6IHN0cmlwSW5mby52aXNpYmlsaXR5TW9kZSA9PT0gJ2hpZGRlbicgPyAndmlzaWJsZScgOiAnaGlkZGVuJyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKFxuICAgIGNvbnRlbnRzOiBOc0NvbnRlbnQuSUNvbnRlbnRbXSxcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgKSB7XG4gICAgcmV0dXJuIChjb250ZW50cyB8fCBbXSkubWFwKChjb250ZW50LCBpZHgpID0+IChcbiAgICAgIGNvbnRlbnQgPyB7XG4gICAgICAgIHdpZGdldFR5cGU6ICdjYXJkTGliJyxcbiAgICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NhcmRDb250ZW50TGliJyxcbiAgICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbWItMicsXG4gICAgICAgIHdpZGdldERhdGE6IHtcbiAgICAgICAgICBjb250ZW50LFxuICAgICAgICAgIC4uLihjb250ZW50LmJhdGNoICYmIHsgYmF0Y2g6IGNvbnRlbnQuYmF0Y2ggfSksXG4gICAgICAgICAgY2FyZFN1YlR5cGU6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmNhcmRTdWJUeXBlLFxuICAgICAgICAgIGNhcmRDdXN0b21lQ2xhc3M6IHN0cmlwLmN1c3RvbWVDbGFzcyA/IHN0cmlwLmN1c3RvbWVDbGFzcyA6ICcnLFxuICAgICAgICAgIGNvbnRleHQ6IHsgcGFnZVNlY3Rpb246IHN0cmlwLmtleSwgcG9zaXRpb246IGlkeCB9LFxuICAgICAgICAgIGludHJhbmV0TW9kZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuaW50cmFuZXRNb2RlLFxuICAgICAgICAgIGRlbGV0ZWRNb2RlOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5kZWxldGVkTW9kZSxcbiAgICAgICAgICBjb250ZW50VGFnczogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuY29udGVudFRhZ3MsXG4gICAgICAgIH0sXG4gICAgICB9IDoge1xuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZCcsXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjYXJkQ29udGVudCcsXG4gICAgICAgIHdpZGdldEhvc3RDbGFzczogJ21iLTInLFxuICAgICAgICB3aWRnZXREYXRhOiB7fSxcbiAgICAgIH1cbiAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtRXZlbnRzVG9XaWRnZXRzKFxuICAgIGNvbnRlbnRzOiBJVG9kYXlFdmVudHNbXSxcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgKSB7XG4gICAgdGhpcy5ldmVudFN2Yy5zZXRFdmVudExpc3REYXRhKGNvbnRlbnRzKTtcbiAgICByZXR1cm4gKHRoaXMuZXZlbnRTdmMudG9kYXlzRXZlbnRzIHx8IFtdKS5tYXAoKGNvbnRlbnQ6IGFueSwgaWR4OiBhbnkpID0+IChjb250ZW50ID8ge1xuICAgICAgd2lkZ2V0VHlwZTogJ2NhcmQnLFxuICAgICAgd2lkZ2V0U3ViVHlwZTogJ2V2ZW50SHViQ2FyZCcsXG4gICAgICB3aWRnZXRIb3N0Q2xhc3M6ICdtYi0yJyxcbiAgICAgIHdpZGdldERhdGE6IHtcbiAgICAgICAgY29udGVudCxcbiAgICAgICAgY2FyZFN1YlR5cGU6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmNhcmRTdWJUeXBlLFxuICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcbiAgICAgICAgY29udGV4dDogeyBwYWdlU2VjdGlvbjogc3RyaXAua2V5LCBwb3NpdGlvbjogaWR4IH0sXG4gICAgICAgIGludHJhbmV0TW9kZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuaW50cmFuZXRNb2RlLFxuICAgICAgICBkZWxldGVkTW9kZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuZGVsZXRlZE1vZGUsXG4gICAgICAgIGNvbnRlbnRUYWdzOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5jb250ZW50VGFncyxcbiAgICAgIH0sXG4gICAgfSA6IHtcbiAgICAgIHdpZGdldFR5cGU6ICdjYXJkJyxcbiAgICAgIHdpZGdldFN1YlR5cGU6ICdldmVudEh1YkNhcmQnLFxuICAgICAgd2lkZ2V0SG9zdENsYXNzOiAnbWItMicsXG4gICAgICB3aWRnZXREYXRhOiB7fSxcbiAgICB9XG4gICAgKSk7XG4gIH1cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Ta2VsZXRvblRvV2lkZ2V0cyhcbiAgICBzdHJpcDogYW55XG4gICkge1xuICAgIHJldHVybiBbMSwgMiwgMywgNCwgNSwgNiwgNywgNywgOCwgOSwgMTBdLm1hcChfY29udGVudCA9PiAoe1xuICAgICAgd2lkZ2V0VHlwZTogJ2NhcmRMaWInLFxuICAgICAgd2lkZ2V0U3ViVHlwZTogJ2NhcmRDb250ZW50TGliJyxcbiAgICAgIHdpZGdldEhvc3RDbGFzczogJ21iLTInLFxuICAgICAgd2lkZ2V0RGF0YToge1xuICAgICAgICBjYXJkU3ViVHlwZTogc3RyaXAubG9hZGVyQ29uZmlnICYmIHN0cmlwLmxvYWRlckNvbmZpZy5jYXJkU3ViVHlwZSB8fCAnY2FyZC1zdGFuZGFyZC1za2VsZXRvbicsXG4gICAgICAgIGNhcmRDdXN0b21lQ2xhc3M6IHN0cmlwLmN1c3RvbWVDbGFzcyA/IHN0cmlwLmN1c3RvbWVDbGFzcyA6ICcnLFxuICAgICAgfSxcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NTdHJpcChcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICByZXN1bHRzOiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoQW55RGF0YVtdID0gW10sXG4gICAgZmV0Y2hTdGF0dXM6IFRGZXRjaFN0YXR1cyxcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlLFxuICAgIF92aWV3TW9yZVVybDogYW55LFxuICAgIHRhYnNSZXN1bHRzPzogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVGFiW10gfCB1bmRlZmluZWQsXG4gICAgLy8gY2FsY3VsYXRlUGFyZW50U3RhdHVzIGlzIHVzZWQgc28gdGhhdCBwYXJlbnRzJyBzdGF0dXMgaXMgbm90IHJlLWNhbGN1bGF0ZWQgaWYgdGhlIEFQSSBpcyBjYWxsZWQgYWdhaW4gY296IG9mIGZpbHRlcnMsIGV0Yy5cbiAgKSB7XG4gICAgY29uc3Qgc3RyaXBEYXRhID0ge1xuICAgICAgdmlld01vcmVVcmw6IHN0cmlwLnZpZXdNb3JlVXJsLFxuICAgICAga2V5OiBzdHJpcC5rZXksXG4gICAgICBjYW5IaWRlU3RyaXA6IEJvb2xlYW4oc3RyaXAuY2FuSGlkZVN0cmlwKSxcbiAgICAgIHNob3dTdHJpcDogdGhpcy5nZXRJZlN0cmlwSGlkZGVuKHN0cmlwLmtleSksXG4gICAgICBub0RhdGFXaWRnZXQ6IHN0cmlwLm5vRGF0YVdpZGdldCxcbiAgICAgIGVycm9yV2lkZ2V0OiBzdHJpcC5lcnJvcldpZGdldCxcbiAgICAgIHN0cmlwSW5mbzogc3RyaXAuaW5mbyxcbiAgICAgIHN0cmlwVGl0bGU6IHN0cmlwLnRpdGxlLFxuICAgICAgc3RyaXBUaXRsZUxpbms6IHN0cmlwLnN0cmlwVGl0bGVMaW5rLFxuICAgICAgZGlzYWJsZVRyYW5zbGF0ZTogc3RyaXAuZGlzYWJsZVRyYW5zbGF0ZSxcbiAgICAgIHNsaWRlckNvbmZpZzogc3RyaXAuc2xpZGVyQ29uZmlnLFxuICAgICAgdGFiczogdGFic1Jlc3VsdHMgPyB0YWJzUmVzdWx0cyA6IHN0cmlwLnRhYnMsXG4gICAgICBzdHJpcE5hbWU6IHN0cmlwLm5hbWUsXG4gICAgICBtb2RlOiBzdHJpcC5tb2RlLFxuICAgICAgc3RyaXBDb25maWc6IHN0cmlwLnN0cmlwQ29uZmlnLFxuICAgICAgc3RyaXBCYWNrZ3JvdW5kOiBzdHJpcC5zdHJpcEJhY2tncm91bmQsXG4gICAgICBzZWNvbmRhcnlIZWFkaW5nOiBzdHJpcC5zZWNvbmRhcnlIZWFkaW5nLFxuICAgICAgbG9hZGVyV2lkZ2V0czogc3RyaXAubG9hZGVyV2lkZ2V0cyB8fCBbXSxcbiAgICAgIHdpZGdldHM6XG4gICAgICAgIGZldGNoU3RhdHVzID09PSAnZG9uZSdcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgIC4uLihzdHJpcC5wcmVXaWRnZXRzIHx8IFtdKS5tYXAodyA9PiAoe1xuICAgICAgICAgICAgICAuLi53LFxuICAgICAgICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6IGBtYi0yICR7dy53aWRnZXRIb3N0Q2xhc3N9YCxcbiAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIC4uLnJlc3VsdHMsXG4gICAgICAgICAgICAuLi4oc3RyaXAucG9zdFdpZGdldHMgfHwgW10pLm1hcCh3ID0+ICh7XG4gICAgICAgICAgICAgIC4uLncsXG4gICAgICAgICAgICAgIHdpZGdldEhvc3RDbGFzczogYG1iLTIgJHt3LndpZGdldEhvc3RDbGFzc31gLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICAgIF1cbiAgICAgICAgICA6IFtdLFxuICAgICAgc2hvd09uTm9EYXRhOiBCb29sZWFuKFxuICAgICAgICBzdHJpcC5ub0RhdGFXaWRnZXQgJiZcbiAgICAgICAgISgoc3RyaXAucHJlV2lkZ2V0cyB8fCBbXSkubGVuZ3RoICsgcmVzdWx0cy5sZW5ndGggKyAoc3RyaXAucG9zdFdpZGdldHMgfHwgW10pLmxlbmd0aCkgJiZcbiAgICAgICAgZmV0Y2hTdGF0dXMgPT09ICdkb25lJyxcbiAgICAgICksXG4gICAgICBzaG93T25Mb2FkZXI6IEJvb2xlYW4oc3RyaXAubG9hZGVyICYmIGZldGNoU3RhdHVzID09PSAnZmV0Y2hpbmcnKSxcbiAgICAgIHNob3dPbkVycm9yOiBCb29sZWFuKHN0cmlwLmVycm9yV2lkZ2V0ICYmIGZldGNoU3RhdHVzID09PSAnZXJyb3InKSxcbiAgICB9O1xuICAgIC8vIGNvbnN0IHN0cmlwRGF0YSA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldXG4gICAgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwID0ge1xuICAgICAgLi4udGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwLFxuICAgICAgW3N0cmlwLmtleV06IHN0cmlwRGF0YSxcbiAgICB9O1xuICAgIGlmICghdGFic1Jlc3VsdHMpIHtcbiAgICAgIGlmIChcbiAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzICYmXG4gICAgICAgIChmZXRjaFN0YXR1cyA9PT0gJ2RvbmUnIHx8IGZldGNoU3RhdHVzID09PSAnZXJyb3InKSAmJlxuICAgICAgICBzdHJpcERhdGEud2lkZ2V0c1xuICAgICAgKSB7XG4gICAgICAgIHRoaXMuY2hlY2tQYXJlbnRTdGF0dXMoZmV0Y2hTdGF0dXMsIHN0cmlwRGF0YS53aWRnZXRzLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBpZiAoY2FsY3VsYXRlUGFyZW50U3RhdHVzICYmICEocmVzdWx0cyAmJiByZXN1bHRzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgIHRoaXMuY29udGVudEF2YWlsYWJsZSA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHRzICYmIHJlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRBdmFpbGFibGUgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGNoZWNrUGFyZW50U3RhdHVzKGZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMsIHN0cmlwV2lkZ2V0c0NvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZmV0Y2hTdGF0dXMgPT09ICdkb25lJyAmJiAhc3RyaXBXaWRnZXRzQ291bnQpIHtcbiAgICAgIHRoaXMubm9EYXRhQ291bnQgKz0gMTtcbiAgICB9IGVsc2UgaWYgKGZldGNoU3RhdHVzID09PSAnZG9uZScgJiYgc3RyaXBXaWRnZXRzQ291bnQpIHtcbiAgICAgIHRoaXMuc3VjY2Vzc0RhdGFDb3VudCArPSAxO1xuICAgIH0gZWxzZSBpZiAoZmV0Y2hTdGF0dXMgPT09ICdlcnJvcicpIHtcbiAgICAgIHRoaXMuZXJyb3JEYXRhQ291bnQgKz0gMTtcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlZENvdW50ID0gdGhpcy5ub0RhdGFDb3VudCArIHRoaXMuc3VjY2Vzc0RhdGFDb3VudCArIHRoaXMuZXJyb3JEYXRhQ291bnQ7XG4gICAgY29uc3QgdG90YWxDb3VudCA9IHRoaXMud2lkZ2V0RGF0YS5zdHJpcHMubGVuZ3RoO1xuICAgIGlmICh0aGlzLnN1Y2Nlc3NEYXRhQ291bnQgPiAwICYmIHNldHRsZWRDb3VudCA8IHRvdGFsQ291bnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zaG93UGFyZW50TG9hZGVyID0gc2V0dGxlZENvdW50ICE9PSB0b3RhbENvdW50O1xuICAgIHRoaXMuc2hvd1BhcmVudE5vRGF0YSA9XG4gICAgICB0aGlzLm5vRGF0YUNvdW50ID4gMCAmJiB0aGlzLm5vRGF0YUNvdW50ICsgdGhpcy5lcnJvckRhdGFDb3VudCA9PT0gdG90YWxDb3VudDtcbiAgICB0aGlzLnNob3dQYXJlbnRFcnJvciA9IHRoaXMuZXJyb3JEYXRhQ291bnQgPT09IHRvdGFsQ291bnQ7XG4gIH1cbiAgY2hlY2tGb3JFbXB0eVdpZGdldChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgIHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICgoc3RyaXAucmVxdWVzdC5hcGkgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5hcGkpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3Quc2VhcmNoICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3Quc2VhcmNoKS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LnNlYXJjaFJlZ2lvblJlY29tbWVuZGF0aW9uICYmXG4gICAgICAgICAgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5zZWFyY2hSZWdpb25SZWNvbW1lbmRhdGlvbikubGVuZ3RoKSB8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5zZWFyY2hWNiAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2KS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LmVucm9sbG1lbnRMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuZW5yb2xsbWVudExpc3QpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmNicExpc3QpLmxlbmd0aCkgfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2ggJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaCkubGVuZ3RoKXx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LnRvcENvbnRlbnQgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC50b3BDb250ZW50KS5sZW5ndGgpIHx8XG4gICAgICAgIChzdHJpcC5yZXF1ZXN0LmZlYXR1cmVDb250ZW50ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuZmVhdHVyZUNvbnRlbnQpLmxlbmd0aCl8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5ib29rbWFya1JlYWQgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5ib29rbWFya1JlYWQpLmxlbmd0aCl8fFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5wbGF5bGlzdFNlYXJjaCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnBsYXlsaXN0U2VhcmNoKS5sZW5ndGgpfHxcbiAgICAgICAgKHN0cmlwLnJlcXVlc3QucGxheWxpc3RSZWFkICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QucGxheWxpc3RSZWFkKS5sZW5ndGgpIHx8IFxuICAgICAgICAoc3RyaXAucmVxdWVzdC5jaW9zQ29udGVudCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmNpb3NDb250ZW50KS5sZW5ndGgpfHxcbiAgICAgICAgKHN0cmlwICYmIHN0cmlwLnRhYnMubGVuZ3RoKVxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHB1YmxpYyB0YWJDbGlja2VkKHRhYkV2ZW50OiBNYXRUYWJDaGFuZ2VFdmVudCwgc3RyaXBNYXA6IElTdHJpcFVuaXRDb250ZW50RGF0YSwgc3RyaXBLZXk6IHN0cmluZykge1xuICAvLyAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdKSB7XG4gIC8vICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdpbnByb2dyZXNzJztcbiAgLy8gICAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnRhYkxvYWRpbmcgPSB0cnVlO1xuICAvLyAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gdHJ1ZTtcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgZGF0YTogV3NFdmVudHMuSVRlbGVtZXRyeVRhYkRhdGEgPSB7XG4gIC8vICAgICBsYWJlbDogYCR7dGFiRXZlbnQudGFiLnRleHRMYWJlbH1gLFxuICAvLyAgICAgaW5kZXg6IHRhYkV2ZW50LmluZGV4LFxuICAvLyAgIH07XG4gIC8vICAgdGhpcy5ldmVudFN2Yy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAvLyAgICAge1xuICAvLyAgICAgICB0eXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RUeXBlcy5DTElDSyxcbiAgLy8gICAgICAgc3ViVHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuSE9NRV9QQUdFX1NUUklQX1RBQlMsXG4gIC8vICAgICAgIGlkOiBgJHtfLmNhbWVsQ2FzZShkYXRhLmxhYmVsKX0tdGFiYCxcbiAgLy8gICAgIH0sXG4gIC8vICAgICB7fSxcbiAgLy8gICAgIHtcbiAgLy8gICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5IT01FLFxuICAvLyAgICAgfVxuICAvLyAgICk7XG4gIC8vICAgY29uc3QgY3VycmVudFRhYkZyb21NYXA6IGFueSA9IHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF07XG4gIC8vICAgY29uc3QgY3VycmVudFN0cmlwID0gdGhpcy53aWRnZXREYXRhLnN0cmlwcy5maW5kKHMgPT4gcy5rZXkgPT09IHN0cmlwS2V5KTtcbiAgLy8gICBpZiAodGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XSAmJiBjdXJyZW50VGFiRnJvbU1hcCkge1xuICAvLyAgICAgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyA9IHtcbiAgLy8gICAgICAgLi4udGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgLy8gICAgICAgdGFiU2VsZWN0ZWQ6IGN1cnJlbnRUYWJGcm9tTWFwLmxhYmVsLFxuICAvLyAgICAgfTtcbiAgLy8gICB9XG4gIC8vICAgaWYgKGN1cnJlbnRTdHJpcCAmJiBjdXJyZW50VGFiRnJvbU1hcCAmJiAhY3VycmVudFRhYkZyb21NYXAuY29tcHV0ZURhdGFPbkNsaWNrKSB7XG4gIC8vICAgICBpZiAoY3VycmVudFRhYkZyb21NYXAucmVxdWVzdFJlcXVpcmVkICYmIGN1cnJlbnRUYWJGcm9tTWFwLnJlcXVlc3QpIHtcbiAgLy8gICAgICAgLy8gY2FsbCBBUEkgdG8gZ2V0IHRhYiBkYXRhIGFuZCBwcm9jZXNzXG4gIC8vICAgICAgIC8vIHRoaXMucHJvY2Vzc1N0cmlwKGN1cnJlbnRTdHJpcCwgW10sICdmZXRjaGluZycsIHRydWUsIG51bGwpXG4gIC8vICAgICAgIGlmIChjdXJyZW50VGFiRnJvbU1hcC5yZXF1ZXN0LnNlYXJjaFY2KSB7XG4gIC8vICAgICAgICAgdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihjdXJyZW50U3RyaXAsIHRhYkV2ZW50LmluZGV4LCBjdXJyZW50VGFiRnJvbU1hcCwgdHJ1ZSk7XG4gIC8vICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFRhYkZyb21NYXAucmVxdWVzdC50cmVuZGluZ1NlYXJjaCkge1xuICAvLyAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxVHJlbmRpbmcoY3VycmVudFN0cmlwLCB0YWJFdmVudC5pbmRleCwgMCwgY3VycmVudFRhYkZyb21NYXAsIHRydWUpO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdKSB7XG4gIC8vICAgICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAvLyAgICAgICB9XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICB0aGlzLmdldFRhYkRhdGFCeWZpbHRlcihjdXJyZW50U3RyaXAsIGN1cnJlbnRUYWJGcm9tTWFwLCB0cnVlKTtcbiAgLy8gICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0pIHtcbiAgLy8gICAgICAgICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAvLyAgICAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdkb25lJztcbiAgLy8gICAgICAgICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gZmFsc2U7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9LCAgICAgICAgIDIwMCk7XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cblxuICAvLyBhc3luYyBnZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihcbiAgLy8gICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgLy8gICB0YWJJbmRleDogbnVtYmVyLFxuICAvLyAgIGN1cnJlbnRUYWI6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYixcbiAgLy8gICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgLy8gKSB7XG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5zZWFyY2hWNlJlcXVlc3Qoc3RyaXAsIGN1cnJlbnRUYWIucmVxdWVzdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgLy8gICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzKSB7XG4gIC8vICAgICAgIGNvbnN0IHdpZGdldHMgPSB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmNvbnRlbnQsIHN0cmlwKTtcbiAgLy8gICAgICAgbGV0IHRhYlJlc3VsdHM6IGFueVtdID0gW107XG4gIC8vICAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzKSB7XG4gIC8vICAgICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnM7XG4gIC8vICAgICAgICAgaWYgKGFsbFRhYnMgJiYgYWxsVGFicy5sZW5ndGggJiYgYWxsVGFic1t0YWJJbmRleF0pIHtcbiAgLy8gICAgICAgICAgIGFsbFRhYnNbdGFiSW5kZXhdID0ge1xuICAvLyAgICAgICAgICAgICAuLi5hbGxUYWJzW3RhYkluZGV4XSxcbiAgLy8gICAgICAgICAgICAgd2lkZ2V0cyxcbiAgLy8gICAgICAgICAgICAgZmV0Y2hUYWJTdGF0dXM6ICdkb25lJyxcbiAgLy8gICAgICAgICAgIH07XG4gIC8vICAgICAgICAgICB0YWJSZXN1bHRzID0gYWxsVGFicztcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gIC8vICAgICAgICAgc3RyaXAsXG4gIC8vICAgICAgICAgd2lkZ2V0cyxcbiAgLy8gICAgICAgICAnZG9uZScsXG4gIC8vICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAvLyAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAvLyAgICAgICAgIHRhYlJlc3VsdHMgLy8gdGFiUmVzdWx0cyBhcyB3aWRnZXRzXG4gIC8vICAgICAgICk7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gIC8vICAgICB9XG4gIC8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgLy8gICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICAvLyBhc3luYyBnZXRUYWJEYXRhQnlOZXdSZXFUcmVuZGluZyhcbiAgLy8gICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgLy8gICB0YWJJbmRleDogbnVtYmVyLFxuICAvLyAgIGN1cnJlbnRUYWI6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYixcbiAgLy8gICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgLy8gKSB7XG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50cmVuZGluZ1NlYXJjaFJlcXVlc3Qoc3RyaXAsIGN1cnJlbnRUYWIucmVxdWVzdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgLy8gICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzICYmIHJlc3BvbnNlLnJlc3VsdHMucmVzcG9uc2UpIHtcbiAgLy8gICAgICAgY29uc3QgY29udGVudCA9IHJlc3BvbnNlLnJlc3VsdHMucmVzcG9uc2VbY3VycmVudFRhYi52YWx1ZV0gfHwgW107XG4gIC8vICAgICAgIGNvbnN0IHdpZGdldHMgPSB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvbnRlbnQsIHN0cmlwKTtcbiAgLy8gICAgICAgLy8gY29uc29sZS5sb2coJ2N1cnJlbnRUYWIgLS0tIHdpZGdldHMnLCB3aWRnZXRzKVxuICAvLyAgICAgICBsZXQgdGFiUmVzdWx0czogYW55W10gPSBbXTtcbiAgLy8gICAgICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldICYmIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnMpIHtcbiAgLy8gICAgICAgICBjb25zdCBhbGxUYWJzID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicztcbiAgLy8gICAgICAgICBpZiAoYWxsVGFicyAmJiBhbGxUYWJzLmxlbmd0aCAmJiBhbGxUYWJzW3RhYkluZGV4XSkge1xuICAvLyAgICAgICAgICAgYWxsVGFic1t0YWJJbmRleF0gPSB7XG4gIC8vICAgICAgICAgICAgIC4uLmFsbFRhYnNbdGFiSW5kZXhdLFxuICAvLyAgICAgICAgICAgICB3aWRnZXRzLFxuICAvLyAgICAgICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAvLyAgICAgICAgICAgfTtcbiAgLy8gICAgICAgICAgIHRhYlJlc3VsdHMgPSBhbGxUYWJzO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgfVxuICAvLyAgICAgICAvLyBjb25zb2xlLmxvZygndGFiUmVzdWx0cyAtKysrKyoqKi0tJywgdGFiUmVzdWx0cylcbiAgLy8gICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyLS0gJylcbiAgLy8gICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gIC8vICAgICAgICAgc3RyaXAsXG4gIC8vICAgICAgICAgd2lkZ2V0cyxcbiAgLy8gICAgICAgICAnZG9uZScsXG4gIC8vICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAvLyAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAvLyAgICAgICAgIHRhYlJlc3VsdHMgLy8gdGFiUmVzdWx0cyBhcyB3aWRnZXRzXG4gIC8vICAgICAgICk7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdkb25lJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAvLyAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGdldFRhYkRhdGFCeWZpbHRlcihcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICBjdXJyZW50VGFiOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWIsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBib29sZWFuXG4gICkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnc3RyaXAgLS0gJywgc3RyaXApO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZygnY3VycmVudFRhYiAtLSAnLCBjdXJyZW50VGFiKTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgY29uc29sZS5sb2coJ2NhbGN1bGF0ZVBhcmVudFN0YXR1cy0tICcsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgLy8gVE9ETzogV3JpdGUgbG9naWMgZm9yIGluZGl2aWR1YWwgZmlsdGVyIGlmIHBhc3NlZCBpbiBjb25maWdcbiAgICAvLyBhZGQgc3dpdGNoIGNhc2UgYmFzZWQgb24gY29uZmlnIGtleSBwYXNzZWRcbiAgfVxuXG4gIC8vIGFzeW5jIGZldGNoQWxsQ2JwUGxhbnMoc3RyaXA6IGFueSwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuXG4gIC8vICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5jYnBMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCkubGVuZ3RoKSB7XG5cbiAgLy8gICAgIGxldCBjb3Vyc2VzOiBOc0NvbnRlbnQuSUNvbnRlbnRbXTtcbiAgLy8gICAgIGxldCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAvLyAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVzZXJTdmMuZmV0Y2hDYnBQbGFuTGlzdCgpLnRvUHJvbWlzZSgpO1xuICAvLyAgICAgaWYgKHJlc3BvbnNlKSB7XG4gIC8vICAgICAgICAgICBjb3Vyc2VzID0gcmVzcG9uc2U7XG4gIC8vICAgICAgICAgICBpZiAoc3RyaXAudGFicyAmJiBzdHJpcC50YWJzLmxlbmd0aCkge1xuICAvLyAgICAgICAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdENicFRhYnNEYXRhKGNvdXJzZXMsIHN0cmlwKTtcbiAgLy8gICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaXAoXG4gIC8vICAgICAgICAgICAgICAgc3RyaXAsXG4gIC8vICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb3Vyc2VzLCBzdHJpcCksXG4gIC8vICAgICAgICAgICAgICAgJ2RvbmUnLFxuICAvLyAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgLy8gICAgICAgICAgICAgICAnJyxcbiAgLy8gICAgICAgICAgICAgICB0YWJSZXN1bHRzXG4gIC8vICAgICAgICAgICAgICk7XG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgLy8gICAgICAgICAgICAgICBzdHJpcCxcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvdXJzZXMsIHN0cmlwKSxcbiAgLy8gICAgICAgICAgICAgICAnZG9uZScsXG4gIC8vICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAvLyAgICAgICAgICAgICAgICd2aWV3TW9yZVVybCcsXG4gIC8vICAgICAgICAgICAgICk7XG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICB9XG4gIC8vICAgICAvLyB0aGlzLnVzZXJTdmMuZmV0Y2hDYnBQbGFuTGlzdCgpLnN1YnNjcmliZSggYXN5bmMgIChyZXM6IGFueSkgPT4ge1xuICAvLyAgICAgLy8gICBpZiAocmVzKSB7XG4gIC8vICAgICAvLyAgICAgY29uc29sZS5sb2cocmVzLCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PicpXG4gIC8vICAgICAvLyAgICAgY291cnNlcyA9IHJlc1xuICAvLyAgICAgLy8gICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gIC8vICAgICAvLyAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdENicFRhYnNEYXRhKGNvdXJzZXMsIHN0cmlwKVxuICAvLyAgICAgLy8gICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaXAoXG4gIC8vICAgICAvLyAgICAgICAgIHN0cmlwLFxuICAvLyAgICAgLy8gICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvdXJzZXMsIHN0cmlwKSxcbiAgLy8gICAgIC8vICAgICAgICAgJ2RvbmUnLFxuICAvLyAgICAgLy8gICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gIC8vICAgICAvLyAgICAgICAgICcnLFxuICAvLyAgICAgLy8gICAgICAgICB0YWJSZXN1bHRzXG4gIC8vICAgICAvLyAgICAgICApXG4gIC8vICAgICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgIC8vICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAvLyAgICAgLy8gICAgICAgICBzdHJpcCxcbiAgLy8gICAgIC8vICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb3Vyc2VzLCBzdHJpcCksXG4gIC8vICAgICAvLyAgICAgICAgICdkb25lJyxcbiAgLy8gICAgIC8vICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAvLyAgICAgLy8gICAgICAgICAndmlld01vcmVVcmwnLFxuICAvLyAgICAgLy8gICAgICAgKVxuICAvLyAgICAgLy8gICAgIH1cbiAgLy8gICAgIC8vICAgfVxuICAvLyAgICAgLy8gfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lcnI6IGFueSkgPT4ge1xuXG4gIC8vICAgICAvLyB9KVxuXG4gIC8vICAgICBjbGVhckludGVydmFsKHRoaXMuZW5yb2xsSW50ZXJ2YWwpO1xuICAvLyAgIH1cbiAgLy8gfVxuICAvLyBzcGxpdENicFRhYnNEYXRhKGNvbnRlbnROZXc6IE5zQ29udGVudC5JQ29udGVudFtdLCBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCkge1xuICAvLyAgIGNvbnN0IHRhYlJlc3VsdHM6IGFueVtdID0gW107XG4gIC8vICAgY29uc3Qgc3BsaXREYXRhID0gdGhpcy5nZXRUYWJzTGlzdChcbiAgLy8gICAgIGNvbnRlbnROZXcsXG4gIC8vICAgICBzdHJpcCxcbiAgLy8gICApO1xuICAvLyAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gIC8vICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmlwLnRhYnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgLy8gICAgICAgaWYgKHN0cmlwLnRhYnNbaV0pIHtcbiAgLy8gICAgICAgICB0YWJSZXN1bHRzLnB1c2goXG4gIC8vICAgICAgICAgICB7XG4gIC8vICAgICAgICAgICAgIC4uLnN0cmlwLnRhYnNbaV0sXG4gIC8vICAgICAgICAgICAgIGZldGNoVGFiU3RhdHVzOiAnZG9uZScsXG4gIC8vICAgICAgICAgICAgIC4uLihzcGxpdERhdGEuZmluZChpdG1Jbm5lciA9PiB7XG4gIC8vICAgICAgICAgICAgICAgaWYgKHN0cmlwLnRhYnMgJiYgc3RyaXAudGFic1tpXSAmJiBpdG1Jbm5lci52YWx1ZSA9PT0gc3RyaXAudGFic1tpXS52YWx1ZSkge1xuICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuIGl0bUlubmVyO1xuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAvLyAgICAgICAgICAgICB9KSksXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgKTtcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICByZXR1cm4gdGFiUmVzdWx0cztcbiAgLy8gfVxuXG4gIC8vIGdldFRhYnNMaXN0KGFycmF5OiBOc0NvbnRlbnQuSUNvbnRlbnRbXSxcbiAgLy8gICAgICAgICAgICAgc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQpIHtcbiAgLy8gICBsZXQgYWxsOiBhbnlbXSA9IFtdO1xuICAvLyAgIGxldCB1cGNvbWluZzogYW55W10gPSBbXTtcbiAgLy8gICBsZXQgb3ZlcmR1ZTogYW55W10gPSBbXTtcbiAgLy8gICBhcnJheS5mb3JFYWNoKChlOiBhbnkpID0+IHtcbiAgLy8gICAgIGFsbC5wdXNoKGUpO1xuICAvLyAgICAgaWYgKGUucGxhbkR1cmF0aW9uID09PSBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5PVkVSRFVFKSB7XG4gIC8vICAgICAgIG92ZXJkdWUucHVzaChlKTtcbiAgLy8gICAgIH0gZWxzZSBpZiAoZS5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0LlVQQ09NSU5HKSB7XG4gIC8vICAgICAgIHVwY29taW5nLnB1c2goZSk7XG4gIC8vICAgICB9XG4gIC8vICAgfSk7XG4gIC8vICAgY29uc3QgYWxsQ29tcGxldGVkID0gYWxsLmZpbHRlcigoYWxsRGF0YTogYW55KSA9PiBhbGxEYXRhLmNvbnRlbnRTdGF0dXMgPT09IDIpO1xuICAvLyAgIGxldCBhbGxJbkNvbXBsZXRlZCA9IGFsbC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gYWxsRGF0YS5jb250ZW50U3RhdHVzIDwgMik7XG5cbiAgLy8gICBsZXQgYWxsQ29tcGxldGVkT3ZlckR1ZSA9IGFsbENvbXBsZXRlZC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gYWxsRGF0YS5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUpO1xuICAvLyAgIGNvbnN0IGFsbENvbXBsZXRlZEFsbCA9IGFsbENvbXBsZXRlZC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gIGFsbERhdGEucGxhbkR1cmF0aW9uICE9PSBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5PVkVSRFVFKTtcblxuICAvLyAgIGFsbENvbXBsZXRlZE92ZXJEdWUgPSBhbGxDb21wbGV0ZWRPdmVyRHVlLnNvcnQoKGE6IGFueSwgYjogYW55KTogYW55ID0+IHtcbiAgLy8gICAgIGlmIChhLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSAmJiBiLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSkge1xuICAvLyAgICAgICBjb25zdCBmaXJzdERhdGU6IGFueSA9IG5ldyBEYXRlKGEuZW5kRGF0ZSk7XG4gIC8vICAgICAgIGNvbnN0IHNlY29uZERhdGU6IGFueSA9IG5ldyBEYXRlKGIuZW5kRGF0ZSk7XG4gIC8vICAgICAgIHJldHVybiAgZmlyc3REYXRlID4gc2Vjb25kRGF0ZSAgPyAtMSA6IDE7XG4gIC8vICAgICB9XG4gIC8vICAgfSk7XG5cbiAgLy8gICBhbGxJbkNvbXBsZXRlZCA9IGFsbEluQ29tcGxldGVkLnNvcnQoKGE6IGFueSwgYjogYW55KTogYW55ID0+IHtcbiAgLy8gICAgIGlmIChhLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSAmJiBiLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSkge1xuICAvLyAgICAgICBjb25zdCBmaXJzdERhdGU6IGFueSA9IG5ldyBEYXRlKGEuZW5kRGF0ZSk7XG4gIC8vICAgICAgIGNvbnN0IHNlY29uZERhdGU6IGFueSA9IG5ldyBEYXRlKGIuZW5kRGF0ZSk7XG4gIC8vICAgICAgIHJldHVybiAgZmlyc3REYXRlID4gc2Vjb25kRGF0ZSAgPyAtMSA6IDE7XG4gIC8vICAgICB9XG4gIC8vICAgfSk7XG5cbiAgLy8gICBhbGwgPSBbLi4uYWxsSW5Db21wbGV0ZWQsIC4uLmFsbENvbXBsZXRlZEFsbCwgLi4uYWxsQ29tcGxldGVkT3ZlckR1ZV07XG5cbiAgLy8gICBvdmVyZHVlID0gb3ZlcmR1ZS5maWx0ZXIoKGRhdGE6IGFueSk6IGFueSA9PiB7XG4gIC8vICAgICByZXR1cm4gZGF0YS5jb250ZW50U3RhdHVzIDwgMjtcbiAgLy8gICB9KTtcblxuICAvLyAgIG92ZXJkdWUgPSBvdmVyZHVlLnNvcnQoKGE6IGFueSwgYjogYW55KTogYW55ID0+IHtcbiAgLy8gICAgICAgY29uc3QgZmlyc3REYXRlOiBhbnkgPSBuZXcgRGF0ZShhLmVuZERhdGUpO1xuICAvLyAgICAgICBjb25zdCBzZWNvbmREYXRlOiBhbnkgPSBuZXcgRGF0ZShiLmVuZERhdGUpO1xuICAvLyAgICAgICByZXR1cm4gIGZpcnN0RGF0ZSA+IHNlY29uZERhdGUgID8gLTEgOiAxO1xuICAvLyAgIH0pO1xuXG4gIC8vICAgdXBjb21pbmcgPSB1cGNvbWluZy5maWx0ZXIoKGRhdGE6IGFueSk6IGFueSA9PiB7XG4gIC8vICAgICByZXR1cm4gZGF0YS5jb250ZW50U3RhdHVzIDwgMjtcbiAgLy8gICB9KTtcbiAgLy8gICAvLyB0aGlzLmdldFNlbGVjdGVkSW5kZXgoMSlcbiAgLy8gICByZXR1cm4gW1xuICAvLyAgIHsgdmFsdWU6ICdhbGwnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGFsbCwgc3RyaXApIH0sXG4gIC8vICAgeyB2YWx1ZTogJ3VwY29taW5nJywgd2lkZ2V0czogdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyh1cGNvbWluZywgc3RyaXApIH0sXG4gIC8vICAgeyB2YWx1ZTogJ292ZXJkdWUnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKG92ZXJkdWUsIHN0cmlwKSB9XTtcbiAgLy8gfVxuXG4gIGdldFNlbGVjdGVkSW5kZXgoc3RyaXBzUmVzdWx0RGF0YU1hcDogYW55LCBrZXk6IGFueSk6IG51bWJlciB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gMDtcbiAgICAvLyBpZiAoa2V5ID09PSAnY2JwUGxhbicpIHtcbiAgICAvLyAgIGlmIChzdHJpcHNSZXN1bHREYXRhTWFwLnRhYnMubGVuZ3RoKSB7XG4gICAgLy8gICAgIGNvbnN0IGRhdGEgPSBzdHJpcHNSZXN1bHREYXRhTWFwLnRhYnMuZmlsdGVyKChlbGU6IGFueSkgPT4gZWxlLnZhbHVlID09PSAndXBjb21pbmcnKTtcbiAgICAvLyAgICAgcmV0dXJuVmFsdWUgPSBkYXRhWzBdLndpZGdldHMgJiYgZGF0YVswXS53aWRnZXRzLmxlbmd0aCA+IDAgPyAxIDogMDtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKTtcbiAgfVxuXG4gIGlkZW50aWZ5KGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIGlmIChpbmRleCA+PSAwKSB7IH1cbiAgICByZXR1cm4gaXRlbTtcbiAgfVxuICB0cmFja2VyKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICAgIGlmIChpbmRleCA+PSAwKSB7IH1cbiAgICByZXR1cm4gXy5nZXQoaXRlbSwgJ3dpZGdldERhdGEuY29udGVudC5pZGVudGlmaWVyJylcbiAgfVxuXG4gIGFzeW5jIGZldGNoQWxsVG9wQ29udGVudChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3QudG9wQ29udGVudCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnRvcENvbnRlbnQpLmxlbmd0aCkge1xuICAgICAgbGV0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgICBpZiAoc3RyaXAucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRvcENvbnRlbnQgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC50b3BDb250ZW50LnJlcXVlc3QgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC50b3BDb250ZW50LnJlcXVlc3QuZmlsdGVycykge1xuICAgICAgICBvcmlnaW5hbEZpbHRlcnMgPSBzdHJpcC5yZXF1ZXN0LnRvcENvbnRlbnQucmVxdWVzdC5maWx0ZXJzO1xuICAgICAgICBzdHJpcC5yZXF1ZXN0LnRvcENvbnRlbnQucmVxdWVzdC5maWx0ZXJzID0gdGhpcy5wb3N0TWV0aG9kRmlsdGVycyhzdHJpcC5yZXF1ZXN0LnRvcENvbnRlbnQucmVxdWVzdC5maWx0ZXJzKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5wb3N0UmVxdWVzdE1ldGhvZChzdHJpcCwgc3RyaXAucmVxdWVzdC50b3BDb250ZW50LCBzdHJpcC5yZXF1ZXN0LmFwaVVybCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyIC0gcmVzcG9uc2UsICcsIHJlc3BvbnNlKVxuICAgICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0cykge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsaW5nICBhZnRlci0tICcpXG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmNvbnRlbnQgJiYgcmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuY29udGVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50LCBzdHJpcCksXG4gICAgICAgICAgICAgICdkb25lJyxcbiAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICByZXNwb25zZS52aWV3TW9yZVVybCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZldGNoQWxsRmVhdHVyZWRDb250ZW50KHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5mZWF0dXJlQ29udGVudCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LmZlYXR1cmVDb250ZW50KS5sZW5ndGgpIHtcbiAgICAgIGxldCBvcmlnaW5hbEZpbHRlcnM6IGFueSA9IFtdO1xuICAgICAgaWYgKHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5mZWF0dXJlQ29udGVudCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LmZlYXR1cmVDb250ZW50LnJlcXVlc3QgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5mZWF0dXJlQ29udGVudC5yZXF1ZXN0LmZpbHRlcnMpIHtcbiAgICAgICAgb3JpZ2luYWxGaWx0ZXJzID0gc3RyaXAucmVxdWVzdC5mZWF0dXJlQ29udGVudC5yZXF1ZXN0LmZpbHRlcnM7XG4gICAgICAgIHN0cmlwLnJlcXVlc3QuZmVhdHVyZUNvbnRlbnQucmVxdWVzdC5maWx0ZXJzID0gdGhpcy5wb3N0TWV0aG9kRmlsdGVycyhzdHJpcC5yZXF1ZXN0LmZlYXR1cmVDb250ZW50LnJlcXVlc3QuZmlsdGVycyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucG9zdFJlcXVlc3RNZXRob2Qoc3RyaXAsIHN0cmlwLnJlcXVlc3QuZmVhdHVyZUNvbnRlbnQsIHN0cmlwLnJlcXVlc3QuYXBpVXJsLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnY2FsbGluZyAgYWZ0ZXIgLSByZXNwb25zZSwgJywgcmVzcG9uc2UpXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyLS0gJylcbiAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuY29udGVudCAmJiByZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmNvbnRlbnQsIHN0cmlwKSxcbiAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7ICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlVGVsZW1ldHJ5KHN0cmlwRGF0YTogYW55KXtcbiAgICB0aGlzLnRlbGVtdHJ5UmVzcG9uc2UuZW1pdChzdHJpcERhdGEpXG4gIH1cblxuICBhc3luYyBwb3N0UmVxdWVzdE1ldGhvZChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICByZXF1ZXN0OiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0WydyZXF1ZXN0J10sXG4gICAgYXBpVXJsOiBzdHJpbmcsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBib29sZWFuXG4gICk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKHJlcXVlc3QgJiYgcmVxdWVzdCkge1xuICAgICAgICB0aGlzLmNvbnRlbnRTdmMucG9zdEFwaU1ldGhvZChhcGlVcmwscmVxdWVzdCkuc3Vic2NyaWJlKHJlc3VsdHMgPT4ge1xuICAgICAgICBpZihyZXN1bHRzLnJlc3VsdCAmJiByZXN1bHRzLnJlc3VsdC5jb250ZW50KSB7XG4gICAgICAgICAgY29uc3Qgc2hvd1ZpZXdNb3JlID0gQm9vbGVhbihcbiAgICAgICAgICAgIHJlc3VsdHMucmVzdWx0LmNvbnRlbnQgJiYgcmVzdWx0cy5yZXN1bHQuY29udGVudC5sZW5ndGggPiA1ICYmIHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLnBvc3RDYXJkRm9yU2VhcmNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnBhdGggfHwgJycsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgdGFiOiAnTGVhcm4nLFxuICAgICAgICAgICAgcTogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBmOnt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUoeyByZXN1bHRzLCB2aWV3TW9yZVVybCB9KTtcbiAgICAgICAgfSBlbHNlIGlmKHJlc3VsdHMgJiYgcmVzdWx0cy5kYXRhKXtcbiAgICAgICAgICBjb25zdCBzaG93Vmlld01vcmUgPSBCb29sZWFuKFxuICAgICAgICAgICAgcmVzdWx0cy5kYXRhICYmIHJlc3VsdHMuZGF0YS5sZW5ndGggPiA1ICYmIHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLnBvc3RDYXJkRm9yU2VhcmNoLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlPyB7XG4gICAgICAgICAgICBwYXRoOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5wYXRoIHx8ICcnLFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHtcbiAgICAgICAgICAgIHRhYjogJ0xlYXJuJyxcbiAgICAgICAgICAgIHE6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zLFxuICAgICAgICAgICAgZjoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgcmVzb2x2ZSh7IHJlc3VsdHMsIHZpZXdNb3JlVXJsIH0pO1xuICAgICAgICB9IGVsc2UgaWYocmVzdWx0cy5yZXN1bHQgJiYgcmVzdWx0cy5yZXN1bHQuZGF0YSl7XG4gICAgICAgICAgY29uc3Qgc2hvd1ZpZXdNb3JlID0gQm9vbGVhbihcbiAgICAgICAgICAgIHJlc3VsdHMuZGF0YSAmJiByZXN1bHRzLnJlc3VsdC5kYXRhICYmIHJlc3VsdHMucmVzdWx0LmRhdGEubGVuZ3RoID4gNSAmJiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCB2aWV3TW9yZVVybCA9IHNob3dWaWV3TW9yZT8ge1xuICAgICAgICAgICAgcGF0aDogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucGF0aCB8fCAnJyxcbiAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgICAgICB0YWI6ICdMZWFybicsXG4gICAgICAgICAgICBxOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgIGY6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIHJlc29sdmUoeyByZXN1bHRzLCB2aWV3TW9yZVVybCB9KTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRSZXF1ZXN0TWV0aG9kKHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LFxuICAgIHJlcXVlc3Q6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXRbJ3JlcXVlc3QnXSxcbiAgICBhcGlVcmw6IHN0cmluZyxcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBvcmlnaW5hbEZpbHRlcnM6IGFueSA9IFtdO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3QpIHtcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmdldEFwaU1ldGhvZChhcGlVcmwpLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3Qgc2hvd1ZpZXdNb3JlID0gQm9vbGVhbihcbiAgICAgICAgcmVzdWx0cy5yZXN1bHQuZGF0YSAmJiByZXN1bHRzLnJlc3VsdC5kYXRhLm9yZ0xpc3QubGVuZ3RoID4gNSAmJiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgdmlld01vcmVVcmwgPSBzaG93Vmlld01vcmVcbiAgICAgICAgPyB7XG4gICAgICAgIHBhdGg6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnBhdGggfHwgJycsXG4gICAgICAgIH1cbiAgICAgICAgOiBudWxsO1xuICAgICAgICByZXNvbHZlKHsgcmVzdWx0cywgdmlld01vcmVVcmwgfSk7XG4gICAgICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcG9zdE1ldGhvZEZpbHRlcnMoZmlsdGVyczogYW55KXtcbiAgICBpZiAoZmlsdGVycy5vcmdhbmlzYXRpb24gJiZcbiAgICAgIGZpbHRlcnMub3JnYW5pc2F0aW9uLmluZGV4T2YoJzxvcmdJRD4nKSA+PSAwXG4gICAgKSB7XG4gICAgICBmaWx0ZXJzLm9yZ2FuaXNhdGlvbiA9IHRoaXMucHJvdmlkZXJJZFxuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyc1xuICB9XG4gIGdldEZ1bGxVcmwoYXBpVXJsOiBhbnksIGlkOnN0cmluZyl7XG4gICAgbGV0IGZvcm1lZFVybDogc3RyaW5nID0gJydcbiAgICBpZiAoYXBpVXJsLmluZGV4T2YoJzxib29rbWFya0lkPicpID49IDApIHtcbiAgICAgIGZvcm1lZFVybCA9IGFwaVVybC5yZXBsYWNlKCc8Ym9va21hcmtJZD4nLCB0aGlzLmVudmlyb25tZW50Lm1kb0NoYW5uZWxzQm9va21hcmtJZCkgXG4gICAgfSBlbHNlIGlmIChhcGlVcmwuaW5kZXhPZignPHBsYXlsaXN0S2V5PicpID49IDAgJiYgYXBpVXJsLmluZGV4T2YoJzxvcmdJRD4nKSA+PSAwKSB7XG4gICAgICBmb3JtZWRVcmwgPSBhcGlVcmwucmVwbGFjZSgnPHBsYXlsaXN0S2V5PicsIHRoaXMucHJvdmlkZXJJZCArIGlkKSBcbiAgICAgIGZvcm1lZFVybCA9IGZvcm1lZFVybC5yZXBsYWNlKCc8b3JnSUQ+JywgdGhpcy5wcm92aWRlcklkKSBcbiAgICB9XG4gICAgcmV0dXJuIGZvcm1lZFVybFxuICB9XG5cbiAgcmVkaXJlY3RWaWV3QWxsKHN0cmlwRGF0YTogYW55LCBwYXRoOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zRGF0YTogYW55KSB7XG4gICAgaWYodGhpcy5lbWl0Vmlld0FsbCkge1xuICAgICAgdGhpcy52aWV3QWxsUmVzcG9uc2UuZW1pdChzdHJpcERhdGEpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYXRoXSwgeyAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zRGF0YSB9KVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZldGNoQWxsQm9va01hcmtEYXRhKHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5ib29rbWFya1JlYWQgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5ib29rbWFya1JlYWQpLmxlbmd0aCkge1xuICAgICAgbGV0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgICBpZiAoc3RyaXAucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LmJvb2ttYXJrUmVhZCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LmJvb2ttYXJrUmVhZC5ib29rbWFya0lkKSB7XG4gICAgICAgIHN0cmlwLnJlcXVlc3QuYXBpVXJsID0gdGhpcy5nZXRGdWxsVXJsKHN0cmlwLnJlcXVlc3QuYXBpVXJsLCBzdHJpcC5yZXF1ZXN0LmJvb2ttYXJrUmVhZC5ib29rbWFya0lkKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5nZXRSZXF1ZXN0TWV0aG9kKHN0cmlwLCBzdHJpcC5yZXF1ZXN0LmJvb2ttYXJrUmVhZCwgc3RyaXAucmVxdWVzdC5hcGlVcmwsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICAgIGxldCBjb250ZW50ICA9IHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmRhdGEub3JnTGlzdFxuICAgICAgICBpZiAocmVzcG9uc2UpIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1BbGxDb250ZW50c1RvV2lkZ2V0cyhjb250ZW50LCBzdHJpcCksXG4gICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgICApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpOyAgICAgICAgICBcbiAgICAgICAgICB0aGlzLmVtcHR5UmVzcG9uc2UuZW1pdCh0cnVlKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmVtcHR5UmVzcG9uc2UuZW1pdCh0cnVlKVxuICAgICAgICAvLyBIYW5kbGUgZXJyb3JzXG4gICAgICAgIC8vIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYW5zZm9ybUFsbENvbnRlbnRzVG9XaWRnZXRzKFxuICAgIGNvbnRlbnRzOiBhbnksXG4gICAgc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsXG4gICkge1xuICAgIHJldHVybiAoY29udGVudHMgfHwgW10pLm1hcCgoY29udGVudCwgaWR4KSA9PiAoXG4gICAgICBjb250ZW50ID8ge1xuICAgICAgICB3aWRnZXRUeXBlOiAnY2FyZExpYicsXG4gICAgICAgIHdpZGdldFN1YlR5cGU6ICdjYXJkQ29udGVudExpYicsXG4gICAgICAgIHdpZGdldEhvc3RDbGFzczogJ21iLTInLFxuICAgICAgICB3aWRnZXREYXRhOiB7XG4gICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAuLi4oY29udGVudC5iYXRjaCAmJiB7IGJhdGNoOiBjb250ZW50LmJhdGNoIH0pLFxuICAgICAgICAgIGNhcmRTdWJUeXBlOiBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5jYXJkU3ViVHlwZSxcbiAgICAgICAgICBjYXJkQ3VzdG9tZUNsYXNzOiBzdHJpcC5jdXN0b21lQ2xhc3MgPyBzdHJpcC5jdXN0b21lQ2xhc3MgOiAnJyxcbiAgICAgICAgICBjb250ZXh0OiB7IHBhZ2VTZWN0aW9uOiBzdHJpcC5rZXksIHBvc2l0aW9uOiBpZHggfSxcbiAgICAgICAgICBpbnRyYW5ldE1vZGU6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmludHJhbmV0TW9kZSxcbiAgICAgICAgICBkZWxldGVkTW9kZTogc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcuZGVsZXRlZE1vZGUsXG4gICAgICAgICAgY29udGVudFRhZ3M6IHN0cmlwLnN0cmlwQ29uZmlnICYmIHN0cmlwLnN0cmlwQ29uZmlnLmNvbnRlbnRUYWdzLFxuICAgICAgICB9LFxuICAgICAgfSA6IHtcbiAgICAgICAgd2lkZ2V0VHlwZTogJ2NhcmQnLFxuICAgICAgICB3aWRnZXRTdWJUeXBlOiAnY2FyZENvbnRlbnQnLFxuICAgICAgICB3aWRnZXRIb3N0Q2xhc3M6ICdtYi0yJyxcbiAgICAgICAgd2lkZ2V0RGF0YToge30sXG4gICAgICB9XG4gICAgKSk7XG4gIH1cblxuICBhc3luYyBmZXRjaEFsbFBsYXlsaXN0U2VhcmNoKHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFNlYXJjaCAmJiBPYmplY3Qua2V5cyhzdHJpcC5yZXF1ZXN0LnBsYXlsaXN0U2VhcmNoKS5sZW5ndGgpIHtcbiAgICAgIGxldCBvcmlnaW5hbEZpbHRlcnM6IGFueSA9IFtdO1xuICAgICAgaWYgKHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFNlYXJjaCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LnBsYXlsaXN0U2VhcmNoLnJlcXVlc3QgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFNlYXJjaC5yZXF1ZXN0LmZpbHRlcnMpIHtcbiAgICAgICAgb3JpZ2luYWxGaWx0ZXJzID0gc3RyaXAucmVxdWVzdC5wbGF5bGlzdFNlYXJjaC5yZXF1ZXN0LmZpbHRlcnM7XG4gICAgICAgIHN0cmlwLnJlcXVlc3QucGxheWxpc3RTZWFyY2gucmVxdWVzdC5maWx0ZXJzID0gdGhpcy5wb3N0TWV0aG9kRmlsdGVycyhzdHJpcC5yZXF1ZXN0LnBsYXlsaXN0U2VhcmNoLnJlcXVlc3QuZmlsdGVycyk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucG9zdFJlcXVlc3RNZXRob2Qoc3RyaXAsIHN0cmlwLnJlcXVlc3QucGxheWxpc3RTZWFyY2gucmVxdWVzdCwgc3RyaXAucmVxdWVzdC5hcGlVcmwsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsaW5nICBhZnRlciAtIHJlc3BvbnNlLCAnLCByZXNwb25zZSlcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnY2FsbGluZyAgYWZ0ZXItLSAnKVxuICAgICAgICAgIGlmIChyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5kYXRhICYmIHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgZmluYWxQbGF5bGlzdERhdGE6IGFueSA9IFtdXG4gICAgICAgICAgICBsZXQgcHJvZ3JhbURhdGE6IGFueSA9IHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LmRhdGFcbiAgICAgICAgICAgIHByb2dyYW1EYXRhLmZvckVhY2goKHByZ0RhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZihwcmdEYXRhLmNoaWxkcmVuICYmIHByZ0RhdGEuY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZmluYWxQbGF5bGlzdERhdGEucHVzaChwcmdEYXRhKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYoZmluYWxQbGF5bGlzdERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoZmluYWxQbGF5bGlzdERhdGEsIHN0cmlwKSxcbiAgICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnZpZXdNb3JlVXJsLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7ICAgICAgICAgIFxuICAgICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZW1wdHlSZXNwb25zZS5lbWl0KHRydWUpXG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZldGNoUGxheWxpc3RSZWFkRGF0YShzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3QucGxheWxpc3RSZWFkICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QucGxheWxpc3RSZWFkKS5sZW5ndGgpIHtcbiAgICAgIGxldCBvcmlnaW5hbEZpbHRlcnM6IGFueSA9IFtdO1xuICAgICAgaWYgKHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFJlYWQgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFJlYWQudHlwZSkge1xuICAgICAgICBzdHJpcC5yZXF1ZXN0LmFwaVVybCA9IHRoaXMuZ2V0RnVsbFVybChzdHJpcC5yZXF1ZXN0LmFwaVVybCwgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFJlYWQudHlwZSk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuZ2V0UmVxdWVzdE1ldGhvZChzdHJpcCwgc3RyaXAucmVxdWVzdC5wbGF5bGlzdFJlYWQsIHN0cmlwLnJlcXVlc3QuYXBpVXJsLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50KSB7ICBcbiAgICAgICAgICBsZXQgY29udGVudCAgPSByZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQWxsQ29udGVudHNUb1dpZGdldHMoY29udGVudCwgc3RyaXApLFxuICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2UsXG4gICAgICAgICAgKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTsgICAgICAgICAgXG4gICAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZmV0Y2hDaW9zQ29udGVudERhdGEoc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUpIHtcbiAgICBpZiAoc3RyaXAucmVxdWVzdCAmJiBzdHJpcC5yZXF1ZXN0LmNpb3NDb250ZW50ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuY2lvc0NvbnRlbnQpLmxlbmd0aCkge1xuICAgICAgbGV0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgICBpZiAoc3RyaXAucmVxdWVzdCAmJlxuICAgICAgICBzdHJpcC5yZXF1ZXN0LmNpb3NDb250ZW50ICYmXG4gICAgICAgIHN0cmlwLnJlcXVlc3QuY2lvc0NvbnRlbnQuZmlsdGVyQ3JpdGVyaWFNYXApIHtcbiAgICAgICAgb3JpZ2luYWxGaWx0ZXJzID0gc3RyaXAucmVxdWVzdC5jaW9zQ29udGVudC5maWx0ZXJDcml0ZXJpYU1hcDtcbiAgICAgICAgc3RyaXAucmVxdWVzdC5jaW9zQ29udGVudC5maWx0ZXJDcml0ZXJpYU1hcCA9IHRoaXMucG9zdE1ldGhvZEZpbHRlcnMoc3RyaXAucmVxdWVzdC5jaW9zQ29udGVudC5maWx0ZXJDcml0ZXJpYU1hcCk7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucG9zdFJlcXVlc3RNZXRob2Qoc3RyaXAsIHN0cmlwLnJlcXVlc3QuY2lvc0NvbnRlbnQsIHN0cmlwLnJlcXVlc3QuYXBpVXJsLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnY2FsbGluZyAgYWZ0ZXIgLSByZXNwb25zZSwgJywgcmVzcG9uc2UpXG4gICAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5yZXN1bHRzKSB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgIGFmdGVyLS0gJylcbiAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0cy5kYXRhICYmIHJlc3BvbnNlLnJlc3VsdHMuZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBleHRDb250ZW50RGF0YTogYW55ID0gcmVzcG9uc2UucmVzdWx0cy5kYXRhXG4gICAgICAgICAgICBpZihleHRDb250ZW50RGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhleHRDb250ZW50RGF0YSwgc3RyaXApLFxuICAgICAgICAgICAgICAgICdkb25lJyxcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uudmlld01vcmVVcmwsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVtcHR5UmVzcG9uc2UuZW1pdCh0cnVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgICAgICAgICB0aGlzLmVtcHR5UmVzcG9uc2UuZW1pdCh0cnVlKVxuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTsgICAgICAgICAgXG4gICAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgdGhpcy5lbXB0eVJlc3BvbnNlLmVtaXQodHJ1ZSlcbiAgICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuXG5cblxuICAvLyBuZXcgY29kZSB3cml0dGluZyBmcm9tIGhlcmU9PT09bmV3PT09PVxuXG5cblxuXG5cblxuICBmZXRjaEZvcllvdURhdGEoc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyA9IHRydWUpIHtcbiAgICBpZiAoc3RyaXAgJiYgc3RyaXAudHlwZSA9PT0gJ2ZvcllvdScpIHtcbiAgICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0VGFiID0gc3RyaXAudGFic1swXTtcbiAgICAgICAgY29uc3QgcGlsbERhdGEgPSBmaXJzdFRhYi5waWxsc0RhdGFbMF1cbiAgICAgICAgaWYgKHBpbGxEYXRhLnJlcXVlc3RSZXF1aXJlZCkge1xuICAgICAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxQaWxscyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnNbMF0ucGlsbHNEYXRhO1xuICAgICAgICAgICAgY29uc3QgY3VycmVuUGlsbHNGcm9tTWFwID0gKGFsbFBpbGxzICYmIGFsbFBpbGxzLmxlbmd0aCAmJiBhbGxQaWxsc1swXSkgYXMgTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVGFiO1xuICAgICAgICAgICAgdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFUcmVuZGluZyhzdHJpcCwgMCwgMCwgY3VycmVuUGlsbHNGcm9tTWFwLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldICYmIGN1cnJlblBpbGxzRnJvbU1hcCkge1xuICAgICAgICAgICAgICB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICAgICAgICBrZXk6c3RyaXAua2V5LFxuICAgICAgICAgICAgICAgIHRhYlNlbGVjdGVkOiBmaXJzdFRhYi52YWx1ZSxcbiAgICAgICAgICAgICAgICBwaWxsU2VsZWN0ZWQ6IHBpbGxEYXRhLnZhbHVlLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICBcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBmZXRjaEZyb21TZWFyY2hWNihzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzID0gdHJ1ZSkge1xuICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYgJiYgT2JqZWN0LmtleXMoc3RyaXAucmVxdWVzdC5zZWFyY2hWNikubGVuZ3RoKSB7XG4gICAgICAvLyBpZiAoIShzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZSAmJiBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZS5sZW5ndGggPiAwKSkge1xuICAgICAgLy8gICBpZiAodGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlKSB7XG4gICAgICAvLyAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5sb2NhbGUgPSBbdGhpcy5jb25maWdTdmMuYWN0aXZlTG9jYWxlLmxvY2Fsc1swXV1cbiAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LmxvY2FsZSA9IFsnZW4nXVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICBsZXQgb3JpZ2luYWxGaWx0ZXJzOiBhbnkgPSBbXTtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGlmIChzdHJpcC5yZXF1ZXN0ICYmXG4gICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYgJiZcbiAgICAgICAgc3RyaXAucmVxdWVzdC5zZWFyY2hWNi5yZXF1ZXN0ICYmXG4gICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzKSB7XG4gICAgICAgIG9yaWdpbmFsRmlsdGVycyA9IHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzO1xuICAgICAgICBzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycyA9IHRoaXMuY2hlY2tGb3JEYXRlRmlsdGVycyhzdHJpcC5yZXF1ZXN0LnNlYXJjaFY2LnJlcXVlc3QuZmlsdGVycyk7XG4gICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzID0gdGhpcy5nZXRGaWx0ZXJzRnJvbUFycmF5KFxuICAgICAgICAgIHN0cmlwLnJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHN0cmlwLnRhYnMgJiYgc3RyaXAudGFicy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVE9ETzogSGF2ZSB0byBleHRyYWN0IHJlcXVlc3RSZXF1aXJlZCB0byBvdXRlciBsZXZlbCBvZiB0YWJzIGNvbmZpZ1xuICAgICAgICBjb25zdCBmaXJzdFRhYiA9IHN0cmlwLnRhYnNbMF07XG4gICAgICAgIGlmIChmaXJzdFRhYi5yZXF1ZXN0UmVxdWlyZWQpIHtcbiAgICAgICAgICBpZiAodGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0gJiYgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicykge1xuICAgICAgICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnM7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRnJvbU1hcCA9IChhbGxUYWJzICYmIGFsbFRhYnMubGVuZ3RoICYmIGFsbFRhYnNbMF0pIGFzIE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYjtcblxuICAgICAgICAgICAgdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihzdHJpcCwgMCwgMCwgY3VycmVudFRhYkZyb21NYXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnNlYXJjaFY2UmVxdWVzdChzdHJpcCwgc3RyaXAucmVxdWVzdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnY2FsbGluZyAgYWZ0ZXIgLSByZXNwb25zZSwgJywgcmVzcG9uc2UpXG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsaW5nICBhZnRlci0tICcpXG4gICAgICAgICAgICBpZiAocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuY29udGVudCkge1xuICAgICAgICAgICAgICBpZihzdHJpcC5rZXkgPT09ICdzY2hlZHVsZWRBc3Nlc3NtZW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuZW5yb2xsSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSW52aXRPbmx5QXNzZXNzbWVudHMocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuY29udGVudCwgc3RyaXAsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgcmVzcG9uc2Uudmlld01vcmVVcmwpXG5cbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICB9LCAxMDAwKVxuICAgICAgICAgIFxuICAgICAgICAgICAgXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMocmVzcG9uc2UucmVzdWx0cy5yZXN1bHQuY29udGVudCwgc3RyaXApLFxuICAgICAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uudmlld01vcmVVcmwsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LkV2ZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgICAgICAgICAgIHN0cmlwLFxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtRXZlbnRzVG9XaWRnZXRzKHJlc3BvbnNlLnJlc3VsdHMucmVzdWx0LkV2ZW50LCBzdHJpcCksXG4gICAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgICByZXNwb25zZS52aWV3TW9yZVVybCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEhhbmRsZSBlcnJvcnNcbiAgICAgICAgICAvLyBjb25zb2xlLmVycm9yKCdFcnJvcjonLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRUYWJEYXRhQnlOZXdSZXFUcmVuZGluZyhcbiAgICBzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICB0YWJJbmRleDogbnVtYmVyLFxuICAgIHBpbGxJbmRleDogbnVtYmVyLFxuICAgIGN1cnJlbnRUYWI6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFRhYixcbiAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXM6IGJvb2xlYW5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy50cmVuZGluZ1NlYXJjaFJlcXVlc3Qoc3RyaXAsIGN1cnJlbnRUYWIucmVxdWVzdCwgY2FsY3VsYXRlUGFyZW50U3RhdHVzKTtcbiAgICAgIGxldCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnJlc3VsdHMgJiYgcmVzcG9uc2UucmVzdWx0cy5yZXNwb25zZSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVzcG9uc2UucmVzdWx0cy5yZXNwb25zZVtjdXJyZW50VGFiLnZhbHVlXSB8fCBbXTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0cyA9IHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHMoY29udGVudCwgc3RyaXApO1xuICAgICAgIFxuICAgICAgICBpZiAodGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0gJiYgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicykge1xuICAgICAgICAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzO1xuICAgICAgICAgIGNvbnN0IGFsbFBpbGxzID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFic1t0YWJJbmRleF0ucGlsbHNEYXRhO1xuICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZFBpbGwoYWxsUGlsbHMpXG4gICAgICAgICAgaWYgKGFsbFRhYnMgJiYgYWxsVGFicy5sZW5ndGggJiYgYWxsVGFic1t0YWJJbmRleF0pIHtcbiAgICAgICAgICAgIGlmKGFsbFBpbGxzICYmIGFsbFBpbGxzLmxlbmd0aCAmJiBhbGxQaWxsc1twaWxsSW5kZXhdKXtcbiAgICAgICAgICAgICAgYWxsUGlsbHNbcGlsbEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxQaWxsc1twaWxsSW5kZXhdLFxuICAgICAgICAgICAgICAgIHdpZGdldHMsXG4gICAgICAgICAgICAgICAgZmV0Y2hUYWJTdGF0dXM6ICdkb25lJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxsVGFic1t0YWJJbmRleF0gPSB7XG4gICAgICAgICAgICAgIC4uLmFsbFRhYnNbdGFiSW5kZXhdLFxuICAgICAgICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhYlJlc3VsdHMgPSBhbGxUYWJzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICdkb25lJyxcbiAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgcmVzcG9uc2Uudmlld01vcmVVcmwsXG4gICAgICAgICAgdGFiUmVzdWx0cyAvLyB0YWJSZXN1bHRzIGFzIHdpZGdldHNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XSAmJiB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzKSB7XG4gICAgICAgICAgY29uc3QgYWxsVGFicyA9IHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcC5rZXldLnRhYnM7XG4gICAgICAgICAgY29uc3QgYWxsUGlsbHMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzW3RhYkluZGV4XS5waWxsc0RhdGE7XG4gICAgICAgICAgdGhpcy5yZXNldFNlbGVjdGVkUGlsbChhbGxQaWxscylcbiAgICAgICAgICBpZiAoYWxsVGFicyAmJiBhbGxUYWJzLmxlbmd0aCAmJiBhbGxUYWJzW3RhYkluZGV4XSkge1xuICAgICAgICAgICAgaWYoYWxsUGlsbHMgJiYgYWxsUGlsbHMubGVuZ3RoICYmIGFsbFBpbGxzW3BpbGxJbmRleF0pe1xuICAgICAgICAgICAgICBhbGxQaWxsc1twaWxsSW5kZXhdID0ge1xuICAgICAgICAgICAgICAgIC4uLmFsbFBpbGxzW3BpbGxJbmRleF0sXG4gICAgICAgICAgICAgICAgd2lkZ2V0czpbXSxcbiAgICAgICAgICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0cnVlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhbGxUYWJzW3RhYkluZGV4XSA9IHtcbiAgICAgICAgICAgICAgLi4uYWxsVGFic1t0YWJJbmRleF0sXG4gICAgICAgICAgICAgIHdpZGdldHM6W10sXG4gICAgICAgICAgICAgIGZldGNoVGFiU3RhdHVzOiAnZG9uZScsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGFiUmVzdWx0cyA9IGFsbFRhYnM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2RvbmUnLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBIYW5kbGUgZXJyb3JzXG4gICAgICB0aGlzLnByb2Nlc3NTdHJpcChzdHJpcCwgW10sICdlcnJvcicsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0VGFiRGF0YUJ5TmV3UmVxU2VhcmNoVjYoXG4gICAgc3RyaXA6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXQsXG4gICAgdGFiSW5kZXg6IG51bWJlcixcbiAgICBwaWxsSW5kZXg6IG51bWJlcixcbiAgICBjdXJyZW50VGFiOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBUYWIsXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBib29sZWFuXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VhcmNoVjZSZXF1ZXN0KHN0cmlwLCBjdXJyZW50VGFiLnJlcXVlc3QsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyk7XG4gICAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2UucmVzdWx0cykge1xuICAgICAgICBjb25zdCB3aWRnZXRzID0gdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhyZXNwb25zZS5yZXN1bHRzLnJlc3VsdC5jb250ZW50LCBzdHJpcCk7XG4gICAgICAgIGxldCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0gJiYgdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFicykge1xuICAgICAgICAgIGNvbnN0IGFsbFRhYnMgPSB0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXAua2V5XS50YWJzO1xuICAgICAgICAgIGNvbnN0IGFsbFBpbGxzID0gdGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwLmtleV0udGFic1t0YWJJbmRleF0ucGlsbHNEYXRhO1xuICAgICAgICAgIHRoaXMucmVzZXRTZWxlY3RlZFBpbGwoYWxsUGlsbHMpXG4gICAgICAgICAgaWYgKGFsbFRhYnMgJiYgYWxsVGFicy5sZW5ndGggJiYgYWxsVGFic1t0YWJJbmRleF0pIHtcbiAgICAgICAgICAgIGlmKGFsbFBpbGxzICYmIGFsbFBpbGxzLmxlbmd0aCAmJiBhbGxQaWxsc1twaWxsSW5kZXhdKXtcbiAgICAgICAgICAgICAgYWxsUGlsbHNbcGlsbEluZGV4XSA9IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxQaWxsc1twaWxsSW5kZXhdLFxuICAgICAgICAgICAgICAgIHdpZGdldHMsXG4gICAgICAgICAgICAgICAgZmV0Y2hUYWJTdGF0dXM6ICdkb25lJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogdHJ1ZVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxsVGFic1t0YWJJbmRleF0gPSB7XG4gICAgICAgICAgICAgIC4uLmFsbFRhYnNbdGFiSW5kZXhdLFxuICAgICAgICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICAgICBmZXRjaFRhYlN0YXR1czogJ2RvbmUnLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhYlJlc3VsdHMgPSBhbGxUYWJzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICB3aWRnZXRzLFxuICAgICAgICAgICdkb25lJyxcbiAgICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAgICAgcmVzcG9uc2Uudmlld01vcmVVcmwsXG4gICAgICAgICAgdGFiUmVzdWx0cyAvLyB0YWJSZXN1bHRzIGFzIHdpZGdldHNcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2Vycm9yJywgY2FsY3VsYXRlUGFyZW50U3RhdHVzLCBudWxsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSGFuZGxlIGVycm9yc1xuICAgICAgLy8gY29uc29sZS5lcnJvcignRXJyb3I6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHRyZW5kaW5nU2VhcmNoUmVxdWVzdChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICByZXF1ZXN0OiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0WydyZXF1ZXN0J10sXG4gICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzOiBib29sZWFuXG4gICAgKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRmlsdGVyczogYW55ID0gW107XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3QudHJlbmRpbmdTZWFyY2gpIHtcbiAgICAgICAgLy8gY2hlY2sgZm9yIHRoZSByZXF1ZXN0IGlmIGl0IGhhcyBkeW5hbWljIHZhbHVlc11cbiAgICAgICAgICBpZiAocmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMub3JnYW5pc2F0aW9uICYmXG4gICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMub3JnYW5pc2F0aW9uLmluZGV4T2YoJzxvcmdJRD4nKSA+PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgbGV0IHVzZXJSb290T3JnSWQ7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgICAgdXNlclJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0LmZpbHRlcnMub3JnYW5pc2F0aW9uID0gdXNlclJvb3RPcmdJZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb250ZW50U3ZjLnRyZW5kaW5nQ29udGVudFNlYXJjaChyZXF1ZXN0LnRyZW5kaW5nU2VhcmNoKS5zdWJzY3JpYmUocmVzdWx0cyA9PiB7XG4gICAgICAgICAgICBjb25zdCBzaG93Vmlld01vcmUgPSBCb29sZWFuKFxuICAgICAgICAgICAgcmVzdWx0cy5yZXN1bHQgJiZcbiAgICAgICAgICAgIHN0cmlwLnJlcXVlc3QgJiZcbiAgICAgICAgICAgIHJlc3VsdHMucmVzdWx0W3N0cmlwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gucmVzcG9uc2VLZXldICYmXG4gICAgICAgICAgICByZXN1bHRzLnJlc3VsdFtzdHJpcC5yZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlc3BvbnNlS2V5XS5sZW5ndGggPiA1ICYmXG4gICAgICAgICAgICBzdHJpcC5zdHJpcENvbmZpZyAmJiBzdHJpcC5zdHJpcENvbmZpZy5wb3N0Q2FyZEZvclNlYXJjaCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgIHBhdGg6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnBhdGggfHwgJycsXG4gICAgICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICAgICAgdGFiOiAnTGVhcm4nLFxuICAgICAgICAgICAgcTogc3RyaXAudmlld01vcmVVcmwgJiYgc3RyaXAudmlld01vcmVVcmwucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBmOlxuICAgICAgICAgICAgcmVxdWVzdCAmJlxuICAgICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaCAmJlxuICAgICAgICAgICAgcmVxdWVzdC50cmVuZGluZ1NlYXJjaC5yZXF1ZXN0ICYmXG4gICAgICAgICAgICByZXF1ZXN0LnRyZW5kaW5nU2VhcmNoLnJlcXVlc3QuZmlsdGVyc1xuICAgICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtU2VhcmNoVjZGaWx0ZXJzVjIoXG4gICAgICAgICAgICBvcmlnaW5hbEZpbHRlcnMsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgICAgbGV0IHByb2NjZXNlZFJlc3VsdDogYW55ID0gW11cbiAgICAgICAgICAgIGlmIChyZXN1bHRzICYmIHJlc3VsdHMucmVzcG9uc2UgJiYgcmVzdWx0cy5yZXNwb25zZS5jZXJ0aWZpY2F0aW9ucykge1xuICAgICAgICAgICAgICByZXN1bHRzLnJlc3BvbnNlLmNlcnRpZmljYXRpb25zLm1hcCgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNvdXJjZSA9PT0gdGhpcy5jaGFubm5lbE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHByb2NjZXNlZFJlc3VsdC5wdXNoKHJlc3VsdClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHJlc3VsdHMgPSB7cmVzcG9uc2U6IHtjZXJ0aWZpY2F0aW9uczogcHJvY2Nlc2VkUmVzdWx0fX1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc29sdmUoeyByZXN1bHRzLCB2aWV3TW9yZVVybCB9KTtcbiAgICAgICAgICB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yICYmIGVycm9yLmVycm9yLnN0YXR1cyA9PT0gNDAwKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKHN0cmlwLCBbXSwgJ2RvbmUnLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZG9uZScsIGNhbGN1bGF0ZVBhcmVudFN0YXR1cywgbnVsbClcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfSwpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdGFiQ2xpY2tlZCh0YWJFdmVudDogTWF0VGFiQ2hhbmdlRXZlbnQsIHBpbGxJbmRleDogYW55LCBzdHJpcE1hcDogSVN0cmlwVW5pdENvbnRlbnREYXRhLCBzdHJpcEtleTogc3RyaW5nKSB7XG4gICAgICBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XSkge1xuICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS5mZXRjaFRhYlN0YXR1cyA9ICdpbnByb2dyZXNzJztcbiAgICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF0udGFiTG9hZGluZyA9IHRydWU7XG4gICAgICAgIHN0cmlwTWFwLnNob3dPbkxvYWRlciA9IHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhOiBXc0V2ZW50cy5JVGVsZW1ldHJ5VGFiRGF0YSA9IHtcbiAgICAgICAgbGFiZWw6IGAke3RhYkV2ZW50LnRhYi50ZXh0TGFiZWx9YCxcbiAgICAgICAgaW5kZXg6IHRhYkV2ZW50LmluZGV4LFxuICAgICAgfTtcbiAgICAgIHRoaXMuZXZlbnRTdmMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICAgIHN1YlR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkhPTUVfUEFHRV9TVFJJUF9UQUJTLFxuICAgICAgICAgIGlkOiBgJHtfLmNhbWVsQ2FzZShkYXRhLmxhYmVsKX0tdGFiYCxcbiAgICAgICAgfSxcbiAgICAgICAge30sXG4gICAgICAgIHtcbiAgICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkhPTUUsXG4gICAgICAgIH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRUYWJGcm9tTWFwOiBhbnkgPSBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdO1xuICAgICAgY29uc3QgY3VycmVudFBpbGxGcm9tTWFwOiBhbnkgPSBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdO1xuICAgICAgY29uc3QgY3VycmVudFN0cmlwID0gdGhpcy53aWRnZXREYXRhLnN0cmlwcy5maW5kKHMgPT4gcy5rZXkgPT09IHN0cmlwS2V5KTtcbiAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXBLZXldICYmIGN1cnJlbnRUYWJGcm9tTWFwKSB7XG4gICAgICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcEtleV0udmlld01vcmVVcmwucXVlcnlQYXJhbXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICB0YWJTZWxlY3RlZDogY3VycmVudFRhYkZyb21NYXAudmFsdWUsXG4gICAgICAgICAgcGlsbFNlbGVjdGVkOiBjdXJyZW50UGlsbEZyb21NYXAudmFsdWUsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmIChjdXJyZW50U3RyaXAgJiYgY3VycmVudFRhYkZyb21NYXAgJiYgIWN1cnJlbnRUYWJGcm9tTWFwLmNvbXB1dGVEYXRhT25DbGljayAmJiBjdXJyZW50UGlsbEZyb21NYXApIHtcbiAgICAgICAgaWYgKGN1cnJlbnRQaWxsRnJvbU1hcC5yZXF1ZXN0UmVxdWlyZWQgJiYgY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3QpIHtcbiAgICAgICAgICAvLyBjYWxsIEFQSSB0byBnZXQgdGFiIGRhdGEgYW5kIHByb2Nlc3NcbiAgICAgICAgICAvLyB0aGlzLnByb2Nlc3NTdHJpcChjdXJyZW50U3RyaXAsIFtdLCAnZmV0Y2hpbmcnLCB0cnVlLCBudWxsKVxuICAgICAgICAgIGlmIChjdXJyZW50UGlsbEZyb21NYXAucmVxdWVzdC5zZWFyY2hWNikge1xuICAgICAgICAgICAgdGhpcy5nZXRUYWJEYXRhQnlOZXdSZXFTZWFyY2hWNihjdXJyZW50U3RyaXAsIHRhYkV2ZW50LmluZGV4LCAwLCBjdXJyZW50UGlsbEZyb21NYXAsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxVHJlbmRpbmcoY3VycmVudFN0cmlwLCB0YWJFdmVudC5pbmRleCwgMCwgY3VycmVudFBpbGxGcm9tTWFwLCB0cnVlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0pIHtcbiAgICAgICAgICAvLyAgIHN0cmlwTWFwLnRhYnNbdGFiRXZlbnQuaW5kZXhdLnRhYkxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMuZ2V0VGFiRGF0YUJ5ZmlsdGVyKGN1cnJlbnRTdHJpcCwgY3VycmVudFRhYkZyb21NYXAsIHRydWUpO1xuICAgICAgICAgIC8vIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIC8vICAgaWYgKHN0cmlwTWFwICYmIHN0cmlwTWFwLnRhYnMgJiYgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0pIHtcbiAgICAgICAgICAvLyAgICAgICBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgLy8gICAgICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0uZmV0Y2hUYWJTdGF0dXMgPSAnZG9uZSc7XG4gICAgICAgICAgLy8gICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgLy8gICB9XG4gICAgICAgICAgLy8gfSwgICAgICAgICAyMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGlsbENsaWNrZWQoZXZlbnQ6IGFueSwgc3RyaXBNYXA6IElTdHJpcFVuaXRDb250ZW50RGF0YSwgc3RyaXBLZXk6IGFueSwgcGlsbEluZGV4OiBhbnksIHRhYkluZGV4OiBhbnkpIHtcbiAgICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdKSB7XG4gICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLmZldGNoVGFiU3RhdHVzID0gJ2lucHJvZ3Jlc3MnO1xuICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS50YWJMb2FkaW5nID0gdHJ1ZTtcbiAgICAgICAgc3RyaXBNYXAuc2hvd09uTG9hZGVyID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnRUYWJGcm9tTWFwOiBhbnkgPSBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdO1xuICAgICAgY29uc3QgY3VycmVudFBpbGxGcm9tTWFwOiBhbnkgPSBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdO1xuICAgICAgY29uc3QgY3VycmVudFN0cmlwID0gdGhpcy53aWRnZXREYXRhLnN0cmlwcy5maW5kKHMgPT4gcy5rZXkgPT09IHN0cmlwS2V5KTtcbiAgICAgIGlmICh0aGlzLnN0cmlwc1Jlc3VsdERhdGFNYXBbc3RyaXBLZXldICYmIGN1cnJlbnRUYWJGcm9tTWFwKSB7XG4gICAgICAgIHRoaXMuc3RyaXBzUmVzdWx0RGF0YU1hcFtzdHJpcEtleV0udmlld01vcmVVcmwucXVlcnlQYXJhbXMgPSB7XG4gICAgICAgICAgLi4udGhpcy5zdHJpcHNSZXN1bHREYXRhTWFwW3N0cmlwS2V5XS52aWV3TW9yZVVybC5xdWVyeVBhcmFtcyxcbiAgICAgICAgICB0YWJTZWxlY3RlZDogY3VycmVudFRhYkZyb21NYXAudmFsdWUsXG4gICAgICAgICAgcGlsbFNlbGVjdGVkOiBjdXJyZW50UGlsbEZyb21NYXAudmFsdWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY3VycmVudFN0cmlwICYmIGN1cnJlbnRUYWJGcm9tTWFwICYmICFjdXJyZW50VGFiRnJvbU1hcC5jb21wdXRlRGF0YU9uQ2xpY2sgJiYgY3VycmVudFBpbGxGcm9tTWFwKSB7XG4gICAgICAgIGlmIChjdXJyZW50UGlsbEZyb21NYXAucmVxdWVzdFJlcXVpcmVkICYmIGN1cnJlbnRQaWxsRnJvbU1hcC5yZXF1ZXN0KSB7XG4gICAgICAgICAgLy8gY2FsbCBBUEkgdG8gZ2V0IHRhYiBkYXRhIGFuZCBwcm9jZXNzXG4gICAgICAgICAgLy8gdGhpcy5wcm9jZXNzU3RyaXAoY3VycmVudFN0cmlwLCBbXSwgJ2ZldGNoaW5nJywgdHJ1ZSwgbnVsbClcbiAgICAgICAgICBpZiAoY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3Quc2VhcmNoVjYpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxU2VhcmNoVjYoY3VycmVudFN0cmlwLCB0YWJJbmRleCwgcGlsbEluZGV4LCBjdXJyZW50UGlsbEZyb21NYXAsIHRydWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudFBpbGxGcm9tTWFwLnJlcXVlc3QudHJlbmRpbmdTZWFyY2gpIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0VGFiRGF0YUJ5TmV3UmVxVHJlbmRpbmcoY3VycmVudFN0cmlwLCB0YWJJbmRleCwgcGlsbEluZGV4LCBjdXJyZW50UGlsbEZyb21NYXAsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBpZiAoc3RyaXBNYXAgJiYgc3RyaXBNYXAudGFicyAmJiBzdHJpcE1hcC50YWJzW3RhYkV2ZW50LmluZGV4XSkge1xuICAgICAgICAgIC8vICAgc3RyaXBNYXAudGFic1t0YWJFdmVudC5pbmRleF0udGFiTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgIC8vIH1cblxuICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5nZXRUYWJEYXRhQnlmaWx0ZXIoY3VycmVudFN0cmlwLCBjdXJyZW50VGFiRnJvbU1hcCwgdHJ1ZSk7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzdHJpcE1hcCAmJiBzdHJpcE1hcC50YWJzICYmIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdKSB7XG4gICAgICAgICAgICAgIHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YVtwaWxsSW5kZXhdLmZldGNoVGFiU3RhdHVzID0gJ2lucHJvZ3Jlc3MnO1xuICAgICAgICAgICAgICBzdHJpcE1hcC50YWJzW3RhYkluZGV4XS5waWxsc0RhdGFbcGlsbEluZGV4XS50YWJMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIHN0cmlwTWFwLnNob3dPbkxvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnJlc2V0U2VsZWN0ZWRQaWxsKHN0cmlwTWFwLnRhYnNbdGFiSW5kZXhdLnBpbGxzRGF0YSlcbiAgICAgICAgICAgICAgc3RyaXBNYXAudGFic1t0YWJJbmRleF0ucGlsbHNEYXRhW3BpbGxJbmRleF1bJ3NlbGVjdGVkJ109dHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sICAgICAgICAgMjAwKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNlYXJjaFY2UmVxdWVzdChzdHJpcDogTnNDb250ZW50U3RyaXBXaXRoVGFicy5JQ29udGVudFN0cmlwVW5pdCxcbiAgICAgIHJlcXVlc3Q6IE5zQ29udGVudFN0cmlwV2l0aFRhYnMuSUNvbnRlbnRTdHJpcFVuaXRbJ3JlcXVlc3QnXSxcbiAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1czogYm9vbGVhblxuICAgICAgICApOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbEZpbHRlcnM6IGFueSA9IFtdO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmIChyZXF1ZXN0ICYmIHJlcXVlc3Quc2VhcmNoVjYpIHtcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLnNlYXJjaFY2KHJlcXVlc3Quc2VhcmNoVjYpLnN1YnNjcmliZShyZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3Qgc2hvd1ZpZXdNb3JlID0gQm9vbGVhbihcbiAgICAgICAgcmVzdWx0cy5yZXN1bHQuY29udGVudCAmJiByZXN1bHRzLnJlc3VsdC5jb250ZW50Lmxlbmd0aCA+IDUgJiYgc3RyaXAuc3RyaXBDb25maWcgJiYgc3RyaXAuc3RyaXBDb25maWcucG9zdENhcmRGb3JTZWFyY2gsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZpZXdNb3JlVXJsID0gc2hvd1ZpZXdNb3JlXG4gICAgICAgID8ge1xuICAgICAgICBwYXRoOiBzdHJpcC52aWV3TW9yZVVybCAmJiBzdHJpcC52aWV3TW9yZVVybC5wYXRoIHx8ICcnLFxuICAgICAgICBxdWVyeVBhcmFtczoge1xuICAgICAgICB0YWI6ICdMZWFybicsXG4gICAgICAgIHE6IHN0cmlwLnZpZXdNb3JlVXJsICYmIHN0cmlwLnZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBmOlxuICAgICAgICByZXF1ZXN0ICYmXG4gICAgICAgICAgcmVxdWVzdC5zZWFyY2hWNiAmJlxuICAgICAgICAgIHJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdCAmJlxuICAgICAgICAgIHJlcXVlc3Quc2VhcmNoVjYucmVxdWVzdC5maWx0ZXJzXG4gICAgICAgICAgPyBKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtU2VhcmNoVjZGaWx0ZXJzVjIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsRmlsdGVycyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICAgOiB7fSxcbiAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICA6IG51bGw7XG4gICAgICAgIC8vIGlmICh2aWV3TW9yZVVybCAmJiB2aWV3TW9yZVVybC5xdWVyeVBhcmFtcykge1xuICAgICAgICAvLyAgIHZpZXdNb3JlVXJsLnF1ZXJ5UGFyYW1zID0gdmlld01vcmVVcmwucXVlcnlQYXJhbXNcbiAgICAgICAgLy8gfVxuICAgICAgICByZXNvbHZlKHsgcmVzdWx0cywgdmlld01vcmVVcmwgfSk7XG4gICAgICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5wcm9jZXNzU3RyaXAoc3RyaXAsIFtdLCAnZXJyb3InLCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsIG51bGwpO1xuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICB9LFxuICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIH0pO1xuICB9XG5cblxuICBnZXRTZWxlY3RlZFBpbGxJbmRleCh0YWJkYXRhOiBhbnksIHRhYkluZGV4OiBhbnkpIHtcbiAgICBpZih0YWJkYXRhLnBpbGxzRGF0YSAmJiB0YWJkYXRhLnBpbGxzRGF0YS5sZW5ndGgpIHtcbiAgICAgIC8vIHRhYmRhdGEucGlsbHNEYXRhLmZvckVhY2goKGVsZTogYW55LCBpbmRleDogYW55KSA9PiB7XG4gICAgICAvLyAgIGlmKGVsZS5zZWxlY3RlZCkge1xuICAgICAgLy8gICAgIGNvbnNvbGUubG9nKGVsZSwnLS0tLS0tLS0tJylcbiAgICAgIC8vICAgICByZXR1cm4gaW5kZXhcbiAgICAgIC8vICAgfVxuICAgICAgLy8gLy8gfSlcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRhYmRhdGEsJz09PT09PT09PT0xMjMnKVxuICAgICAgbGV0IGluZGV4ID0gdGFiZGF0YS5waWxsc0RhdGEuZmluZEluZGV4KChwaWxsOiBhbnkpID0+IHtcbiAgICAgICAgLy8gaWYocGlsbC5zZWxlY3RlZCl7XG4gICAgICAgICAgcmV0dXJuIHBpbGwuc2VsZWN0ZWRcbiAgICAgICAgLy8gfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gaW5kZXhcbiAgICB9XG4gICAgcmV0dXJuIDBcbiAgfVxuXG5cblxuXG5cbiAgLy8gY2JwIHBsYW5zXG5cbiAgYXN5bmMgZmV0Y2hBbGxDYnBQbGFucyhzdHJpcDogYW55LCBjYWxjdWxhdGVQYXJlbnRTdGF0dXMgPSB0cnVlKSB7XG4gICAgaWYgKHN0cmlwLnJlcXVlc3QgJiYgc3RyaXAucmVxdWVzdC5jYnBMaXN0ICYmIE9iamVjdC5rZXlzKHN0cmlwLnJlcXVlc3QuY2JwTGlzdCkubGVuZ3RoKSB7XG5cbiAgICAgIGxldCBjb3Vyc2VzOiBOc0NvbnRlbnQuSUNvbnRlbnRbXTtcbiAgICAgIGxldCB0YWJSZXN1bHRzOiBhbnlbXSA9IFtdO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVzZXJTdmMuZmV0Y2hDYnBQbGFuTGlzdCgpLnRvUHJvbWlzZSgpO1xuICAgICAgaWYgKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICBjb3Vyc2VzID0gcmVzcG9uc2U7XG4gICAgICAgICAgICBpZiAoc3RyaXAudGFicyAmJiBzdHJpcC50YWJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdENicFRhYnNEYXRhKGNvdXJzZXMsIHN0cmlwKTtcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAgICAgICAgICAgc3RyaXAsXG4gICAgICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb3Vyc2VzLCBzdHJpcCksXG4gICAgICAgICAgICAgICAgJ2RvbmUnLFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZVBhcmVudFN0YXR1cyxcbiAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICB0YWJSZXN1bHRzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NTdHJpcChcbiAgICAgICAgICAgICAgICBzdHJpcCxcbiAgICAgICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvdXJzZXMsIHN0cmlwKSxcbiAgICAgICAgICAgICAgICAnZG9uZScsXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgICAgICAgICAgICd2aWV3TW9yZVVybCcsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyB0aGlzLnVzZXJTdmMuZmV0Y2hDYnBQbGFuTGlzdCgpLnN1YnNjcmliZSggYXN5bmMgIChyZXM6IGFueSkgPT4ge1xuICAgICAgLy8gICBpZiAocmVzKSB7XG4gICAgICAvLyAgICAgY29uc29sZS5sb2cocmVzLCc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PicpXG4gICAgICAvLyAgICAgY291cnNlcyA9IHJlc1xuICAgICAgLy8gICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICAvLyAgICAgICB0YWJSZXN1bHRzID0gdGhpcy5zcGxpdENicFRhYnNEYXRhKGNvdXJzZXMsIHN0cmlwKVxuICAgICAgLy8gICAgICAgYXdhaXQgdGhpcy5wcm9jZXNzU3RyaXAoXG4gICAgICAvLyAgICAgICAgIHN0cmlwLFxuICAgICAgLy8gICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGNvdXJzZXMsIHN0cmlwKSxcbiAgICAgIC8vICAgICAgICAgJ2RvbmUnLFxuICAgICAgLy8gICAgICAgICBjYWxjdWxhdGVQYXJlbnRTdGF0dXMsXG4gICAgICAvLyAgICAgICAgICcnLFxuICAgICAgLy8gICAgICAgICB0YWJSZXN1bHRzXG4gICAgICAvLyAgICAgICApXG4gICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgIC8vICAgICAgIHRoaXMucHJvY2Vzc1N0cmlwKFxuICAgICAgLy8gICAgICAgICBzdHJpcCxcbiAgICAgIC8vICAgICAgICAgdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhjb3Vyc2VzLCBzdHJpcCksXG4gICAgICAvLyAgICAgICAgICdkb25lJyxcbiAgICAgIC8vICAgICAgICAgY2FsY3VsYXRlUGFyZW50U3RhdHVzLFxuICAgICAgLy8gICAgICAgICAndmlld01vcmVVcmwnLFxuICAgICAgLy8gICAgICAgKVxuICAgICAgLy8gICAgIH1cbiAgICAgIC8vICAgfVxuICAgICAgLy8gfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9lcnI6IGFueSkgPT4ge1xuXG4gICAgICAvLyB9KVxuXG4gICAgICBjbGVhckludGVydmFsKHRoaXMuZW5yb2xsSW50ZXJ2YWwpO1xuICAgIH1cbiAgfVxuXG4gIHNwbGl0Q2JwVGFic0RhdGEoY29udGVudE5ldzogTnNDb250ZW50LklDb250ZW50W10sIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0KSB7XG4gICAgbGV0IHRhYlJlc3VsdHM6IGFueVtdID0gW107XG4gICAgY29uc3Qgc3BsaXREYXRhID0gdGhpcy5nZXRUYWJzTGlzdChcbiAgICAgIGNvbnRlbnROZXcsXG4gICAgICBzdHJpcCxcbiAgICApO1xuICAgIGlmIChzdHJpcC50YWJzICYmIHN0cmlwLnRhYnMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmlwLnRhYnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYoIHN0cmlwLnRhYnNbaV0udmFsdWUgPT09IFwibXlJZ290UGxhbnNcIikge1xuICAgICAgICAgIGlmIChzdHJpcC50YWJzW2ldLnBpbGxzRGF0YSAmJiBzdHJpcC50YWJzW2ldLnBpbGxzRGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3RyaXAudGFic1tpXS5waWxsc0RhdGEubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgICAgaWYoaiA9PT0gMCApe1xuICAgICAgICAgICAgICAgIHN0cmlwLnRhYnNbaV0ucGlsbHNEYXRhW2pdLnNlbGVjdGVkID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChzdHJpcC50YWJzW2ldLnBpbGxzRGF0YVtqXSkge1xuICAgICAgICAgICAgICAgIHRhYlJlc3VsdHMucHVzaChcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc3RyaXAudGFic1tpXS5waWxsc0RhdGFbal0sXG4gICAgICAgICAgICAgICAgICAgIGZldGNoVGFiU3RhdHVzOiAnZG9uZScsXG4gICAgICAgICAgICAgICAgICAgIC4uLihzcGxpdERhdGEuZmluZChpdG1Jbm5lciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwLnRhYnNbaV0ucGlsbHNEYXRhJiYgc3RyaXAudGFic1tpXS5waWxsc0RhdGFbal0gJiYgaXRtSW5uZXIudmFsdWUgPT09IHN0cmlwLnRhYnNbaV0ucGlsbHNEYXRhW2pdLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRtSW5uZXI7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJpcC50YWJzW2ldLnBpbGxzRGF0YSA9IHRhYlJlc3VsdHNcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0cmlwLnRhYnM7XG4gIH1cblxuICBnZXRUYWJzTGlzdChhcnJheTogTnNDb250ZW50LklDb250ZW50W10sXG4gICAgICAgICAgICAgIHN0cmlwOiBOc0NvbnRlbnRTdHJpcFdpdGhUYWJzLklDb250ZW50U3RyaXBVbml0KSB7XG4gICAgbGV0IGFsbDogYW55W10gPSBbXTtcbiAgICBsZXQgdXBjb21pbmc6IGFueVtdID0gW107XG4gICAgbGV0IG92ZXJkdWU6IGFueVtdID0gW107XG4gICAgYXJyYXkuZm9yRWFjaCgoZTogYW55KSA9PiB7XG4gICAgICBhbGwucHVzaChlKTtcbiAgICAgIGlmIChlLnBsYW5EdXJhdGlvbiA9PT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSkge1xuICAgICAgICBvdmVyZHVlLnB1c2goZSk7XG4gICAgICB9IGVsc2UgaWYgKGUucGxhbkR1cmF0aW9uID09PSBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5VUENPTUlORykge1xuICAgICAgICB1cGNvbWluZy5wdXNoKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGFsbENvbXBsZXRlZCA9IGFsbC5maWx0ZXIoKGFsbERhdGE6IGFueSkgPT4gYWxsRGF0YS5jb250ZW50U3RhdHVzID09PSAyKTtcbiAgICBsZXQgYWxsSW5Db21wbGV0ZWQgPSBhbGwuZmlsdGVyKChhbGxEYXRhOiBhbnkpID0+IGFsbERhdGEuY29udGVudFN0YXR1cyA8IDIpO1xuXG4gICAgbGV0IGFsbENvbXBsZXRlZE92ZXJEdWUgPSBhbGxDb21wbGV0ZWQuZmlsdGVyKChhbGxEYXRhOiBhbnkpID0+IGFsbERhdGEucGxhbkR1cmF0aW9uID09PSBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5PVkVSRFVFKTtcbiAgICBjb25zdCBhbGxDb21wbGV0ZWRBbGwgPSBhbGxDb21wbGV0ZWQuZmlsdGVyKChhbGxEYXRhOiBhbnkpID0+ICBhbGxEYXRhLnBsYW5EdXJhdGlvbiAhPT0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSk7XG5cbiAgICBhbGxDb21wbGV0ZWRPdmVyRHVlID0gYWxsQ29tcGxldGVkT3ZlckR1ZS5zb3J0KChhOiBhbnksIGI6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoYS5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUgJiYgYi5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUpIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXRlOiBhbnkgPSBuZXcgRGF0ZShhLmVuZERhdGUpO1xuICAgICAgICBjb25zdCBzZWNvbmREYXRlOiBhbnkgPSBuZXcgRGF0ZShiLmVuZERhdGUpO1xuICAgICAgICByZXR1cm4gIGZpcnN0RGF0ZSA+IHNlY29uZERhdGUgID8gLTEgOiAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWxsSW5Db21wbGV0ZWQgPSBhbGxJbkNvbXBsZXRlZC5zb3J0KChhOiBhbnksIGI6IGFueSk6IGFueSA9PiB7XG4gICAgICBpZiAoYS5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUgJiYgYi5wbGFuRHVyYXRpb24gPT09IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUpIHtcbiAgICAgICAgY29uc3QgZmlyc3REYXRlOiBhbnkgPSBuZXcgRGF0ZShhLmVuZERhdGUpO1xuICAgICAgICBjb25zdCBzZWNvbmREYXRlOiBhbnkgPSBuZXcgRGF0ZShiLmVuZERhdGUpO1xuICAgICAgICByZXR1cm4gIGZpcnN0RGF0ZSA+IHNlY29uZERhdGUgID8gLTEgOiAxO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWxsID0gWy4uLmFsbEluQ29tcGxldGVkLCAuLi5hbGxDb21wbGV0ZWRBbGwsIC4uLmFsbENvbXBsZXRlZE92ZXJEdWVdO1xuXG4gICAgb3ZlcmR1ZSA9IG92ZXJkdWUuZmlsdGVyKChkYXRhOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgcmV0dXJuIGRhdGEuY29udGVudFN0YXR1cyA8IDI7XG4gICAgfSk7XG5cbiAgICBvdmVyZHVlID0gb3ZlcmR1ZS5zb3J0KChhOiBhbnksIGI6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGNvbnN0IGZpcnN0RGF0ZTogYW55ID0gbmV3IERhdGUoYS5lbmREYXRlKTtcbiAgICAgICAgY29uc3Qgc2Vjb25kRGF0ZTogYW55ID0gbmV3IERhdGUoYi5lbmREYXRlKTtcbiAgICAgICAgcmV0dXJuICBmaXJzdERhdGUgPiBzZWNvbmREYXRlICA/IC0xIDogMTtcbiAgICB9KTtcblxuICAgIHVwY29taW5nID0gdXBjb21pbmcuZmlsdGVyKChkYXRhOiBhbnkpOiBhbnkgPT4ge1xuICAgICAgcmV0dXJuIGRhdGEuY29udGVudFN0YXR1cyA8IDI7XG4gICAgfSk7XG4gICAgLy8gdGhpcy5nZXRTZWxlY3RlZEluZGV4KDEpXG4gICAgcmV0dXJuIFtcbiAgICB7IHZhbHVlOiAnYWxsJywgd2lkZ2V0czogdGhpcy50cmFuc2Zvcm1Db250ZW50c1RvV2lkZ2V0cyhhbGwsIHN0cmlwKSB9LFxuICAgIHsgdmFsdWU6ICd1cGNvbWluZycsIHdpZGdldHM6IHRoaXMudHJhbnNmb3JtQ29udGVudHNUb1dpZGdldHModXBjb21pbmcsIHN0cmlwKSB9LFxuICAgIHsgdmFsdWU6ICdjb21wbGV0ZWQnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKGFsbENvbXBsZXRlZCwgc3RyaXApIH0sXG4gICAgeyB2YWx1ZTogJ292ZXJkdWUnLCB3aWRnZXRzOiB0aGlzLnRyYW5zZm9ybUNvbnRlbnRzVG9XaWRnZXRzKG92ZXJkdWUsIHN0cmlwKSB9XTtcbiAgfVxuICByZXNldFNlbGVjdGVkUGlsbChwaWxsRGF0YTogYW55KXtcbiAgICBpZihwaWxsRGF0YSAmJiBwaWxsRGF0YS5sZW5ndGgpe1xuICAgICAgcGlsbERhdGEuZm9yRWFjaCgocGlsbDogYW55KSA9PiB7XG4gICAgICAgIHBpbGxbJ3NlbGVjdGVkJ10gPSBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbn1cbiJdfQ==