@ngx-pwa/local-storage 12.0.0-0 → 13.0.0

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 (41) hide show
  1. package/README.md +10 -7
  2. package/{esm2015/lib/databases/exceptions.js → esm2020/lib/databases/exceptions.mjs} +1 -1
  3. package/esm2020/lib/databases/indexeddb-database.mjs +326 -0
  4. package/esm2020/lib/databases/local-database.mjs +78 -0
  5. package/{esm2015/lib/databases/localstorage-database.js → esm2020/lib/databases/localstorage-database.mjs} +4 -4
  6. package/{esm2015/lib/databases/memory-database.js → esm2020/lib/databases/memory-database.mjs} +4 -4
  7. package/{esm2015/lib/storage.module.js → esm2020/lib/storage.module.mjs} +5 -5
  8. package/{esm2015/lib/storages/exceptions.js → esm2020/lib/storages/exceptions.mjs} +1 -1
  9. package/esm2020/lib/storages/local-storage.service.mjs +83 -0
  10. package/{esm2015/lib/storages/storage-map.service.js → esm2020/lib/storages/storage-map.service.mjs} +5 -5
  11. package/{esm2015/lib/tokens.js → esm2020/lib/tokens.mjs} +0 -0
  12. package/{esm2015/lib/validation/json-schema.js → esm2020/lib/validation/json-schema.mjs} +0 -0
  13. package/esm2020/lib/validation/json-validator.mjs +243 -0
  14. package/{esm2015/ngx-pwa-local-storage.js → esm2020/ngx-pwa-local-storage.mjs} +2 -2
  15. package/{esm2015/public_api.js → esm2020/public-api.mjs} +1 -1
  16. package/fesm2015/ngx-pwa-local-storage.mjs +1389 -0
  17. package/fesm2015/ngx-pwa-local-storage.mjs.map +1 -0
  18. package/{fesm2015/ngx-pwa-local-storage.js → fesm2020/ngx-pwa-local-storage.mjs} +44 -38
  19. package/fesm2020/ngx-pwa-local-storage.mjs.map +1 -0
  20. package/ngx-pwa-local-storage.d.ts +1 -1
  21. package/package.json +25 -12
  22. package/{public_api.d.ts → public-api.d.ts} +0 -0
  23. package/schematics/migration.json +5 -0
  24. package/schematics/ng-add/index.d.ts +1 -2
  25. package/schematics/ng-add/index.js +16 -5
  26. package/schematics/ng-add/index.js.map +1 -1
  27. package/schematics/ng-update/index.d.ts +1 -0
  28. package/schematics/ng-update/index.js +18 -5
  29. package/schematics/ng-update/index.js.map +1 -1
  30. package/schematics/utility/config.d.ts +1 -1
  31. package/schematics/utility/config.js +11 -11
  32. package/schematics/utility/config.js.map +1 -1
  33. package/schematics/utility/module.js +3 -3
  34. package/schematics/utility/module.js.map +1 -1
  35. package/bundles/ngx-pwa-local-storage.umd.js +0 -1842
  36. package/bundles/ngx-pwa-local-storage.umd.js.map +0 -1
  37. package/esm2015/lib/databases/indexeddb-database.js +0 -327
  38. package/esm2015/lib/databases/local-database.js +0 -76
  39. package/esm2015/lib/storages/local-storage.service.js +0 -80
  40. package/esm2015/lib/validation/json-validator.js +0 -240
  41. package/fesm2015/ngx-pwa-local-storage.js.map +0 -1
package/README.md CHANGED
@@ -10,12 +10,15 @@ Efficient client-side storage module for Angular:
10
10
 
11
11
  ## Sponsorship
12
12
 
