@coolon/angular-ui-powerups 0.0.97 → 0.0.101

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 (79) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +1405 -1305
  2. package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
  3. package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
  4. package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
  5. package/coolon-angular-ui-powerups.d.ts +19 -19
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +19 -19
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/interaction/components/activity-container/activity-container.component.js +20 -6
  10. package/esm2015/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +18 -7
  11. package/esm2015/lib/interaction/index.js +5 -4
  12. package/esm2015/lib/interaction/interaction-context.js +7 -53
  13. package/esm2015/lib/interaction/interaction.module.js +3 -3
  14. package/esm2015/lib/interaction/services/interaction.service.js +228 -0
  15. package/esm2015/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context-factory.js +62 -0
  16. package/esm2015/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context.js +145 -0
  17. package/esm2015/lib/interaction/services/modal-interaction-context.factory.js +17 -0
  18. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +3 -3
  19. package/esm2015/lib/place/guards/abstract-place.guard.js +13 -12
  20. package/esm2015/lib/place/guards/interaction.guard.js +27 -19
  21. package/esm2015/lib/place/guards/navigation-state.js +676 -0
  22. package/esm2015/lib/place/guards/place-component-deactivation-handler.js +14 -37
  23. package/esm2015/lib/place/index.js +2 -2
  24. package/esm2015/lib/place/place-router.js +163 -161
  25. package/esm2015/lib/place/url-snapshot.js +91 -19
  26. package/esm2015/public_api.js +3 -3
  27. package/esm5/coolon-angular-ui-powerups.js +19 -19
  28. package/esm5/index.js +2 -2
  29. package/esm5/lib/interaction/components/activity-container/activity-container.component.js +24 -15
  30. package/esm5/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.js +15 -7
  31. package/esm5/lib/interaction/index.js +5 -4
  32. package/esm5/lib/interaction/interaction-context.js +8 -61
  33. package/esm5/lib/interaction/interaction.module.js +3 -3
  34. package/esm5/lib/interaction/services/interaction.service.js +271 -0
  35. package/esm5/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context-factory.js +65 -0
  36. package/esm5/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context.js +170 -0
  37. package/esm5/lib/interaction/services/modal-interaction-context.factory.js +27 -0
  38. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +3 -3
  39. package/esm5/lib/place/guards/abstract-place.guard.js +15 -14
  40. package/esm5/lib/place/guards/interaction.guard.js +25 -17
  41. package/esm5/lib/place/guards/navigation-state.js +894 -0
  42. package/esm5/lib/place/guards/place-component-deactivation-handler.js +21 -55
  43. package/esm5/lib/place/index.js +2 -2
  44. package/esm5/lib/place/place-router.js +186 -269
  45. package/esm5/lib/place/url-snapshot.js +105 -21
  46. package/esm5/public_api.js +3 -3
  47. package/fesm2015/coolon-angular-ui-powerups.js +1142 -990
  48. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  49. package/fesm5/coolon-angular-ui-powerups.js +1350 -1250
  50. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  51. package/lib/interaction/components/activity-container/activity-container.component.d.ts +2 -1
  52. package/lib/interaction/components/inplace-interaction-context/inplace-interaction-context.component.d.ts +3 -1
  53. package/lib/interaction/index.d.ts +4 -3
  54. package/lib/interaction/interaction-context.d.ts +2 -11
  55. package/lib/interaction/services/interaction.service.d.ts +46 -0
  56. package/lib/interaction/services/mat-dialog-interaction/dialog-interaction-context-factory.d.ts +15 -0
  57. package/lib/interaction/services/{dialog-interaction-context.d.ts → mat-dialog-interaction/dialog-interaction-context.d.ts} +2 -2
  58. package/lib/interaction/services/modal-interaction-context.factory.d.ts +4 -0
  59. package/lib/place/guards/abstract-place.guard.d.ts +1 -1
  60. package/lib/place/guards/interaction.guard.d.ts +3 -3
  61. package/lib/place/guards/navigation-state.d.ts +124 -0
  62. package/lib/place/guards/place-component-deactivation-handler.d.ts +3 -5
  63. package/lib/place/index.d.ts +1 -1
  64. package/lib/place/place-router.d.ts +17 -24
  65. package/lib/place/url-snapshot.d.ts +18 -6
  66. package/package.json +1 -1
  67. package/schematics/place-routes/templates/place-routes.ts.template +3 -3
  68. package/styles/styles.scss +1 -1
  69. package/esm2015/lib/interaction/services/dialog-interaction-context.js +0 -163
  70. package/esm2015/lib/interaction/services/dialog-interaction.service.js +0 -151
  71. package/esm2015/lib/interaction/services/modal-interaction.service.js +0 -109
  72. package/esm2015/lib/place/guards/navigation-session.js +0 -590
  73. package/esm5/lib/interaction/services/dialog-interaction-context.js +0 -188
  74. package/esm5/lib/interaction/services/dialog-interaction.service.js +0 -179
  75. package/esm5/lib/interaction/services/modal-interaction.service.js +0 -153
  76. package/esm5/lib/place/guards/navigation-session.js +0 -741
  77. package/lib/interaction/services/dialog-interaction.service.d.ts +0 -24
  78. package/lib/interaction/services/modal-interaction.service.d.ts +0 -15
  79. package/lib/place/guards/navigation-session.d.ts +0 -96
@@ -6,40 +6,44 @@ import * as tslib_1 from "tslib";
6
6
  import { Location } from '@angular/common';
7
7
  import { Injectable } from '@angular/core';
8
8
  import { NavigationCancel, NavigationEnd, NavigationError, NavigationStart, Router, UrlSerializer } from '@angular/router';
9
- import { Dsl, GarbageCollector, lang, Logger, MutableListModel, MutableValueModel } from '@coolon/pectin';
9
+ import { assert, Dsl, GarbageCollector, lang, Logger, MutableListModel, MutableStream, MutableValueModel, Trace } from '@coolon/pectin';
10
10
  import _ from 'lodash';
11
- import { ModalInteractionService } from '../interaction/services/modal-interaction.service';
12
- import { NavigationSession } from './guards/navigation-session';
11
+ import { InteractionService } from '../interaction/services/interaction.service';
12
+ import { NavigationState } from './guards/navigation-state';
13
13
  import { PlaceHistory } from './place-history';
14
14
  import { UrlSnapshot } from './url-snapshot';
15
15
  import * as i0 from "@angular/core";
16
16
  import * as i1 from "@angular/router";
17
17
  import * as i2 from "@angular/common";
18
18
  import * as i3 from "./place-history";
19
- import * as i4 from "../interaction/services/modal-interaction.service";
19
+ import * as i4 from "../interaction/services/interaction.service";
20
20
  var PlaceRouter = /** @class */ (function (_super) {
21
21
  tslib_1.__extends(PlaceRouter, _super);
22
- function PlaceRouter(router, urlSerializer, angularLocation, placeHistory, modalInteractionService) {
22
+ function PlaceRouter(router, urlSerializer, angularLocation, placeHistory, interactionService) {
23
23
  var _this = _super.call(this) || this;
24
24
  _this.router = router;
25
25
  _this.urlSerializer = urlSerializer;
26
26
  _this.angularLocation = angularLocation;
27
27
  _this.placeHistory = placeHistory;
28
- _this.modalInteractionService = modalInteractionService;
29
- _this.firstRoute = true;
30
- _this._navigationSessionModel = new MutableValueModel();
28
+ _this.interactionService = interactionService;
29
+ _this._navigationStateModel = new MutableValueModel();
31
30
  _this._activeVisits = new MutableListModel();
32
31
  var _a = Dsl.disposeWith(_this), chain = _a.chain, valueOf = _a.valueOf, before = _a.before, when = _a.when, after = _a.after, observe = _a.observe, switchOn = _a.switchOn;
33
32
  _this.activeVisitIndex = chain(_this._activeVisits).indexBy('placeDefinition');
34
- _this.navigationSessionActive = chain(_this.navigationSessionModel).pluck('active');
35
- _this._navigationSessionContext = new NavigationSession.Context(_this.router, _this.modalInteractionService, _this.angularLocation, (/**
33
+ _this.navigationInProgress = chain(_this.navigationStateModel).pluck('isTransitional');
34
+ _this._navigationSessionContext = new NavigationState.Context(_this, _this.interactionService, (/**
36
35
  * @param {?} session
37
36
  * @return {?}
38
37
  */
39
38
  function (session) {
40
39
  _this.processNavigationSuccess(session);
41
40
  }));
42
- _this._navigationSessionModel.value = new NavigationSession.Idle(_this._navigationSessionContext);
41
+ _this._navigationStateModel.value = new NavigationState.Idle(_this._navigationSessionContext);
42
+ _this._navigationStateTypeModel = chain(_this._navigationStateModel).map((/**
43
+ * @param {?} state
44
+ * @return {?}
45
+ */
46
+ function (state) { return (/** @type {?} */ (state.constructor)); }));
43
47
  // TODO: make setup the callbacks in during module initiation to make this testable.
44
48
  _this.router.events.subscribe((/**
45
49
  * @param {?} event
@@ -53,53 +57,85 @@ var PlaceRouter = /** @class */ (function (_super) {
53
57
  // NavigationStart -> .... -> NavigationError --> navigation aborted, end session.
54
58
  // =======================
55
59
  if (event instanceof NavigationStart) {
56
- _this.runStateTransition((/**
57
- * @param {?} session
58
- * @return {?}
59
- */
60
- function (session) { return session.onStart(event); }));
60
+ console.log(event);
61
+ if (event.navigationTrigger === 'popstate') {
62
+ _this.runStateTransition((/**
63
+ * @param {?} state
64
+ * @return {?}
65
+ */
66
+ function (state) { return state.onPopState(event); }));
67
+ }
68
+ else {
69
+ _this.runStateTransition((/**
70
+ * @param {?} state
71
+ * @return {?}
72
+ */
73
+ function (state) { return state.onStart(event); }));
74
+ }
61
75
  }
62
76
  if (event instanceof NavigationEnd) {
77
+ console.log(event);
63
78
  _this.runStateTransition((/**
64
- * @param {?} session
79
+ * @param {?} state
65
80
  * @return {?}
66
81
  */
67
- function (session) { return session.onEnd(event); }));
82
+ function (state) { return state.onEnd(event); }));
68
83
  }
69
84
  if (event instanceof NavigationError) {
85
+ console.log(event);
70
86
  _this.runStateTransition((/**
71
- * @param {?} session
87
+ * @param {?} state
72
88
  * @return {?}
73
89
  */
74
- function (session) { return session.onError(event); }));
90
+ function (state) { return state.onError(event); }));
75
91
  }
76
92
  if (event instanceof NavigationCancel) {
93
+ console.log(event);
77
94
  _this.runStateTransition((/**
78
- * @param {?} session
95
+ * @param {?} state
79
96
  * @return {?}
80
97
  */
81
- function (session) { return session.onCancel(event); }));
98
+ function (state) { return state.onCancel(event); }));
82
99
  }
83
100
  }));
