@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
@@ -0,0 +1,894 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import * as tslib_1 from "tslib";
6
+ import { Dsl, GarbageCollector, lang, Logger } from '@coolon/pectin';
7
+ import { PlaceComponentDeactivationHandler } from './place-component-deactivation-handler';
8
+ /**
9
+ * @abstract
10
+ */
11
+ var /**
12
+ * @abstract
13
+ */
14
+ NavigationState = /** @class */ (function (_super) {
15
+ tslib_1.__extends(NavigationState, _super);
16
+ function NavigationState(context) {
17
+ var _this = _super.call(this) || this;
18
+ _this.context = context;
19
+ _this._visits = new Map();
20
+ return _this;
21
+ }
22
+ Object.defineProperty(NavigationState.prototype, "idle", {
23
+ get: /**
24
+ * @return {?}
25
+ */
26
+ function () {
27
+ return !this.isTransitional;
28
+ },
29
+ enumerable: true,
30
+ configurable: true
31
+ });
32
+ Object.defineProperty(NavigationState.prototype, "placeRouter", {
33
+ get: /**
34
+ * @return {?}
35
+ */
36
+ function () {
37
+ return this.context.placeRouter;
38
+ },
39
+ enumerable: true,
40
+ configurable: true
41
+ });
42
+ Object.defineProperty(NavigationState.prototype, "interactionService", {
43
+ get: /**
44
+ * @return {?}
45
+ */
46
+ function () {
47
+ return this.context.interactionService;
48
+ },
49
+ enumerable: true,
50
+ configurable: true
51
+ });
52
+ Object.defineProperty(NavigationState.prototype, "interactionContext", {
53
+ get: /**
54
+ * @return {?}
55
+ */
56
+ function () {
57
+ return null;
58
+ },
59
+ enumerable: true,
60
+ configurable: true
61
+ });
62
+ /**
63
+ * @param {?} visit
64
+ * @return {?}
65
+ */
66
+ NavigationState.prototype.storeVisit = /**
67
+ * @param {?} visit
68
+ * @return {?}
69
+ */
70
+ function (visit) {
71
+ this._visits.set(visit.placeDefinition, visit);
72
+ };
73
+ /**
74
+ * @param {?} placeDef
75
+ * @return {?}
76
+ */
77
+ NavigationState.prototype.getVisitFor = /**
78
+ * @param {?} placeDef
79
+ * @return {?}
80
+ */
81
+ function (placeDef) {
82
+ return this._visits.get(placeDef);
83
+ };
84
+ /**
85
+ * @param {?} event
86
+ * @return {?}
87
+ */
88
+ NavigationState.prototype.onPopState = /**
89
+ * @param {?} event
90
+ * @return {?}
91
+ */
92
+ function (event) {
93
+ return this.illegalTransition(event);
94
+ };
95
+ /**
96
+ * @param {?} event
97
+ * @return {?}
98
+ */
99
+ NavigationState.prototype.onStart = /**
100
+ * @param {?} event
101
+ * @return {?}
102
+ */
103
+ function (event) {
104
+ return this.illegalTransition(event);
105
+ };
106
+ /**
107
+ * @param {?} event
108
+ * @return {?}
109
+ */
110
+ NavigationState.prototype.onCancel = /**
111
+ * @param {?} event
112
+ * @return {?}
113
+ */
114
+ function (event) {
115
+ return this.illegalTransition(event);
116
+ };
117
+ /**
118
+ * @param {?} event
119
+ * @return {?}
120
+ */
121
+ NavigationState.prototype.onError = /**
122
+ * @param {?} event
123
+ * @return {?}
124
+ */
125
+ function (event) {
126
+ return this.illegalTransition(event);
127
+ };
128
+ /**
129
+ * @param {?} event
130
+ * @return {?}
131
+ */
132
+ NavigationState.prototype.onEnd = /**
133
+ * @param {?} event
134
+ * @return {?}
135
+ */
136
+ function (event) {
137
+ return this.illegalTransition(event);
138
+ };
139
+ /**
140
+ * @param {?} newUrl
141
+ * @return {?}
142
+ */
143
+ NavigationState.prototype.onBackClickedDuringNavigationInteraction = /**
144
+ * @param {?} newUrl
145
+ * @return {?}
146
+ */
147
+ function (newUrl) {
148
+ return this.illegalTransition('onBackClickedDuringNavigationInteraction');
149
+ };
150
+ /**
151
+ * @param {?} component
152
+ * @param {?} nextState
153
+ * @return {?}
154
+ */
155
+ NavigationState.prototype.canDeactivatePlace = /**
156
+ * @param {?} component
157
+ * @param {?} nextState
158
+ * @return {?}
159
+ */
160
+ function (component, nextState) {
161
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
162
+ return tslib_1.__generator(this, function (_a) {
163
+ return [2 /*return*/, this.illegalTransition('canDeactivatePlace')];
164
+ });
165
+ });
166
+ };
167
+ /**
168
+ * @return {?}
169
+ */
170
+ NavigationState.prototype.getVisits = /**
171
+ * @return {?}
172
+ */
173
+ function () {
174
+ return Array.from(this._visits.values());
175
+ };
176
+ /**
177
+ * @protected
178
+ * @template R
179
+ * @param {?} message
180
+ * @return {?}
181
+ */
182
+ NavigationState.prototype.illegalTransition = /**
183
+ * @protected
184
+ * @template R
185
+ * @param {?} message
186
+ * @return {?}
187
+ */
188
+ function (message) {
189
+ return lang.illegalState(message.toString() + " not supported by " + this.toString());
190
+ };
191
+ /**
192
+ * @protected
193
+ * @return {?}
194
+ */
195
+ NavigationState.prototype.currentRouterUrl = /**
196
+ * @protected
197
+ * @return {?}
198
+ */
199
+ function () {
200
+ return this.placeRouter.getCurrentRouterUrl();
201
+ };
202
+ /**
203
+ * @protected
204
+ * @param {?} event
205
+ * @return {?}
206
+ */
207
+ NavigationState.prototype.createTransitionStateFor = /**
208
+ * @protected
209
+ * @param {?} event
210
+ * @return {?}
211
+ */
212
+ function (event) {
213
+ // TODO: check if the event is purely for interaction context changes.
214
+ /** @type {?} */
215
+ var popstate = event.navigationTrigger === 'popstate';
216
+ return popstate ?
217
+ new NavigationState.NavigationBackTransition(this.context, popstate, this.currentRouterUrl()) :
218
+ new NavigationState.NavigationTransition(this.context, popstate, this.currentRouterUrl());
219
+ };
220
+ /**
221
+ * @param {?} url
222
+ * @return {?}
223
+ */
224
+ NavigationState.prototype.resetBrowserLocation = /**
225
+ * @param {?} url
226
+ * @return {?}
227
+ */
228
+ function (url) {
229
+ var _this = this;
230
+ // TODO: Should this be a navigate operation to avoid confusing the router...??
231
+ setTimeout((/**
232
+ * @return {?}
233
+ */
234
+ function () { return _this.placeRouter.resetBrowserLocation(url); }));
235
+ };
236
+ /**
237
+ * @return {?}
238
+ */
239
+ NavigationState.prototype.toString = /**
240
+ * @return {?}
241
+ */
242
+ function () {
243
+ return this.constructor.name;
244
+ };
245
+ return NavigationState;
246
+ }(GarbageCollector));
247
+ /**
248
+ * @abstract
249
+ */
250
+ export { NavigationState };
251
+ if (false) {
252
+ /**
253
+ * @type {?}
254
+ * @private
255
+ */
256
+ NavigationState.prototype._visits;
257
+ /** @type {?} */
258
+ NavigationState.prototype.isTransitional;
259
+ /** @type {?} */
260
+ NavigationState.prototype.startingUrl;
261
+ /** @type {?} */
262
+ NavigationState.prototype.isPopState;
263
+ /**
264
+ * @type {?}
265
+ * @protected
266
+ */
267
+ NavigationState.prototype.context;
268
+ }
269
+ (function (NavigationState) {
270
+ var Context = /** @class */ (function () {
271
+ function Context(placeRouter, interactionService, notifySuccess) {
272
+ this.placeRouter = placeRouter;
273
+ this.interactionService = interactionService;
274
+ this.notifySuccess = notifySuccess;
275
+ }
276
+ return Context;
277
+ }());
278
+ NavigationState.Context = Context;
279
+ if (false) {
280
+ /** @type {?} */
281
+ Context.prototype.placeRouter;
282
+ /** @type {?} */
283
+ Context.prototype.interactionService;
284
+ /** @type {?} */
285
+ Context.prototype.notifySuccess;
286
+ }
287
+ var Idle = /** @class */ (function (_super) {
288
+ tslib_1.__extends(Idle, _super);
289
+ function Idle(context) {
290
+ var _this = _super.call(this, context) || this;
291
+ _this.isTransitional = false;
292
+ _this.startingUrl = null;
293
+ _this.isPopState = false;
294
+ return _this;
295
+ }
296
+ /**
297
+ * @param {?} event
298
+ * @return {?}
299
+ */
300
+ Idle.prototype.onStart = /**
301
+ * @param {?} event
302
+ * @return {?}
303
+ */
304
+ function (event) {
305
+ // calling angularLocation.go() to clear back state can trigger router cycles to the current url if we don't ignore them
306
+ if (event.url === this.currentRouterUrl()) {
307
+ Logger.get(this).info("navigation started to same url -> " + event.url);
308
+ return this;
309
+ }
310
+ if (this.placeRouter.hasActiveInteractionIds(event.url)) {
311
+ Logger.get(this).info("navigation started with interaction outlet -> " + event.url);
312
+ return new InteractionTransition(this.context, event.url);
313
+ }
314
+ else {
315
+ return this.createTransitionStateFor(event);
316
+ }
317
+ };
318
+ /**
319
+ * @param {?} event
320
+ * @return {?}
321
+ */
322
+ Idle.prototype.onPopState = /**
323
+ * @param {?} event
324
+ * @return {?}
325
+ */
326
+ function (event) {
327
+ return this.createTransitionStateFor(event);
328
+ };
329
+ return Idle;
330
+ }(NavigationState));
331
+ NavigationState.Idle = Idle;
332
+ if (false) {
333
+ /** @type {?} */
334
+ Idle.prototype.isTransitional;
335
+ /** @type {?} */
336
+ Idle.prototype.startingUrl;
337
+ /** @type {?} */
338
+ Idle.prototype.isPopState;
339
+ }
340
+ /**
341
+ * @abstract
342
+ */
343
+ var /**
344
+ * @abstract
345
+ */
346
+ AbstractNavigationTransition = /** @class */ (function (_super) {
347
+ tslib_1.__extends(AbstractNavigationTransition, _super);
348
+ function AbstractNavigationTransition(context, isPopState, startingUrl) {
349
+ var _this = _super.call(this, context) || this;
350
+ _this.isPopState = isPopState;
351
+ _this.startingUrl = startingUrl;
352
+ _this.isTransitional = true;
353
+ _this.componentDeactivationHandlers = new Map();
354
+ _this._interactionContext = _this.interactionService._createExclusiveModalInteractionContext();
355
+ _this.onDispose((/**
356
+ * @return {?}
357
+ */
358
+ function () {
359
+ // the interaction context can be detached during the back button cancellation state transition
360
+ // as the transition is synchronous and activityCancellation isn't. Otherwise dispose will be
361
+ // called before the context has been cancelled. It might be work having the interaction context
362
+ // automatically cancel if the context is disposed so we don't have worry about detaching etc.
363
+ if (_this._interactionContext) {
364
+ _this._interactionContext.dispose(); // or do something like cancelAndDispose?
365
+ }
366
+ }));
367
+ return _this;
368
+ }
369
+ Object.defineProperty(AbstractNavigationTransition.prototype, "interactionContext", {
370
+ get: /**
371
+ * @return {?}
372
+ */
373
+ function () {
374
+ return this._interactionContext;
375
+ },
376
+ enumerable: true,
377
+ configurable: true
378
+ });
379
+ /**
380
+ * @param {?} event
381
+ * @return {?}
382
+ */
383
+ AbstractNavigationTransition.prototype.onStart = /**
384
+ * @param {?} event
385
+ * @return {?}
386
+ */
387
+ function (event) {
388
+ // active sessions can have many cancel start cycles due
389
+ // to place guard redirects
390
+ return this;
391
+ };
392
+ /**
393
+ * @param {?} event
394
+ * @return {?}
395
+ */
396
+ AbstractNavigationTransition.prototype.onEnd = /**
397
+ * @param {?} event
398
+ * @return {?}
399
+ */
400
+ function (event) {
401
+ // navigation succeeded
402
+ this.context.notifySuccess(this);
403
+ return new Idle(this.context);
404
+ };
405
+ /**
406
+ * @param {?} locationTriggerUrl
407
+ * @return {?}
408
+ */
409
+ AbstractNavigationTransition.prototype.onBackClickedDuringNavigationInteraction = /**
410
+ * @param {?} locationTriggerUrl
411
+ * @return {?}
412
+ */
413
+ function (locationTriggerUrl) {
414
+ // detach the interactoin from the session so it doesn't get disposed until the activity
415
+ // has completed.
416
+ /** @type {?} */
417
+ var context = this.detachInteractionContext();
418
+ var when = Dsl.disposeWith(context).when;
419
+ // TODO: I need to make the exclusive interaction context disallow nested activities or
420
+ // that would mess things up entirely.
421
+ context.getCurrentActivity().then((/**
422
+ * @param {?} activity
423
+ * @return {?}
424
+ */
425
+ function (activity) {
426
+ when.valueOf(context.active).becomesFalsey((/**
427
+ * @return {?}
428
+ */
429
+ function () { return context.dispose(); }), { once: true });
430
+ activity.cancel(null);
431
+ }));
432
+ return new CancelledDuringNavigationInteraction(this.context, this.startingUrl, locationTriggerUrl);
433
+ };
434
+ /**
435
+ * @param {?} component
436
+ * @param {?} nextState
437
+ * @return {?}
438
+ */
439
+ AbstractNavigationTransition.prototype.canDeactivatePlace = /**
440
+ * @param {?} component
441
+ * @param {?} nextState
442
+ * @return {?}
443
+ */
444
+ function (component, nextState) {
445
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
446
+ var handler, isPrimaryHandler;
447
+ return tslib_1.__generator(this, function (_a) {
448
+ // lookup the handler and create it if we've not seen it yet
449
+ handler = this.componentDeactivationHandlers.get(component);
450
+ if (!handler) {
451
+ isPrimaryHandler = this.componentDeactivationHandlers.size === 0;
452
+ handler = new PlaceComponentDeactivationHandler(component, this);
453
+ this.componentDeactivationHandlers.set(component, handler);
454
+ }
455
+ return [2 /*return*/, handler.canDeactivate(nextState)];
456
+ });
457
+ });
458
+ };
459
+ /**
460
+ * @private
461
+ * @return {?}
462
+ */
463
+ AbstractNavigationTransition.prototype.detachInteractionContext = /**
464
+ * @private
465
+ * @return {?}
466
+ */
467
+ function () {
468
+ /** @type {?} */
469
+ var context = this._interactionContext;
470
+ this._interactionContext = null;
471
+ return context;
472
+ };
473
+ return AbstractNavigationTransition;
474
+ }(NavigationState));
475
+ NavigationState.AbstractNavigationTransition = AbstractNavigationTransition;
476
+ if (false) {
477
+ /** @type {?} */
478
+ AbstractNavigationTransition.prototype.isTransitional;
479
+ /**
480
+ * @type {?}
481
+ * @private
482
+ */
483
+ AbstractNavigationTransition.prototype.componentDeactivationHandlers;
484
+ /**
485
+ * @type {?}
486
+ * @private
487
+ */
488
+ AbstractNavigationTransition.prototype._interactionContext;
489
+ /** @type {?} */
490
+ AbstractNavigationTransition.prototype.isPopState;
491
+ /** @type {?} */
492
+ AbstractNavigationTransition.prototype.startingUrl;
493
+ }
494
+ var NavigationTransition = /** @class */ (function (_super) {
495
+ tslib_1.__extends(NavigationTransition, _super);
496
+ function NavigationTransition() {
497
+ var _this = _super !== null && _super.apply(this, arguments) || this;
498
+ _this.isPopState = false;
499
+ return _this;
500
+ }
501
+ /**
502
+ * @param {?} event
503
+ * @return {?}
504
+ */
505
+ NavigationTransition.prototype.onStart = /**
506
+ * @param {?} event
507
+ * @return {?}
508
+ */
509
+ function (event) {
510
+ // active sessions can have many cancel start cycles due
511
+ // to place guard redirects
512
+ return this;
513
+ };
514
+ /**
515
+ * @param {?} event
516
+ * @return {?}
517
+ */
518
+ NavigationTransition.prototype.onEnd = /**
519
+ * @param {?} event
520
+ * @return {?}
521
+ */
522
+ function (event) {
523
+ // navigation succeeded
524
+ this.context.notifySuccess(this);
525
+ return new Idle(this.context);
526
+ };
527
+ /**
528
+ * @param {?} event
529
+ * @return {?}
530
+ */
531
+ NavigationTransition.prototype.onCancel = /**
532
+ * @param {?} event
533
+ * @return {?}
534
+ */
535
+ function (event) {
536
+ return new Idle(this.context);
537
+ };
538
+ /**
539
+ * @param {?} event
540
+ * @return {?}
541
+ */
542
+ NavigationTransition.prototype.onError = /**
543
+ * @param {?} event
544
+ * @return {?}
545
+ */
546
+ function (event) {
547
+ // navigation was aborted.
548
+ return new Idle(this.context);
549
+ };
550
+ /**
551
+ * @return {?}
552
+ */
553
+ NavigationTransition.prototype.toString = /**
554
+ * @return {?}
555
+ */
556
+ function () {
557
+ return this.constructor.name + "(startingUrl: " + this.startingUrl + ")";
558
+ };
559
+ return NavigationTransition;
560
+ }(AbstractNavigationTransition));
561
+ NavigationState.NavigationTransition = NavigationTransition;
562
+ if (false) {
563
+ /** @type {?} */
564
+ NavigationTransition.prototype.isPopState;
565
+ }
566
+ var NavigationBackTransition = /** @class */ (function (_super) {
567
+ tslib_1.__extends(NavigationBackTransition, _super);
568
+ function NavigationBackTransition() {
569
+ var _this = _super !== null && _super.apply(this, arguments) || this;
570
+ _this.isPopState = true;
571
+ return _this;
572
+ }
573
+ /**
574
+ * @param {?} event
575
+ * @return {?}
576
+ */
577
+ NavigationBackTransition.prototype.onCancel = /**
578
+ * @param {?} event
579
+ * @return {?}
580
+ */
581
+ function (event) {
582
+ // Angular doesn't preserve the url when a guard cancels the back button.
583
+ // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
584
+ Logger.get(this).info('WORK-AROUND: Updating browser location after pop state - see angular issue #13586');
585
+ this.resetBrowserLocation(this.startingUrl);
586
+ return new Idle(this.context);
587
+ };
588
+ /**
589
+ * @param {?} event
590
+ * @return {?}
591
+ */
592
+ NavigationBackTransition.prototype.onError = /**
593
+ * @param {?} event
594
+ * @return {?}
595
+ */
596
+ function (event) {
597
+ // navigation was aborted.
598
+ if (this.currentRouterUrl() !== this.startingUrl) {
599
+ // Angular doesn't preserve the url when a guard cancels the back button.
600
+ // See https://github.com/angular/angular/issues/13586#issuecomment-432795720
601
+ Logger.get(this).info('WORK-AROUND: Updating browser location after pop state - see angular issue #13586');
602
+ this.resetBrowserLocation(this.startingUrl);
603
+ }
604
+ return new Idle(this.context);
605
+ };
606
+ return NavigationBackTransition;
607
+ }(AbstractNavigationTransition));
608
+ NavigationState.NavigationBackTransition = NavigationBackTransition;
609
+ if (false) {
610
+ /** @type {?} */
611
+ NavigationBackTransition.prototype.isPopState;
612
+ }
613
+ /**
614
+ * @abstract
615
+ */
616
+ var /**
617
+ * @abstract
618
+ */
619
+ AbstractInteractionTransition = /** @class */ (function (_super) {
620
+ tslib_1.__extends(AbstractInteractionTransition, _super);
621
+ function AbstractInteractionTransition(context, startingUrl) {
622
+ var _this = _super.call(this, context) || this;
623
+ _this.startingUrl = startingUrl;
624
+ _this.isTransitional = true;
625
+ return _this;
626
+ }
627
+ /**
628
+ * @protected
629
+ * @return {?}
630
+ */
631
+ AbstractInteractionTransition.prototype.reinstateInteractionRoute = /**
632
+ * @protected
633
+ * @return {?}
634
+ */
635
+ function () {
636
+ var _this = this;
637
+ console.log(this.startingUrl);
638
+ setTimeout((/**
639
+ * @return {?}
640
+ */
641
+ function () { return _this.placeRouter.syncInteractionIdsWithRouter(); }));
642
+ };
643
+ return AbstractInteractionTransition;
644
+ }(NavigationState));
645
+ NavigationState.AbstractInteractionTransition = AbstractInteractionTransition;
646
+ if (false) {
647
+ /** @type {?} */
648
+ AbstractInteractionTransition.prototype.isTransitional;
649
+ /** @type {?} */
650
+ AbstractInteractionTransition.prototype.startingUrl;
651
+ }
652
+ /**
653
+ * This state exists to handle all events while any kind of navigation is in progress. That way all other states can
654
+ * happily ignore interaction contexts.
655
+ */
656
+ var /**
657
+ * This state exists to handle all events while any kind of navigation is in progress. That way all other states can
658
+ * happily ignore interaction contexts.
659
+ */
660
+ InteractionTransition = /** @class */ (function (_super) {
661
+ tslib_1.__extends(InteractionTransition, _super);
662
+ function InteractionTransition() {
663
+ var _this = _super !== null && _super.apply(this, arguments) || this;
664
+ _this.isPopState = false;
665
+ return _this;
666
+ }
667
+ /**
668
+ * @param {?} event
669
+ * @return {?}
670
+ */
671
+ InteractionTransition.prototype.onEnd = /**
672
+ * @param {?} event
673
+ * @return {?}
674
+ */
675
+ function (event) {
676
+ if (this.context.interactionService.isActive()) {
677
+ this.reinstateInteractionRoute();
678
+ return new IdleDuringInteraction(this.context, this.startingUrl);
679
+ }
680
+ else {
681
+ return new Idle(this.context);
682
+ }
683
+ };
684
+ return InteractionTransition;
685
+ }(AbstractInteractionTransition));
686
+ NavigationState.InteractionTransition = InteractionTransition;
687
+ if (false) {
688
+ /** @type {?} */
689
+ InteractionTransition.prototype.isPopState;
690
+ }
691
+ /**
692
+ * This state exists to handle all events while any kind of navigation is in progress. That way all other states can
693
+ * happily ignore interaction contexts.
694
+ */
695
+ var /**
696
+ * This state exists to handle all events while any kind of navigation is in progress. That way all other states can
697
+ * happily ignore interaction contexts.
698
+ */
699
+ InteractionBackTransition = /** @class */ (function (_super) {
700
+ tslib_1.__extends(InteractionBackTransition, _super);
701
+ function InteractionBackTransition() {
702
+ var _this = _super !== null && _super.apply(this, arguments) || this;
703
+ _this.isPopState = true;
704
+ return _this;
705
+ }
706
+ /**
707
+ * @param {?} event
708
+ * @return {?}
709
+ */
710
+ InteractionBackTransition.prototype.onEnd = /**
711
+ * @param {?} event
712
+ * @return {?}
713
+ */
714
+ function (event) {
715
+ if (this.interactionService.isActive()) {
716
+ this.reinstateInteractionRoute();
717
+ return new IdleDuringInteraction(this.context, this.startingUrl);
718
+ }
719
+ else {
720
+ return new Idle(this.context);
721
+ }
722
+ };
723
+ return InteractionBackTransition;
724
+ }(AbstractInteractionTransition));
725
+ NavigationState.InteractionBackTransition = InteractionBackTransition;
726
+ if (false) {
727
+ /** @type {?} */
728
+ InteractionBackTransition.prototype.isPopState;
729
+ }
730
+ var IdleDuringInteraction = /** @class */ (function (_super) {
731
+ tslib_1.__extends(IdleDuringInteraction, _super);
732
+ function IdleDuringInteraction(context, startingUrl) {
733
+ var _this = _super.call(this, context) || this;
734
+ _this.startingUrl = startingUrl;
735
+ _this.isTransitional = false;
736
+ _this.isPopState = false;
737
+ return _this;
738
+ }
739
+ /**
740
+ * @param {?} event
741
+ * @return {?}
742
+ */
743
+ IdleDuringInteraction.prototype.onStart = /**
744
+ * @param {?} event
745
+ * @return {?}
746
+ */
747
+ function (event) {
748
+ return new InteractionTransition(this.context, event.url);
749
+ };
750
+ /**
751
+ * @param {?} event
752
+ * @return {?}
753
+ */
754
+ IdleDuringInteraction.prototype.onPopState = /**
755
+ * @param {?} event
756
+ * @return {?}
757
+ */
758
+ function (event) {
759
+ return new InteractionBackTransition(this.context, event.url);
760
+ };
761
+ return IdleDuringInteraction;
762
+ }(NavigationState));
763
+ NavigationState.IdleDuringInteraction = IdleDuringInteraction;
764
+ if (false) {
765
+ /** @type {?} */
766
+ IdleDuringInteraction.prototype.isTransitional;
767
+ /** @type {?} */
768
+ IdleDuringInteraction.prototype.isPopState;
769
+ /** @type {?} */
770
+ IdleDuringInteraction.prototype.startingUrl;
771
+ }
772
+ var CancelledDuringNavigationInteraction = /** @class */ (function (_super) {
773
+ tslib_1.__extends(CancelledDuringNavigationInteraction, _super);
774
+ function CancelledDuringNavigationInteraction(context, startingUrl, locationChangeTriggerUrl) {
775
+ var _this = _super.call(this, context) || this;
776
+ _this.startingUrl = startingUrl;
777
+ _this.locationChangeTriggerUrl = locationChangeTriggerUrl;
778
+ _this.isPopState = false;
779
+ _this.capturedFauxRouterStart = false;
780
+ return _this;
781
+ }
782
+ Object.defineProperty(CancelledDuringNavigationInteraction.prototype, "isTransitional", {
783
+ get: /**
784
+ * @return {?}
785
+ */
786
+ function () {
787
+ return !this.capturedFauxRouterStart;
788
+ },
789
+ enumerable: true,
790
+ configurable: true
791
+ });
792
+ /**
793
+ * @param {?} event
794
+ * @return {?}
795
+ */
796
+ CancelledDuringNavigationInteraction.prototype.onStart = /**
797
+ * @param {?} event
798
+ * @return {?}
799
+ */
800
+ function (event) {
801
+ if (event.url === this.locationChangeTriggerUrl && !this.capturedFauxRouterStart) {
802
+ this.capturedFauxRouterStart = true;
803
+ return this.ignore(event, 'url matched back button location change');
804
+ }
805
+ else {
806
+ return this.createTransitionStateFor(event);
807
+ }
808
+ };
809
+ /**
810
+ * @param {?} event
811
+ * @return {?}
812
+ */
813
+ CancelledDuringNavigationInteraction.prototype.onCancel = /**
814
+ * @param {?} event
815
+ * @return {?}
816
+ */
817
+ function (event) {
818
+ return this.ignore(event);
819
+ };
820
+ /**
821
+ * @param {?} event
822
+ * @return {?}
823
+ */
824
+ CancelledDuringNavigationInteraction.prototype.onEnd = /**
825
+ * @param {?} event
826
+ * @return {?}
827
+ */
828
+ function (event) {
829
+ return this.ignore(event);
830
+ };
831
+ /**
832
+ * @param {?} event
833
+ * @return {?}
834
+ */
835
+ CancelledDuringNavigationInteraction.prototype.onError = /**
836
+ * @param {?} event
837
+ * @return {?}
838
+ */
839
+ function (event) {
840
+ return this.ignore(event);
841
+ };
842
+ /**
843
+ * @param {?} event
844
+ * @return {?}
845
+ */
846
+ CancelledDuringNavigationInteraction.prototype.onPopState = /**
847
+ * @param {?} event
848
+ * @return {?}
849
+ */
850
+ function (event) {
851
+ return this.createTransitionStateFor(event);
852
+ };
853
+ /**
854
+ * @param {?} event
855
+ * @param {?=} reason
856
+ * @return {?}
857
+ */
858
+ CancelledDuringNavigationInteraction.prototype.ignore = /**
859
+ * @param {?} event
860
+ * @param {?=} reason
861
+ * @return {?}
862
+ */
863
+ function (event, reason) {
864
+ reason = reason ? " (" + reason + ")" : '';
865
+ Logger.get(this).info("ignoring router event" + reason + ": " + event.constructor.name + " -> " + event.url);
866
+ return this;
867
+ };
868
+ /**
869
+ * @return {?}
870
+ */
871
+ CancelledDuringNavigationInteraction.prototype.toString = /**
872
+ * @return {?}
873
+ */
874
+ function () {
875
+ return this.constructor.name + "(startingUrl: " + this.startingUrl + ", locationChangeTriggerUrl:" + this.locationChangeTriggerUrl + ")";
876
+ };
877
+ return CancelledDuringNavigationInteraction;
878
+ }(NavigationState));
879
+ NavigationState.CancelledDuringNavigationInteraction = CancelledDuringNavigationInteraction;
880
+ if (false) {
881
+ /** @type {?} */
882
+ CancelledDuringNavigationInteraction.prototype.isPopState;
883
+ /**
884
+ * @type {?}
885
+ * @private
886
+ */
887
+ CancelledDuringNavigationInteraction.prototype.capturedFauxRouterStart;
888
+ /** @type {?} */
889
+ CancelledDuringNavigationInteraction.prototype.startingUrl;
890
+ /** @type {?} */
891
+ CancelledDuringNavigationInteraction.prototype.locationChangeTriggerUrl;
892
+ }
893
+ })(NavigationState || (NavigationState = {}));
894
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi1zdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9ndWFyZHMvbmF2aWdhdGlvbi1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBUXJFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLHdDQUF3QyxDQUFDOzs7O0FBRTNGOzs7O0lBQThDLDJDQUFnQjtJQVE1RCx5QkFBK0IsT0FBZ0M7UUFBL0QsWUFDRSxpQkFBTyxTQUNSO1FBRjhCLGFBQU8sR0FBUCxPQUFPLENBQXlCO1FBTnZELGFBQU8sR0FBRyxJQUFJLEdBQUcsRUFBMEIsQ0FBQzs7SUFRcEQsQ0FBQztJQUVELHNCQUFJLGlDQUFJOzs7O1FBQVI7WUFDRSxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUM5QixDQUFDOzs7T0FBQTtJQUVELHNCQUFJLHdDQUFXOzs7O1FBQWY7WUFDRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQ2xDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0NBQWtCOzs7O1FBQXRCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQ3pDLENBQUM7OztPQUFBO0lBRUQsc0JBQUksK0NBQWtCOzs7O1FBQXRCO1lBQ0UsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDOzs7T0FBQTs7Ozs7SUFFRCxvQ0FBVTs7OztJQUFWLFVBQVcsS0FBWTtRQUNyQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELENBQUM7Ozs7O0lBRUQscUNBQVc7Ozs7SUFBWCxVQUFZLFFBQXlCO1FBQ25DLE9B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Ozs7UUFBVixVQUFXLEtBQXNCO1lBQy9CLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLENBQUM7Ozs7OztRQUVELHFEQUFNOzs7OztRQUFOLFVBQU8sS0FBa0IsRUFBRSxNQUFlO1lBQ3hDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQUssTUFBTSxNQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQywwQkFBd0IsTUFBTSxVQUFLLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxZQUFPLEtBQUssQ0FBQyxHQUFLLENBQUMsQ0FBQztZQUNuRyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7Ozs7UUFFRCx1REFBUTs7O1FBQVI7WUFDRSxPQUFVLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxzQkFBaUIsSUFBSSxDQUFDLFdBQVcsbUNBQThCLElBQUksQ0FBQyx3QkFBd0IsTUFBRyxDQUFDO1FBQ2pJLENBQUM7UUFFSCwyQ0FBQztJQUFELENBQUMsQUFsREQsQ0FBMEQsZUFBZSxHQWtEeEU7SUFsRFksb0RBQW9DLHVDQWtEaEQsQ0FBQTs7O1FBaERDLDBEQUE0Qjs7Ozs7UUFDNUIsdUVBQXdDOztRQUc1QiwyREFBNEI7O1FBQzVCLHdFQUF5Qzs7QUE0Q3pELENBQUMsRUF2UmdCLGVBQWUsS0FBZixlQUFlLFFBdVIvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5hdmlnYXRpb25DYW5jZWwsIE5hdmlnYXRpb25FbmQsIE5hdmlnYXRpb25FcnJvciwgTmF2aWdhdGlvblN0YXJ0LCBSb3V0ZXJFdmVudCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBEc2wsIEdhcmJhZ2VDb2xsZWN0b3IsIGxhbmcsIExvZ2dlciB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IEludGVyYWN0aW9uQ29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyYWN0aW9uL2ludGVyYWN0aW9uLWNvbnRleHQnO1xuaW1wb3J0IHsgSW50ZXJhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJhY3Rpb24vc2VydmljZXMvaW50ZXJhY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudCB9IGZyb20gJy4uL3BsYWNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBQbGFjZURlZmluaXRpb24gfSBmcm9tICcuLi9wbGFjZS1kZWZpbml0aW9uJztcbmltcG9ydCB7IFBsYWNlUm91dGVyIH0gZnJvbSAnLi4vcGxhY2Utcm91dGVyJztcbmltcG9ydCB7IFVybFNuYXBzaG90IH0gZnJvbSAnLi4vdXJsLXNuYXBzaG90JztcbmltcG9ydCB7IFZpc2l0IH0gZnJvbSAnLi4vdmlzaXQnO1xuaW1wb3J0IHsgUGxhY2VDb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVyIH0gZnJvbSAnLi9wbGFjZS1jb21wb25lbnQtZGVhY3RpdmF0aW9uLWhhbmRsZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmF2aWdhdGlvblN0YXRlIGV4dGVuZHMgR2FyYmFnZUNvbGxlY3RvciB7XG5cbiAgcHJpdmF0ZSBfdmlzaXRzID0gbmV3IE1hcDxQbGFjZURlZmluaXRpb24sIFZpc2l0PigpO1xuXG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsOiBib29sZWFuO1xuICBhYnN0cmFjdCByZWFkb25seSBzdGFydGluZ1VybDogc3RyaW5nO1xuICBhYnN0cmFjdCByZWFkb25seSBpc1BvcFN0YXRlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBjb250ZXh0OiBOYXZpZ2F0aW9uU3RhdGUuQ29udGV4dCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgaWRsZSgpIHtcbiAgICByZXR1cm4gIXRoaXMuaXNUcmFuc2l0aW9uYWw7XG4gIH1cblxuICBnZXQgcGxhY2VSb3V0ZXIoKTogUGxhY2VSb3V0ZXIge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHQucGxhY2VSb3V0ZXI7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25TZXJ2aWNlKCk6IEludGVyYWN0aW9uU2VydmljZSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGV4dC5pbnRlcmFjdGlvblNlcnZpY2U7XG4gIH1cblxuICBnZXQgaW50ZXJhY3Rpb25Db250ZXh0KCk6IEludGVyYWN0aW9uQ29udGV4dCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdG9yZVZpc2l0KHZpc2l0OiBWaXNpdCkge1xuICAgIHRoaXMuX3Zpc2l0cy5zZXQodmlzaXQucGxhY2VEZWZpbml0aW9uLCB2aXNpdCk7XG4gIH1cblxuICBnZXRWaXNpdEZvcihwbGFjZURlZjogUGxhY2VEZWZpbml0aW9uKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc2l0cy5nZXQocGxhY2VEZWYpO1xuICB9XG5cbiAgb25Qb3BTdGF0ZShldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLmlsbGVnYWxUcmFuc2l0aW9uKGV2ZW50KTtcbiAgfVxuXG4gIG9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbihldmVudCk7XG4gIH1cblxuICBvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKG5ld1VybDogc3RyaW5nKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbignb25CYWNrQ2xpY2tlZER1cmluZ05hdmlnYXRpb25JbnRlcmFjdGlvbicpO1xuICB9XG5cbiAgYXN5bmMgY2FuRGVhY3RpdmF0ZVBsYWNlKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQsIG5leHRTdGF0ZTogVXJsU25hcHNob3QpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5pbGxlZ2FsVHJhbnNpdGlvbignY2FuRGVhY3RpdmF0ZVBsYWNlJyk7XG4gIH1cblxuICBnZXRWaXNpdHMoKTogVmlzaXRbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fdmlzaXRzLnZhbHVlcygpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbGxlZ2FsVHJhbnNpdGlvbjxSPihtZXNzYWdlOiBzdHJpbmcgfCBSb3V0ZXJFdmVudCk6IFIge1xuICAgIHJldHVybiBsYW5nLmlsbGVnYWxTdGF0ZShgJHttZXNzYWdlLnRvU3RyaW5nKCl9IG5vdCBzdXBwb3J0ZWQgYnkgJHt0aGlzLnRvU3RyaW5nKCl9YCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY3VycmVudFJvdXRlclVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBsYWNlUm91dGVyLmdldEN1cnJlbnRSb3V0ZXJVcmwoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVUcmFuc2l0aW9uU3RhdGVGb3IoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCkge1xuICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoZSBldmVudCBpcyBwdXJlbHkgZm9yIGludGVyYWN0aW9uIGNvbnRleHQgY2hhbmdlcy5cbiAgICBjb25zdCBwb3BzdGF0ZSA9IGV2ZW50Lm5hdmlnYXRpb25UcmlnZ2VyID09PSAncG9wc3RhdGUnO1xuICAgIHJldHVybiBwb3BzdGF0ZSA/XG4gICAgICBuZXcgTmF2aWdhdGlvblN0YXRlLk5hdmlnYXRpb25CYWNrVHJhbnNpdGlvbih0aGlzLmNvbnRleHQsIHBvcHN0YXRlLCB0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSkgOlxuICAgICAgbmV3IE5hdmlnYXRpb25TdGF0ZS5OYXZpZ2F0aW9uVHJhbnNpdGlvbih0aGlzLmNvbnRleHQsIHBvcHN0YXRlLCB0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSk7XG4gIH1cblxuICByZXNldEJyb3dzZXJMb2NhdGlvbih1cmwpIHtcbiAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhIG5hdmlnYXRlIG9wZXJhdGlvbiB0byBhdm9pZCBjb25mdXNpbmcgdGhlIHJvdXRlci4uLj8/XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnBsYWNlUm91dGVyLnJlc2V0QnJvd3NlckxvY2F0aW9uKHVybCkpO1xuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9XG5cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBOYXZpZ2F0aW9uU3RhdGUge1xuXG4gIGV4cG9ydCBjbGFzcyBDb250ZXh0IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlYWRvbmx5IHBsYWNlUm91dGVyOiBQbGFjZVJvdXRlcixcbiAgICAgIHJlYWRvbmx5IGludGVyYWN0aW9uU2VydmljZTogSW50ZXJhY3Rpb25TZXJ2aWNlLFxuICAgICAgcmVhZG9ubHkgbm90aWZ5U3VjY2VzczogKHN1Y2Nlc3M6IE5hdmlnYXRpb25TdGF0ZSkgPT4gdm9pZCkge1xuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBJZGxlIGV4dGVuZHMgTmF2aWdhdGlvblN0YXRlIHtcbiAgICByZWFkb25seSBpc1RyYW5zaXRpb25hbCA9IGZhbHNlO1xuICAgIHJlYWRvbmx5IHN0YXJ0aW5nVXJsID0gbnVsbDtcbiAgICByZWFkb25seSBpc1BvcFN0YXRlID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0KSB7XG4gICAgICBzdXBlcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuXG4gICAgICAvLyBjYWxsaW5nIGFuZ3VsYXJMb2NhdGlvbi5nbygpIHRvIGNsZWFyIGJhY2sgc3RhdGUgY2FuIHRyaWdnZXIgcm91dGVyIGN5Y2xlcyB0byB0aGUgY3VycmVudCB1cmwgaWYgd2UgZG9uJ3QgaWdub3JlIHRoZW1cbiAgICAgIGlmIChldmVudC51cmwgPT09IHRoaXMuY3VycmVudFJvdXRlclVybCgpKSB7XG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgbmF2aWdhdGlvbiBzdGFydGVkIHRvIHNhbWUgdXJsIC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMucGxhY2VSb3V0ZXIuaGFzQWN0aXZlSW50ZXJhY3Rpb25JZHMoZXZlbnQudXJsKSkge1xuICAgICAgICBMb2dnZXIuZ2V0KHRoaXMpLmluZm8oYG5hdmlnYXRpb24gc3RhcnRlZCB3aXRoIGludGVyYWN0aW9uIG91dGxldCAtPiAke2V2ZW50LnVybH1gKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJbnRlcmFjdGlvblRyYW5zaXRpb24odGhpcy5jb250ZXh0LCBldmVudC51cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvblBvcFN0YXRlKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROYXZpZ2F0aW9uVHJhbnNpdGlvbiBleHRlbmRzIE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmVhZG9ubHkgaXNUcmFuc2l0aW9uYWwgPSB0cnVlO1xuICAgIHByaXZhdGUgY29tcG9uZW50RGVhY3RpdmF0aW9uSGFuZGxlcnMgPSBuZXcgTWFwPFBsYWNlQ29tcG9uZW50LCBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXI+KCk7XG4gICAgcHJpdmF0ZSBfaW50ZXJhY3Rpb25Db250ZXh0OiBJbnRlcmFjdGlvbkNvbnRleHQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBDb250ZXh0LCByZWFkb25seSBpc1BvcFN0YXRlOiBib29sZWFuLCByZWFkb25seSBzdGFydGluZ1VybDogc3RyaW5nKSB7XG4gICAgICBzdXBlcihjb250ZXh0KTtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCA9IHRoaXMuaW50ZXJhY3Rpb25TZXJ2aWNlLl9jcmVhdGVFeGNsdXNpdmVNb2RhbEludGVyYWN0aW9uQ29udGV4dCgpO1xuICAgICAgdGhpcy5vbkRpc3Bvc2UoKCkgPT4ge1xuICAgICAgICAvLyB0aGUgaW50ZXJhY3Rpb24gY29udGV4dCBjYW4gYmUgZGV0YWNoZWQgZHVyaW5nIHRoZSBiYWNrIGJ1dHRvbiBjYW5jZWxsYXRpb24gc3RhdGUgdHJhbnNpdGlvblxuICAgICAgICAvLyBhcyB0aGUgdHJhbnNpdGlvbiBpcyBzeW5jaHJvbm91cyBhbmQgYWN0aXZpdHlDYW5jZWxsYXRpb24gaXNuJ3QuICBPdGhlcndpc2UgZGlzcG9zZSB3aWxsIGJlXG4gICAgICAgIC8vIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRleHQgaGFzIGJlZW4gY2FuY2VsbGVkLiAgSXQgbWlnaHQgYmUgd29yayBoYXZpbmcgdGhlIGludGVyYWN0aW9uIGNvbnRleHRcbiAgICAgICAgLy8gYXV0b21hdGljYWxseSBjYW5jZWwgaWYgdGhlIGNvbnRleHQgaXMgZGlzcG9zZWQgc28gd2UgZG9uJ3QgaGF2ZSB3b3JyeSBhYm91dCBkZXRhY2hpbmcgZXRjLlxuICAgICAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25Db250ZXh0KSB7XG4gICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb25Db250ZXh0LmRpc3Bvc2UoKTsgLy8gb3IgZG8gc29tZXRoaW5nIGxpa2UgY2FuY2VsQW5kRGlzcG9zZT9cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGludGVyYWN0aW9uQ29udGV4dCgpOiBJbnRlcmFjdGlvbkNvbnRleHQge1xuICAgICAgcmV0dXJuIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dDtcbiAgICB9XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gYWN0aXZlIHNlc3Npb25zIGNhbiBoYXZlIG1hbnkgY2FuY2VsIHN0YXJ0IGN5Y2xlcyBkdWVcbiAgICAgIC8vIHRvIHBsYWNlIGd1YXJkIHJlZGlyZWN0c1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiBzdWNjZWVkZWRcbiAgICAgIHRoaXMuY29udGV4dC5ub3RpZnlTdWNjZXNzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG5cbiAgICBvbkJhY2tDbGlja2VkRHVyaW5nTmF2aWdhdGlvbkludGVyYWN0aW9uKGxvY2F0aW9uVHJpZ2dlclVybDogc3RyaW5nKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIC8vIGRldGFjaCB0aGUgaW50ZXJhY3RvaW4gZnJvbSB0aGUgc2Vzc2lvbiBzbyBpdCBkb2Vzbid0IGdldCBkaXNwb3NlZCB1bnRpbCB0aGUgYWN0aXZpdHlcbiAgICAgIC8vIGhhcyBjb21wbGV0ZWQuXG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5kZXRhY2hJbnRlcmFjdGlvbkNvbnRleHQoKTtcbiAgICAgIGNvbnN0IHsgd2hlbiB9ID0gRHNsLmRpc3Bvc2VXaXRoKGNvbnRleHQpO1xuICAgICAgLy8gVE9ETzogSSBuZWVkIHRvIG1ha2UgdGhlIGV4Y2x1c2l2ZSBpbnRlcmFjdGlvbiBjb250ZXh0IGRpc2FsbG93IG5lc3RlZCBhY3Rpdml0aWVzIG9yXG4gICAgICAvLyAgICAgICB0aGF0IHdvdWxkIG1lc3MgdGhpbmdzIHVwIGVudGlyZWx5LlxuICAgICAgY29udGV4dC5nZXRDdXJyZW50QWN0aXZpdHkoKS50aGVuKGFjdGl2aXR5ID0+IHtcbiAgICAgICAgd2hlbi52YWx1ZU9mKGNvbnRleHQuYWN0aXZlKS5iZWNvbWVzRmFsc2V5KCgpID0+IGNvbnRleHQuZGlzcG9zZSgpLCB7IG9uY2U6IHRydWUgfSk7XG4gICAgICAgIGFjdGl2aXR5LmNhbmNlbChudWxsKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBDYW5jZWxsZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LFxuICAgICAgICB0aGlzLnN0YXJ0aW5nVXJsLFxuICAgICAgICBsb2NhdGlvblRyaWdnZXJVcmwpO1xuICAgIH1cblxuICAgIGFzeW5jIGNhbkRlYWN0aXZhdGVQbGFjZShjb21wb25lbnQ6IFBsYWNlQ29tcG9uZW50LCBuZXh0U3RhdGU6IFVybFNuYXBzaG90KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAvLyBsb29rdXAgdGhlIGhhbmRsZXIgYW5kIGNyZWF0ZSBpdCBpZiB3ZSd2ZSBub3Qgc2VlbiBpdCB5ZXRcbiAgICAgIGxldCBoYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5nZXQoY29tcG9uZW50KTtcbiAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICBjb25zdCBpc1ByaW1hcnlIYW5kbGVyID0gdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zaXplID09PSAwOyAvLyBvbmx5IHByaW1hcnkgaGFuZGxlciBjYW5jZWxlIHRoZSBhcHAgbW9kZWwgaW50ZXJhdGlvbnNcbiAgICAgICAgaGFuZGxlciA9IG5ldyBQbGFjZUNvbXBvbmVudERlYWN0aXZhdGlvbkhhbmRsZXIoY29tcG9uZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnREZWFjdGl2YXRpb25IYW5kbGVycy5zZXQoY29tcG9uZW50LCBoYW5kbGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyLmNhbkRlYWN0aXZhdGUobmV4dFN0YXRlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGRldGFjaEludGVyYWN0aW9uQ29udGV4dCgpOiBJbnRlcmFjdGlvbkNvbnRleHQge1xuICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dDtcbiAgICAgIHRoaXMuX2ludGVyYWN0aW9uQ29udGV4dCA9IG51bGw7XG4gICAgICByZXR1cm4gY29udGV4dDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgTmF2aWdhdGlvblRyYW5zaXRpb24gZXh0ZW5kcyBBYnN0cmFjdE5hdmlnYXRpb25UcmFuc2l0aW9uIHtcbiAgICByZWFkb25seSBpc1BvcFN0YXRlID0gZmFsc2U7XG5cbiAgICBvblN0YXJ0KGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gYWN0aXZlIHNlc3Npb25zIGNhbiBoYXZlIG1hbnkgY2FuY2VsIHN0YXJ0IGN5Y2xlcyBkdWVcbiAgICAgIC8vIHRvIHBsYWNlIGd1YXJkIHJlZGlyZWN0c1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiBzdWNjZWVkZWRcbiAgICAgIHRoaXMuY29udGV4dC5ub3RpZnlTdWNjZXNzKHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25DYW5jZWwoZXZlbnQ6IE5hdmlnYXRpb25DYW5jZWwpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIG5ldyBJZGxlKHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25FcnJvcihldmVudDogTmF2aWdhdGlvbkVycm9yKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIC8vIG5hdmlnYXRpb24gd2FzIGFib3J0ZWQuXG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke3RoaXMuY29uc3RydWN0b3IubmFtZX0oc3RhcnRpbmdVcmw6ICR7dGhpcy5zdGFydGluZ1VybH0pYDtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY2xhc3MgTmF2aWdhdGlvbkJhY2tUcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3ROYXZpZ2F0aW9uVHJhbnNpdGlvbiB7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IHRydWU7XG5cbiAgICBvbkNhbmNlbChldmVudDogTmF2aWdhdGlvbkNhbmNlbCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTM1ODYjaXNzdWVjb21tZW50LTQzMjc5NTcyMFxuICAgICAgTG9nZ2VyLmdldCh0aGlzKS5pbmZvKCdXT1JLLUFST1VORDogVXBkYXRpbmcgYnJvd3NlciBsb2NhdGlvbiBhZnRlciBwb3Agc3RhdGUgLSBzZWUgYW5ndWxhciBpc3N1ZSAjMTM1ODYnKTtcbiAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgLy8gbmF2aWdhdGlvbiB3YXMgYWJvcnRlZC5cbiAgICAgIGlmICh0aGlzLmN1cnJlbnRSb3V0ZXJVcmwoKSAhPT0gdGhpcy5zdGFydGluZ1VybCkge1xuICAgICAgICAvLyBBbmd1bGFyIGRvZXNuJ3QgcHJlc2VydmUgdGhlIHVybCB3aGVuIGEgZ3VhcmQgY2FuY2VscyB0aGUgYmFjayBidXR0b24uXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzU4NiNpc3N1ZWNvbW1lbnQtNDMyNzk1NzIwXG4gICAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbygnV09SSy1BUk9VTkQ6IFVwZGF0aW5nIGJyb3dzZXIgbG9jYXRpb24gYWZ0ZXIgcG9wIHN0YXRlIC0gc2VlIGFuZ3VsYXIgaXNzdWUgIzEzNTg2Jyk7XG4gICAgICAgIHRoaXMucmVzZXRCcm93c2VyTG9jYXRpb24odGhpcy5zdGFydGluZ1VybCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgfVxuXG4gIGV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEludGVyYWN0aW9uVHJhbnNpdGlvbiBleHRlbmRzIE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgcmVhZG9ubHkgaXNUcmFuc2l0aW9uYWwgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlaW5zdGF0ZUludGVyYWN0aW9uUm91dGUoKSB7XG4gICAgICBjb25zb2xlLmxvZyh0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5wbGFjZVJvdXRlci5zeW5jSW50ZXJhY3Rpb25JZHNXaXRoUm91dGVyKCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHN0YXRlIGV4aXN0cyB0byBoYW5kbGUgYWxsIGV2ZW50cyB3aGlsZSBhbnkga2luZCBvZiBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLiAgVGhhdCB3YXkgYWxsIG90aGVyIHN0YXRlcyBjYW5cbiAgICogaGFwcGlseSBpZ25vcmUgaW50ZXJhY3Rpb24gY29udGV4dHMuXG4gICAqL1xuICBleHBvcnQgY2xhc3MgSW50ZXJhY3Rpb25UcmFuc2l0aW9uIGV4dGVuZHMgQWJzdHJhY3RJbnRlcmFjdGlvblRyYW5zaXRpb24ge1xuICAgIHJlYWRvbmx5IGlzUG9wU3RhdGUgPSBmYWxzZTtcblxuICAgIG9uRW5kKGV2ZW50OiBOYXZpZ2F0aW9uRW5kKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRleHQuaW50ZXJhY3Rpb25TZXJ2aWNlLmlzQWN0aXZlKCkpIHtcbiAgICAgICAgdGhpcy5yZWluc3RhdGVJbnRlcmFjdGlvblJvdXRlKCk7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZUR1cmluZ0ludGVyYWN0aW9uKHRoaXMuY29udGV4dCwgdGhpcy5zdGFydGluZ1VybCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbmV3IElkbGUodGhpcy5jb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBzdGF0ZSBleGlzdHMgdG8gaGFuZGxlIGFsbCBldmVudHMgd2hpbGUgYW55IGtpbmQgb2YgbmF2aWdhdGlvbiBpcyBpbiBwcm9ncmVzcy4gIFRoYXQgd2F5IGFsbCBvdGhlciBzdGF0ZXMgY2FuXG4gICAqIGhhcHBpbHkgaWdub3JlIGludGVyYWN0aW9uIGNvbnRleHRzLlxuICAgKi9cbiAgZXhwb3J0IGNsYXNzIEludGVyYWN0aW9uQmFja1RyYW5zaXRpb24gZXh0ZW5kcyBBYnN0cmFjdEludGVyYWN0aW9uVHJhbnNpdGlvbiB7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IHRydWU7XG5cbiAgICBvbkVuZChldmVudDogTmF2aWdhdGlvbkVuZCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBpZiAodGhpcy5pbnRlcmFjdGlvblNlcnZpY2UuaXNBY3RpdmUoKSkge1xuICAgICAgICB0aGlzLnJlaW5zdGF0ZUludGVyYWN0aW9uUm91dGUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24odGhpcy5jb250ZXh0LCB0aGlzLnN0YXJ0aW5nVXJsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgSWRsZSh0aGlzLmNvbnRleHQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGV4cG9ydCBjbGFzcyBJZGxlRHVyaW5nSW50ZXJhY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuICAgIHJlYWRvbmx5IGlzVHJhbnNpdGlvbmFsID0gZmFsc2U7XG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoY29udGV4dDogQ29udGV4dCwgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgb25TdGFydChldmVudDogTmF2aWdhdGlvblN0YXJ0KTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIHJldHVybiBuZXcgSW50ZXJhY3Rpb25UcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgZXZlbnQudXJsKTtcbiAgICB9XG5cbiAgICBvblBvcFN0YXRlKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIG5ldyBJbnRlcmFjdGlvbkJhY2tUcmFuc2l0aW9uKHRoaXMuY29udGV4dCwgZXZlbnQudXJsKTtcbiAgICB9XG4gIH1cblxuXG4gIGV4cG9ydCBjbGFzcyBDYW5jZWxsZWREdXJpbmdOYXZpZ2F0aW9uSW50ZXJhY3Rpb24gZXh0ZW5kcyBOYXZpZ2F0aW9uU3RhdGUge1xuXG4gICAgcmVhZG9ubHkgaXNQb3BTdGF0ZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgY2FwdHVyZWRGYXV4Um91dGVyU3RhcnQgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IENvbnRleHQsXG4gICAgICAgICAgICAgICAgcmVhZG9ubHkgc3RhcnRpbmdVcmw6IHN0cmluZyxcbiAgICAgICAgICAgICAgICByZWFkb25seSBsb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmw6IHN0cmluZykge1xuICAgICAgc3VwZXIoY29udGV4dCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzVHJhbnNpdGlvbmFsKCkge1xuICAgICAgcmV0dXJuICF0aGlzLmNhcHR1cmVkRmF1eFJvdXRlclN0YXJ0O1xuICAgIH1cblxuICAgIG9uU3RhcnQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCk6IE5hdmlnYXRpb25TdGF0ZSB7XG4gICAgICBpZiAoZXZlbnQudXJsID09PSB0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybCAmJiAhdGhpcy5jYXB0dXJlZEZhdXhSb3V0ZXJTdGFydCkge1xuICAgICAgICB0aGlzLmNhcHR1cmVkRmF1eFJvdXRlclN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWdub3JlKGV2ZW50LCAndXJsIG1hdGNoZWQgYmFjayBidXR0b24gbG9jYXRpb24gY2hhbmdlJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVUcmFuc2l0aW9uU3RhdGVGb3IoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uQ2FuY2VsKGV2ZW50OiBOYXZpZ2F0aW9uQ2FuY2VsKTogTmF2aWdhdGlvblN0YXRlIHtcbiAgICAgIHJldHVybiB0aGlzLmlnbm9yZShldmVudCk7XG4gICAgfVxuXG4gICAgb25FbmQoZXZlbnQ6IE5hdmlnYXRpb25FbmQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuaWdub3JlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvbkVycm9yKGV2ZW50OiBOYXZpZ2F0aW9uRXJyb3IpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuaWdub3JlKGV2ZW50KTtcbiAgICB9XG5cbiAgICBvblBvcFN0YXRlKGV2ZW50OiBOYXZpZ2F0aW9uU3RhcnQpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVHJhbnNpdGlvblN0YXRlRm9yKGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZ25vcmUoZXZlbnQ6IFJvdXRlckV2ZW50LCByZWFzb24/OiBzdHJpbmcpOiBOYXZpZ2F0aW9uU3RhdGUge1xuICAgICAgcmVhc29uID0gcmVhc29uID8gYCAoJHtyZWFzb259KWAgOiAnJztcbiAgICAgIExvZ2dlci5nZXQodGhpcykuaW5mbyhgaWdub3Jpbmcgcm91dGVyIGV2ZW50JHtyZWFzb259OiAke2V2ZW50LmNvbnN0cnVjdG9yLm5hbWV9IC0+ICR7ZXZlbnQudXJsfWApO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLmNvbnN0cnVjdG9yLm5hbWV9KHN0YXJ0aW5nVXJsOiAke3RoaXMuc3RhcnRpbmdVcmx9LCBsb2NhdGlvbkNoYW5nZVRyaWdnZXJVcmw6JHt0aGlzLmxvY2F0aW9uQ2hhbmdlVHJpZ2dlclVybH0pYDtcbiAgICB9XG5cbiAgfVxufVxuIl19