@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.
- package/bundles/coolon-angular-ui-powerups.umd.js +2207 -1737
- package/bundles/coolon-angular-ui-powerups.umd.js.map +1 -1
- package/bundles/coolon-angular-ui-powerups.umd.min.js +1 -1
- package/bundles/coolon-angular-ui-powerups.umd.min.js.map +1 -1
- package/coolon-angular-ui-powerups.d.ts +24 -22
- package/coolon-angular-ui-powerups.metadata.json +1 -1
- package/esm2015/coolon-angular-ui-powerups.js +24 -22
- package/esm2015/index.js +2 -2
- package/esm2015/lib/angular-ui-powerups.module.js +6 -3
- package/esm2015/lib/components/index.js +2 -1
- package/esm2015/lib/components/noop/noop.component.js +19 -0
- package/esm2015/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
- package/esm2015/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
- package/esm2015/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
- package/esm2015/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +19 -0
- package/esm2015/lib/interaction/guards/interaction-guard.service.js +85 -0
- package/esm2015/lib/interaction/index.js +3 -2
- package/esm2015/lib/interaction/interaction.module.js +8 -3
- package/esm2015/lib/interaction/services/dialog-interaction.service.js +30 -5
- package/esm2015/lib/place/components/abstract-place-navigation.component.js +5 -5
- package/esm2015/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
- package/esm2015/lib/place/components/place-outlet/place-outlet.component.js +60 -66
- package/esm2015/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
- package/esm2015/lib/place/index.js +9 -8
- package/esm2015/lib/place/navigation-session.js +147 -0
- package/esm2015/lib/place/place-component.js +18 -14
- package/esm2015/lib/place/place-definition.js +197 -5
- package/esm2015/lib/place/place-history.js +3 -2
- package/esm2015/lib/place/place-router.js +186 -89
- package/esm2015/lib/place/route/formatter.js +63 -0
- package/esm2015/lib/place/route/guards/leave-place.guard.js +193 -0
- package/esm2015/lib/place/route/guards/place-route.guard.js +243 -0
- package/esm2015/lib/place/route/parameter-decorators.js +35 -18
- package/esm2015/lib/place/route/parameter-definition.class.js +123 -67
- package/esm2015/lib/place/route/parameter-sanitiser.js +4 -3
- package/esm2015/lib/place/route/parameter-snapshot.js +11 -388
- package/esm2015/lib/place/route/visit-sanitiser.js +88 -0
- package/esm2015/lib/place/visit.js +107 -8
- package/esm2015/public_api.js +4 -4
- package/esm5/coolon-angular-ui-powerups.js +24 -22
- package/esm5/index.js +2 -2
- package/esm5/lib/angular-ui-powerups.module.js +6 -3
- package/esm5/lib/components/index.js +2 -1
- package/esm5/lib/components/noop/noop.component.js +21 -0
- package/esm5/lib/interaction/components/alert-dialog/alert-dialog.component.js +2 -2
- package/esm5/lib/interaction/components/confirm-then-dialog/confirm-then-dialog.component.js +2 -2
- package/esm5/lib/interaction/components/confirmation-dialog/confirmation-dialog.component.js +2 -2
- package/esm5/lib/interaction/components/interaction-outlet/interaction-outlet.component.js +21 -0
- package/esm5/lib/interaction/guards/interaction-guard.service.js +94 -0
- package/esm5/lib/interaction/index.js +3 -2
- package/esm5/lib/interaction/interaction.module.js +8 -3
- package/esm5/lib/interaction/services/dialog-interaction.service.js +28 -5
- package/esm5/lib/place/components/abstract-place-navigation.component.js +5 -5
- package/esm5/lib/place/components/list-place-nav/list-place-nav.component.js +2 -2
- package/esm5/lib/place/components/place-outlet/place-outlet.component.js +70 -82
- package/esm5/lib/place/components/tabbed-place-navigation/tabbed-place-navigation.component.js +2 -2
- package/esm5/lib/place/index.js +9 -8
- package/esm5/lib/place/navigation-session.js +193 -0
- package/esm5/lib/place/place-component.js +19 -15
- package/esm5/lib/place/place-definition.js +253 -5
- package/esm5/lib/place/place-history.js +7 -3
- package/esm5/lib/place/place-router.js +242 -107
- package/esm5/lib/place/route/formatter.js +96 -0
- package/esm5/lib/place/route/guards/leave-place.guard.js +152 -0
- package/esm5/lib/place/route/guards/place-route.guard.js +273 -0
- package/esm5/lib/place/route/parameter-decorators.js +35 -18
- package/esm5/lib/place/route/parameter-definition.class.js +179 -76
- package/esm5/lib/place/route/parameter-sanitiser.js +4 -3
- package/esm5/lib/place/route/parameter-snapshot.js +11 -480
- package/esm5/lib/place/route/visit-sanitiser.js +99 -0
- package/esm5/lib/place/visit.js +160 -8
- package/esm5/public_api.js +4 -4
- package/fesm2015/coolon-angular-ui-powerups.js +1493 -1124
- package/fesm2015/coolon-angular-ui-powerups.js.map +1 -1
- package/fesm5/coolon-angular-ui-powerups.js +2166 -1700
- package/fesm5/coolon-angular-ui-powerups.js.map +1 -1
- package/lib/components/index.d.ts +1 -0
- package/lib/components/noop/noop.component.d.ts +3 -0
- package/lib/interaction/components/interaction-outlet/interaction-outlet.component.d.ts +3 -0
- package/lib/interaction/guards/interaction-guard.service.d.ts +13 -0
- package/lib/interaction/index.d.ts +2 -1
- package/lib/interaction/services/dialog-interaction.service.d.ts +5 -1
- package/lib/place/components/place-outlet/place-outlet.component.d.ts +12 -12
- package/lib/place/index.d.ts +5 -4
- package/lib/place/navigation-session.d.ts +26 -0
- package/lib/place/place-component.d.ts +3 -3
- package/lib/place/place-definition.d.ts +30 -3
- package/lib/place/place-history.d.ts +3 -3
- package/lib/place/place-router.d.ts +26 -19
- package/lib/place/route/{parameter-type.d.ts → formatter.d.ts} +5 -5
- package/lib/place/{guards → route/guards}/leave-place.guard.d.ts +4 -3
- package/lib/place/route/guards/place-route.guard.d.ts +27 -0
- package/lib/place/route/parameter-decorators.d.ts +14 -6
- package/lib/place/route/parameter-definition.class.d.ts +21 -17
- package/lib/place/route/parameter-sanitiser.d.ts +3 -2
- package/lib/place/route/parameter-snapshot.d.ts +4 -26
- package/lib/place/route/visit-sanitiser.d.ts +12 -0
- package/lib/place/visit.d.ts +24 -3
- package/package.json +1 -1
- package/schematics/place-routes/place-class-scanner.d.ts +2 -2
- package/schematics/place-routes/place-class-scanner.js +7 -7
- package/schematics/place-routes/place-class-scanner.js.map +1 -1
- package/schematics/place-routes/place-def.d.ts +3 -2
- package/schematics/place-routes/place-def.js +21 -12
- package/schematics/place-routes/place-def.js.map +1 -1
- package/schematics/place-routes/templates/place-destinations.ts.template +5 -3
- package/schematics/place-routes/templates/place-routes.ts.template +10 -1
- package/schematics/place-routes/templates/place-visits.ts.template +21 -0
- package/esm2015/lib/interaction/guards/close-interaction.guard.js +0 -62
- package/esm2015/lib/place/guards/leave-place.guard.js +0 -159
- package/esm2015/lib/place/guards/place-route.guard.js +0 -74
- package/esm2015/lib/place/route/parameter-type.js +0 -61
- package/esm2015/lib/place/route/route-parameter-value.js +0 -230
- package/esm5/lib/interaction/guards/close-interaction.guard.js +0 -66
- package/esm5/lib/place/guards/leave-place.guard.js +0 -117
- package/esm5/lib/place/guards/place-route.guard.js +0 -78
- package/esm5/lib/place/route/parameter-type.js +0 -94
- package/esm5/lib/place/route/route-parameter-value.js +0 -316
- package/lib/interaction/guards/close-interaction.guard.d.ts +0 -12
- package/lib/place/guards/place-route.guard.d.ts +0 -10
- package/lib/place/route/route-parameter-value.d.ts +0 -42
|
@@ -2,7 +2,12 @@
|
|
|
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";
|
|
6
|
+
import { assert } from '@coolon/pectin';
|
|
7
|
+
import { Opts } from '@coolon/typescript-utilities';
|
|
8
|
+
import { Memoize } from '@typescript-plus/fast-memoize-decorator/dist/src';
|
|
5
9
|
import _ from 'lodash';
|
|
10
|
+
import { ParameterDefinition } from './route/parameter-definition.class';
|
|
6
11
|
export class PlaceDefinition {
|
|
7
12
|
/**
|
|
8
13
|
* @param {?} component
|
|
@@ -25,8 +30,49 @@ export class PlaceDefinition {
|
|
|
25
30
|
/**
|
|
26
31
|
* @return {?}
|
|
27
32
|
*/
|
|
28
|
-
|
|
29
|
-
return this.
|
|
33
|
+
hasRouteId() {
|
|
34
|
+
return !!this.getRouteIdParameterDef();
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @return {?}
|
|
38
|
+
*/
|
|
39
|
+
getRouteIdParameterDef() {
|
|
40
|
+
return this.routeParameters.find((/**
|
|
41
|
+
* @param {?} p
|
|
42
|
+
* @return {?}
|
|
43
|
+
*/
|
|
44
|
+
p => p.isRouteId));
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* @param {?=} includeRouteId
|
|
48
|
+
* @return {?}
|
|
49
|
+
*/
|
|
50
|
+
getRouteParameterDefs(includeRouteId = false) {
|
|
51
|
+
return this.getVisitParameterDefs({ includeRouteId, includeRouteParameters: true });
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* @param {?=} include
|
|
55
|
+
* @return {?}
|
|
56
|
+
*/
|
|
57
|
+
getVisitParameterDefs(include) {
|
|
58
|
+
/** @type {?} */
|
|
59
|
+
const opts = Opts.get(include);
|
|
60
|
+
// includes
|
|
61
|
+
/** @type {?} */
|
|
62
|
+
const includeRouteId = !include || opts.getOptional('includeRouteId', false);
|
|
63
|
+
/** @type {?} */
|
|
64
|
+
const includeRouteParameters = !include || opts.getOptional('includeRouteParameters', false);
|
|
65
|
+
/** @type {?} */
|
|
66
|
+
const includeNonRouteParameters = !include || opts.getOptional('includeNonRouteParameters', false);
|
|
67
|
+
return this.routeParameters.filter((/**
|
|
68
|
+
* @param {?} p
|
|
69
|
+
* @return {?}
|
|
70
|
+
*/
|
|
71
|
+
p => {
|
|
72
|
+
return (includeRouteId && p.isRouteId)
|
|
73
|
+
|| (includeRouteParameters && p.isRouteParameter && !p.isRouteId) // route id is included in the line above
|
|
74
|
+
|| (includeNonRouteParameters && !p.isRouteParameter);
|
|
75
|
+
}));
|
|
30
76
|
}
|
|
31
77
|
/**
|
|
32
78
|
* @template T
|
|
@@ -34,7 +80,7 @@ export class PlaceDefinition {
|
|
|
34
80
|
* @param {?=} defaultValue
|
|
35
81
|
* @return {?}
|
|
36
82
|
*/
|
|
37
|
-
|
|
83
|
+
getPlaceData(key, defaultValue) {
|
|
38
84
|
return this.data ?
|
|
39
85
|
_.isNil(this.data[key]) ? defaultValue : this.data[key] :
|
|
40
86
|
defaultValue;
|
|
@@ -45,7 +91,7 @@ export class PlaceDefinition {
|
|
|
45
91
|
* @param {?=} defaultValue
|
|
46
92
|
* @return {?}
|
|
47
93
|
*/
|
|
48
|
-
|
|
94
|
+
searchPlaceData(keys, defaultValue) {
|
|
49
95
|
if (this.data) {
|
|
50
96
|
/** @type {?} */
|
|
51
97
|
const found = keys.find((/**
|
|
@@ -59,7 +105,138 @@ export class PlaceDefinition {
|
|
|
59
105
|
return defaultValue;
|
|
60
106
|
}
|
|
61
107
|
}
|
|
108
|
+
/**
|
|
109
|
+
* @param {?} visit
|
|
110
|
+
* @return {?}
|
|
111
|
+
*/
|
|
112
|
+
getRouteIdFrom(visit) {
|
|
113
|
+
/** @type {?} */
|
|
114
|
+
const routeIdParameterDef = this.getRouteIdParameterDef();
|
|
115
|
+
return routeIdParameterDef ? visit.getParameter(routeIdParameterDef.name) : null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Returns angular router commands that specify the route id and any route parameters. The result does
|
|
119
|
+
* not include any path information.
|
|
120
|
+
* @param {?} visit
|
|
121
|
+
* @return {?}
|
|
122
|
+
*/
|
|
123
|
+
// getFormattedRouterCommands(visit: Visit): any[] {
|
|
124
|
+
// return this.hasRouteId() ?
|
|
125
|
+
// [this.getFormattedRouteId(visit), this.getFormattedRouteParameters(visit)] :
|
|
126
|
+
// [this.getFormattedRouteParameters(visit)];
|
|
127
|
+
// }
|
|
128
|
+
getFormattedRouteId(visit) {
|
|
129
|
+
return visit.hasRouteId() ? this.getRouteIdParameterDef().urlFormat.format(visit.getRouteId()) : null;
|
|
130
|
+
}
|
|
131
|
+
// @Trace()
|
|
132
|
+
/**
|
|
133
|
+
* @param {?} visit
|
|
134
|
+
* @param {?=} includeRouteId
|
|
135
|
+
* @return {?}
|
|
136
|
+
*/
|
|
137
|
+
getFormattedRouteParameters(visit, includeRouteId = false) {
|
|
138
|
+
/** @type {?} */
|
|
139
|
+
const result = {};
|
|
140
|
+
this.getVisitParameterDefs({
|
|
141
|
+
includeRouteId, includeRouteParameters: true
|
|
142
|
+
}).forEach((/**
|
|
143
|
+
* @param {?} def
|
|
144
|
+
* @return {?}
|
|
145
|
+
*/
|
|
146
|
+
def => {
|
|
147
|
+
/** @type {?} */
|
|
148
|
+
const value = visit.getParameter(def.name);
|
|
149
|
+
if (!def.isEmptyValue(value)) {
|
|
150
|
+
if (def.isArray) {
|
|
151
|
+
assert.isArray(value);
|
|
152
|
+
result[def.name] = value.map((/**
|
|
153
|
+
* @param {?} v
|
|
154
|
+
* @return {?}
|
|
155
|
+
*/
|
|
156
|
+
v => def.urlFormat.format(v)));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
assert.isFalsey(Array.isArray(value));
|
|
160
|
+
result[def.name] = def.urlFormat.format(value);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}));
|
|
164
|
+
return result;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* @param {?} visit
|
|
168
|
+
* @return {?}
|
|
169
|
+
*/
|
|
170
|
+
getNonRouteParameters(visit) {
|
|
171
|
+
/** @type {?} */
|
|
172
|
+
const result = {};
|
|
173
|
+
this.getVisitParameterDefs({ includeNonRouteParameters: true }).forEach((/**
|
|
174
|
+
* @param {?} def
|
|
175
|
+
* @return {?}
|
|
176
|
+
*/
|
|
177
|
+
def => {
|
|
178
|
+
/** @type {?} */
|
|
179
|
+
const value = visit.getParameter(def.name);
|
|
180
|
+
if (!def.isEmptyValue(value)) {
|
|
181
|
+
result[def.name] = value;
|
|
182
|
+
}
|
|
183
|
+
}));
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
// @Trace()
|
|
187
|
+
/**
|
|
188
|
+
* @param {?} params
|
|
189
|
+
* @return {?}
|
|
190
|
+
*/
|
|
191
|
+
parseRouteParams(params) {
|
|
192
|
+
/** @type {?} */
|
|
193
|
+
const result = {};
|
|
194
|
+
this.getVisitParameterDefs({
|
|
195
|
+
includeRouteId: true,
|
|
196
|
+
includeRouteParameters: true,
|
|
197
|
+
includeNonRouteParameters: false
|
|
198
|
+
}).forEach((/**
|
|
199
|
+
* @param {?} def
|
|
200
|
+
* @return {?}
|
|
201
|
+
*/
|
|
202
|
+
def => {
|
|
203
|
+
// params will return null for non existent names
|
|
204
|
+
if (params.has(def.name)) {
|
|
205
|
+
if (def.isArray) {
|
|
206
|
+
/** @type {?} */
|
|
207
|
+
const values = params.getAll(def.name);
|
|
208
|
+
result[def.name] = values.map((/**
|
|
209
|
+
* @param {?} v
|
|
210
|
+
* @return {?}
|
|
211
|
+
*/
|
|
212
|
+
v => def.urlFormat.parse(v)));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
result[def.name] = def.urlFormat.parse(params.get(def.name));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}));
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
62
221
|
}
|
|
222
|
+
tslib_1.__decorate([
|
|
223
|
+
Memoize(),
|
|
224
|
+
tslib_1.__metadata("design:type", Function),
|
|
225
|
+
tslib_1.__metadata("design:paramtypes", []),
|
|
226
|
+
tslib_1.__metadata("design:returntype", ParameterDefinition)
|
|
227
|
+
], PlaceDefinition.prototype, "getRouteIdParameterDef", null);
|
|
228
|
+
tslib_1.__decorate([
|
|
229
|
+
Memoize(),
|
|
230
|
+
tslib_1.__metadata("design:type", Function),
|
|
231
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
232
|
+
tslib_1.__metadata("design:returntype", Array)
|
|
233
|
+
], PlaceDefinition.prototype, "getRouteParameterDefs", null);
|
|
234
|
+
tslib_1.__decorate([
|
|
235
|
+
Memoize(),
|
|
236
|
+
tslib_1.__metadata("design:type", Function),
|
|
237
|
+
tslib_1.__metadata("design:paramtypes", [Object]),
|
|
238
|
+
tslib_1.__metadata("design:returntype", Array)
|
|
239
|
+
], PlaceDefinition.prototype, "getVisitParameterDefs", null);
|
|
63
240
|
if (false) {
|
|
64
241
|
/** @type {?} */
|
|
65
242
|
PlaceDefinition.prototype.component;
|
|
@@ -76,4 +253,19 @@ if (false) {
|
|
|
76
253
|
/** @type {?} */
|
|
77
254
|
PlaceDefinition.prototype.children;
|
|
78
255
|
}
|
|
79
|
-
|
|
256
|
+
(function (PlaceDefinition) {
|
|
257
|
+
/**
|
|
258
|
+
* @record
|
|
259
|
+
*/
|
|
260
|
+
function ParameterOptions() { }
|
|
261
|
+
PlaceDefinition.ParameterOptions = ParameterOptions;
|
|
262
|
+
if (false) {
|
|
263
|
+
/** @type {?|undefined} */
|
|
264
|
+
ParameterOptions.prototype.includeRouteId;
|
|
265
|
+
/** @type {?|undefined} */
|
|
266
|
+
ParameterOptions.prototype.includeRouteParameters;
|
|
267
|
+
/** @type {?|undefined} */
|
|
268
|
+
ParameterOptions.prototype.includeNonRouteParameters;
|
|
269
|
+
}
|
|
270
|
+
})(PlaceDefinition || (PlaceDefinition = {}));
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2UtZGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9wbGFjZS1kZWZpbml0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0EsT0FBTyxFQUFFLE1BQU0sRUFBd0IsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGtEQUFrRCxDQUFDO0FBQzNFLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUd6RSxNQUFNLE9BQU8sZUFBZTs7Ozs7Ozs7OztJQUUxQixZQUFxQixTQUF3QyxFQUN4QyxJQUFZLEVBQ1osWUFBcUIsRUFDckIsS0FBYSxFQUNiLElBQTRCLEVBQzVCLGVBQTJDLEVBQzNDLFFBQTJCO1FBTjNCLGNBQVMsR0FBVCxTQUFTLENBQStCO1FBQ3hDLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNyQixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsU0FBSSxHQUFKLElBQUksQ0FBd0I7UUFDNUIsb0JBQWUsR0FBZixlQUFlLENBQTRCO1FBQzNDLGFBQVEsR0FBUixRQUFRLENBQW1CO0lBQ2hELENBQUM7Ozs7SUFFRCxVQUFVO1FBQ1IsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDekMsQ0FBQzs7OztJQUdELHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSTs7OztRQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBQyxDQUFDO0lBQ3JELENBQUM7Ozs7O0lBR0QscUJBQXFCLENBQUMsY0FBYyxHQUFHLEtB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UUFIQywwQ0FBeUI7O1FBQ3pCLGtEQUFpQzs7UUFDakMscURBQW9DOztBQUV4QyxDQUFDLEVBTmdCLGVBQWUsS0FBZixlQUFlLFFBTS9CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGFyYW1NYXAgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgYXNzZXJ0LCBDb25zdHJ1Y3RhYmxlLCBUcmFjZSB9IGZyb20gJ0Bjb29sb24vcGVjdGluJztcbmltcG9ydCB7IE9wdHMgfSBmcm9tICdAY29vbG9uL3R5cGVzY3JpcHQtdXRpbGl0aWVzJztcbmltcG9ydCB7IE1lbW9pemUgfSBmcm9tICdAdHlwZXNjcmlwdC1wbHVzL2Zhc3QtbWVtb2l6ZS1kZWNvcmF0b3IvZGlzdC9zcmMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBsYWNlQ29tcG9uZW50IH0gZnJvbSAnLi9wbGFjZS1jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFyYW1ldGVyRGVmaW5pdGlvbiB9IGZyb20gJy4vcm91dGUvcGFyYW1ldGVyLWRlZmluaXRpb24uY2xhc3MnO1xuaW1wb3J0IHsgVmlzaXQgfSBmcm9tICcuL3Zpc2l0JztcblxuZXhwb3J0IGNsYXNzIFBsYWNlRGVmaW5pdGlvbiB7XG5cbiAgY29uc3RydWN0b3IocmVhZG9ubHkgY29tcG9uZW50OiBDb25zdHJ1Y3RhYmxlPFBsYWNlQ29tcG9uZW50PixcbiAgICAgICAgICAgICAgcmVhZG9ubHkgcGF0aDogc3RyaW5nLFxuICAgICAgICAgICAgICByZWFkb25seSBhdXRoZW50aWNhdGU6IGJvb2xlYW4sXG4gICAgICAgICAgICAgIHJlYWRvbmx5IG9yZGVyOiBudW1iZXIsXG4gICAgICAgICAgICAgIHJlYWRvbmx5IGRhdGE6IHsgW2tleTogc3RyaW5nXTogYW55IH0sXG4gICAgICAgICAgICAgIHJlYWRvbmx5IHJvdXRlUGFyYW1ldGVyczogUGFyYW1ldGVyRGVmaW5pdGlvbjxhbnk+W10sXG4gICAgICAgICAgICAgIHJlYWRvbmx5IGNoaWxkcmVuOiBQbGFjZURlZmluaXRpb25bXSkge1xuICB9XG5cbiAgaGFzUm91dGVJZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXJEZWYoKTtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0Um91dGVJZFBhcmFtZXRlckRlZigpOiBQYXJhbWV0ZXJEZWZpbml0aW9uPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW1ldGVycy5maW5kKHAgPT4gcC5pc1JvdXRlSWQpO1xuICB9XG5cbiAgQE1lbW9pemUoKVxuICBnZXRSb3V0ZVBhcmFtZXRlckRlZnMoaW5jbHVkZVJvdXRlSWQgPSBmYWxzZSk6IFBhcmFtZXRlckRlZmluaXRpb248YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRWaXNpdFBhcmFtZXRlckRlZnMoeyBpbmNsdWRlUm91dGVJZCwgaW5jbHVkZVJvdXRlUGFyYW1ldGVyczogdHJ1ZSB9KTtcbiAgfVxuXG4gIEBNZW1vaXplKClcbiAgZ2V0VmlzaXRQYXJhbWV0ZXJEZWZzKGluY2x1ZGU/OiBQbGFjZURlZmluaXRpb24uUGFyYW1ldGVyT3B0aW9ucyk6IFBhcmFtZXRlckRlZmluaXRpb248YW55PltdIHtcbiAgICBjb25zdCBvcHRzID0gT3B0cy5nZXQoaW5jbHVkZSk7XG4gICAgLy8gaW5jbHVkZXNcbiAgICBjb25zdCBpbmNsdWRlUm91dGVJZCA9ICFpbmNsdWRlIHx8IG9wdHMuZ2V0T3B0aW9uYWwoJ2luY2x1ZGVSb3V0ZUlkJywgZmFsc2UpO1xuICAgIGNvbnN0IGluY2x1ZGVSb3V0ZVBhcmFtZXRlcnMgPSAhaW5jbHVkZSB8fCBvcHRzLmdldE9wdGlvbmFsKCdpbmNsdWRlUm91dGVQYXJhbWV0ZXJzJywgZmFsc2UpO1xuICAgIGNvbnN0IGluY2x1ZGVOb25Sb3V0ZVBhcmFtZXRlcnMgPSAhaW5jbHVkZSB8fCBvcHRzLmdldE9wdGlvbmFsKCdpbmNsdWRlTm9uUm91dGVQYXJhbWV0ZXJzJywgZmFsc2UpO1xuICAgIHJldHVybiB0aGlzLnJvdXRlUGFyYW1ldGVycy5maWx0ZXIocCA9PiB7XG4gICAgICByZXR1cm4gKGluY2x1ZGVSb3V0ZUlkICYmIHAuaXNSb3V0ZUlkKVxuICAgICAgICB8fCAoaW5jbHVkZVJvdXRlUGFyYW1ldGVycyAmJiBwLmlzUm91dGVQYXJhbWV0ZXIgJiYgIXAuaXNSb3V0ZUlkKSAvLyByb3V0ZSBpZCBpcyBpbmNsdWRlZCBpbiB0aGUgbGluZSBhYm92ZVxuICAgICAgICB8fCAoaW5jbHVkZU5vblJvdXRlUGFyYW1ldGVycyAmJiAhcC5pc1JvdXRlUGFyYW1ldGVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFBsYWNlRGF0YTxUPihrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogVCk6IFQge1xuICAgIHJldHVybiB0aGlzLmRhdGEgP1xuICAgICAgXy5pc05pbCh0aGlzLmRhdGFba2V5XSkgPyBkZWZhdWx0VmFsdWUgOiB0aGlzLmRhdGFba2V5XSA6XG4gICAgICBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBzZWFyY2hQbGFjZURhdGE8VD4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZT86IFQpOiBUIHtcbiAgICBpZiAodGhpcy5kYXRhKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGtleXMuZmluZChrZXkgPT4gIV8uaXNOaWwodGhpcy5kYXRhW2tleV0pKTtcbiAgICAgIHJldHVybiBmb3VuZCA/IHRoaXMuZGF0YVtmb3VuZF0gOiBkZWZhdWx0VmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0Um91dGVJZEZyb20odmlzaXQ6IFZpc2l0KSB7XG4gICAgY29uc3Qgcm91dGVJZFBhcmFtZXRlckRlZiA9IHRoaXMuZ2V0Um91dGVJZFBhcmFtZXRlckRlZigpO1xuICAgIHJldHVybiByb3V0ZUlkUGFyYW1ldGVyRGVmID8gdmlzaXQuZ2V0UGFyYW1ldGVyKHJvdXRlSWRQYXJhbWV0ZXJEZWYubmFtZSkgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW5ndWxhciByb3V0ZXIgY29tbWFuZHMgdGhhdCBzcGVjaWZ5IHRoZSByb3V0ZSBpZCBhbmQgYW55IHJvdXRlIHBhcmFtZXRlcnMuICBUaGUgcmVzdWx0IGRvZXNcbiAgICogbm90IGluY2x1ZGUgYW55IHBhdGggaW5mb3JtYXRpb24uXG4gICAqL1xuICAvLyBnZXRGb3JtYXR0ZWRSb3V0ZXJDb21tYW5kcyh2aXNpdDogVmlzaXQpOiBhbnlbXSB7XG4gIC8vICAgcmV0dXJuIHRoaXMuaGFzUm91dGVJZCgpID9cbiAgLy8gICAgIFt0aGlzLmdldEZvcm1hdHRlZFJvdXRlSWQodmlzaXQpLCB0aGlzLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldIDpcbiAgLy8gICAgIFt0aGlzLmdldEZvcm1hdHRlZFJvdXRlUGFyYW1ldGVycyh2aXNpdCldO1xuICAvLyB9XG5cbiAgZ2V0Rm9ybWF0dGVkUm91dGVJZCh2aXNpdDogVmlzaXQpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdC5oYXNSb3V0ZUlkKCkgPyB0aGlzLmdldFJvdXRlSWRQYXJhbWV0ZXJEZWYoKS51cmxGb3JtYXQuZm9ybWF0KHZpc2l0LmdldFJvdXRlSWQoKSkgOiBudWxsO1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgZ2V0Rm9ybWF0dGVkUm91dGVQYXJhbWV0ZXJzKHZpc2l0OiBWaXNpdCwgaW5jbHVkZVJvdXRlSWQgPSBmYWxzZSk6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCByZXN1bHQ6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgdGhpcy5nZXRWaXNpdFBhcmFtZXRlckRlZnMoe1xuICAgICAgaW5jbHVkZVJvdXRlSWQsIGluY2x1ZGVSb3V0ZVBhcmFtZXRlcnM6IHRydWVcbiAgICB9KS5mb3JFYWNoKGRlZiA9PiB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHZpc2l0LmdldFBhcmFtZXRlcihkZWYubmFtZSk7XG4gICAgICBpZiAoIWRlZi5pc0VtcHR5VmFsdWUodmFsdWUpKSB7XG4gICAgICAgIGlmIChkZWYuaXNBcnJheSkge1xuICAgICAgICAgIGFzc2VydC5pc0FycmF5KHZhbHVlKTtcbiAgICAgICAgICByZXN1bHRbZGVmLm5hbWVdID0gdmFsdWUubWFwKHYgPT4gZGVmLnVybEZvcm1hdC5mb3JtYXQodikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydC5pc0ZhbHNleShBcnJheS5pc0FycmF5KHZhbHVlKSk7XG4gICAgICAgICAgcmVzdWx0W2RlZi5uYW1lXSA9IGRlZi51cmxGb3JtYXQuZm9ybWF0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBnZXROb25Sb3V0ZVBhcmFtZXRlcnModmlzaXQ6IFZpc2l0KTogeyBbcDogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHJlc3VsdDogeyBbcDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTtcbiAgICB0aGlzLmdldFZpc2l0UGFyYW1ldGVyRGVmcyh7IGluY2x1ZGVOb25Sb3V0ZVBhcmFtZXRlcnM6IHRydWUgfSkuZm9yRWFjaChkZWYgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSB2aXNpdC5nZXRQYXJhbWV0ZXIoZGVmLm5hbWUpO1xuICAgICAgaWYgKCFkZWYuaXNFbXB0eVZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHJlc3VsdFtkZWYubmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQFRyYWNlKClcbiAgcGFyc2VSb3V0ZVBhcmFtcyhwYXJhbXM6IFBhcmFtTWFwKTogeyBbcDogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IHJlc3VsdDogeyBbcDogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICB0aGlzLmdldFZpc2l0UGFyYW1ldGVyRGVmcyh7XG4gICAgICBpbmNsdWRlUm91dGVJZDogdHJ1ZSxcbiAgICAgIGluY2x1ZGVSb3V0ZVBhcmFtZXRlcnM6IHRydWUsXG4gICAgICBpbmNsdWRlTm9uUm91dGVQYXJhbWV0ZXJzOiBmYWxzZVxuICAgIH0pLmZvckVhY2goZGVmID0+IHtcbiAgICAgIC8vIHBhcmFtcyB3aWxsIHJldHVybiBudWxsIGZvciBub24gZXhpc3RlbnQgbmFtZXNcbiAgICAgIGlmIChwYXJhbXMuaGFzKGRlZi5uYW1lKSkge1xuICAgICAgICBpZiAoZGVmLmlzQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBwYXJhbXMuZ2V0QWxsKGRlZi5uYW1lKTtcbiAgICAgICAgICByZXN1bHRbZGVmLm5hbWVdID0gdmFsdWVzLm1hcCh2ID0+IGRlZi51cmxGb3JtYXQucGFyc2UodikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtkZWYubmFtZV0gPSBkZWYudXJsRm9ybWF0LnBhcnNlKHBhcmFtcy5nZXQoZGVmLm5hbWUpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxufVxuXG5leHBvcnQgbmFtZXNwYWNlIFBsYWNlRGVmaW5pdGlvbiB7XG4gIGV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVyT3B0aW9ucyB7XG4gICAgaW5jbHVkZVJvdXRlSWQ/OiBib29sZWFuO1xuICAgIGluY2x1ZGVSb3V0ZVBhcmFtZXRlcnM/OiBib29sZWFuO1xuICAgIGluY2x1ZGVOb25Sb3V0ZVBhcmFtZXRlcnM/OiBib29sZWFuO1xuICB9XG59XG4iXX0=
|
|
@@ -15,6 +15,7 @@ export class PlaceHistory {
|
|
|
15
15
|
this.router = router;
|
|
16
16
|
this._history = new Map();
|
|
17
17
|
}
|
|
18
|
+
// @Trace()
|
|
18
19
|
/**
|
|
19
20
|
* @param {?} state
|
|
20
21
|
* @return {?}
|
|
@@ -24,7 +25,7 @@ export class PlaceHistory {
|
|
|
24
25
|
const history = this.getHistory(state.placeDefinition);
|
|
25
26
|
/** @type {?} */
|
|
26
27
|
const previousState = _.last(history);
|
|
27
|
-
if (!previousState || state.
|
|
28
|
+
if (!previousState || state.hasChangedFrom(previousState)) {
|
|
28
29
|
history.unshift(state); // LIFO
|
|
29
30
|
this.setHistory(state.placeDefinition, history.slice(0, 3)); // limit our history to 4 visits
|
|
30
31
|
}
|
|
@@ -74,4 +75,4 @@ if (false) {
|
|
|
74
75
|
*/
|
|
75
76
|
PlaceHistory.prototype.router;
|
|
76
77
|
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhY2UtaGlzdG9yeS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bjb29sb24vYW5ndWxhci11aS1wb3dlcnVwcy8iLCJzb3VyY2VzIjpbImxpYi9wbGFjZS9wbGFjZS1oaXN0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7OztBQU92QixNQUFNLE9BQU8sWUFBWTs7OztJQUl2QixZQUE2QixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUZuQyxhQUFRLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFHdkQsQ0FBQzs7Ozs7O0lBR0QsR0FBRyxDQUFDLEtBQVk7O2NBQ1IsT0FBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQzs7Y0FDaEQsYUFBYSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUN6RCxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTztZQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztTQUM5RjtJQUNILENBQUM7Ozs7O0lBRUQsVUFBVSxDQUFDLFFBQXlCOztZQUM5QixPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ3pDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDWixPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDcEM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDOzs7Ozs7O0lBRU8sVUFBVSxDQUFDLFFBQXlCLEVBQUUsT0FBZ0I7UUFDNUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7OztZQS9CRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs7WUFSUSxNQUFNOzs7Ozs7OztJQVdiLGdDQUF1RDs7Ozs7SUFFM0MsOEJBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFRyYWNlIH0gZnJvbSAnQGNvb2xvbi9wZWN0aW4nO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IFBsYWNlRGVmaW5pdGlvbiB9IGZyb20gJy4vcGxhY2UtZGVmaW5pdGlvbic7XG5pbXBvcnQgeyBWaXNpdCB9IGZyb20gJy4vdmlzaXQnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGFjZUhpc3Rvcnkge1xuXG4gIHByaXZhdGUgX2hpc3RvcnkgPSBuZXcgTWFwPFBsYWNlRGVmaW5pdGlvbiwgVmlzaXRbXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyKSB7XG4gIH1cblxuICAvLyBAVHJhY2UoKVxuICBhZGQoc3RhdGU6IFZpc2l0KSB7XG4gICAgY29uc3QgaGlzdG9yeSA9IHRoaXMuZ2V0SGlzdG9yeShzdGF0ZS5wbGFjZURlZmluaXRpb24pO1xuICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBfLmxhc3QoaGlzdG9yeSk7XG4gICAgaWYgKCFwcmV2aW91c1N0YXRlIHx8IHN0YXRlLmhhc0NoYW5nZWRGcm9tKHByZXZpb3VzU3RhdGUpKSB7XG4gICAgICBoaXN0b3J5LnVuc2hpZnQoc3RhdGUpOyAvLyBMSUZPXG4gICAgICB0aGlzLnNldEhpc3Rvcnkoc3RhdGUucGxhY2VEZWZpbml0aW9uLCBoaXN0b3J5LnNsaWNlKDAsIDMpKTsgLy8gbGltaXQgb3VyIGhpc3RvcnkgdG8gNCB2aXNpdHNcbiAgICB9XG4gIH1cblxuICBnZXRIaXN0b3J5KHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24pOiBWaXNpdFtdIHtcbiAgICBsZXQgaGlzdG9yeSA9IHRoaXMuX2hpc3RvcnkuZ2V0KHBsYWNlRGVmKTtcbiAgICBpZiAoIWhpc3RvcnkpIHtcbiAgICAgIGhpc3RvcnkgPSBbXTtcbiAgICAgIHRoaXMuc2V0SGlzdG9yeShwbGFjZURlZiwgaGlzdG9yeSk7XG4gICAgfVxuICAgIHJldHVybiBoaXN0b3J5O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRIaXN0b3J5KHBsYWNlRGVmOiBQbGFjZURlZmluaXRpb24sIGhpc3Rvcnk6IFZpc2l0W10pIHtcbiAgICB0aGlzLl9oaXN0b3J5LnNldChwbGFjZURlZiwgaGlzdG9yeSk7XG4gIH1cblxuLy8gcHJldmlvdXNWaXNpdCgpOiBWaXNpdCB7XG4gIC8vICAgcmV0dXJuIF8ubGFzdCh0aGlzLl9oaXN0b3J5KTtcbiAgLy8gfVxuICAvL1xuICAvLyB3aXRoUHJldmlvdXNWaXNpdDxSPihjYWxsYmFjazoocHJldmlvdXNWaXNpdDpWaXNpdCk9PlIsIGRlZmF1bHRWYWx1ZTpSID0gbnVsbCk6UntcbiAgLy8gICBjb25zdCB2aXNpdCA9IHRoaXMucHJldmlvdXNWaXNpdCgpO1xuICAvLyAgIHJldHVybiB2aXNpdCA/IGNhbGxiYWNrKHZpc2l0KSA6IGRlZmF1bHRWYWx1ZTtcbiAgLy8gfVxuICAvL1xuICAvLyBwcmV2aW91c1Zpc2l0VG8ocGxhY2U6IFBsYWNlKTogVmlzaXQge1xuICAvLyAgIHJldHVybiBuZXcgVmlzaXRIaXN0b3J5LlF1ZXJ5KHRoaXMuX2hpc3RvcnkpLnRvKHBsYWNlKS5sYXN0KCk7XG4gIC8vIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBWaXNpdEhpc3Rvcnkge1xuXG4gIC8vIGV4cG9ydCBjbGFzcyBRdWVyeSB7XG4gIC8vICAgcHJpdmF0ZSBfaGlzdG9yeTogVmlzaXQuU3RhdGVbXTtcbiAgLy8gICBwcml2YXRlIF9wbGFjZXM6IFBsYWNlW107XG4gIC8vICAgcHJpdmF0ZSBfcHJlZGljYXRlOiAodmlzaXQ6IGFueSkgPT4gYm9vbGVhbjtcbiAgLy8gICBwcml2YXRlIF9saW1pdDogbnVtYmVyO1xuICAvL1xuICAvLyAgIGNvbnN0cnVjdG9yKGhpc3RvcnksIGxpbWl0ID0gaGlzdG9yeS5sZW5ndGgpIHtcbiAgLy8gICAgIHRoaXMuX2hpc3RvcnkgPSBoaXN0b3J5O1xuICAvLyAgICAgdGhpcy5fcGxhY2VzID0gW107XG4gIC8vICAgICB0aGlzLl9wcmVkaWNhdGUgPSAodmlzaXQgPT4gdHJ1ZSk7XG4gIC8vICAgICB0aGlzLl9saW1pdCA9IGxpbWl0O1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICB0byguLi5wbGFjZXM6UGxhY2VbXSk6dGhpcyB7XG4gIC8vICAgICB0aGlzLl9wbGFjZXMgPSBwbGFjZXM7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgd2l0aChwYXJhbWV0ZXJzOiB7IFtwYXJhbWV0ZXI6IHN0cmluZ106IGFueSB9KTogdGhpcyB7XG4gIC8vICAgICB0aGlzLm1hdGNoaW5nKHN0YXRlID0+IHtcbiAgLy8gICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtZXRlcnMpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgLy8gICAgICAgICBjb25zdCBtYXRjaFZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuICAvLyAgICAgICAgIGNvbnN0IHZpc2l0VmFsdWUgPSBzdGF0ZS5nZXQoa2V5KTtcbiAgLy8gICAgICAgICBjb25zdCBtYXRjaGVkID0gbWF0Y2hWYWx1ZSA9PT0gJyonID8gIV8uaXNOaWwodmlzaXRWYWx1ZSkgOiB2aXNpdFZhbHVlID09IG1hdGNoVmFsdWU7XG4gIC8vICAgICAgICAgLy8gTG9nZ2VyLmdldCh0aGlzKS5pbmZvKGBtYXRjaGVkPSR7bWF0Y2hlZH1gLCBwYXJhbWV0ZXJzLCB2aXNpdFZhbHVlKTtcbiAgLy8gICAgICAgICByZXR1cm4gYWNjICYmIG1hdGNoZWQ7XG4gIC8vICAgICAgIH0sIHRydWUpO1xuICAvLyAgICAgfSk7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgbGFzdCgpOiBWaXNpdC5TdGF0ZSB7XG4gIC8vICAgICByZXR1cm4gXy5maW5kTGFzdCh0aGlzLl9oaXN0b3J5LCB2aXNpdCA9PiB0aGlzLl9tYXRjaGVzKHZpc2l0KSlcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgLy8gQHRyYWNlXG4gIC8vICAgYWxsVGhhdE1hdGNoKCk6IFZpc2l0LlN0YXRlW10ge1xuICAvLyAgICAgcmV0dXJuIF8uZmlsdGVyKHRoaXMuX2hpc3RvcnksIHZpc2l0ID0+IHRoaXMuX21hdGNoZXModmlzaXQpKS5zbGljZSgtdGhpcy5fbGltaXQpO1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICAvLyBAdHJhY2VcbiAgLy8gICBtb3N0UmVjZW50VmFsdWVPZjxUPWFueT4ocGFyYW06IHN0cmluZywgZGVmYXVsdFZhbHVlOiBUID0gbnVsbCk6IFQge1xuICAvLyAgICAgY29uc3QgbGFzdFN0YXRlV2l0aFBhcmFtID0gXy5maW5kTGFzdCh0aGlzLmFsbFRoYXRNYXRjaCgpLCBzdGF0ZSA9PiAhXy5pc05pbChzdGF0ZS5nZXQocGFyYW0pKSk7XG4gIC8vICAgICByZXR1cm4gXy5pc05pbChsYXN0U3RhdGVXaXRoUGFyYW0pID8gZGVmYXVsdFZhbHVlIDogbGFzdFN0YXRlV2l0aFBhcmFtLmdldChwYXJhbSk7XG4gIC8vICAgfVxuICAvL1xuICAvLyAgIGxpbWl0KGxpbWl0OiBudW1iZXIpOiB0aGlzIHtcbiAgLy8gICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgbWF0Y2hpbmcocHJlZGljYXRlOiAodmlzaXQ6IFZpc2l0LlN0YXRlKSA9PiBib29sZWFuKTogdGhpcyB7XG4gIC8vICAgICB0aGlzLl9wcmVkaWNhdGUgPSBwcmVkaWNhdGU7XG4gIC8vICAgICByZXR1cm4gdGhpcztcbiAgLy8gICB9XG4gIC8vXG4gIC8vICAgX21hdGNoZXModmlzaXQ6IFZpc2l0LlN0YXRlKSB7XG4gIC8vICAgICByZXR1cm4gdGhpcy5faXNQbGFjZU1hdGNoKHZpc2l0KSAmJiB0aGlzLl9wcmVkaWNhdGUodmlzaXQpO1xuICAvLyAgIH1cbiAgLy9cbiAgLy8gICBfaXNQbGFjZU1hdGNoKHZpc2l0OiBWaXNpdC5TdGF0ZSkge1xuICAvLyAgICAgcmV0dXJuIHRoaXMuX3BsYWNlcy5sZW5ndGggPCAxIHx8IHRoaXMuX3BsYWNlcy5pbmNsdWRlcyh2aXNpdC5wbGFjZSlcbiAgLy8gICB9XG4gIC8vXG4gIC8vIH1cblxufVxuIl19
|