84
101
  // Push dialog state to the url so we can capture the back button.
85
- _this.modalInteractionService.addActivityListener(new PlaceRouter.InteractionRouteMediator(_this.navigationSessionActive, _this.router));
102
+ when.listOf(_this.interactionService.activeInteractionContextIds).changes((/**
103
+ * @param {?} ids
104
+ * @param {?} previous
105
+ * @return {?}
106
+ */
107
+ function (ids, previous) {
108
+ _this.syncInteractionIdsWithRouter();
109
+ }), { unless: _this.navigationInProgress }); // TODO: I think the exclusive interaction prevents interactions starting while it's active so we might not need this.
110
+ // TODO: I think the exclusive interaction prevents interactions starting while it's active so we might not need this.
111
+ /** @type {?} */
112
+ var urlChanges = new MutableStream();
86
113
  // The angular router doesn't always fire router events when the back button is pushed while a navigation
87
114
  // session is in progress. Sometimes we only know about it from the url change.
115
+ // IMPORTANT ORDER DEPENDENCY
116
+ // This only works because we're notified of the change after the router has started reacting to it. This
117
+ // we can can use our navigationState to determine things.
88
118
  angularLocation.onUrlChange((/**
89
119
  * @param {?} url
90
120
  * @return {?}
91
121
  */
92
122
  function (url) {
93
- console.log("#### url changed -> " + url);
94
123
  /** @type {?} */
95
- var interactionContext = _this.navigationSessionActive.value && _this.navigationSession.interactionContext;
96
- if (interactionContext && interactionContext.isActive()) {
97
- Logger.get(_this).info("back button pressed during navigation session interaction");
98
- _this.runStateTransition((/**
99
- * @param {?} navigationSession
100
- * @return {?}
101
- */
102
- function (navigationSession) { return navigationSession.onBackClickedDuringNavigationInteraction(url); }));
124
+ var navigationState = _this._navigationStateModel.value;
125
+ console.log("URLChange -> " + url, { state: navigationState });
126
+ urlChanges.publish({ url: url, state: navigationState });
127
+ // We've entered a navigation transition
128
+ if (navigationState instanceof NavigationState.NavigationTransition) {
129
+ /** @type {?} */
130
+ var navigationInteraction = _this.navigationState.interactionContext;
131
+ if (navigationInteraction && navigationInteraction.isActive()) {
132
+ Logger.get(_this).info("back button pressed during navigation session interaction promise");
133
+ _this.runStateTransition((/**
134
+ * @param {?} state
135
+ * @return {?}
136
+ */
137
+ function (state) { return state.onBackClickedDuringNavigationInteraction(url); }));
138
+ }
103
139
  }
104
140
  }));
105
141
  return _this;
@@ -116,6 +152,9 @@ var PlaceRouter = /** @class */ (function (_super) {
116
152
  */
117
153
  function (session) {
118
154
  var _this = this;
155
+ // We need to update the visits before the session finishes. This allows the placeOutets to ignore visit
156
+ // changes that occur while routerNavigationActive is true.
157
+ assert.isTruthy(this.navigationInProgress.value);
119
158
  /** @type {?} */
120
159
  var visits = session.getVisits();
121
160
  visits.forEach((/**
@@ -123,26 +162,24 @@ var PlaceRouter = /** @class */ (function (_super) {
123
162
  * @return {?}
124
163
  */
125
164
  function (v) { return _this.placeHistory.add(v); }));
126
- // Update visits before we end the navigation session. This allows the placeOutets to
127
- // ignore visit changes that occur while the navigation is in progress
128
165
  this._activeVisits.value = visits;
129
166
  };
130
- Object.defineProperty(PlaceRouter.prototype, "navigationSession", {
167
+ Object.defineProperty(PlaceRouter.prototype, "navigationState", {
131
168
  get: /**
132
169
  * @return {?}
133
170
  */
134
171
  function () {
135
- return this._navigationSessionModel.value;
172
+ return this._navigationStateModel.value;
136
173
  },
137
174
  enumerable: true,
138
175
  configurable: true
139
176
  });
140
- Object.defineProperty(PlaceRouter.prototype, "navigationSessionModel", {
177
+ Object.defineProperty(PlaceRouter.prototype, "navigationStateModel", {
141
178
  get: /**
142
179
  * @return {?}
143
180
  */
144
181
  function () {
145
- return this._navigationSessionModel.readonly;
182
+ return this._navigationStateModel.readonly;
146
183
  },
147
184
  enumerable: true,
148
185
  configurable: true
@@ -233,7 +270,7 @@ var PlaceRouter = /** @class */ (function (_super) {
233
270
  */
234
271
  function (router) {
235
272
  /** @type {?} */
236
- var commands = _this.parseUrl(_this.router.routerState.snapshot).createRedirectCommandsFor(next);
273
+ var commands = _this.parseUrl(_this.router.routerState.snapshot.url).createRedirectCommandsFor(next);
237
274
  console.log('### Push Changes to route Redirect', { commands: commands });
238
275
  return router.navigate(commands);
239
276
  }))];
@@ -258,7 +295,7 @@ var PlaceRouter = /** @class */ (function (_super) {
258
295
  return tslib_1.__generator(this, function (_a) {
259
296
  switch (_a.label) {
260
297
  case 0:
261
- if (this.navigationSessionActive.value) {
298
+ if (this.navigationInProgress.value) {
262
299
  lang.illegalState('Navigation already in progress');
263
300
  }
264
301
  this.runStateTransition((/**
@@ -267,7 +304,7 @@ var PlaceRouter = /** @class */ (function (_super) {
267
304
  */
268
305
  function (current) {
269
306
  /** @type {?} */
270
- var session = new NavigationSession.Active(_this._navigationSessionContext, false, _this.router.routerState.snapshot.url);
307
+ var session = new NavigationState.NavigationTransition(_this._navigationSessionContext, false, _this.router.routerState.snapshot.url);
271
308
  session.storeVisit(visit);
272
309
  return session;
273
310
  }));
@@ -281,7 +318,7 @@ var PlaceRouter = /** @class */ (function (_super) {
281
318
  case 3:
282
319
  // Router has finished (since there was no router change required) so we
283
320
  // need to end the navigation session.
284
- if (this.navigationSession.active && !this.router.getCurrentNavigation()) {
321
+ if (this.navigationState.isTransitional && !this.router.getCurrentNavigation()) {
285
322
  this.runStateTransition((/**
286
323
  * @param {?} session
287
324
  * @return {?}
@@ -306,10 +343,10 @@ var PlaceRouter = /** @class */ (function (_super) {
306
343
  */
307
344
  function (transition) {
308
345
  /** @type {?} */
309
- var previous = this._navigationSessionModel.value;
346
+ var previous = this._navigationStateModel.value;
310
347
  /** @type {?} */
311
- var next = transition(this.navigationSession);
312
- this._navigationSessionModel.value = next;
348
+ var next = transition(this.navigationState);
349
+ this._navigationStateModel.value = next;
313
350
  if (next !== previous) {
314
351
  previous.dispose();
315
352
  Logger.get(this).info("Router State Transition: " + previous.toString() + " -> " + next.toString());
@@ -332,144 +369,11 @@ var PlaceRouter = /** @class */ (function (_super) {
332
369
  [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
333
370
  [def.getFormattedRouteParameters(visit)];
334
371
  };
335
- // private onAngularRouterStarted(event: NavigationStart) {
336
- // if (!this.navigationSession) {
337
- // // We been activated by an external route rather than placeRouter.go(visit)
338
- // this._navigationSessionModel.value = this.createExternalNavigationSession(event);
339
- // }
340
- // this.firstRoute = false;
341
- // }
342
- //
343
- // private createExternalNavigationSession(event: NavigationStart) {
344
- // return new NavigationSession.Active(
345
- // this.modalInteractionService,
346
- // this.angularLocation,
347
- // // event.url,
348
- // event.navigationTrigger === 'popstate'
349
- // );
350
- // }
351
- // private onAngularRouterFinished(cancelled: boolean) {
352
- // const session = this._navigationSessionModel.value;
353
- // if (session.backClickedDuringCanDeactivateInteraction) {
354
- // // we swallow this finished event but keep the session alive as we're going to
355
- // // get another route started event, which will trigger anohter canDeactivate dialog
356
- // // if we start a new session.
357
- // // session.resetInteractionSession()
358
- // } else {
359
- // if (!cancelled) {
360
- // const visits = session.getVisits();
361
- // visits.forEach(v => this.placeHistory.add(v));
362
- // // Update visits before we end the navigation session. This allows the placeOutets to
363
- // // ignore visit changes that occur while the navigation is in progress
364
- // this._activeVisits.value = visits;
365
- // } else {
366
- // // TODO: move this to the navigation session
367
- // // Angular doesn't preserve the url when a guard cancels the back button.
368
- // // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
369
- // // session.rememberPopStateReturnUrl(this.router.routerState.snapshot.url);
370
- // if (session.isPopState) {
371
- // console.log('cancelled during popstate');
372
- // // this.angularLocation.go(session.previousUrl);
373
- // }
374
- // }
375
- // session.dispose();
376
- // this._navigationSessionModel.value = null;
377
- // }
378
- // }
379
- // private onAngularRouterStarted(event: NavigationStart) {
380
- // if (!this.navigationSession) {
381
- // // We been activated by an external route rather than placeRouter.go(visit)
382
- // this._navigationSessionModel.value = this.createExternalNavigationSession(event);
383
- // }
384
- // this.firstRoute = false;
385
- // }
386
- //
387
- // private createExternalNavigationSession(event: NavigationStart) {
388
- // return new NavigationSession.Active(
389
- // this.modalInteractionService,
390
- // this.angularLocation,
391
- // // event.url,
392
- // event.navigationTrigger === 'popstate'
393
- // );
394
- // }
395
- // private onAngularRouterFinished(cancelled: boolean) {
396
- // const session = this._navigationSessionModel.value;
397
- // if (session.backClickedDuringCanDeactivateInteraction) {
398
- // // we swallow this finished event but keep the session alive as we're going to
399
- // // get another route started event, which will trigger anohter canDeactivate dialog
400
- // // if we start a new session.
401
- // // session.resetInteractionSession()
402
- // } else {
403
- // if (!cancelled) {
404
- // const visits = session.getVisits();
405
- // visits.forEach(v => this.placeHistory.add(v));
406
- // // Update visits before we end the navigation session. This allows the placeOutets to
407
- // // ignore visit changes that occur while the navigation is in progress
408
- // this._activeVisits.value = visits;
409
- // } else {
410
- // // TODO: move this to the navigation session
411
- // // Angular doesn't preserve the url when a guard cancels the back button.
412
- // // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
413
- // // session.rememberPopStateReturnUrl(this.router.routerState.snapshot.url);
414
- // if (session.isPopState) {
415
- // console.log('cancelled during popstate');
416
- // // this.angularLocation.go(session.previousUrl);
417
- // }
418
- // }
419
- // session.dispose();
420
- // this._navigationSessionModel.value = null;
421
- // }
422
- // }
423
372
  /**
424
373
  * @param {?} activatedRoute
425
374
  * @return {?}
426
375
  */
427
- PlaceRouter.prototype.extractChildPath =
428
- // private onAngularRouterStarted(event: NavigationStart) {
429
- // if (!this.navigationSession) {
430
- // // We been activated by an external route rather than placeRouter.go(visit)
431
- // this._navigationSessionModel.value = this.createExternalNavigationSession(event);
432
- // }
433
- // this.firstRoute = false;
434
- // }
435
- //
436
- // private createExternalNavigationSession(event: NavigationStart) {
437
- // return new NavigationSession.Active(
438
- // this.modalInteractionService,
439
- // this.angularLocation,
440
- // // event.url,
441
- // event.navigationTrigger === 'popstate'
442
- // );
443
- // }
444
- // private onAngularRouterFinished(cancelled: boolean) {
445
- // const session = this._navigationSessionModel.value;
446
- // if (session.backClickedDuringCanDeactivateInteraction) {
447
- // // we swallow this finished event but keep the session alive as we're going to
448
- // // get another route started event, which will trigger anohter canDeactivate dialog
449
- // // if we start a new session.
450
- // // session.resetInteractionSession()
451
- // } else {
452
- // if (!cancelled) {
453
- // const visits = session.getVisits();
454
- // visits.forEach(v => this.placeHistory.add(v));
455
- // // Update visits before we end the navigation session. This allows the placeOutets to
456
- // // ignore visit changes that occur while the navigation is in progress
457
- // this._activeVisits.value = visits;
458
- // } else {
459
- // // TODO: move this to the navigation session
460
- // // Angular doesn't preserve the url when a guard cancels the back button.
461
- // // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
462
- // // session.rememberPopStateReturnUrl(this.router.routerState.snapshot.url);
463
- // if (session.isPopState) {
464
- // console.log('cancelled during popstate');
465
- // // this.angularLocation.go(session.previousUrl);
466
- // }
467
- // }
468
- // session.dispose();
469
- // this._navigationSessionModel.value = null;
470
- // }
471
- // }
472
- /**
376
+ PlaceRouter.prototype.extractChildPath = /**
473
377
  * @param {?} activatedRoute
474
378
  * @return {?}
475
379
  */
@@ -481,15 +385,97 @@ var PlaceRouter = /** @class */ (function (_super) {
481
385
  function (child) { return child.url; })));
482
386
  };
483
387
  /**
484
- * @param {?} snapshot
388
+ * @param {?} url
485
389
  * @return {?}
486
390
  */
487
391
  PlaceRouter.prototype.parseUrl = /**
488
- * @param {?} snapshot
392
+ * @param {?} url
393
+ * @return {?}
394
+ */
395
+ function (url) {
396
+ return new UrlSnapshot(this.urlSerializer, url);
397
+ };
398
+ /**
399
+ * @param {?} url
489
400
  * @return {?}
490
401
  */
491
- function (snapshot) {
492
- return new UrlSnapshot(this.urlSerializer.parse(snapshot.url));
402
+ PlaceRouter.prototype.resetBrowserLocation = /**
403
+ * @param {?} url
404
+ * @return {?}
405
+ */
406
+ function (url) {
407
+ this.angularLocation.go(url);
408
+ };
409
+ /**
410
+ * @return {?}
411
+ */
412
+ PlaceRouter.prototype.getCurrentRouterUrl = /**
413
+ * @return {?}
414
+ */
415
+ function () {
416
+ return this.router.routerState ? this.router.routerState.snapshot.url : null;
417
+ };
418
+ /**
419
+ * @param {?} url
420
+ * @return {?}
421
+ */
422
+ PlaceRouter.prototype.getActiveInteractionIdsFromUrl = /**
423
+ * @param {?} url
424
+ * @return {?}
425
+ */
426
+ function (url) {
427
+ return this.parseUrl(url).getInteractionIds();
428
+ };
429
+ // @Trace()
430
+ // @Trace()
431
+ /**
432
+ * @param {?} url
433
+ * @return {?}
434
+ */
435
+ PlaceRouter.prototype.hasActiveInteractionIds =
436
+ // @Trace()
437
+ /**
438
+ * @param {?} url
439
+ * @return {?}
440
+ */
441
+ function (url) {
442
+ return this.getActiveInteractionIdsFromUrl(url).length > 0;
443
+ };
444
+ /**
445
+ * @return {?}
446
+ */
447
+ PlaceRouter.prototype.syncInteractionIdsWithRouter = /**
448
+ * @return {?}
449
+ */
450
+ function () {
451
+ var _a, _b;
452
+ assert.isFalsey(this.navigationInProgress.value); // Updating interaction routes during an existing navigation breaks all the things.
453
+ // Updating interaction routes during an existing navigation breaks all the things.
454
+ /** @type {?} */
455
+ var currentIds = this.interactionService.activeInteractionContextIds.value;
456
+ if (_.isEqual(currentIds, this.getActiveInteractionIdsFromUrl(this.getCurrentRouterUrl()))) {
457
+ console.log('activity ids were the same, skipping');
458
+ }
459
+ else {
460
+ if (currentIds.length < 1) {
461
+ this.router.navigate(['.', {
462
+ outlets: (_a = {},
463
+ _a[UrlSnapshot.INTERACTION_ROUTER_OUTLET] = null,
464
+ _a)
465
+ }], {
466
+ replaceUrl: true // remove the interaction from the history.
467
+ });
468
+ }
469
+ else {
470
+ /** @type {?} */
471
+ var urlSnapshot = this.parseUrl(this.getCurrentRouterUrl());
472
+ this.router.navigate(['.', {
473
+ outlets: (_b = {},
474
+ _b[UrlSnapshot.INTERACTION_ROUTER_OUTLET] = UrlSnapshot.createInteractionOutletRouterCommands(currentIds),
475
+ _b)
476
+ }]);
477
+ }
478
+ }
493
479
  };
494
480
  PlaceRouter.decorators = [
495
481
  { type: Injectable, args: [{
@@ -502,9 +488,15 @@ var PlaceRouter = /** @class */ (function (_super) {
502
488
  { type: UrlSerializer },
503
489
  { type: Location },
504
490
  { type: PlaceHistory },
505
- { type: ModalInteractionService }
491
+ { type: InteractionService }
506
492
  ]; };
507
- /** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i1.UrlSerializer), i0.ɵɵinject(i2.Location), i0.ɵɵinject(i3.PlaceHistory), i0.ɵɵinject(i4.ModalInteractionService)); }, token: PlaceRouter, providedIn: "root" });
493
+ /** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i1.UrlSerializer), i0.ɵɵinject(i2.Location), i0.ɵɵinject(i3.PlaceHistory), i0.ɵɵinject(i4.InteractionService)); }, token: PlaceRouter, providedIn: "root" });
494
+ tslib_1.__decorate([
495
+ Trace(),
496
+ tslib_1.__metadata("design:type", Function),
497
+ tslib_1.__metadata("design:paramtypes", []),
498
+ tslib_1.__metadata("design:returntype", void 0)
499
+ ], PlaceRouter.prototype, "syncInteractionIdsWithRouter", null);
508
500
  return PlaceRouter;
509
501
  }(GarbageCollector));
510
502
  export { PlaceRouter };
@@ -513,19 +505,14 @@ if (false) {
513
505
  * @type {?}
514
506
  * @private
515
507
  */
516
- PlaceRouter.prototype.firstRoute;
517
- /**
518
- * @type {?}
519
- * @private
520
- */
521
- PlaceRouter.prototype._navigationSessionModel;
508
+ PlaceRouter.prototype._navigationStateModel;
522
509
  /**
523
510
  * @type {?}
524
511
  * @private
525
512
  */
526
513
  PlaceRouter.prototype._activeVisits;
527
514
  /** @type {?} */
528
- PlaceRouter.prototype.navigationSessionActive;
515
+ PlaceRouter.prototype.navigationInProgress;
529
516
  /** @type {?} */
530
517
  PlaceRouter.prototype.activeVisitIndex;
531
518
  /**
@@ -533,6 +520,11 @@ if (false) {
533
520
  * @private
534
521
  */
535
522
  PlaceRouter.prototype._navigationSessionContext;
523
+ /**
524
+ * @type {?}
525
+ * @private
526
+ */
527
+ PlaceRouter.prototype._navigationStateTypeModel;
536
528
  /**
537
529
  * @type {?}
538
530
  * @private
@@ -557,81 +549,6 @@ if (false) {
557
549
  * @type {?}
558
550
  * @private
559
551
  */
560
- PlaceRouter.prototype.modalInteractionService;
552
+ PlaceRouter.prototype.interactionService;
561
553
  }
562
- (function (PlaceRouter) {
563
- PlaceRouter.INTERACTION_ROUTER_OUTLET = 'aup-interaction';
564
- var InteractionRouteMediator = /** @class */ (function () {
565
- function InteractionRouteMediator(navigationSessionModelActive, router) {
566
- this.navigationSessionModelActive = navigationSessionModelActive;
567
- this.router = router;
568
- }
569
- Object.defineProperty(InteractionRouteMediator.prototype, "isNavigating", {
570
- get: /**
571
- * @return {?}
572
- */
573
- function () {
574
- return this.navigationSessionModelActive.value;
575
- },
576
- enumerable: true,
577
- configurable: true
578
- });
579
- // If we're not in a navigation we push
580
- // @Trace()
581
- // If we're not in a navigation we push
582
- // @Trace()
583
- /**
584
- * @return {?}
585
- */
586
- InteractionRouteMediator.prototype.onActivityStarted =
587
- // If we're not in a navigation we push
588
- // @Trace()
589
- /**
590
- * @return {?}
591
- */
592
- function () {
593
- var _a;
594
- if (!this.isNavigating) {
595
- this.router.navigate(['.', {
596
- outlets: (_a = {},
597
- _a[PlaceRouter.INTERACTION_ROUTER_OUTLET] = ['modal'] // "open" must be a valid route for this outlet.
598
- ,
599
- _a)
600
- }], {
601
- replaceUrl: false,
602
- });
603
- }
604
- };
605
- // @Trace()
606
- // @Trace()
607
- /**
608
- * @return {?}
609
- */
610
- InteractionRouteMediator.prototype.onActivityFinished =
611
- // @Trace()
612
- /**
613
- * @return {?}
614
- */
615
- function () {
616
- var _a;
617
- if (!this.isNavigating) {
618
- this.router.navigate(['.', {
619
- outlets: (_a = {},
620
- _a[PlaceRouter.INTERACTION_ROUTER_OUTLET] = null,
621
- _a)
622
- }], {
623
- replaceUrl: true // remove the interaction from the history.
624
- });
625
- }
626
- };
627
- return InteractionRouteMediator;
628
- }());
629
- PlaceRouter.InteractionRouteMediator = InteractionRouteMediator;
630
- if (false) {
631
- /** @type {?} */
632
- InteractionRouteMediator.prototype.navigationSessionModelActive;
633
- /** @type {?} */
634
- InteractionRouteMediator.prototype.router;
635
- }
636
- })(PlaceRouter || (PlaceRouter = {}));
637
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixlQUFlLEVBQ2YsTUFBTSxFQUVOLGFBQWEsRUFDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxHQUFHLEVBQ0gsZ0JBQWdCLEVBRWhCLElBQUksRUFFSixNQUFNLEVBQ04sZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUM1RixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFJN0M7SUFHaUMsdUNBQWdCO0lBVy9DLHFCQUE2QixNQUFjLEVBQ2QsYUFBNEIsRUFDNUIsZUFBeUIsRUFDekIsWUFBMEIsRUFDMUIsdUJBQWdEO1FBSjdFLFlBS0UsaUJBQU8sU0E0Q1I7UUFqRDRCLFlBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixxQkFBZSxHQUFmLGVBQWUsQ0FBVTtRQUN6QixrQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQiw2QkFBdUIsR0FBdkIsdUJBQXVCLENBQXlCO1FBYnJF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Z0JBQ0UsT0FBTyxJQUFJLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDO1lBQ2pELENBQUM7OztXQUFBO1FBRUQsdUNBQXVDO1FBQ3ZDLFdBQVc7Ozs7OztRQUNYLG9EQUFpQjs7Ozs7O1FBQWpCOztZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRTt3QkFDekIsT0FBTzs0QkFDTCxHQUFDLFdBQVcsQ0FBQyx5QkFBeUIsSUFBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdEQUFnRDs7K0JBQ3BHO3FCQUNGLENBQUMsRUFBRTtvQkFDRixVQUFVLEVBQUUsS0FBSztpQkFDbEIsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDO1FBRUQsV0FBVzs7Ozs7UUFDWCxxREFBa0I7Ozs7O1FBQWxCOztZQUNFLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsRUFBRTt3QkFDekIsT0FBTzs0QkFDTCxHQUFDLFdBQVcsQ0FBQyx5QkFBeUIsSUFBRyxJQUFJOytCQUM5QztxQkFDRixDQUFDLEVBQUU7b0JBQ0YsVUFBVSxFQUFFLElBQUksQ0FBQywyQ0FBMkM7aUJBQzdELENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQztRQUVILCtCQUFDO0lBQUQsQ0FBQyxBQW5DRCxJQW1DQztJQW5DWSxvQ0FBd0IsMkJBbUNwQyxDQUFBOzs7UUFsQ2EsZ0VBQTBEOztRQUFFLDBDQUF1Qjs7QUFvQ25HLENBQUMsRUF6Q2dCLFdBQVcsS0FBWCxXQUFXLFFBeUMzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBOYXZpZ2F0aW9uQ2FuY2VsLFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBSb3V0ZXJTdGF0ZVNuYXBzaG90LFxuICBVcmxTZXJpYWxpemVyXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBEc2wsXG4gIEdhcmJhZ2VDb2xsZWN0b3IsXG4gIEhhc09uZUluZGV4Q2hhaW4sXG4gIGxhbmcsXG4gIExpc3RNb2RlbCxcbiAgTG9nZ2VyLFxuICBNdXRhYmxlTGlzdE1vZGVsLFxuICBNdXRhYmxlVmFsdWVNb2RlbCwgVHJhY2UsXG4gIFZhbHVlTW9kZWxcbn0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgTW9kYWxJbnRlcmFjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9zZXJ2aWNlcy9tb2RhbC1pbnRlcmFjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TZXNzaW9uIH0gZnJvbSAnLi9ndWFyZHMvbmF2aWdhdGlvbi1zZXNzaW9uJztcbmltcG9ydCB7IFBsYWNlSGlzdG9yeSB9IGZyb20gJy4vcGxhY2UtaGlzdG9yeSc7XG5pbXBvcnQgeyBVcmxTbmFwc2hvdCB9IGZyb20gJy4vdXJsLXNuYXBzaG90JztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi92aXNpdCc7XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxhY2VSb3V0ZXIgZXh0ZW5kcyBHYXJiYWdlQ29sbGVjdG9yIHtcblxuICBwcml2YXRlIGZpcnN0Um91dGUgPSB0cnVlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25hdmlnYXRpb25TZXNzaW9uTW9kZWwgPSBuZXcgTXV0YWJsZVZhbHVlTW9kZWw8TmF2aWdhdGlvblNlc3Npb24+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2ZVZpc2l0cyA9IG5ldyBNdXRhYmxlTGlzdE1vZGVsPFZpc2l0PigpO1xuXG4gIHJlYWRvbmx5IG5hdmlnYXRpb25TZXNzaW9uQWN0aXZlOiBWYWx1ZU1vZGVsPGJvb2xlYW4+O1xuICByZWFkb25seSBhY3RpdmVWaXNpdEluZGV4OiBIYXNPbmVJbmRleENoYWluPCdwbGFjZURlZmluaXRpb24nLCBWaXNpdD47XG4gIHByaXZhdGUgX25hdmlnYXRpb25TZXNzaW9uQ29udGV4dDogTmF2aWdhdGlvblNlc3Npb24uQ29udGV4dDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVybFNlcmlhbGl6ZXI6IFVybFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhckxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwbGFjZUhpc3Rvcnk6IFBsYWNlSGlzdG9yeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtb2RhbEludGVyYWN0aW9uU2VydmljZTogTW9kYWxJbnRlcmFjdGlvblNlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIGNvbnN0IHsgY2hhaW4sIHZhbHVlT2YsIGJlZm9yZSwgd2hlbiwgYWZ0ZXIsIG9ic2VydmUsIHN3aXRjaE9uIH0gPSBEc2wuZGlzcG9zZVdpdGgodGhpcyk7XG4gICAgdGhpcy5hY3RpdmVWaXNpdEluZGV4ID0gY2hhaW4odGhpcy5fYWN0aXZlVmlzaXRzKS5pbmRleEJ5KCdwbGFjZURlZmluaXRpb24nKTtcbiAgICB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlID0gY2hhaW4odGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKS5wbHVjaygnYWN0aXZlJyk7XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Db250ZXh0ID0gbmV3IE5hdmlnYXRpb25TZXNzaW9uLkNvbnRleHQodGhpcy5yb3V0ZXIsIHRoaXMubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UsIHRoaXMuYW5ndWxhckxvY2F0aW9uLCBzZXNzaW9uID0+IHtcbiAgICAgIHRoaXMucHJvY2Vzc05hdmlnYXRpb25TdWNjZXNzKHNlc3Npb24pO1xuICAgIH0pO1xuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBuZXcgTmF2aWdhdGlvblNlc3Npb24uSWRsZSh0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQpO1xuXG4gICAgLy8gVE9ETzogbWFrZSBzZXR1cCB0aGUgY2FsbGJhY2tzIGluIGR1cmluZyBtb2R1bGUgaW5pdGlhdGlvbiB0byBtYWtlIHRoaXMgdGVzdGFibGUuXG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAvLyBSb3V0aW5nIGV2ZW50IHNlcXVlbmNlXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uQ2FuY2VsIC0tPiByZWRpcmVjdCwgZ28gYXJvdW5kIGFnYWluIGluIHRoZSBzYW1lIHNlc3Npb25cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25FbmQgLS0+IG5hdmlnYXRpb24gY29tcGxldGUsIGVuZCBzZXNzaW9uLlxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVycm9yIC0tPiBuYXZpZ2F0aW9uIGFib3J0ZWQsIGVuZCBzZXNzaW9uLlxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25TdGFydChldmVudCkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25FbmQoZXZlbnQpKTtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25FcnJvcihldmVudCkpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkNhbmNlbCkge1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzZXNzaW9uID0+IHNlc3Npb24ub25DYW5jZWwoZXZlbnQpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFB1c2ggZGlhbG9nIHN0YXRlIHRvIHRoZSB1cmwgc28gd2UgY2FuIGNhcHR1cmUgdGhlIGJhY2sgYnV0dG9uLlxuICAgIHRoaXMubW9kYWxJbnRlcmFjdGlvblNlcnZpY2UuYWRkQWN0aXZpdHlMaXN0ZW5lcihuZXcgUGxhY2VSb3V0ZXIuSW50ZXJhY3Rpb25Sb3V0ZU1lZGlhdG9yKHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUsIHRoaXMucm91dGVyKSk7XG5cbiAgICAvLyBUaGUgYW5ndWxhciByb3V0ZXIgZG9lc24ndCBhbHdheXMgZmlyZSByb3V0ZXIgZXZlbnRzIHdoZW4gdGhlIGJhY2sgYnV0dG9uIGlzIHB1c2hlZCB3aGlsZSBhIG5hdmlnYXRpb25cbiAgICAvLyBzZXNzaW9uIGlzIGluIHByb2dyZXNzLiAgU29tZXRpbWVzIHdlIG9ubHkga25vdyBhYm91dCBpdCBmcm9tIHRoZSB1cmwgY2hhbmdlLlxuICAgIGFuZ3VsYXJMb2NhdGlvbi5vblVybENoYW5nZSh1cmwgPT4ge1xuICAgICAgY29uc29sZS5sb2coYCMjIyMgdXJsIGNoYW5nZWQgLT4gJHt1cmx9YCk7XG4gICAgICBjb25zdCBpbnRlcmFjdGlvbkNvbnRleHQgPSB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlLnZhbHVlICYmIHRoaXMubmF2aWdhdGlvblNlc3Npb24uaW50ZXJhY3Rpb25Db250ZXh0O1xuICAgICAgaWYgKGludGVyYWN0aW9uQ29udGV4dCAmJiBpbnRlcmFjdGlvbkNvbnRleHQuaXNBY3RpdmUoKSkge1xuICAgICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYGJhY2sgYnV0dG9uIHByZXNzZWQgZHVyaW5nIG5hdmlnYXRpb24gc2Vzc2lvbiBpbnRlcmFjdGlvbmApO1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihuYXZpZ2F0aW9uU2Vzc2lvbiA9PiBuYXZpZ2F0aW9uU2Vzc2lvbi5vbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKHVybCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzTmF2aWdhdGlvblN1Y2Nlc3Moc2Vzc2lvbjogTmF2aWdhdGlvblNlc3Npb24pIHtcbiAgICBjb25zdCB2aXNpdHMgPSBzZXNzaW9uLmdldFZpc2l0cygpO1xuICAgIHZpc2l0cy5mb3JFYWNoKHYgPT4gdGhpcy5wbGFjZUhpc3RvcnkuYWRkKHYpKTtcbiAgICAvLyBVcGRhdGUgdmlzaXRzIGJlZm9yZSB3ZSBlbmQgdGhlIG5hdmlnYXRpb24gc2Vzc2lvbi4gIFRoaXMgYWxsb3dzIHRoZSBwbGFjZU91dGV0cyB0b1xuICAgIC8vIGlnbm9yZSB2aXNpdCBjaGFuZ2VzIHRoYXQgb2NjdXIgd2hpbGUgdGhlIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3NcbiAgICB0aGlzLl9hY3RpdmVWaXNpdHMudmFsdWUgPSB2aXNpdHM7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvblNlc3Npb24oKTogTmF2aWdhdGlvblNlc3Npb24ge1xuICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnZhbHVlO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uTW9kZWwoKTogVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU2Vzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsLnJlYWRvbmx5O1xuICB9XG5cbiAgZ2V0IGFjdGl2ZVZpc2l0cygpOiBMaXN0TW9kZWw8VmlzaXQ+IHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlVmlzaXRzLnJlYWRvbmx5O1xuICB9XG5cbiAgLyoqXG4gICAqICBwbGFjZVJvdXRlci5uYXZpZ2F0ZShwbGFjZURlc3RpbmF0aW9ucy5zb21lUGxhY2UuY3JlYXRlVmlzaXQocm91dGVJZCwgLi4udmlzaXRQYXJhbXMpKTtcbiAgICogQHBhcmFtIHZpc2l0XG4gICAqL1xuICBhc3luYyBuYXZpZ2F0ZSh2aXNpdDogVmlzaXQsIG9wdGlvbnM/OiB7IHJlbGF0aXZlVG86IEFjdGl2YXRlZFJvdXRlIH0pIHtcbiAgICB0aGlzLmRvTmF2aWdhdGlvbih2aXNpdCwgYXN5bmMgcm91dGVyID0+IHtcbiAgICAgIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgICAgICB2aXNpdC5wbGFjZURlZmluaXRpb24ucGF0aCxcbiAgICAgICAgLi4udGhpcy5jcmVhdGVSb3V0ZVBhcmFtZXRlcnModmlzaXQpXG4gICAgICBdO1xuICAgICAgYXdhaXQgdGhpcy5yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIHtcbiAgICAgICAgcmVsYXRpdmVUbzogb3B0aW9ucyA/IG9wdGlvbnMucmVsYXRpdmVUbyA6IG51bGxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgYXN5bmMgcHVzaFZpc2l0Q2hhbmdlc1RvUm91dGUoYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcmV2aW91czogVmlzaXQsIG5leHQ6IFZpc2l0KSB7XG4gICAgLy8gd2UgaGF2ZSB0byBwdXNoIHRvIGhpc3Rvcnkgc28gb3VyIHJlbWVtYmVyIHNhbml0aXNlcnMgZG9uJ3QgcGljayB1cCB0aGUgcHJldmlvdXMgdmFsdWVcbiAgICAvLyB3aGVuIGl0J3MgYmVlbiBjbGVhcmVkIGJ5IHRoZSB1c2VyLlxuICAgIHRoaXMucGxhY2VIaXN0b3J5LmFkZChuZXh0KTtcblxuICAgIC8vIEZJWE1FOiBubyByb3V0ZSBpZCAtPiByb3V0ZSBpZCBkdXBsaWNhdGVzIHJvdXRlIHBhcmFtZXRlcnNcbiAgICBpZiAobmV4dC5oYXNSb3V0aW5nQ2hhbmdlZEZyb20ocHJldmlvdXMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kb05hdmlnYXRpb24obmV4dCwgcm91dGVyID0+IHtcbiAgICAgICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLnBhcnNlVXJsKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90KS5jcmVhdGVSZWRpcmVjdENvbW1hbmRzRm9yKG5leHQpO1xuICAgICAgICBjb25zb2xlLmxvZygnIyMjIFB1c2ggQ2hhbmdlcyB0byByb3V0ZSBSZWRpcmVjdCcsIHsgY29tbWFuZHMgfSk7XG4gICAgICAgIHJldHVybiByb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZG9OYXZpZ2F0aW9uKHZpc2l0OiBWaXNpdCwgcnVuTmF2aWdhdGlvbkNvbW1hbmRzOiAocm91dGVyOiBSb3V0ZXIpID0+IGFueSkge1xuICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlLnZhbHVlKSB7XG4gICAgICBsYW5nLmlsbGVnYWxTdGF0ZSgnTmF2aWdhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oY3VycmVudCA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IE5hdmlnYXRpb25TZXNzaW9uLkFjdGl2ZSggdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Db250ZXh0LCBmYWxzZSwgdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcbiAgICAgIHNlc3Npb24uc3RvcmVWaXNpdCh2aXNpdCk7XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuTmF2aWdhdGlvbkNvbW1hbmRzKHRoaXMucm91dGVyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gUm91dGVyIGhhcyBmaW5pc2hlZCAoc2luY2UgdGhlcmUgd2FzIG5vIHJvdXRlciBjaGFuZ2UgcmVxdWlyZWQpIHNvIHdlXG4gICAgICAvLyBuZWVkIHRvIGVuZCB0aGUgbmF2aWdhdGlvbiBzZXNzaW9uLlxuICAgICAgaWYgKHRoaXMubmF2aWdhdGlvblNlc3Npb24uYWN0aXZlICYmICF0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpKSB7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHNlc3Npb24gPT4gc2Vzc2lvbi5vbkVuZChuZXcgTmF2aWdhdGlvbkVuZCgtMSwgJycsICcnKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBydW5TdGF0ZVRyYW5zaXRpb24odHJhbnNpdGlvbjogKG5hdmlnYXRpb25TZXNzaW9uOiBOYXZpZ2F0aW9uU2Vzc2lvbikgPT4gTmF2aWdhdGlvblNlc3Npb24pIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWU7XG4gICAgY29uc3QgbmV4dCA9IHRyYW5zaXRpb24odGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbik7XG4gICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IG5leHQ7XG4gICAgaWYgKG5leHQgIT09IHByZXZpb3VzKSB7XG4gICAgICBwcmV2aW91cy5kaXNwb3NlKCk7XG4gICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYFJvdXRlciBTdGF0ZSBUcmFuc2l0aW9uOiAke3ByZXZpb3VzLnRvU3RyaW5nKCl9IC0+ICR7bmV4dC50b1N0cmluZygpfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUm91dGVQYXJhbWV0ZXJzKHZpc2l0OiBWaXNpdCkge1xuICAgIGNvbnN0IGRlZiA9IHZpc2l0LnBsYWNlRGVmaW5pdGlvbjtcbiAgICByZXR1cm4gdmlzaXQuaGFzUm91dGVJZCgpID9cbiAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVJZCh2aXNpdCksIGRlZi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpXSA6XG4gICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldO1xuICB9XG5cbiAgLy8gcHJpdmF0ZSBvbkFuZ3VsYXJSb3V0ZXJTdGFydGVkKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpIHtcbiAgLy8gICBpZiAoIXRoaXMubmF2aWdhdGlvblNlc3Npb24pIHtcbiAgLy8gICAgIC8vIFdlIGJlZW4gYWN0aXZhdGVkIGJ5IGFuIGV4dGVybmFsIHJvdXRlIHJhdGhlciB0aGFuIHBsYWNlUm91dGVyLmdvKHZpc2l0KVxuICAvLyAgICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IHRoaXMuY3JlYXRlRXh0ZXJuYWxOYXZpZ2F0aW9uU2Vzc2lvbihldmVudCk7XG4gIC8vICAgfVxuICAvLyAgIHRoaXMuZmlyc3RSb3V0ZSA9IGZhbHNlO1xuICAvLyB9XG4gIC8vXG4gIC8vIHByaXZhdGUgY3JlYXRlRXh0ZXJuYWxOYXZpZ2F0aW9uU2Vzc2lvbihldmVudDogTmF2aWdhdGlvblN0YXJ0KSB7XG4gIC8vICAgcmV0dXJuIG5ldyBOYXZpZ2F0aW9uU2Vzc2lvbi5BY3RpdmUoXG4gIC8vICAgICB0aGlzLm1vZGFsSW50ZXJhY3Rpb25TZXJ2aWNlLFxuICAvLyAgICAgdGhpcy5hbmd1bGFyTG9jYXRpb24sXG4gIC8vICAgICAvLyBldmVudC51cmwsXG4gIC8vICAgICBldmVudC5uYXZpZ2F0aW9uVHJpZ2dlciA9PT0gJ3BvcHN0YXRlJ1xuICAvLyAgICk7XG4gIC8vIH1cbiAgLy8gcHJpdmF0ZSBvbkFuZ3VsYXJSb3V0ZXJGaW5pc2hlZChjYW5jZWxsZWQ6IGJvb2xlYW4pIHtcbiAgLy8gICBjb25zdCBzZXNzaW9uID0gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgLy8gICBpZiAoc2Vzc2lvbi5iYWNrQ2xpY2tlZER1cmluZ0NhbkRlYWN0aXZhdGVJbnRlcmFjdGlvbikge1xuICAvLyAgICAgLy8gd2Ugc3dhbGxvdyB0aGlzIGZpbmlzaGVkIGV2ZW50IGJ1dCBrZWVwIHRoZSBzZXNzaW9uIGFsaXZlIGFzIHdlJ3JlIGdvaW5nIHRvXG4gIC8vICAgICAvLyBnZXQgYW5vdGhlciByb3V0ZSBzdGFydGVkIGV2ZW50LCB3aGljaCB3aWxsIHRyaWdnZXIgYW5vaHRlciBjYW5EZWFjdGl2YXRlIGRpYWxvZ1xuICAvLyAgICAgLy8gaWYgd2Ugc3RhcnQgYSBuZXcgc2Vzc2lvbi5cbiAgLy8gICAgIC8vIHNlc3Npb24ucmVzZXRJbnRlcmFjdGlvblNlc3Npb24oKVxuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICBpZiAoIWNhbmNlbGxlZCkge1xuICAvLyAgICAgICBjb25zdCB2aXNpdHMgPSBzZXNzaW9uLmdldFZpc2l0cygpO1xuICAvLyAgICAgICB2aXNpdHMuZm9yRWFjaCh2ID0+IHRoaXMucGxhY2VIaXN0b3J5LmFkZCh2KSk7XG4gIC8vICAgICAgIC8vIFVwZGF0ZSB2aXNpdHMgYmVmb3JlIHdlIGVuZCB0aGUgbmF2aWdhdGlvbiBzZXNzaW9uLiAgVGhpcyBhbGxvd3MgdGhlIHBsYWNlT3V0ZXRzIHRvXG4gIC8vICAgICAgIC8vIGlnbm9yZSB2aXNpdCBjaGFuZ2VzIHRoYXQgb2NjdXIgd2hpbGUgdGhlIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3NcbiAgLy8gICAgICAgdGhpcy5fYWN0aXZlVmlzaXRzLnZhbHVlID0gdmlzaXRzO1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIHRoZSBuYXZpZ2F0aW9uIHNlc3Npb25cbiAgLy8gICAgICAgLy8gQW5ndWxhciBkb2Vzbid0IHByZXNlcnZlIHRoZSB1cmwgd2hlbiBhIGd1YXJkIGNhbmNlbHMgdGhlIGJhY2sgYnV0dG9uLlxuICAvLyAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1ODYjaXNzdWVjb21tZW50LTQzMjc5NTcyMFxuICAvLyAgICAgICAvLyBzZXNzaW9uLnJlbWVtYmVyUG9wU3RhdGVSZXR1cm5VcmwodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKTtcbiAgLy8gICAgICAgaWYgKHNlc3Npb24uaXNQb3BTdGF0ZSkge1xuICAvLyAgICAgICAgIGNvbnNvbGUubG9nKCdjYW5jZWxsZWQgZHVyaW5nIHBvcHN0YXRlJyk7XG4gIC8vICAgICAgICAgLy8gdGhpcy5hbmd1bGFyTG9jYXRpb24uZ28oc2Vzc2lvbi5wcmV2aW91c1VybCk7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH1cbiAgLy8gICAgIHNlc3Npb24uZGlzcG9zZSgpO1xuICAvLyAgICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IG51bGw7XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgZXh0cmFjdENoaWxkUGF0aChhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGVTbmFwc2hvdCk6IGFueVtdIHtcbiAgICByZXR1cm4gXy5mbGF0dGVuKGFjdGl2YXRlZFJvdXRlLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC51cmwpKTtcbiAgfVxuXG4gIHBhcnNlVXJsKHNuYXBzaG90OiBSb3V0ZXJTdGF0ZVNuYXBzaG90KTogVXJsU25hcHNob3Qge1xuICAgIHJldHVybiBuZXcgVXJsU25hcHNob3QodGhpcy51cmxTZXJpYWxpemVyLnBhcnNlKHNuYXBzaG90LnVybCkpO1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBQbGFjZVJvdXRlciB7XG5cbiAgZXhwb3J0IGNvbnN0IElOVEVSQUNUSU9OX1JPVVRFUl9PVVRMRVQgPSAnYXVwLWludGVyYWN0aW9uJztcblxuICBleHBvcnQgY2xhc3MgSW50ZXJhY3Rpb25Sb3V0ZU1lZGlhdG9yIGltcGxlbWVudHMgSW50ZXJhY3Rpb25Db250ZXh0Lkxpc3RlbmVyIHtcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSBuYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsQWN0aXZlOiBWYWx1ZU1vZGVsPGJvb2xlYW4+LCByZWFkb25seSByb3V0ZXI6IFJvdXRlcikge1xuICAgIH1cblxuICAgIGdldCBpc05hdmlnYXRpbmcoKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsQWN0aXZlLnZhbHVlO1xuICAgIH1cblxuICAgIC8vIElmIHdlJ3JlIG5vdCBpbiBhIG5hdmlnYXRpb24gd2UgcHVzaFxuICAgIC8vIEBUcmFjZSgpXG4gICAgb25BY3Rpdml0eVN0YXJ0ZWQoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuaXNOYXZpZ2F0aW5nKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLicsIHtcbiAgICAgICAgICBvdXRsZXRzOiB7XG4gICAgICAgICAgICBbUGxhY2VSb3V0ZXIuSU5URVJBQ1RJT05fUk9VVEVSX09VVExFVF06IFsnbW9kYWwnXSAvLyBcIm9wZW5cIiBtdXN0IGJlIGEgdmFsaWQgcm91dGUgZm9yIHRoaXMgb3V0bGV0LlxuICAgICAgICAgIH1cbiAgICAgICAgfV0sIHtcbiAgICAgICAgICByZXBsYWNlVXJsOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQFRyYWNlKClcbiAgICBvbkFjdGl2aXR5RmluaXNoZWQoKTogdm9pZCB7XG4gICAgICBpZiAoIXRoaXMuaXNOYXZpZ2F0aW5nKSB7XG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLicsIHtcbiAgICAgICAgICBvdXRsZXRzOiB7XG4gICAgICAgICAgICBbUGxhY2VSb3V0ZXIuSU5URVJBQ1RJT05fUk9VVEVSX09VVExFVF06IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIH1dLCB7XG4gICAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSAvLyByZW1vdmUgdGhlIGludGVyYWN0aW9uIGZyb20gdGhlIGhpc3RvcnkuXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICB9XG5cbn1cbiJdfQ==
554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFHTCxnQkFBZ0IsRUFDaEIsYUFBYSxFQUNiLGVBQWUsRUFDZixlQUFlLEVBQ2YsTUFBTSxFQUNOLGFBQWEsRUFDZCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFDTCxNQUFNLEVBRU4sR0FBRyxFQUNILGdCQUFnQixFQUVoQixJQUFJLEVBRUosTUFBTSxFQUNOLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLEtBQUssRUFHTixNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7O0FBSTdDO0lBR2lDLHVDQUFnQjtJQVUvQyxxQkFBNkIsTUFBYyxFQUNkLGFBQTRCLEVBQzVCLGVBQXlCLEVBQ3pCLFlBQTBCLEVBQzFCLGtCQUFzQztRQUpuRSxZQUtFLGlCQUFPLFNBa0VSO1FBdkU0QixZQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIscUJBQWUsR0FBZixlQUFlLENBQVU7UUFDekIsa0JBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsd0JB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O3FCQUNGLENBQUMsQ0FBQyxDQUFDO2FBQ0w7U0FDRjtJQUNILENBQUM7O2dCQXBPRixVQUFVLFNBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzs7O2dCQTdCQyxNQUFNO2dCQUNOLGFBQWE7Z0JBVk4sUUFBUTtnQkErQlIsWUFBWTtnQkFGWixrQkFBa0I7OztJQW1OekI7UUFEQyxLQUFLLEVBQUU7Ozs7bUVBeUJQO3NCQXhRSDtDQXlRQyxBQXJPRCxDQUdpQyxnQkFBZ0IsR0FrT2hEO1NBbE9ZLFdBQVc7Ozs7OztJQUV0Qiw0Q0FBa0Y7Ozs7O0lBQ2xGLG9DQUErRDs7SUFFL0QsMkNBQW1EOztJQUNuRCx1Q0FBc0U7Ozs7O0lBQ3RFLGdEQUEyRDs7Ozs7SUFDM0QsZ0RBQW1GOzs7OztJQUV2RSw2QkFBK0I7Ozs7O0lBQy9CLG9DQUE2Qzs7Ozs7SUFDN0Msc0NBQTBDOzs7OztJQUMxQyxtQ0FBMkM7Ozs7O0lBQzNDLHlDQUF1RCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBOYXZpZ2F0aW9uQ2FuY2VsLFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBVcmxTZXJpYWxpemVyXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1xuICBhc3NlcnQsXG4gIENvbnN0cnVjdGFibGUsXG4gIERzbCxcbiAgR2FyYmFnZUNvbGxlY3RvcixcbiAgSGFzT25lSW5kZXhDaGFpbixcbiAgbGFuZyxcbiAgTGlzdE1vZGVsLFxuICBMb2dnZXIsXG4gIE11dGFibGVMaXN0TW9kZWwsXG4gIE11dGFibGVTdHJlYW0sXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBUcmFjZSxcbiAgVmFsdWVNb2RlbCxcbiAgVmFsdWVNb2RlbENoYWluXG59IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBJbnRlcmFjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9pbnRlcmFjdGlvbi9zZXJ2aWNlcy9pbnRlcmFjdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IE5hdmlnYXRpb25TdGF0ZSB9IGZyb20gJy4vZ3VhcmRzL25hdmlnYXRpb24tc3RhdGUnO1xuaW1wb3J0IHsgUGxhY2VIaXN0b3J5IH0gZnJvbSAnLi9wbGFjZS1oaXN0b3J5JztcbmltcG9ydCB7IFVybFNuYXBzaG90IH0gZnJvbSAnLi91cmwtc25hcHNob3QnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZVJvdXRlciBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25hdmlnYXRpb25TdGF0ZU1vZGVsID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPE5hdmlnYXRpb25TdGF0ZT4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVmlzaXRzID0gbmV3IE11dGFibGVMaXN0TW9kZWw8VmlzaXQ+KCk7XG5cbiAgcmVhZG9ubHkgbmF2aWdhdGlvbkluUHJvZ3Jlc3M6IFZhbHVlTW9kZWw8Ym9vbGVhbj47XG4gIHJlYWRvbmx5IGFjdGl2ZVZpc2l0SW5kZXg6IEhhc09uZUluZGV4Q2hhaW48J3BsYWNlRGVmaW5pdGlvbicsIFZpc2l0PjtcbiAgcHJpdmF0ZSBfbmF2aWdhdGlvblNlc3Npb25Db250ZXh0OiBOYXZpZ2F0aW9uU3RhdGUuQ29udGV4dDtcbiAgcHJpdmF0ZSBfbmF2aWdhdGlvblN0YXRlVHlwZU1vZGVsOiBWYWx1ZU1vZGVsQ2hhaW48Q29uc3RydWN0YWJsZTxOYXZpZ2F0aW9uU3RhdGU+PjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHVybFNlcmlhbGl6ZXI6IFVybFNlcmlhbGl6ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYW5ndWxhckxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwbGFjZUhpc3Rvcnk6IFBsYWNlSGlzdG9yeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBpbnRlcmFjdGlvblNlcnZpY2U6IEludGVyYWN0aW9uU2VydmljZSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgeyBjaGFpbiwgdmFsdWVPZiwgYmVmb3JlLCB3aGVuLCBhZnRlciwgb2JzZXJ2ZSwgc3dpdGNoT24gfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVZpc2l0SW5kZXggPSBjaGFpbih0aGlzLl9hY3RpdmVWaXNpdHMpLmluZGV4QnkoJ3BsYWNlRGVmaW5pdGlvbicpO1xuICAgIHRoaXMubmF2aWdhdGlvbkluUHJvZ3Jlc3MgPSBjaGFpbih0aGlzLm5hdmlnYXRpb25TdGF0ZU1vZGVsKS5wbHVjaygnaXNUcmFuc2l0aW9uYWwnKTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQgPSBuZXcgTmF2aWdhdGlvblN0YXRlLkNvbnRleHQodGhpcywgdGhpcy5pbnRlcmFjdGlvblNlcnZpY2UsIHNlc3Npb24gPT4ge1xuICAgICAgdGhpcy5wcm9jZXNzTmF2aWdhdGlvblN1Y2Nlc3Moc2Vzc2lvbik7XG4gICAgfSk7XG4gICAgdGhpcy5fbmF2aWdhdGlvblN0YXRlTW9kZWwudmFsdWUgPSBuZXcgTmF2aWdhdGlvblN0YXRlLklkbGUodGhpcy5fbmF2aWdhdGlvblNlc3Npb25Db250ZXh0KTtcbiAgICB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVUeXBlTW9kZWwgPSBjaGFpbih0aGlzLl9uYXZpZ2F0aW9uU3RhdGVNb2RlbCkubWFwKHN0YXRlID0+IHN0YXRlLmNvbnN0cnVjdG9yIGFzIENvbnN0cnVjdGFibGU8TmF2aWdhdGlvblN0YXRlPik7XG5cbiAgICAvLyBUT0RPOiBtYWtlIHNldHVwIHRoZSBjYWxsYmFja3MgaW4gZHVyaW5nIG1vZHVsZSBpbml0aWF0aW9uIHRvIG1ha2UgdGhpcyB0ZXN0YWJsZS5cbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIC8vIFJvdXRpbmcgZXZlbnQgc2VxdWVuY2VcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25DYW5jZWwgLS0+IHJlZGlyZWN0LCBnbyBhcm91bmQgYWdhaW4gaW4gdGhlIHNhbWUgc2Vzc2lvblxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVuZCAtLT4gbmF2aWdhdGlvbiBjb21wbGV0ZSwgZW5kIHNlc3Npb24uXG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uRXJyb3IgLS0+IG5hdmlnYXRpb24gYWJvcnRlZCwgZW5kIHNlc3Npb24uXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvblN0YXJ0KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgICAgICAgaWYgKGV2ZW50Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAncG9wc3RhdGUnKSB7XG4gICAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc3RhdGUgPT4gc3RhdGUub25Qb3BTdGF0ZShldmVudCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHN0YXRlID0+IHN0YXRlLm9uU3RhcnQoZXZlbnQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICBjb25zb2xlLmxvZyhldmVudCk7XG4gICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHN0YXRlID0+IHN0YXRlLm9uRW5kKGV2ZW50KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICB0aGlzLnJ1blN0YXRlVHJhbnNpdGlvbihzdGF0ZSA9PiBzdGF0ZS5vbkVycm9yKGV2ZW50KSk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uQ2FuY2VsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc3RhdGUgPT4gc3RhdGUub25DYW5jZWwoZXZlbnQpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFB1c2ggZGlhbG9nIHN0YXRlIHRvIHRoZSB1cmwgc28gd2UgY2FuIGNhcHR1cmUgdGhlIGJhY2sgYnV0dG9uLlxuICAgIHdoZW4ubGlzdE9mKHRoaXMuaW50ZXJhY3Rpb25TZXJ2aWNlLmFjdGl2ZUludGVyYWN0aW9uQ29udGV4dElkcykuY2hhbmdlcygoaWRzLCBwcmV2aW91cykgPT4ge1xuICAgICAgdGhpcy5zeW5jSW50ZXJhY3Rpb25JZHNXaXRoUm91dGVyKCk7XG4gICAgfSwgeyB1bmxlc3M6IHRoaXMubmF2aWdhdGlvbkluUHJvZ3Jlc3MgfSk7IC8vIFRPRE86IEkgdGhpbmsgdGhlIGV4Y2x1c2l2ZSBpbnRlcmFjdGlvbiBwcmV2ZW50cyBpbnRlcmFjdGlvbnMgc3RhcnRpbmcgd2hpbGUgaXQncyBhY3RpdmUgc28gd2UgbWlnaHQgbm90IG5lZWQgdGhpcy5cblxuICAgIGNvbnN0IHVybENoYW5nZXMgPSBuZXcgTXV0YWJsZVN0cmVhbTx7IHVybDogc3RyaW5nLCBzdGF0ZTogTmF2aWdhdGlvblN0YXRlIH0+KCk7XG5cbiAgICAvLyBUaGUgYW5ndWxhciByb3V0ZXIgZG9lc24ndCBhbHdheXMgZmlyZSByb3V0ZXIgZXZlbnRzIHdoZW4gdGhlIGJhY2sgYnV0dG9uIGlzIHB1c2hlZCB3aGlsZSBhIG5hdmlnYXRpb25cbiAgICAvLyBzZXNzaW9uIGlzIGluIHByb2dyZXNzLiAgU29tZXRpbWVzIHdlIG9ubHkga25vdyBhYm91dCBpdCBmcm9tIHRoZSB1cmwgY2hhbmdlLlxuICAgIC8vIElNUE9SVEFOVCBPUkRFUiBERVBFTkRFTkNZXG4gICAgLy8gVGhpcyBvbmx5IHdvcmtzIGJlY2F1c2Ugd2UncmUgbm90aWZpZWQgb2YgdGhlIGNoYW5nZSBhZnRlciB0aGUgcm91dGVyIGhhcyBzdGFydGVkIHJlYWN0aW5nIHRvIGl0LiAgVGhpc1xuICAgIC8vIHdlIGNhbiBjYW4gdXNlIG91ciBuYXZpZ2F0aW9uU3RhdGUgdG8gZGV0ZXJtaW5lIHRoaW5ncy5cbiAgICBhbmd1bGFyTG9jYXRpb24ub25VcmxDaGFuZ2UodXJsID0+IHtcbiAgICAgIGNvbnN0IG5hdmlnYXRpb25TdGF0ZSA9IHRoaXMuX25hdmlnYXRpb25TdGF0ZU1vZGVsLnZhbHVlO1xuICAgICAgY29uc29sZS5sb2coYFVSTENoYW5nZSAtPiAke3VybH1gLCB7IHN0YXRlOiBuYXZpZ2F0aW9uU3RhdGUgfSk7XG4gICAgICB1cmxDaGFuZ2VzLnB1Ymxpc2goeyB1cmwsIHN0YXRlOiBuYXZpZ2F0aW9uU3RhdGUgfSk7XG5cbiAgICAgIC8vIFdlJ3ZlIGVudGVyZWQgYSBuYXZpZ2F0aW9uIHRyYW5zaXRpb25cbiAgICAgIGlmIChuYXZpZ2F0aW9uU3RhdGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhdGUuTmF2aWdhdGlvblRyYW5zaXRpb24pIHtcbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkludGVyYWN0aW9uID0gdGhpcy5uYXZpZ2F0aW9uU3RhdGUuaW50ZXJhY3Rpb25Db250ZXh0O1xuICAgICAgICBpZiAobmF2aWdhdGlvbkludGVyYWN0aW9uICYmIG5hdmlnYXRpb25JbnRlcmFjdGlvbi5pc0FjdGl2ZSgpKSB7XG4gICAgICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBiYWNrIGJ1dHRvbiBwcmVzc2VkIGR1cmluZyBuYXZpZ2F0aW9uIHNlc3Npb24gaW50ZXJhY3Rpb24gcHJvbWlzZWApO1xuICAgICAgICAgIHRoaXMucnVuU3RhdGVUcmFuc2l0aW9uKHN0YXRlID0+IHN0YXRlLm9uQmFja0NsaWNrZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24odXJsKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJvY2Vzc05hdmlnYXRpb25TdWNjZXNzKHNlc3Npb246IE5hdmlnYXRpb25TdGF0ZSkge1xuICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSB2aXNpdHMgYmVmb3JlIHRoZSBzZXNzaW9uIGZpbmlzaGVzLiAgVGhpcyBhbGxvd3MgdGhlIHBsYWNlT3V0ZXRzIHRvIGlnbm9yZSB2aXNpdFxuICAgIC8vIGNoYW5nZXMgdGhhdCBvY2N1ciB3aGlsZSByb3V0ZXJOYXZpZ2F0aW9uQWN0aXZlIGlzIHRydWUuXG4gICAgYXNzZXJ0LmlzVHJ1dGh5KHRoaXMubmF2aWdhdGlvbkluUHJvZ3Jlc3MudmFsdWUpO1xuICAgIGNvbnN0IHZpc2l0cyA9IHNlc3Npb24uZ2V0VmlzaXRzKCk7XG4gICAgdmlzaXRzLmZvckVhY2godiA9PiB0aGlzLnBsYWNlSGlzdG9yeS5hZGQodikpO1xuICAgIHRoaXMuX2FjdGl2ZVZpc2l0cy52YWx1ZSA9IHZpc2l0cztcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU3RhdGUoKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblN0YXRlTW9kZWwudmFsdWU7XG4gIH1cblxuICBnZXQgbmF2aWdhdGlvblN0YXRlTW9kZWwoKTogVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU3RhdGU+IHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblN0YXRlTW9kZWwucmVhZG9ubHk7XG4gIH1cblxuICBnZXQgYWN0aXZlVmlzaXRzKCk6IExpc3RNb2RlbDxWaXNpdD4ge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmVWaXNpdHMucmVhZG9ubHk7XG4gIH1cblxuICAvKipcbiAgICogIHBsYWNlUm91dGVyLm5hdmlnYXRlKHBsYWNlRGVzdGluYXRpb25zLnNvbWVQbGFjZS5jcmVhdGVWaXNpdChyb3V0ZUlkLCAuLi52aXNpdFBhcmFtcykpO1xuICAgKiBAcGFyYW0gdmlzaXRcbiAgICovXG4gIGFzeW5jIG5hdmlnYXRlKHZpc2l0OiBWaXNpdCwgb3B0aW9ucz86IHsgcmVsYXRpdmVUbzogQWN0aXZhdGVkUm91dGUgfSkge1xuICAgIHRoaXMuZG9OYXZpZ2F0aW9uKHZpc2l0LCBhc3luYyByb3V0ZXIgPT4ge1xuICAgICAgY29uc3QgY29tbWFuZHMgPSBbXG4gICAgICAgIHZpc2l0LnBsYWNlRGVmaW5pdGlvbi5wYXRoLFxuICAgICAgICAuLi50aGlzLmNyZWF0ZVJvdXRlUGFyYW1ldGVycyh2aXNpdClcbiAgICAgIF07XG4gICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywge1xuICAgICAgICByZWxhdGl2ZVRvOiBvcHRpb25zID8gb3B0aW9ucy5yZWxhdGl2ZVRvIDogbnVsbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhc3luYyBwdXNoVmlzaXRDaGFuZ2VzVG9Sb3V0ZShhY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsIHByZXZpb3VzOiBWaXNpdCwgbmV4dDogVmlzaXQpIHtcbiAgICAvLyB3ZSBoYXZlIHRvIHB1c2ggdG8gaGlzdG9yeSBzbyBvdXIgcmVtZW1iZXIgc2FuaXRpc2VycyBkb24ndCBwaWNrIHVwIHRoZSBwcmV2aW91cyB2YWx1ZVxuICAgIC8vIHdoZW4gaXQncyBiZWVuIGNsZWFyZWQgYnkgdGhlIHVzZXIuXG4gICAgdGhpcy5wbGFjZUhpc3RvcnkuYWRkKG5leHQpO1xuXG4gICAgLy8gRklYTUU6IG5vIHJvdXRlIGlkIC0+IHJvdXRlIGlkIGR1cGxpY2F0ZXMgcm91dGUgcGFyYW1ldGVyc1xuICAgIGlmIChuZXh0Lmhhc1JvdXRpbmdDaGFuZ2VkRnJvbShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvTmF2aWdhdGlvbihuZXh0LCByb3V0ZXIgPT4ge1xuICAgICAgICBjb25zdCBjb21tYW5kcyA9IHRoaXMucGFyc2VVcmwodGhpcy5yb3V0ZXIucm91dGVyU3RhdGUuc25hcHNob3QudXJsKS5jcmVhdGVSZWRpcmVjdENvbW1hbmRzRm9yKG5leHQpO1xuICAgICAgICBjb25zb2xlLmxvZygnIyMjIFB1c2ggQ2hhbmdlcyB0byByb3V0ZSBSZWRpcmVjdCcsIHsgY29tbWFuZHMgfSk7XG4gICAgICAgIHJldHVybiByb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZG9OYXZpZ2F0aW9uKHZpc2l0OiBWaXNpdCwgcnVuTmF2aWdhdGlvbkNvbW1hbmRzOiAocm91dGVyOiBSb3V0ZXIpID0+IGFueSkge1xuICAgIGlmICh0aGlzLm5hdmlnYXRpb25JblByb2dyZXNzLnZhbHVlKSB7XG4gICAgICBsYW5nLmlsbGVnYWxTdGF0ZSgnTmF2aWdhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzJyk7XG4gICAgfVxuXG4gICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oY3VycmVudCA9PiB7XG4gICAgICBjb25zdCBzZXNzaW9uID0gbmV3IE5hdmlnYXRpb25TdGF0ZS5OYXZpZ2F0aW9uVHJhbnNpdGlvbih0aGlzLl9uYXZpZ2F0aW9uU2Vzc2lvbkNvbnRleHQsIGZhbHNlLCB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpO1xuICAgICAgc2Vzc2lvbi5zdG9yZVZpc2l0KHZpc2l0KTtcbiAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBydW5OYXZpZ2F0aW9uQ29tbWFuZHModGhpcy5yb3V0ZXIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSb3V0ZXIgaGFzIGZpbmlzaGVkIChzaW5jZSB0aGVyZSB3YXMgbm8gcm91dGVyIGNoYW5nZSByZXF1aXJlZCkgc28gd2VcbiAgICAgIC8vIG5lZWQgdG8gZW5kIHRoZSBuYXZpZ2F0aW9uIHNlc3Npb24uXG4gICAgICBpZiAodGhpcy5uYXZpZ2F0aW9uU3RhdGUuaXNUcmFuc2l0aW9uYWwgJiYgIXRoaXMucm91dGVyLmdldEN1cnJlbnROYXZpZ2F0aW9uKCkpIHtcbiAgICAgICAgdGhpcy5ydW5TdGF0ZVRyYW5zaXRpb24oc2Vzc2lvbiA9PiBzZXNzaW9uLm9uRW5kKG5ldyBOYXZpZ2F0aW9uRW5kKC0xLCAnJywgJycpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHJ1blN0YXRlVHJhbnNpdGlvbih0cmFuc2l0aW9uOiAobmF2aWdhdGlvblNlc3Npb246IE5hdmlnYXRpb25TdGF0ZSkgPT4gTmF2aWdhdGlvblN0YXRlKSB7XG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLl9uYXZpZ2F0aW9uU3RhdGVNb2RlbC52YWx1ZTtcbiAgICBjb25zdCBuZXh0ID0gdHJhbnNpdGlvbih0aGlzLm5hdmlnYXRpb25TdGF0ZSk7XG4gICAgdGhpcy5fbmF2aWdhdGlvblN0YXRlTW9kZWwudmFsdWUgPSBuZXh0O1xuICAgIGlmIChuZXh0ICE9PSBwcmV2aW91cykge1xuICAgICAgcHJldmlvdXMuZGlzcG9zZSgpO1xuICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBSb3V0ZXIgU3RhdGUgVHJhbnNpdGlvbjogJHtwcmV2aW91cy50b1N0cmluZygpfSAtPiAke25leHQudG9TdHJpbmcoKX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVJvdXRlUGFyYW1ldGVycyh2aXNpdDogVmlzaXQpIHtcbiAgICBjb25zdCBkZWYgPSB2aXNpdC5wbGFjZURlZmluaXRpb247XG4gICAgcmV0dXJuIHZpc2l0Lmhhc1JvdXRlSWQoKSA/XG4gICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlSWQodmlzaXQpLCBkZWYuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0KV0gOlxuICAgICAgW2RlZi5nZXRGb3JtYXR0ZWRSb3V0ZVBhcmFtZXRlcnModmlzaXQpXTtcbiAgfVxuXG4gIGV4dHJhY3RDaGlsZFBhdGgoYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBhbnlbXSB7XG4gICAgcmV0dXJuIF8uZmxhdHRlbihhY3RpdmF0ZWRSb3V0ZS5jaGlsZHJlbi5tYXAoY2hpbGQgPT4gY2hpbGQudXJsKSk7XG4gIH1cblxuICBwYXJzZVVybCh1cmw6IHN0cmluZyk6IFVybFNuYXBzaG90IHtcbiAgICByZXR1cm4gbmV3IFVybFNuYXBzaG90KHRoaXMudXJsU2VyaWFsaXplciwgdXJsKTtcbiAgfVxuXG4gIHJlc2V0QnJvd3NlckxvY2F0aW9uKHVybDogc3RyaW5nKSB7XG4gICAgdGhpcy5hbmd1bGFyTG9jYXRpb24uZ28odXJsKTtcbiAgfVxuXG4gIGdldEN1cnJlbnRSb3V0ZXJVcmwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIucm91dGVyU3RhdGUgPyB0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwgOiBudWxsO1xuICB9XG5cbiAgZ2V0QWN0aXZlSW50ZXJhY3Rpb25JZHNGcm9tVXJsKHVybDogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnBhcnNlVXJsKHVybCkuZ2V0SW50ZXJhY3Rpb25JZHMoKTtcbiAgfVxuXG4gIC8vIEBUcmFjZSgpXG4gIGhhc0FjdGl2ZUludGVyYWN0aW9uSWRzKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlSW50ZXJhY3Rpb25JZHNGcm9tVXJsKHVybCkubGVuZ3RoID4gMDtcbiAgfVxuXG5cbiAgQFRyYWNlKClcbiAgc3luY0ludGVyYWN0aW9uSWRzV2l0aFJvdXRlcigpIHtcbiAgICBhc3NlcnQuaXNGYWxzZXkodGhpcy5uYXZpZ2F0aW9uSW5Qcm9ncmVzcy52YWx1ZSk7IC8vIFVwZGF0aW5nIGludGVyYWN0aW9uIHJvdXRlcyBkdXJpbmcgYW4gZXhpc3RpbmcgbmF2aWdhdGlvbiBicmVha3MgYWxsIHRoZSB0aGluZ3MuXG4gICAgY29uc3QgY3VycmVudElkcyA9IHRoaXMuaW50ZXJhY3Rpb25TZXJ2aWNlLmFjdGl2ZUludGVyYWN0aW9uQ29udGV4dElkcy52YWx1ZTtcbiAgICBpZiAoXy5pc0VxdWFsKGN1cnJlbnRJZHMsIHRoaXMuZ2V0QWN0aXZlSW50ZXJhY3Rpb25JZHNGcm9tVXJsKHRoaXMuZ2V0Q3VycmVudFJvdXRlclVybCgpKSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdhY3Rpdml0eSBpZHMgd2VyZSB0aGUgc2FtZSwgc2tpcHBpbmcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGN1cnJlbnRJZHMubGVuZ3RoIDwgMSkge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy4nLCB7XG4gICAgICAgICAgb3V0bGV0czoge1xuICAgICAgICAgICAgW1VybFNuYXBzaG90LklOVEVSQUNUSU9OX1JPVVRFUl9PVVRMRVRdOiBudWxsXG4gICAgICAgICAgfVxuICAgICAgICB9XSwge1xuICAgICAgICAgIHJlcGxhY2VVcmw6IHRydWUgLy8gcmVtb3ZlIHRoZSBpbnRlcmFjdGlvbiBmcm9tIHRoZSBoaXN0b3J5LlxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVybFNuYXBzaG90ID0gdGhpcy5wYXJzZVVybCh0aGlzLmdldEN1cnJlbnRSb3V0ZXJVcmwoKSk7XG5cbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJywge1xuICAgICAgICAgIG91dGxldHM6IHtcbiAgICAgICAgICAgIFtVcmxTbmFwc2hvdC5JTlRFUkFDVElPTl9ST1VURVJfT1VUTEVUXTogVXJsU25hcHNob3QuY3JlYXRlSW50ZXJhY3Rpb25PdXRsZXRSb3V0ZXJDb21tYW5kcyhjdXJyZW50SWRzKVxuICAgICAgICAgIH1cbiAgICAgICAgfV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19