@fireflysemantics/slice 15.0.18 → 15.0.24

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 (31) hide show
  1. package/README.md +1 -0
  2. package/esm2020/lib/AbstractStore.mjs +296 -0
  3. package/{esm2015/lib/EStore.js → esm2020/lib/EStore.mjs} +10 -10
  4. package/esm2020/lib/Slice.mjs +222 -0
  5. package/esm2020/lib/utilities.mjs +226 -0
  6. package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
  7. package/fesm2015/{fireflysemantics-slice.js → fireflysemantics-slice.mjs} +35 -22
  8. package/fesm2015/fireflysemantics-slice.mjs.map +1 -0
  9. package/fesm2020/fireflysemantics-slice.mjs +1494 -0
  10. package/fesm2020/fireflysemantics-slice.mjs.map +1 -0
  11. package/lib/models/Predicate.d.ts +1 -1
  12. package/lib/models/scrollPosition.d.ts +1 -1
  13. package/lib/utilities.d.ts +12 -1
  14. package/package.json +22 -9
  15. package/bundles/fireflysemantics-slice.umd.js +0 -1891
  16. package/bundles/fireflysemantics-slice.umd.js.map +0 -1
  17. package/esm2015/lib/AbstractStore.js +0 -296
  18. package/esm2015/lib/Slice.js +0 -222
  19. package/esm2015/lib/utilities.js +0 -213
  20. package/fesm2015/fireflysemantics-slice.js.map +0 -1
  21. /package/{esm2015/fireflysemantics-slice.js → esm2020/fireflysemantics-slice.mjs} +0 -0
  22. /package/{esm2015/lib/OStore.js → esm2020/lib/OStore.mjs} +0 -0
  23. /package/{esm2015/lib/models/ActionTypes.js → esm2020/lib/models/ActionTypes.mjs} +0 -0
  24. /package/{esm2015/lib/models/Delta.js → esm2020/lib/models/Delta.mjs} +0 -0
  25. /package/{esm2015/lib/models/Entity.js → esm2020/lib/models/Entity.mjs} +0 -0
  26. /package/{esm2015/lib/models/Predicate.js → esm2020/lib/models/Predicate.mjs} +0 -0
  27. /package/{esm2015/lib/models/StoreConfig.js → esm2020/lib/models/StoreConfig.mjs} +0 -0
  28. /package/{esm2015/lib/models/constants.js → esm2020/lib/models/constants.mjs} +0 -0
  29. /package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  30. /package/{esm2015/lib/models/scrollPosition.js → esm2020/lib/models/scrollPosition.mjs} +0 -0
  31. /package/{fireflysemantics-slice.d.ts → index.d.ts} +0 -0