13
- What started as a personal project is now one of the most used Angular library
14
- for client-side storage, with more than 10 000 downloads
15
- [on npm](https://www.npmjs.com/package/@ngx-pwa/local-storage) each week.
16
-
17
- It's a lot of *unpaid* work. So please consider:
18
- - **becoming [a sponsor](https://github.com/sponsors/cyrilletuzi)**, if your company earns money with projects using this lib
13
+ You like this library downloaded more than 15 000 times each week
14
+ [on npm](https://www.npmjs.com/package/@ngx-pwa/local-storage)?
15
+ You like the serious open source work
16
+ (full documentation, lib ready on day one of Angular major updates,...)?
17
+ And your company is using it in projects generating money?
18
+
19
+ Well, on my side, it's a lot of *unpaid* work. So please consider:
20
+ - becoming a **[regular sponsor](https://github.com/sponsors/cyrilletuzi)**
21
+ - doing a **[one-time donation](https://github.com/sponsors/cyrilletuzi?frequency=one-time)**
19
22
  - at least, taking 2 minutes to [show your love](https://github.com/cyrilletuzi/angular-async-local-storage/discussions/categories/wall-of-love)
20
23
 
21
24
  ## By the same author
@@ -53,7 +56,7 @@ to be homogeneous with other Angular modules.
53
56
  Install the package, according to your Angular version:
54
57
 
55
58
  ```bash
56
- # For Angular LTS (Angular >= 9):
59
+ # For Angular LTS (Angular >= 10):
57
60
  ng add @ngx-pwa/local-storage
58
61
  ```
59
62
 
@@ -25,4 +25,4 @@ export class SerializationError extends Error {
25
25
  this.message = SERIALIZATION_ERROR;
26
26
  }
27
27
  }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wd2EvbG9jYWwtc3RvcmFnZS9zcmMvbGliL2RhdGFiYXNlcy9leGNlcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFBekM7O1FBQ0UsWUFBTyxHQUFHLGdCQUFnQixDQUFDO0lBQzdCLENBQUM7Q0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7MEVBQ3VDLENBQUM7QUFFM0U7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsS0FBSztJQUE3Qzs7UUFDRSxZQUFPLEdBQUcsbUJBQW1CLENBQUM7SUFDaEMsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeGNlcHRpb24gbWVzc2FnZSB3aGVuIGBpbmRleGVkREJgIGlzIG5vdCB3b3JraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBJREJfQlJPS0VOX0VSUk9SID0gJ2luZGV4ZWREQiBpcyBub3Qgd29ya2luZyc7XG5cbi8qKlxuICogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGBpbmRleGVkREJgIGlzIG5vdCB3b3JraW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBJREJCcm9rZW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgbWVzc2FnZSA9IElEQl9CUk9LRU5fRVJST1I7XG59XG5cbi8qKlxuICogRXhjZXB0aW9uIG1lc3NhZ2Ugd2hlbiBhIHZhbHVlIGNhbid0IGJlIHNlcmlhbGl6ZWQgZm9yIGBsb2NhbFN0b3JhZ2VgXG4gKi9cbmV4cG9ydCBjb25zdCBTRVJJQUxJWkFUSU9OX0VSUk9SID0gYFRoZSBzdG9yYWdlIGlzIGN1cnJlbnRseSBsb2NhbFN0b3JhZ2UsXG53aGVyZSBkYXRhIG11c3QgYmUgc2VyaWFsaXplZCwgYW5kIHRoZSBwcm92aWRlZCBkYXRhIGNhbid0IGJlIHNlcmlhbGl6ZWQuYDtcblxuLyoqXG4gKiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSB2YWx1ZSBjYW4ndCBiZSBzZXJpYWxpemVkIGZvciBgbG9jYWxTdG9yYWdlYFxuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBtZXNzYWdlID0gU0VSSUFMSVpBVElPTl9FUlJPUjtcbn1cbiJdfQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1wd2EvbG9jYWwtc3RvcmFnZS9zcmMvbGliL2RhdGFiYXNlcy9leGNlcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsMEJBQTBCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFBekM7O1FBQ1csWUFBTyxHQUFHLGdCQUFnQixDQUFDO0lBQ3RDLENBQUM7Q0FBQTtBQUVEOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7MEVBQ3VDLENBQUM7QUFFM0U7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQW1CLFNBQVEsS0FBSztJQUE3Qzs7UUFDVyxZQUFPLEdBQUcsbUJBQW1CLENBQUM7SUFDekMsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFeGNlcHRpb24gbWVzc2FnZSB3aGVuIGBpbmRleGVkREJgIGlzIG5vdCB3b3JraW5nXG4gKi9cbmV4cG9ydCBjb25zdCBJREJfQlJPS0VOX0VSUk9SID0gJ2luZGV4ZWREQiBpcyBub3Qgd29ya2luZyc7XG5cbi8qKlxuICogRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGBpbmRleGVkREJgIGlzIG5vdCB3b3JraW5nXG4gKi9cbmV4cG9ydCBjbGFzcyBJREJCcm9rZW5FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgb3ZlcnJpZGUgbWVzc2FnZSA9IElEQl9CUk9LRU5fRVJST1I7XG59XG5cbi8qKlxuICogRXhjZXB0aW9uIG1lc3NhZ2Ugd2hlbiBhIHZhbHVlIGNhbid0IGJlIHNlcmlhbGl6ZWQgZm9yIGBsb2NhbFN0b3JhZ2VgXG4gKi9cbmV4cG9ydCBjb25zdCBTRVJJQUxJWkFUSU9OX0VSUk9SID0gYFRoZSBzdG9yYWdlIGlzIGN1cnJlbnRseSBsb2NhbFN0b3JhZ2UsXG53aGVyZSBkYXRhIG11c3QgYmUgc2VyaWFsaXplZCwgYW5kIHRoZSBwcm92aWRlZCBkYXRhIGNhbid0IGJlIHNlcmlhbGl6ZWQuYDtcblxuLyoqXG4gKiBFeGNlcHRpb24gcmFpc2VkIHdoZW4gYSB2YWx1ZSBjYW4ndCBiZSBzZXJpYWxpemVkIGZvciBgbG9jYWxTdG9yYWdlYFxuICovXG5leHBvcnQgY2xhc3MgU2VyaWFsaXphdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBvdmVycmlkZSBtZXNzYWdlID0gU0VSSUFMSVpBVElPTl9FUlJPUjtcbn1cbiJdfQ==
@@ -0,0 +1,326 @@
1
+ import { Injectable, Inject } from '@angular/core';
2
+ import { ReplaySubject, fromEvent, of, throwError, race } from 'rxjs';
3
+ import { map, mergeMap, first, takeWhile, tap, mapTo } from 'rxjs/operators';
4
+ import { IDB_DB_NAME, IDB_STORE_NAME, DEFAULT_IDB_STORE_NAME, IDB_DB_VERSION, DEFAULT_IDB_DB_NAME, DEFAULT_IDB_DB_VERSION, IDB_NO_WRAP, DEFAULT_IDB_NO_WRAP } from '../tokens';
5
+ import { IDBBrokenError } from './exceptions';
6
+ import * as i0 from "@angular/core";
7
+ export class IndexedDBDatabase {
8
+ /**
9
+ * Constructor params are provided by Angular (but can also be passed manually in tests)
10
+ * @param dbName `indexedDB` database name
11
+ * @param storeName `indexedDB` store name
12
+ * @param dbVersion `indexedDB` database version
13
+ * @param noWrap Flag to not wrap `indexedDB` values for interoperability or to wrap for backward compatibility
14
+ */
15
+ constructor(dbName = DEFAULT_IDB_DB_NAME, storeName = DEFAULT_IDB_STORE_NAME, dbVersion = DEFAULT_IDB_DB_VERSION, noWrap = DEFAULT_IDB_NO_WRAP) {
16
+ /**
17
+ * `indexedDB` database connection, wrapped in a RxJS `ReplaySubject` to be able to access the connection
18
+ * even after the connection success event happened
19
+ */
20
+ this.database = new ReplaySubject(1);
21
+ /**
22
+ * Index used when wrapping value. *For backward compatibility only.*
23
+ */
24
+ this.wrapIndex = 'value';
25
+ this.dbName = dbName;
26
+ this.storeName = storeName;
27
+ this.dbVersion = dbVersion;
28
+ this.noWrap = noWrap;
29
+ /* Connect to `indexedDB`, with prefix if provided by the user */
30
+ this.connect();
31
+ }
32
+ /**
33
+ * Information about `indexedDB` connection. *Only useful for interoperability.*
34
+ * @returns `indexedDB` database name, store name and database version
35
+ */
36
+ get backingStore() {
37
+ return {
38
+ database: this.dbName,
39
+ store: this.storeName,
40
+ version: this.dbVersion,
41
+ };
42
+ }
43
+ /**
44
+ * Number of items in our `indexedDB` database and object store
45
+ */
46
+ get size() {
47
+ /* Open a transaction in read-only mode */
48
+ return this.transaction('readonly').pipe(mergeMap((transactionData) => {
49
+ const { store, events } = transactionData;
50
+ /* Request to know the number of items */
51
+ const request = store.count();
52
+ /* Return the result */
53
+ return events.pipe(map(() => request.result));
54
+ }),
55
+ /* The observable will complete after the first value */
56
+ first());
57
+ }
58
+ /**
59
+ * Gets an item value in our `indexedDB` store
60
+ * @param key The item's key
61
+ * @returns The item's value if the key exists, `undefined` otherwise, wrapped in an RxJS `Observable`
62
+ */
63
+ get(key) {
64
+ /* Open a transaction in read-only mode */
65
+ return this.transaction('readonly').pipe(mergeMap((transactionData) => {
66
+ const { store, events } = transactionData;
67
+ /* Request the value with the key provided by the user */
68
+ const request = store.get(key);
69
+ /* Listen events and return the result */
70
+ return events.pipe(map(() => {
71
+ if ((request.result !== undefined) && (request.result !== null)) {
72
+ /* Prior to v8, the value was wrapped in an `{ value: ...}` object */
73
+ if (!this.noWrap && (typeof request.result === 'object') && (this.wrapIndex in request.result) &&
74
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
75
+ (request.result[this.wrapIndex] !== undefined) && (request.result[this.wrapIndex] !== null)) {
76
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
77
+ return request.result[this.wrapIndex];
78
+ }
79
+ else {
80
+ /* Cast to the wanted type */
81
+ return request.result;
82
+ }
83
+ }
84
+ /* Return `undefined` if the value is empty */
85
+ return undefined;
86
+ }));
87
+ }),
88
+ /* The observable will complete after the first value */
89
+ first());
90
+ }
91
+ /**
92
+ * Sets an item in our `indexedDB` store
93
+ * @param key The item's key
94
+ * @param data The item's value
95
+ * @returns An RxJS `Observable` to wait the end of the operation
96
+ */
97
+ set(key, data) {
98
+ /* Storing `undefined` in `indexedDb` can cause issues in some browsers so removing item instead */
99
+ if (data === undefined) {
100
+ return this.delete(key);
101
+ }
102
+ /* Open a transaction in write mode */
103
+ return this.transaction('readwrite').pipe(mergeMap((transactionData) => {
104
+ const { store, events } = transactionData;
105
+ /* Prior to v8, data was wrapped in a `{ value: ... }` object */
106
+ const dataToStore = this.noWrap ? data : { [this.wrapIndex]: data };
107
+ /* Add if the item is not existing yet, or update otherwise */
108
+ store.put(dataToStore, key);
109
+ /* Listen to events and return `undefined` as no value is expected */
110
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
111
+ return events.pipe(mapTo(undefined));
112
+ }),
113
+ /* The observable will complete after the first value */
114
+ first());
115
+ }
116
+ /**
117
+ * Deletes an item in our `indexedDB` store
118
+ * @param key The item's key
119
+ * @returns An RxJS `Observable` to wait the end of the operation
120
+ */
121
+ delete(key) {
122
+ /* Open a transaction in write mode */
123
+ return this.transaction('readwrite').pipe(mergeMap((transactionData) => {
124
+ const { store, events } = transactionData;
125
+ /* Delete the item in store */
126
+ store.delete(key);
127
+ /* Listen to events and return `undefined` as no data is expected here */
128
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
129
+ return events.pipe(mapTo(undefined));
130
+ }),
131
+ /* The observable will complete after the first value */
132
+ first());
133
+ }
134
+ /**
135
+ * Deletes all items from our `indexedDB` objet store
136
+ * @returns An RxJS `Observable` to wait the end of the operation
137
+ */
138
+ clear() {
139
+ /* Open a transaction in write mode */
140
+ return this.transaction('readwrite').pipe(mergeMap((transactionData) => {
141
+ const { store, events } = transactionData;
142
+ /* Delete all items in object store */
143
+ store.clear();
144
+ /* Listen to events and return `undefined` as no data is expected here */
145
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
146
+ return events.pipe(mapTo(undefined));
147
+ }),
148
+ /* The observable will complete */
149
+ first());
150
+ }
151
+ /**
152
+ * Get all the keys in our `indexedDB` store
153
+ * @returns An RxJS `Observable` iterating on each key
154
+ */
155
+ keys() {
156
+ /* Open a transaction in read-only mode */
157
+ return this.transaction('readonly').pipe(
158
+ /* `first()` is used as the final operator in other methods to complete the `Observable`
159
+ * (as it all starts from a `ReplaySubject` which never ends),
160
+ * but as this method is iterating over multiple values, `first()` **must** be used here */
161
+ first(), mergeMap((transactionData) => {
162
+ const { store } = transactionData;
163
+ /* Open a cursor on the store
164
+ * Avoid issues like https://github.com/cyrilletuzi/angular-async-local-storage/issues/69 */
165
+ const request = store.openKeyCursor();
166
+ /* Listen to success event */
167
+ const success$ = fromEvent(request, 'success').pipe(
168
+ /* Stop the `Observable` when the cursor is `null` */
169
+ takeWhile(() => (request.result !== null)),
170
+ /* This lib only allows string keys, but user could have added other types of keys from outside
171
+ * It's OK to cast as the cursor as been tested in the previous operator */
172
+ map(() => request.result.key.toString()),
173
+ /* Iterate on the cursor */
174
+ tap(() => { request.result.continue(); }));
175
+ /* Listen to error event and if so, throw an error */
176
+ const error$ = this.listenError(request);
177
+ /* Choose the first event to occur */
178
+ return race([success$, error$]);
179
+ }));
180
+ }
181
+ /**
182
+ * Check if a key exists in our `indexedDB` store
183
+ * @returns An RxJS `Observable` telling if the key exists or not
184
+ */
185
+ has(key) {
186
+ /* Open a transaction in read-only mode */
187
+ return this.transaction('readonly').pipe(mergeMap((transactionData) => {
188
+ const { store, events } = transactionData;
189
+ /* Check if the key exists in the store
190
+ * Fixes https://github.com/cyrilletuzi/angular-async-local-storage/issues/69
191
+ */
192
+ const request = store.getKey(key);
193
+ /* Listen to events and return `true` or `false` */
194
+ return events.pipe(map(() => (request.result !== undefined) ? true : false));
195
+ }),
196
+ /* The observable will complete */
197
+ first());
198
+ }
199
+ /**
200
+ * Connects to `indexedDB` and creates the object store on first time
201
+ */
202
+ connect() {
203
+ let request;
204
+ /* Connect to `indexedDB`
205
+ * Will fail in Safari cross-origin iframes
206
+ * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42} */
207
+ try {
208
+ /* Do NOT explicit `window` here, as `indexedDB` could be used from a web worker too */
209
+ request = indexedDB.open(this.dbName, this.dbVersion);
210
+ }
211
+ catch {
212
+ this.database.error(new IDBBrokenError());
213
+ return;
214
+ }
215
+ /* Create store on first connection */
216
+ this.createStore(request);
217
+ /* Listen to success and error events */
218
+ const success$ = fromEvent(request, 'success');
219
+ const error$ = this.listenError(request);
220
+ /* Choose the first to occur */
221
+ race([success$, error$])
222
+ /* The observable will complete */
223
+ .pipe(first())
224
+ .subscribe({
225
+ next: () => {
226
+ /* Register the database connection in the `ReplaySubject` for further access */
227
+ this.database.next(request.result);
228
+ },
229
+ error: () => {
230
+ /* Firefox private mode issue: fallback storage if IndexedDb connection is failing
231
+ * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}
232
+ * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/26} */
233
+ this.database.error(new IDBBrokenError());
234
+ },
235
+ });
236
+ }
237
+ /**
238
+ * Create store on first use of `indexedDB`
239
+ * @param request `indexedDB` database opening request
240
+ */
241
+ createStore(request) {
242
+ /* Listen to the event fired on first connection */
243
+ fromEvent(request, 'upgradeneeded')
244
+ /* The observable will complete */
245
+ .pipe(first())
246
+ .subscribe({
247
+ next: () => {
248
+ /* Check if the store already exists, to avoid error */
249
+ if (!request.result.objectStoreNames.contains(this.storeName)) {
250
+ /* Create the object store */
251
+ request.result.createObjectStore(this.storeName);
252
+ }
253
+ }
254
+ });
255
+ }
256
+ /**
257
+ * Open an `indexedDB` transaction and get our store
258
+ * @param mode `readonly` or `readwrite`
259
+ * @returns An `indexedDB` transaction store and events, wrapped in an RxJS `Observable`
260
+ */
261
+ transaction(mode) {
262
+ /* From the `indexedDB` connection, open a transaction and get the store */
263
+ return this.database
264
+ .pipe(mergeMap((database) => {
265
+ let transaction;
266
+ try {
267
+ transaction = database.transaction([this.storeName], mode);
268
+ }
269
+ catch (error) {
270
+ /* The store could have been deleted from outside */
271
+ return throwError(error);
272
+ }
273
+ /* Get the store from the transaction */
274
+ const store = transaction.objectStore(this.storeName);
275
+ /* Listen transaction `complete` and `error` events */
276
+ const events = this.listenTransactionEvents(transaction);
277
+ return of({ store, events });
278
+ }));
279
+ }
280
+ /**
281
+ * Listen errors on a transaction or request, and throw if trigerred
282
+ * @param transactionOrRequest `indexedDb` transaction or request to listen
283
+ * @returns An `Observable` listening to errors
284
+ */
285
+ listenError(transactionOrRequest) {
286
+ return fromEvent(transactionOrRequest, 'error').pipe(
287
+ /* Throw on error to be able to catch errors in RxJS way.
288
+ * Here `event.target` must be used, as `transactionOrRequest.error` will be `null`
289
+ * if we are on the request and the error is only triggered later by the transaction */
290
+ mergeMap((event) => throwError(event.target.error)));
291
+ }
292
+ /**
293
+ * Listen transaction `complete` and `error` events
294
+ * @param transaction Transaction to listen
295
+ * @returns An `Observable` listening to transaction `complete` and `error` events
296
+ */
297
+ listenTransactionEvents(transaction) {
298
+ /* Listen to the `complete` event */
299
+ const complete$ = fromEvent(transaction, 'complete');
300
+ /* Listen to the `error` event */
301
+ const error$ = this.listenError(transaction);
302
+ /* Choose the first event to occur */
303
+ return race([complete$, error$]);
304
+ }
305
+ }
306
+ IndexedDBDatabase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IndexedDBDatabase, deps: [{ token: IDB_DB_NAME }, { token: IDB_STORE_NAME }, { token: IDB_DB_VERSION }, { token: IDB_NO_WRAP }], target: i0.ɵɵFactoryTarget.Injectable });
307
+ IndexedDBDatabase.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IndexedDBDatabase, providedIn: 'root' });
308
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: IndexedDBDatabase, decorators: [{
309
+ type: Injectable,
310
+ args: [{
311
+ providedIn: 'root'
312
+ }]
313
+ }], ctorParameters: function () { return [{ type: undefined, decorators: [{
314
+ type: Inject,
315
+ args: [IDB_DB_NAME]
316
+ }] }, { type: undefined, decorators: [{
317
+ type: Inject,
318
+ args: [IDB_STORE_NAME]
319
+ }] }, { type: undefined, decorators: [{
320
+ type: Inject,
321
+ args: [IDB_DB_VERSION]
322
+ }] }, { type: undefined, decorators: [{
323
+ type: Inject,
324
+ args: [IDB_NO_WRAP]
325
+ }] }]; } });
326
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZGRiLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9sb2NhbC1zdG9yYWdlL3NyYy9saWIvZGF0YWJhc2VzL2luZGV4ZWRkYi1kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQWMsYUFBYSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRixPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU3RSxPQUFPLEVBQ0wsV0FBVyxFQUFFLGNBQWMsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLEVBQ25FLG1CQUFtQixFQUFFLHNCQUFzQixFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFDOUUsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFNOUMsTUFBTSxPQUFPLGlCQUFpQjtJQWlDNUI7Ozs7OztPQU1HO0lBQ0gsWUFDdUIsTUFBTSxHQUFHLG1CQUFtQixFQUN6QixTQUFTLEdBQUcsc0JBQXNCLEVBQ2xDLFNBQVMsR0FBRyxzQkFBc0IsRUFDckMsTUFBTSxHQUFHLG1CQUFtQjtRQTNCbkQ7OztXQUdHO1FBQ2dCLGFBQVEsR0FBRyxJQUFJLGFBQWEsQ0FBYyxDQUFDLENBQUMsQ0FBQztRQU9oRTs7V0FFRztRQUNnQixjQUFTLEdBQUcsT0FBTyxDQUFDO1FBZ0JyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsU0FB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LFVBQVUsQ0FBQyxDQUFDO1FBRXJELGlDQUFpQztRQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTdDLHFDQUFxQztRQUNyQyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRW5DLENBQUM7OzhHQWpjVSxpQkFBaUIsa0JBeUNsQixXQUFXLGFBQ1gsY0FBYyxhQUNkLGNBQWMsYUFDZCxXQUFXO2tIQTVDVixpQkFBaUIsY0FGaEIsTUFBTTsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkEwQ0ksTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxjQUFjOzswQkFDckIsTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBSZXBsYXlTdWJqZWN0LCBmcm9tRXZlbnQsIG9mLCB0aHJvd0Vycm9yLCByYWNlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIG1lcmdlTWFwLCBmaXJzdCwgdGFrZVdoaWxlLCB0YXAsIG1hcFRvIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge1xuICBJREJfREJfTkFNRSwgSURCX1NUT1JFX05BTUUsIERFRkFVTFRfSURCX1NUT1JFX05BTUUsIElEQl9EQl9WRVJTSU9OLFxuICBERUZBVUxUX0lEQl9EQl9OQU1FLCBERUZBVUxUX0lEQl9EQl9WRVJTSU9OLCBJREJfTk9fV1JBUCwgREVGQVVMVF9JREJfTk9fV1JBUFxufSBmcm9tICcuLi90b2tlbnMnO1xuaW1wb3J0IHsgSURCQnJva2VuRXJyb3IgfSBmcm9tICcuL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgTG9jYWxEYXRhYmFzZSB9IGZyb20gJy4vbG9jYWwtZGF0YWJhc2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBJbmRleGVkREJEYXRhYmFzZSBpbXBsZW1lbnRzIExvY2FsRGF0YWJhc2Uge1xuXG4gIC8qKlxuICAgKiBgaW5kZXhlZERCYCBkYXRhYmFzZSBuYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGJOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGBpbmRleGVkREJgIG9iamVjdCBzdG9yZSBuYW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RvcmVOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIGBpbmRleGVkREJgIGRhdGFiYXNlIHZlcnNpb24uIE11c3QgYmUgYW4gdW5zaWduZWQgKippbnRlZ2VyKipcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBkYlZlcnNpb246IG51bWJlcjtcblxuICAvKipcbiAgICogYGluZGV4ZWREQmAgZGF0YWJhc2UgY29ubmVjdGlvbiwgd3JhcHBlZCBpbiBhIFJ4SlMgYFJlcGxheVN1YmplY3RgIHRvIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBjb25uZWN0aW9uXG4gICAqIGV2ZW4gYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gc3VjY2VzcyBldmVudCBoYXBwZW5lZFxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFiYXNlID0gbmV3IFJlcGxheVN1YmplY3Q8SURCRGF0YWJhc2U+KDEpO1xuXG4gIC8qKlxuICAgKiBGbGFnIHRvIG5vdCB3cmFwIGBpbmRleGVkREJgIHZhbHVlcyBmb3IgaW50ZXJvcGVyYWJpbGl0eSBvciB0byB3cmFwIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vV3JhcDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kZXggdXNlZCB3aGVuIHdyYXBwaW5nIHZhbHVlLiAqRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4qXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgd3JhcEluZGV4ID0gJ3ZhbHVlJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgcGFyYW1zIGFyZSBwcm92aWRlZCBieSBBbmd1bGFyIChidXQgY2FuIGFsc28gYmUgcGFzc2VkIG1hbnVhbGx5IGluIHRlc3RzKVxuICAgKiBAcGFyYW0gZGJOYW1lIGBpbmRleGVkREJgIGRhdGFiYXNlIG5hbWVcbiAgICogQHBhcmFtIHN0b3JlTmFtZSBgaW5kZXhlZERCYCBzdG9yZSBuYW1lXG4gICAqIEBwYXJhbSBkYlZlcnNpb24gYGluZGV4ZWREQmAgZGF0YWJhc2UgdmVyc2lvblxuICAgKiBAcGFyYW0gbm9XcmFwIEZsYWcgdG8gbm90IHdyYXAgYGluZGV4ZWREQmAgdmFsdWVzIGZvciBpbnRlcm9wZXJhYmlsaXR5IG9yIHRvIHdyYXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoSURCX0RCX05BTUUpIGRiTmFtZSA9IERFRkFVTFRfSURCX0RCX05BTUUsXG4gICAgQEluamVjdChJREJfU1RPUkVfTkFNRSkgc3RvcmVOYW1lID0gREVGQVVMVF9JREJfU1RPUkVfTkFNRSxcbiAgICBASW5qZWN0KElEQl9EQl9WRVJTSU9OKSBkYlZlcnNpb24gPSBERUZBVUxUX0lEQl9EQl9WRVJTSU9OLFxuICAgIEBJbmplY3QoSURCX05PX1dSQVApIG5vV3JhcCA9IERFRkFVTFRfSURCX05PX1dSQVAsXG4gICkge1xuXG4gICAgdGhpcy5kYk5hbWUgPSBkYk5hbWU7XG4gICAgdGhpcy5zdG9yZU5hbWUgPSBzdG9yZU5hbWU7XG4gICAgdGhpcy5kYlZlcnNpb24gPSBkYlZlcnNpb247XG4gICAgdGhpcy5ub1dyYXAgPSBub1dyYXA7XG5cbiAgICAvKiBDb25uZWN0IHRvIGBpbmRleGVkREJgLCB3aXRoIHByZWZpeCBpZiBwcm92aWRlZCBieSB0aGUgdXNlciAqL1xuICAgIHRoaXMuY29ubmVjdCgpO1xuXG4gIH1cblxuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgYGluZGV4ZWREQmAgY29ubmVjdGlvbi4gKk9ubHkgdXNlZnVsIGZvciBpbnRlcm9wZXJhYmlsaXR5LipcbiAgICogQHJldHVybnMgYGluZGV4ZWREQmAgZGF0YWJhc2UgbmFtZSwgc3RvcmUgbmFtZSBhbmQgZGF0YWJhc2UgdmVyc2lvblxuICAgKi9cbiAgZ2V0IGJhY2tpbmdTdG9yZSgpOiB7IGRhdGFiYXNlOiBzdHJpbmcsIHN0b3JlOiBzdHJpbmcsIHZlcnNpb246IG51bWJlciB9IHtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhYmFzZTogdGhpcy5kYk5hbWUsXG4gICAgICBzdG9yZTogdGhpcy5zdG9yZU5hbWUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLmRiVmVyc2lvbixcbiAgICB9O1xuXG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGl0ZW1zIGluIG91ciBgaW5kZXhlZERCYCBkYXRhYmFzZSBhbmQgb2JqZWN0IHN0b3JlXG4gICAqL1xuICBnZXQgc2l6ZSgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHJlYWQtb25seSBtb2RlICovXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oJ3JlYWRvbmx5JykucGlwZShcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlLCBldmVudHMgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBSZXF1ZXN0IHRvIGtub3cgdGhlIG51bWJlciBvZiBpdGVtcyAqL1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuY291bnQoKTtcblxuICAgICAgICAvKiBSZXR1cm4gdGhlIHJlc3VsdCAqL1xuICAgICAgICByZXR1cm4gZXZlbnRzLnBpcGUobWFwKCgpID0+IHJlcXVlc3QucmVzdWx0KSk7XG5cbiAgICAgIH0pLFxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGUgZmlyc3QgdmFsdWUgKi9cbiAgICAgIGZpcnN0KCksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gaXRlbSB2YWx1ZSBpbiBvdXIgYGluZGV4ZWREQmAgc3RvcmVcbiAgICogQHBhcmFtIGtleSBUaGUgaXRlbSdzIGtleVxuICAgKiBAcmV0dXJucyBUaGUgaXRlbSdzIHZhbHVlIGlmIHRoZSBrZXkgZXhpc3RzLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UsIHdyYXBwZWQgaW4gYW4gUnhKUyBgT2JzZXJ2YWJsZWBcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93biB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHJlYWQtb25seSBtb2RlICovXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oJ3JlYWRvbmx5JykucGlwZShcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlLCBldmVudHMgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBSZXF1ZXN0IHRoZSB2YWx1ZSB3aXRoIHRoZSBrZXkgcHJvdmlkZWQgYnkgdGhlIHVzZXIgKi9cbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHN0b3JlLmdldChrZXkpO1xuXG4gICAgICAgIC8qIExpc3RlbiBldmVudHMgYW5kIHJldHVybiB0aGUgcmVzdWx0ICovXG4gICAgICAgIHJldHVybiBldmVudHMucGlwZShtYXAoKCk6IHVua25vd24gPT4ge1xuXG4gICAgICAgICAgaWYgKChyZXF1ZXN0LnJlc3VsdCAhPT0gdW5kZWZpbmVkKSAmJiAocmVxdWVzdC5yZXN1bHQgIT09IG51bGwpKSB7XG5cbiAgICAgICAgICAgIC8qIFByaW9yIHRvIHY4LCB0aGUgdmFsdWUgd2FzIHdyYXBwZWQgaW4gYW4gYHsgdmFsdWU6IC4uLn1gIG9iamVjdCAqL1xuICAgICAgICAgICAgaWYgKCF0aGlzLm5vV3JhcCAmJiAodHlwZW9mIHJlcXVlc3QucmVzdWx0ID09PSAnb2JqZWN0JykgJiYgKHRoaXMud3JhcEluZGV4IGluIHJlcXVlc3QucmVzdWx0KSAmJlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtbWVtYmVyLWFjY2Vzc1xuICAgICAgICAgICAgKHJlcXVlc3QucmVzdWx0W3RoaXMud3JhcEluZGV4XSAhPT0gdW5kZWZpbmVkKSAmJiAocmVxdWVzdC5yZXN1bHRbdGhpcy53cmFwSW5kZXhdICE9PSBudWxsKSkge1xuXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLW1lbWJlci1hY2Nlc3NcbiAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QucmVzdWx0W3RoaXMud3JhcEluZGV4XTtcblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAvKiBDYXN0IHRvIHRoZSB3YW50ZWQgdHlwZSAqL1xuICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5yZXN1bHQ7XG5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIFJldHVybiBgdW5kZWZpbmVkYCBpZiB0aGUgdmFsdWUgaXMgZW1wdHkgKi9cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgICAgIH0pKTtcblxuICAgICAgfSksXG4gICAgICAvKiBUaGUgb2JzZXJ2YWJsZSB3aWxsIGNvbXBsZXRlIGFmdGVyIHRoZSBmaXJzdCB2YWx1ZSAqL1xuICAgICAgZmlyc3QoKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhbiBpdGVtIGluIG91ciBgaW5kZXhlZERCYCBzdG9yZVxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBkYXRhIFRoZSBpdGVtJ3MgdmFsdWVcbiAgICogQHJldHVybnMgQW4gUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIHNldChrZXk6IHN0cmluZywgZGF0YTogdW5rbm93bik6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICAvKiBTdG9yaW5nIGB1bmRlZmluZWRgIGluIGBpbmRleGVkRGJgIGNhbiBjYXVzZSBpc3N1ZXMgaW4gc29tZSBicm93c2VycyBzbyByZW1vdmluZyBpdGVtIGluc3RlYWQgKi9cbiAgICBpZiAoZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWxldGUoa2V5KTtcbiAgICB9XG5cbiAgICAvKiBPcGVuIGEgdHJhbnNhY3Rpb24gaW4gd3JpdGUgbW9kZSAqL1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKCdyZWFkd3JpdGUnKS5waXBlKFxuICAgICAgbWVyZ2VNYXAoKHRyYW5zYWN0aW9uRGF0YSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHsgc3RvcmUsIGV2ZW50cyB9ID0gdHJhbnNhY3Rpb25EYXRhO1xuXG4gICAgICAgIC8qIFByaW9yIHRvIHY4LCBkYXRhIHdhcyB3cmFwcGVkIGluIGEgYHsgdmFsdWU6IC4uLiB9YCBvYmplY3QgKi9cbiAgICAgICAgY29uc3QgZGF0YVRvU3RvcmUgPSB0aGlzLm5vV3JhcCA/IGRhdGEgOiB7IFt0aGlzLndyYXBJbmRleF06IGRhdGEgfTtcblxuICAgICAgICAvKiBBZGQgaWYgdGhlIGl0ZW0gaXMgbm90IGV4aXN0aW5nIHlldCwgb3IgdXBkYXRlIG90aGVyd2lzZSAqL1xuICAgICAgICBzdG9yZS5wdXQoZGF0YVRvU3RvcmUsIGtleSk7XG5cbiAgICAgICAgLyogTGlzdGVuIHRvIGV2ZW50cyBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFzIG5vIHZhbHVlIGlzIGV4cGVjdGVkICovXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5zYWZlLWFyZ3VtZW50XG4gICAgICAgIHJldHVybiBldmVudHMucGlwZShtYXBUbyh1bmRlZmluZWQpKTtcblxuICAgICAgfSksXG4gICAgICAvKiBUaGUgb2JzZXJ2YWJsZSB3aWxsIGNvbXBsZXRlIGFmdGVyIHRoZSBmaXJzdCB2YWx1ZSAqL1xuICAgICAgZmlyc3QoKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyBhbiBpdGVtIGluIG91ciBgaW5kZXhlZERCYCBzdG9yZVxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEByZXR1cm5zIEFuIFJ4SlMgYE9ic2VydmFibGVgIHRvIHdhaXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBkZWxldGUoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHdyaXRlIG1vZGUgKi9cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbigncmVhZHdyaXRlJykucGlwZShcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlLCBldmVudHMgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBEZWxldGUgdGhlIGl0ZW0gaW4gc3RvcmUgKi9cbiAgICAgICAgc3RvcmUuZGVsZXRlKGtleSk7XG5cbiAgICAgICAgLyogTGlzdGVuIHRvIGV2ZW50cyBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFzIG5vIGRhdGEgaXMgZXhwZWN0ZWQgaGVyZSAqL1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1hcmd1bWVudFxuICAgICAgICByZXR1cm4gZXZlbnRzLnBpcGUobWFwVG8odW5kZWZpbmVkKSk7XG5cbiAgICAgIH0pLFxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSBhZnRlciB0aGUgZmlyc3QgdmFsdWUgKi9cbiAgICAgIGZpcnN0KCksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGl0ZW1zIGZyb20gb3VyIGBpbmRleGVkREJgIG9iamV0IHN0b3JlXG4gICAqIEByZXR1cm5zIEFuIFJ4SlMgYE9ic2VydmFibGVgIHRvIHdhaXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uXG4gICAqL1xuICBjbGVhcigpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHdyaXRlIG1vZGUgKi9cbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbigncmVhZHdyaXRlJykucGlwZShcbiAgICAgIG1lcmdlTWFwKCh0cmFuc2FjdGlvbkRhdGEpID0+IHtcblxuICAgICAgICBjb25zdCB7IHN0b3JlLCBldmVudHMgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBEZWxldGUgYWxsIGl0ZW1zIGluIG9iamVjdCBzdG9yZSAqL1xuICAgICAgICBzdG9yZS5jbGVhcigpO1xuXG4gICAgICAgIC8qIExpc3RlbiB0byBldmVudHMgYW5kIHJldHVybiBgdW5kZWZpbmVkYCBhcyBubyBkYXRhIGlzIGV4cGVjdGVkIGhlcmUgKi9cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtYXJndW1lbnRcbiAgICAgICAgcmV0dXJuIGV2ZW50cy5waXBlKG1hcFRvKHVuZGVmaW5lZCkpO1xuXG4gICAgICB9KSxcbiAgICAgIC8qIFRoZSBvYnNlcnZhYmxlIHdpbGwgY29tcGxldGUgKi9cbiAgICAgIGZpcnN0KCksXG4gICAgKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIGtleXMgaW4gb3VyIGBpbmRleGVkREJgIHN0b3JlXG4gICAqIEByZXR1cm5zIEFuIFJ4SlMgYE9ic2VydmFibGVgIGl0ZXJhdGluZyBvbiBlYWNoIGtleVxuICAgKi9cbiAga2V5cygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXG4gICAgLyogT3BlbiBhIHRyYW5zYWN0aW9uIGluIHJlYWQtb25seSBtb2RlICovXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb24oJ3JlYWRvbmx5JykucGlwZShcbiAgICAgIC8qIGBmaXJzdCgpYCBpcyB1c2VkIGFzIHRoZSBmaW5hbCBvcGVyYXRvciBpbiBvdGhlciBtZXRob2RzIHRvIGNvbXBsZXRlIHRoZSBgT2JzZXJ2YWJsZWBcbiAgICAgICAqIChhcyBpdCBhbGwgc3RhcnRzIGZyb20gYSBgUmVwbGF5U3ViamVjdGAgd2hpY2ggbmV2ZXIgZW5kcyksXG4gICAgICAgKiBidXQgYXMgdGhpcyBtZXRob2QgaXMgaXRlcmF0aW5nIG92ZXIgbXVsdGlwbGUgdmFsdWVzLCBgZmlyc3QoKWAgKiptdXN0KiogYmUgdXNlZCBoZXJlICovXG4gICAgICBmaXJzdCgpLFxuICAgICAgbWVyZ2VNYXAoKHRyYW5zYWN0aW9uRGF0YSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IHsgc3RvcmUgfSA9IHRyYW5zYWN0aW9uRGF0YTtcblxuICAgICAgICAvKiBPcGVuIGEgY3Vyc29yIG9uIHRoZSBzdG9yZVxuICAgICAgICAgKiBBdm9pZCBpc3N1ZXMgbGlrZSBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2lzc3Vlcy82OSAqL1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUub3BlbktleUN1cnNvcigpO1xuXG4gICAgICAgIC8qIExpc3RlbiB0byBzdWNjZXNzIGV2ZW50ICovXG4gICAgICAgIGNvbnN0IHN1Y2Nlc3MkID0gZnJvbUV2ZW50KHJlcXVlc3QsICdzdWNjZXNzJykucGlwZShcbiAgICAgICAgICAvKiBTdG9wIHRoZSBgT2JzZXJ2YWJsZWAgd2hlbiB0aGUgY3Vyc29yIGlzIGBudWxsYCAqL1xuICAgICAgICAgIHRha2VXaGlsZSgoKSA9PiAocmVxdWVzdC5yZXN1bHQgIT09IG51bGwpKSxcbiAgICAgICAgICAvKiBUaGlzIGxpYiBvbmx5IGFsbG93cyBzdHJpbmcga2V5cywgYnV0IHVzZXIgY291bGQgaGF2ZSBhZGRlZCBvdGhlciB0eXBlcyBvZiBrZXlzIGZyb20gb3V0c2lkZVxuICAgICAgICAgICAqIEl0J3MgT0sgdG8gY2FzdCBhcyB0aGUgY3Vyc29yIGFzIGJlZW4gdGVzdGVkIGluIHRoZSBwcmV2aW91cyBvcGVyYXRvciAqL1xuICAgICAgICAgIG1hcCgoKSA9PiAocmVxdWVzdC5yZXN1bHQgYXMgSURCQ3Vyc29yKS5rZXkudG9TdHJpbmcoKSksXG4gICAgICAgICAgLyogSXRlcmF0ZSBvbiB0aGUgY3Vyc29yICovXG4gICAgICAgICAgdGFwKCgpID0+IHsgKHJlcXVlc3QucmVzdWx0IGFzIElEQkN1cnNvcikuY29udGludWUoKTsgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLyogTGlzdGVuIHRvIGVycm9yIGV2ZW50IGFuZCBpZiBzbywgdGhyb3cgYW4gZXJyb3IgKi9cbiAgICAgICAgY29uc3QgZXJyb3IkID0gdGhpcy5saXN0ZW5FcnJvcihyZXF1ZXN0KTtcblxuICAgICAgICAvKiBDaG9vc2UgdGhlIGZpcnN0IGV2ZW50IHRvIG9jY3VyICovXG4gICAgICAgIHJldHVybiByYWNlKFtzdWNjZXNzJCwgZXJyb3IkXSk7XG5cbiAgICAgIH0pLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGtleSBleGlzdHMgaW4gb3VyIGBpbmRleGVkREJgIHN0b3JlXG4gICAqIEByZXR1cm5zIEFuIFJ4SlMgYE9ic2VydmFibGVgIHRlbGxpbmcgaWYgdGhlIGtleSBleGlzdHMgb3Igbm90XG4gICAqL1xuICBoYXMoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcblxuICAgIC8qIE9wZW4gYSB0cmFuc2FjdGlvbiBpbiByZWFkLW9ubHkgbW9kZSAqL1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uKCdyZWFkb25seScpLnBpcGUoXG4gICAgICBtZXJnZU1hcCgodHJhbnNhY3Rpb25EYXRhKSA9PiB7XG5cbiAgICAgICAgY29uc3QgeyBzdG9yZSwgZXZlbnRzIH0gPSB0cmFuc2FjdGlvbkRhdGE7XG5cbiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlXG4gICAgICAgICAqIEZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzY5XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUuZ2V0S2V5KGtleSk7XG5cbiAgICAgICAgLyogTGlzdGVuIHRvIGV2ZW50cyBhbmQgcmV0dXJuIGB0cnVlYCBvciBgZmFsc2VgICovXG4gICAgICAgIHJldHVybiBldmVudHMucGlwZShtYXAoKCkgPT4gKHJlcXVlc3QucmVzdWx0ICE9PSB1bmRlZmluZWQpID8gdHJ1ZSA6IGZhbHNlKSk7XG5cbiAgICAgIH0pLFxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSAqL1xuICAgICAgZmlyc3QoKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ29ubmVjdHMgdG8gYGluZGV4ZWREQmAgYW5kIGNyZWF0ZXMgdGhlIG9iamVjdCBzdG9yZSBvbiBmaXJzdCB0aW1lXG4gICAqL1xuICBwcm90ZWN0ZWQgY29ubmVjdCgpOiB2b2lkIHtcblxuICAgIGxldCByZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0O1xuXG4gICAgLyogQ29ubmVjdCB0byBgaW5kZXhlZERCYFxuICAgICAqIFdpbGwgZmFpbCBpbiBTYWZhcmkgY3Jvc3Mtb3JpZ2luIGlmcmFtZXNcbiAgICAgKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2lzc3Vlcy80Mn0gKi9cbiAgICB0cnkge1xuXG4gICAgICAvKiBEbyBOT1QgZXhwbGljaXQgYHdpbmRvd2AgaGVyZSwgYXMgYGluZGV4ZWREQmAgY291bGQgYmUgdXNlZCBmcm9tIGEgd2ViIHdvcmtlciB0b28gKi9cbiAgICAgIHJlcXVlc3QgPSBpbmRleGVkREIub3Blbih0aGlzLmRiTmFtZSwgdGhpcy5kYlZlcnNpb24pO1xuXG4gICAgfSBjYXRjaCB7XG5cbiAgICAgIHRoaXMuZGF0YWJhc2UuZXJyb3IobmV3IElEQkJyb2tlbkVycm9yKCkpO1xuXG4gICAgICByZXR1cm47XG5cbiAgICB9XG5cbiAgICAvKiBDcmVhdGUgc3RvcmUgb24gZmlyc3QgY29ubmVjdGlvbiAqL1xuICAgIHRoaXMuY3JlYXRlU3RvcmUocmVxdWVzdCk7XG5cbiAgICAvKiBMaXN0ZW4gdG8gc3VjY2VzcyBhbmQgZXJyb3IgZXZlbnRzICovXG4gICAgY29uc3Qgc3VjY2VzcyQgPSBmcm9tRXZlbnQocmVxdWVzdCwgJ3N1Y2Nlc3MnKTtcbiAgICBjb25zdCBlcnJvciQgPSB0aGlzLmxpc3RlbkVycm9yKHJlcXVlc3QpO1xuXG4gICAgLyogQ2hvb3NlIHRoZSBmaXJzdCB0byBvY2N1ciAqL1xuICAgIHJhY2UoW3N1Y2Nlc3MkLCBlcnJvciRdKVxuICAgICAgLyogVGhlIG9ic2VydmFibGUgd2lsbCBjb21wbGV0ZSAqL1xuICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyogUmVnaXN0ZXIgdGhlIGRhdGFiYXNlIGNvbm5lY3Rpb24gaW4gdGhlIGBSZXBsYXlTdWJqZWN0YCBmb3IgZnVydGhlciBhY2Nlc3MgKi9cbiAgICAgICAgICB0aGlzLmRhdGFiYXNlLm5leHQocmVxdWVzdC5yZXN1bHQpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgIC8qIEZpcmVmb3ggcHJpdmF0ZSBtb2RlIGlzc3VlOiBmYWxsYmFjayBzdG9yYWdlIGlmIEluZGV4ZWREYiBjb25uZWN0aW9uIGlzIGZhaWxpbmdcbiAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTk4Mn1cbiAgICAgICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzI2fSAqL1xuICAgICAgICAgIHRoaXMuZGF0YWJhc2UuZXJyb3IobmV3IElEQkJyb2tlbkVycm9yKCkpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgc3RvcmUgb24gZmlyc3QgdXNlIG9mIGBpbmRleGVkREJgXG4gICAqIEBwYXJhbSByZXF1ZXN0IGBpbmRleGVkREJgIGRhdGFiYXNlIG9wZW5pbmcgcmVxdWVzdFxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN0b3JlKHJlcXVlc3Q6IElEQk9wZW5EQlJlcXVlc3QpOiB2b2lkIHtcblxuICAgIC8qIExpc3RlbiB0byB0aGUgZXZlbnQgZmlyZWQgb24gZmlyc3QgY29ubmVjdGlvbiAqL1xuICAgIGZyb21FdmVudChyZXF1ZXN0LCAndXBncmFkZW5lZWRlZCcpXG4gICAgICAvKiBUaGUgb2JzZXJ2YWJsZSB3aWxsIGNvbXBsZXRlICovXG4gICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcblxuICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBzdG9yZSBhbHJlYWR5IGV4aXN0cywgdG8gYXZvaWQgZXJyb3IgKi9cbiAgICAgICAgICBpZiAoIXJlcXVlc3QucmVzdWx0Lm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnModGhpcy5zdG9yZU5hbWUpKSB7XG5cbiAgICAgICAgICAgIC8qIENyZWF0ZSB0aGUgb2JqZWN0IHN0b3JlICovXG4gICAgICAgICAgICByZXF1ZXN0LnJlc3VsdC5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnN0b3JlTmFtZSk7XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGFuIGBpbmRleGVkREJgIHRyYW5zYWN0aW9uIGFuZCBnZXQgb3VyIHN0b3JlXG4gICAqIEBwYXJhbSBtb2RlIGByZWFkb25seWAgb3IgYHJlYWR3cml0ZWBcbiAgICogQHJldHVybnMgQW4gYGluZGV4ZWREQmAgdHJhbnNhY3Rpb24gc3RvcmUgYW5kIGV2ZW50cywgd3JhcHBlZCBpbiBhbiBSeEpTIGBPYnNlcnZhYmxlYFxuICAgKi9cbiAgcHJvdGVjdGVkIHRyYW5zYWN0aW9uKG1vZGU6IElEQlRyYW5zYWN0aW9uTW9kZSk6IE9ic2VydmFibGU8e1xuICAgIHN0b3JlOiBJREJPYmplY3RTdG9yZTtcbiAgICBldmVudHM6IE9ic2VydmFibGU8RXZlbnQ+O1xuICB9PiB7XG5cbiAgICAvKiBGcm9tIHRoZSBgaW5kZXhlZERCYCBjb25uZWN0aW9uLCBvcGVuIGEgdHJhbnNhY3Rpb24gYW5kIGdldCB0aGUgc3RvcmUgKi9cbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZVxuICAgICAgLnBpcGUobWVyZ2VNYXAoKGRhdGFiYXNlKSA9PiB7XG5cbiAgICAgICAgbGV0IHRyYW5zYWN0aW9uOiBJREJUcmFuc2FjdGlvbjtcblxuICAgICAgICB0cnkge1xuXG4gICAgICAgICAgdHJhbnNhY3Rpb24gPSBkYXRhYmFzZS50cmFuc2FjdGlvbihbdGhpcy5zdG9yZU5hbWVdLCBtb2RlKTtcblxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuXG4gICAgICAgICAgICAvKiBUaGUgc3RvcmUgY291bGQgaGF2ZSBiZWVuIGRlbGV0ZWQgZnJvbSBvdXRzaWRlICovXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBET01FeGNlcHRpb24pO1xuXG4gICAgICAgIH1cblxuICAgICAgICAvKiBHZXQgdGhlIHN0b3JlIGZyb20gdGhlIHRyYW5zYWN0aW9uICovXG4gICAgICAgIGNvbnN0IHN0b3JlID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5zdG9yZU5hbWUpO1xuXG4gICAgICAgIC8qIExpc3RlbiB0cmFuc2FjdGlvbiBgY29tcGxldGVgIGFuZCBgZXJyb3JgIGV2ZW50cyAqL1xuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLmxpc3RlblRyYW5zYWN0aW9uRXZlbnRzKHRyYW5zYWN0aW9uKTtcblxuICAgICAgICByZXR1cm4gb2YoeyBzdG9yZSwgZXZlbnRzIH0pO1xuXG4gICAgICB9KSk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gZXJyb3JzIG9uIGEgdHJhbnNhY3Rpb24gb3IgcmVxdWVzdCwgYW5kIHRocm93IGlmIHRyaWdlcnJlZFxuICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25PclJlcXVlc3QgYGluZGV4ZWREYmAgdHJhbnNhY3Rpb24gb3IgcmVxdWVzdCB0byBsaXN0ZW5cbiAgICogQHJldHVybnMgQW4gYE9ic2VydmFibGVgIGxpc3RlbmluZyB0byBlcnJvcnNcbiAgICovXG4gIHByb3RlY3RlZCBsaXN0ZW5FcnJvcih0cmFuc2FjdGlvbk9yUmVxdWVzdDogSURCVHJhbnNhY3Rpb24gfCBJREJSZXF1ZXN0KTogT2JzZXJ2YWJsZTxuZXZlcj4ge1xuXG4gICAgcmV0dXJuIGZyb21FdmVudCh0cmFuc2FjdGlvbk9yUmVxdWVzdCwgJ2Vycm9yJykucGlwZShcbiAgICAgIC8qIFRocm93IG9uIGVycm9yIHRvIGJlIGFibGUgdG8gY2F0Y2ggZXJyb3JzIGluIFJ4SlMgd2F5LlxuICAgICAgICogSGVyZSBgZXZlbnQudGFyZ2V0YCBtdXN0IGJlIHVzZWQsIGFzIGB0cmFuc2FjdGlvbk9yUmVxdWVzdC5lcnJvcmAgd2lsbCBiZSBgbnVsbGBcbiAgICAgICAqIGlmIHdlIGFyZSBvbiB0aGUgcmVxdWVzdCBhbmQgdGhlIGVycm9yIGlzIG9ubHkgdHJpZ2dlcmVkIGxhdGVyIGJ5IHRoZSB0cmFuc2FjdGlvbiAqL1xuICAgICAgbWVyZ2VNYXAoKGV2ZW50KSA9PiB0aHJvd0Vycm9yKChldmVudC50YXJnZXQgYXMgSURCVHJhbnNhY3Rpb24gfCBJREJSZXF1ZXN0KS5lcnJvcikpLFxuICAgICk7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdHJhbnNhY3Rpb24gYGNvbXBsZXRlYCBhbmQgYGVycm9yYCBldmVudHNcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIFRyYW5zYWN0aW9uIHRvIGxpc3RlblxuICAgKiBAcmV0dXJucyBBbiBgT2JzZXJ2YWJsZWAgbGlzdGVuaW5nIHRvIHRyYW5zYWN0aW9uIGBjb21wbGV0ZWAgYW5kIGBlcnJvcmAgZXZlbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgbGlzdGVuVHJhbnNhY3Rpb25FdmVudHModHJhbnNhY3Rpb246IElEQlRyYW5zYWN0aW9uKTogT2JzZXJ2YWJsZTxFdmVudD4ge1xuXG4gICAgLyogTGlzdGVuIHRvIHRoZSBgY29tcGxldGVgIGV2ZW50ICovXG4gICAgY29uc3QgY29tcGxldGUkID0gZnJvbUV2ZW50KHRyYW5zYWN0aW9uLCAnY29tcGxldGUnKTtcblxuICAgIC8qIExpc3RlbiB0byB0aGUgYGVycm9yYCBldmVudCAqL1xuICAgIGNvbnN0IGVycm9yJCA9IHRoaXMubGlzdGVuRXJyb3IodHJhbnNhY3Rpb24pO1xuXG4gICAgLyogQ2hvb3NlIHRoZSBmaXJzdCBldmVudCB0byBvY2N1ciAqL1xuICAgIHJldHVybiByYWNlKFtjb21wbGV0ZSQsIGVycm9yJF0pO1xuXG4gIH1cblxufVxuIl19
@@ -0,0 +1,78 @@
1
+ import { Injectable, PLATFORM_ID } from '@angular/core';
2
+ import { isPlatformBrowser } from '@angular/common';
3
+ import { IDB_STORE_NAME, IDB_DB_NAME, LS_PREFIX, IDB_DB_VERSION, IDB_NO_WRAP } from '../tokens';
4
+ import { IndexedDBDatabase } from './indexeddb-database';
5
+ import { LocalStorageDatabase } from './localstorage-database';
6
+ import { MemoryDatabase } from './memory-database';
7
+ import * as i0 from "@angular/core";
8
+ /**
9
+ * Factory to create a storage according to browser support
10
+ * @param platformId Context about the platform (`browser`, `server`...)
11
+ * @param LSPrefix Prefix for `localStorage` keys to avoid collision for multiple apps on the same subdomain
12
+ * @param IDBDBName `indexedDB` database name
13
+ * @param IDBstoreName `indexedDB` storeName name
14
+ * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/blob/main/docs/BROWSERS_SUPPORT.md}
15
+ */
16
+ export function localDatabaseFactory(platformId, LSPrefix, IDBDBName, IDBStoreName, IDBDBVersion, IDBNoWrap) {
17
+ /* When storage is fully disabled in browser (via the "Block all cookies" option),
18
+ * just trying to check `indexedDB` or `localStorage` variables causes a security exception.
19
+ * Prevents https://github.com/cyrilletuzi/angular-async-local-storage/issues/118
20
+ */
21
+ try {
22
+ // Do not explicit `window` here, as the global object is not the same in web workers
23
+ if (isPlatformBrowser(platformId) && (indexedDB !== undefined) && (indexedDB !== null) && ('open' in indexedDB)) {
24
+ /* Check:
25
+ * - if we are in a browser context (issue: server-side rendering)
26
+ * - it could exist but be `undefined` or `null`
27
+ * - it could exists but not having a working API
28
+ * Will be the case for:
29
+ * - All other browsers in normal mode
30
+ * - Chromium / Safari private mode, but in this case, data will be swiped when the user leaves the app */
31
+ return new IndexedDBDatabase(IDBDBName, IDBStoreName, IDBDBVersion, IDBNoWrap);
32
+ }
33
+ else if (isPlatformBrowser(platformId)
34
+ && (localStorage !== undefined) && (localStorage !== null) && ('getItem' in localStorage)) {
35
+ /* Check:
36
+ * - if we are in a browser context (issue: server-side rendering)
37
+ * - if `localStorage` exists (to be sure)
38
+ * - it could exists but not having a working API
39
+ * Will be the case for:
40
+ * - Safari cross-origin iframes, detected later in `IndexedDBDatabase.connect()`
41
+ * @see {@link https://github.com/cyrilletuzi/angular-async-local-storage/issues/42}
42
+ * - Firefox private mode, but in this case, data will be swiped when the user leaves the app
43
+ * For Firefox, can only be detected later in `IndexedDBDatabase.connect()`
44
+ * @see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=781982}
45
+ */
46
+ return new LocalStorageDatabase(LSPrefix);
47
+ }
48
+ }
49
+ catch {
50
+ // Nothing to do
51
+ }
52
+ /* Will be the case for:
53
+ * - In browsers if storage has been fully disabled (via the "Block all cookies" option)
54
+ * - Server-side rendering
55
+ * - All other non-browser context
56
+ */
57
+ return new MemoryDatabase();
58
+ }
59
+ export class LocalDatabase {
60
+ }
61
+ LocalDatabase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: LocalDatabase, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
62
+ LocalDatabase.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: LocalDatabase, providedIn: 'root', useFactory: localDatabaseFactory, deps: [{ token: PLATFORM_ID }, { token: LS_PREFIX }, { token: IDB_DB_NAME }, { token: IDB_STORE_NAME }, { token: IDB_DB_VERSION }, { token: IDB_NO_WRAP }] });
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: LocalDatabase, decorators: [{
64
+ type: Injectable,
65
+ args: [{
66
+ providedIn: 'root',
67
+ useFactory: localDatabaseFactory,
68
+ deps: [
69
+ PLATFORM_ID,
70
+ LS_PREFIX,
71
+ IDB_DB_NAME,
72
+ IDB_STORE_NAME,
73
+ IDB_DB_VERSION,
74
+ IDB_NO_WRAP,
75
+ ]
76
+ }]
77
+ }] });
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtcHdhL2xvY2FsLXN0b3JhZ2Uvc3JjL2xpYi9kYXRhYmFzZXMvbG9jYWwtZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHcEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQUVuRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxVQUFrQixFQUFFLFFBQWdCLEVBQUUsU0FBaUIsRUFBRSxZQUFvQixFQUM3RSxZQUFvQixFQUFFLFNBQWtCO0lBRXhDOzs7T0FHRztJQUNILElBQUk7UUFFRixxRkFBcUY7UUFDckYsSUFBSSxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRTtZQUUvRzs7Ozs7O3FIQU15RztZQUN6RyxPQUFPLElBQUksaUJBQWlCLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FFaEY7YUFBTSxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQztlQUNyQyxDQUFDLFlBQVksS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxZQUFZLENBQUMsRUFBRTtZQUV6Rjs7Ozs7Ozs7OztjQVVFO1lBQ0YsT0FBTyxJQUFJLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBRTNDO0tBRUY7SUFBQyxNQUFNO1FBQ04sZ0JBQWdCO0tBQ2pCO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUU5QixDQUFDO0FBY0QsTUFBTSxPQUFnQixhQUFhOzswR0FBYixhQUFhOzhHQUFiLGFBQWEsY0FYckIsTUFBTSxjQUNOLG9CQUFvQixrQkFFOUIsV0FBVyxhQUNYLFNBQVMsYUFDVCxXQUFXLGFBQ1gsY0FBYyxhQUNkLGNBQWMsYUFDZCxXQUFXOzJGQUdPLGFBQWE7a0JBWmxDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07b0JBQ2xCLFVBQVUsRUFBRSxvQkFBb0I7b0JBQ2hDLElBQUksRUFBRTt3QkFDSixXQUFXO3dCQUNYLFNBQVM7d0JBQ1QsV0FBVzt3QkFDWCxjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsV0FBVztxQkFDWjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IElEQl9TVE9SRV9OQU1FLCBJREJfREJfTkFNRSwgTFNfUFJFRklYLCBJREJfREJfVkVSU0lPTiwgSURCX05PX1dSQVAgfSBmcm9tICcuLi90b2tlbnMnO1xuaW1wb3J0IHsgSW5kZXhlZERCRGF0YWJhc2UgfSBmcm9tICcuL2luZGV4ZWRkYi1kYXRhYmFzZSc7XG5pbXBvcnQgeyBMb2NhbFN0b3JhZ2VEYXRhYmFzZSB9IGZyb20gJy4vbG9jYWxzdG9yYWdlLWRhdGFiYXNlJztcbmltcG9ydCB7IE1lbW9yeURhdGFiYXNlIH0gZnJvbSAnLi9tZW1vcnktZGF0YWJhc2UnO1xuXG4vKipcbiAqIEZhY3RvcnkgdG8gY3JlYXRlIGEgc3RvcmFnZSBhY2NvcmRpbmcgdG8gYnJvd3NlciBzdXBwb3J0XG4gKiBAcGFyYW0gcGxhdGZvcm1JZCBDb250ZXh0IGFib3V0IHRoZSBwbGF0Zm9ybSAoYGJyb3dzZXJgLCBgc2VydmVyYC4uLilcbiAqIEBwYXJhbSBMU1ByZWZpeCBQcmVmaXggZm9yIGBsb2NhbFN0b3JhZ2VgIGtleXMgdG8gYXZvaWQgY29sbGlzaW9uIGZvciBtdWx0aXBsZSBhcHBzIG9uIHRoZSBzYW1lIHN1YmRvbWFpblxuICogQHBhcmFtIElEQkRCTmFtZSBgaW5kZXhlZERCYCBkYXRhYmFzZSBuYW1lXG4gKiBAcGFyYW0gSURCc3RvcmVOYW1lIGBpbmRleGVkREJgIHN0b3JlTmFtZSBuYW1lXG4gKiBAc2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vY3lyaWxsZXR1emkvYW5ndWxhci1hc3luYy1sb2NhbC1zdG9yYWdlL2Jsb2IvbWFpbi9kb2NzL0JST1dTRVJTX1NVUFBPUlQubWR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbERhdGFiYXNlRmFjdG9yeShcbiAgcGxhdGZvcm1JZDogc3RyaW5nLCBMU1ByZWZpeDogc3RyaW5nLCBJREJEQk5hbWU6IHN0cmluZywgSURCU3RvcmVOYW1lOiBzdHJpbmcsXG4gIElEQkRCVmVyc2lvbjogbnVtYmVyLCBJREJOb1dyYXA6IGJvb2xlYW4pOiBMb2NhbERhdGFiYXNlIHtcblxuICAvKiBXaGVuIHN0b3JhZ2UgaXMgZnVsbHkgZGlzYWJsZWQgaW4gYnJvd3NlciAodmlhIHRoZSBcIkJsb2NrIGFsbCBjb29raWVzXCIgb3B0aW9uKSxcbiAgICoganVzdCB0cnlpbmcgdG8gY2hlY2sgYGluZGV4ZWREQmAgb3IgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGVzIGNhdXNlcyBhIHNlY3VyaXR5IGV4Y2VwdGlvbi5cbiAgICogUHJldmVudHMgaHR0cHM6Ly9naXRodWIuY29tL2N5cmlsbGV0dXppL2FuZ3VsYXItYXN5bmMtbG9jYWwtc3RvcmFnZS9pc3N1ZXMvMTE4XG4gICAqL1xuICB0cnkge1xuXG4gICAgLy8gRG8gbm90IGV4cGxpY2l0IGB3aW5kb3dgIGhlcmUsIGFzIHRoZSBnbG9iYWwgb2JqZWN0IGlzIG5vdCB0aGUgc2FtZSBpbiB3ZWIgd29ya2Vyc1xuICAgIGlmIChpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSAmJiAoaW5kZXhlZERCICE9PSB1bmRlZmluZWQpICYmIChpbmRleGVkREIgIT09IG51bGwpICYmICgnb3BlbicgaW4gaW5kZXhlZERCKSkge1xuXG4gICAgICAvKiBDaGVjazpcbiAgICAgICogLSBpZiB3ZSBhcmUgaW4gYSBicm93c2VyIGNvbnRleHQgKGlzc3VlOiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcpXG4gICAgICAqIC0gaXQgY291bGQgZXhpc3QgYnV0IGJlIGB1bmRlZmluZWRgIG9yIGBudWxsYFxuICAgICAgKiAtIGl0IGNvdWxkIGV4aXN0cyBidXQgbm90IGhhdmluZyBhIHdvcmtpbmcgQVBJXG4gICAgICAqIFdpbGwgYmUgdGhlIGNhc2UgZm9yOlxuICAgICAgKiAtIEFsbCBvdGhlciBicm93c2VycyBpbiBub3JtYWwgbW9kZVxuICAgICAgKiAtIENocm9taXVtIC8gU2FmYXJpIHByaXZhdGUgbW9kZSwgYnV0IGluIHRoaXMgY2FzZSwgZGF0YSB3aWxsIGJlIHN3aXBlZCB3aGVuIHRoZSB1c2VyIGxlYXZlcyB0aGUgYXBwICovXG4gICAgICByZXR1cm4gbmV3IEluZGV4ZWREQkRhdGFiYXNlKElEQkRCTmFtZSwgSURCU3RvcmVOYW1lLCBJREJEQlZlcnNpb24sIElEQk5vV3JhcCk7XG5cbiAgICB9IGVsc2UgaWYgKGlzUGxhdGZvcm1Ccm93c2VyKHBsYXRmb3JtSWQpXG4gICAgJiYgKGxvY2FsU3RvcmFnZSAhPT0gdW5kZWZpbmVkKSAmJiAobG9jYWxTdG9yYWdlICE9PSBudWxsKSAmJiAoJ2dldEl0ZW0nIGluIGxvY2FsU3RvcmFnZSkpIHtcblxuICAgICAgLyogQ2hlY2s6XG4gICAgICAqIC0gaWYgd2UgYXJlIGluIGEgYnJvd3NlciBjb250ZXh0IChpc3N1ZTogc2VydmVyLXNpZGUgcmVuZGVyaW5nKVxuICAgICAgKiAtIGlmIGBsb2NhbFN0b3JhZ2VgIGV4aXN0cyAodG8gYmUgc3VyZSlcbiAgICAgICogLSBpdCBjb3VsZCBleGlzdHMgYnV0IG5vdCBoYXZpbmcgYSB3b3JraW5nIEFQSVxuICAgICAgKiBXaWxsIGJlIHRoZSBjYXNlIGZvcjpcbiAgICAgICogLSBTYWZhcmkgY3Jvc3Mtb3JpZ2luIGlmcmFtZXMsIGRldGVjdGVkIGxhdGVyIGluIGBJbmRleGVkREJEYXRhYmFzZS5jb25uZWN0KClgXG4gICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9jeXJpbGxldHV6aS9hbmd1bGFyLWFzeW5jLWxvY2FsLXN0b3JhZ2UvaXNzdWVzLzQyfVxuICAgICAgKiAtIEZpcmVmb3ggcHJpdmF0ZSBtb2RlLCBidXQgaW4gdGhpcyBjYXNlLCBkYXRhIHdpbGwgYmUgc3dpcGVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBhcHBcbiAgICAgICogRm9yIEZpcmVmb3gsIGNhbiBvbmx5IGJlIGRldGVjdGVkIGxhdGVyIGluIGBJbmRleGVkREJEYXRhYmFzZS5jb25uZWN0KClgXG4gICAgICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTc4MTk4Mn1cbiAgICAgICovXG4gICAgICByZXR1cm4gbmV3IExvY2FsU3RvcmFnZURhdGFiYXNlKExTUHJlZml4KTtcblxuICAgIH1cblxuICB9IGNhdGNoIHtcbiAgICAvLyBOb3RoaW5nIHRvIGRvXG4gIH1cblxuICAvKiBXaWxsIGJlIHRoZSBjYXNlIGZvcjpcbiAgICogLSBJbiBicm93c2VycyBpZiBzdG9yYWdlIGhhcyBiZWVuIGZ1bGx5IGRpc2FibGVkICh2aWEgdGhlIFwiQmxvY2sgYWxsIGNvb2tpZXNcIiBvcHRpb24pXG4gICAqIC0gU2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAqIC0gQWxsIG90aGVyIG5vbi1icm93c2VyIGNvbnRleHRcbiAgICovXG4gIHJldHVybiBuZXcgTWVtb3J5RGF0YWJhc2UoKTtcblxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290JyxcbiAgdXNlRmFjdG9yeTogbG9jYWxEYXRhYmFzZUZhY3RvcnksXG4gIGRlcHM6IFtcbiAgICBQTEFURk9STV9JRCxcbiAgICBMU19QUkVGSVgsXG4gICAgSURCX0RCX05BTUUsXG4gICAgSURCX1NUT1JFX05BTUUsXG4gICAgSURCX0RCX1ZFUlNJT04sXG4gICAgSURCX05PX1dSQVAsXG4gIF1cbn0pXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTG9jYWxEYXRhYmFzZSB7XG5cbiAgYWJzdHJhY3QgcmVhZG9ubHkgc2l6ZTogT2JzZXJ2YWJsZTxudW1iZXI+O1xuXG4gIGFic3RyYWN0IGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93biB8IHVuZGVmaW5lZD47XG4gIGFic3RyYWN0IHNldChrZXk6IHN0cmluZywgZGF0YTogdW5rbm93bik6IE9ic2VydmFibGU8dW5kZWZpbmVkPjtcbiAgYWJzdHJhY3QgZGVsZXRlKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+O1xuICBhYnN0cmFjdCBjbGVhcigpOiBPYnNlcnZhYmxlPHVuZGVmaW5lZD47XG4gIGFic3RyYWN0IGtleXMoKTogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuICBhYnN0cmFjdCBoYXMoa2V5OiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuXG59XG4iXX0=
@@ -149,9 +149,9 @@ export class LocalStorageDatabase {
149
149
  return `${this.prefix}${key}`;
150
150
  }
