@coolon/angular-ui-powerups 0.0.66 → 0.0.68

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 (121) hide show
  1. package/bundles/coolon-angular-ui-powerups.umd.js +2207 -1737
  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 +24 -22
  6. package/coolon-angular-ui-powerups.metadata.json +1 -1
  7. package/esm2015/coolon-angular-ui-powerups.js +24 -22
  8. package/esm2015/index.js +2 -2
  9. package/esm2015/lib/angular-ui-powerups.module.js +6 -3
  10. package/esm2015/lib/components/index.js +2 -1
  11. package/esm2015/lib/components/noop/noop.component.js +19 -0
  12. package/esm2015/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
  13. package/esm2015/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
  14. package/esm2015/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
  15. package/esm2015/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +19 -0
  16. package/esm2015/lib/interaction/guards/interaction-guard.service.js +85 -0
  17. package/esm2015/lib/interaction/index.js +3 -2
  18. package/esm2015/lib/interaction/interaction.module.js +8 -3
  19. package/esm2015/lib/interaction/services/dialog-interaction.service.js +30 -5
  20. package/esm2015/lib/place/components/abstract-place-navigation.component.js +5 -5
  21. package/esm2015/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
  22. package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +60 -66
  23. package/esm2015/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
  24. package/esm2015/lib/place/index.js +9 -8
  25. package/esm2015/lib/place/navigation-session.js +147 -0
  26. package/esm2015/lib/place/place-component.js +18 -14
  27. package/esm2015/lib/place/place-definition.js +197 -5
  28. package/esm2015/lib/place/place-history.js +3 -2
  29. package/esm2015/lib/place/place-router.js +186 -89
  30. package/esm2015/lib/place/route/formatter.js +63 -0
  31. package/esm2015/lib/place/route/guards/leave-place.guard.js +193 -0
  32. package/esm2015/lib/place/route/guards/place-route.guard.js +243 -0
  33. package/esm2015/lib/place/route/parameter-decorators.js +35 -18
  34. package/esm2015/lib/place/route/parameter-definition.class.js +123 -67
  35. package/esm2015/lib/place/route/parameter-sanitiser.js +4 -3
  36. package/esm2015/lib/place/route/parameter-snapshot.js +11 -388
  37. package/esm2015/lib/place/route/visit-sanitiser.js +88 -0
  38. package/esm2015/lib/place/visit.js +107 -8
  39. package/esm2015/public_api.js +4 -4
  40. package/esm5/coolon-angular-ui-powerups.js +24 -22
  41. package/esm5/index.js +2 -2
  42. package/esm5/lib/angular-ui-powerups.module.js +6 -3
  43. package/esm5/lib/components/index.js +2 -1
  44. package/esm5/lib/components/noop/noop.component.js +21 -0
  45. package/esm5/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
  46. package/esm5/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
  47. package/esm5/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
  48. package/esm5/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +21 -0
  49. package/esm5/lib/interaction/guards/interaction-guard.service.js +94 -0
  50. package/esm5/lib/interaction/index.js +3 -2
  51. package/esm5/lib/interaction/interaction.module.js +8 -3
  52. package/esm5/lib/interaction/services/dialog-interaction.service.js +28 -5
  53. package/esm5/lib/place/components/abstract-place-navigation.component.js +5 -5
  54. package/esm5/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
  55. package/esm5/lib/place/components/place-outlet/place-outlet.component.js +70 -82
  56. package/esm5/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
  57. package/esm5/lib/place/index.js +9 -8
  58. package/esm5/lib/place/navigation-session.js +193 -0
  59. package/esm5/lib/place/place-component.js +19 -15
  60. package/esm5/lib/place/place-definition.js +253 -5
  61. package/esm5/lib/place/place-history.js +7 -3
  62. package/esm5/lib/place/place-router.js +242 -107
  63. package/esm5/lib/place/route/formatter.js +96 -0
  64. package/esm5/lib/place/route/guards/leave-place.guard.js +152 -0
  65. package/esm5/lib/place/route/guards/place-route.guard.js +273 -0
  66. package/esm5/lib/place/route/parameter-decorators.js +35 -18
  67. package/esm5/lib/place/route/parameter-definition.class.js +179 -76
  68. package/esm5/lib/place/route/parameter-sanitiser.js +4 -3
  69. package/esm5/lib/place/route/parameter-snapshot.js +11 -480
  70. package/esm5/lib/place/route/visit-sanitiser.js +99 -0
  71. package/esm5/lib/place/visit.js +160 -8
  72. package/esm5/public_api.js +4 -4
  73. package/fesm2015/coolon-angular-ui-powerups.js +1493 -1124
  74. package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
  75. package/fesm5/coolon-angular-ui-powerups.js +2166 -1700
  76. package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
  77. package/lib/components/index.d.ts +1 -0
  78. package/lib/components/noop/noop.component.d.ts +3 -0
  79. package/lib/interaction/components/interaction-outlet/interaction-outlet.component.d.ts +3 -0
  80. package/lib/interaction/guards/interaction-guard.service.d.ts +13 -0
  81. package/lib/interaction/index.d.ts +2 -1
  82. package/lib/interaction/services/dialog-interaction.service.d.ts +5 -1
  83. package/lib/place/components/place-outlet/place-outlet.component.d.ts +12 -12
  84. package/lib/place/index.d.ts +5 -4
  85. package/lib/place/navigation-session.d.ts +26 -0
  86. package/lib/place/place-component.d.ts +3 -3
  87. package/lib/place/place-definition.d.ts +30 -3
  88. package/lib/place/place-history.d.ts +3 -3
  89. package/lib/place/place-router.d.ts +26 -19
  90. package/lib/place/route/{parameter-type.d.ts → formatter.d.ts} +5 -5
  91. package/lib/place/{guards → route/guards}/leave-place.guard.d.ts +4 -3
  92. package/lib/place/route/guards/place-route.guard.d.ts +27 -0
  93. package/lib/place/route/parameter-decorators.d.ts +14 -6
  94. package/lib/place/route/parameter-definition.class.d.ts +21 -17
  95. package/lib/place/route/parameter-sanitiser.d.ts +3 -2
  96. package/lib/place/route/parameter-snapshot.d.ts +4 -26
  97. package/lib/place/route/visit-sanitiser.d.ts +12 -0
  98. package/lib/place/visit.d.ts +24 -3
  99. package/package.json +1 -1
  100. package/schematics/place-routes/place-class-scanner.d.ts +2 -2
  101. package/schematics/place-routes/place-class-scanner.js +7 -7
  102. package/schematics/place-routes/place-class-scanner.js.map +1 -1
  103. package/schematics/place-routes/place-def.d.ts +3 -2
  104. package/schematics/place-routes/place-def.js +21 -12
  105. package/schematics/place-routes/place-def.js.map +1 -1
  106. package/schematics/place-routes/templates/place-destinations.ts.template +5 -3
  107. package/schematics/place-routes/templates/place-routes.ts.template +10 -1
  108. package/schematics/place-routes/templates/place-visits.ts.template +21 -0
  109. package/esm2015/lib/interaction/guards/close-interaction.guard.js +0 -62
  110. package/esm2015/lib/place/guards/leave-place.guard.js +0 -159
  111. package/esm2015/lib/place/guards/place-route.guard.js +0 -74
  112. package/esm2015/lib/place/route/parameter-type.js +0 -61
  113. package/esm2015/lib/place/route/route-parameter-value.js +0 -230
  114. package/esm5/lib/interaction/guards/close-interaction.guard.js +0 -66
  115. package/esm5/lib/place/guards/leave-place.guard.js +0 -117
  116. package/esm5/lib/place/guards/place-route.guard.js +0 -78
  117. package/esm5/lib/place/route/parameter-type.js +0 -94
  118. package/esm5/lib/place/route/route-parameter-value.js +0 -316
  119. package/lib/interaction/guards/close-interaction.guard.d.ts +0 -12
  120. package/lib/place/guards/place-route.guard.d.ts +0 -10
  121. package/lib/place/route/route-parameter-value.d.ts +0 -42
