valtech-components 2.0.458 → 2.0.459
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/services/firebase/firestore.service.mjs +43 -16
- package/esm2022/lib/services/firebase/index.mjs +3 -3
- package/esm2022/lib/services/firebase/shared-config.mjs +18 -44
- package/esm2022/lib/services/firebase/storage.service.mjs +27 -8
- package/esm2022/lib/services/firebase/types.mjs +1 -1
- package/fesm2022/valtech-components.mjs +82 -64
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/article/article.component.d.ts +1 -1
- package/lib/services/firebase/firestore.service.d.ts +8 -0
- package/lib/services/firebase/index.d.ts +1 -1
- package/lib/services/firebase/shared-config.d.ts +26 -39
- package/lib/services/firebase/storage.service.d.ts +8 -0
- package/lib/services/firebase/types.d.ts +15 -0
- package/package.json +1 -1
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* Servicio genérico para operaciones CRUD en Firestore.
|
|
5
5
|
* Soporta lecturas one-time, subscripciones real-time, paginación y queries complejas.
|
|
6
6
|
*/
|
|
7
|
-
import { Injectable } from '@angular/core';
|
|
7
|
+
import { inject, Injectable } from '@angular/core';
|
|
8
8
|
import { addDoc, collection, collectionData, deleteDoc, doc, docData, getDoc, getDocs, limit, orderBy, query, serverTimestamp, setDoc, startAfter, startAt, endBefore, endAt, Timestamp, updateDoc, where, writeBatch, increment, arrayUnion, arrayRemove, } from '@angular/fire/firestore';
|
|
9
9
|
import { map } from 'rxjs';
|
|
10
|
+
import { VALTECH_FIREBASE_CONFIG } from './config';
|
|
10
11
|
import { buildPath } from './utils/path-builder';
|
|
11
12
|
import * as i0 from "@angular/core";
|
|
12
13
|
import * as i1 from "@angular/fire/firestore";
|
|
@@ -46,6 +47,18 @@ import * as i1 from "@angular/fire/firestore";
|
|
|
46
47
|
export class FirestoreService {
|
|
47
48
|
constructor(firestore) {
|
|
48
49
|
this.firestore = firestore;
|
|
50
|
+
this.config = inject(VALTECH_FIREBASE_CONFIG, { optional: true });
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Prefija el path de colección con el appId si está configurado.
|
|
54
|
+
* Si no hay appId, retorna el path sin modificar (backward compatible).
|
|
55
|
+
*
|
|
56
|
+
* @internal
|
|
57
|
+
*/
|
|
58
|
+
prefixCollectionPath(collectionPath) {
|
|
59
|
+
if (!this.config?.appId)
|
|
60
|
+
return collectionPath;
|
|
61
|
+
return `apps/${this.config.appId}/${collectionPath}`;
|
|
49
62
|
}
|
|
50
63
|
// ===========================================================================
|
|
51
64
|
// LECTURAS ONE-TIME (Promise)
|
|
@@ -66,7 +79,8 @@ export class FirestoreService {
|
|
|
66
79
|
* ```
|
|
67
80
|
*/
|
|
68
81
|
async getDoc(collectionPath, docId) {
|
|
69
|
-
const
|
|
82
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
83
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
70
84
|
const snapshot = await getDoc(docRef);
|
|
71
85
|
if (!snapshot.exists()) {
|
|
72
86
|
return null;
|
|
@@ -91,7 +105,8 @@ export class FirestoreService {
|
|
|
91
105
|
* ```
|
|
92
106
|
*/
|
|
93
107
|
async getDocs(collectionPath, options) {
|
|
94
|
-
const
|
|
108
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
109
|
+
const collectionRef = collection(this.firestore, prefixedPath);
|
|
95
110
|
const constraints = this.buildQueryConstraints(options);
|
|
96
111
|
const q = query(collectionRef, ...constraints);
|
|
97
112
|
const snapshot = await getDocs(q);
|
|
@@ -123,7 +138,8 @@ export class FirestoreService {
|
|
|
123
138
|
* ```
|
|
124
139
|
*/
|
|
125
140
|
async getPaginated(collectionPath, options) {
|
|
126
|
-
const
|
|
141
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
142
|
+
const collectionRef = collection(this.firestore, prefixedPath);
|
|
127
143
|
const constraints = this.buildQueryConstraints(options);
|
|
128
144
|
// Pedir uno más para saber si hay más páginas
|
|
129
145
|
const q = query(collectionRef, ...constraints, limit(options.limit + 1));
|
|
@@ -147,7 +163,8 @@ export class FirestoreService {
|
|
|
147
163
|
* @returns true si el documento existe
|
|
148
164
|
*/
|
|
149
165
|
async exists(collectionPath, docId) {
|
|
150
|
-
const
|
|
166
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
167
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
151
168
|
const snapshot = await getDoc(docRef);
|
|
152
169
|
return snapshot.exists();
|
|
153
170
|
}
|
|
@@ -173,7 +190,8 @@ export class FirestoreService {
|
|
|
173
190
|
* ```
|
|
174
191
|
*/
|
|
175
192
|
docChanges(collectionPath, docId) {
|
|
176
|
-
const
|
|
193
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
194
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
177
195
|
return docData(docRef, { idField: 'id' }).pipe(map((data) => {
|
|
178
196
|
if (!data)
|
|
179
197
|
return null;
|
|
@@ -196,7 +214,8 @@ export class FirestoreService {
|
|
|
196
214
|
* ```
|
|
197
215
|
*/
|
|
198
216
|
collectionChanges(collectionPath, options) {
|
|
199
|
-
const
|
|
217
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
218
|
+
const collectionRef = collection(this.firestore, prefixedPath);
|
|
200
219
|
const constraints = this.buildQueryConstraints(options);
|
|
201
220
|
const q = query(collectionRef, ...constraints);
|
|
202
221
|
return collectionData(q, { idField: 'id' }).pipe(map((docs) => docs.map((doc) => this.convertTimestamps(doc))));
|
|
@@ -222,7 +241,8 @@ export class FirestoreService {
|
|
|
222
241
|
* ```
|
|
223
242
|
*/
|
|
224
243
|
async addDoc(collectionPath, data) {
|
|
225
|
-
const
|
|
244
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
245
|
+
const collectionRef = collection(this.firestore, prefixedPath);
|
|
226
246
|
const timestamp = serverTimestamp();
|
|
227
247
|
const docData = {
|
|
228
248
|
...data,
|
|
@@ -252,7 +272,8 @@ export class FirestoreService {
|
|
|
252
272
|
* ```
|
|
253
273
|
*/
|
|
254
274
|
async setDoc(collectionPath, docId, data, options) {
|
|
255
|
-
const
|
|
275
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
276
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
256
277
|
const timestamp = serverTimestamp();
|
|
257
278
|
const docData = {
|
|
258
279
|
...data,
|
|
@@ -277,7 +298,8 @@ export class FirestoreService {
|
|
|
277
298
|
* ```
|
|
278
299
|
*/
|
|
279
300
|
async updateDoc(collectionPath, docId, data) {
|
|
280
|
-
const
|
|
301
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
302
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
281
303
|
await updateDoc(docRef, {
|
|
282
304
|
...data,
|
|
283
305
|
updatedAt: serverTimestamp(),
|
|
@@ -295,7 +317,8 @@ export class FirestoreService {
|
|
|
295
317
|
* ```
|
|
296
318
|
*/
|
|
297
319
|
async deleteDoc(collectionPath, docId) {
|
|
298
|
-
const
|
|
320
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
321
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
299
322
|
await deleteDoc(docRef);
|
|
300
323
|
}
|
|
301
324
|
// ===========================================================================
|
|
@@ -320,7 +343,8 @@ export class FirestoreService {
|
|
|
320
343
|
const batchApi = {
|
|
321
344
|
set: (path, data) => {
|
|
322
345
|
const [collectionPath, docId] = this.splitPath(path);
|
|
323
|
-
const
|
|
346
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
347
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
324
348
|
batch.set(docRef, {
|
|
325
349
|
...data,
|
|
326
350
|
createdAt: serverTimestamp(),
|
|
@@ -329,7 +353,8 @@ export class FirestoreService {
|
|
|
329
353
|
},
|
|
330
354
|
update: (path, data) => {
|
|
331
355
|
const [collectionPath, docId] = this.splitPath(path);
|
|
332
|
-
const
|
|
356
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
357
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
333
358
|
batch.update(docRef, {
|
|
334
359
|
...data,
|
|
335
360
|
updatedAt: serverTimestamp(),
|
|
@@ -337,7 +362,8 @@ export class FirestoreService {
|
|
|
337
362
|
},
|
|
338
363
|
delete: (path) => {
|
|
339
364
|
const [collectionPath, docId] = this.splitPath(path);
|
|
340
|
-
const
|
|
365
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
366
|
+
const docRef = doc(this.firestore, prefixedPath, docId);
|
|
341
367
|
batch.delete(docRef);
|
|
342
368
|
},
|
|
343
369
|
};
|
|
@@ -373,7 +399,8 @@ export class FirestoreService {
|
|
|
373
399
|
* @returns ID único generado por Firestore
|
|
374
400
|
*/
|
|
375
401
|
generateId(collectionPath) {
|
|
376
|
-
const
|
|
402
|
+
const prefixedPath = this.prefixCollectionPath(collectionPath);
|
|
403
|
+
const collectionRef = collection(this.firestore, prefixedPath);
|
|
377
404
|
return doc(collectionRef).id;
|
|
378
405
|
}
|
|
379
406
|
/**
|
|
@@ -506,4 +533,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
506
533
|
type: Injectable,
|
|
507
534
|
args: [{ providedIn: 'root' }]
|
|
508
535
|
}], ctorParameters: () => [{ type: i1.Firestore }] });
|
|
509
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmVzdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixjQUFjLEVBQ2QsU0FBUyxFQUNULEdBQUcsRUFDSCxPQUFPLEVBS1AsTUFBTSxFQUNOLE9BQU8sRUFDUCxLQUFLLEVBQ0wsT0FBTyxFQUNQLEtBQUssRUFFTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLFVBQVUsRUFDVixPQUFPLEVBQ1AsU0FBUyxFQUNULEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULEtBQUssRUFDTCxVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEdBRVosTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBR3ZDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUVILE1BQU0sT0FBTyxnQkFBZ0I7SUFDM0IsWUFBb0IsU0FBb0I7UUFBcEIsY0FBUyxHQUFULFNBQVMsQ0FBVztJQUFHLENBQUM7SUFFNUMsOEVBQThFO0lBQzlFLDhCQUE4QjtJQUM5Qiw4RUFBOEU7SUFFOUU7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxLQUFLLENBQUMsTUFBTSxDQUNWLGNBQXNCLEVBQ3RCLEtBQWE7UUFFYixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxjQUFjLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxN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O21IQUFoQixnQkFBZ0IsY0FESCxNQUFNOzs0RkFDbkIsZ0JBQWdCO2tCQUQ1QixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlyZXN0b3JlIFNlcnZpY2VcbiAqXG4gKiBTZXJ2aWNpbyBnZW7DqXJpY28gcGFyYSBvcGVyYWNpb25lcyBDUlVEIGVuIEZpcmVzdG9yZS5cbiAqIFNvcG9ydGEgbGVjdHVyYXMgb25lLXRpbWUsIHN1YnNjcmlwY2lvbmVzIHJlYWwtdGltZSwgcGFnaW5hY2nDs24geSBxdWVyaWVzIGNvbXBsZWphcy5cbiAqL1xuXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBhZGREb2MsXG4gIGNvbGxlY3Rpb24sXG4gIGNvbGxlY3Rpb25EYXRhLFxuICBkZWxldGVEb2MsXG4gIGRvYyxcbiAgZG9jRGF0YSxcbiAgRG9jdW1lbnREYXRhLFxuICBEb2N1bWVudFJlZmVyZW5jZSxcbiAgRG9jdW1lbnRTbmFwc2hvdCxcbiAgRmlyZXN0b3JlLFxuICBnZXREb2MsXG4gIGdldERvY3MsXG4gIGxpbWl0LFxuICBvcmRlckJ5LFxuICBxdWVyeSxcbiAgUXVlcnlDb25zdHJhaW50LFxuICBzZXJ2ZXJUaW1lc3RhbXAsXG4gIHNldERvYyxcbiAgc3RhcnRBZnRlcixcbiAgc3RhcnRBdCxcbiAgZW5kQmVmb3JlLFxuICBlbmRBdCxcbiAgVGltZXN0YW1wLFxuICB1cGRhdGVEb2MsXG4gIHdoZXJlLFxuICB3cml0ZUJhdGNoLFxuICBpbmNyZW1lbnQsXG4gIGFycmF5VW5pb24sXG4gIGFycmF5UmVtb3ZlLFxuICBGaWVsZFZhbHVlLFxufSBmcm9tICdAYW5ndWxhci9maXJlL2ZpcmVzdG9yZSc7XG5pbXBvcnQgeyBtYXAsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRmlyZXN0b3JlRG9jdW1lbnQsIFBhZ2luYXRlZFJlc3VsdCwgUXVlcnlPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZFBhdGggfSBmcm9tICcuL3V0aWxzL3BhdGgtYnVpbGRlcic7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBvcGVyYWNpb25lcyBDUlVEIGVuIEZpcmVzdG9yZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudCB7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqICAgZW1haWw6IHN0cmluZztcbiAqICAgcm9sZTogJ2FkbWluJyB8ICd1c2VyJztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIFVzZXJzQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBmaXJlc3RvcmUgPSBpbmplY3QoRmlyZXN0b3JlU2VydmljZSk7XG4gKlxuICogICAvLyBMZWN0dXJhIG9uZS10aW1lXG4gKiAgIGFzeW5jIGxvYWRVc2VyKGlkOiBzdHJpbmcpIHtcbiAqICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5maXJlc3RvcmUuZ2V0RG9jPFVzZXI+KCd1c2VycycsIGlkKTtcbiAqICAgfVxuICpcbiAqICAgLy8gU3Vic2NyaXBjacOzbiByZWFsLXRpbWVcbiAqICAgdXNlcnMkID0gdGhpcy5maXJlc3RvcmUuY29sbGVjdGlvbkNoYW5nZXM8VXNlcj4oJ3VzZXJzJywge1xuICogICAgIHdoZXJlOiBbeyBmaWVsZDogJ3JvbGUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6ICdhZG1pbicgfV0sXG4gKiAgICAgb3JkZXJCeTogW3sgZmllbGQ6ICduYW1lJywgZGlyZWN0aW9uOiAnYXNjJyB9XVxuICogICB9KTtcbiAqXG4gKiAgIC8vIENyZWFyIGRvY3VtZW50b1xuICogICBhc3luYyBjcmVhdGVVc2VyKGRhdGE6IE9taXQ8VXNlciwgJ2lkJz4pIHtcbiAqICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5maXJlc3RvcmUuYWRkRG9jPFVzZXI+KCd1c2VycycsIGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBGaXJlc3RvcmVTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmaXJlc3RvcmU6IEZpcmVzdG9yZSkge31cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTEVDVFVSQVMgT05FLVRJTUUgKFByb21pc2UpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIHVuIGRvY3VtZW50byBwb3IgSUQgKGxlY3R1cmEgw7puaWNhKS5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBkb2NJZCAtIElEIGRlbCBkb2N1bWVudG9cbiAgICogQHJldHVybnMgRG9jdW1lbnRvIG8gbnVsbCBzaSBubyBleGlzdGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VyID0gYXdhaXQgZmlyZXN0b3JlU2VydmljZS5nZXREb2M8VXNlcj4oJ3VzZXJzJywgJ2FiYzEyMycpO1xuICAgKiBpZiAodXNlcikge1xuICAgKiAgIGNvbnNvbGUubG9nKHVzZXIubmFtZSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXREb2M8VCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PihcbiAgICBjb2xsZWN0aW9uUGF0aDogc3RyaW5nLFxuICAgIGRvY0lkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxUIHwgbnVsbD4ge1xuICAgIGNvbnN0IGRvY1JlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZSwgY29sbGVjdGlvblBhdGgsIGRvY0lkKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldERvYyhkb2NSZWYpO1xuXG4gICAgaWYgKCFzbmFwc2hvdC5leGlzdHMoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwRG9jdW1lbnQ8VD4oc25hcHNob3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbcO6bHRpcGxlcyBkb2N1bWVudG9zIGNvbiBvcGNpb25lcyBkZSBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3BjaW9uZXMgZGUgcXVlcnkgKHdoZXJlLCBvcmRlckJ5LCBsaW1pdClcbiAgICogQHJldHVybnMgQXJyYXkgZGUgZG9jdW1lbnRvc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFRvZG9zIGxvcyB1c3VhcmlvcyBhY3Rpdm9zIG9yZGVuYWRvcyBwb3Igbm9tYnJlXG4gICAqIGNvbnN0IHVzZXJzID0gYXdhaXQgZmlyZXN0b3JlU2VydmljZS5nZXREb2NzPFVzZXI+KCd1c2VycycsIHtcbiAgICogICB3aGVyZTogW3sgZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHRydWUgfV0sXG4gICAqICAgb3JkZXJCeTogW3sgZmllbGQ6ICduYW1lJywgZGlyZWN0aW9uOiAnYXNjJyB9XSxcbiAgICogICBsaW1pdDogNTBcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jczxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFF1ZXJ5T3B0aW9uc1xuICApOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZWYgPSBjb2xsZWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSB0aGlzLmJ1aWxkUXVlcnlDb25zdHJhaW50cyhvcHRpb25zKTtcbiAgICBjb25zdCBxID0gcXVlcnkoY29sbGVjdGlvblJlZiwgLi4uY29uc3RyYWludHMpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0RG9jcyhxKTtcblxuICAgIHJldHVybiBzbmFwc2hvdC5kb2NzLm1hcCgoZG9jKSA9PiB0aGlzLm1hcERvY3VtZW50PFQ+KGRvYykpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgZG9jdW1lbnRvcyBjb24gcGFnaW5hY2nDs24gYmFzYWRhIGVuIGN1cnNvcmVzLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGNpb25lcyBkZSBxdWVyeSAoZGViZSBpbmNsdWlyIGxpbWl0KVxuICAgKiBAcmV0dXJucyBSZXN1bHRhZG8gcGFnaW5hZG8gY29uIGN1cnNvciBwYXJhIGxhIHNpZ3VpZW50ZSBww6FnaW5hXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJpbWVyYSBww6FnaW5hXG4gICAqIGNvbnN0IHBhZ2UxID0gYXdhaXQgZmlyZXN0b3JlU2VydmljZS5nZXRQYWdpbmF0ZWQ8VXNlcj4oJ3VzZXJzJywge1xuICAgKiAgIG9yZGVyQnk6IFt7IGZpZWxkOiAnY3JlYXRlZEF0JywgZGlyZWN0aW9uOiAnZGVzYycgfV0sXG4gICAqICAgbGltaXQ6IDEwXG4gICAqIH0pO1xuICAgKlxuICAgKiAvLyBTaWd1aWVudGUgcMOhZ2luYVxuICAgKiBpZiAocGFnZTEuaGFzTW9yZSkge1xuICAgKiAgIGNvbnN0IHBhZ2UyID0gYXdhaXQgZmlyZXN0b3JlU2VydmljZS5nZXRQYWdpbmF0ZWQ8VXNlcj4oJ3VzZXJzJywge1xuICAgKiAgICAgb3JkZXJCeTogW3sgZmllbGQ6ICdjcmVhdGVkQXQnLCBkaXJlY3Rpb246ICdkZXNjJyB9XSxcbiAgICogICAgIGxpbWl0OiAxMCxcbiAgICogICAgIHN0YXJ0QWZ0ZXI6IHBhZ2UxLmxhc3REb2NcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldFBhZ2luYXRlZDxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUXVlcnlPcHRpb25zICYgeyBsaW1pdDogbnVtYmVyIH1cbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXN1bHQ8VD4+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVmID0gY29sbGVjdGlvbih0aGlzLmZpcmVzdG9yZSwgY29sbGVjdGlvblBhdGgpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdGhpcy5idWlsZFF1ZXJ5Q29uc3RyYWludHMob3B0aW9ucyk7XG5cbiAgICAvLyBQZWRpciB1bm8gbcOhcyBwYXJhIHNhYmVyIHNpIGhheSBtw6FzIHDDoWdpbmFzXG4gICAgY29uc3QgcSA9IHF1ZXJ5KGNvbGxlY3Rpb25SZWYsIC4uLmNvbnN0cmFpbnRzLCBsaW1pdChvcHRpb25zLmxpbWl0ICsgMSkpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0RG9jcyhxKTtcblxuICAgIGNvbnN0IGRvY3MgPSBzbmFwc2hvdC5kb2NzO1xuICAgIGNvbnN0IGhhc01vcmUgPSBkb2NzLmxlbmd0aCA+IG9wdGlvbnMubGltaXQ7XG5cbiAgICAvLyBTaSBoYXkgbcOhcywgcmVtb3ZlciBlbCBkb2N1bWVudG8gZXh0cmFcbiAgICBjb25zdCByZXN1bHREb2NzID0gaGFzTW9yZSA/IGRvY3Muc2xpY2UoMCwgLTEpIDogZG9jcztcbiAgICBjb25zdCBsYXN0RG9jID0gcmVzdWx0RG9jcy5sZW5ndGggPiAwID8gcmVzdWx0RG9jc1tyZXN1bHREb2NzLmxlbmd0aCAtIDFdIDogbnVsbDtcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiByZXN1bHREb2NzLm1hcCgoZG9jKSA9PiB0aGlzLm1hcERvY3VtZW50PFQ+KGRvYykpLFxuICAgICAgaGFzTW9yZSxcbiAgICAgIGxhc3REb2MsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmljYSBzaSB1biBkb2N1bWVudG8gZXhpc3RlLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIGRvY0lkIC0gSUQgZGVsIGRvY3VtZW50b1xuICAgKiBAcmV0dXJucyB0cnVlIHNpIGVsIGRvY3VtZW50byBleGlzdGVcbiAgICovXG4gIGFzeW5jIGV4aXN0cyhjb2xsZWN0aW9uUGF0aDogc3RyaW5nLCBkb2NJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCwgZG9jSWQpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0RG9jKGRvY1JlZik7XG4gICAgcmV0dXJuIHNuYXBzaG90LmV4aXN0cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNVQlNDUklQQ0lPTkVTIFJFQUwtVElNRSAoT2JzZXJ2YWJsZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN1c2NyaWJlIGEgY2FtYmlvcyBkZSB1biBkb2N1bWVudG8gKHJlYWwtdGltZSkuXG4gICAqXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uUGF0aCAtIFJ1dGEgZGUgbGEgY29sZWNjacOzblxuICAgKiBAcGFyYW0gZG9jSWQgLSBJRCBkZWwgZG9jdW1lbnRvXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIGN1YW5kbyBlbCBkb2N1bWVudG8gY2FtYmlhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRW4gZWwgY29tcG9uZW50ZVxuICAgKiB1c2VyJCA9IHRoaXMuZmlyZXN0b3JlU2VydmljZS5kb2NDaGFuZ2VzPFVzZXI+KCd1c2VycycsIHRoaXMudXNlcklkKTtcbiAgICpcbiAgICogLy8gRW4gZWwgdGVtcGxhdGVcbiAgICogQGlmICh1c2VyJCB8IGFzeW5jOyBhcyB1c2VyKSB7XG4gICAqICAgPHA+e3sgdXNlci5uYW1lIH19PC9wPlxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZG9jQ2hhbmdlczxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgZG9jSWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCwgZG9jSWQpO1xuICAgIHJldHVybiBkb2NEYXRhKGRvY1JlZiwgeyBpZEZpZWxkOiAnaWQnIH0pLnBpcGUoXG4gICAgICBtYXAoKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKCFkYXRhKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udmVydFRpbWVzdGFtcHMoZGF0YSBhcyBEb2N1bWVudERhdGEpIGFzIFQ7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU3VzY3JpYmUgYSBjYW1iaW9zIGRlIHVuYSBjb2xlY2Npw7NuIChyZWFsLXRpbWUpLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGNpb25lcyBkZSBxdWVyeVxuICAgKiBAcmV0dXJucyBPYnNlcnZhYmxlIHF1ZSBlbWl0ZSBjdWFuZG8gbGEgY29sZWNjacOzbiBjYW1iaWFcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBVc3VhcmlvcyBhY3Rpdm9zIGVuIHRpZW1wbyByZWFsXG4gICAqIGFjdGl2ZVVzZXJzJCA9IHRoaXMuZmlyZXN0b3JlU2VydmljZS5jb2xsZWN0aW9uQ2hhbmdlczxVc2VyPigndXNlcnMnLCB7XG4gICAqICAgd2hlcmU6IFt7IGZpZWxkOiAnc3RhdHVzJywgb3BlcmF0b3I6ICc9PScsIHZhbHVlOiAnb25saW5lJyB9XVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBjb2xsZWN0aW9uQ2hhbmdlczxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFF1ZXJ5T3B0aW9uc1xuICApOiBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZWYgPSBjb2xsZWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSB0aGlzLmJ1aWxkUXVlcnlDb25zdHJhaW50cyhvcHRpb25zKTtcbiAgICBjb25zdCBxID0gcXVlcnkoY29sbGVjdGlvblJlZiwgLi4uY29uc3RyYWludHMpO1xuXG4gICAgcmV0dXJuIGNvbGxlY3Rpb25EYXRhKHEsIHsgaWRGaWVsZDogJ2lkJyB9KS5waXBlKFxuICAgICAgbWFwKChkb2NzKSA9PiBkb2NzLm1hcCgoZG9jKSA9PiB0aGlzLmNvbnZlcnRUaW1lc3RhbXBzKGRvYykgYXMgVCkpXG4gICAgKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFU0NSSVRVUkFcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEFncmVnYSB1biBkb2N1bWVudG8gY29uIElEIGF1dG8tZ2VuZXJhZG8uXG4gICAqXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uUGF0aCAtIFJ1dGEgZGUgbGEgY29sZWNjacOzblxuICAgKiBAcGFyYW0gZGF0YSAtIERhdG9zIGRlbCBkb2N1bWVudG8gKHNpbiBpZCwgY3JlYXRlZEF0LCB1cGRhdGVkQXQpXG4gICAqIEByZXR1cm5zIERvY3VtZW50byBjcmVhZG8gY29uIHN1IElEXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbmV3VXNlciA9IGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UuYWRkRG9jPFVzZXI+KCd1c2VycycsIHtcbiAgICogICBuYW1lOiAnSm9obiBEb2UnLFxuICAgKiAgIGVtYWlsOiAnam9obkBleGFtcGxlLmNvbScsXG4gICAqICAgcm9sZTogJ3VzZXInXG4gICAqIH0pO1xuICAgKiBjb25zb2xlLmxvZygnQ3JlYXRlZCB1c2VyIHdpdGggSUQ6JywgbmV3VXNlci5pZCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYWRkRG9jPFQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudD4oXG4gICAgY29sbGVjdGlvblBhdGg6IHN0cmluZyxcbiAgICBkYXRhOiBPbWl0PFQsICdpZCcgfCAnY3JlYXRlZEF0JyB8ICd1cGRhdGVkQXQnPlxuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVmID0gY29sbGVjdGlvbih0aGlzLmZpcmVzdG9yZSwgY29sbGVjdGlvblBhdGgpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNlcnZlclRpbWVzdGFtcCgpO1xuXG4gICAgY29uc3QgZG9jRGF0YSA9IHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCxcbiAgICAgIHVwZGF0ZWRBdDogdGltZXN0YW1wLFxuICAgIH07XG5cbiAgICBjb25zdCBkb2NSZWYgPSBhd2FpdCBhZGREb2MoY29sbGVjdGlvblJlZiwgZG9jRGF0YSk7XG5cbiAgICAvLyBPYnRlbmVyIGVsIGRvY3VtZW50byBjcmVhZG8gcGFyYSByZXRvcm5hcmxvIGNvbiB0aW1lc3RhbXBzIHJlc3VlbHRvc1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0RG9jKGRvY1JlZik7XG4gICAgcmV0dXJuIHRoaXMubWFwRG9jdW1lbnQ8VD4oc25hcHNob3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWEgbyBzb2JyZXNjcmliZSB1biBkb2N1bWVudG8gY29uIElEIGVzcGVjw61maWNvLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIGRvY0lkIC0gSUQgZGVsIGRvY3VtZW50b1xuICAgKiBAcGFyYW0gZGF0YSAtIERhdG9zIGRlbCBkb2N1bWVudG9cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGNpb25lcyAobWVyZ2U6IHRydWUgcGFyYSBtZXJnZSBlbiBsdWdhciBkZSBzb2JyZXNjcmliaXIpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU29icmVzY3JpYmlyIGNvbXBsZXRhbWVudGVcbiAgICogYXdhaXQgZmlyZXN0b3JlU2VydmljZS5zZXREb2M8VXNlcj4oJ3VzZXJzJywgJ3VzZXIxMjMnLCB1c2VyRGF0YSk7XG4gICAqXG4gICAqIC8vIE1lcmdlIGNvbiBkYXRvcyBleGlzdGVudGVzXG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2Uuc2V0RG9jPFVzZXI+KCd1c2VycycsICd1c2VyMTIzJywgeyBuYW1lOiAnTmV3IE5hbWUnIH0sIHsgbWVyZ2U6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2V0RG9jPFQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudD4oXG4gICAgY29sbGVjdGlvblBhdGg6IHN0cmluZyxcbiAgICBkb2NJZDogc3RyaW5nLFxuICAgIGRhdGE6IE9taXQ8VCwgJ2lkJz4sXG4gICAgb3B0aW9ucz86IHsgbWVyZ2U/OiBib29sZWFuIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCwgZG9jSWQpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNlcnZlclRpbWVzdGFtcCgpO1xuXG4gICAgY29uc3QgZG9jRGF0YSA9IHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB1cGRhdGVkQXQ6IHRpbWVzdGFtcCxcbiAgICAgIC4uLihvcHRpb25zPy5tZXJnZSA/IHt9IDogeyBjcmVhdGVkQXQ6IHRpbWVzdGFtcCB9KSxcbiAgICB9O1xuXG4gICAgYXdhaXQgc2V0RG9jKGRvY1JlZiwgZG9jRGF0YSwgeyBtZXJnZTogb3B0aW9ucz8ubWVyZ2UgPz8gZmFsc2UgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWN0dWFsaXphIGNhbXBvcyBlc3BlY8OtZmljb3MgZGUgdW4gZG9jdW1lbnRvLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIGRvY0lkIC0gSUQgZGVsIGRvY3VtZW50b1xuICAgKiBAcGFyYW0gZGF0YSAtIENhbXBvcyBhIGFjdHVhbGl6YXJcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBmaXJlc3RvcmVTZXJ2aWNlLnVwZGF0ZURvYzxVc2VyPigndXNlcnMnLCAndXNlcjEyMycsIHtcbiAgICogICBuYW1lOiAnVXBkYXRlZCBOYW1lJyxcbiAgICogICBsYXN0TG9naW46IG5ldyBEYXRlKClcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgdXBkYXRlRG9jPFQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudD4oXG4gICAgY29sbGVjdGlvblBhdGg6IHN0cmluZyxcbiAgICBkb2NJZDogc3RyaW5nLFxuICAgIGRhdGE6IFBhcnRpYWw8T21pdDxULCAnaWQnIHwgJ2NyZWF0ZWRBdCc+PlxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkb2NSZWYgPSBkb2ModGhpcy5maXJlc3RvcmUsIGNvbGxlY3Rpb25QYXRoLCBkb2NJZCk7XG5cbiAgICBhd2FpdCB1cGRhdGVEb2MoZG9jUmVmLCB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgdXBkYXRlZEF0OiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbGltaW5hIHVuIGRvY3VtZW50by5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBkb2NJZCAtIElEIGRlbCBkb2N1bWVudG9cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBhd2FpdCBmaXJlc3RvcmVTZXJ2aWNlLmRlbGV0ZURvYygndXNlcnMnLCAndXNlcjEyMycpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGRlbGV0ZURvYyhjb2xsZWN0aW9uUGF0aDogc3RyaW5nLCBkb2NJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCwgZG9jSWQpO1xuICAgIGF3YWl0IGRlbGV0ZURvYyhkb2NSZWYpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE9QRVJBQ0lPTkVTIEVOIExPVEVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVqZWN1dGEgbcO6bHRpcGxlcyBvcGVyYWNpb25lcyBkZSBlc2NyaXR1cmEgZGUgZm9ybWEgYXTDs21pY2EuXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIC0gRnVuY2nDs24gcXVlIHJlY2liZSBlbCBiYXRjaCB5IGFncmVnYSBvcGVyYWNpb25lc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UuYmF0Y2goKGJhdGNoKSA9PiB7XG4gICAqICAgYmF0Y2guc2V0KCd1c2Vycy91c2VyMScsIHsgbmFtZTogJ1VzZXIgMScgfSk7XG4gICAqICAgYmF0Y2gudXBkYXRlKCd1c2Vycy91c2VyMicsIHsgc3RhdHVzOiAnaW5hY3RpdmUnIH0pO1xuICAgKiAgIGJhdGNoLmRlbGV0ZSgndXNlcnMvdXNlcjMnKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYmF0Y2goXG4gICAgb3BlcmF0aW9uczogKGJhdGNoOiB7XG4gICAgICBzZXQ6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgICB1cGRhdGU6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8VD4pID0+IHZvaWQ7XG4gICAgICBkZWxldGU6IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgfSkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiYXRjaCA9IHdyaXRlQmF0Y2godGhpcy5maXJlc3RvcmUpO1xuXG4gICAgY29uc3QgYmF0Y2hBcGkgPSB7XG4gICAgICBzZXQ6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFQpID0+IHtcbiAgICAgICAgY29uc3QgW2NvbGxlY3Rpb25QYXRoLCBkb2NJZF0gPSB0aGlzLnNwbGl0UGF0aChwYXRoKTtcbiAgICAgICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCwgZG9jSWQpO1xuICAgICAgICBiYXRjaC5zZXQoZG9jUmVmLCB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICBjcmVhdGVkQXQ6IHNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICAgIHVwZGF0ZWRBdDogc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgIH0gYXMgRG9jdW1lbnREYXRhKTtcbiAgICAgIH0sXG4gICAgICB1cGRhdGU6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8VD4pID0+IHtcbiAgICAgICAgY29uc3QgW2NvbGxlY3Rpb25QYXRoLCBkb2NJZF0gPSB0aGlzLnNwbGl0UGF0aChwYXRoKTtcbiAgICAgICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBjb2xsZWN0aW9uUGF0aCwgZG9jSWQpO1xuICAgICAgICBiYXRjaC51cGRhdGUoZG9jUmVmLCB7XG4gICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICB1cGRhdGVkQXQ6IHNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICB9IGFzIERvY3VtZW50RGF0YSk7XG4gICAgICB9LFxuICAgICAgZGVsZXRlOiAocGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IFtjb2xsZWN0aW9uUGF0aCwgZG9jSWRdID0gdGhpcy5zcGxpdFBhdGgocGF0aCk7XG4gICAgICAgIGNvbnN0IGRvY1JlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZSwgY29sbGVjdGlvblBhdGgsIGRvY0lkKTtcbiAgICAgICAgYmF0Y2guZGVsZXRlKGRvY1JlZik7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBvcGVyYXRpb25zKGJhdGNoQXBpKTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVVElMSURBREVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1eWUgdW5hIHJ1dGEgYSBwYXJ0aXIgZGUgdW4gdGVtcGxhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZSAtIFRlbXBsYXRlIGNvbiBwbGFjZWhvbGRlcnMge3BhcmFtfVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmFsb3JlcyBwYXJhIGxvcyBwbGFjZWhvbGRlcnNcbiAgICogQHJldHVybnMgUnV0YSBjb25zdHJ1aWRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGF0aCA9IGZpcmVzdG9yZVNlcnZpY2UuYnVpbGRQYXRoKCd1c2Vycy97dXNlcklkfS9kb2N1bWVudHMve2RvY0lkfScsIHtcbiAgICogICB1c2VySWQ6ICd1c2VyMTIzJyxcbiAgICogICBkb2NJZDogJ2RvYzQ1NidcbiAgICogfSk7XG4gICAqIC8vID0+ICd1c2Vycy91c2VyMTIzL2RvY3VtZW50cy9kb2M0NTYnXG4gICAqIGBgYFxuICAgKi9cbiAgYnVpbGRQYXRoKHRlbXBsYXRlOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aCh0ZW1wbGF0ZSwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmEgdW4gSUQgw7puaWNvIHBhcmEgdW4gZG9jdW1lbnRvIChzaW4gY3JlYXJsbykuXG4gICAqXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uUGF0aCAtIFJ1dGEgZGUgbGEgY29sZWNjacOzblxuICAgKiBAcmV0dXJucyBJRCDDum5pY28gZ2VuZXJhZG8gcG9yIEZpcmVzdG9yZVxuICAgKi9cbiAgZ2VuZXJhdGVJZChjb2xsZWN0aW9uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVmID0gY29sbGVjdGlvbih0aGlzLmZpcmVzdG9yZSwgY29sbGVjdGlvblBhdGgpO1xuICAgIHJldHVybiBkb2MoY29sbGVjdGlvblJlZikuaWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSB1biB2YWxvciBkZSB0aW1lc3RhbXAgZGVsIHNlcnZpZG9yLlxuICAgKiBVc2FyIGVuIGNhbXBvcyBkZSBmZWNoYSBwYXJhIHF1ZSBGaXJlc3RvcmUgYXNpZ25lIGVsIHRpbWVzdGFtcC5cbiAgICovXG4gIHNlcnZlclRpbWVzdGFtcCgpOiBGaWVsZFZhbHVlIHtcbiAgICByZXR1cm4gc2VydmVyVGltZXN0YW1wKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0b3JuYSB1biB2YWxvciBwYXJhIGFncmVnYXIgZWxlbWVudG9zIGEgdW4gYXJyYXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyZXN0b3JlU2VydmljZS51cGRhdGVEb2MoJ3VzZXJzJywgJ3VzZXIxMjMnLCB7XG4gICAqICAgdGFnczogZmlyZXN0b3JlU2VydmljZS5hcnJheVVuaW9uKCduZXctdGFnJylcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXJyYXlVbmlvbiguLi5lbGVtZW50czogdW5rbm93bltdKTogRmllbGRWYWx1ZSB7XG4gICAgcmV0dXJuIGFycmF5VW5pb24oLi4uZWxlbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdW4gdmFsb3IgcGFyYSByZW1vdmVyIGVsZW1lbnRvcyBkZSB1biBhcnJheS5cbiAgICovXG4gIGFycmF5UmVtb3ZlKC4uLmVsZW1lbnRzOiB1bmtub3duW10pOiBGaWVsZFZhbHVlIHtcbiAgICByZXR1cm4gYXJyYXlSZW1vdmUoLi4uZWxlbWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdW4gdmFsb3IgcGFyYSBpbmNyZW1lbnRhciB1biBjYW1wbyBudW3DqXJpY28uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyZXN0b3JlU2VydmljZS51cGRhdGVEb2MoJ3VzZXJzJywgJ3VzZXIxMjMnLCB7XG4gICAqICAgbG9naW5Db3VudDogZmlyZXN0b3JlU2VydmljZS5pbmNyZW1lbnQoMSlcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgaW5jcmVtZW50KG46IG51bWJlcik6IEZpZWxkVmFsdWUge1xuICAgIHJldHVybiBpbmNyZW1lbnQobik7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTcOJVE9ET1MgUFJJVkFET1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIENvbnN0cnV5ZSBsb3MgUXVlcnlDb25zdHJhaW50cyBhIHBhcnRpciBkZSBRdWVyeU9wdGlvbnNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRRdWVyeUNvbnN0cmFpbnRzKG9wdGlvbnM/OiBRdWVyeU9wdGlvbnMpOiBRdWVyeUNvbnN0cmFpbnRbXSB7XG4gICAgY29uc3QgY29uc3RyYWludHM6IFF1ZXJ5Q29uc3RyYWludFtdID0gW107XG5cbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybiBjb25zdHJhaW50cztcblxuICAgIC8vIFdoZXJlIGNsYXVzZXNcbiAgICBpZiAob3B0aW9ucy53aGVyZSkge1xuICAgICAgZm9yIChjb25zdCBjbGF1c2Ugb2Ygb3B0aW9ucy53aGVyZSkge1xuICAgICAgICBjb25zdHJhaW50cy5wdXNoKHdoZXJlKGNsYXVzZS5maWVsZCwgY2xhdXNlLm9wZXJhdG9yLCBjbGF1c2UudmFsdWUpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPcmRlckJ5IGNsYXVzZXNcbiAgICBpZiAob3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBvcHRpb25zLm9yZGVyQnkpIHtcbiAgICAgICAgY29uc3RyYWludHMucHVzaChvcmRlckJ5KGNsYXVzZS5maWVsZCwgY2xhdXNlLmRpcmVjdGlvbikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEN1cnNvcnMgcGFyYSBwYWdpbmFjacOzblxuICAgIGlmIChvcHRpb25zLnN0YXJ0QWZ0ZXIpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goc3RhcnRBZnRlcihvcHRpb25zLnN0YXJ0QWZ0ZXIpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3RhcnRBdCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChzdGFydEF0KG9wdGlvbnMuc3RhcnRBdCkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lbmRCZWZvcmUpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goZW5kQmVmb3JlKG9wdGlvbnMuZW5kQmVmb3JlKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmVuZEF0KSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKGVuZEF0KG9wdGlvbnMuZW5kQXQpKTtcbiAgICB9XG5cbiAgICAvLyBMaW1pdCAoc2UgYWdyZWdhIGFsIGZpbmFsKVxuICAgIGlmIChvcHRpb25zLmxpbWl0KSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKGxpbWl0KG9wdGlvbnMubGltaXQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29uc3RyYWludHM7XG4gIH1cblxuICAvKipcbiAgICogTWFwZWEgdW4gRG9jdW1lbnRTbmFwc2hvdCBhIG51ZXN0cm8gdGlwb1xuICAgKi9cbiAgcHJpdmF0ZSBtYXBEb2N1bWVudDxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIHNuYXBzaG90OiBEb2N1bWVudFNuYXBzaG90PERvY3VtZW50RGF0YT5cbiAgKTogVCB7XG4gICAgY29uc3QgZGF0YSA9IHNuYXBzaG90LmRhdGEoKTtcbiAgICBpZiAoIWRhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRG9jdW1lbnRvIG5vIHRpZW5lIGRhdG9zJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBzbmFwc2hvdC5pZCxcbiAgICAgIC4uLnRoaXMuY29udmVydFRpbWVzdGFtcHMoZGF0YSksXG4gICAgfSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZpZXJ0ZSBUaW1lc3RhbXBzIGRlIEZpcmVzdG9yZSBhIERhdGUgZGUgSmF2YVNjcmlwdFxuICAgKi9cbiAgcHJpdmF0ZSBjb252ZXJ0VGltZXN0YW1wcyhkYXRhOiBEb2N1bWVudERhdGEpOiBEb2N1bWVudERhdGEge1xuICAgIGNvbnN0IHJlc3VsdDogRG9jdW1lbnREYXRhID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVGltZXN0YW1wKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdmFsdWUudG9EYXRlKCk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdFtrZXldID0gdGhpcy5jb252ZXJ0VGltZXN0YW1wcyh2YWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRGl2aWRlIHVuYSBydXRhIGRlIGRvY3VtZW50byBlbiBjb2xlY2Npw7NuIGUgSURcbiAgICovXG4gIHByaXZhdGUgc3BsaXRQYXRoKHBhdGg6IHN0cmluZyk6IFtzdHJpbmcsIHN0cmluZ10ge1xuICAgIGNvbnN0IHNlZ21lbnRzID0gcGF0aC5zcGxpdCgnLycpO1xuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPCAyIHx8IHNlZ21lbnRzLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUnV0YSBkZSBkb2N1bWVudG8gaW52w6FsaWRhOiAke3BhdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGRvY0lkID0gc2VnbWVudHMucG9wKCkhO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25QYXRoID0gc2VnbWVudHMuam9pbignLycpO1xuICAgIHJldHVybiBbY29sbGVjdGlvblBhdGgsIGRvY0lkXTtcbiAgfVxufVxuIl19
|
|
536
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlyZXN0b3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL2ZpcmVzdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1YsY0FBYyxFQUNkLFNBQVMsRUFDVCxHQUFHLEVBQ0gsT0FBTyxFQUtQLE1BQU0sRUFDTixPQUFPLEVBQ1AsS0FBSyxFQUNMLE9BQU8sRUFDUCxLQUFLLEVBRUwsZUFBZSxFQUNmLE1BQU0sRUFDTixVQUFVLEVBQ1YsT0FBTyxFQUNQLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxLQUFLLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxHQUVaLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUFFLEdBQUcsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7QUFFakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBZ0NHO0FBRUgsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixZQUFvQixTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBRmhDLFdBQU0sR0FBRyxNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUUxQixDQUFDO0lBRTVDOzs7OztPQUtHO0lBQ0ssb0JBQW9CLENBQUMsY0FBc0I7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsS0FBSztZ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SyxDQUFDLCtCQUErQixJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFHLENBQUM7UUFDOUIsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMxQyxPQUFPLENBQUMsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLENBQUM7K0dBdmpCVSxnQkFBZ0I7bUhBQWhCLGdCQUFnQixjQURILE1BQU07OzRGQUNuQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXJlc3RvcmUgU2VydmljZVxuICpcbiAqIFNlcnZpY2lvIGdlbsOpcmljbyBwYXJhIG9wZXJhY2lvbmVzIENSVUQgZW4gRmlyZXN0b3JlLlxuICogU29wb3J0YSBsZWN0dXJhcyBvbmUtdGltZSwgc3Vic2NyaXBjaW9uZXMgcmVhbC10aW1lLCBwYWdpbmFjacOzbiB5IHF1ZXJpZXMgY29tcGxlamFzLlxuICovXG5cbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgYWRkRG9jLFxuICBjb2xsZWN0aW9uLFxuICBjb2xsZWN0aW9uRGF0YSxcbiAgZGVsZXRlRG9jLFxuICBkb2MsXG4gIGRvY0RhdGEsXG4gIERvY3VtZW50RGF0YSxcbiAgRG9jdW1lbnRSZWZlcmVuY2UsXG4gIERvY3VtZW50U25hcHNob3QsXG4gIEZpcmVzdG9yZSxcbiAgZ2V0RG9jLFxuICBnZXREb2NzLFxuICBsaW1pdCxcbiAgb3JkZXJCeSxcbiAgcXVlcnksXG4gIFF1ZXJ5Q29uc3RyYWludCxcbiAgc2VydmVyVGltZXN0YW1wLFxuICBzZXREb2MsXG4gIHN0YXJ0QWZ0ZXIsXG4gIHN0YXJ0QXQsXG4gIGVuZEJlZm9yZSxcbiAgZW5kQXQsXG4gIFRpbWVzdGFtcCxcbiAgdXBkYXRlRG9jLFxuICB3aGVyZSxcbiAgd3JpdGVCYXRjaCxcbiAgaW5jcmVtZW50LFxuICBhcnJheVVuaW9uLFxuICBhcnJheVJlbW92ZSxcbiAgRmllbGRWYWx1ZSxcbn0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9maXJlc3RvcmUnO1xuaW1wb3J0IHsgbWFwLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFZBTFRFQ0hfRklSRUJBU0VfQ09ORklHIH0gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHsgRmlyZXN0b3JlRG9jdW1lbnQsIFBhZ2luYXRlZFJlc3VsdCwgUXVlcnlPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBidWlsZFBhdGggfSBmcm9tICcuL3V0aWxzL3BhdGgtYnVpbGRlcic7XG5cbi8qKlxuICogU2VydmljaW8gcGFyYSBvcGVyYWNpb25lcyBDUlVEIGVuIEZpcmVzdG9yZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW50ZXJmYWNlIFVzZXIgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudCB7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqICAgZW1haWw6IHN0cmluZztcbiAqICAgcm9sZTogJ2FkbWluJyB8ICd1c2VyJztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogZXhwb3J0IGNsYXNzIFVzZXJzQ29tcG9uZW50IHtcbiAqICAgcHJpdmF0ZSBmaXJlc3RvcmUgPSBpbmplY3QoRmlyZXN0b3JlU2VydmljZSk7XG4gKlxuICogICAvLyBMZWN0dXJhIG9uZS10aW1lXG4gKiAgIGFzeW5jIGxvYWRVc2VyKGlkOiBzdHJpbmcpIHtcbiAqICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5maXJlc3RvcmUuZ2V0RG9jPFVzZXI+KCd1c2VycycsIGlkKTtcbiAqICAgfVxuICpcbiAqICAgLy8gU3Vic2NyaXBjacOzbiByZWFsLXRpbWVcbiAqICAgdXNlcnMkID0gdGhpcy5maXJlc3RvcmUuY29sbGVjdGlvbkNoYW5nZXM8VXNlcj4oJ3VzZXJzJywge1xuICogICAgIHdoZXJlOiBbeyBmaWVsZDogJ3JvbGUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6ICdhZG1pbicgfV0sXG4gKiAgICAgb3JkZXJCeTogW3sgZmllbGQ6ICduYW1lJywgZGlyZWN0aW9uOiAnYXNjJyB9XVxuICogICB9KTtcbiAqXG4gKiAgIC8vIENyZWFyIGRvY3VtZW50b1xuICogICBhc3luYyBjcmVhdGVVc2VyKGRhdGE6IE9taXQ8VXNlciwgJ2lkJz4pIHtcbiAqICAgICBjb25zdCB1c2VyID0gYXdhaXQgdGhpcy5maXJlc3RvcmUuYWRkRG9jPFVzZXI+KCd1c2VycycsIGRhdGEpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBGaXJlc3RvcmVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb25maWcgPSBpbmplY3QoVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmaXJlc3RvcmU6IEZpcmVzdG9yZSkge31cblxuICAvKipcbiAgICogUHJlZmlqYSBlbCBwYXRoIGRlIGNvbGVjY2nDs24gY29uIGVsIGFwcElkIHNpIGVzdMOhIGNvbmZpZ3VyYWRvLlxuICAgKiBTaSBubyBoYXkgYXBwSWQsIHJldG9ybmEgZWwgcGF0aCBzaW4gbW9kaWZpY2FyIChiYWNrd2FyZCBjb21wYXRpYmxlKS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcml2YXRlIHByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb25maWc/LmFwcElkKSByZXR1cm4gY29sbGVjdGlvblBhdGg7XG4gICAgcmV0dXJuIGBhcHBzLyR7dGhpcy5jb25maWcuYXBwSWR9LyR7Y29sbGVjdGlvblBhdGh9YDtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMRUNUVVJBUyBPTkUtVElNRSAoUHJvbWlzZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIE9idGllbmUgdW4gZG9jdW1lbnRvIHBvciBJRCAobGVjdHVyYSDDum5pY2EpLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIGRvY0lkIC0gSUQgZGVsIGRvY3VtZW50b1xuICAgKiBAcmV0dXJucyBEb2N1bWVudG8gbyBudWxsIHNpIG5vIGV4aXN0ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHVzZXIgPSBhd2FpdCBmaXJlc3RvcmVTZXJ2aWNlLmdldERvYzxVc2VyPigndXNlcnMnLCAnYWJjMTIzJyk7XG4gICAqIGlmICh1c2VyKSB7XG4gICAqICAgY29uc29sZS5sb2codXNlci5uYW1lKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIGdldERvYzxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgZG9jSWQ6IHN0cmluZ1xuICApOiBQcm9taXNlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhDb2xsZWN0aW9uUGF0aChjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgsIGRvY0lkKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldERvYyhkb2NSZWYpO1xuXG4gICAgaWYgKCFzbmFwc2hvdC5leGlzdHMoKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWFwRG9jdW1lbnQ8VD4oc25hcHNob3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9idGllbmUgbcO6bHRpcGxlcyBkb2N1bWVudG9zIGNvbiBvcGNpb25lcyBkZSBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3BjaW9uZXMgZGUgcXVlcnkgKHdoZXJlLCBvcmRlckJ5LCBsaW1pdClcbiAgICogQHJldHVybnMgQXJyYXkgZGUgZG9jdW1lbnRvc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFRvZG9zIGxvcyB1c3VhcmlvcyBhY3Rpdm9zIG9yZGVuYWRvcyBwb3Igbm9tYnJlXG4gICAqIGNvbnN0IHVzZXJzID0gYXdhaXQgZmlyZXN0b3JlU2VydmljZS5nZXREb2NzPFVzZXI+KCd1c2VycycsIHtcbiAgICogICB3aGVyZTogW3sgZmllbGQ6ICdhY3RpdmUnLCBvcGVyYXRvcjogJz09JywgdmFsdWU6IHRydWUgfV0sXG4gICAqICAgb3JkZXJCeTogW3sgZmllbGQ6ICduYW1lJywgZGlyZWN0aW9uOiAnYXNjJyB9XSxcbiAgICogICBsaW1pdDogNTBcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZ2V0RG9jczxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IFF1ZXJ5T3B0aW9uc1xuICApOiBQcm9taXNlPFRbXT4ge1xuICAgIGNvbnN0IHByZWZpeGVkUGF0aCA9IHRoaXMucHJlZml4Q29sbGVjdGlvblBhdGgoY29sbGVjdGlvblBhdGgpO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZWYgPSBjb2xsZWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdGhpcy5idWlsZFF1ZXJ5Q29uc3RyYWludHMob3B0aW9ucyk7XG4gICAgY29uc3QgcSA9IHF1ZXJ5KGNvbGxlY3Rpb25SZWYsIC4uLmNvbnN0cmFpbnRzKTtcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IGdldERvY3MocSk7XG5cbiAgICByZXR1cm4gc25hcHNob3QuZG9jcy5tYXAoKGRvYykgPT4gdGhpcy5tYXBEb2N1bWVudDxUPihkb2MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPYnRpZW5lIGRvY3VtZW50b3MgY29uIHBhZ2luYWNpw7NuIGJhc2FkYSBlbiBjdXJzb3Jlcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3BjaW9uZXMgZGUgcXVlcnkgKGRlYmUgaW5jbHVpciBsaW1pdClcbiAgICogQHJldHVybnMgUmVzdWx0YWRvIHBhZ2luYWRvIGNvbiBjdXJzb3IgcGFyYSBsYSBzaWd1aWVudGUgcMOhZ2luYVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFByaW1lcmEgcMOhZ2luYVxuICAgKiBjb25zdCBwYWdlMSA9IGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UuZ2V0UGFnaW5hdGVkPFVzZXI+KCd1c2VycycsIHtcbiAgICogICBvcmRlckJ5OiBbeyBmaWVsZDogJ2NyZWF0ZWRBdCcsIGRpcmVjdGlvbjogJ2Rlc2MnIH1dLFxuICAgKiAgIGxpbWl0OiAxMFxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gU2lndWllbnRlIHDDoWdpbmFcbiAgICogaWYgKHBhZ2UxLmhhc01vcmUpIHtcbiAgICogICBjb25zdCBwYWdlMiA9IGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UuZ2V0UGFnaW5hdGVkPFVzZXI+KCd1c2VycycsIHtcbiAgICogICAgIG9yZGVyQnk6IFt7IGZpZWxkOiAnY3JlYXRlZEF0JywgZGlyZWN0aW9uOiAnZGVzYycgfV0sXG4gICAqICAgICBsaW1pdDogMTAsXG4gICAqICAgICBzdGFydEFmdGVyOiBwYWdlMS5sYXN0RG9jXG4gICAqICAgfSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBnZXRQYWdpbmF0ZWQ8VCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PihcbiAgICBjb2xsZWN0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFF1ZXJ5T3B0aW9ucyAmIHsgbGltaXQ6IG51bWJlciB9XG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzdWx0PFQ+PiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhDb2xsZWN0aW9uUGF0aChjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgY29sbGVjdGlvblJlZiA9IGNvbGxlY3Rpb24odGhpcy5maXJlc3RvcmUsIHByZWZpeGVkUGF0aCk7XG4gICAgY29uc3QgY29uc3RyYWludHMgPSB0aGlzLmJ1aWxkUXVlcnlDb25zdHJhaW50cyhvcHRpb25zKTtcblxuICAgIC8vIFBlZGlyIHVubyBtw6FzIHBhcmEgc2FiZXIgc2kgaGF5IG3DoXMgcMOhZ2luYXNcbiAgICBjb25zdCBxID0gcXVlcnkoY29sbGVjdGlvblJlZiwgLi4uY29uc3RyYWludHMsIGxpbWl0KG9wdGlvbnMubGltaXQgKyAxKSk7XG4gICAgY29uc3Qgc25hcHNob3QgPSBhd2FpdCBnZXREb2NzKHEpO1xuXG4gICAgY29uc3QgZG9jcyA9IHNuYXBzaG90LmRvY3M7XG4gICAgY29uc3QgaGFzTW9yZSA9IGRvY3MubGVuZ3RoID4gb3B0aW9ucy5saW1pdDtcblxuICAgIC8vIFNpIGhheSBtw6FzLCByZW1vdmVyIGVsIGRvY3VtZW50byBleHRyYVxuICAgIGNvbnN0IHJlc3VsdERvY3MgPSBoYXNNb3JlID8gZG9jcy5zbGljZSgwLCAtMSkgOiBkb2NzO1xuICAgIGNvbnN0IGxhc3REb2MgPSByZXN1bHREb2NzLmxlbmd0aCA+IDAgPyByZXN1bHREb2NzW3Jlc3VsdERvY3MubGVuZ3RoIC0gMV0gOiBudWxsO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHJlc3VsdERvY3MubWFwKChkb2MpID0+IHRoaXMubWFwRG9jdW1lbnQ8VD4oZG9jKSksXG4gICAgICBoYXNNb3JlLFxuICAgICAgbGFzdERvYyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWNhIHNpIHVuIGRvY3VtZW50byBleGlzdGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uUGF0aCAtIFJ1dGEgZGUgbGEgY29sZWNjacOzblxuICAgKiBAcGFyYW0gZG9jSWQgLSBJRCBkZWwgZG9jdW1lbnRvXG4gICAqIEByZXR1cm5zIHRydWUgc2kgZWwgZG9jdW1lbnRvIGV4aXN0ZVxuICAgKi9cbiAgYXN5bmMgZXhpc3RzKGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsIGRvY0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoKTtcbiAgICBjb25zdCBkb2NSZWYgPSBkb2ModGhpcy5maXJlc3RvcmUsIHByZWZpeGVkUGF0aCwgZG9jSWQpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0RG9jKGRvY1JlZik7XG4gICAgcmV0dXJuIHNuYXBzaG90LmV4aXN0cygpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFNVQlNDUklQQ0lPTkVTIFJFQUwtVElNRSAoT2JzZXJ2YWJsZSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN1c2NyaWJlIGEgY2FtYmlvcyBkZSB1biBkb2N1bWVudG8gKHJlYWwtdGltZSkuXG4gICAqXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uUGF0aCAtIFJ1dGEgZGUgbGEgY29sZWNjacOzblxuICAgKiBAcGFyYW0gZG9jSWQgLSBJRCBkZWwgZG9jdW1lbnRvXG4gICAqIEByZXR1cm5zIE9ic2VydmFibGUgcXVlIGVtaXRlIGN1YW5kbyBlbCBkb2N1bWVudG8gY2FtYmlhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gRW4gZWwgY29tcG9uZW50ZVxuICAgKiB1c2VyJCA9IHRoaXMuZmlyZXN0b3JlU2VydmljZS5kb2NDaGFuZ2VzPFVzZXI+KCd1c2VycycsIHRoaXMudXNlcklkKTtcbiAgICpcbiAgICogLy8gRW4gZWwgdGVtcGxhdGVcbiAgICogQGlmICh1c2VyJCB8IGFzeW5jOyBhcyB1c2VyKSB7XG4gICAqICAgPHA+e3sgdXNlci5uYW1lIH19PC9wPlxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZG9jQ2hhbmdlczxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgZG9jSWQ6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPFQgfCBudWxsPiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhDb2xsZWN0aW9uUGF0aChjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgsIGRvY0lkKTtcbiAgICByZXR1cm4gZG9jRGF0YShkb2NSZWYsIHsgaWRGaWVsZDogJ2lkJyB9KS5waXBlKFxuICAgICAgbWFwKChkYXRhKSA9PiB7XG4gICAgICAgIGlmICghZGF0YSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRUaW1lc3RhbXBzKGRhdGEgYXMgRG9jdW1lbnREYXRhKSBhcyBUO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1c2NyaWJlIGEgY2FtYmlvcyBkZSB1bmEgY29sZWNjacOzbiAocmVhbC10aW1lKS5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3BjaW9uZXMgZGUgcXVlcnlcbiAgICogQHJldHVybnMgT2JzZXJ2YWJsZSBxdWUgZW1pdGUgY3VhbmRvIGxhIGNvbGVjY2nDs24gY2FtYmlhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXN1YXJpb3MgYWN0aXZvcyBlbiB0aWVtcG8gcmVhbFxuICAgKiBhY3RpdmVVc2VycyQgPSB0aGlzLmZpcmVzdG9yZVNlcnZpY2UuY29sbGVjdGlvbkNoYW5nZXM8VXNlcj4oJ3VzZXJzJywge1xuICAgKiAgIHdoZXJlOiBbeyBmaWVsZDogJ3N0YXR1cycsIG9wZXJhdG9yOiAnPT0nLCB2YWx1ZTogJ29ubGluZScgfV1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgY29sbGVjdGlvbkNoYW5nZXM8VCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PihcbiAgICBjb2xsZWN0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBRdWVyeU9wdGlvbnNcbiAgKTogT2JzZXJ2YWJsZTxUW10+IHtcbiAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoKTtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVmID0gY29sbGVjdGlvbih0aGlzLmZpcmVzdG9yZSwgcHJlZml4ZWRQYXRoKTtcbiAgICBjb25zdCBjb25zdHJhaW50cyA9IHRoaXMuYnVpbGRRdWVyeUNvbnN0cmFpbnRzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHEgPSBxdWVyeShjb2xsZWN0aW9uUmVmLCAuLi5jb25zdHJhaW50cyk7XG5cbiAgICByZXR1cm4gY29sbGVjdGlvbkRhdGEocSwgeyBpZEZpZWxkOiAnaWQnIH0pLnBpcGUoXG4gICAgICBtYXAoKGRvY3MpID0+IGRvY3MubWFwKChkb2MpID0+IHRoaXMuY29udmVydFRpbWVzdGFtcHMoZG9jKSBhcyBUKSlcbiAgICApO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEVTQ1JJVFVSQVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQWdyZWdhIHVuIGRvY3VtZW50byBjb24gSUQgYXV0by1nZW5lcmFkby5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBkYXRhIC0gRGF0b3MgZGVsIGRvY3VtZW50byAoc2luIGlkLCBjcmVhdGVkQXQsIHVwZGF0ZWRBdClcbiAgICogQHJldHVybnMgRG9jdW1lbnRvIGNyZWFkbyBjb24gc3UgSURcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBuZXdVc2VyID0gYXdhaXQgZmlyZXN0b3JlU2VydmljZS5hZGREb2M8VXNlcj4oJ3VzZXJzJywge1xuICAgKiAgIG5hbWU6ICdKb2huIERvZScsXG4gICAqICAgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyxcbiAgICogICByb2xlOiAndXNlcidcbiAgICogfSk7XG4gICAqIGNvbnNvbGUubG9nKCdDcmVhdGVkIHVzZXIgd2l0aCBJRDonLCBuZXdVc2VyLmlkKTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyBhZGREb2M8VCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PihcbiAgICBjb2xsZWN0aW9uUGF0aDogc3RyaW5nLFxuICAgIGRhdGE6IE9taXQ8VCwgJ2lkJyB8ICdjcmVhdGVkQXQnIHwgJ3VwZGF0ZWRBdCc+XG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHByZWZpeGVkUGF0aCA9IHRoaXMucHJlZml4Q29sbGVjdGlvblBhdGgoY29sbGVjdGlvblBhdGgpO1xuICAgIGNvbnN0IGNvbGxlY3Rpb25SZWYgPSBjb2xsZWN0aW9uKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgpO1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IHNlcnZlclRpbWVzdGFtcCgpO1xuXG4gICAgY29uc3QgZG9jRGF0YSA9IHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICBjcmVhdGVkQXQ6IHRpbWVzdGFtcCxcbiAgICAgIHVwZGF0ZWRBdDogdGltZXN0YW1wLFxuICAgIH07XG5cbiAgICBjb25zdCBkb2NSZWYgPSBhd2FpdCBhZGREb2MoY29sbGVjdGlvblJlZiwgZG9jRGF0YSk7XG5cbiAgICAvLyBPYnRlbmVyIGVsIGRvY3VtZW50byBjcmVhZG8gcGFyYSByZXRvcm5hcmxvIGNvbiB0aW1lc3RhbXBzIHJlc3VlbHRvc1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgZ2V0RG9jKGRvY1JlZik7XG4gICAgcmV0dXJuIHRoaXMubWFwRG9jdW1lbnQ8VD4oc25hcHNob3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWEgbyBzb2JyZXNjcmliZSB1biBkb2N1bWVudG8gY29uIElEIGVzcGVjw61maWNvLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIGRvY0lkIC0gSUQgZGVsIGRvY3VtZW50b1xuICAgKiBAcGFyYW0gZGF0YSAtIERhdG9zIGRlbCBkb2N1bWVudG9cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcGNpb25lcyAobWVyZ2U6IHRydWUgcGFyYSBtZXJnZSBlbiBsdWdhciBkZSBzb2JyZXNjcmliaXIpXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU29icmVzY3JpYmlyIGNvbXBsZXRhbWVudGVcbiAgICogYXdhaXQgZmlyZXN0b3JlU2VydmljZS5zZXREb2M8VXNlcj4oJ3VzZXJzJywgJ3VzZXIxMjMnLCB1c2VyRGF0YSk7XG4gICAqXG4gICAqIC8vIE1lcmdlIGNvbiBkYXRvcyBleGlzdGVudGVzXG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2Uuc2V0RG9jPFVzZXI+KCd1c2VycycsICd1c2VyMTIzJywgeyBuYW1lOiAnTmV3IE5hbWUnIH0sIHsgbWVyZ2U6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgc2V0RG9jPFQgZXh0ZW5kcyBGaXJlc3RvcmVEb2N1bWVudD4oXG4gICAgY29sbGVjdGlvblBhdGg6IHN0cmluZyxcbiAgICBkb2NJZDogc3RyaW5nLFxuICAgIGRhdGE6IE9taXQ8VCwgJ2lkJz4sXG4gICAgb3B0aW9ucz86IHsgbWVyZ2U/OiBib29sZWFuIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhDb2xsZWN0aW9uUGF0aChjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgsIGRvY0lkKTtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBzZXJ2ZXJUaW1lc3RhbXAoKTtcblxuICAgIGNvbnN0IGRvY0RhdGEgPSB7XG4gICAgICAuLi5kYXRhLFxuICAgICAgdXBkYXRlZEF0OiB0aW1lc3RhbXAsXG4gICAgICAuLi4ob3B0aW9ucz8ubWVyZ2UgPyB7fSA6IHsgY3JlYXRlZEF0OiB0aW1lc3RhbXAgfSksXG4gICAgfTtcblxuICAgIGF3YWl0IHNldERvYyhkb2NSZWYsIGRvY0RhdGEsIHsgbWVyZ2U6IG9wdGlvbnM/Lm1lcmdlID8/IGZhbHNlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHVhbGl6YSBjYW1wb3MgZXNwZWPDrWZpY29zIGRlIHVuIGRvY3VtZW50by5cbiAgICpcbiAgICogQHBhcmFtIGNvbGxlY3Rpb25QYXRoIC0gUnV0YSBkZSBsYSBjb2xlY2Npw7NuXG4gICAqIEBwYXJhbSBkb2NJZCAtIElEIGRlbCBkb2N1bWVudG9cbiAgICogQHBhcmFtIGRhdGEgLSBDYW1wb3MgYSBhY3R1YWxpemFyXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogYXdhaXQgZmlyZXN0b3JlU2VydmljZS51cGRhdGVEb2M8VXNlcj4oJ3VzZXJzJywgJ3VzZXIxMjMnLCB7XG4gICAqICAgbmFtZTogJ1VwZGF0ZWQgTmFtZScsXG4gICAqICAgbGFzdExvZ2luOiBuZXcgRGF0ZSgpXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHVwZGF0ZURvYzxUIGV4dGVuZHMgRmlyZXN0b3JlRG9jdW1lbnQ+KFxuICAgIGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsXG4gICAgZG9jSWQ6IHN0cmluZyxcbiAgICBkYXRhOiBQYXJ0aWFsPE9taXQ8VCwgJ2lkJyB8ICdjcmVhdGVkQXQnPj5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhDb2xsZWN0aW9uUGF0aChjb2xsZWN0aW9uUGF0aCk7XG4gICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgsIGRvY0lkKTtcblxuICAgIGF3YWl0IHVwZGF0ZURvYyhkb2NSZWYsIHtcbiAgICAgIC4uLmRhdGEsXG4gICAgICB1cGRhdGVkQXQ6IHNlcnZlclRpbWVzdGFtcCgpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVsaW1pbmEgdW4gZG9jdW1lbnRvLlxuICAgKlxuICAgKiBAcGFyYW0gY29sbGVjdGlvblBhdGggLSBSdXRhIGRlIGxhIGNvbGVjY2nDs25cbiAgICogQHBhcmFtIGRvY0lkIC0gSUQgZGVsIGRvY3VtZW50b1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UuZGVsZXRlRG9jKCd1c2VycycsICd1c2VyMTIzJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRG9jKGNvbGxlY3Rpb25QYXRoOiBzdHJpbmcsIGRvY0lkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoKTtcbiAgICBjb25zdCBkb2NSZWYgPSBkb2ModGhpcy5maXJlc3RvcmUsIHByZWZpeGVkUGF0aCwgZG9jSWQpO1xuICAgIGF3YWl0IGRlbGV0ZURvYyhkb2NSZWYpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE9QRVJBQ0lPTkVTIEVOIExPVEVcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEVqZWN1dGEgbcO6bHRpcGxlcyBvcGVyYWNpb25lcyBkZSBlc2NyaXR1cmEgZGUgZm9ybWEgYXTDs21pY2EuXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25zIC0gRnVuY2nDs24gcXVlIHJlY2liZSBlbCBiYXRjaCB5IGFncmVnYSBvcGVyYWNpb25lc1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UuYmF0Y2goKGJhdGNoKSA9PiB7XG4gICAqICAgYmF0Y2guc2V0KCd1c2Vycy91c2VyMScsIHsgbmFtZTogJ1VzZXIgMScgfSk7XG4gICAqICAgYmF0Y2gudXBkYXRlKCd1c2Vycy91c2VyMicsIHsgc3RhdHVzOiAnaW5hY3RpdmUnIH0pO1xuICAgKiAgIGJhdGNoLmRlbGV0ZSgndXNlcnMvdXNlcjMnKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgYmF0Y2goXG4gICAgb3BlcmF0aW9uczogKGJhdGNoOiB7XG4gICAgICBzZXQ6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgICB1cGRhdGU6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFBhcnRpYWw8VD4pID0+IHZvaWQ7XG4gICAgICBkZWxldGU6IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgfSkgPT4gdm9pZFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiYXRjaCA9IHdyaXRlQmF0Y2godGhpcy5maXJlc3RvcmUpO1xuXG4gICAgY29uc3QgYmF0Y2hBcGkgPSB7XG4gICAgICBzZXQ6IDxUPihwYXRoOiBzdHJpbmcsIGRhdGE6IFQpID0+IHtcbiAgICAgICAgY29uc3QgW2NvbGxlY3Rpb25QYXRoLCBkb2NJZF0gPSB0aGlzLnNwbGl0UGF0aChwYXRoKTtcbiAgICAgICAgY29uc3QgcHJlZml4ZWRQYXRoID0gdGhpcy5wcmVmaXhDb2xsZWN0aW9uUGF0aChjb2xsZWN0aW9uUGF0aCk7XG4gICAgICAgIGNvbnN0IGRvY1JlZiA9IGRvYyh0aGlzLmZpcmVzdG9yZSwgcHJlZml4ZWRQYXRoLCBkb2NJZCk7XG4gICAgICAgIGJhdGNoLnNldChkb2NSZWYsIHtcbiAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgIGNyZWF0ZWRBdDogc2VydmVyVGltZXN0YW1wKCksXG4gICAgICAgICAgdXBkYXRlZEF0OiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgfSBhcyBEb2N1bWVudERhdGEpO1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZTogPFQ+KHBhdGg6IHN0cmluZywgZGF0YTogUGFydGlhbDxUPikgPT4ge1xuICAgICAgICBjb25zdCBbY29sbGVjdGlvblBhdGgsIGRvY0lkXSA9IHRoaXMuc3BsaXRQYXRoKHBhdGgpO1xuICAgICAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoKTtcbiAgICAgICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgsIGRvY0lkKTtcbiAgICAgICAgYmF0Y2gudXBkYXRlKGRvY1JlZiwge1xuICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgdXBkYXRlZEF0OiBzZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgfSBhcyBEb2N1bWVudERhdGEpO1xuICAgICAgfSxcbiAgICAgIGRlbGV0ZTogKHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBbY29sbGVjdGlvblBhdGgsIGRvY0lkXSA9IHRoaXMuc3BsaXRQYXRoKHBhdGgpO1xuICAgICAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoKTtcbiAgICAgICAgY29uc3QgZG9jUmVmID0gZG9jKHRoaXMuZmlyZXN0b3JlLCBwcmVmaXhlZFBhdGgsIGRvY0lkKTtcbiAgICAgICAgYmF0Y2guZGVsZXRlKGRvY1JlZik7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBvcGVyYXRpb25zKGJhdGNoQXBpKTtcbiAgICBhd2FpdCBiYXRjaC5jb21taXQoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVVElMSURBREVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1eWUgdW5hIHJ1dGEgYSBwYXJ0aXIgZGUgdW4gdGVtcGxhdGUuXG4gICAqXG4gICAqIEBwYXJhbSB0ZW1wbGF0ZSAtIFRlbXBsYXRlIGNvbiBwbGFjZWhvbGRlcnMge3BhcmFtfVxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVmFsb3JlcyBwYXJhIGxvcyBwbGFjZWhvbGRlcnNcbiAgICogQHJldHVybnMgUnV0YSBjb25zdHJ1aWRhXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGF0aCA9IGZpcmVzdG9yZVNlcnZpY2UuYnVpbGRQYXRoKCd1c2Vycy97dXNlcklkfS9kb2N1bWVudHMve2RvY0lkfScsIHtcbiAgICogICB1c2VySWQ6ICd1c2VyMTIzJyxcbiAgICogICBkb2NJZDogJ2RvYzQ1NidcbiAgICogfSk7XG4gICAqIC8vID0+ICd1c2Vycy91c2VyMTIzL2RvY3VtZW50cy9kb2M0NTYnXG4gICAqIGBgYFxuICAgKi9cbiAgYnVpbGRQYXRoKHRlbXBsYXRlOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHN0cmluZyB7XG4gICAgcmV0dXJuIGJ1aWxkUGF0aCh0ZW1wbGF0ZSwgcGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmEgdW4gSUQgw7puaWNvIHBhcmEgdW4gZG9jdW1lbnRvIChzaW4gY3JlYXJsbykuXG4gICAqXG4gICAqIEBwYXJhbSBjb2xsZWN0aW9uUGF0aCAtIFJ1dGEgZGUgbGEgY29sZWNjacOzblxuICAgKiBAcmV0dXJucyBJRCDDum5pY28gZ2VuZXJhZG8gcG9yIEZpcmVzdG9yZVxuICAgKi9cbiAgZ2VuZXJhdGVJZChjb2xsZWN0aW9uUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcmVmaXhlZFBhdGggPSB0aGlzLnByZWZpeENvbGxlY3Rpb25QYXRoKGNvbGxlY3Rpb25QYXRoKTtcbiAgICBjb25zdCBjb2xsZWN0aW9uUmVmID0gY29sbGVjdGlvbih0aGlzLmZpcmVzdG9yZSwgcHJlZml4ZWRQYXRoKTtcbiAgICByZXR1cm4gZG9jKGNvbGxlY3Rpb25SZWYpLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdW4gdmFsb3IgZGUgdGltZXN0YW1wIGRlbCBzZXJ2aWRvci5cbiAgICogVXNhciBlbiBjYW1wb3MgZGUgZmVjaGEgcGFyYSBxdWUgRmlyZXN0b3JlIGFzaWduZSBlbCB0aW1lc3RhbXAuXG4gICAqL1xuICBzZXJ2ZXJUaW1lc3RhbXAoKTogRmllbGRWYWx1ZSB7XG4gICAgcmV0dXJuIHNlcnZlclRpbWVzdGFtcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldG9ybmEgdW4gdmFsb3IgcGFyYSBhZ3JlZ2FyIGVsZW1lbnRvcyBhIHVuIGFycmF5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UudXBkYXRlRG9jKCd1c2VycycsICd1c2VyMTIzJywge1xuICAgKiAgIHRhZ3M6IGZpcmVzdG9yZVNlcnZpY2UuYXJyYXlVbmlvbignbmV3LXRhZycpXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFycmF5VW5pb24oLi4uZWxlbWVudHM6IHVua25vd25bXSk6IEZpZWxkVmFsdWUge1xuICAgIHJldHVybiBhcnJheVVuaW9uKC4uLmVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvcm5hIHVuIHZhbG9yIHBhcmEgcmVtb3ZlciBlbGVtZW50b3MgZGUgdW4gYXJyYXkuXG4gICAqL1xuICBhcnJheVJlbW92ZSguLi5lbGVtZW50czogdW5rbm93bltdKTogRmllbGRWYWx1ZSB7XG4gICAgcmV0dXJuIGFycmF5UmVtb3ZlKC4uLmVsZW1lbnRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRvcm5hIHVuIHZhbG9yIHBhcmEgaW5jcmVtZW50YXIgdW4gY2FtcG8gbnVtw6lyaWNvLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGF3YWl0IGZpcmVzdG9yZVNlcnZpY2UudXBkYXRlRG9jKCd1c2VycycsICd1c2VyMTIzJywge1xuICAgKiAgIGxvZ2luQ291bnQ6IGZpcmVzdG9yZVNlcnZpY2UuaW5jcmVtZW50KDEpXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGluY3JlbWVudChuOiBudW1iZXIpOiBGaWVsZFZhbHVlIHtcbiAgICByZXR1cm4gaW5jcmVtZW50KG4pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE3DiVRPRE9TIFBSSVZBRE9TXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1eWUgbG9zIFF1ZXJ5Q29uc3RyYWludHMgYSBwYXJ0aXIgZGUgUXVlcnlPcHRpb25zXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUXVlcnlDb25zdHJhaW50cyhvcHRpb25zPzogUXVlcnlPcHRpb25zKTogUXVlcnlDb25zdHJhaW50W10ge1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBRdWVyeUNvbnN0cmFpbnRbXSA9IFtdO1xuXG4gICAgaWYgKCFvcHRpb25zKSByZXR1cm4gY29uc3RyYWludHM7XG5cbiAgICAvLyBXaGVyZSBjbGF1c2VzXG4gICAgaWYgKG9wdGlvbnMud2hlcmUpIHtcbiAgICAgIGZvciAoY29uc3QgY2xhdXNlIG9mIG9wdGlvbnMud2hlcmUpIHtcbiAgICAgICAgY29uc3RyYWludHMucHVzaCh3aGVyZShjbGF1c2UuZmllbGQsIGNsYXVzZS5vcGVyYXRvciwgY2xhdXNlLnZhbHVlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT3JkZXJCeSBjbGF1c2VzXG4gICAgaWYgKG9wdGlvbnMub3JkZXJCeSkge1xuICAgICAgZm9yIChjb25zdCBjbGF1c2Ugb2Ygb3B0aW9ucy5vcmRlckJ5KSB7XG4gICAgICAgIGNvbnN0cmFpbnRzLnB1c2gob3JkZXJCeShjbGF1c2UuZmllbGQsIGNsYXVzZS5kaXJlY3Rpb24pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDdXJzb3JzIHBhcmEgcGFnaW5hY2nDs25cbiAgICBpZiAob3B0aW9ucy5zdGFydEFmdGVyKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKHN0YXJ0QWZ0ZXIob3B0aW9ucy5zdGFydEFmdGVyKSk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnN0YXJ0QXQpIHtcbiAgICAgIGNvbnN0cmFpbnRzLnB1c2goc3RhcnRBdChvcHRpb25zLnN0YXJ0QXQpKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZW5kQmVmb3JlKSB7XG4gICAgICBjb25zdHJhaW50cy5wdXNoKGVuZEJlZm9yZShvcHRpb25zLmVuZEJlZm9yZSkpO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5lbmRBdCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChlbmRBdChvcHRpb25zLmVuZEF0KSk7XG4gICAgfVxuXG4gICAgLy8gTGltaXQgKHNlIGFncmVnYSBhbCBmaW5hbClcbiAgICBpZiAob3B0aW9ucy5saW1pdCkge1xuICAgICAgY29uc3RyYWludHMucHVzaChsaW1pdChvcHRpb25zLmxpbWl0KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnN0cmFpbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcGVhIHVuIERvY3VtZW50U25hcHNob3QgYSBudWVzdHJvIHRpcG9cbiAgICovXG4gIHByaXZhdGUgbWFwRG9jdW1lbnQ8VCBleHRlbmRzIEZpcmVzdG9yZURvY3VtZW50PihcbiAgICBzbmFwc2hvdDogRG9jdW1lbnRTbmFwc2hvdDxEb2N1bWVudERhdGE+XG4gICk6IFQge1xuICAgIGNvbnN0IGRhdGEgPSBzbmFwc2hvdC5kYXRhKCk7XG4gICAgaWYgKCFkYXRhKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvY3VtZW50byBubyB0aWVuZSBkYXRvcycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogc25hcHNob3QuaWQsXG4gICAgICAuLi50aGlzLmNvbnZlcnRUaW1lc3RhbXBzKGRhdGEpLFxuICAgIH0gYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252aWVydGUgVGltZXN0YW1wcyBkZSBGaXJlc3RvcmUgYSBEYXRlIGRlIEphdmFTY3JpcHRcbiAgICovXG4gIHByaXZhdGUgY29udmVydFRpbWVzdGFtcHMoZGF0YTogRG9jdW1lbnREYXRhKTogRG9jdW1lbnREYXRhIHtcbiAgICBjb25zdCByZXN1bHQ6IERvY3VtZW50RGF0YSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFRpbWVzdGFtcCkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHZhbHVlLnRvRGF0ZSgpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29udmVydFRpbWVzdGFtcHModmFsdWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERpdmlkZSB1bmEgcnV0YSBkZSBkb2N1bWVudG8gZW4gY29sZWNjacOzbiBlIElEXG4gICAqL1xuICBwcml2YXRlIHNwbGl0UGF0aChwYXRoOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgICBjb25zdCBzZWdtZW50cyA9IHBhdGguc3BsaXQoJy8nKTtcbiAgICBpZiAoc2VnbWVudHMubGVuZ3RoIDwgMiB8fCBzZWdtZW50cy5sZW5ndGggJSAyICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJ1dGEgZGUgZG9jdW1lbnRvIGludsOhbGlkYTogJHtwYXRofWApO1xuICAgIH1cbiAgICBjb25zdCBkb2NJZCA9IHNlZ21lbnRzLnBvcCgpITtcbiAgICBjb25zdCBjb2xsZWN0aW9uUGF0aCA9IHNlZ21lbnRzLmpvaW4oJy8nKTtcbiAgICByZXR1cm4gW2NvbGxlY3Rpb25QYXRoLCBkb2NJZF07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
export * from './types';
|
|
32
32
|
// Configuración
|
|
33
33
|
export { VALTECH_FIREBASE_CONFIG, hasEmulators, provideValtechFirebase } from './config';
|
|
34
|
-
// Configuración compartida
|
|
35
|
-
export {
|
|
34
|
+
// Configuración compartida (helpers genéricos)
|
|
35
|
+
export { collections, createFirebaseConfig, isEmulatorMode, storagePaths, } from './shared-config';
|
|
36
36
|
// Servicios
|
|
37
37
|
export { FirebaseService } from './firebase.service';
|
|
38
38
|
// Firestore
|
|
@@ -46,4 +46,4 @@ export { buildPath, extractPathParams, getCollectionPath, getDocumentId, isColle
|
|
|
46
46
|
export { StorageService } from './storage.service';
|
|
47
47
|
// Messaging (FCM)
|
|
48
48
|
export { MessagingService } from './messaging.service';
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL3NlcnZpY2VzL2ZpcmViYXNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBRUgsUUFBUTtBQUNSLGNBQWMsU0FBUyxDQUFDO0FBRXhCLGdCQUFnQjtBQUNoQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLHNCQUFzQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXpGLCtDQUErQztBQUMvQyxPQUFPLEVBQ0wsV0FBVyxFQUNYLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsWUFBWSxHQUdiLE1BQU0saUJBQWlCLENBQUM7QUFFekIsWUFBWTtBQUNaLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRCxZQUFZO0FBQ1osT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsMENBQTBDO0FBQzFDLE9BQU8sRUFHTCwwQkFBMEIsRUFFMUIsZUFBZSxHQUNoQixNQUFNLHdCQUF3QixDQUFDO0FBRWhDLGFBQWE7QUFDYixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFDTCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZCxXQUFXLEVBQ1gsUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsVUFBVTtBQUNWLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxrQkFBa0I7QUFDbEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpcmViYXNlIFNlcnZpY2VzXG4gKlxuICogU2VydmljaW9zIHJldXRpbGl6YWJsZXMgcGFyYSBpbnRlZ3JhY2nDs24gY29uIEZpcmViYXNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBFbiBtYWluLnRzXG4gKiBpbXBvcnQgeyBwcm92aWRlVmFsdGVjaEZpcmViYXNlIH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqXG4gKiBib290c3RyYXBBcHBsaWNhdGlvbihBcHBDb21wb25lbnQsIHtcbiAqICAgcHJvdmlkZXJzOiBbXG4gKiAgICAgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSh7XG4gKiAgICAgICBmaXJlYmFzZTogZW52aXJvbm1lbnQuZmlyZWJhc2UsXG4gKiAgICAgICBwZXJzaXN0ZW5jZTogdHJ1ZSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICpcbiAqIC8vIEVuIGNvbXBvbmVudGVzXG4gKiBpbXBvcnQgeyBGaXJlYmFzZVNlcnZpY2UsIEZpcmVzdG9yZVNlcnZpY2UgfSBmcm9tICd2YWx0ZWNoLWNvbXBvbmVudHMnO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBleHBvcnQgY2xhc3MgTXlDb21wb25lbnQge1xuICogICBwcml2YXRlIGZpcmViYXNlID0gaW5qZWN0KEZpcmViYXNlU2VydmljZSk7XG4gKiAgIHByaXZhdGUgZmlyZXN0b3JlID0gaW5qZWN0KEZpcmVzdG9yZVNlcnZpY2UpO1xuICogfVxuICogYGBgXG4gKi9cblxuLy8gVGlwb3NcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuXG4vLyBDb25maWd1cmFjacOzblxuZXhwb3J0IHsgVkFMVEVDSF9GSVJFQkFTRV9DT05GSUcsIGhhc0VtdWxhdG9ycywgcHJvdmlkZVZhbHRlY2hGaXJlYmFzZSB9IGZyb20gJy4vY29uZmlnJztcblxuLy8gQ29uZmlndXJhY2nDs24gY29tcGFydGlkYSAoaGVscGVycyBnZW7DqXJpY29zKVxuZXhwb3J0IHtcbiAgY29sbGVjdGlvbnMsXG4gIGNyZWF0ZUZpcmViYXNlQ29uZmlnLFxuICBpc0VtdWxhdG9yTW9kZSxcbiAgc3RvcmFnZVBhdGhzLFxuICB0eXBlIEFwcElkLFxuICB0eXBlIENyZWF0ZUZpcmViYXNlQ29uZmlnT3B0aW9ucyxcbn0gZnJvbSAnLi9zaGFyZWQtY29uZmlnJztcblxuLy8gU2VydmljaW9zXG5leHBvcnQgeyBGaXJlYmFzZVNlcnZpY2UgfSBmcm9tICcuL2ZpcmViYXNlLnNlcnZpY2UnO1xuXG4vLyBGaXJlc3RvcmVcbmV4cG9ydCB7IEZpcmVzdG9yZVNlcnZpY2UgfSBmcm9tICcuL2ZpcmVzdG9yZS5zZXJ2aWNlJztcblxuLy8gRmlyZXN0b3JlIENvbGxlY3Rpb25zIChGYWN0b3J5IFBhdHRlcm4pXG5leHBvcnQge1xuICBDb2xsZWN0aW9uT3B0aW9ucyxcbiAgRmlyZXN0b3JlQ29sbGVjdGlvbixcbiAgRmlyZXN0b3JlQ29sbGVjdGlvbkZhY3RvcnksXG4gIFN1YkNvbGxlY3Rpb25SZWYsXG4gIFR5cGVkQ29sbGVjdGlvbixcbn0gZnJvbSAnLi9maXJlc3RvcmUtY29sbGVjdGlvbic7XG5cbi8vIFV0aWxpZGFkZXNcbmV4cG9ydCB7IFF1ZXJ5QnVpbGRlciwgcXVlcnkgfSBmcm9tICcuL3V0aWxzL3F1ZXJ5LWJ1aWxkZXInO1xuZXhwb3J0IHtcbiAgYnVpbGRQYXRoLFxuICBleHRyYWN0UGF0aFBhcmFtcyxcbiAgZ2V0Q29sbGVjdGlvblBhdGgsXG4gIGdldERvY3VtZW50SWQsXG4gIGlzQ29sbGVjdGlvblBhdGgsXG4gIGlzRG9jdW1lbnRQYXRoLFxuICBpc1ZhbGlkUGF0aCxcbiAgam9pblBhdGgsXG59IGZyb20gJy4vdXRpbHMvcGF0aC1idWlsZGVyJztcblxuLy8gU3RvcmFnZVxuZXhwb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XG5cbi8vIE1lc3NhZ2luZyAoRkNNKVxuZXhwb3J0IHsgTWVzc2FnaW5nU2VydmljZSB9IGZyb20gJy4vbWVzc2FnaW5nLnNlcnZpY2UnO1xuIl19
|
|
@@ -1,38 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Firebase Shared Configuration
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Utilidades genéricas para configuración de Firebase.
|
|
5
|
+
* Las constantes específicas del proyecto (APP_IDS, FIREBASE_PROJECTS, EMULATOR_CONFIG)
|
|
6
|
+
* deben definirse en cada app consumidora.
|
|
6
7
|
*/
|
|
7
|
-
export const APP_IDS = {
|
|
8
|
-
DEMO: 'demo',
|
|
9
|
-
SHOWCASE: 'showcase',
|
|
10
|
-
ADMIN_PORTAL: 'admin-portal',
|
|
11
|
-
APP: 'app',
|
|
12
|
-
};
|
|
13
|
-
// ============================================================================
|
|
14
|
-
// FIREBASE PROJECT IDS
|
|
15
|
-
// ============================================================================
|
|
16
|
-
/**
|
|
17
|
-
* IDs de los proyectos Firebase por ambiente.
|
|
18
|
-
* Deben coincidir con los proyectos creados en Firebase Console.
|
|
19
|
-
*/
|
|
20
|
-
export const FIREBASE_PROJECTS = {
|
|
21
|
-
development: 'myvaltech-dev',
|
|
22
|
-
production: 'myvaltech-prod',
|
|
23
|
-
};
|
|
24
|
-
// ============================================================================
|
|
25
|
-
// EMULATOR CONFIGURATION (shared across all apps)
|
|
26
|
-
// ============================================================================
|
|
27
|
-
/**
|
|
28
|
-
* Configuración de emuladores compartida.
|
|
29
|
-
* Todos los puertos deben coincidir con frontend/firebase/firebase.json
|
|
30
|
-
*/
|
|
31
|
-
export const SHARED_EMULATOR_CONFIG = {
|
|
32
|
-
firestore: { host: 'localhost', port: 9080 },
|
|
33
|
-
storage: { host: 'localhost', port: 9199 },
|
|
34
|
-
auth: { host: 'localhost', port: 9099 },
|
|
35
|
-
};
|
|
36
8
|
// ============================================================================
|
|
37
9
|
// STORAGE PATH BUILDERS
|
|
38
10
|
// ============================================================================
|
|
@@ -58,8 +30,6 @@ export const storagePaths = {
|
|
|
58
30
|
/** Archivos públicos accesibles sin autenticación */
|
|
59
31
|
public: (...paths) => `public/${paths.join('/')}`,
|
|
60
32
|
},
|
|
61
|
-
/** Carpetas de desarrollo (acceso libre en emuladores) */
|
|
62
|
-
demo: (...paths) => `demo/${paths.join('/')}`,
|
|
63
33
|
};
|
|
64
34
|
// ============================================================================
|
|
65
35
|
// FIRESTORE COLLECTION BUILDERS
|
|
@@ -75,10 +45,6 @@ export const storagePaths = {
|
|
|
75
45
|
* collections.forApp('showcase', 'items')
|
|
76
46
|
* // => 'apps/showcase/items'
|
|
77
47
|
*
|
|
78
|
-
* // Colección de desarrollo
|
|
79
|
-
* collections.forApp('demo', 'items')
|
|
80
|
-
* // => 'apps/demo/items'
|
|
81
|
-
*
|
|
82
48
|
* // Colección compartida
|
|
83
49
|
* collections.shared.users
|
|
84
50
|
* // => 'users'
|
|
@@ -102,28 +68,36 @@ export const collections = {
|
|
|
102
68
|
*
|
|
103
69
|
* @example
|
|
104
70
|
* // environment.ts
|
|
71
|
+
* import { createFirebaseConfig } from 'valtech-components';
|
|
72
|
+
* import { FIREBASE_PROJECTS, EMULATOR_CONFIG, APP_IDS } from '../config/app-config';
|
|
73
|
+
*
|
|
105
74
|
* export const environment = {
|
|
106
75
|
* firebase: createFirebaseConfig(
|
|
107
76
|
* {
|
|
108
77
|
* apiKey: 'AIza...',
|
|
109
|
-
* authDomain:
|
|
110
|
-
* projectId:
|
|
111
|
-
* storageBucket:
|
|
78
|
+
* authDomain: `${FIREBASE_PROJECTS.development}.firebaseapp.com`,
|
|
79
|
+
* projectId: FIREBASE_PROJECTS.development,
|
|
80
|
+
* storageBucket: `${FIREBASE_PROJECTS.development}.appspot.com`,
|
|
112
81
|
* messagingSenderId: '123456789',
|
|
113
82
|
* appId: '1:123456789:web:abc123',
|
|
114
83
|
* },
|
|
115
|
-
* {
|
|
84
|
+
* {
|
|
85
|
+
* emulator: EMULATOR_CONFIG,
|
|
86
|
+
* persistence: true,
|
|
87
|
+
* appId: APP_IDS.DEMO
|
|
88
|
+
* }
|
|
116
89
|
* ),
|
|
117
90
|
* };
|
|
118
91
|
*/
|
|
119
92
|
export function createFirebaseConfig(envConfig, options = {}) {
|
|
120
|
-
const {
|
|
93
|
+
const { emulator, persistence = true, enableMessaging = false, messagingVapidKey, appId, } = options;
|
|
121
94
|
return {
|
|
122
95
|
firebase: envConfig,
|
|
123
96
|
persistence,
|
|
124
97
|
enableMessaging,
|
|
125
98
|
messagingVapidKey,
|
|
126
|
-
emulator
|
|
99
|
+
emulator,
|
|
100
|
+
appId,
|
|
127
101
|
};
|
|
128
102
|
}
|
|
129
103
|
// ============================================================================
|
|
@@ -135,4 +109,4 @@ export function createFirebaseConfig(envConfig, options = {}) {
|
|
|
135
109
|
export function isEmulatorMode(config) {
|
|
136
110
|
return config.emulator !== undefined;
|
|
137
111
|
}
|
|
138
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2Uvc2hhcmVkLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7R0FLRztBQWNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRztJQUNyQixJQUFJLEVBQUUsTUFBZTtJQUNyQixRQUFRLEVBQUUsVUFBbUI7SUFDN0IsWUFBWSxFQUFFLGNBQXVCO0lBQ3JDLEdBQUcsRUFBRSxLQUFjO0NBQ1gsQ0FBQztBQUVYLCtFQUErRTtBQUMvRSx1QkFBdUI7QUFDdkIsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHO0lBQy9CLFdBQVcsRUFBRSxlQUFlO0lBQzVCLFVBQVUsRUFBRSxnQkFBZ0I7Q0FDcEIsQ0FBQztBQUVYLCtFQUErRTtBQUMvRSxrREFBa0Q7QUFDbEQsK0VBQStFO0FBRS9FOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFtQjtJQUNwRCxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7SUFDNUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO0lBQzFDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtDQUN4QyxDQUFDO0FBRUYsK0VBQStFO0FBQy9FLHdCQUF3QjtBQUN4QiwrRUFBK0U7QUFFL0U7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsdURBQXVEO0lBQ3ZELE1BQU0sRUFBRSxDQUFDLEtBQVksRUFBRSxHQUFHLEtBQWUsRUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBRWpGLDJDQUEyQztJQUMzQyxNQUFNLEVBQUU7UUFDTixnQ0FBZ0M7UUFDaEMsWUFBWSxFQUFFLENBQUMsTUFBYyxFQUFFLFFBQWdCLEVBQVUsRUFBRSxDQUN6RCxrQkFBa0IsTUFBTSxJQUFJLFFBQVEsRUFBRTtRQUV4QyxxREFBcUQ7UUFDckQsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFlLEVBQVUsRUFBRSxDQUFDLFVBQVUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtLQUNwRTtJQUVELDBEQUEwRDtJQUMxRCxJQUFJLEVBQUUsQ0FBQyxHQUFHLEtBQWUsRUFBVSxFQUFFLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0NBQ2hFLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsZ0NBQWdDO0FBQ2hDLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLGdFQUFnRTtJQUNoRSxNQUFNLEVBQUUsQ0FBQyxLQUFZLEVBQUUsY0FBc0IsRUFBVSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksY0FBYyxFQUFFO0lBRTNGLDBEQUEwRDtJQUMxRCxNQUFNLEVBQUU7UUFDTiwyQkFBMkI7UUFDM0IsS0FBSyxFQUFFLE9BQU87UUFDZCx3QkFBd0I7UUFDeEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsaUNBQWlDO1FBQ2pDLGFBQWEsRUFBRSxlQUFlO0tBQy9CO0NBQ0YsQ0FBQztBQW9CRjs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsU0FBeUIsRUFDekIsVUFBdUMsRUFBRTtJQUV6QyxNQUFNLEVBQUUsWUFBWSxHQUFHLEtBQUssRUFBRSxXQUFXLEdBQUcsSUFBSSxFQUFFLGVBQWUsR0FBRyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsR0FDNUYsT0FBTyxDQUFDO0lBRVYsT0FBTztRQUNMLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFdBQVc7UUFDWCxlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQzVELENBQUM7QUFDSixDQUFDO0FBRUQsK0VBQStFO0FBQy9FLDZDQUE2QztBQUM3QywrRUFBK0U7QUFFL0U7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQTZCO0lBQzFELE9BQU8sTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmlyZWJhc2UgU2hhcmVkIENvbmZpZ3VyYXRpb25cbiAqXG4gKiBDb25maWd1cmFjacOzbiBiYXNlIGRlIEZpcmViYXNlIGNvbXBhcnRpZGEgZW50cmUgdG9kYXMgbGFzIGFwcHMgZGVsIG1vbm9yZXBvLlxuICogTG9zIHNlY3JldHMgKGFwaUtleSwgYXBwSWQpIHNlIGlueWVjdGFuIGVuIGJ1aWxkIHRpbWUgdmlhIGVudmlyb25tZW50LlxuICovXG5cbmltcG9ydCB7IEVtdWxhdG9yQ29uZmlnLCBGaXJlYmFzZUNvbmZpZywgVmFsdGVjaEZpcmViYXNlQ29uZmlnIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEFQUCBJRFMgLSBJZGVudGlmaWNhZG9yZXMgw7puaWNvcyBwb3IgYXBsaWNhY2nDs25cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBJZGVudGlmaWNhZG9yZXMgZGUgbGFzIGFwcHMgZGVsIG1vbm9yZXBvLlxuICogVXNhZG9zIHBhcmEgbmFtZXNwYWNpbmcgZGUgY29sZWNjaW9uZXMgRmlyZXN0b3JlIHkgcGF0aHMgZGUgU3RvcmFnZS5cbiAqL1xuZXhwb3J0IHR5cGUgQXBwSWQgPSAnZGVtbycgfCAnc2hvd2Nhc2UnIHwgJ2FkbWluLXBvcnRhbCcgfCAnYXBwJztcblxuZXhwb3J0IGNvbnN0IEFQUF9JRFMgPSB7XG4gIERFTU86ICdkZW1vJyBhcyBBcHBJZCxcbiAgU0hPV0NBU0U6ICdzaG93Y2FzZScgYXMgQXBwSWQsXG4gIEFETUlOX1BPUlRBTDogJ2FkbWluLXBvcnRhbCcgYXMgQXBwSWQsXG4gIEFQUDogJ2FwcCcgYXMgQXBwSWQsXG59IGFzIGNvbnN0O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGSVJFQkFTRSBQUk9KRUNUIElEU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIElEcyBkZSBsb3MgcHJveWVjdG9zIEZpcmViYXNlIHBvciBhbWJpZW50ZS5cbiAqIERlYmVuIGNvaW5jaWRpciBjb24gbG9zIHByb3llY3RvcyBjcmVhZG9zIGVuIEZpcmViYXNlIENvbnNvbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBGSVJFQkFTRV9QUk9KRUNUUyA9IHtcbiAgZGV2ZWxvcG1lbnQ6ICdteXZhbHRlY2gtZGV2JyxcbiAgcHJvZHVjdGlvbjogJ215dmFsdGVjaC1wcm9kJyxcbn0gYXMgY29uc3Q7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVNVUxBVE9SIENPTkZJR1VSQVRJT04gKHNoYXJlZCBhY3Jvc3MgYWxsIGFwcHMpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ29uZmlndXJhY2nDs24gZGUgZW11bGFkb3JlcyBjb21wYXJ0aWRhLlxuICogVG9kb3MgbG9zIHB1ZXJ0b3MgZGViZW4gY29pbmNpZGlyIGNvbiBmcm9udGVuZC9maXJlYmFzZS9maXJlYmFzZS5qc29uXG4gKi9cbmV4cG9ydCBjb25zdCBTSEFSRURfRU1VTEFUT1JfQ09ORklHOiBFbXVsYXRvckNvbmZpZyA9IHtcbiAgZmlyZXN0b3JlOiB7IGhvc3Q6ICdsb2NhbGhvc3QnLCBwb3J0OiA5MDgwIH0sXG4gIHN0b3JhZ2U6IHsgaG9zdDogJ2xvY2FsaG9zdCcsIHBvcnQ6IDkxOTkgfSxcbiAgYXV0aDogeyBob3N0OiAnbG9jYWxob3N0JywgcG9ydDogOTA5OSB9LFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU1RPUkFHRSBQQVRIIEJVSUxERVJTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogR2VuZXJhIHBhdGhzIGRlIFN0b3JhZ2UgY29uIG5hbWVzcGFjZSBwb3IgYXBwLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQYXRoIGVzcGVjw61maWNvIGRlIGxhIGFwcFxuICogc3RvcmFnZVBhdGhzLmZvckFwcCgnc2hvd2Nhc2UnLCAndXBsb2FkcycsICdpbWFnZS5qcGcnKVxuICogLy8gPT4gJ3Nob3djYXNlL3VwbG9hZHMvaW1hZ2UuanBnJ1xuICpcbiAqIC8vIFBhdGggY29tcGFydGlkb1xuICogc3RvcmFnZVBhdGhzLnNoYXJlZC5wcm9maWxlUGhvdG8oJ3VzZXIxMjMnLCAnYXZhdGFyLmpwZycpXG4gKiAvLyA9PiAncHJvZmlsZS1waG90b3MvdXNlcjEyMy9hdmF0YXIuanBnJ1xuICovXG5leHBvcnQgY29uc3Qgc3RvcmFnZVBhdGhzID0ge1xuICAvKiogQ2FycGV0YSBlc3BlY8OtZmljYSBkZSBsYSBhcHA6IHthcHBJZH0vey4uLnBhdGhzfSAqL1xuICBmb3JBcHA6IChhcHBJZDogQXBwSWQsIC4uLnBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiBbYXBwSWQsIC4uLnBhdGhzXS5qb2luKCcvJyksXG5cbiAgLyoqIENhcnBldGFzIGNvbXBhcnRpZGFzIChzaW4gbmFtZXNwYWNlKSAqL1xuICBzaGFyZWQ6IHtcbiAgICAvKiogRm90byBkZSBwZXJmaWwgZGUgdXN1YXJpbyAqL1xuICAgIHByb2ZpbGVQaG90bzogKHVzZXJJZDogc3RyaW5nLCBmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nID0+XG4gICAgICBgcHJvZmlsZS1waG90b3MvJHt1c2VySWR9LyR7ZmlsZU5hbWV9YCxcblxuICAgIC8qKiBBcmNoaXZvcyBww7pibGljb3MgYWNjZXNpYmxlcyBzaW4gYXV0ZW50aWNhY2nDs24gKi9cbiAgICBwdWJsaWM6ICguLi5wYXRoczogc3RyaW5nW10pOiBzdHJpbmcgPT4gYHB1YmxpYy8ke3BhdGhzLmpvaW4oJy8nKX1gLFxuICB9LFxuXG4gIC8qKiBDYXJwZXRhcyBkZSBkZXNhcnJvbGxvIChhY2Nlc28gbGlicmUgZW4gZW11bGFkb3JlcykgKi9cbiAgZGVtbzogKC4uLnBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiBgZGVtby8ke3BhdGhzLmpvaW4oJy8nKX1gLFxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRklSRVNUT1JFIENPTExFQ1RJT04gQlVJTERFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZW5lcmEgcGF0aHMgZGUgY29sZWNjaW9uZXMgY29uIG5hbWVzcGFjZSBwb3IgYXBwLlxuICpcbiAqIElNUE9SVEFOVEU6IExhIGVzdHJ1Y3R1cmEgZXMgL2FwcHMve2FwcElkfS97Y29sbGVjdGlvbn0ve2RvY0lkfVxuICogRmlyZXN0b3JlIHJlcXVpZXJlIG7Dum1lcm8gaW1wYXIgZGUgc2VnbWVudG9zIHBhcmEgcGF0aHMgZGUgY29sZWNjacOzbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ29sZWNjacOzbiBlc3BlY8OtZmljYSBkZSBsYSBhcHBcbiAqIGNvbGxlY3Rpb25zLmZvckFwcCgnc2hvd2Nhc2UnLCAnaXRlbXMnKVxuICogLy8gPT4gJ2FwcHMvc2hvd2Nhc2UvaXRlbXMnXG4gKlxuICogLy8gQ29sZWNjacOzbiBkZSBkZXNhcnJvbGxvXG4gKiBjb2xsZWN0aW9ucy5mb3JBcHAoJ2RlbW8nLCAnaXRlbXMnKVxuICogLy8gPT4gJ2FwcHMvZGVtby9pdGVtcydcbiAqXG4gKiAvLyBDb2xlY2Npw7NuIGNvbXBhcnRpZGFcbiAqIGNvbGxlY3Rpb25zLnNoYXJlZC51c2Vyc1xuICogLy8gPT4gJ3VzZXJzJ1xuICovXG5leHBvcnQgY29uc3QgY29sbGVjdGlvbnMgPSB7XG4gIC8qKiBDb2xlY2Npw7NuIGVzcGVjw61maWNhIGRlIGxhIGFwcDogYXBwcy97YXBwSWR9L3tjb2xsZWN0aW9ufSAqL1xuICBmb3JBcHA6IChhcHBJZDogQXBwSWQsIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gYGFwcHMvJHthcHBJZH0vJHtjb2xsZWN0aW9uTmFtZX1gLFxuXG4gIC8qKiBDb2xlY2Npb25lcyBjb21wYXJ0aWRhcyAoc2luIG5hbWVzcGFjZSwgbml2ZWwgcmHDrXopICovXG4gIHNoYXJlZDoge1xuICAgIC8qKiBVc3VhcmlvcyBkZWwgc2lzdGVtYSAqL1xuICAgIHVzZXJzOiAndXNlcnMnLFxuICAgIC8qKiBQZXJmaWxlcyBww7pibGljb3MgKi9cbiAgICBwcm9maWxlczogJ3Byb2ZpbGVzJyxcbiAgICAvKiogTm90aWZpY2FjaW9uZXMgZGUgdXN1YXJpb3MgKi9cbiAgICBub3RpZmljYXRpb25zOiAnbm90aWZpY2F0aW9ucycsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVI6IENyZWF0ZSBGaXJlYmFzZSBDb25maWcgZnJvbSBFbnZpcm9ubWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE9wY2lvbmVzIHBhcmEgY3JlYXIgbGEgY29uZmlndXJhY2nDs24gZGUgRmlyZWJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVGaXJlYmFzZUNvbmZpZ09wdGlvbnMge1xuICAvKiogVXNhciBlbXVsYWRvcmVzIGxvY2FsZXMgKHBhcmEgZGVzYXJyb2xsbykgKi9cbiAgdXNlRW11bGF0b3JzPzogYm9vbGVhbjtcbiAgLyoqIEhhYmlsaXRhciBwZXJzaXN0ZW5jaWEgb2ZmbGluZSBkZSBGaXJlc3RvcmUgKi9cbiAgcGVyc2lzdGVuY2U/OiBib29sZWFuO1xuICAvKiogSGFiaWxpdGFyIEZpcmViYXNlIENsb3VkIE1lc3NhZ2luZyAqL1xuICBlbmFibGVNZXNzYWdpbmc/OiBib29sZWFuO1xuICAvKiogVkFQSUQga2V5IHBhcmEgRkNNIChyZXF1ZXJpZG8gc2kgZW5hYmxlTWVzc2FnaW5nIGVzIHRydWUpICovXG4gIG1lc3NhZ2luZ1ZhcGlkS2V5Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWEgbGEgY29uZmlndXJhY2nDs24gY29tcGxldGEgZGUgRmlyZWJhc2UgZGVzZGUgdmFyaWFibGVzIGRlIGVudG9ybm8uXG4gKiBVc2EgZXN0byBlbiBlbCBlbnZpcm9ubWVudC50cyBkZSBjYWRhIGFwcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gZW52aXJvbm1lbnQudHNcbiAqIGV4cG9ydCBjb25zdCBlbnZpcm9ubWVudCA9IHtcbiAqICAgZmlyZWJhc2U6IGNyZWF0ZUZpcmViYXNlQ29uZmlnKFxuICogICAgIHtcbiAqICAgICAgIGFwaUtleTogJ0FJemEuLi4nLFxuICogICAgICAgYXV0aERvbWFpbjogJ215dmFsdGVjaC1kZXYuZmlyZWJhc2VhcHAuY29tJyxcbiAqICAgICAgIHByb2plY3RJZDogJ215dmFsdGVjaC1kZXYnLFxuICogICAgICAgc3RvcmFnZUJ1Y2tldDogJ215dmFsdGVjaC1kZXYuYXBwc3BvdC5jb20nLFxuICogICAgICAgbWVzc2FnaW5nU2VuZGVySWQ6ICcxMjM0NTY3ODknLFxuICogICAgICAgYXBwSWQ6ICcxOjEyMzQ1Njc4OTp3ZWI6YWJjMTIzJyxcbiAqICAgICB9LFxuICogICAgIHsgdXNlRW11bGF0b3JzOiB0cnVlLCBwZXJzaXN0ZW5jZTogdHJ1ZSB9XG4gKiAgICksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmlyZWJhc2VDb25maWcoXG4gIGVudkNvbmZpZzogRmlyZWJhc2VDb25maWcsXG4gIG9wdGlvbnM6IENyZWF0ZUZpcmViYXNlQ29uZmlnT3B0aW9ucyA9IHt9XG4pOiBWYWx0ZWNoRmlyZWJhc2VDb25maWcge1xuICBjb25zdCB7IHVzZUVtdWxhdG9ycyA9IGZhbHNlLCBwZXJzaXN0ZW5jZSA9IHRydWUsIGVuYWJsZU1lc3NhZ2luZyA9IGZhbHNlLCBtZXNzYWdpbmdWYXBpZEtleSB9ID1cbiAgICBvcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgZmlyZWJhc2U6IGVudkNvbmZpZyxcbiAgICBwZXJzaXN0ZW5jZSxcbiAgICBlbmFibGVNZXNzYWdpbmcsXG4gICAgbWVzc2FnaW5nVmFwaWRLZXksXG4gICAgZW11bGF0b3I6IHVzZUVtdWxhdG9ycyA/IFNIQVJFRF9FTVVMQVRPUl9DT05GSUcgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVUSUxJVFk6IENoZWNrIGlmIHJ1bm5pbmcgaW4gZW11bGF0b3IgbW9kZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFZlcmlmaWNhIHNpIGxhIGNvbmZpZ3VyYWNpw7NuIHRpZW5lIGVtdWxhZG9yZXMgaGFiaWxpdGFkb3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW11bGF0b3JNb2RlKGNvbmZpZzogVmFsdGVjaEZpcmViYXNlQ29uZmlnKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb25maWcuZW11bGF0b3IgIT09IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
112
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvc2VydmljZXMvZmlyZWJhc2Uvc2hhcmVkLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFPSCwrRUFBK0U7QUFDL0Usd0JBQXdCO0FBQ3hCLCtFQUErRTtBQUUvRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRztJQUMxQix1REFBdUQ7SUFDdkQsTUFBTSxFQUFFLENBQUMsS0FBWSxFQUFFLEdBQUcsS0FBZSxFQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7SUFFakYsMkNBQTJDO0lBQzNDLE1BQU0sRUFBRTtRQUNOLGdDQUFnQztRQUNoQyxZQUFZLEVBQUUsQ0FBQyxNQUFjLEVBQUUsUUFBZ0IsRUFBVSxFQUFFLENBQ3pELGtCQUFrQixNQUFNLElBQUksUUFBUSxFQUFFO1FBRXhDLHFEQUFxRDtRQUNyRCxNQUFNLEVBQUUsQ0FBQyxHQUFHLEtBQWUsRUFBVSxFQUFFLENBQUMsVUFBVSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO0tBQ3BFO0NBQ0YsQ0FBQztBQUVGLCtFQUErRTtBQUMvRSxnQ0FBZ0M7QUFDaEMsK0VBQStFO0FBRS9FOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHO0lBQ3pCLGdFQUFnRTtJQUNoRSxNQUFNLEVBQUUsQ0FBQyxLQUFZLEVBQUUsY0FBc0IsRUFBVSxFQUFFLENBQUMsUUFBUSxLQUFLLElBQUksY0FBYyxFQUFFO0lBRTNGLDBEQUEwRDtJQUMxRCxNQUFNLEVBQUU7UUFDTiwyQkFBMkI7UUFDM0IsS0FBSyxFQUFFLE9BQU87UUFDZCx3QkFBd0I7UUFDeEIsUUFBUSxFQUFFLFVBQVU7UUFDcEIsaUNBQWlDO1FBQ2pDLGFBQWEsRUFBRSxlQUFlO0tBQy9CO0NBQ0YsQ0FBQztBQTRCRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFNBQXlCLEVBQ3pCLFVBQXVDLEVBQUU7SUFFekMsTUFBTSxFQUNKLFFBQVEsRUFDUixXQUFXLEdBQUcsSUFBSSxFQUNsQixlQUFlLEdBQUcsS0FBSyxFQUN2QixpQkFBaUIsRUFDakIsS0FBSyxHQUNOLEdBQUcsT0FBTyxDQUFDO0lBRVosT0FBTztRQUNMLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFdBQVc7UUFDWCxlQUFlO1FBQ2YsaUJBQWlCO1FBQ2pCLFFBQVE7UUFDUixLQUFLO0tBQ04sQ0FBQztBQUNKLENBQUM7QUFFRCwrRUFBK0U7QUFDL0UsNkNBQTZDO0FBQzdDLCtFQUErRTtBQUUvRTs7R0FFRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBNkI7SUFDMUQsT0FBTyxNQUFNLENBQUMsUUFBUSxLQUFLLFNBQVMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBGaXJlYmFzZSBTaGFyZWQgQ29uZmlndXJhdGlvblxuICpcbiAqIFV0aWxpZGFkZXMgZ2Vuw6lyaWNhcyBwYXJhIGNvbmZpZ3VyYWNpw7NuIGRlIEZpcmViYXNlLlxuICogTGFzIGNvbnN0YW50ZXMgZXNwZWPDrWZpY2FzIGRlbCBwcm95ZWN0byAoQVBQX0lEUywgRklSRUJBU0VfUFJPSkVDVFMsIEVNVUxBVE9SX0NPTkZJRylcbiAqIGRlYmVuIGRlZmluaXJzZSBlbiBjYWRhIGFwcCBjb25zdW1pZG9yYS5cbiAqL1xuXG5pbXBvcnQgeyBBcHBJZCwgRW11bGF0b3JDb25maWcsIEZpcmViYXNlQ29uZmlnLCBWYWx0ZWNoRmlyZWJhc2VDb25maWcgfSBmcm9tICcuL3R5cGVzJztcblxuLy8gUmUtZXhwb3J0IHR5cGVzIGZvciBjb252ZW5pZW5jZVxuZXhwb3J0IHR5cGUgeyBBcHBJZCB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBTVE9SQUdFIFBBVEggQlVJTERFUlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBHZW5lcmEgcGF0aHMgZGUgU3RvcmFnZSBjb24gbmFtZXNwYWNlIHBvciBhcHAuXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFBhdGggZXNwZWPDrWZpY28gZGUgbGEgYXBwXG4gKiBzdG9yYWdlUGF0aHMuZm9yQXBwKCdzaG93Y2FzZScsICd1cGxvYWRzJywgJ2ltYWdlLmpwZycpXG4gKiAvLyA9PiAnc2hvd2Nhc2UvdXBsb2Fkcy9pbWFnZS5qcGcnXG4gKlxuICogLy8gUGF0aCBjb21wYXJ0aWRvXG4gKiBzdG9yYWdlUGF0aHMuc2hhcmVkLnByb2ZpbGVQaG90bygndXNlcjEyMycsICdhdmF0YXIuanBnJylcbiAqIC8vID0+ICdwcm9maWxlLXBob3Rvcy91c2VyMTIzL2F2YXRhci5qcGcnXG4gKi9cbmV4cG9ydCBjb25zdCBzdG9yYWdlUGF0aHMgPSB7XG4gIC8qKiBDYXJwZXRhIGVzcGVjw61maWNhIGRlIGxhIGFwcDoge2FwcElkfS97Li4ucGF0aHN9ICovXG4gIGZvckFwcDogKGFwcElkOiBBcHBJZCwgLi4ucGF0aHM6IHN0cmluZ1tdKTogc3RyaW5nID0+IFthcHBJZCwgLi4ucGF0aHNdLmpvaW4oJy8nKSxcblxuICAvKiogQ2FycGV0YXMgY29tcGFydGlkYXMgKHNpbiBuYW1lc3BhY2UpICovXG4gIHNoYXJlZDoge1xuICAgIC8qKiBGb3RvIGRlIHBlcmZpbCBkZSB1c3VhcmlvICovXG4gICAgcHJvZmlsZVBob3RvOiAodXNlcklkOiBzdHJpbmcsIGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgICAgIGBwcm9maWxlLXBob3Rvcy8ke3VzZXJJZH0vJHtmaWxlTmFtZX1gLFxuXG4gICAgLyoqIEFyY2hpdm9zIHDDumJsaWNvcyBhY2Nlc2libGVzIHNpbiBhdXRlbnRpY2FjacOzbiAqL1xuICAgIHB1YmxpYzogKC4uLnBhdGhzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiBgcHVibGljLyR7cGF0aHMuam9pbignLycpfWAsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBGSVJFU1RPUkUgQ09MTEVDVElPTiBCVUlMREVSU1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEdlbmVyYSBwYXRocyBkZSBjb2xlY2Npb25lcyBjb24gbmFtZXNwYWNlIHBvciBhcHAuXG4gKlxuICogSU1QT1JUQU5URTogTGEgZXN0cnVjdHVyYSBlcyAvYXBwcy97YXBwSWR9L3tjb2xsZWN0aW9ufS97ZG9jSWR9XG4gKiBGaXJlc3RvcmUgcmVxdWllcmUgbsO6bWVybyBpbXBhciBkZSBzZWdtZW50b3MgcGFyYSBwYXRocyBkZSBjb2xlY2Npw7NuLlxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb2xlY2Npw7NuIGVzcGVjw61maWNhIGRlIGxhIGFwcFxuICogY29sbGVjdGlvbnMuZm9yQXBwKCdzaG93Y2FzZScsICdpdGVtcycpXG4gKiAvLyA9PiAnYXBwcy9zaG93Y2FzZS9pdGVtcydcbiAqXG4gKiAvLyBDb2xlY2Npw7NuIGNvbXBhcnRpZGFcbiAqIGNvbGxlY3Rpb25zLnNoYXJlZC51c2Vyc1xuICogLy8gPT4gJ3VzZXJzJ1xuICovXG5leHBvcnQgY29uc3QgY29sbGVjdGlvbnMgPSB7XG4gIC8qKiBDb2xlY2Npw7NuIGVzcGVjw61maWNhIGRlIGxhIGFwcDogYXBwcy97YXBwSWR9L3tjb2xsZWN0aW9ufSAqL1xuICBmb3JBcHA6IChhcHBJZDogQXBwSWQsIGNvbGxlY3Rpb25OYW1lOiBzdHJpbmcpOiBzdHJpbmcgPT4gYGFwcHMvJHthcHBJZH0vJHtjb2xsZWN0aW9uTmFtZX1gLFxuXG4gIC8qKiBDb2xlY2Npb25lcyBjb21wYXJ0aWRhcyAoc2luIG5hbWVzcGFjZSwgbml2ZWwgcmHDrXopICovXG4gIHNoYXJlZDoge1xuICAgIC8qKiBVc3VhcmlvcyBkZWwgc2lzdGVtYSAqL1xuICAgIHVzZXJzOiAndXNlcnMnLFxuICAgIC8qKiBQZXJmaWxlcyBww7pibGljb3MgKi9cbiAgICBwcm9maWxlczogJ3Byb2ZpbGVzJyxcbiAgICAvKiogTm90aWZpY2FjaW9uZXMgZGUgdXN1YXJpb3MgKi9cbiAgICBub3RpZmljYXRpb25zOiAnbm90aWZpY2F0aW9ucycsXG4gIH0sXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBIRUxQRVI6IENyZWF0ZSBGaXJlYmFzZSBDb25maWcgZnJvbSBFbnZpcm9ubWVudFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIE9wY2lvbmVzIHBhcmEgY3JlYXIgbGEgY29uZmlndXJhY2nDs24gZGUgRmlyZWJhc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVGaXJlYmFzZUNvbmZpZ09wdGlvbnMge1xuICAvKipcbiAgICogQ29uZmlndXJhY2nDs24gZGUgZW11bGFkb3JlcyAocGFyYSBkZXNhcnJvbGxvIGxvY2FsKS5cbiAgICogUGFzYSB0dSBwcm9waWEgY29uZmlndXJhY2nDs24gY29uIGhvc3RzIHkgcHVlcnRvcy5cbiAgICovXG4gIGVtdWxhdG9yPzogRW11bGF0b3JDb25maWc7XG4gIC8qKiBIYWJpbGl0YXIgcGVyc2lzdGVuY2lhIG9mZmxpbmUgZGUgRmlyZXN0b3JlICovXG4gIHBlcnNpc3RlbmNlPzogYm9vbGVhbjtcbiAgLyoqIEhhYmlsaXRhciBGaXJlYmFzZSBDbG91ZCBNZXNzYWdpbmcgKi9cbiAgZW5hYmxlTWVzc2FnaW5nPzogYm9vbGVhbjtcbiAgLyoqIFZBUElEIGtleSBwYXJhIEZDTSAocmVxdWVyaWRvIHNpIGVuYWJsZU1lc3NhZ2luZyBlcyB0cnVlKSAqL1xuICBtZXNzYWdpbmdWYXBpZEtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIElEIGRlIGxhIGFwbGljYWNpw7NuIHBhcmEgbmFtZXNwYWNpbmcgYXV0b23DoXRpY28uXG4gICAqIEN1YW5kbyBzZSBjb25maWd1cmEsIEZpcmVzdG9yZVNlcnZpY2UgeSBTdG9yYWdlU2VydmljZSBwcmVmaWphbiBhdXRvbcOhdGljYW1lbnRlIGxvcyBwYXRocy5cbiAgICovXG4gIGFwcElkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWEgbGEgY29uZmlndXJhY2nDs24gY29tcGxldGEgZGUgRmlyZWJhc2UgZGVzZGUgdmFyaWFibGVzIGRlIGVudG9ybm8uXG4gKiBVc2EgZXN0byBlbiBlbCBlbnZpcm9ubWVudC50cyBkZSBjYWRhIGFwcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gZW52aXJvbm1lbnQudHNcbiAqIGltcG9ydCB7IGNyZWF0ZUZpcmViYXNlQ29uZmlnIH0gZnJvbSAndmFsdGVjaC1jb21wb25lbnRzJztcbiAqIGltcG9ydCB7IEZJUkVCQVNFX1BST0pFQ1RTLCBFTVVMQVRPUl9DT05GSUcsIEFQUF9JRFMgfSBmcm9tICcuLi9jb25maWcvYXBwLWNvbmZpZyc7XG4gKlxuICogZXhwb3J0IGNvbnN0IGVudmlyb25tZW50ID0ge1xuICogICBmaXJlYmFzZTogY3JlYXRlRmlyZWJhc2VDb25maWcoXG4gKiAgICAge1xuICogICAgICAgYXBpS2V5OiAnQUl6YS4uLicsXG4gKiAgICAgICBhdXRoRG9tYWluOiBgJHtGSVJFQkFTRV9QUk9KRUNUUy5kZXZlbG9wbWVudH0uZmlyZWJhc2VhcHAuY29tYCxcbiAqICAgICAgIHByb2plY3RJZDogRklSRUJBU0VfUFJPSkVDVFMuZGV2ZWxvcG1lbnQsXG4gKiAgICAgICBzdG9yYWdlQnVja2V0OiBgJHtGSVJFQkFTRV9QUk9KRUNUUy5kZXZlbG9wbWVudH0uYXBwc3BvdC5jb21gLFxuICogICAgICAgbWVzc2FnaW5nU2VuZGVySWQ6ICcxMjM0NTY3ODknLFxuICogICAgICAgYXBwSWQ6ICcxOjEyMzQ1Njc4OTp3ZWI6YWJjMTIzJyxcbiAqICAgICB9LFxuICogICAgIHtcbiAqICAgICAgIGVtdWxhdG9yOiBFTVVMQVRPUl9DT05GSUcsXG4gKiAgICAgICBwZXJzaXN0ZW5jZTogdHJ1ZSxcbiAqICAgICAgIGFwcElkOiBBUFBfSURTLkRFTU9cbiAqICAgICB9XG4gKiAgICksXG4gKiB9O1xuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmlyZWJhc2VDb25maWcoXG4gIGVudkNvbmZpZzogRmlyZWJhc2VDb25maWcsXG4gIG9wdGlvbnM6IENyZWF0ZUZpcmViYXNlQ29uZmlnT3B0aW9ucyA9IHt9XG4pOiBWYWx0ZWNoRmlyZWJhc2VDb25maWcge1xuICBjb25zdCB7XG4gICAgZW11bGF0b3IsXG4gICAgcGVyc2lzdGVuY2UgPSB0cnVlLFxuICAgIGVuYWJsZU1lc3NhZ2luZyA9IGZhbHNlLFxuICAgIG1lc3NhZ2luZ1ZhcGlkS2V5LFxuICAgIGFwcElkLFxuICB9ID0gb3B0aW9ucztcblxuICByZXR1cm4ge1xuICAgIGZpcmViYXNlOiBlbnZDb25maWcsXG4gICAgcGVyc2lzdGVuY2UsXG4gICAgZW5hYmxlTWVzc2FnaW5nLFxuICAgIG1lc3NhZ2luZ1ZhcGlkS2V5LFxuICAgIGVtdWxhdG9yLFxuICAgIGFwcElkLFxuICB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVVElMSVRZOiBDaGVjayBpZiBydW5uaW5nIGluIGVtdWxhdG9yIG1vZGVcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBWZXJpZmljYSBzaSBsYSBjb25maWd1cmFjacOzbiB0aWVuZSBlbXVsYWRvcmVzIGhhYmlsaXRhZG9zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VtdWxhdG9yTW9kZShjb25maWc6IFZhbHRlY2hGaXJlYmFzZUNvbmZpZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29uZmlnLmVtdWxhdG9yICE9PSB1bmRlZmluZWQ7XG59XG4iXX0=
|