151
151
  }
152
- LocalStorageDatabase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.0-rc.0", ngImport: i0, type: LocalStorageDatabase, deps: [{ token: LS_PREFIX }], target: i0.ɵɵFactoryTarget.Injectable });
153
- LocalStorageDatabase.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.0-rc.0", ngImport: i0, type: LocalStorageDatabase, providedIn: 'root' });
154
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0-rc.0", ngImport: i0, type: LocalStorageDatabase, decorators: [{
152
+ LocalStorageDatabase.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: LocalStorageDatabase, deps: [{ token: LS_PREFIX }], target: i0.ɵɵFactoryTarget.Injectable });
153
+ LocalStorageDatabase.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: LocalStorageDatabase, providedIn: 'root' });
154
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.0", ngImport: i0, type: LocalStorageDatabase, decorators: [{
155
155
  type: Injectable,
156
156
  args: [{
157
157
  providedIn: 'root'
@@ -160,4 +160,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.0-rc.0", ng
160
160
  type: Inject,
161
161
  args: [LS_PREFIX]
162
162
  }] }]; } });
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdG9yYWdlLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9sb2NhbC1zdG9yYWdlL3NyYy9saWIvZGF0YWJhc2VzL2xvY2Fsc3RvcmFnZS1kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFLbEQsTUFBTSxPQUFPLG9CQUFvQjtJQU8vQjs7O09BR0c7SUFDSCxZQUNxQixNQUFNLEdBQUcsRUFBRTtRQUc5Qiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRTdCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksSUFBSTtRQUVOLHNFQUFzRTtRQUN0RSxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsR0FBVztRQUViLGtCQUFrQjtRQUNsQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLFVBQW1CLENBQUM7UUFFeEIsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFFM0Qsa0JBQWtCO1lBQ2xCLElBQUk7Z0JBQ0YsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDdkM7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDZCxPQUFPLFVBQVUsQ0FBQyxLQUFvQixDQUFDLENBQUM7YUFDekM7U0FFRjtRQUVELHNFQUFzRTtRQUN0RSxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxHQUFHLENBQUMsR0FBVyxFQUFFLElBQWE7UUFFNUIsSUFBSSxjQUFjLEdBQWtCLElBQUksQ0FBQztRQUV6QyxxQ0FBcUM7UUFDckMsTUFBTSxhQUFhLEdBQVksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUN6RSxDQUFDLENBQUMsQ0FBQyxhQUFhLEtBQUssTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDbkUsT0FBTyxVQUFVLENBQUMsSUFBSSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7U0FDN0M7UUFFRCx3REFBd0Q7UUFDeEQsSUFBSTtZQUNGLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZDO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLFVBQVUsQ0FBQyxLQUFrQixDQUFDLENBQUM7U0FDdkM7UUFFRCwyQ0FBMkM7UUFDM0MsSUFBSTtZQUNGLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUMzRDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxVQUFVLENBQUMsS0FBcUIsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsc0VBQXNFO1FBQ3RFLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLEdBQVc7UUFFaEIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFN0Msc0VBQXNFO1FBQ3RFLE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRXZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLO1FBRUgsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRXJCLHNFQUFzRTtRQUN0RSxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUV2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQUk7UUFFRixzQ0FBc0M7UUFDdEMsT0FBTyxJQUFJLFVBQVUsQ0FBUyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBRTNDLG9DQUFvQztZQUNwQyxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFO2dCQUUzRCw0REFBNEQ7Z0JBQzVELFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBVyxDQUFDLENBQUM7YUFFekQ7WUFFRCxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFeEIsQ0FBQyxDQUFDLENBQUMsSUFBSTtRQUNMLGtFQUFrRTtRQUNsRSxTQUFTLENBQUMsY0FBYyxDQUFDLENBQzFCLENBQUM7SUFFSixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEdBQUcsQ0FBQyxHQUFXO1FBRWIseUNBQXlDO1FBQ3pDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUU7WUFFM0QsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUV4QyxzRUFBc0U7Z0JBQ3RFLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBRWpCO1NBRUY7UUFFRCxzRUFBc0U7UUFDdEUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxnQkFBZ0IsQ0FBQyxLQUFhO1FBRXRDLCtDQUErQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVDLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUV4Qix3RUFBd0U7WUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBRTVFO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFFZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLFNBQVMsQ0FBQyxHQUFXO1FBRTdCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBRWhDLENBQUM7O3NIQTNNVSxvQkFBb0Isa0JBWXJCLFNBQVM7MEhBWlIsb0JBQW9CLGNBRm5CLE1BQU07Z0dBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBYUksTUFBTTsyQkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciwgYXN5bmNTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG9ic2VydmVPbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTFNfUFJFRklYIH0gZnJvbSAnLi4vdG9rZW5zJztcbmltcG9ydCB7IExvY2FsRGF0YWJhc2UgfSBmcm9tICcuL2xvY2FsLWRhdGFiYXNlJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlIGltcGxlbWVudHMgTG9jYWxEYXRhYmFzZSB7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHVzZXIgcHJlZml4IHRvIGF2b2lkIGNvbGxpc2lvbiBmb3IgbXVsdGlwbGUgYXBwcyBvbiB0aGUgc2FtZSBzdWJkb21haW5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBwYXJhbXMgYXJlIHByb3ZpZGVkIGJ5IEFuZ3VsYXIgKGJ1dCBjYW4gYWxzbyBiZSBwYXNzZWQgbWFudWFsbHkgaW4gdGVzdHMpXG4gICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IG9wdGlvbiB0byBhdm9pZCBjb2xsaXNpb24gZm9yIG11bHRpcGxlIGFwcHMgb24gdGhlIHNhbWUgc3ViZG9tYWluIG9yIGZvciBpbnRlcm9wZXJhYmlsaXR5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExTX1BSRUZJWCkgcHJlZml4ID0gJycsXG4gICkge1xuXG4gICAgLyogUHJlZml4IGlmIGFza2VkLCBvciBubyBwcmVmaXggb3RoZXJ3aXNlICovXG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXggfHwgJyc7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgaXRlbXMgaW4gYGxvY2FsU3RvcmFnZWBcbiAgICovXG4gIGdldCBzaXplKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG5cbiAgICAvKiBXcmFwIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIHN0b3JhZ2VzICovXG4gICAgcmV0dXJuIG9mKGxvY2FsU3RvcmFnZS5sZW5ndGgpO1xuXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBpdGVtIHZhbHVlIGluIGBsb2NhbFN0b3JhZ2VgXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgVGhlIGl0ZW0ncyB2YWx1ZSBpZiB0aGUga2V5IGV4aXN0cywgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLCB3cmFwcGVkIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWBcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93biB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLyogR2V0IHJhdyBkYXRhICovXG4gICAgY29uc3QgdW5wYXJzZWREYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5wcmVmaXhLZXkoa2V5KSk7XG5cbiAgICBsZXQgcGFyc2VkRGF0YTogdW5rbm93bjtcblxuICAgIC8qIE5vIG5lZWQgdG8gcGFyc2UgaWYgZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgKi9cbiAgICBpZiAoKHVucGFyc2VkRGF0YSAhPT0gdW5kZWZpbmVkKSAmJiAodW5wYXJzZWREYXRhICE9PSBudWxsKSkge1xuXG4gICAgICAvKiBUcnkgdG8gcGFyc2UgKi9cbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHVucGFyc2VkRGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBTeW50YXhFcnJvcik7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICAvKiBXcmFwIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIHN0b3JhZ2VzICovXG4gICAgcmV0dXJuIG9mKHBhcnNlZERhdGEpO1xuXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgYW4gaXRlbSBpbiBgbG9jYWxTdG9yYWdlYFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBkYXRhIFRoZSBpdGVtJ3MgdmFsdWVcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCB0byB3YWl0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgc2V0KGtleTogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+IHtcblxuICAgIGxldCBzZXJpYWxpemVkRGF0YTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiBDaGVjayBpZiBkYXRhIGNhbiBiZSBzZXJpYWxpemVkICovXG4gICAgY29uc3QgZGF0YVByb3RvdHlwZTogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihkYXRhKTtcbiAgICBpZiAoKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykgJiYgKGRhdGEgIT09IG51bGwpICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgISgoZGF0YVByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgfHwgKGRhdGFQcm90b3R5cGUgPT09IG51bGwpKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IFNlcmlhbGl6YXRpb25FcnJvcigpKTtcbiAgICB9XG5cbiAgICAvKiBUcnkgdG8gc3RyaW5naWZ5IChjYW4gZmFpbCBvbiBjaXJjdWxhciByZWZlcmVuY2VzKSAqL1xuICAgIHRyeSB7XG4gICAgICBzZXJpYWxpemVkRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBUeXBlRXJyb3IpO1xuICAgIH1cblxuICAgIC8qIENhbiBmYWlsIGlmIHN0b3JhZ2UgcXVvdGEgaXMgZXhjZWVkZWQgKi9cbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5wcmVmaXhLZXkoa2V5KSwgc2VyaWFsaXplZERhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBET01FeGNlcHRpb24pO1xuICAgIH1cblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gaXRlbSBpbiBgbG9jYWxTdG9yYWdlYFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEByZXR1cm5zIEEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnByZWZpeEtleShrZXkpKTtcblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGl0ZW1zIGluIGBsb2NhbFN0b3JhZ2VgXG4gICAqIEByZXR1cm5zIEEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGNsZWFyKCk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBpbiBgbG9jYWxTdG9yYWdlYFxuICAgKiBOb3RlIHRoZSBvcmRlciBvZiB0aGUga2V5cyBtYXkgYmUgaW5jb25zaXN0ZW50IGluIEZpcmVmb3hcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCBpdGVyYXRpbmcgb24ga2V5c1xuICAgKi9cbiAga2V5cygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXG4gICAgLyogQ3JlYXRlIGFuIGBPYnNlcnZhYmxlYCBmcm9tIGtleXMgKi9cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8c3RyaW5nPigoc3Vic2NyaWJlcikgPT4ge1xuXG4gICAgICAvKiBJdGVyZXRhdGUgb3ZlciBhbGwgdGhlIGluZGV4ZXMgKi9cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG5cbiAgICAgICAgLyogQ2FzdCBhcyB3ZSBhcmUgc3VyZSBpbiB0aGlzIGNhc2UgdGhlIGtleSBpcyBub3QgYG51bGxgICovXG4gICAgICAgIHN1YnNjcmliZXIubmV4dCh0aGlzLmdldFVucHJlZml4ZWRLZXkoaW5kZXgpIGFzIHN0cmluZyk7XG5cbiAgICAgIH1cblxuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuXG4gICAgfSkucGlwZShcbiAgICAgIC8qIFJlcXVpcmVkIHRvIHdvcmsgbGlrZSBvdGhlciBkYXRhYmFzZXMgd2hpY2ggYXJlIGFzeW5jaHJvbm91cyAqL1xuICAgICAgb2JzZXJ2ZU9uKGFzeW5jU2NoZWR1bGVyKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzIGluIGBsb2NhbFN0b3JhZ2VgXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCB0ZWxsaW5nIGlmIHRoZSBrZXkgZXhpc3RzIG9yIG5vdFxuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG5cbiAgICAvKiBJdMOpcmF0ZSBvdmVyIGFsbCBpbmRleGVzIGluIHN0b3JhZ2UgKi9cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuXG4gICAgICBpZiAoa2V5ID09PSB0aGlzLmdldFVucHJlZml4ZWRLZXkoaW5kZXgpKSB7XG5cbiAgICAgICAgLyogV3JhcCBpbiBhIFJ4SlMgYE9ic2VydmFibGVgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdG9yYWdlcyAqL1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG5cbiAgICAgIH1cblxuICAgIH1cblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YoZmFsc2UpO1xuXG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIHVucHJlZml4ZWQga2V5XG4gICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUga2V5XG4gICAqIEByZXR1cm5zIFRoZSB1bnByZWZpeGVkIGtleSBuYW1lIGlmIGV4aXN0cywgYG51bGxgIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVucHJlZml4ZWRLZXkoaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuXG4gICAgLyogR2V0IHRoZSBrZXkgaW4gc3RvcmFnZTogbWF5IGhhdmUgYSBwcmVmaXggKi9cbiAgICBjb25zdCBwcmVmaXhlZEtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaW5kZXgpO1xuXG4gICAgaWYgKHByZWZpeGVkS2V5ICE9PSBudWxsKSB7XG5cbiAgICAgIC8qIElmIG5vIHByZWZpeCwgdGhlIGtleSBpcyBhbHJlYWR5IGdvb2QsIG90aGVyd3JpdGUgc3RyaXAgdGhlIHByZWZpeCAqL1xuICAgICAgcmV0dXJuICF0aGlzLnByZWZpeCA/IHByZWZpeGVkS2V5IDogcHJlZml4ZWRLZXkuc3Vic3RyKHRoaXMucHJlZml4Lmxlbmd0aCk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcblxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgcHJlZml4IHRvIGEga2V5XG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBuYW1lXG4gICAqIEByZXR1cm5zIFRoZSBwcmVmaXhlZCBrZXkgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIHByZWZpeEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHtrZXl9YDtcblxuICB9XG5cbn1cbiJdfQ==
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdG9yYWdlLWRhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXB3YS9sb2NhbC1zdG9yYWdlL3NyYy9saWIvZGF0YWJhc2VzL2xvY2Fsc3RvcmFnZS1kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXRDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFLbEQsTUFBTSxPQUFPLG9CQUFvQjtJQU8vQjs7O09BR0c7SUFDSCxZQUNxQixNQUFNLEdBQUcsRUFBRTtRQUc5Qiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO0lBRTdCLENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksSUFBSTtRQUVOLHNFQUFzRTtRQUN0RSxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxHQUFHLENBQUMsR0FBVztRQUViLGtCQUFrQjtRQUNsQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUvRCxJQUFJLFVBQW1CLENBQUM7UUFFeEIsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLEVBQUU7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QUFDLEtBQUssQ0FBQyxFQUFFO2dCQUV4QyxzRUFBc0U7Z0JBQ3RFLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBRWpCO1NBRUY7UUFFRCxzRUFBc0U7UUFDdEUsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbkIsQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxnQkFBZ0IsQ0FBQyxLQUFhO1FBRXRDLCtDQUErQztRQUMvQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVDLElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUV4Qix3RUFBd0U7WUFDeEUsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBRTVFO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFFZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLFNBQVMsQ0FBQyxHQUFXO1FBRTdCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBRWhDLENBQUM7O2lIQTNNVSxvQkFBb0Isa0JBWXJCLFNBQVM7cUhBWlIsb0JBQW9CLGNBRm5CLE1BQU07MkZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBYUksTUFBTTsyQkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgdGhyb3dFcnJvciwgYXN5bmNTY2hlZHVsZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG9ic2VydmVPbiB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgTFNfUFJFRklYIH0gZnJvbSAnLi4vdG9rZW5zJztcbmltcG9ydCB7IExvY2FsRGF0YWJhc2UgfSBmcm9tICcuL2xvY2FsLWRhdGFiYXNlJztcbmltcG9ydCB7IFNlcmlhbGl6YXRpb25FcnJvciB9IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZURhdGFiYXNlIGltcGxlbWVudHMgTG9jYWxEYXRhYmFzZSB7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHVzZXIgcHJlZml4IHRvIGF2b2lkIGNvbGxpc2lvbiBmb3IgbXVsdGlwbGUgYXBwcyBvbiB0aGUgc2FtZSBzdWJkb21haW5cbiAgICovXG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBwYXJhbXMgYXJlIHByb3ZpZGVkIGJ5IEFuZ3VsYXIgKGJ1dCBjYW4gYWxzbyBiZSBwYXNzZWQgbWFudWFsbHkgaW4gdGVzdHMpXG4gICAqIEBwYXJhbSBwcmVmaXggUHJlZml4IG9wdGlvbiB0byBhdm9pZCBjb2xsaXNpb24gZm9yIG11bHRpcGxlIGFwcHMgb24gdGhlIHNhbWUgc3ViZG9tYWluIG9yIGZvciBpbnRlcm9wZXJhYmlsaXR5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KExTX1BSRUZJWCkgcHJlZml4ID0gJycsXG4gICkge1xuXG4gICAgLyogUHJlZml4IGlmIGFza2VkLCBvciBubyBwcmVmaXggb3RoZXJ3aXNlICovXG4gICAgdGhpcy5wcmVmaXggPSBwcmVmaXggfHwgJyc7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgaXRlbXMgaW4gYGxvY2FsU3RvcmFnZWBcbiAgICovXG4gIGdldCBzaXplKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG5cbiAgICAvKiBXcmFwIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIHN0b3JhZ2VzICovXG4gICAgcmV0dXJuIG9mKGxvY2FsU3RvcmFnZS5sZW5ndGgpO1xuXG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBpdGVtIHZhbHVlIGluIGBsb2NhbFN0b3JhZ2VgXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgVGhlIGl0ZW0ncyB2YWx1ZSBpZiB0aGUga2V5IGV4aXN0cywgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLCB3cmFwcGVkIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWBcbiAgICovXG4gIGdldChrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5rbm93biB8IHVuZGVmaW5lZD4ge1xuXG4gICAgLyogR2V0IHJhdyBkYXRhICovXG4gICAgY29uc3QgdW5wYXJzZWREYXRhID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5wcmVmaXhLZXkoa2V5KSk7XG5cbiAgICBsZXQgcGFyc2VkRGF0YTogdW5rbm93bjtcblxuICAgIC8qIE5vIG5lZWQgdG8gcGFyc2UgaWYgZGF0YSBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAgKi9cbiAgICBpZiAoKHVucGFyc2VkRGF0YSAhPT0gdW5kZWZpbmVkKSAmJiAodW5wYXJzZWREYXRhICE9PSBudWxsKSkge1xuXG4gICAgICAvKiBUcnkgdG8gcGFyc2UgKi9cbiAgICAgIHRyeSB7XG4gICAgICAgIHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHVucGFyc2VkRGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBTeW50YXhFcnJvcik7XG4gICAgICB9XG5cbiAgICB9XG5cbiAgICAvKiBXcmFwIGluIGEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIHN0b3JhZ2VzICovXG4gICAgcmV0dXJuIG9mKHBhcnNlZERhdGEpO1xuXG4gIH1cblxuICAvKipcbiAgICogU3RvcmUgYW4gaXRlbSBpbiBgbG9jYWxTdG9yYWdlYFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEBwYXJhbSBkYXRhIFRoZSBpdGVtJ3MgdmFsdWVcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCB0byB3YWl0IHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvblxuICAgKi9cbiAgc2V0KGtleTogc3RyaW5nLCBkYXRhOiB1bmtub3duKTogT2JzZXJ2YWJsZTx1bmRlZmluZWQ+IHtcblxuICAgIGxldCBzZXJpYWxpemVkRGF0YTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiBDaGVjayBpZiBkYXRhIGNhbiBiZSBzZXJpYWxpemVkICovXG4gICAgY29uc3QgZGF0YVByb3RvdHlwZTogdW5rbm93biA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihkYXRhKTtcbiAgICBpZiAoKHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JykgJiYgKGRhdGEgIT09IG51bGwpICYmICFBcnJheS5pc0FycmF5KGRhdGEpICYmXG4gICAgISgoZGF0YVByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSkgfHwgKGRhdGFQcm90b3R5cGUgPT09IG51bGwpKSkge1xuICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IFNlcmlhbGl6YXRpb25FcnJvcigpKTtcbiAgICB9XG5cbiAgICAvKiBUcnkgdG8gc3RyaW5naWZ5IChjYW4gZmFpbCBvbiBjaXJjdWxhciByZWZlcmVuY2VzKSAqL1xuICAgIHRyeSB7XG4gICAgICBzZXJpYWxpemVkRGF0YSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBUeXBlRXJyb3IpO1xuICAgIH1cblxuICAgIC8qIENhbiBmYWlsIGlmIHN0b3JhZ2UgcXVvdGEgaXMgZXhjZWVkZWQgKi9cbiAgICB0cnkge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5wcmVmaXhLZXkoa2V5KSwgc2VyaWFsaXplZERhdGEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnJvciBhcyBET01FeGNlcHRpb24pO1xuICAgIH1cblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gaXRlbSBpbiBgbG9jYWxTdG9yYWdlYFxuICAgKiBAcGFyYW0ga2V5IFRoZSBpdGVtJ3Mga2V5XG4gICAqIEByZXR1cm5zIEEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLnByZWZpeEtleShrZXkpKTtcblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYWxsIGl0ZW1zIGluIGBsb2NhbFN0b3JhZ2VgXG4gICAqIEByZXR1cm5zIEEgUnhKUyBgT2JzZXJ2YWJsZWAgdG8gd2FpdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb25cbiAgICovXG4gIGNsZWFyKCk6IE9ic2VydmFibGU8dW5kZWZpbmVkPiB7XG5cbiAgICBsb2NhbFN0b3JhZ2UuY2xlYXIoKTtcblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbGwga2V5cyBpbiBgbG9jYWxTdG9yYWdlYFxuICAgKiBOb3RlIHRoZSBvcmRlciBvZiB0aGUga2V5cyBtYXkgYmUgaW5jb25zaXN0ZW50IGluIEZpcmVmb3hcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCBpdGVyYXRpbmcgb24ga2V5c1xuICAgKi9cbiAga2V5cygpOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuXG4gICAgLyogQ3JlYXRlIGFuIGBPYnNlcnZhYmxlYCBmcm9tIGtleXMgKi9cbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8c3RyaW5nPigoc3Vic2NyaWJlcikgPT4ge1xuXG4gICAgICAvKiBJdGVyZXRhdGUgb3ZlciBhbGwgdGhlIGluZGV4ZXMgKi9cbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsb2NhbFN0b3JhZ2UubGVuZ3RoOyBpbmRleCArPSAxKSB7XG5cbiAgICAgICAgLyogQ2FzdCBhcyB3ZSBhcmUgc3VyZSBpbiB0aGlzIGNhc2UgdGhlIGtleSBpcyBub3QgYG51bGxgICovXG4gICAgICAgIHN1YnNjcmliZXIubmV4dCh0aGlzLmdldFVucHJlZml4ZWRLZXkoaW5kZXgpIGFzIHN0cmluZyk7XG5cbiAgICAgIH1cblxuICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuXG4gICAgfSkucGlwZShcbiAgICAgIC8qIFJlcXVpcmVkIHRvIHdvcmsgbGlrZSBvdGhlciBkYXRhYmFzZXMgd2hpY2ggYXJlIGFzeW5jaHJvbm91cyAqL1xuICAgICAgb2JzZXJ2ZU9uKGFzeW5jU2NoZWR1bGVyKSxcbiAgICApO1xuXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzIGluIGBsb2NhbFN0b3JhZ2VgXG4gICAqIEBwYXJhbSBrZXkgVGhlIGl0ZW0ncyBrZXlcbiAgICogQHJldHVybnMgQSBSeEpTIGBPYnNlcnZhYmxlYCB0ZWxsaW5nIGlmIHRoZSBrZXkgZXhpc3RzIG9yIG5vdFxuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG5cbiAgICAvKiBJdMOpcmF0ZSBvdmVyIGFsbCBpbmRleGVzIGluIHN0b3JhZ2UgKi9cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuXG4gICAgICBpZiAoa2V5ID09PSB0aGlzLmdldFVucHJlZml4ZWRLZXkoaW5kZXgpKSB7XG5cbiAgICAgICAgLyogV3JhcCBpbiBhIFJ4SlMgYE9ic2VydmFibGVgIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBzdG9yYWdlcyAqL1xuICAgICAgICByZXR1cm4gb2YodHJ1ZSk7XG5cbiAgICAgIH1cblxuICAgIH1cblxuICAgIC8qIFdyYXAgaW4gYSBSeEpTIGBPYnNlcnZhYmxlYCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgc3RvcmFnZXMgKi9cbiAgICByZXR1cm4gb2YoZmFsc2UpO1xuXG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIHVucHJlZml4ZWQga2V5XG4gICAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUga2V5XG4gICAqIEByZXR1cm5zIFRoZSB1bnByZWZpeGVkIGtleSBuYW1lIGlmIGV4aXN0cywgYG51bGxgIG90aGVyd2lzZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFVucHJlZml4ZWRLZXkoaW5kZXg6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuXG4gICAgLyogR2V0IHRoZSBrZXkgaW4gc3RvcmFnZTogbWF5IGhhdmUgYSBwcmVmaXggKi9cbiAgICBjb25zdCBwcmVmaXhlZEtleSA9IGxvY2FsU3RvcmFnZS5rZXkoaW5kZXgpO1xuXG4gICAgaWYgKHByZWZpeGVkS2V5ICE9PSBudWxsKSB7XG5cbiAgICAgIC8qIElmIG5vIHByZWZpeCwgdGhlIGtleSBpcyBhbHJlYWR5IGdvb2QsIG90aGVyd3JpdGUgc3RyaXAgdGhlIHByZWZpeCAqL1xuICAgICAgcmV0dXJuICF0aGlzLnByZWZpeCA/IHByZWZpeGVkS2V5IDogcHJlZml4ZWRLZXkuc3Vic3RyKHRoaXMucHJlZml4Lmxlbmd0aCk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcblxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgcHJlZml4IHRvIGEga2V5XG4gICAqIEBwYXJhbSBrZXkgVGhlIGtleSBuYW1lXG4gICAqIEByZXR1cm5zIFRoZSBwcmVmaXhlZCBrZXkgbmFtZVxuICAgKi9cbiAgcHJvdGVjdGVkIHByZWZpeEtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gYCR7dGhpcy5wcmVmaXh9JHtrZXl9YDtcblxuICB9XG5cbn1cbiJdfQ==