@@ -2,93 +2,100 @@
2
2
  * @fileoverview added by tsickle
3
3
  * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
4
  */
5
+ import * as tslib_1 from "tslib";
5
6
  import { Location } from '@angular/common';
6
7
  import { Injectable } from '@angular/core';
7
- import { NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
8
- import { MutableValueModel } from '@coolon/pectin';
8
+ import { ActivatedRoute, NavigationEnd, NavigationError, NavigationStart, Router } from '@angular/router';
9
+ import { Dsl, GarbageCollector, MutableListModel, MutableValueModel, Trace } from '@coolon/pectin';
9
10
  import _ from 'lodash';
11
+ import { NavigationSession } from './navigation-session';
12
+ import { PlaceHistory } from './place-history';
13
+ import { Visit } from './visit';
10
14
  import * as i0 from "@angular/core";
11
15
  import * as i1 from "@angular/router";
12
16
  import * as i2 from "@angular/common";
13
- class NavigationSession {
14
- /**
15
- * @param {?} isPopState
16
- * @param {?} initialUrl
17
- */
18
- constructor(isPopState, initialUrl) {
19
- this.isPopState = isPopState;
20
- this.initialUrl = initialUrl;
21
- this._alreadyAccepted = [];
22
- console.log('NavigationSession', { isPopState, initialUrl });
23
- }
24
- /**
25
- * @param {?} placeComponent
26
- * @return {?}
27
- */
28
- alreadyAccepted(placeComponent) {
29
- return this._alreadyAccepted.includes(placeComponent);
30
- }
31
- /**
32
- * @param {?} component
33
- * @return {?}
34
- */
35
- rememberAcceptanceOf(component) {
36
- this._alreadyAccepted.push(component);
37
- }
38
- }
39
- if (false) {
40
- /**
41
- * @type {?}
42
- * @private
43
- */
44
- NavigationSession.prototype._alreadyAccepted;
45
- /** @type {?} */
46
- NavigationSession.prototype.isPopState;
47
- /** @type {?} */
48
- NavigationSession.prototype.initialUrl;
49
- }
50
- export class PlaceRouter {
17
+ import * as i3 from "./place-history";
18
+ export class PlaceRouter extends GarbageCollector {
51
19
  /**
52
20
  * @param {?} router
53
21
  * @param {?} angularLocation
22
+ * @param {?} placeHistory
54
23
  */
55
- constructor(router, angularLocation) {
24
+ constructor(router, angularLocation, placeHistory) {
25
+ super();
56
26
  this.router = router;
57
- this._navigationSession = new MutableValueModel();
27
+ this.angularLocation = angularLocation;
28
+ this.placeHistory = placeHistory;
29
+ this.firstRoute = true;
30
+ this._navigationSessionModel = new MutableValueModel();
31
+ this._activeVisits = new MutableListModel();
32
+ const { chain, valueOf, before, when, after, observe, switchOn } = Dsl.disposeWith(this);
33
+ this.activeVisitIndex = chain(this._activeVisits).indexBy('placeDefinition');
58
34
  angularLocation.onUrlChange((/**
59
35
  * @param {?} url
60
36
  * @return {?}
61
37
  */
62
38
  url => {
63
- console.log(`### ${url}`);
39
+ console.log(`location.onUrlChange -> ${url}`);
64
40
  }));
41
+ // TODO: make setup the callbacks in during module initiation to make this testable.
65
42
  this.router.events.subscribe((/**
66
43
  * @param {?} event
67
44
  * @return {?}
68
45
  */
69
46
  event => {
70
- // console.log(`${event.constructor.name}`, location.pathname, angularLocation.getState());
71
- // NavigationStart -> .... -> NavigationCancel === redirect (so don't ask again)
72
- // NavigationStart -> .... -> NavigationEnd === navigated (so ask next time)
73
- // NavigationStart -> .... -> NavigationError === canceled (guard cancelled so ask next time)
74
- if (event instanceof NavigationStart && !this.navigationSession) {
75
- this._navigationSession.value = new NavigationSession(event.navigationTrigger === 'popstate', this.router.routerState.snapshot.url);
47
+ // Routing event sequence
48
+ // ======================
49
+ // NavigationStart -> .... -> NavigationCancel --> redirect, go around again in the same session
50
+ // NavigationStart -> .... -> NavigationEnd --> navigation complete, end session.
51
+ // NavigationStart -> .... -> NavigationError --> navigation canceled, end session.
52
+ // =======================
53
+ if (event instanceof NavigationStart) {
54
+ this.onAngularRouterStarted(event);
76
55
  }
77
- if (event instanceof NavigationEnd) {
78
- console.log('navigation ended');
79
- this._navigationSession.value = null;
80
- }
81
- if (event instanceof NavigationError) {
82
- console.log('navigation errored');
83
- this._navigationSession.value = null;
56
+ if (event instanceof NavigationEnd || event instanceof NavigationError) {
57
+ this.onAngularRouterFinished();
84
58
  }
85
59
  }));
60
+ this.navigationSessionActive = chain(this.navigationSessionModel).isNotNil();
61
+ this.navigationSessionActive.subscribe((/**
62
+ * @param {?} active
63
+ * @return {?}
64
+ */
65
+ active => {
66
+ console.log('navigationSessionActive', active);
67
+ }));
68
+ // const txo = new TransactionObserver().onEvent(e => console.log(e.toString()));
69
+ // txo.observe('this.navigationSessionModel', this.navigationSessionModel);
86
70
  }
87
71
  /**
88
72
  * @return {?}
89
73
  */
90
74
  get navigationSession() {
91
- return this._navigationSession.value;
75
+ return this._navigationSessionModel.value;
76
+ }
77
+ /**
78
+ * @return {?}
79
+ */
80
+ get navigationSessionModel() {
81
+ return this._navigationSessionModel.readonly;
82
+ }
83
+ /**
84
+ * @return {?}
85
+ */
86
+ get activeVisits() {
87
+ return this._activeVisits.readonly;
88
+ }
89
+ /**
90
+ * placeRouter.navigate(placeDestinations.somePlace.createVisit(routeId, ...visitParams));
91
+ * @param {?} visit
92
+ * @return {?}
93
+ */
94
+ // @Trace()
95
+ navigate(visit) {
96
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
97
+ this.doNavigation(visit);
98
+ });
92
99
  }
93
100
  /**
94
101
  * @param {?} activatedRoute
@@ -96,32 +103,109 @@ export class PlaceRouter {
96
103
  * @param {?} next
97
104
  * @return {?}
98
105
  */
99
- pushParameterChangesToRoute(activatedRoute, previous, next) {
100
- /** @type {?} */
101
- const relativePath = !!previous.hasRouteId() ? '..' : '.';
102
- this.router.navigate([relativePath].concat(this.createRouteParameters(next), this.getChildPath(activatedRoute.snapshot)), {
103
- relativeTo: activatedRoute
106
+ pushVisitChangesToRoute(activatedRoute, previous, next) {
107
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
108
+ // FIXME: no route id -> route id duplicates route parameters
109
+ if (next.hasRoutingChangedFrom(previous)) {
110
+ return this.doNavigation(next, (/**
111
+ * @param {?} router
112
+ * @return {?}
113
+ */
114
+ router => {
115
+ /** @type {?} */
116
+ const relativePath = !!previous.placeDefinition.hasRouteId() ? '..' : '.';
117
+ /** @type {?} */
118
+ const def = next.placeDefinition;
119
+ /** @type {?} */
120
+ const params = next.hasRouteId() ?
121
+ [def.getFormattedRouteId(next), def.getFormattedRouteParameters(next)] :
122
+ [def.getFormattedRouteParameters(next)];
123
+ /** @type {?} */
124
+ const commands = [relativePath].concat(params, this.getChildPath(activatedRoute.snapshot));
125
+ console.log('### Redirect', commands);
126
+ return router.navigate(commands, {
127
+ relativeTo: activatedRoute
128
+ });
129
+ }));
130
+ }
131
+ else {
132
+ this.placeHistory.add(next);
133
+ }
134
+ });
135
+ }
136
+ /**
137
+ * @param {?} visit
138
+ * @param {?=} customNavigation
139
+ * @return {?}
140
+ */
141
+ doNavigation(visit, customNavigation) {
142
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
143
+ this._navigationSessionModel.value = NavigationSession.createInternal(visit);
144
+ try {
145
+ if (customNavigation) {
146
+ yield customNavigation(this.router);
147
+ }
148
+ else {
149
+ /** @type {?} */
150
+ const def = visit.placeDefinition;
151
+ /** @type {?} */
152
+ const parameterCommands = visit.hasRouteId() ?
153
+ [def.getFormattedRouteId(visit), def.getFormattedRouteParameters(visit)] :
154
+ [def.getFormattedRouteParameters(visit)];
155
+ /** @type {?} */
156
+ const commands = [def.path].concat(parameterCommands);
157
+ console.log('_doNavigation', visit, commands);
158
+ yield this.router.navigate(commands);
159
+ }
160
+ }
161
+ finally {
162
+ if (this.navigationSession && !this.router.getCurrentNavigation()) {
163
+ this.onAngularRouterFinished();
164
+ }
165
+ }
104
166
  });
105
167
  }
106
168
  // @Trace()
107
169
  /**
108
- * @param {?} activatedRoute
109
- * @param {?} sanitised
170
+ * @private
171
+ * @param {?} event
110
172
  * @return {?}
111
173
  */
112
- getRedirectUrlTree(activatedRoute, sanitised) {
113
- /** @type {?} */
114
- const urlSegments = activatedRoute.url;
174
+ onAngularRouterStarted(event) {
175
+ if (!this.navigationSession) { // We been activated by an external route rather than placeRouter.go(visit)
176
+ console.log('navigation started', { firstTime: this.firstRoute });
177
+ /** @type {?} */
178
+ const session = NavigationSession.createExternal(this.firstRoute);
179
+ if (event.navigationTrigger === 'popstate') {
180
+ session.setPopstateReturn(this.router.routerState.snapshot.url);
181
+ }
182
+ this._navigationSessionModel.value = session;
183
+ }
184
+ this.firstRoute = false;
185
+ }
186
+ // @Trace()
187
+ /**
188
+ * @private
189
+ * @return {?}
190
+ */
191
+ onAngularRouterFinished() {
115
192
  /** @type {?} */
116
- const weHaveARouteId = sanitised.hasRouteId() && sanitised.getFormattedRouteId();
193
+ const session = this._navigationSessionModel.value;
194
+ // Update visits before we end the navigation session. This allows the place out let to
195
+ // gate ignore changes that occur while the visit is active
117
196
  /** @type {?} */
118
- const commands = (weHaveARouteId) ?
119
- [urlSegments[0].path, sanitised.getFormattedRouteId(), sanitised.getFormattedParameters()] :
120
- [urlSegments[0].path, sanitised.getFormattedParameters()];
121
- return this.router.createUrlTree(commands);
197
+ const visits = session.getVisits();
198
+ visits.forEach((/**
199
+ * @param {?} v
200
+ * @return {?}
201
+ */
202
+ v => {
203
+ this.placeHistory.add(v);
204
+ }));
205
+ this._activeVisits.value = visits;
206
+ this._navigationSessionModel.value = null;
122
207
  }
123
208
  /**
124
- * @protected
125
209
  * @param {?} activatedRoute
126
210
  * @return {?}
127
211
  */
@@ -132,18 +216,6 @@ export class PlaceRouter {
132
216
  */
133
217
  child => child.url)));
134
218
  }
135
- /**
136
- * @protected
137
- * @param {?} parameters
138
- * @return {?}
139
- */
140
- createRouteParameters(parameters) {
141
- /** @type {?} */
142
- const routeId = parameters.getFormattedRouteId();
143
- return routeId ?
144
- [routeId, parameters.getFormattedParameters()] :
145
- [parameters.getFormattedParameters()];
146
- }
147
219
  }