package/README.md CHANGED
@@ -50,6 +50,7 @@ npm i @fireflysemantics/slice tslib rxjs nanoid
50
50
  - [Adding Slices to an Firefly Semantics Slice Entity Store](https://developer.fireflysemantics.com/tasks/tasks--slice--adding-slices-to-the-firefly-semantics-entity-store)
51
51
  - [Adding Search To the Firefly Semantics Slice Angular Todo Application](https://developer.fireflysemantics.com/tasks/tasks--slice--adding-search-to-the-firefly-semantics-slice-angular-todo-application)
52
52
  - [Comparing Firefly Semantics Slice Entities](https://developer.fireflysemantics.com/tasks/tasks--slice--comparing-firefly-semantics-slice-entities)
53
+ - [Filtering Firefly Semantics Slice Object Store Observables by Property Value](https://developer.fireflysemantics.com/tasks/tasks--slice--filtering-firefly-semantics-slice-object-store-observables-by-property-value)
53
54
 
54
55
 
55
56
  ## Youtube
@@ -0,0 +1,296 @@
1
+ import { ReplaySubject } from "rxjs";
2
+ import { map } from "rxjs/operators";
3
+ const { freeze } = Object;
4
+ const ESTORE_DEFAULT_ID_KEY = "id";
5
+ const ESTORE_DEFAULT_GID_KEY = "gid";
6
+ export const ESTORE_CONFIG_DEFAULT = freeze({
7
+ idKey: ESTORE_DEFAULT_ID_KEY,
8
+ guidKey: ESTORE_DEFAULT_GID_KEY
9
+ });
10
+ export class AbstractStore {
11
+ constructor(config) {
12
+ /**
13
+ * Notifies observers of the store query.
14
+ */
15
+ this.notifyQuery = new ReplaySubject(1);
16
+ /**
17
+ * The current query state.
18
+ */
19
+ this._query = '';
20
+ /**
21
+ * Primary index for the stores elements.
22
+ */
23
+ this.entries = new Map();
24
+ /**
25
+ * The element entries that are keyed by
26
+ * an id generated on the server.
27
+ */
28
+ this.idEntries = new Map();
29
+ /**
30
+ * Create notifications that broacast
31
+ * the entire set of entries.
32
+ */
33
+ this.notify = new ReplaySubject(1);
34
+ /**
35
+ * Create notifications that broacast
36
+ * store or slice delta state changes.
37
+ */
38
+ this.notifyDelta = new ReplaySubject(1);
39
+ /**
40
+ * An Observable<E[]> reference
41
+ * to the entities in the store or
42
+ * Slice instance.
43
+ *
44
+ */
45
+ this.obs = this.observe();
46
+ this.config = config
47
+ ? freeze({ ...ESTORE_CONFIG_DEFAULT, ...config })
48
+ : ESTORE_CONFIG_DEFAULT;
49
+ }
50
+ /**
51
+ * Sets the current query state and notifies observers.
52
+ */
53
+ set query(query) {
54
+ this._query = query;
55
+ this.notifyQuery.next(this._query);
56
+ }
57
+ /**
58
+ * @return A snapshot of the query state.
59
+ */
60
+ get query() {
61
+ return this._query;
62
+ }
63
+ /**
64
+ * Observe the query.
65
+ * @example
66
+ <pre>
67
+ let query$ = source.observeQuery();
68
+ </pre>
69
+ */
70
+ observeQuery() {
71
+ return this.notifyQuery.asObservable();
72
+ }
73
+ /**
74
+ * The current id key for the EStore instance.
75
+ * @return this.config.idKey;
76
+ */
77
+ get ID_KEY() {
78
+ return this.config.idKey;
79
+ }
80
+ /**
81
+ * The current guid key for the EStore instance.
82
+ * @return this.config.guidKey;
83
+ */
84
+ get GUID_KEY() {
85
+ return this.config.guidKey;
86
+ }
87
+ /**
88
+ * Call all the notifiers at once.
89
+ *
90
+ * @param v
91
+ * @param delta
92
+ */
93
+ notifyAll(v, delta) {
94
+ this.notify.next(v);
95
+ this.notifyDelta.next(delta);
96
+ }
97
+ /**
98
+ * Observe store state changes.
99
+ * @param sort Optional sorting function yielding a sorted observable.
100
+ * @example
101
+ ```
102
+ let todos$ = source.observe();
103
+ //or with a sort by title function
104
+ let todos$ = source.observe((a, b)=>(a.title > b.title ? -1 : 1));
105
+ ```
106
+ */
107
+ observe(sort) {
108
+ if (sort) {
109
+ return this.notify.pipe(map((e) => e.sort(sort)));
110
+ }
111
+ return this.notify.asObservable();
112
+ }
113
+ /**
114
+ * Observe delta updates.
115
+ * @example
116
+ <pre>
117
+ let todos$ = source.observeDelta();
118
+ </pre>
119
+ */
120
+ observeDelta() {
121
+ return this.notifyDelta.asObservable();
122
+ }
123
+ /**
124
+ * Check whether the store is empty.
125
+ *
126
+ * @return A hot {@link Observable} that indicates whether the store is empty.
127
+ *
128
+ * @example
129
+ <pre>
130
+ source.isEmpty();
131
+ </pre>
132
+ */
133
+ isEmpty() {
134
+ return this.notify.pipe(map((entries) => entries.length == 0));
135
+ }
136
+ /**
137
+ * Check whether the store is empty.
138
+ *
139
+ * @return A snapshot that indicates whether the store is empty.
140
+ *
141
+ * @example
142
+ <pre>
143
+ source.isEmpty();
144
+ </pre>
145
+ */
146
+ isEmptySnapshot() {
147
+ return Array.from(this.entries.values()).length == 0;
148
+ }
149
+ /**
150
+ * Returns the number of entries contained.
151
+ * @param p The predicate to apply in order to filter the count
152
+ */
153
+ count(p) {
154
+ if (p) {
155
+ return this.notify.pipe(map((e) => e.reduce((total, e) => total + (p(e) ? 1 : 0), 0)));
156
+ }
157
+ return this.notify.pipe(map((entries) => entries.length));
158
+ }
159
+ /**
160
+ * Returns a snapshot of the number of entries contained in the store.
161
+ * @param p The predicate to apply in order to filter the count
162
+ */
163
+ countSnapshot(p) {
164
+ if (p) {
165
+ return Array.from(this.entries.values()).filter(p).length;
166
+ }
167
+ return Array.from(this.entries.values()).length;
168
+ }
169
+ /**
170
+ * Snapshot of all entries.
171
+ *
172
+ * @return Snapshot array of all the elements the entities the store contains.
173
+ *
174
+ * @example Observe a snapshot of all the entities in the store.
175
+ ```
176
+ let selectedTodos:Todo[] = source.allSnapshot();
177
+ ```
178
+ */
179
+ allSnapshot() {
180
+ return Array.from(this.entries.values());
181
+ }
182
+ /**
183
+ * Returns true if the entries contain the identified instance.
184
+ *
185
+ * @param target Either an instance of type `E` or a `guid` identifying the instance.
186
+ * @param byId Whether the lookup should be performed with the `id` key rather than the `guid`.
187
+ * @returns true if the instance identified by the guid exists, false otherwise.
188
+ *
189
+ * @example
190
+ <pre>
191
+ let contains:boolean = source.contains(guid);
192
+ </pre>
193
+ */
194
+ contains(target) {
195
+ if (typeof target === "string") {
196
+ return this.entries.get(target) ? true : false;
197
+ }
198
+ const guid = target[this.config.guidKey];
199
+ return this.entries.get(guid) ? true : false;
200
+ }
201
+ /**
202
+ * Returns true if the entries contain the identified instance.
203
+ *
204
+ * @param target Either an instance of type `E` or a `id` identifying the instance.
205
+ * @returns true if the instance identified by the `id` exists, false otherwise.
206
+ *
207
+ * @example
208
+ <pre>
209
+ let contains:boolean = source.contains(guid);
210
+ </pre>
211
+ */
212
+ containsById(target) {
213
+ if (typeof target === "string") {
214
+ return this.idEntries.get(target) ? true : false;
215
+ }
216
+ const id = target[this.config.idKey];
217
+ return this.idEntries.get(id) ? true : false;
218
+ }
219
+ /**
220
+ * Find and return the entity identified by the GUID parameter
221
+ * if it exists and return it.
222
+ *
223
+ * @param guid
224
+ * @return The entity instance if it exists, null otherwise
225
+ */
226
+ findOne(guid) {
227
+ return this.entries.get(guid);
228
+ }
229
+ /**
230
+ * Find and return the entity identified by the ID parameter
231
+ * if it exists and return it.
232
+ *
233
+ * @param id
234
+ * @return The entity instance if it exists, null otherwise
235
+ */
236
+ findOneByID(id) {
237
+ return this.idEntries.get(id);
238
+ }
239
+ /**
240
+ * Snapshot of the entries that match the predicate.
241
+ *
242
+ * @param p The predicate used to query for the selection.
243
+ * @return A snapshot array containing the entities that match the predicate.
244
+ *
245
+ * @example Select all the `Todo` instance where the `title` length is greater than 100.
246
+ ```
247
+ let todos:Todo[]=store.select(todo=>todo.title.length>100);
248
+ ```
249
+ */
250
+ select(p) {
251
+ const selected = [];
252
+ Array.from(this.entries.values()).forEach(e => {
253
+ if (p(e)) {
254
+ selected.push(e);
255
+ }
256
+ });
257
+ return selected;
258
+ }
259
+ /**
260
+ * Compare entities by GUID
261
+ * @param e1 The first entity
262
+ * @param e2 The second entity
263
+ * @return true if the two entities have equal GUID ids
264
+ * @example Compare `todo1` with `todo2` by `gid`.
265
+ ```
266
+ if (equalsByGUID(todo1, todo2)){...};
267
+ ```
268
+ */
269
+ equalsByGUID(e1, e2) {
270
+ return e1[this.GUID_KEY] == e2[this.GUID_KEY];
271
+ }
272
+ /**
273
+ * Compare entities by ID
274
+ * @param e1 The first entity
275
+ * @param e2 The second entity
276
+ * @return true if the two entities have equal ID ids
277
+ * @example Compare `todo1` with `todo2` by `id`.
278
+ ```
279
+ if (equalsByID(todo1, todo2)){...};
280
+ ```
281
+ */
282
+ equalsByID(e1, e2) {
283
+ return e1[this.ID_KEY] == e2[this.ID_KEY];
284
+ }
285
+ /**
286
+ * Calls complete on all {@link BehaviorSubject} instances.
287
+ *
288
+ * Call destroy when disposing of the store.
289
+ */
290
+ destroy() {
291
+ this.notify.complete();
292
+ this.notifyDelta.complete();
293
+ this.notifyQuery.complete();
294
+ }
295
+ }
296
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9saWIvQWJzdHJhY3RTdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsYUFBYSxFQUFjLE1BQU0sTUFBTSxDQUFBO0FBQ2hELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUlwQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFBO0FBRXpCLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFBO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsS0FBSyxDQUFBO0FBRXBDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFnQixNQUFNLENBQUM7SUFDdkQsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixPQUFPLEVBQUUsc0JBQXNCO0NBQ2hDLENBQUMsQ0FBQztBQUVILE1BQU0sT0FBZ0IsYUFBYTtJQU9oQyxZQUFZLE1BQW9CO1FBTWpDOztXQUVHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBUyxDQUFDLENBQUMsQ0FBQztRQUVyRDs7V0FFRztRQUNPLFdBQU0sR0FBVyxFQUFFLENBQUM7UUE0QzlCOztXQUVHO1FBQ0ksWUFBTyxHQUFtQixJQUFJLEdBQUcsRUFBRSxDQUFBO1FBRTFDOzs7V0FHRztRQUNJLGNBQVMsR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQTtRQUU1Qzs7O1dBR0c7UUFDTyxXQUFNLEdBQUcsSUFBSSxhQUFhLENBQU0sQ0FBQyxDQUFDLENBQUE7UUFFNUM7OztXQUdHO1FBQ08sZ0JBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBVyxDQUFDLENBQUMsQ0FBQTtRQThCdEQ7Ozs7O1dBS0c7UUFDSyxRQUFHLEdBQW9CLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQWxIMUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNO1lBQ2xCLENBQUMsQ0FBQyxNQUFNLENB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SUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7U0FDM0Q7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsV0FBVztRQUNULE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsUUFBUSxDQUFDLE1BQWtCO1FBQ3pCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2hEO1FBQ0QsTUFBTSxJQUFJLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWSxDQUFDLE1BQWtCO1FBQzdCLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxFQUFFLEdBQWlCLE1BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxPQUFPLENBQUMsSUFBWTtRQUNsQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxXQUFXLENBQUMsRUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ0gsTUFBTSxDQUFDLENBQWU7UUFDcEIsTUFBTSxRQUFRLEdBQVEsRUFBRSxDQUFDO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDUixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2xCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsWUFBWSxDQUFDLEVBQU0sRUFBRSxFQUFNO1FBQ3pCLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSCxVQUFVLENBQUMsRUFBTSxFQUFFLEVBQU07UUFDdkIsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNEOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCJcbmltcG9ydCB7IG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiXG5pbXBvcnQgeyBEZWx0YSwgUHJlZGljYXRlIH0gZnJvbSBcIi4vbW9kZWxzXCJcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSBcIi4vbW9kZWxzL1N0b3JlQ29uZmlnXCJcblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdFxuXG5jb25zdCBFU1RPUkVfREVGQVVMVF9JRF9LRVkgPSBcImlkXCJcbmNvbnN0IEVTVE9SRV9ERUZBVUxUX0dJRF9LRVkgPSBcImdpZFwiXG5cbmV4cG9ydCBjb25zdCBFU1RPUkVfQ09ORklHX0RFRkFVTFQ6IFN0b3JlQ29uZmlnID0gZnJlZXplKHtcbiAgaWRLZXk6IEVTVE9SRV9ERUZBVUxUX0lEX0tFWSxcbiAgZ3VpZEtleTogRVNUT1JFX0RFRkFVTFRfR0lEX0tFWVxufSk7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0b3JlPEU+IHtcblxuICAvKipcbiAgICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzdG9yZS5cbiAgICovXG4gICBwdWJsaWMgY29uZmlnOiBTdG9yZUNvbmZpZztcblxuICAgY29uc3RydWN0b3IoY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICAgdGhpcy5jb25maWcgPSBjb25maWdcbiAgICAgICA/IGZyZWV6ZSh7IC4uLkVTVE9SRV9DT05GSUdfREVGQVVMVCwgLi4uY29uZmlnIH0pXG4gICAgICAgOiBFU1RPUkVfQ09ORklHX0RFRkFVTFQ7XG4gICB9XG4gXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgb2YgdGhlIHN0b3JlIHF1ZXJ5LlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeVF1ZXJ5ID0gbmV3IFJlcGxheVN1YmplY3Q8c3RyaW5nPigxKTtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgcXVlcnkgc3RhdGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgX3F1ZXJ5OiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBxdWVyeSBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IHF1ZXJ5KHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9xdWVyeSA9IHF1ZXJ5O1xuICAgIHRoaXMubm90aWZ5UXVlcnkubmV4dCh0aGlzLl9xdWVyeSk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBxdWVyeSBzdGF0ZS5cbiAgICovXG4gIGdldCBxdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcXVlcnk7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgcXVlcnkuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHF1ZXJ5JCA9IHNvdXJjZS5vYnNlcnZlUXVlcnkoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVRdWVyeSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlRdWVyeS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGlkIGtleSBmb3IgdGhlIEVTdG9yZSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB0aGlzLmNvbmZpZy5pZEtleTtcbiAgICovXG4gIGdldCBJRF9LRVkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuaWRLZXlcbiAgfVxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgZ3VpZCBrZXkgZm9yIHRoZSBFU3RvcmUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4gdGhpcy5jb25maWcuZ3VpZEtleTtcbiAgICovXG4gIGdldCBHVUlEX0tFWSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZy5ndWlkS2V5XG4gIH1cblxuICAvKipcbiAgICogUHJpbWFyeSBpbmRleCBmb3IgdGhlIHN0b3JlcyBlbGVtZW50cy5cbiAgICovXG4gIHB1YmxpYyBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKVxuXG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCBlbnRyaWVzIHRoYXQgYXJlIGtleWVkIGJ5XG4gICAqIGFuIGlkIGdlbmVyYXRlZCBvbiB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHVibGljIGlkRW50cmllczogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKClcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiB0aGUgZW50aXJlIHNldCBvZiBlbnRyaWVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeSA9IG5ldyBSZXBsYXlTdWJqZWN0PEVbXT4oMSlcblxuICAvKipcbiAgICogQ3JlYXRlIG5vdGlmaWNhdGlvbnMgdGhhdCBicm9hY2FzdFxuICAgKiBzdG9yZSBvciBzbGljZSBkZWx0YSBzdGF0ZSBjaGFuZ2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeURlbHRhID0gbmV3IFJlcGxheVN1YmplY3Q8RGVsdGE8RT4+KDEpXG5cbiAgLyoqXG4gICAqIENhbGwgYWxsIHRoZSBub3RpZmllcnMgYXQgb25jZS5cbiAgICpcbiAgICogQHBhcmFtIHZcbiAgICogQHBhcmFtIGRlbHRhXG4gICAqL1xuICBwcm90ZWN0ZWQgbm90aWZ5QWxsKHY6IEVbXSwgZGVsdGE6IERlbHRhPEU+KSB7XG4gICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgc3RvcmUgc3RhdGUgY2hhbmdlcy5cbiAgICogQHBhcmFtIHNvcnQgT3B0aW9uYWwgc29ydGluZyBmdW5jdGlvbiB5aWVsZGluZyBhIHNvcnRlZCBvYnNlcnZhYmxlLlxuICAgKiBAZXhhbXBsZVxuYGBgXG5sZXQgdG9kb3MkID0gc291cmNlLm9ic2VydmUoKTtcbi8vb3Igd2l0aCBhIHNvcnQgYnkgdGl0bGUgZnVuY3Rpb25cbmxldCB0b2RvcyQgPSBzb3VyY2Uub2JzZXJ2ZSgoYSwgYik9PihhLnRpdGxlID4gYi50aXRsZSA/IC0xIDogMSkpO1xuYGBgXG4gICovXG4gIHB1YmxpYyBvYnNlcnZlKHNvcnQ/OiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlcik6IE9ic2VydmFibGU8RVtdPiB7XG4gICAgaWYgKHNvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZTogRVtdKSA9PiBlLnNvcnQoc29ydCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIE9ic2VydmFibGU8RVtdPiByZWZlcmVuY2VcbiAgICogdG8gdGhlIGVudGl0aWVzIGluIHRoZSBzdG9yZSBvclxuICAgKiBTbGljZSBpbnN0YW5jZS5cbiAgICogXG4gICAqL1xuICAgcHVibGljIG9iczogT2JzZXJ2YWJsZTxFW10+ID0gdGhpcy5vYnNlcnZlKClcblxuXG5cbiAgLyoqXG4gICAqIE9ic2VydmUgZGVsdGEgdXBkYXRlcy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IHRvZG9zJCA9IHNvdXJjZS5vYnNlcnZlRGVsdGEoKTtcbiAgICAgPC9wcmU+XG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZURlbHRhKCk6IE9ic2VydmFibGU8RGVsdGE8RT4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlEZWx0YS5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB3aGV0aGVyIHRoZSBzdG9yZSBpcyBlbXB0eS5cbiAgICogXG4gICAqIEByZXR1cm4gQSBob3Qge0BsaW5rIE9ic2VydmFibGV9IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICA8cHJlPlxuICAgIHNvdXJjZS5pc0VtcHR5KCk7XG4gICAgPC9wcmU+XG4gICovXG4gIGlzRW1wdHkoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5LnBpcGUoXG4gICAgICBtYXAoKGVudHJpZXM6IEVbXSkgPT4gZW50cmllcy5sZW5ndGggPT0gMClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQHJldHVybiBBIHNuYXBzaG90IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBzb3VyY2UuaXNFbXB0eSgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBpc0VtcHR5U25hcHNob3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5sZW5ndGggPT0gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBjb250YWluZWQuXG4gICAqIEBwYXJhbSBwIFRoZSBwcmVkaWNhdGUgdG8gYXBwbHkgaW4gb3JkZXIgdG8gZmlsdGVyIHRoZSBjb3VudFxuICAgKi9cbiAgY291bnQocD86IFByZWRpY2F0ZTxFPik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgaWYgKHApIHtcbiAgICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKFxuICAgICAgICBtYXAoKGU6IEVbXSkgPT4gZS5yZWR1Y2UoKHRvdGFsLCBlKSA9PiB0b3RhbCArIChwKGUpID8gMSA6IDApLCAwKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGlmeS5waXBlKG1hcCgoZW50cmllczogRVtdKSA9PiBlbnRyaWVzLmxlbmd0aCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY29udGFpbmVkIGluIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIHAgVGhlIHByZWRpY2F0ZSB0byBhcHBseSBpbiBvcmRlciB0byBmaWx0ZXIgdGhlIGNvdW50XG4gICAqL1xuICBjb3VudFNuYXBzaG90KHA/OiBQcmVkaWNhdGU8RT4pOiBudW1iZXIge1xuICAgIGlmIChwKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZpbHRlcihwKS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYXBzaG90IG9mIGFsbCBlbnRyaWVzLlxuICAgKiBcbiAgICogQHJldHVybiBTbmFwc2hvdCBhcnJheSBvZiBhbGwgdGhlIGVsZW1lbnRzIHRoZSBlbnRpdGllcyB0aGUgc3RvcmUgY29udGFpbnMuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBPYnNlcnZlIGEgc25hcHNob3Qgb2YgYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgc3RvcmUuXG5gYGBcbmxldCBzZWxlY3RlZFRvZG9zOlRvZG9bXSA9IHNvdXJjZS5hbGxTbmFwc2hvdCgpO1xuYGBgXG4gICAqL1xuICBhbGxTbmFwc2hvdCgpOiBFW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRyaWVzIGNvbnRhaW4gdGhlIGlkZW50aWZpZWQgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gdGFyZ2V0IEVpdGhlciBhbiBpbnN0YW5jZSBvZiB0eXBlIGBFYCBvciBhIGBndWlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcGFyYW0gYnlJZCBXaGV0aGVyIHRoZSBsb29rdXAgc2hvdWxkIGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBgaWRgIGtleSByYXRoZXIgdGhhbiB0aGUgYGd1aWRgLlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBndWlkIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnModGFyZ2V0OiBFIHwgc3RyaW5nKTpib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHRoaXMuZW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgZ3VpZDogc3RyaW5nID0gKDxhbnk+dGFyZ2V0KVt0aGlzLmNvbmZpZy5ndWlkS2V5XTtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLmdldChndWlkKSA/IHRydWUgOiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJpZXMgY29udGFpbiB0aGUgaWRlbnRpZmllZCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBwYXJhbSB0YXJnZXQgRWl0aGVyIGFuIGluc3RhbmNlIG9mIHR5cGUgYEVgIG9yIGEgYGlkYCBpZGVudGlmeWluZyB0aGUgaW5zdGFuY2UuIFxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpbnN0YW5jZSBpZGVudGlmaWVkIGJ5IHRoZSBgaWRgIGV4aXN0cywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKiBcbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICAgbGV0IGNvbnRhaW5zOmJvb2xlYW4gPSBzb3VyY2UuY29udGFpbnMoZ3VpZCk7XG4gICAgIDwvcHJlPlxuICAgKi9cbiAgY29udGFpbnNCeUlkKHRhcmdldDogRSB8IHN0cmluZyk6Ym9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB0YXJnZXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQodGFyZ2V0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaWQ6IHN0cmluZyA9ICg8YW55PnRhcmdldClbdGhpcy5jb25maWcuaWRLZXldO1xuICAgIHJldHVybiB0aGlzLmlkRW50cmllcy5nZXQoaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIEdVSUQgcGFyYW1ldGVyXG4gICAqIGlmIGl0IGV4aXN0cyBhbmQgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gZ3VpZFxuICAgKiBAcmV0dXJuIFRoZSBlbnRpdHkgaW5zdGFuY2UgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZVxuICAgKi9cbiAgZmluZE9uZShndWlkOiBzdHJpbmcpOiBFIHwgdW5kZWZpbmVke1xuICAgIHJldHVybiB0aGlzLmVudHJpZXMuZ2V0KGd1aWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHJldHVybiB0aGUgZW50aXR5IGlkZW50aWZpZWQgYnkgdGhlIElEIHBhcmFtZXRlclxuICAgKiBpZiBpdCBleGlzdHMgYW5kIHJldHVybiBpdC5cbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEByZXR1cm4gVGhlIGVudGl0eSBpbnN0YW5jZSBpZiBpdCBleGlzdHMsIG51bGwgb3RoZXJ3aXNlXG4gICAqL1xuICBmaW5kT25lQnlJRChpZDogc3RyaW5nKTogRSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaWRFbnRyaWVzLmdldChpZCk7XG4gIH1cblxuICAvKipcbiAgICogU25hcHNob3Qgb2YgdGhlIGVudHJpZXMgdGhhdCBtYXRjaCB0aGUgcHJlZGljYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlIHVzZWQgdG8gcXVlcnkgZm9yIHRoZSBzZWxlY3Rpb24uXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBhcnJheSBjb250YWluaW5nIHRoZSBlbnRpdGllcyB0aGF0IG1hdGNoIHRoZSBwcmVkaWNhdGUuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBTZWxlY3QgYWxsIHRoZSBgVG9kb2AgaW5zdGFuY2Ugd2hlcmUgdGhlIGB0aXRsZWAgbGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAxMDAuIFxuYGBgXG5sZXQgdG9kb3M6VG9kb1tdPXN0b3JlLnNlbGVjdCh0b2RvPT50b2RvLnRpdGxlLmxlbmd0aD4xMDApO1xuYGBgXG4gICAqL1xuICBzZWxlY3QocDogUHJlZGljYXRlPEU+KTogRVtdIHtcbiAgICBjb25zdCBzZWxlY3RlZDogRVtdID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICBpZiAocChlKSkge1xuICAgICAgICBzZWxlY3RlZC5wdXNoKGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxuXG4gIC8qKiBcbiAgICogQ29tcGFyZSBlbnRpdGllcyBieSBHVUlEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBHVUlEIGlkc1xuICAgKiBAZXhhbXBsZSBDb21wYXJlIGB0b2RvMWAgd2l0aCBgdG9kbzJgIGJ5IGBnaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlHVUlEKHRvZG8xLCB0b2RvMikpey4uLn07XG5gYGBcbiAgICovXG4gIGVxdWFsc0J5R1VJRChlMTphbnksIGUyOmFueSkge1xuICAgIHJldHVybiBlMVt0aGlzLkdVSURfS0VZXSA9PSBlMlt0aGlzLkdVSURfS0VZXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wYXJlIGVudGl0aWVzIGJ5IElEIFxuICAgKiBAcGFyYW0gZTEgVGhlIGZpcnN0IGVudGl0eVxuICAgKiBAcGFyYW0gZTIgVGhlIHNlY29uZCBlbnRpdHlcbiAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0d28gZW50aXRpZXMgaGF2ZSBlcXVhbCBJRCBpZHNcbiAgICogQGV4YW1wbGUgQ29tcGFyZSBgdG9kbzFgIHdpdGggYHRvZG8yYCBieSBgaWRgLlxuYGBgXG5pZiAoZXF1YWxzQnlJRCh0b2RvMSwgdG9kbzIpKXsuLi59O1xuYGBgXG4gICAqL1xuICBlcXVhbHNCeUlEKGUxOmFueSwgZTI6YW55KSB7XG4gICAgcmV0dXJuIGUxW3RoaXMuSURfS0VZXSA9PSBlMlt0aGlzLklEX0tFWV07XG4gIH1cbiAgLyoqXG4gICAqIENhbGxzIGNvbXBsZXRlIG9uIGFsbCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqIFxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm5vdGlmeS5jb21wbGV0ZSgpO1xuICAgIHRoaXMubm90aWZ5RGVsdGEuY29tcGxldGUoKTtcbiAgICB0aGlzLm5vdGlmeVF1ZXJ5LmNvbXBsZXRlKCk7XG4gIH1cbn0iXX0=
@@ -86,7 +86,7 @@ export class EStore extends AbstractStore {
86
86
  * Store slices
87
87
  */
88
88
  this.slices = new Map();
89
- const delta = { type: "Initialize" /* INTIALIZE */, entries: entities };
89
+ const delta = { type: "Initialize" /* ActionTypes.INTIALIZE */, entries: entities };
90
90
  this.post(entities);
91
91
  this.notifyDelta.next(delta);
92
92
  }
@@ -350,7 +350,7 @@ export class EStore extends AbstractStore {
350
350
  });
351
351
  //Create a new array reference to trigger Angular change detection.
352
352
  let v = [...Array.from(this.entries.values())];
353
- const delta = { type: "Post" /* POST */, entries: [e] };
353
+ const delta = { type: "Post" /* ActionTypes.POST */, entries: [e] };
354
354
  this.notifyAll(v, delta);
355
355
  }
356
356
  else {
@@ -379,7 +379,7 @@ export class EStore extends AbstractStore {
379
379
  });
380
380
  //Create a new array reference to trigger Angular change detection.
381
381
  let v = [...Array.from(this.entries.values())];
382
- const delta = { type: "Post" /* POST */, entries: e };
382
+ const delta = { type: "Post" /* ActionTypes.POST */, entries: e };
383
383
  this.notifyAll(v, delta);
384
384
  }
385
385
  /**
@@ -408,7 +408,7 @@ export class EStore extends AbstractStore {
408
408
  this.updateIDEntry(e);
409
409
  let v = [...Array.from(this.entries.values())];
410
410
  this.notify.next(v);
411
- const delta = { type: "Put" /* PUT */, entries: [e] };
411
+ const delta = { type: "Put" /* ActionTypes.PUT */, entries: [e] };
412
412
  this.notifyDelta.next(delta);