148
220
  PlaceRouter.decorators = [
149
221
  { type: Injectable, args: [{
@@ -153,19 +225,44 @@ PlaceRouter.decorators = [
153
225
  /** @nocollapse */
154
226
  PlaceRouter.ctorParameters = () => [
155
227
  { type: Router },
156
- { type: Location }
228
+ { type: Location },
229
+ { type: PlaceHistory }
157
230
  ];
158
- /** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.Location)); }, token: PlaceRouter, providedIn: "root" });
231
+ /** @nocollapse */ PlaceRouter.ngInjectableDef = i0.ɵɵdefineInjectable({ factory: function PlaceRouter_Factory() { return new PlaceRouter(i0.ɵɵinject(i1.Router), i0.ɵɵinject(i2.Location), i0.ɵɵinject(i3.PlaceHistory)); }, token: PlaceRouter, providedIn: "root" });
232
+ tslib_1.__decorate([
233
+ Trace(),
234
+ tslib_1.__metadata("design:type", Function),
235
+ tslib_1.__metadata("design:paramtypes", [ActivatedRoute, Visit, Visit]),
236
+ tslib_1.__metadata("design:returntype", Promise)
237
+ ], PlaceRouter.prototype, "pushVisitChangesToRoute", null);
159
238
  if (false) {
160
239
  /**
161
240
  * @type {?}
162
241
  * @private
163
242
  */
164
- PlaceRouter.prototype._navigationSession;
243
+ PlaceRouter.prototype.firstRoute;
244
+ /**
245
+ * @type {?}
246
+ * @private
247
+ */
248
+ PlaceRouter.prototype._navigationSessionModel;
249
+ /**
250
+ * @type {?}
251
+ * @private
252
+ */
253
+ PlaceRouter.prototype._activeVisits;
254
+ /** @type {?} */
255
+ PlaceRouter.prototype.navigationSessionActive;
256
+ /** @type {?} */
257
+ PlaceRouter.prototype.activeVisitIndex;
165
258
  /**
166
259
  * @type {?}
167
260
  * @private
168
261
  */
169
262
  PlaceRouter.prototype.router;
263
+ /** @type {?} */
264
+ PlaceRouter.prototype.angularLocation;
265
+ /** @type {?} */
266
+ PlaceRouter.prototype.placeHistory;
170
267
  }
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUdMLGFBQWEsRUFDYixlQUFlLEVBQ2YsZUFBZSxFQUNmLE1BQU0sRUFFUCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQzs7OztBQUl2QixNQUFNLGlCQUFpQjs7Ozs7SUFHckIsWUFBcUIsVUFBbUIsRUFBVyxVQUFrQjtRQUFoRCxlQUFVLEdBQVYsVUFBVSxDQUFTO1FBQVcsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUY3RCxxQkFBZ0IsR0FBcUIsRUFBRSxDQUFDO1FBRzlDLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDOzs7OztJQUVELGVBQWUsQ0FBQyxjQUE4QjtRQUM1QyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDeEQsQ0FBQzs7Ozs7SUFFRCxvQkFBb0IsQ0FBQyxTQUF5QjtRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRjs7Ozs7O0lBYkMsNkNBQWdEOztJQUVwQyx1Q0FBNEI7O0lBQUUsdUNBQTJCOztBQWlCdkUsTUFBTSxPQUFPLFdBQVc7Ozs7O0lBSXRCLFlBQTZCLE1BQWMsRUFBRSxlQUF5QjtRQUF6QyxX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QUE2Qjs7Y0FDckQsT0FBTyxHQUFHLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRTtRQUNoRCxPQUFPLE9BQU8sQ0FBQyxDQUFDO1lBQ2QsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ2hELENBQUMsVUFBVSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDOzs7WUE1REYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBM0JDLE1BQU07WUFSQyxRQUFROzs7Ozs7OztJQXNDZix5Q0FBaUY7Ozs7O0lBRXJFLDZCQUErQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEFjdGl2YXRlZFJvdXRlLFxuICBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LFxuICBOYXZpZ2F0aW9uRW5kLFxuICBOYXZpZ2F0aW9uRXJyb3IsXG4gIE5hdmlnYXRpb25TdGFydCxcbiAgUm91dGVyLFxuICBVcmxUcmVlXG59IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNdXRhYmxlVmFsdWVNb2RlbCB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBQbGFjZUNvbXBvbmVudCB9IGZyb20gJy4vcGxhY2UtY29tcG9uZW50JztcbmltcG9ydCB7IFBhcmFtZXRlclNuYXBzaG90IH0gZnJvbSAnLi9yb3V0ZS9wYXJhbWV0ZXItc25hcHNob3QnO1xuXG5jbGFzcyBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gIHByaXZhdGUgX2FscmVhZHlBY2NlcHRlZDogUGxhY2VDb21wb25lbnRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGlzUG9wU3RhdGU6IGJvb2xlYW4sIHJlYWRvbmx5IGluaXRpYWxVcmw6IHN0cmluZykge1xuICAgIGNvbnNvbGUubG9nKCdOYXZpZ2F0aW9uU2Vzc2lvbicsIHsgaXNQb3BTdGF0ZSwgaW5pdGlhbFVybCB9KTtcbiAgfVxuXG4gIGFscmVhZHlBY2NlcHRlZChwbGFjZUNvbXBvbmVudDogUGxhY2VDb21wb25lbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYWxyZWFkeUFjY2VwdGVkLmluY2x1ZGVzKHBsYWNlQ29tcG9uZW50KTtcbiAgfVxuXG4gIHJlbWVtYmVyQWNjZXB0YW5jZU9mKGNvbXBvbmVudDogUGxhY2VDb21wb25lbnQpIHtcbiAgICB0aGlzLl9hbHJlYWR5QWNjZXB0ZWQucHVzaChjb21wb25lbnQpO1xuICB9XG59XG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgUGxhY2VSb3V0ZXIge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX25hdmlnYXRpb25TZXNzaW9uID0gbmV3IE11dGFibGVWYWx1ZU1vZGVsPE5hdmlnYXRpb25TZXNzaW9uPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcm91dGVyOiBSb3V0ZXIsIGFuZ3VsYXJMb2NhdGlvbjogTG9jYXRpb24pIHtcbiAgICBhbmd1bGFyTG9jYXRpb24ub25VcmxDaGFuZ2UodXJsID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGAjIyMgJHt1cmx9YCk7XG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgJHtldmVudC5jb25zdHJ1Y3Rvci5uYW1lfWAsIGxvY2F0aW9uLnBhdGhuYW1lLCBhbmd1bGFyTG9jYXRpb24uZ2V0U3RhdGUoKSk7XG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uQ2FuY2VsID09PSByZWRpcmVjdCAoc28gZG9uJ3QgYXNrIGFnYWluKVxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVuZCA9PT0gbmF2aWdhdGVkIChzbyBhc2sgbmV4dCB0aW1lKVxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVycm9yID09PSBjYW5jZWxlZCAoZ3VhcmQgY2FuY2VsbGVkIHNvIGFzayBuZXh0IHRpbWUpXG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uU3RhcnQgJiYgIXRoaXMubmF2aWdhdGlvblNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb24udmFsdWUgPSBuZXcgTmF2aWdhdGlvblNlc3Npb24oZXZlbnQubmF2aWdhdGlvblRyaWdnZXIgPT09ICdwb3BzdGF0ZScsIHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnNuYXBzaG90LnVybCk7XG4gICAgICB9XG4gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0aW9uIGVuZGVkJyk7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uLnZhbHVlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICBjb25zb2xlLmxvZygnbmF2aWdhdGlvbiBlcnJvcmVkJyk7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uLnZhbHVlID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU2Vzc2lvbigpOiBOYXZpZ2F0aW9uU2Vzc2lvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uLnZhbHVlO1xuICB9XG5cbiAgcHVzaFBhcmFtZXRlckNoYW5nZXNUb1JvdXRlKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJldmlvdXM6IFBhcmFtZXRlclNuYXBzaG90LCBuZXh0OiBQYXJhbWV0ZXJTbmFwc2hvdCkge1xuICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9ICEhcHJldmlvdXMuaGFzUm91dGVJZCgpID8gJy4uJyA6ICcuJztcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcmVsYXRpdmVQYXRoXS5jb25jYXQodGhpcy5jcmVhdGVSb3V0ZVBhcmFtZXRlcnMobmV4dCksIHRoaXMuZ2V0Q2hpbGRQYXRoKGFjdGl2YXRlZFJvdXRlLnNuYXBzaG90KSksIHtcbiAgICAgIHJlbGF0aXZlVG86IGFjdGl2YXRlZFJvdXRlXG4gICAgfSk7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBnZXRSZWRpcmVjdFVybFRyZWUoYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIHNhbml0aXNlZDogUGFyYW1ldGVyU25hcHNob3QpOiBVcmxUcmVlIHtcbiAgICBjb25zdCB1cmxTZWdtZW50cyA9IGFjdGl2YXRlZFJvdXRlLnVybDtcbiAgICBjb25zdCB3ZUhhdmVBUm91dGVJZCA9IHNhbml0aXNlZC5oYXNSb3V0ZUlkKCkgJiYgc2FuaXRpc2VkLmdldEZvcm1hdHRlZFJvdXRlSWQoKTtcbiAgICBjb25zdCBjb21tYW5kcyA9ICh3ZUhhdmVBUm91dGVJZCkgP1xuICAgICAgW3VybFNlZ21lbnRzWzBdLnBhdGgsIHNhbml0aXNlZC5nZXRGb3JtYXR0ZWRSb3V0ZUlkKCksIHNhbml0aXNlZC5nZXRGb3JtYXR0ZWRQYXJhbWV0ZXJzKCldIDpcbiAgICAgIFt1cmxTZWdtZW50c1swXS5wYXRoLCBzYW5pdGlzZWQuZ2V0Rm9ybWF0dGVkUGFyYW1ldGVycygpXTtcbiAgICByZXR1cm4gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShjb21tYW5kcyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Q2hpbGRQYXRoKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYW55W10ge1xuICAgIHJldHVybiBfLmZsYXR0ZW4oYWN0aXZhdGVkUm91dGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLnVybCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVJvdXRlUGFyYW1ldGVycyhwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJTbmFwc2hvdCk6IGFueVtdIHtcbiAgICBjb25zdCByb3V0ZUlkID0gcGFyYW1ldGVycy5nZXRGb3JtYXR0ZWRSb3V0ZUlkKCk7XG4gICAgcmV0dXJuIHJvdXRlSWQgP1xuICAgICAgW3JvdXRlSWQsIHBhcmFtZXRlcnMuZ2V0Rm9ybWF0dGVkUGFyYW1ldGVycygpXSA6XG4gICAgICBbcGFyYW1ldGVycy5nZXRGb3JtYXR0ZWRQYXJhbWV0ZXJzKCldO1xuICB9XG5cbn1cbiJdfQ==
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2Utcm91dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3BsYWNlLXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxjQUFjLEVBRWQsYUFBYSxFQUNiLGVBQWUsRUFDZixlQUFlLEVBQ2YsTUFBTSxFQUNQLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUVMLEdBQUcsRUFDSCxnQkFBZ0IsRUFHaEIsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixLQUFLLEVBRU4sTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxTQUFTLENBQUM7Ozs7O0FBTWhDLE1BQU0sT0FBTyxXQUFZLFNBQVEsZ0JBQWdCOzs7Ozs7SUFVL0MsWUFBNkIsTUFBYyxFQUFXLGVBQXlCLEVBQVcsWUFBMEI7UUFDbEgsS0FBSyxFQUFFLENBQUM7UUFEbUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFXLG9CQUFlLEdBQWYsZUFBZSxDQUFVO1FBQVcsaUJBQVksR0FBWixZQUFZLENBQWM7UUFSNUcsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVULDRCQUF1QixHQUFHLElBQUksaUJBQWlCLEVBQXFCLENBQUM7UUFDckUsa0JBQWEsR0FBRyxJQUFJLGdCQUFnQixFQUFTLENBQUM7Y0FPdkQsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxJ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QUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHOzs7O1FBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDOzs7WUExSUYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7O1lBckJDLE1BQU07WUFSQyxRQUFRO1lBdUJSLFlBQVk7OztBQXdFbkI7SUFEQyxLQUFLLEVBQUU7OzZDQUNzQyxjQUFjLEVBQVksS0FBSyxFQUFRLEtBQUs7OzBEQWtCekY7Ozs7OztJQWpGRCxpQ0FBMEI7Ozs7O0lBRTFCLDhDQUFzRjs7Ozs7SUFDdEYsb0NBQStEOztJQUUvRCw4Q0FBeUQ7O0lBQ3pELHVDQUFzRTs7Ozs7SUFFMUQsNkJBQStCOztJQUFFLHNDQUFrQzs7SUFBRSxtQ0FBbUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBMb2NhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBY3RpdmF0ZWRSb3V0ZSxcbiAgQWN0aXZhdGVkUm91dGVTbmFwc2hvdCxcbiAgTmF2aWdhdGlvbkVuZCxcbiAgTmF2aWdhdGlvbkVycm9yLFxuICBOYXZpZ2F0aW9uU3RhcnQsXG4gIFJvdXRlclxufSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtcbiAgQm9vbGVhblZhbHVlTW9kZWxDaGFpbixcbiAgRHNsLFxuICBHYXJiYWdlQ29sbGVjdG9yLFxuICBIYXNPbmVJbmRleENoYWluLFxuICBMaXN0TW9kZWwsXG4gIE11dGFibGVMaXN0TW9kZWwsXG4gIE11dGFibGVWYWx1ZU1vZGVsLFxuICBUcmFjZSxcbiAgVmFsdWVNb2RlbFxufSBmcm9tICdAY29vbG9uL3BlY3Rpbic7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgTmF2aWdhdGlvblNlc3Npb24gfSBmcm9tICcuL25hdmlnYXRpb24tc2Vzc2lvbic7XG5pbXBvcnQgeyBQbGFjZUhpc3RvcnkgfSBmcm9tICcuL3BsYWNlLWhpc3RvcnknO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZVJvdXRlciBleHRlbmRzIEdhcmJhZ2VDb2xsZWN0b3Ige1xuXG4gIHByaXZhdGUgZmlyc3RSb3V0ZSA9IHRydWU7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbmF2aWdhdGlvblNlc3Npb25Nb2RlbCA9IG5ldyBNdXRhYmxlVmFsdWVNb2RlbDxOYXZpZ2F0aW9uU2Vzc2lvbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZlVmlzaXRzID0gbmV3IE11dGFibGVMaXN0TW9kZWw8VmlzaXQ+KCk7XG5cbiAgcmVhZG9ubHkgbmF2aWdhdGlvblNlc3Npb25BY3RpdmU6IEJvb2xlYW5WYWx1ZU1vZGVsQ2hhaW47XG4gIHJlYWRvbmx5IGFjdGl2ZVZpc2l0SW5kZXg6IEhhc09uZUluZGV4Q2hhaW48J3BsYWNlRGVmaW5pdGlvbicsIFZpc2l0PjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLCByZWFkb25seSBhbmd1bGFyTG9jYXRpb246IExvY2F0aW9uLCByZWFkb25seSBwbGFjZUhpc3Rvcnk6IFBsYWNlSGlzdG9yeSkge1xuICAgIHN1cGVyKCk7XG4gICAgY29uc3QgeyBjaGFpbiwgdmFsdWVPZiwgYmVmb3JlLCB3aGVuLCBhZnRlciwgb2JzZXJ2ZSwgc3dpdGNoT24gfSA9IERzbC5kaXNwb3NlV2l0aCh0aGlzKTtcbiAgICB0aGlzLmFjdGl2ZVZpc2l0SW5kZXggPSBjaGFpbih0aGlzLl9hY3RpdmVWaXNpdHMpLmluZGV4QnkoJ3BsYWNlRGVmaW5pdGlvbicpO1xuXG4gICAgYW5ndWxhckxvY2F0aW9uLm9uVXJsQ2hhbmdlKHVybCA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgbG9jYXRpb24ub25VcmxDaGFuZ2UgLT4gJHt1cmx9YCk7XG4gICAgfSk7XG5cbiAgICAvLyBUT0RPOiBtYWtlIHNldHVwIHRoZSBjYWxsYmFja3MgaW4gZHVyaW5nIG1vZHVsZSBpbml0aWF0aW9uIHRvIG1ha2UgdGhpcyB0ZXN0YWJsZS5cbiAgICB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIC8vIFJvdXRpbmcgZXZlbnQgc2VxdWVuY2VcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIE5hdmlnYXRpb25TdGFydCAtPiAuLi4uIC0+IE5hdmlnYXRpb25DYW5jZWwgLS0+IHJlZGlyZWN0LCBnbyBhcm91bmQgYWdhaW4gaW4gdGhlIHNhbWUgc2Vzc2lvblxuICAgICAgLy8gTmF2aWdhdGlvblN0YXJ0IC0+IC4uLi4gLT4gTmF2aWdhdGlvbkVuZCAtLT4gbmF2aWdhdGlvbiBjb21wbGV0ZSwgZW5kIHNlc3Npb24uXG4gICAgICAvLyBOYXZpZ2F0aW9uU3RhcnQgLT4gLi4uLiAtPiBOYXZpZ2F0aW9uRXJyb3IgLS0+IG5hdmlnYXRpb24gY2FuY2VsZWQsIGVuZCBzZXNzaW9uLlxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICB0aGlzLm9uQW5ndWxhclJvdXRlclN0YXJ0ZWQoZXZlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCB8fCBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FcnJvcikge1xuICAgICAgICB0aGlzLm9uQW5ndWxhclJvdXRlckZpbmlzaGVkKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm5hdmlnYXRpb25TZXNzaW9uQWN0aXZlID0gY2hhaW4odGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKS5pc05vdE5pbCgpO1xuICAgIHRoaXMubmF2aWdhdGlvblNlc3Npb25BY3RpdmUuc3Vic2NyaWJlKGFjdGl2ZSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygnbmF2aWdhdGlvblNlc3Npb25BY3RpdmUnLCBhY3RpdmUpO1xuICAgIH0pO1xuICAgIC8vIGNvbnN0IHR4byA9IG5ldyBUcmFuc2FjdGlvbk9ic2VydmVyKCkub25FdmVudChlID0+IGNvbnNvbGUubG9nKGUudG9TdHJpbmcoKSkpO1xuICAgIC8vIHR4by5vYnNlcnZlKCd0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwnLCB0aGlzLm5hdmlnYXRpb25TZXNzaW9uTW9kZWwpO1xuICB9XG5cbiAgZ2V0IG5hdmlnYXRpb25TZXNzaW9uKCk6IE5hdmlnYXRpb25TZXNzaW9uIHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgfVxuXG4gIGdldCBuYXZpZ2F0aW9uU2Vzc2lvbk1vZGVsKCk6IFZhbHVlTW9kZWw8TmF2aWdhdGlvblNlc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC5yZWFkb25seTtcbiAgfVxuXG4gIGdldCBhY3RpdmVWaXNpdHMoKTogTGlzdE1vZGVsPFZpc2l0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZVZpc2l0cy5yZWFkb25seTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgcGxhY2VSb3V0ZXIubmF2aWdhdGUocGxhY2VEZXN0aW5hdGlvbnMuc29tZVBsYWNlLmNyZWF0ZVZpc2l0KHJvdXRlSWQsIC4uLnZpc2l0UGFyYW1zKSk7XG4gICAqIEBwYXJhbSB2aXNpdFxuICAgKi9cbiAgLy8gQFRyYWNlKClcbiAgYXN5bmMgbmF2aWdhdGUodmlzaXQ6IFZpc2l0KSB7XG4gICAgdGhpcy5kb05hdmlnYXRpb24odmlzaXQpO1xuICB9XG5cbiAgQFRyYWNlKClcbiAgYXN5bmMgcHVzaFZpc2l0Q2hhbmdlc1RvUm91dGUoYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcmV2aW91czogVmlzaXQsIG5leHQ6IFZpc2l0KSB7XG4gICAgLy8gRklYTUU6IG5vIHJvdXRlIGlkIC0+IHJvdXRlIGlkIGR1cGxpY2F0ZXMgcm91dGUgcGFyYW1ldGVyc1xuICAgIGlmIChuZXh0Lmhhc1JvdXRpbmdDaGFuZ2VkRnJvbShwcmV2aW91cykpIHtcbiAgICAgIHJldHVybiB0aGlzLmRvTmF2aWdhdGlvbihuZXh0LCByb3V0ZXIgPT4ge1xuICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSAhIXByZXZpb3VzLnBsYWNlRGVmaW5pdGlvbi5oYXNSb3V0ZUlkKCkgPyAnLi4nIDogJy4nO1xuICAgICAgICBjb25zdCBkZWYgPSBuZXh0LnBsYWNlRGVmaW5pdGlvbjtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV4dC5oYXNSb3V0ZUlkKCkgP1xuICAgICAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVJZChuZXh0KSwgZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyhuZXh0KV0gOlxuICAgICAgICAgIFtkZWYuZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKG5leHQpXTtcbiAgICAgICAgY29uc3QgY29tbWFuZHMgPSBbcmVsYXRpdmVQYXRoXS5jb25jYXQocGFyYW1zLCB0aGlzLmdldENoaWxkUGF0aChhY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdCkpO1xuICAgICAgICBjb25zb2xlLmxvZygnIyMjIFJlZGlyZWN0JywgY29tbWFuZHMpO1xuICAgICAgICByZXR1cm4gcm91dGVyLm5hdmlnYXRlKGNvbW1hbmRzLCB7XG4gICAgICAgICAgcmVsYXRpdmVUbzogYWN0aXZhdGVkUm91dGVcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGFjZUhpc3RvcnkuYWRkKG5leHQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvTmF2aWdhdGlvbih2aXNpdDogVmlzaXQsIGN1c3RvbU5hdmlnYXRpb24/OiAocm91dGVyOiBSb3V0ZXIpID0+IGFueSkge1xuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBOYXZpZ2F0aW9uU2Vzc2lvbi5jcmVhdGVJbnRlcm5hbCh2aXNpdCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjdXN0b21OYXZpZ2F0aW9uKSB7XG4gICAgICAgIGF3YWl0IGN1c3RvbU5hdmlnYXRpb24odGhpcy5yb3V0ZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGVmID0gdmlzaXQucGxhY2VEZWZpbml0aW9uO1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJDb21tYW5kcyA9IHZpc2l0Lmhhc1JvdXRlSWQoKSA/XG4gICAgICAgICAgW2RlZi5nZXRGb3JtYXR0ZWRSb3V0ZUlkKHZpc2l0KSwgZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldIDpcbiAgICAgICAgICBbZGVmLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldO1xuICAgICAgICBjb25zdCBjb21tYW5kcyA9IFtkZWYucGF0aF0uY29uY2F0KHBhcmFtZXRlckNvbW1hbmRzKTtcbiAgICAgICAgY29uc29sZS5sb2coJ19kb05hdmlnYXRpb24nLCB2aXNpdCwgY29tbWFuZHMpO1xuICAgICAgICBhd2FpdCB0aGlzLnJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcyk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aGlzLm5hdmlnYXRpb25TZXNzaW9uICYmICF0aGlzLnJvdXRlci5nZXRDdXJyZW50TmF2aWdhdGlvbigpKSB7XG4gICAgICAgIHRoaXMub25Bbmd1bGFyUm91dGVyRmluaXNoZWQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBwcml2YXRlIG9uQW5ndWxhclJvdXRlclN0YXJ0ZWQoZXZlbnQ6IE5hdmlnYXRpb25TdGFydCkge1xuICAgIGlmICghdGhpcy5uYXZpZ2F0aW9uU2Vzc2lvbikgeyAvLyBXZSBiZWVuIGFjdGl2YXRlZCBieSBhbiBleHRlcm5hbCByb3V0ZSByYXRoZXIgdGhhbiBwbGFjZVJvdXRlci5nbyh2aXNpdClcbiAgICAgIGNvbnNvbGUubG9nKCduYXZpZ2F0aW9uIHN0YXJ0ZWQnLCB7IGZpcnN0VGltZTogdGhpcy5maXJzdFJvdXRlIH0pO1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IE5hdmlnYXRpb25TZXNzaW9uLmNyZWF0ZUV4dGVybmFsKHRoaXMuZmlyc3RSb3V0ZSk7XG4gICAgICBpZiAoZXZlbnQubmF2aWdhdGlvblRyaWdnZXIgPT09ICdwb3BzdGF0ZScpIHtcbiAgICAgICAgc2Vzc2lvbi5zZXRQb3BzdGF0ZVJldHVybih0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpO1xuICAgICAgfVxuICAgICAgdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZSA9IHNlc3Npb247XG4gICAgfVxuICAgIHRoaXMuZmlyc3RSb3V0ZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgcHJpdmF0ZSBvbkFuZ3VsYXJSb3V0ZXJGaW5pc2hlZCgpIHtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5fbmF2aWdhdGlvblNlc3Npb25Nb2RlbC52YWx1ZTtcbiAgICAvLyBVcGRhdGUgdmlzaXRzIGJlZm9yZSB3ZSBlbmQgdGhlIG5hdmlnYXRpb24gc2Vzc2lvbi4gIFRoaXMgYWxsb3dzIHRoZSBwbGFjZSBvdXQgbGV0IHRvXG4gICAgLy8gZ2F0ZSBpZ25vcmUgY2hhbmdlcyB0aGF0IG9jY3VyIHdoaWxlIHRoZSB2aXNpdCBpcyBhY3RpdmVcbiAgICBjb25zdCB2aXNpdHMgPSBzZXNzaW9uLmdldFZpc2l0cygpO1xuICAgIHZpc2l0cy5mb3JFYWNoKHYgPT4ge1xuICAgICAgdGhpcy5wbGFjZUhpc3RvcnkuYWRkKHYpO1xuICAgIH0pO1xuICAgIHRoaXMuX2FjdGl2ZVZpc2l0cy52YWx1ZSA9IHZpc2l0cztcblxuICAgIHRoaXMuX25hdmlnYXRpb25TZXNzaW9uTW9kZWwudmFsdWUgPSBudWxsO1xuICB9XG5cbiAgZ2V0Q2hpbGRQYXRoKGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogYW55W10ge1xuICAgIHJldHVybiBfLmZsYXR0ZW4oYWN0aXZhdGVkUm91dGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLnVybCkpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
4
+ */
5
+ import _ from 'lodash';
6
+ // WARNING: interface has both a type and a value, skipping emit
7
+ export var Formatter;
8
+ (function (Formatter) {
9
+ class StringType {
10
+ /**
11
+ * @param {?} value
12
+ * @return {?}
13
+ */
14
+ format(value) {
15
+ return value;
16
+ }
17
+ /**
18
+ * @param {?} value
19
+ * @return {?}
20
+ */
21
+ parse(value) {
22
+ return value;
23
+ }
24
+ }
25
+ class NumberType {
26
+ /**
27
+ * @param {?} value
28
+ * @return {?}
29
+ */
30
+ format(value) {
31
+ return _.isNumber(value) && !_.isNaN(value) ? `${value}` : null;
32
+ }
33
+ /**
34
+ * @param {?} value
35
+ * @return {?}
36
+ */
37
+ parse(value) {
38
+ /** @type {?} */
39
+ const parsed = Number.parseFloat(value);
40
+ return _.isNaN(parsed) ? null : parsed;
41
+ }
42
+ }
43
+ class BooleanType {
44
+ /**
45
+ * @param {?} value
46
+ * @return {?}
47
+ */
48
+ format(value) {
49
+ return value ? 'true' : 'false';
50
+ }
51
+ /**
52
+ * @param {?} value
53
+ * @return {?}
54
+ */
55
+ parse(value) {
56
+ return value === 'true';
57
+ }
58
+ }
59
+ Formatter.STRING = new StringType();
60
+ Formatter.NUMBER = new NumberType();
61
+ Formatter.BOOLEAN = new BooleanType();
62
+ })(Formatter || (Formatter = {}));
63
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGNvb2xvbi9hbmd1bGFyLXVpLXBvd2VydXBzLyIsInNvdXJjZXMiOlsibGliL3BsYWNlL3JvdXRlL2Zvcm1hdHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDOztBQVF2QixNQUFNLEtBQVcsU0FBUyxDQW9DekI7QUFwQ0QsV0FBaUIsU0FBUztJQUV4QixNQUFNLFVBQVU7Ozs7O1FBQ2QsTUFBTSxDQUFDLEtBQWE7WUFDbEIsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDOzs7OztRQUVELEtBQUssQ0FBQyxLQUFhO1lBQ2pCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztLQUNGO0lBRUQsTUFBTSxVQUFVOzs7OztRQUNkLE1BQU0sQ0FBQyxLQUFhO1lBQ2xCLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNsRSxDQUFDOzs7OztRQUVELEtBQUssQ0FBQyxLQUFhOztrQkFDWCxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDdkMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztRQUN6QyxDQUFDO0tBQ0Y7SUFFRCxNQUFNLFdBQVc7Ozs7O1FBQ2YsTUFBTSxDQUFDLEtBQWM7WUFDbkIsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQ2xDLENBQUM7Ozs7O1FBRUQsS0FBSyxDQUFDLEtBQWE7WUFDakIsT0FBTyxLQUFLLEtBQUssTUFBTSxDQUFDO1FBQzFCLENBQUM7S0FDRjtJQUVZLGdCQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUU7SUFDekIsZ0JBQU0sR0FBRyxJQUFJLFVBQVUsRUFBRTtJQUN6QixpQkFBTyxHQUFHLElBQUksV0FBVyxFQUFFO0FBQzFDLENBQUMsRUFwQ2dCLFNBQVMsS0FBVCxTQUFTLFFBb0N6QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVyPFQ+IHtcbiAgZm9ybWF0KHZhbHVlOiBUKTogc3RyaW5nO1xuXG4gIHBhcnNlKHZhbHVlOiBzdHJpbmcpOiBUO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEZvcm1hdHRlciB7XG5cbiAgY2xhc3MgU3RyaW5nVHlwZSBpbXBsZW1lbnRzIEZvcm1hdHRlcjxzdHJpbmc+IHtcbiAgICBmb3JtYXQodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgcGFyc2UodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgY2xhc3MgTnVtYmVyVHlwZSBpbXBsZW1lbnRzIEZvcm1hdHRlcjxudW1iZXI+IHtcbiAgICBmb3JtYXQodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgICByZXR1cm4gXy5pc051bWJlcih2YWx1ZSkgJiYgIV8uaXNOYU4odmFsdWUpID8gYCR7dmFsdWV9YCA6IG51bGw7XG4gICAgfVxuXG4gICAgcGFyc2UodmFsdWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICByZXR1cm4gXy5pc05hTihwYXJzZWQpID8gbnVsbCA6IHBhcnNlZDtcbiAgICB9XG4gIH1cblxuICBjbGFzcyBCb29sZWFuVHlwZSBpbXBsZW1lbnRzIEZvcm1hdHRlcjxib29sZWFuPiB7XG4gICAgZm9ybWF0KHZhbHVlOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gICAgfVxuXG4gICAgcGFyc2UodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gICAgfVxuICB9XG5cbiAgZXhwb3J0IGNvbnN0IFNUUklORyA9IG5ldyBTdHJpbmdUeXBlKCk7XG4gIGV4cG9ydCBjb25zdCBOVU1CRVIgPSBuZXcgTnVtYmVyVHlwZSgpO1xuICBleHBvcnQgY29uc3QgQk9PTEVBTiA9IG5ldyBCb29sZWFuVHlwZSgpO1xufVxuIl19