413
413
  Array.from(this.slices.values()).forEach(s => {
414
414
  s.put(e);
@@ -447,7 +447,7 @@ export class EStore extends AbstractStore {
447
447
  //Create a new array reference to trigger Angular change detection.
448
448
  let v = [...Array.from(this.entries.values())];
449
449
  this.notify.next(v);
450
- const delta = { type: "Put" /* PUT */, entries: e };
450
+ const delta = { type: "Put" /* ActionTypes.PUT */, entries: e };
451
451
  this.notifyDelta.next(delta);
452
452
  Array.from(this.slices.values()).forEach(s => {
453
453
  s.putA(e);
@@ -472,7 +472,7 @@ export class EStore extends AbstractStore {
472
472
  });
473
473
  //Create a new array reference to trigger Angular change detection.
474
474
  let v = [...Array.from(this.entries.values())];
475
- const delta = { type: "Delete" /* DELETE */, entries: [e] };
475
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
476
476
  this.notifyAll(v, delta);
477
477
  Array.from(this.slices.values()).forEach(s => {
478
478
  s.delete(e);
@@ -513,7 +513,7 @@ export class EStore extends AbstractStore {
513
513
  });
514
514
  //Create a new array reference to trigger Angular change detection.
515
515
  let v = [...Array.from(this.entries.values())];
516
- const delta = { type: "Delete" /* DELETE */, entries: e };
516
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: e };
517
517
  this.notifyAll(v, delta);
518
518
  Array.from(this.slices.values()).forEach(s => {
519
519
  s.deleteA(e);
@@ -540,7 +540,7 @@ export class EStore extends AbstractStore {
540
540
  });
541
541
  //Create a new array reference to trigger Angular change detection.
542
542
  let v = [...Array.from(this.entries.values())];
543
- const delta = { type: "Delete" /* DELETE */, entries: d };
543
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
544
544
  this.notifyAll(v, delta);
545
545
  Array.from(this.slices.values()).forEach(s => {
546
546
  s.deleteA(d);
@@ -581,7 +581,7 @@ export class EStore extends AbstractStore {
581
581
  */
582
582
  reset() {
583
583
  const delta = {
584
- type: "Reset" /* RESET */,
584
+ type: "Reset" /* ActionTypes.RESET */,
585
585
  entries: Array.from(this.entries.values())
586
586
  };
587
587
  this.notifyAll([], delta);
@@ -601,4 +601,4 @@ export class EStore extends AbstractStore {
601
601
  this.notifyLoading.next(this.loading);
602
602
  }
603
603
  }
604
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sTUFBVSxTQUFRLGFBQWdCO0lBQzdDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxXQUFnQixFQUFFLEVBQUUsTUFBb0I7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNENoQjs7V0FFRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxhQUFhLENBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRzVEOzs7O1dBSUc7UUFDSSxXQUFNLEdBQW1CLElBQUksR0FBRyxFQUFFLENBQUM7UUF3RzFDOzs7OztXQUtHO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUV0RDs7Ozs7Ozs7OztXQVVHO1FBQ0ssYUFBUSxHQUFZLElBQUksQ0FBQztRQStEakM7Ozs7O1dBS0c7UUFDSyxvQkFBZSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXhEOzs7OztXQUtHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQStDcEM7O1dBRUc7UUFDSyxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFoVGhELE1BQU0sS0FBSyxH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QUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYnN0cmFjdFN0b3JlIH0gZnJvbSAnLi9BYnN0cmFjdFN0b3JlJztcbmltcG9ydCB7IFN0b3JlQ29uZmlnIH0gZnJvbSAnLi9tb2RlbHMvU3RvcmVDb25maWcnO1xuaW1wb3J0IHsgR1VJRCB9IGZyb20gJy4vdXRpbGl0aWVzJztcblxuaW1wb3J0IHsgQWN0aW9uVHlwZXMsIFByZWRpY2F0ZSwgRGVsdGEgfSBmcm9tICcuL21vZGVscy8nO1xuaW1wb3J0IHsgUmVwbGF5U3ViamVjdCwgb2YsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VXaGlsZSwgZmlsdGVyLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTbGljZSB9IGZyb20gJy4vU2xpY2UnO1xuXG4vKipcbiAqIFRoaXMgYHRvZG9GYWN0b3J5YCBjb2RlIHdpbGwgYmUgdXNlZCB0byBpbGx1c3RyYXRlIHRoZSBBUEkgZXhhbXBsZXMuICBUaGUgZm9sbG93aW5nXG4gKiB1dGlsaXRpZXMgYXJlIHVzZWQgaW4gdGhlIHRlc3RzIGFuZCB0aGUgQVBJIFR5cGVkb2MgZXhhbXBsZXMgY29udGFpbmVkIGhlcmUuXG4gKiBAZXhhbXBsZSBVdGlsaXRpZXMgZm9yIEFQSSBFeGFtcGxlc1xuYGBgXG5leHBvcnQgY29uc3QgZW51bSBUb2RvU2xpY2VFbnVtIHtcbiAgQ09NUExFVEUgPSBcIkNvbXBsZXRlXCIsXG4gIElOQ09NUExFVEUgPSBcIkluY29tcGxldGVcIlxufVxuXG5leHBvcnQgY2xhc3MgVG9kbyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wbGV0ZTogYm9vbGVhbiwgcHVibGljIHRpdGxlOiBzdHJpbmcscHVibGljIGdpZD86c3RyaW5nLCBwdWJsaWMgaWQ/OnN0cmluZykge31cbn1cblxuZXhwb3J0IGxldCB0b2RvcyA9IFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBuZXcgVG9kbyh0cnVlLCBcIllvdSBjb21wbGV0ZWQgbWUhXCIpXTtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvZG9zRmFjdG9yeSgpOlRvZG9bXSB7XG4gIHJldHVybiBbbmV3IFRvZG8oZmFsc2UsIFwiWW91IGNvbXBsZXRlIG1lIVwiKSwgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG59XG4gYGBgIFxuICovXG5cbmV4cG9ydCBjbGFzcyBFU3RvcmU8RT4gZXh0ZW5kcyBBYnN0cmFjdFN0b3JlPEU+IHtcbiAgLyoqXG4gICAqIFN0b3JlIGNvbnN0cnVjdG9yIChJbml0aWFsaXphdGlvbiB3aXRoIGVsZW1lbnQgaXMgb3B0aW9uYWwpXG4gICAqXG4gICAqIHBlcmZvcm0gaW5pdGlhbCBub3RpZmljYXRpb24gdG8gYWxsIG9ic2VydmVycyxcbiAgICogc3VjaCB0aGF0IGZ1bmN0aW9uIGxpa2Uge0BsaW5rIGNvbWJpbmVMYXRlc3R9e31cbiAgICogd2lsbCBleGVjdXRlIGF0IGxlYXN0IG9uY2UuXG4gICAqIEBwYXJhbSBlbnRpdGllc1xuICAgKiBAZXhhbXBsZSBEeW5hbWljIGBFU3RvcmU8VG9kbz5gIENyZWF0aW9uIFxuYGBgXG4vLyBJbml0aWFsaXplIHRoZSBTdG9yZVxubGV0IHN0b3JlOiBFU3RvcmU8VG9kbz4gPSBuZXcgRVN0b3JlPFRvZG8+KHRvZG9zRmFjdG9yeSgpKTtcbmBgYCovXG4gIGNvbnN0cnVjdG9yKGVudGl0aWVzOiBFW10gPSBbXSwgY29uZmlnPzogU3RvcmVDb25maWcpIHtcbiAgICBzdXBlcihjb25maWcpO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuSU5USUFMSVpFLCBlbnRyaWVzOiBlbnRpdGllcyB9O1xuICAgIHRoaXMucG9zdChlbnRpdGllcylcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGNvbXBsZXRlIG9uIGFsbCB7QGxpbmsgQmVoYXZpb3JTdWJqZWN0fSBpbnN0YW5jZXMuXG4gICAqIFxuICAgKiBDYWxsIGRlc3Ryb3kgd2hlbiBkaXNwb3Npbmcgb2YgdGhlIHN0b3JlLlxuICAgKi9cbiAgZGVzdHJveSgpIHtcbiAgICBzdXBlci5kZXN0cm95KClcbiAgICB0aGlzLm5vdGlmeUxvYWRpbmcuY29tcGxldGUoKVxuICAgIHRoaXMubm90aWZ5QWN0aXZlLmNvbXBsZXRlKClcbiAgICB0aGlzLnNsaWNlcy5mb3JFYWNoKHNsaWNlID0+IHNsaWNlLmRlc3Ryb3koKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGVzIHRoZSBlbnRpdHk6XG4gICAqIFxuICAgKiBJZiB0aGUgc3RvcmUgY29udGFpbnMgdGhlIGVudGl0eVxuICAgKiBpdCB3aWxsIGJlIGRlbGV0ZWQuICBJZiB0aGUgc3RvcmUgXG4gICAqIGRvZXMgbm90IGNvbnRhaW5zIHRoZSBlbnRpdHksXG4gICAqIGl0IGlzIGFkZGVkLlxuICAgKiBAcGFyYW0gZSBcbiAgICogQGV4YW1wbGUgVG9nZ2xlIHRoZSBgVG9kb2AgaW5zdGFuY2VcbmBgYFxuZXN0b3JlLnBvc3QodG9kbyk7XG4vLyBSZW1vdmUgdG9kb1xuZXN0b3JlLnRvZ2dsZSh0b2RvKTtcbi8vIEFkZCBpdCBiYWNrXG5lc3RvcmUudG9nZ2xlKHRvZG8pO1xuXG5gYGBcbiAgICovXG4gIHB1YmxpYyB0b2dnbGUoZTogRSkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5zKGUpKSB7XG4gICAgICB0aGlzLmRlbGV0ZShlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wb3N0KGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgd2hlbiB0aGUgc3RvcmUgaXMgZW1wdHkuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeUFjdGl2ZSA9IG5ldyBSZXBsYXlTdWJqZWN0PE1hcDxzdHJpbmcsIEU+PigxKTtcblxuXG4gIC8qKlxuICAgKiBgTWFwYCBvZiBhY3RpdmUgZW50dGllcy4gVGhlIGluc3RhbmNlIGlzIHB1YmxpYyBhbmQgY2FuIGJlIHVzZWRcbiAgICogZGlyZWN0bHkgdG8gYWRkIGFuZCByZW1vdmUgYWN0aXZlIGVudGl0aWVzLCBob3dldmVyIHdlIHJlY29tbWVuZFxuICAgKiB1c2luZyB0aGUge0BsaW5rIGFkZEFjdGl2ZX0gYW5kIHtAbGluayBkZWxldGVBY3RpdmV9IG1ldGhvZHMuXG4gICAqL1xuICBwdWJsaWMgYWN0aXZlOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKTtcblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIGVudGl0eSBlbnRpdGllcyB0byBhY3RpdmUuXG4gICAqIFxuICAgKiBJZiB0aGUgZW50aXR5IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIHN0b3JlIGl0IGlzIGFkZGVkXG4gICAqIHRvIHRoZSBzdG9yZSBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gYGFjdGl2ZWAuXG4gICAqIFxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyIFxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIGluIHRoZSBldmVudCB0aGF0IGl0IG1haW50YWlucyBcbiAgICogYSByZWZlcmVuY2UgdG8gdGhlIGBhY3RpdmVgIHN0YXRlIGBNYXBgIGluc3RhbmNlLlxuICAgKiBcbiAgICogQGV4YW1wbGUgQWRkIGEgYHRvZG8xYCBhbmQgYHRvZG8yYCBhcyBhY3RpdmVcbmBgYFxuYWRkQWN0aXZlKHRvZG8xKTtcbmFkZEFjdGl2ZSh0b2RvMik7XG5gYGBcbiAgICovXG4gIHB1YmxpYyBhZGRBY3RpdmUoZTogRSkge1xuICAgIGlmICh0aGlzLmNvbnRhaW5zKGUpKSB7XG4gICAgICB0aGlzLmFjdGl2ZS5zZXQoKDxhbnk+ZSkuZ2lkLCBlKTtcbiAgICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICAgIHRoaXMuYWN0aXZlLnNldCgoPGFueT5lKS5naWQsIGUpO1xuICAgICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBhbiBlbnRpdHkgYXMgYWN0aXZlLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIE1hcmsgYSBgdG9kb2AgaW5zdGFuY2UgYXMgYWN0aXZlXG4gIGBgYFxuZGVsZXRlQWN0aXZlKHRvZG8xKTtcbmRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gIGBgYFxuICAgKi9cbiAgcHVibGljIGRlbGV0ZUFjdGl2ZShlOiBFKSB7XG4gICAgdGhpcy5hY3RpdmUuZGVsZXRlKCg8YW55PmUpLmdpZCk7XG4gICAgdGhpcy5ub3RpZnlBY3RpdmUubmV4dChuZXcgTWFwKHRoaXMuYWN0aXZlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgLyByZXNldCB0aGUgYWN0aXZlIGVudGl0eSBtYXAuXG4gICAqIFxuICAgKiBBbHNvIHdlIGNsb25lIHRoZSBtYXAgcHJpb3IgdG8gYnJvYWRjYXN0aW5nIGl0IHdpdGhcbiAgICogYG5vdGlmeUFjdGl2ZWAgdG8gbWFrZSBzdXJlIHdlIHdpbGwgdHJpZ2dlciBBbmd1bGFyIFxuICAgKiBjaGFuZ2UgZGV0ZWN0aW9uIGluIHRoZSBldmVudCB0aGF0IGl0IG1haW50YWlucyBcbiAgICogYSByZWZlcmVuY2UgdG8gdGhlIGBhY3RpdmVgIHN0YXRlIGBNYXBgIGluc3RhbmNlLlxuICAgKiBcbiAgICogQGV4YW1wbGUgTWFyayBhIGB0b2RvYCBpbnN0YW5jZSBhcyBhY3RpdmVcbiAgYGBgXG5kZWxldGVBY3RpdmUodG9kbzEpO1xuZGVsZXRlQWN0aXZlKHRvZG8yKTtcbiAgYGBgXG4gICAqL1xuICBjbGVhckFjdGl2ZSgpIHtcbiAgICB0aGlzLmFjdGl2ZS5jbGVhcigpO1xuICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgdGhlIGFjdGl2ZSBlbnRpdHkuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IGFjdGl2ZSQgPSBzb3VyY2Uub2JzZXJ2ZUFjdGl2ZSgpO1xuICAgIDwvcHJlPlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUFjdGl2ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlBY3RpdmUuYXNPYnNlcnZhYmxlKClcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXR5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBhY3RpdmUkID0gc291cmNlLmFjdGl2ZVNuYXBzaG90KCk7XG4gICAgPC9wcmU+XG4gICovXG4gICAgcHVibGljIGFjdGl2ZVNuYXBzaG90KCkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5hY3RpdmUudmFsdWVzKCkpXG4gIH1cblxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIExPQURJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGEgbG9hZCByZXF1ZXN0LlxuICAgKiBcbiAgICogVGhlIGVycm9yIE9ic2VydmFibGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgbG9hZGluZ0Vycm9yITogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyBvYnNlcnZlcnMgd2hlbiB0aGUgc3RvcmUgaXMgbG9hZGluZy5cbiAgICogXG4gICAqIFRoaXMgaXMgYSBjb21tb24gcGF0dGVybiBmb3VuZCB3aGVuIGltcGxlbWVudGluZ1xuICAgKiBgT2JzZXJ2YWJsZWAgZGF0YSBzb3VyY2VzLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlMb2FkaW5nID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdGUuICBVc2UgbG9hZGluZyB3aGVuIGZldGNoaW5nIG5ld1xuICAgKiBkYXRhIGZvciB0aGUgc3RvcmUuICBUaGUgZGVmYXVsdCBsb2FkaW5nIHN0YXRlIGlzIGB0cnVlYC5cbiAgICogXG4gICAqIFRoaXMgaXMgc3VjaCB0aGF0IGlmIGRhdGEgaXMgZmV0Y2hlZCBhc3luY2hyb25vdXNseSBcbiAgICogaW4gYSBzZXJ2aWNlLCBjb21wb25lbnRzIGNhbiB3YWl0IG9uIGxvYWRpbmcgbm90aWZpY2F0aW9uXG4gICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGRhdGEgZnJvbSB0aGUgc2VydmljZS5cbiAgICpcbiAgICogTG9hZGluZyBjb3VsZCBiZSBiYXNlZCBvbiBhIGNvbXBvc2l0ZSByZXNwb25zZS4gIEZvciBleGFtcGxlXG4gICAqIHdoZW4gdGhlIHN0b2NrIGFuZCBtdXR1YWwgZnVuZHMgaGF2ZSBsb2FkZWQsIHNldCBsb2FkaW5nIHRvIGBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIF9sb2FkaW5nOiBib29sZWFuID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBsb2FkaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgbG9hZGluZyhsb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5fbG9hZGluZyA9IGxvYWRpbmc7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLm5leHQodGhpcy5fbG9hZGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBsb2FkaW5nIHN0YXRlLlxuICAgKi9cbiAgZ2V0IGxvYWRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBsb2FkaW5nLlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBsb2FkaW5nJCA9IHNvdXJjZS5vYnNlcnZlTG9hZGluZygpO1xuICAgIDwvcHJlPlxuXG4gICAgTm90ZSB0aGF0IHRoaXMgb2J2ZXJhYmxlIHBpcGVkIHRocm91Z2hcbiAgICBgdGFrZVdoaWxlKHYtPnYsIHRydWUpLCBzdWNoIHRoYXQgaXQgd2lsbCBcbiAgICBjb21wbGV0ZSBhZnRlciBlYWNoIGVtaXNzaW9uLlxuXG4gICAgU2VlOlxuICAgIGh0dHBzOi8vbWVkaXVtLmNvbS9Ab2xlLmVyc295L3dhaXRpbmctb24tZXN0b3JlLXRvLWxvYWQtOGRjYmUxNjE2MTNjXG5cbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZUxvYWRpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5TG9hZGluZy5hc09ic2VydmFibGUoKS5cbiAgICAgIHBpcGUodGFrZVdoaWxlKHYgPT4gdiwgdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGZpaWVzIHdoZW4gbG9hZGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVMb2FkaW5nQ29tcGxldGUoKSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZUxvYWRpbmcoKS5waXBlKFxuICAgICAgZmlsdGVyKGxvYWRpbmcgPT4gbG9hZGluZyA9PSBmYWxzZSksXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gb2YodHJ1ZSkpKVxuICB9XG5cblxuXG5cblxuXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNFQVJDSElOR1xuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBvZiBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIGEgc2VhcmNoIHJlcXVlc3QuXG4gICAqIFxuICAgKiBUaGUgZXJyb3IgT2JzZXJ2YWJsZSBzaG91bGQgYmUgY3JlYXRlZCBieSB0aGUgXG4gICAqIGNsaWVudC5cbiAgICovXG4gIHB1YmxpYyBzZWFyY2hFcnJvciE6IE9ic2VydmFibGU8YW55PjtcblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHRoYXQgYSBzZWFyY2ggaXMgaW4gcHJvZ3Jlc3MuXG4gICAqIFxuICAgKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gZm91bmQgd2hlbiBpbXBsZW1lbnRpbmdcbiAgICogYE9ic2VydmFibGVgIGRhdGEgc291cmNlcy5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5U2VhcmNoaW5nID0gbmV3IFJlcGxheVN1YmplY3Q8Ym9vbGVhbj4oMSk7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGBzZWFyY2hpbmdgIHN0YXRlLiAgVXNlIGBzZWFyY2hpbmdgXG4gICAqIGZvciBleGFtcGxlIHRvIGRpc3BsYXkgYSBzcGlubm5lciBcbiAgICogd2hlbiBwZXJmb3JtaW5nIGEgc2VhcmNoLiAgXG4gICAqIFRoZSBkZWZhdWx0IGBzZWFyY2hpbmdgIHN0YXRlIGlzIGBmYWxzZWAuXG4gICAqL1xuICBwcml2YXRlIF9zZWFyY2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyB0aGUgY3VycmVudCBzZWFyY2hpbmcgc3RhdGUgYW5kIG5vdGlmaWVzIG9ic2VydmVycy5cbiAgICovXG4gIHNldCBzZWFyY2hpbmcoc2VhcmNoaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2VhcmNoaW5nID0gc2VhcmNoaW5nO1xuICAgIHRoaXMubm90aWZ5U2VhcmNoaW5nLm5leHQodGhpcy5fc2VhcmNoaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIEEgc25hcHNob3Qgb2YgdGhlIHNlYXJjaGluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBzZWFyY2hpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NlYXJjaGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHNlYXJjaGluZy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgc2VhcmNoaW5nJCA9IHNvdXJjZS5vYnNlcnZlU2VhcmNoaW5nKCk7XG4gICAgPC9wcmU+XG4gIFxuICAgIE5vdGUgdGhhdCB0aGlzIG9idmVyYWJsZSBwaXBlZCB0aHJvdWdoXG4gICAgYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGwgXG4gICAgY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cbiAgXG4gICAgU2VlOlxuICAgIGh0dHBzOi8vbWVkaXVtLmNvbS9Ab2xlLmVyc295L3dhaXRpbmctb24tZXN0b3JlLXRvLWxvYWQtOGRjYmUxNjE2MTNjXG4gIFxuICAgIEZvciBtb3JlIGRldGFpbHMuXG4gICovXG4gIHB1YmxpYyBvYnNlcnZlU2VhcmNoaW5nKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLm5vdGlmeVNlYXJjaGluZy5hc09ic2VydmFibGUoKS5cbiAgICAgIHBpcGUodGFrZVdoaWxlKHYgPT4gdiwgdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGZpaWVzIHdoZW4gc2VhcmNoaW5nIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZ0NvbXBsZXRlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVTZWFyY2hpbmcoKS5waXBlKFxuICAgICAgZmlsdGVyKHNlYXJjaGluZyA9PiBzZWFyY2hpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9yZSBzbGljZXNcbiAgICovXG4gIHByaXZhdGUgc2xpY2VzOiBNYXA8c3RyaW5nLCBTbGljZTxFPj4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBzbGljZSB0byB0aGUgc3RvcmUgYW5kIGtleXMgaXQgYnkgdGhlIHNsaWNlcyBsYWJlbC5cbiAgICpcbiAgICogQHBhcmFtIHBcbiAgICogQHBhcmFtIGxhYmVsXG4gICAqIFxuICAgKiBAZXhhbXBsZSBTZXR1cCBhIFRvZG8gU2xpY2UgZm9yIENPTVBMRVRFIFRvZG9zXG5gYGBcbnNvdXJjZS5hZGRTbGljZSh0b2RvID0+IHRvZG8uY29tcGxldGUsIFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICBhZGRTbGljZShwOiBQcmVkaWNhdGU8RT4sIGxhYmVsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBzbGljZTogU2xpY2U8RT4gPSBuZXcgU2xpY2UoXG4gICAgICBsYWJlbCxcbiAgICAgIHAsXG4gICAgICB0aGlzKVxuICAgIHRoaXMuc2xpY2VzLnNldChzbGljZS5sYWJlbCwgc2xpY2UpXG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgc2xpY2VcbiAgICogQHBhcmFtIGxhYmVsIFRoZSBsYWJlbCBpZGVudGlmeWluZyB0aGUgc2xpY2VcbiAgICogXG4gICAqIEBleGFtcGxlIFJlbW92ZSB0aGUgVG9kb1NsaWNlcy5DT01QTEVURSBTbGljZVxuYGBgXG5zb3VyY2UucmVtb3ZlU2xpY2UoVG9kb1NsaWNlcy5DT01QTEVURSk7XG5gYGBcbiAgICovXG4gIHJlbW92ZVNsaWNlKGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNsaWNlcy5kZWxldGUobGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIHNsaWNlXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHNsaWNlXG4gICAqIEByZXR1cm4gVGhlIFNsaWNlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBcbiAgICogXG4gICAqIEBleGFtcGxlIEdldCB0aGUgVG9kb1NsaWNlcy5DT01QTEVURSBzbGljZVxuYGBgXG5zb3VyY2UuZ2V0U2xpY2UoVG9kb1NsaWNlcy5DT01QTEVURSk7XG5gYGBcbiAgICovXG4gIGdldFNsaWNlKGxhYmVsOiBzdHJpbmcpOiBTbGljZTxFPiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VzLmdldChsYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogUG9zdCAoQWRkIGEgbmV3KSBlbGVtZW50KHMpIHRvIHRoZSBzdG9yZS5cbiAgICogQHBhcmFtIGUgQW4gaW5kaWlkdWFsIGVudGl0eSBvciBhbiBhcnJheSBvZiBlbnRpdGllc1xuICAgKiBAZXhhbXBsZSBQb3N0IGEgYHRvZG9gLlxuYGBgXG5zdG9yZS5wb3N0KHRvZG8pO1xuYGBgXG4gICAqL1xuICBwb3N0KGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5wb3N0KGUpO1xuICAgICAgfSk7XG4gICAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucG9zdEEoZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9zdCBlbGVtZW50cyB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFBvc3QgdHdvIGBUb2RvYCBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLnBvc3QodG9kbzEsIHRvZG8yKTtcbmBgYFxuICAgKi9cbiAgcG9zdE4oLi4uZTogRVtdKSB7XG4gICAgZS5mb3JFYWNoKGUgPT4ge1xuICAgICAgY29uc3QgZ3VpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgPyAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA6IEdVSUQoKTtcbiAgICAgICg8YW55PmUpW3RoaXMuR1VJRF9LRVldID0gZ3VpZDtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSk7XG4gICAgICB0aGlzLnVwZGF0ZUlERW50cnkoZSk7XG4gICAgfSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMucG9zdEEoZSk7XG4gICAgfSk7XG4gICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBPU1QsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gIH1cblxuICAvKipcbiAgICogUG9zdCAoQWRkKSBhbiBhcnJheSBvZiBlbGVtZW50cyB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFBvc3QgYSBgVG9kb2AgYXJyYXkuXG5gYGBcbnN0b3JlLnBvc3QoW3RvZG8xLCB0b2RvMl0pO1xuYGBgXG4gICAqL1xuICBwb3N0QShlOiBFW10pIHtcbiAgICB0aGlzLnBvc3ROKC4uLmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCAoVXBkYXRlKSBhbiBlbGVtZW50LlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQdXQgYSBUb2RvIGluc3RhbmNlLlxuYGBgXG5zdG9yZS5wdXQodG9kbzEpO1xuYGBgXG4gICAqL1xuICBwdXQoZTogRSB8IEVbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgbGV0IGlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoaWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuUFVULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gICAgICBBcnJheS5mcm9tKHRoaXMuc2xpY2VzLnZhbHVlcygpKS5mb3JFYWNoKHMgPT4ge1xuICAgICAgICBzLnB1dChlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucHV0QShlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZWxlbWVudCBvciBhZGQgYW4gZWxlbWVudCB0aGF0IHdhcyByZWFkIGZyb20gYSBwZXJzaXN0ZW5jZSBzb3VyY2VcbiAgICogYW5kIHRodXMgYWxyZWFkeSBoYXMgYW4gYXNzaWduZWQgZ2xvYmFsIGlkYC5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IFRvZG8gaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wdXQodG9kbzEsIHRvZG8yKTtcbmBgYFxuICAgKi9cbiAgcHV0TiguLi5lOiBFW10pIHtcbiAgICB0aGlzLnB1dEEoZSk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IFRvZG8gaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wdXQoW3RvZG8xLCB0b2RvMl0pO1xuYGBgXG4gICAqL1xuICBwdXRBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIGxldCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKVxuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgdGhpcy5ub3RpZnkubmV4dCh2KTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogZSB9O1xuICAgIHRoaXMubm90aWZ5RGVsdGEubmV4dChkZWx0YSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMucHV0QShlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgKFVwZGF0ZSkgdGhlIGFycmF5IG9mIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBEZWxldGUgdG9kbzEuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMV0pO1xuYGBgXG4gICAqL1xuICBkZWxldGUoZTogRSB8IEVbXSkge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShlKSkge1xuICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICBjb25zdCBndWlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IFtlXSB9O1xuICAgICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5kZWxldGUoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmRlbGV0ZUEoZSlcbiAgICB9XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgTiBlbGVtZW50cy5cbiAgICogQHBhcmFtIC4uLmVcbiAgICogQGV4YW1wbGUgUHV0IFRvZG8gaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5kZWxldGUodG9kbzEsIHRvZG8yKTtcbmBgYFxuICAgKi9cbiAgZGVsZXRlTiguLi5lOiBFW10pIHtcbiAgICB0aGlzLmRlbGV0ZUEoZSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIE4gZWxlbWVudHMuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZUEoZTogRVtdKSB7XG4gICAgZS5mb3JFYWNoKGUgPT4ge1xuICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICBjb25zdCBndWlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGd1aWQpO1xuICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMuZGVsZXRlQShlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgZWxlbWVudHMgYnkge0BsaW5rIFByZWRpY2F0ZX0uXG4gICAqIEBwYXJhbSBwIFRoZSBwcmVkaWNhdGUuXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZVAocDogUHJlZGljYXRlPEU+KSB7XG4gICAgY29uc3QgZDogRVtdID0gW107XG4gICAgQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLmZvckVhY2goZSA9PiB7XG4gICAgICBpZiAocChlKSkge1xuICAgICAgICBkLnB1c2goZSk7XG4gICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgICAgICB0aGlzLmRlbGV0ZUFjdGl2ZShlKTtcbiAgICAgICAgdGhpcy5kZWxldGVJREVudHJ5KGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IGQgfTtcbiAgICB0aGlzLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMuZGVsZXRlQShkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gYWRkIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLnNldCgoPGFueT5lKVt0aGlzLklEX0tFWV0sIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZW50aXR5IGhhcyB0aGUgYGlkYCBrZXkgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbHVlLFxuICAgKiB0aGVuIGFsc28gZGVsZXRlIHRoZSBlbnRpdHkgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKlxuICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBhZGRlZCB0byB0aGUgYGlkRW50cmllc2AuXG4gICAqL1xuICBwcml2YXRlIGRlbGV0ZUlERW50cnkoZTogRSkge1xuICAgIGlmICgoPGFueT5lKVt0aGlzLklEX0tFWV0pIHtcbiAgICAgIHRoaXMuaWRFbnRyaWVzLmRlbGV0ZSgoPGFueT5lKVt0aGlzLklEX0tFWV0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIHN0b3JlIGFuZCBhbGwgY29udGFpbmVkIHNsaWNlIGluc3RhbmNlcyB0byBlbXB0eS5cbiAgICogQWxzbyBwZXJmb3JtIGRlbHRhIG5vdGlmaWNhdGlvbiB0aGF0IHNlbmRzIGFsbCBjdXJyZW50IHN0b3JlIGVudHJpZXMuXG4gICAqIFRoZSBBY3Rpb25UeXBlLlJFU0VUIGNvZGUgaXMgc2VudCB3aXRoIHRoZSBkZWx0YSBub3RpZmljYXRpb24uICBTbGljZXNcbiAgICogc2VuZCB0aGVpciBvd24gZGVsdGEgbm90aWZpY2F0aW9uLlxuICAgKiBcbiAgICogQGV4YW1wbGUgUmVzZXQgdGhlIHN0b3JlLlxuYGBgXG5zdG9yZS5yZXNldCgpO1xuYGBgXG4gICAqL1xuICByZXNldCgpIHtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7XG4gICAgICB0eXBlOiBBY3Rpb25UeXBlcy5SRVNFVCxcbiAgICAgIGVudHJpZXM6IEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKVxuICAgIH07XG4gICAgdGhpcy5ub3RpZnlBbGwoW10sIGRlbHRhKTtcbiAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgIHMucmVzZXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsIGFsbCB0aGUgbm90aWZpZXJzIGF0IG9uY2UuXG4gICAqXG4gICAqIEBwYXJhbSB2XG4gICAqIEBwYXJhbSBkZWx0YVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vdGlmeUFsbCh2OiBFW10sIGRlbHRhOiBEZWx0YTxFPikge1xuICAgIHN1cGVyLm5vdGlmeUFsbCh2LCBkZWx0YSk7XG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLm5leHQodGhpcy5sb2FkaW5nKTtcbiAgfVxufSJdfQ==
604
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRVN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi9FU3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHbkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxNQUFNLE9BQU8sTUFBVSxTQUFRLGFBQWdCO0lBQzdDOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsWUFBWSxXQUFnQixFQUFFLEVBQUUsTUFBb0I7UUFDbEQsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBNENoQjs7V0FFRztRQUNLLGlCQUFZLEdBQUcsSUFBSSxhQUFhLENBQWlCLENBQUMsQ0FBQyxDQUFDO1FBRzVEOzs7O1dBSUc7UUFDSSxXQUFNLEdBQW1CLElBQUksR0FBRyxFQUFFLENBQUM7UUF3RzFDOzs7OztXQUtHO1FBQ0ssa0JBQWEsR0FBRyxJQUFJLGFBQWEsQ0FBVSxDQUFDLENBQUMsQ0FBQztRQUV0RDs7Ozs7Ozs7OztXQVVHO1FBQ0ssYUFBUSxHQUFZLElBQUksQ0FBQztRQStEakM7Ozs7O1dBS0c7UUFDSyxvQkFBZSxHQUFHLElBQUksYUFBYSxDQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXhEOzs7OztXQUtHO1FBQ0ssZUFBVSxHQUFZLEtBQUssQ0FBQztRQStDcEM7O1dBRUc7UUFDSyxXQUFNLEdBQTBCLElBQUksR0FBRyxFQUFFLENBQUM7UUFoVGhELE1BQU0sS0FBSyxH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QUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3RTdG9yZSB9IGZyb20gJy4vQWJzdHJhY3RTdG9yZSc7XG5pbXBvcnQgeyBTdG9yZUNvbmZpZyB9IGZyb20gJy4vbW9kZWxzL1N0b3JlQ29uZmlnJztcbmltcG9ydCB7IEdVSUQgfSBmcm9tICcuL3V0aWxpdGllcyc7XG5cbmltcG9ydCB7IEFjdGlvblR5cGVzLCBQcmVkaWNhdGUsIERlbHRhIH0gZnJvbSAnLi9tb2RlbHMvJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG9mLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0YWtlV2hpbGUsIGZpbHRlciwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgU2xpY2UgfSBmcm9tICcuL1NsaWNlJztcblxuLyoqXG4gKiBUaGlzIGB0b2RvRmFjdG9yeWAgY29kZSB3aWxsIGJlIHVzZWQgdG8gaWxsdXN0cmF0ZSB0aGUgQVBJIGV4YW1wbGVzLiAgVGhlIGZvbGxvd2luZ1xuICogdXRpbGl0aWVzIGFyZSB1c2VkIGluIHRoZSB0ZXN0cyBhbmQgdGhlIEFQSSBUeXBlZG9jIGV4YW1wbGVzIGNvbnRhaW5lZCBoZXJlLlxuICogQGV4YW1wbGUgVXRpbGl0aWVzIGZvciBBUEkgRXhhbXBsZXNcbmBgYFxuZXhwb3J0IGNvbnN0IGVudW0gVG9kb1NsaWNlRW51bSB7XG4gIENPTVBMRVRFID0gXCJDb21wbGV0ZVwiLFxuICBJTkNPTVBMRVRFID0gXCJJbmNvbXBsZXRlXCJcbn1cblxuZXhwb3J0IGNsYXNzIFRvZG8ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcGxldGU6IGJvb2xlYW4sIHB1YmxpYyB0aXRsZTogc3RyaW5nLHB1YmxpYyBnaWQ/OnN0cmluZywgcHVibGljIGlkPzpzdHJpbmcpIHt9XG59XG5cbmV4cG9ydCBsZXQgdG9kb3MgPSBbbmV3IFRvZG8oZmFsc2UsIFwiWW91IGNvbXBsZXRlIG1lIVwiKSwgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2Rvc0ZhY3RvcnkoKTpUb2RvW10ge1xuICByZXR1cm4gW25ldyBUb2RvKGZhbHNlLCBcIllvdSBjb21wbGV0ZSBtZSFcIiksIG5ldyBUb2RvKHRydWUsIFwiWW91IGNvbXBsZXRlZCBtZSFcIildO1xufVxuIGBgYCBcbiAqL1xuXG5leHBvcnQgY2xhc3MgRVN0b3JlPEU+IGV4dGVuZHMgQWJzdHJhY3RTdG9yZTxFPiB7XG4gIC8qKlxuICAgKiBTdG9yZSBjb25zdHJ1Y3RvciAoSW5pdGlhbGl6YXRpb24gd2l0aCBlbGVtZW50IGlzIG9wdGlvbmFsKVxuICAgKlxuICAgKiBwZXJmb3JtIGluaXRpYWwgbm90aWZpY2F0aW9uIHRvIGFsbCBvYnNlcnZlcnMsXG4gICAqIHN1Y2ggdGhhdCBmdW5jdGlvbiBsaWtlIHtAbGluayBjb21iaW5lTGF0ZXN0fXt9XG4gICAqIHdpbGwgZXhlY3V0ZSBhdCBsZWFzdCBvbmNlLlxuICAgKiBAcGFyYW0gZW50aXRpZXNcbiAgICogQGV4YW1wbGUgRHluYW1pYyBgRVN0b3JlPFRvZG8+YCBDcmVhdGlvbiBcbmBgYFxuLy8gSW5pdGlhbGl6ZSB0aGUgU3RvcmVcbmxldCBzdG9yZTogRVN0b3JlPFRvZG8+ID0gbmV3IEVTdG9yZTxUb2RvPih0b2Rvc0ZhY3RvcnkoKSk7XG5gYGAqL1xuICBjb25zdHJ1Y3RvcihlbnRpdGllczogRVtdID0gW10sIGNvbmZpZz86IFN0b3JlQ29uZmlnKSB7XG4gICAgc3VwZXIoY29uZmlnKTtcbiAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLklOVElBTElaRSwgZW50cmllczogZW50aXRpZXMgfTtcbiAgICB0aGlzLnBvc3QoZW50aXRpZXMpXG4gICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxscyBjb21wbGV0ZSBvbiBhbGwge0BsaW5rIEJlaGF2aW9yU3ViamVjdH0gaW5zdGFuY2VzLlxuICAgKiBcbiAgICogQ2FsbCBkZXN0cm95IHdoZW4gZGlzcG9zaW5nIG9mIHRoZSBzdG9yZS5cbiAgICovXG4gIG92ZXJyaWRlIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpXG4gICAgdGhpcy5ub3RpZnlMb2FkaW5nLmNvbXBsZXRlKClcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5jb21wbGV0ZSgpXG4gICAgdGhpcy5zbGljZXMuZm9yRWFjaChzbGljZSA9PiBzbGljZS5kZXN0cm95KCkpXG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZW50aXR5OlxuICAgKiBcbiAgICogSWYgdGhlIHN0b3JlIGNvbnRhaW5zIHRoZSBlbnRpdHlcbiAgICogaXQgd2lsbCBiZSBkZWxldGVkLiAgSWYgdGhlIHN0b3JlIFxuICAgKiBkb2VzIG5vdCBjb250YWlucyB0aGUgZW50aXR5LFxuICAgKiBpdCBpcyBhZGRlZC5cbiAgICogQHBhcmFtIGUgXG4gICAqIEBleGFtcGxlIFRvZ2dsZSB0aGUgYFRvZG9gIGluc3RhbmNlXG5gYGBcbmVzdG9yZS5wb3N0KHRvZG8pO1xuLy8gUmVtb3ZlIHRvZG9cbmVzdG9yZS50b2dnbGUodG9kbyk7XG4vLyBBZGQgaXQgYmFja1xuZXN0b3JlLnRvZ2dsZSh0b2RvKTtcblxuYGBgXG4gICAqL1xuICBwdWJsaWMgdG9nZ2xlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5kZWxldGUoZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucG9zdChlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGVtcHR5LlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlBY3RpdmUgPSBuZXcgUmVwbGF5U3ViamVjdDxNYXA8c3RyaW5nLCBFPj4oMSk7XG5cblxuICAvKipcbiAgICogYE1hcGAgb2YgYWN0aXZlIGVudHRpZXMuIFRoZSBpbnN0YW5jZSBpcyBwdWJsaWMgYW5kIGNhbiBiZSB1c2VkXG4gICAqIGRpcmVjdGx5IHRvIGFkZCBhbmQgcmVtb3ZlIGFjdGl2ZSBlbnRpdGllcywgaG93ZXZlciB3ZSByZWNvbW1lbmRcbiAgICogdXNpbmcgdGhlIHtAbGluayBhZGRBY3RpdmV9IGFuZCB7QGxpbmsgZGVsZXRlQWN0aXZlfSBtZXRob2RzLlxuICAgKi9cbiAgcHVibGljIGFjdGl2ZTogTWFwPHN0cmluZywgRT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIEFkZCBtdWx0aXBsZSBlbnRpdHkgZW50aXRpZXMgdG8gYWN0aXZlLlxuICAgKiBcbiAgICogSWYgdGhlIGVudGl0eSBpcyBub3QgY29udGFpbmVkIGluIHRoZSBzdG9yZSBpdCBpcyBhZGRlZFxuICAgKiB0byB0aGUgc3RvcmUgYmVmb3JlIGl0IGlzIGFkZGVkIHRvIGBhY3RpdmVgLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIEFkZCBhIGB0b2RvMWAgYW5kIGB0b2RvMmAgYXMgYWN0aXZlXG5gYGBcbmFkZEFjdGl2ZSh0b2RvMSk7XG5hZGRBY3RpdmUodG9kbzIpO1xuYGBgXG4gICAqL1xuICBwdWJsaWMgYWRkQWN0aXZlKGU6IEUpIHtcbiAgICBpZiAodGhpcy5jb250YWlucyhlKSkge1xuICAgICAgdGhpcy5hY3RpdmUuc2V0KCg8YW55PmUpLmdpZCwgZSk7XG4gICAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3QoZSk7XG4gICAgICB0aGlzLmFjdGl2ZS5zZXQoKDxhbnk+ZSkuZ2lkLCBlKTtcbiAgICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYW4gZW50aXR5IGFzIGFjdGl2ZS5cbiAgICogXG4gICAqIEFsc28gd2UgY2xvbmUgdGhlIG1hcCBwcmlvciB0byBicm9hZGNhc3RpbmcgaXQgd2l0aFxuICAgKiBgbm90aWZ5QWN0aXZlYCB0byBtYWtlIHN1cmUgd2Ugd2lsbCB0cmlnZ2VyIEFuZ3VsYXIgXG4gICAqIGNoYW5nZSBkZXRlY3Rpb24gaW4gdGhlIGV2ZW50IHRoYXQgaXQgbWFpbnRhaW5zIFxuICAgKiBhIHJlZmVyZW5jZSB0byB0aGUgYGFjdGl2ZWAgc3RhdGUgYE1hcGAgaW5zdGFuY2UuXG4gICAqIFxuICAgKiBAZXhhbXBsZSBNYXJrIGEgYHRvZG9gIGluc3RhbmNlIGFzIGFjdGl2ZVxuICBgYGBcbmRlbGV0ZUFjdGl2ZSh0b2RvMSk7XG5kZWxldGVBY3RpdmUodG9kbzIpO1xuICBgYGBcbiAgICovXG4gIHB1YmxpYyBkZWxldGVBY3RpdmUoZTogRSkge1xuICAgIHRoaXMuYWN0aXZlLmRlbGV0ZSgoPGFueT5lKS5naWQpO1xuICAgIHRoaXMubm90aWZ5QWN0aXZlLm5leHQobmV3IE1hcCh0aGlzLmFjdGl2ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIC8gcmVzZXQgdGhlIGFjdGl2ZSBlbnRpdHkgbWFwLlxuICAgKiBcbiAgICogQWxzbyB3ZSBjbG9uZSB0aGUgbWFwIHByaW9yIHRvIGJyb2FkY2FzdGluZyBpdCB3aXRoXG4gICAqIGBub3RpZnlBY3RpdmVgIHRvIG1ha2Ugc3VyZSB3ZSB3aWxsIHRyaWdnZXIgQW5ndWxhciBcbiAgICogY2hhbmdlIGRldGVjdGlvbiBpbiB0aGUgZXZlbnQgdGhhdCBpdCBtYWludGFpbnMgXG4gICAqIGEgcmVmZXJlbmNlIHRvIHRoZSBgYWN0aXZlYCBzdGF0ZSBgTWFwYCBpbnN0YW5jZS5cbiAgICogXG4gICAqIEBleGFtcGxlIE1hcmsgYSBgdG9kb2AgaW5zdGFuY2UgYXMgYWN0aXZlXG4gIGBgYFxuZGVsZXRlQWN0aXZlKHRvZG8xKTtcbmRlbGV0ZUFjdGl2ZSh0b2RvMik7XG4gIGBgYFxuICAgKi9cbiAgY2xlYXJBY3RpdmUoKSB7XG4gICAgdGhpcy5hY3RpdmUuY2xlYXIoKTtcbiAgICB0aGlzLm5vdGlmeUFjdGl2ZS5uZXh0KG5ldyBNYXAodGhpcy5hY3RpdmUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnNlcnZlIHRoZSBhY3RpdmUgZW50aXR5LlxuICAgKiBAZXhhbXBsZVxuICAgICA8cHJlPlxuICAgIGxldCBhY3RpdmUkID0gc291cmNlLm9ic2VydmVBY3RpdmUoKTtcbiAgICA8L3ByZT5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVBY3RpdmUoKSB7XG4gICAgcmV0dXJuIHRoaXMubm90aWZ5QWN0aXZlLmFzT2JzZXJ2YWJsZSgpXG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSB0aGUgYWN0aXZlIGVudGl0eS5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgYWN0aXZlJCA9IHNvdXJjZS5hY3RpdmVTbmFwc2hvdCgpO1xuICAgIDwvcHJlPlxuICAqL1xuICAgIHB1YmxpYyBhY3RpdmVTbmFwc2hvdCgpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuYWN0aXZlLnZhbHVlcygpKVxuICB9XG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMT0FESU5HXG4gIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIGxvYWQgcmVxdWVzdC5cbiAgICogXG4gICAqIFRoZSBlcnJvciBPYnNlcnZhYmxlIHNob3VsZCBiZSBjcmVhdGVkIGJ5IHRoZSBcbiAgICogY2xpZW50LlxuICAgKi9cbiAgcHVibGljIGxvYWRpbmdFcnJvciE6IE9ic2VydmFibGU8YW55PjtcblxuICAvKipcbiAgICogTm90aWZpZXMgb2JzZXJ2ZXJzIHdoZW4gdGhlIHN0b3JlIGlzIGxvYWRpbmcuXG4gICAqIFxuICAgKiBUaGlzIGlzIGEgY29tbW9uIHBhdHRlcm4gZm91bmQgd2hlbiBpbXBsZW1lbnRpbmdcbiAgICogYE9ic2VydmFibGVgIGRhdGEgc291cmNlcy5cbiAgICovXG4gIHByaXZhdGUgbm90aWZ5TG9hZGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBsb2FkaW5nIHN0YXRlLiAgVXNlIGxvYWRpbmcgd2hlbiBmZXRjaGluZyBuZXdcbiAgICogZGF0YSBmb3IgdGhlIHN0b3JlLiAgVGhlIGRlZmF1bHQgbG9hZGluZyBzdGF0ZSBpcyBgdHJ1ZWAuXG4gICAqIFxuICAgKiBUaGlzIGlzIHN1Y2ggdGhhdCBpZiBkYXRhIGlzIGZldGNoZWQgYXN5bmNocm9ub3VzbHkgXG4gICAqIGluIGEgc2VydmljZSwgY29tcG9uZW50cyBjYW4gd2FpdCBvbiBsb2FkaW5nIG5vdGlmaWNhdGlvblxuICAgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBkYXRhIGZyb20gdGhlIHNlcnZpY2UuXG4gICAqXG4gICAqIExvYWRpbmcgY291bGQgYmUgYmFzZWQgb24gYSBjb21wb3NpdGUgcmVzcG9uc2UuICBGb3IgZXhhbXBsZVxuICAgKiB3aGVuIHRoZSBzdG9jayBhbmQgbXV0dWFsIGZ1bmRzIGhhdmUgbG9hZGVkLCBzZXQgbG9hZGluZyB0byBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZSBhbmQgbm90aWZpZXMgb2JzZXJ2ZXJzLlxuICAgKi9cbiAgc2V0IGxvYWRpbmcobG9hZGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX2xvYWRpbmcgPSBsb2FkaW5nO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMuX2xvYWRpbmcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gQSBzbmFwc2hvdCBvZiB0aGUgbG9hZGluZyBzdGF0ZS5cbiAgICovXG4gIGdldCBsb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIE9ic2VydmUgbG9hZGluZy5cbiAgICogQGV4YW1wbGVcbiAgICAgPHByZT5cbiAgICBsZXQgbG9hZGluZyQgPSBzb3VyY2Uub2JzZXJ2ZUxvYWRpbmcoKTtcbiAgICA8L3ByZT5cblxuICAgIE5vdGUgdGhhdCB0aGlzIG9idmVyYWJsZSBwaXBlZCB0aHJvdWdoXG4gICAgYHRha2VXaGlsZSh2LT52LCB0cnVlKSwgc3VjaCB0aGF0IGl0IHdpbGwgXG4gICAgY29tcGxldGUgYWZ0ZXIgZWFjaCBlbWlzc2lvbi5cblxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuXG4gICAgRm9yIG1vcmUgZGV0YWlscy5cbiAgKi9cbiAgcHVibGljIG9ic2VydmVMb2FkaW5nKCkge1xuICAgIHJldHVybiB0aGlzLm5vdGlmeUxvYWRpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIGxvYWRpbmcgaGFzIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvYnNlcnZlTG9hZGluZ0NvbXBsZXRlKCkge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVMb2FkaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihsb2FkaW5nID0+IGxvYWRpbmcgPT0gZmFsc2UpLFxuICAgICAgc3dpdGNoTWFwKCgpID0+IG9mKHRydWUpKSlcbiAgfVxuXG5cblxuXG5cblxuICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTRUFSQ0hJTkdcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyBhIHNlYXJjaCByZXF1ZXN0LlxuICAgKiBcbiAgICogVGhlIGVycm9yIE9ic2VydmFibGUgc2hvdWxkIGJlIGNyZWF0ZWQgYnkgdGhlIFxuICAgKiBjbGllbnQuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoRXJyb3IhOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIG9ic2VydmVycyB0aGF0IGEgc2VhcmNoIGlzIGluIHByb2dyZXNzLlxuICAgKiBcbiAgICogVGhpcyBpcyBhIGNvbW1vbiBwYXR0ZXJuIGZvdW5kIHdoZW4gaW1wbGVtZW50aW5nXG4gICAqIGBPYnNlcnZhYmxlYCBkYXRhIHNvdXJjZXMuXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeVNlYXJjaGluZyA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBgc2VhcmNoaW5nYCBzdGF0ZS4gIFVzZSBgc2VhcmNoaW5nYFxuICAgKiBmb3IgZXhhbXBsZSB0byBkaXNwbGF5IGEgc3Bpbm5uZXIgXG4gICAqIHdoZW4gcGVyZm9ybWluZyBhIHNlYXJjaC4gIFxuICAgKiBUaGUgZGVmYXVsdCBgc2VhcmNoaW5nYCBzdGF0ZSBpcyBgZmFsc2VgLlxuICAgKi9cbiAgcHJpdmF0ZSBfc2VhcmNoaW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnQgc2VhcmNoaW5nIHN0YXRlIGFuZCBub3RpZmllcyBvYnNlcnZlcnMuXG4gICAqL1xuICBzZXQgc2VhcmNoaW5nKHNlYXJjaGluZzogYm9vbGVhbikge1xuICAgIHRoaXMuX3NlYXJjaGluZyA9IHNlYXJjaGluZztcbiAgICB0aGlzLm5vdGlmeVNlYXJjaGluZy5uZXh0KHRoaXMuX3NlYXJjaGluZyk7XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybiBBIHNuYXBzaG90IG9mIHRoZSBzZWFyY2hpbmcgc3RhdGUuXG4gICAqL1xuICBnZXQgc2VhcmNoaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hpbmc7XG4gIH1cblxuICAvKipcbiAgICogT2JzZXJ2ZSBzZWFyY2hpbmcuXG4gICAqIEBleGFtcGxlXG4gICAgIDxwcmU+XG4gICAgbGV0IHNlYXJjaGluZyQgPSBzb3VyY2Uub2JzZXJ2ZVNlYXJjaGluZygpO1xuICAgIDwvcHJlPlxuICBcbiAgICBOb3RlIHRoYXQgdGhpcyBvYnZlcmFibGUgcGlwZWQgdGhyb3VnaFxuICAgIGB0YWtlV2hpbGUodi0+diwgdHJ1ZSksIHN1Y2ggdGhhdCBpdCB3aWxsIFxuICAgIGNvbXBsZXRlIGFmdGVyIGVhY2ggZW1pc3Npb24uXG4gIFxuICAgIFNlZTpcbiAgICBodHRwczovL21lZGl1bS5jb20vQG9sZS5lcnNveS93YWl0aW5nLW9uLWVzdG9yZS10by1sb2FkLThkY2JlMTYxNjEzY1xuICBcbiAgICBGb3IgbW9yZSBkZXRhaWxzLlxuICAqL1xuICBwdWJsaWMgb2JzZXJ2ZVNlYXJjaGluZygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5ub3RpZnlTZWFyY2hpbmcuYXNPYnNlcnZhYmxlKCkuXG4gICAgICBwaXBlKHRha2VXaGlsZSh2ID0+IHYsIHRydWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RmaWllcyB3aGVuIHNlYXJjaGluZyBoYXMgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG9ic2VydmVTZWFyY2hpbmdDb21wbGV0ZSgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlU2VhcmNoaW5nKCkucGlwZShcbiAgICAgIGZpbHRlcihzZWFyY2hpbmcgPT4gc2VhcmNoaW5nID09IGZhbHNlKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiBvZih0cnVlKSkpXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgc2xpY2VzXG4gICAqL1xuICBwcml2YXRlIHNsaWNlczogTWFwPHN0cmluZywgU2xpY2U8RT4+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBBZGRzIGEgc2xpY2UgdG8gdGhlIHN0b3JlIGFuZCBrZXlzIGl0IGJ5IHRoZSBzbGljZXMgbGFiZWwuXG4gICAqXG4gICAqIEBwYXJhbSBwXG4gICAqIEBwYXJhbSBsYWJlbFxuICAgKiBcbiAgICogQGV4YW1wbGUgU2V0dXAgYSBUb2RvIFNsaWNlIGZvciBDT01QTEVURSBUb2Rvc1xuYGBgXG5zb3VyY2UuYWRkU2xpY2UodG9kbyA9PiB0b2RvLmNvbXBsZXRlLCBUb2RvU2xpY2VzLkNPTVBMRVRFKTtcbmBgYFxuICAgKi9cbiAgYWRkU2xpY2UocDogUHJlZGljYXRlPEU+LCBsYWJlbDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2xpY2U6IFNsaWNlPEU+ID0gbmV3IFNsaWNlKFxuICAgICAgbGFiZWwsXG4gICAgICBwLFxuICAgICAgdGhpcylcbiAgICB0aGlzLnNsaWNlcy5zZXQoc2xpY2UubGFiZWwsIHNsaWNlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHNsaWNlXG4gICAqIEBwYXJhbSBsYWJlbCBUaGUgbGFiZWwgaWRlbnRpZnlpbmcgdGhlIHNsaWNlXG4gICAqIFxuICAgKiBAZXhhbXBsZSBSZW1vdmUgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgU2xpY2VcbmBgYFxuc291cmNlLnJlbW92ZVNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICByZW1vdmVTbGljZShsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy5zbGljZXMuZGVsZXRlKGxhYmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzbGljZVxuICAgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIGlkZW50aWZ5aW5nIHRoZSBzbGljZVxuICAgKiBAcmV0dXJuIFRoZSBTbGljZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgXG4gICAqIFxuICAgKiBAZXhhbXBsZSBHZXQgdGhlIFRvZG9TbGljZXMuQ09NUExFVEUgc2xpY2VcbmBgYFxuc291cmNlLmdldFNsaWNlKFRvZG9TbGljZXMuQ09NUExFVEUpO1xuYGBgXG4gICAqL1xuICBnZXRTbGljZShsYWJlbDogc3RyaW5nKTogU2xpY2U8RT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNsaWNlcy5nZXQobGFiZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCBhIG5ldykgZWxlbWVudChzKSB0byB0aGUgc3RvcmUuXG4gICAqIEBwYXJhbSBlIEFuIGluZGlpZHVhbCBlbnRpdHkgb3IgYW4gYXJyYXkgb2YgZW50aXRpZXNcbiAgICogQGV4YW1wbGUgUG9zdCBhIGB0b2RvYC5cbmBgYFxuc3RvcmUucG9zdCh0b2RvKTtcbmBgYFxuICAgKi9cbiAgcG9zdChlOiBFIHwgRVtdKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGUpKSB7XG4gICAgICBjb25zdCBndWlkOiBzdHJpbmcgPSAoPGFueT5lKVt0aGlzLkdVSURfS0VZXVxuICAgICAgICA/ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgIDogR1VJRCgpO1xuICAgICAgKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV0gPSBndWlkO1xuICAgICAgdGhpcy5lbnRyaWVzLnNldChndWlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMucG9zdChlKTtcbiAgICAgIH0pO1xuICAgICAgLy9DcmVhdGUgYSBuZXcgYXJyYXkgcmVmZXJlbmNlIHRvIHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnBvc3RBKGUpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQb3N0IHR3byBgVG9kb2AgaW5zdGFuY2VzLlxuYGBgXG5zdG9yZS5wb3N0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHBvc3ROKC4uLmU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIGNvbnN0IGd1aWQ6IHN0cmluZyA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldXG4gICAgICAgID8gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgICAgOiBHVUlEKCk7XG4gICAgICAoPGFueT5lKVt0aGlzLkdVSURfS0VZXSA9IGd1aWQ7XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGd1aWQsIGUpO1xuICAgICAgdGhpcy51cGRhdGVJREVudHJ5KGUpO1xuICAgIH0pO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnBvc3RBKGUpO1xuICAgIH0pO1xuICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICBsZXQgdjogRVtdID0gWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV07XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBvc3QgKEFkZCkgYW4gYXJyYXkgb2YgZWxlbWVudHMgdG8gdGhlIHN0b3JlLlxuICAgKiBAcGFyYW0gZVxuICAgKiBAZXhhbXBsZSBQb3N0IGEgYFRvZG9gIGFycmF5LlxuYGBgXG5zdG9yZS5wb3N0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcG9zdEEoZTogRVtdKSB7XG4gICAgdGhpcy5wb3N0TiguLi5lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQdXQgKFVwZGF0ZSkgYW4gZWxlbWVudC5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgUHV0IGEgVG9kbyBpbnN0YW5jZS5cbmBgYFxuc3RvcmUucHV0KHRvZG8xKTtcbmBgYFxuICAgKi9cbiAgcHV0KGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIGxldCBpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV07XG4gICAgICB0aGlzLmVudHJpZXMuc2V0KGlkLCBlKTtcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogW2VdIH07XG4gICAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgICAgQXJyYXkuZnJvbSh0aGlzLnNsaWNlcy52YWx1ZXMoKSkuZm9yRWFjaChzID0+IHtcbiAgICAgICAgcy5wdXQoZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnB1dEEoZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHV0IChVcGRhdGUpIGFuIGVsZW1lbnQgb3IgYWRkIGFuIGVsZW1lbnQgdGhhdCB3YXMgcmVhZCBmcm9tIGEgcGVyc2lzdGVuY2Ugc291cmNlXG4gICAqIGFuZCB0aHVzIGFscmVhZHkgaGFzIGFuIGFzc2lnbmVkIGdsb2JhbCBpZGAuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIHB1dE4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5wdXRBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1dCAoVXBkYXRlKSB0aGUgYXJyYXkgb2YgZWxlbWVudHMuXG4gICAqIEBwYXJhbSBlXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUucHV0KFt0b2RvMSwgdG9kbzJdKTtcbmBgYFxuICAgKi9cbiAgcHV0QShlOiBFW10pIHtcbiAgICBlLmZvckVhY2goZSA9PiB7XG4gICAgICBsZXQgZ3VpZDogc3RyaW5nID0gKDxhbnk+ZSlbdGhpcy5HVUlEX0tFWV1cbiAgICAgIHRoaXMuZW50cmllcy5zZXQoZ3VpZCwgZSlcbiAgICAgIHRoaXMudXBkYXRlSURFbnRyeShlKTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIHRoaXMubm90aWZ5Lm5leHQodik7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QVVQsIGVudHJpZXM6IGUgfTtcbiAgICB0aGlzLm5vdGlmeURlbHRhLm5leHQoZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnB1dEEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIChVcGRhdGUpIHRoZSBhcnJheSBvZiBlbGVtZW50cy5cbiAgICogQHBhcmFtIGVcbiAgICogQGV4YW1wbGUgRGVsZXRlIHRvZG8xLlxuYGBgXG5zdG9yZS5kZWxldGUodG9kbzFdKTtcbmBgYFxuICAgKi9cbiAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZSkpIHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICAgIC8vQ3JlYXRlIGEgbmV3IGFycmF5IHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbi5cbiAgICAgIGxldCB2OiBFW10gPSBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXTtcbiAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgIHRoaXMubm90aWZ5QWxsKHYsIGRlbHRhKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZGVsZXRlKGUpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5kZWxldGVBKGUpXG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIE4gZWxlbWVudHMuXG4gICAqIEBwYXJhbSAuLi5lXG4gICAqIEBleGFtcGxlIFB1dCBUb2RvIGluc3RhbmNlcy5cbmBgYFxuc3RvcmUuZGVsZXRlKHRvZG8xLCB0b2RvMik7XG5gYGBcbiAgICovXG4gIGRlbGV0ZU4oLi4uZTogRVtdKSB7XG4gICAgdGhpcy5kZWxldGVBKGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBOIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0gLi4uZVxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVBKGU6IEVbXSkge1xuICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgIHRoaXMuZGVsZXRlQWN0aXZlKGUpO1xuICAgICAgY29uc3QgZ3VpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShndWlkKTtcbiAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICAgIHMuZW50cmllcy5kZWxldGUoZ3VpZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBlIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVsZW1lbnRzIGJ5IHtAbGluayBQcmVkaWNhdGV9LlxuICAgKiBAcGFyYW0gcCBUaGUgcHJlZGljYXRlLlxuICAgKiBAZXhhbXBsZSBQdXQgVG9kbyBpbnN0YW5jZXMuXG5gYGBcbnN0b3JlLmRlbGV0ZSh0b2RvMSwgdG9kbzIpO1xuYGBgXG4gICAqL1xuICBkZWxldGVQKHA6IFByZWRpY2F0ZTxFPikge1xuICAgIGNvbnN0IGQ6IEVbXSA9IFtdO1xuICAgIEFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKS5mb3JFYWNoKGUgPT4ge1xuICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuR1VJRF9LRVldO1xuICAgICAgICB0aGlzLmVudHJpZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5kZWxldGVBY3RpdmUoZSk7XG4gICAgICAgIHRoaXMuZGVsZXRlSURFbnRyeShlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvL0NyZWF0ZSBhIG5ldyBhcnJheSByZWZlcmVuY2UgdG8gdHJpZ2dlciBBbmd1bGFyIGNoYW5nZSBkZXRlY3Rpb24uXG4gICAgbGV0IHY6IEVbXSA9IFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldO1xuICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgdGhpcy5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLmRlbGV0ZUEoZCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGFkZCB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5zZXQoKDxhbnk+ZSlbdGhpcy5JRF9LRVldLCBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSWYgdGhlIGVudGl0eSBoYXMgdGhlIGBpZGAga2V5IGluaXRpYWxpemVkIHdpdGggYSB2YWx1ZSxcbiAgICogdGhlbiBhbHNvIGRlbGV0ZSB0aGUgZW50aXR5IHRvIHRoZSBgaWRFbnRyaWVzYC5cbiAgICpcbiAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGBpZEVudHJpZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWxldGVJREVudHJ5KGU6IEUpIHtcbiAgICBpZiAoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKSB7XG4gICAgICB0aGlzLmlkRW50cmllcy5kZWxldGUoKDxhbnk+ZSlbdGhpcy5JRF9LRVldKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBzdG9yZSBhbmQgYWxsIGNvbnRhaW5lZCBzbGljZSBpbnN0YW5jZXMgdG8gZW1wdHkuXG4gICAqIEFsc28gcGVyZm9ybSBkZWx0YSBub3RpZmljYXRpb24gdGhhdCBzZW5kcyBhbGwgY3VycmVudCBzdG9yZSBlbnRyaWVzLlxuICAgKiBUaGUgQWN0aW9uVHlwZS5SRVNFVCBjb2RlIGlzIHNlbnQgd2l0aCB0aGUgZGVsdGEgbm90aWZpY2F0aW9uLiAgU2xpY2VzXG4gICAqIHNlbmQgdGhlaXIgb3duIGRlbHRhIG5vdGlmaWNhdGlvbi5cbiAgICogXG4gICAqIEBleGFtcGxlIFJlc2V0IHRoZSBzdG9yZS5cbmBgYFxuc3RvcmUucmVzZXQoKTtcbmBgYFxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0ge1xuICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVTRVQsXG4gICAgICBlbnRyaWVzOiBBcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSlcbiAgICB9O1xuICAgIHRoaXMubm90aWZ5QWxsKFtdLCBkZWx0YSk7XG4gICAgdGhpcy5lbnRyaWVzID0gbmV3IE1hcCgpO1xuICAgIEFycmF5LmZyb20odGhpcy5zbGljZXMudmFsdWVzKCkpLmZvckVhY2gocyA9PiB7XG4gICAgICBzLnJlc2V0KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhbGwgdGhlIG5vdGlmaWVycyBhdCBvbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gdlxuICAgKiBAcGFyYW0gZGVsdGFcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBub3RpZnlBbGwodjogRVtdLCBkZWx0YTogRGVsdGE8RT4pIHtcbiAgICBzdXBlci5ub3RpZnlBbGwodiwgZGVsdGEpO1xuICAgIHRoaXMubm90aWZ5TG9hZGluZy5uZXh0KHRoaXMubG9hZGluZyk7XG4gIH1cbn0iXX0=