@sochdb/sochdb 0.5.1 → 0.5.3

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.
@@ -10,6 +10,7 @@ exports.EmbeddedDatabase = void 0;
10
10
  const errors_1 = require("../errors");
11
11
  const bindings_1 = require("./ffi/bindings");
12
12
  const transaction_1 = require("./transaction");
13
+ const namespace_1 = require("../namespace");
13
14
  /**
14
15
  * Embedded Database using direct FFI
15
16
  *
@@ -47,6 +48,9 @@ class EmbeddedDatabase {
47
48
  * @returns EmbeddedDatabase instance
48
49
  */
49
50
  static open(path, config) {
51
+ if (path.includes('\x00')) {
52
+ throw new errors_1.DatabaseError('Database path must not contain null bytes');
53
+ }
50
54
  const bindings = bindings_1.NativeBindings.getInstance();
51
55
  let handle;
52
56
  if (config) {
@@ -118,6 +122,9 @@ class EmbeddedDatabase {
118
122
  * @returns EmbeddedDatabase instance in concurrent mode
119
123
  */
120
124
  static openConcurrent(path, options) {
125
+ if (path.includes('\x00')) {
126
+ throw new errors_1.DatabaseError('Database path must not contain null bytes');
127
+ }
121
128
  const bindings = bindings_1.NativeBindings.getInstance();
122
129
  const fallbackToStandard = options?.fallbackToStandard ?? false;
123
130
  if (!bindings.isConcurrentModeAvailable()) {
@@ -328,6 +335,277 @@ class EmbeddedDatabase {
328
335
  getBindings() {
329
336
  return this.bindings;
330
337
  }
338
+ // ========================================================================
339
+ // Namespace Operations
340
+ // ========================================================================
341
+ /**
342
+ * Create a new namespace
343
+ */
344
+ async createNamespace(name, config) {
345
+ this.ensureOpen();
346
+ const metaKey = `_namespace/${name}/metadata`;
347
+ const existing = await this.get(Buffer.from(metaKey));
348
+ if (existing) {
349
+ throw new namespace_1.NamespaceExistsError(name);
350
+ }
351
+ const nsConfig = {
352
+ name,
353
+ displayName: config?.displayName,
354
+ labels: config?.labels,
355
+ readOnly: config?.readOnly ?? false,
356
+ };
357
+ await this.put(Buffer.from(metaKey), Buffer.from(JSON.stringify(nsConfig)));
358
+ return new namespace_1.Namespace(this, name, nsConfig);
359
+ }
360
+ /**
361
+ * Get an existing namespace
362
+ */
363
+ async namespace(name) {
364
+ this.ensureOpen();
365
+ const metaKey = `_namespace/${name}/metadata`;
366
+ const data = await this.get(Buffer.from(metaKey));
367
+ if (!data) {
368
+ throw new namespace_1.NamespaceNotFoundError(name);
369
+ }
370
+ const nsConfig = JSON.parse(data.toString());
371
+ return new namespace_1.Namespace(this, name, nsConfig);
372
+ }
373
+ /**
374
+ * Get or create a namespace
375
+ */
376
+ async getOrCreateNamespace(name, config) {
377
+ try {
378
+ return await this.namespace(name);
379
+ }
380
+ catch (error) {
381
+ if (error instanceof namespace_1.NamespaceNotFoundError) {
382
+ return await this.createNamespace(name, config);
383
+ }
384
+ throw error;
385
+ }
386
+ }
387
+ /**
388
+ * Delete a namespace and all its data
389
+ */
390
+ async deleteNamespace(name) {
391
+ this.ensureOpen();
392
+ const prefix = Buffer.from(`_namespace/${name}/`);
393
+ const collPrefix = Buffer.from(`_collection/${name}/`);
394
+ const toDelete = [];
395
+ try {
396
+ for await (const [keyBuf] of this.scanPrefix(prefix)) {
397
+ toDelete.push(keyBuf);
398
+ }
399
+ for await (const [keyBuf] of this.scanPrefix(collPrefix)) {
400
+ toDelete.push(keyBuf);
401
+ }
402
+ }
403
+ catch { /* scan not available */ }
404
+ for (const key of toDelete) {
405
+ await this.delete(key);
406
+ }
407
+ return toDelete.length > 0;
408
+ }
409
+ /**
410
+ * List all namespace names
411
+ */
412
+ async listNamespaces() {
413
+ this.ensureOpen();
414
+ const prefix = Buffer.from('_namespace/');
415
+ const names = new Set();
416
+ try {
417
+ for await (const [keyBuf] of this.scanPrefix(prefix)) {
418
+ const key = keyBuf.toString();
419
+ const afterPrefix = key.substring('_namespace/'.length);
420
+ const nsName = afterPrefix.split('/')[0];
421
+ if (nsName)
422
+ names.add(nsName);
423
+ }
424
+ }
425
+ catch { /* scan not available */ }
426
+ return Array.from(names);
427
+ }
428
+ // ========================================================================
429
+ // Graph Overlay Operations (thin wrappers using KV)
430
+ // ========================================================================
431
+ /**
432
+ * Add a node to the graph overlay
433
+ */
434
+ async addNode(namespace, nodeId, nodeType, properties) {
435
+ this.ensureOpen();
436
+ const key = `_graph/${namespace}/nodes/${nodeId}`;
437
+ const value = JSON.stringify({ id: nodeId, node_type: nodeType, properties: properties || {} });
438
+ await this.put(Buffer.from(key), Buffer.from(value));
439
+ }
440
+ /**
441
+ * Add an edge between nodes
442
+ */
443
+ async addEdge(namespace, fromId, edgeType, toId, properties) {
444
+ this.ensureOpen();
445
+ const key = `_graph/${namespace}/edges/${fromId}/${edgeType}/${toId}`;
446
+ const value = JSON.stringify({ from_id: fromId, edge_type: edgeType, to_id: toId, properties: properties || {} });
447
+ await this.put(Buffer.from(key), Buffer.from(value));
448
+ }
449
+ /**
450
+ * Traverse the graph from a starting node
451
+ */
452
+ async traverse(namespace, startNode, maxDepth = 10, order = 'bfs') {
453
+ this.ensureOpen();
454
+ const visited = new Set();
455
+ const nodes = [];
456
+ const edges = [];
457
+ const frontier = [[startNode, 0]];
458
+ while (frontier.length > 0) {
459
+ const [currentNode, depth] = order === 'bfs' ? frontier.shift() : frontier.pop();
460
+ if (depth > maxDepth || visited.has(currentNode))
461
+ continue;
462
+ visited.add(currentNode);
463
+ const nodeData = await this.get(Buffer.from(`_graph/${namespace}/nodes/${currentNode}`));
464
+ if (nodeData)
465
+ nodes.push(JSON.parse(nodeData.toString()));
466
+ const edgePrefix = Buffer.from(`_graph/${namespace}/edges/${currentNode}/`);
467
+ try {
468
+ for await (const [, valueBuf] of this.scanPrefix(edgePrefix)) {
469
+ const edge = JSON.parse(valueBuf.toString());
470
+ edges.push(edge);
471
+ if (!visited.has(edge.to_id))
472
+ frontier.push([edge.to_id, depth + 1]);
473
+ }
474
+ }
475
+ catch { /* scan not available */ }
476
+ }
477
+ return { nodes, edges };
478
+ }
479
+ // ========================================================================
480
+ // Semantic Cache Operations (thin wrappers using KV)
481
+ // ========================================================================
482
+ /**
483
+ * Put a value in the semantic cache
484
+ */
485
+ async cachePut(cacheName, key, value, embedding, ttlSeconds = 0) {
486
+ this.ensureOpen();
487
+ const keyHash = Buffer.from(key).toString('hex').slice(0, 16);
488
+ const cacheKey = `_cache/${cacheName}/${keyHash}`;
489
+ const expiresAt = ttlSeconds > 0 ? Math.floor(Date.now() / 1000) + ttlSeconds : 0;
490
+ const cacheValue = JSON.stringify({ key, value, embedding, expires_at: expiresAt });
491
+ await this.put(Buffer.from(cacheKey), Buffer.from(cacheValue));
492
+ }
493
+ /**
494
+ * Get a value from the semantic cache by embedding similarity
495
+ */
496
+ async cacheGet(cacheName, queryEmbedding, threshold = 0.85) {
497
+ this.ensureOpen();
498
+ const prefix = Buffer.from(`_cache/${cacheName}/`);
499
+ const now = Math.floor(Date.now() / 1000);
500
+ let bestMatch = null;
501
+ try {
502
+ for await (const [, valueBuf] of this.scanPrefix(prefix)) {
503
+ const entry = JSON.parse(valueBuf.toString());
504
+ if (entry.expires_at > 0 && now > entry.expires_at)
505
+ continue;
506
+ if (entry.embedding && entry.embedding.length === queryEmbedding.length) {
507
+ const similarity = EmbeddedDatabase.cosineSimilarity(queryEmbedding, entry.embedding);
508
+ if (similarity >= threshold) {
509
+ if (!bestMatch || similarity > bestMatch.similarity) {
510
+ bestMatch = { similarity, value: entry.value };
511
+ }
512
+ }
513
+ }
514
+ }
515
+ }
516
+ catch { /* scan not available */ }
517
+ return bestMatch?.value ?? null;
518
+ }
519
+ /**
520
+ * Delete a cache entry
521
+ */
522
+ async cacheDelete(cacheName, key) {
523
+ this.ensureOpen();
524
+ const keyHash = Buffer.from(key).toString('hex').slice(0, 16);
525
+ await this.delete(Buffer.from(`_cache/${cacheName}/${keyHash}`));
526
+ }
527
+ /**
528
+ * Clear all entries in a semantic cache
529
+ */
530
+ async cacheClear(cacheName) {
531
+ this.ensureOpen();
532
+ const prefix = Buffer.from(`_cache/${cacheName}/`);
533
+ let deleted = 0;
534
+ try {
535
+ const toDelete = [];
536
+ for await (const [keyBuf] of this.scanPrefix(prefix)) {
537
+ toDelete.push(keyBuf);
538
+ }
539
+ for (const k of toDelete) {
540
+ await this.delete(k);
541
+ deleted++;
542
+ }
543
+ }
544
+ catch { /* scan not available */ }
545
+ return deleted;
546
+ }
547
+ // ========================================================================
548
+ // Static Format Utilities
549
+ // ========================================================================
550
+ /**
551
+ * Convert records to TOON format
552
+ */
553
+ static toToon(tableName, records, fields) {
554
+ if (!records || records.length === 0)
555
+ return `${tableName}[0]{}:`;
556
+ const useFields = fields ?? Object.keys(records[0]);
557
+ const header = `${tableName}[${records.length}]{${useFields.join(',')}}:`;
558
+ const escapeValue = (v) => {
559
+ const s = v != null ? String(v) : '';
560
+ if (s.includes(',') || s.includes(';') || s.includes('\n'))
561
+ return `"${s}"`;
562
+ return s;
563
+ };
564
+ const rows = records.map(r => useFields.map(f => escapeValue(r[f])).join(',')).join(';');
565
+ return header + rows;
566
+ }
567
+ /**
568
+ * Convert records to JSON format
569
+ */
570
+ static toJson(tableName, records, fields, compact = true) {
571
+ if (!records || records.length === 0) {
572
+ return JSON.stringify({ table: tableName, count: 0, records: [] });
573
+ }
574
+ const filteredRecords = fields
575
+ ? records.map(r => {
576
+ const filtered = {};
577
+ for (const f of fields)
578
+ filtered[f] = r[f];
579
+ return filtered;
580
+ })
581
+ : records;
582
+ const output = { table: tableName, count: filteredRecords.length, records: filteredRecords };
583
+ return compact ? JSON.stringify(output) : JSON.stringify(output, null, 2);
584
+ }
585
+ /**
586
+ * Parse JSON format
587
+ */
588
+ static fromJson(jsonStr) {
589
+ const data = JSON.parse(jsonStr);
590
+ const table = data.table ?? 'unknown';
591
+ const records = data.records ?? [];
592
+ const fields = records.length > 0 ? Object.keys(records[0]) : [];
593
+ return { table, fields, records };
594
+ }
595
+ // ========================================================================
596
+ // Private Helpers
597
+ // ========================================================================
598
+ static cosineSimilarity(a, b) {
599
+ let dot = 0, normA = 0, normB = 0;
600
+ for (let i = 0; i < a.length; i++) {
601
+ dot += a[i] * b[i];
602
+ normA += a[i] * a[i];
603
+ normB += b[i] * b[i];
604
+ }
605
+ normA = Math.sqrt(normA);
606
+ normB = Math.sqrt(normB);
607
+ return normA === 0 || normB === 0 ? 0 : dot / (normA * normB);
608
+ }
331
609
  }
332
610
  exports.EmbeddedDatabase = EmbeddedDatabase;
333
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQVdwRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFhLGdCQUFnQjtJQUNqQixNQUFNLENBQU07SUFDWixRQUFRLENBQWlCO0lBQ3pCLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixJQUFJLENBQVM7SUFDYixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLHVCQUF1QixHQUFHLEtBQUssQ0FBQztJQUV4QyxZQUFvQixJQUFZLEVBQUUsTUFBVyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsUUFBUSxHQUFHLEtBQUs7UUFDL0UsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixHQUFHLFFBQVEsQ0FBQztRQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFZLEVBQUUsTUFBK0I7UUFDckQsTUFBTSxRQUFRLEdBQUcseUJBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM5QyxJQUFJLE1BQU0sQ0FBQztRQUVYLElBQUksTUFBTSxFQUFFLENBQUM7WUFDVCxNQUFNLE9BQU8sR0FBRztnQkFDWixXQUFXLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxLQUFLO2dCQUN2QyxlQUFlLEVBQUUsTUFBTSxDQUFDLFVBQVUsS0FBSyxTQUFTO2dCQUNoRCxTQUFTLEVBQUUsTUFBTSxDQUFDLFFB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QUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE1BQU0sSUFBSSxzQkFBYSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDbEQsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXO1FBQ1AsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7Q0FDSjtBQXZWRCw0Q0F1VkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVtYmVkZGVkIERhdGFiYXNlIC0gRkZJIE1vZGVcbiAqIFxuICogRGlyZWN0IEZGSSBhY2Nlc3MgdG8gU29jaERCIG5hdGl2ZSBsaWJyYXJ5LlxuICogTm8gc2VydmVyIHJlcXVpcmVkIC0gc2ltaWxhciB0byBQeXRob24gU0RLJ3MgRGF0YWJhc2UgY2xhc3MuXG4gKi9cblxuaW1wb3J0IHsgRGF0YWJhc2VFcnJvciB9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBOYXRpdmVCaW5kaW5ncyB9IGZyb20gJy4vZmZpL2JpbmRpbmdzJztcbmltcG9ydCB7IEVtYmVkZGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuL3RyYW5zYWN0aW9uJztcbmltcG9ydCAqIGFzIGtvZmZpIGZyb20gJ2tvZmZpJztcblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIHtcbiAgICB3YWxFbmFibGVkPzogYm9vbGVhbjtcbiAgICBzeW5jTW9kZT86ICdmdWxsJyB8ICdub3JtYWwnIHwgJ29mZic7XG4gICAgbWVtdGFibGVTaXplQnl0ZXM/OiBudW1iZXI7XG4gICAgZ3JvdXBDb21taXQ/OiBib29sZWFuO1xuICAgIGluZGV4UG9saWN5PzogJ3dyaXRlX29wdGltaXplZCcgfCAnYmFsYW5jZWQnIHwgJ3NjYW5fb3B0aW1pemVkJyB8ICdhcHBlbmRfb25seSc7XG59XG5cbi8qKlxuICogRW1iZWRkZWQgRGF0YWJhc2UgdXNpbmcgZGlyZWN0IEZGSVxuICogXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogY29uc3QgZGIgPSBhd2FpdCBFbWJlZGRlZERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogY29uc3QgdmFsdWUgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oJ2tleScpKTtcbiAqIGF3YWl0IGRiLmNsb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgIHByaXZhdGUgaGFuZGxlOiBhbnk7XG4gICAgcHJpdmF0ZSBiaW5kaW5nczogTmF0aXZlQmluZGluZ3M7XG4gICAgcHJpdmF0ZSBjbG9zZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIHBhdGg6IHN0cmluZztcbiAgICBwcml2YXRlIGNvbmN1cnJlbnQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jb25jdXJyZW50TW9kZUZhbGxiYWNrID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgaGFuZGxlOiBhbnksIGNvbmN1cnJlbnQgPSBmYWxzZSwgZmFsbGJhY2sgPSBmYWxzZSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmhhbmRsZSA9IGhhbmRsZTtcbiAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDtcbiAgICAgICAgdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjayA9IGZhbGxiYWNrO1xuICAgICAgICB0aGlzLmJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIGEgZGF0YWJhc2UgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGluIHN0YW5kYXJkIG1vZGVcbiAgICAgKiBcbiAgICAgKiBGb3Igd2ViIGFwcGxpY2F0aW9ucyB3aXRoIG11bHRpcGxlIHByb2Nlc3NlcywgdXNlIGBvcGVuQ29uY3VycmVudCgpYCBpbnN0ZWFkLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBwYXRoIC0gUGF0aCB0byBkYXRhYmFzZSBkaXJlY3RvcnlcbiAgICAgKiBAcGFyYW0gY29uZmlnIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgICAqIEByZXR1cm5zIEVtYmVkZGVkRGF0YWJhc2UgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgZm9yIG11bHRpLXByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uc1xuICAgICAqIFxuICAgICAqIFRoaXMgbW9kZSBhbGxvd3MgbXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgKGUuZy4sIFBNMiBjbHVzdGVyIHdvcmtlcnMsXG4gICAgICogbXVsdGlwbGUgRXhwcmVzcyBpbnN0YW5jZXMpIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2Ugc2ltdWx0YW5lb3VzbHkuXG4gICAgICogXG4gICAgICogRmVhdHVyZXM6XG4gICAgICogLSBMb2NrLWZyZWUgcmVhZHMgd2l0aCB+MTAwbnMgbGF0ZW5jeVxuICAgICAqIC0gTXVsdGktcmVhZGVyLCBzaW5nbGUtd3JpdGVyIGNvb3JkaW5hdGlvblxuICAgICAqIC0gQXV0b21hdGljIHdyaXRlIHNlcmlhbGl6YXRpb25cbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICAgICAqIGltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuICAgICAqIFxuICAgICAqIC8vIE9wZW4gaW4gY29uY3VycmVudCBtb2RlIC0gbXVsdGlwbGUgd29ya2VycyBjYW4gYWNjZXNzXG4gICAgICogY29uc3QgZGIgPSBFbWJlZGRlZERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL3dlYl9kYicpO1xuICAgICAqIFxuICAgICAqIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgICAgKiBcbiAgICAgKiBhcHAuZ2V0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgY2FuIHJlYWQgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApKTtcbiAgICAgKiAgIGlmICghZGF0YSkge1xuICAgICAqICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnbm90IGZvdW5kJyB9KTtcbiAgICAgKiAgICAgcmV0dXJuO1xuICAgICAqICAgfVxuICAgICAqICAgcmVzLnNlbmQoZGF0YSk7XG4gICAgICogfSk7XG4gICAgICogXG4gICAgICogYXBwLnBvc3QoJy91c2VyLzppZCcsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAqICAgLy8gV3JpdGVzIGFyZSBzZXJpYWxpemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbShgdXNlcjoke3JlcS5wYXJhbXMuaWR9YCksIHJlcS5ib2R5KTtcbiAgICAgKiAgIHJlcy5qc29uKHsgc3RhdHVzOiAnb2snIH0pO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIC8vIFN0YXJ0IHdpdGggUE0yIGNsdXN0ZXIgbW9kZTpcbiAgICAgKiAvLyBwbTIgc3RhcnQgYXBwLmpzIC1pIG1heFxuICAgICAqIGFwcC5saXN0ZW4oMzAwMCk7XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgY29uY3VycmVudCBtb2RlXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZSBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbkNvbmN1cnJlbnQocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBmYWxsYmFja1RvU3RhbmRhcmQ/OiBib29sZWFuIH0pOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBjb25zdCBmYWxsYmFja1RvU3RhbmRhcmQgPSBvcHRpb25zPy5mYWxsYmFja1RvU3RhbmRhcmQgPz8gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWJpbmRpbmdzLmlzQ29uY3VycmVudE1vZGVBdmFpbGFibGUoKSkge1xuICAgICAgICAgICAgaWYgKGZhbGxiYWNrVG9TdGFuZGFyZCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAgICAgJ1tTb2NoREJdIENvbmN1cnJlbnQgbW9kZSBub3QgYXZhaWxhYmxlIGluIG5hdGl2ZSBsaWJyYXJ5IChyZXF1aXJlcyB2MC40LjgrKS4gJyArXG4gICAgICAgICAgICAgICAgICAgICdGYWxsaW5nIGJhY2sgdG8gc3RhbmRhcmQgbW9kZS4gRm9yIHByb2R1Y3Rpb24gbXVsdGktcHJvY2VzcyBkZXBsb3ltZW50cywgJyArXG4gICAgICAgICAgICAgICAgICAgICdwbGVhc2UgdXBncmFkZSB0aGUgU29jaERCIG5hdGl2ZSBsaWJyYXJ5LidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuKHBhdGgpO1xuICAgICAgICAgICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKGBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZSBhdCAke3BhdGh9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKFxuICAgICAgICAgICAgICAgICdDb25jdXJyZW50IG1vZGUgbm90IHN1cHBvcnRlZC4gUGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeSB0byB2MC40LjgrICcgK1xuICAgICAgICAgICAgICAgICdvciB1c2Ugb3BlbkNvbmN1cnJlbnQocGF0aCwgeyBmYWxsYmFja1RvU3RhbmRhcmQ6IHRydWUgfSkgdG8gZmFsbCBiYWNrIHRvIHN0YW5kYXJkIG1vZGUuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZSA9IGJpbmRpbmdzLnNvY2hkYl9vcGVuX2NvbmN1cnJlbnQocGF0aCk7XG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgaW4gY29uY3VycmVudCBtb2RlIGF0ICR7cGF0aH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzQ29uY3VycmVudCA9IGJpbmRpbmdzLnNvY2hkYl9pc19jb25jdXJyZW50Py4oaGFuZGxlKSA9PT0gMTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgaXNDb25jdXJyZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgZGF0YWJhc2UgaXMgb3BlbmVkIGluIGNvbmN1cnJlbnQgbW9kZVxuICAgICAqL1xuICAgIGdldCBpc0NvbmN1cnJlbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbmN1cnJlbnQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uY3VycmVudCBtb2RlIGZlbGwgYmFjayB0byBzdGFuZGFyZCBtb2RlXG4gICAgICovXG4gICAgZ2V0IGlzQ29uY3VycmVudEZhbGxiYWNrKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fY29uY3VycmVudE1vZGVGYWxsYmFjaztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBjb25jdXJyZW50IG1vZGUgaXMgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgbGlicmFyeVxuICAgICAqL1xuICAgIHN0YXRpYyBpc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKS5pc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IGEga2V5LXZhbHVlIHBhaXIgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0KGtleTogQnVmZmVyLCB2YWx1ZTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5wdXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdmFsdWUgYnkga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldChrZXk6IEJ1ZmZlcik6IFByb21pc2U8QnVmZmVyIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHR4bi5nZXQoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBrZXkgKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZGVsZXRlKGtleTogQnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5kZWxldGUoa2V5KTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQdXQgdmFsdWUgYXQgcGF0aCAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBwdXRQYXRoKHBhdGg6IHN0cmluZywgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0UGF0aChwYXRoLCB2YWx1ZSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgZ2V0UGF0aChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0UGF0aChwYXRoKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTY2FuIGtleXMgd2l0aCBwcmVmaXhcbiAgICAgKi9cbiAgICBhc3luYyAqc2NhblByZWZpeChwcmVmaXg6IEJ1ZmZlcik6IEFzeW5jR2VuZXJhdG9yPFtCdWZmZXIsIEJ1ZmZlcl0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiB0eG4uc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgZW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQmVnaW4gYSB0cmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uKCk6IEVtYmVkZGVkVHJhbnNhY3Rpb24ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG5IYW5kbGUgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9iZWdpbl90eG4odGhpcy5oYW5kbGUpO1xuICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkVHJhbnNhY3Rpb24odGhpcywgdGhpcy5oYW5kbGUsIHR4bkhhbmRsZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhlY3V0ZSBvcGVyYXRpb25zIHdpdGhpbiBhIHRyYW5zYWN0aW9uICh3aXRoIGF1dG8tY29tbWl0L2Fib3J0KVxuICAgICAqL1xuICAgIGFzeW5jIHdpdGhUcmFuc2FjdGlvbjxUPihmbjogKHR4bjogRW1iZWRkZWRUcmFuc2FjdGlvbikgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbih0eG4pO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5hYm9ydCgpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZSBhIGNoZWNrcG9pbnRcbiAgICAgKi9cbiAgICBhc3luYyBjaGVja3BvaW50KCk6IFByb21pc2U8YmlnaW50PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBsc24gPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jaGVja3BvaW50KHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIEJpZ0ludChsc24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBzdG9yYWdlIHN0YXRpc3RpY3NcbiAgICAgKi9cbiAgICBhc3luYyBzdGF0cygpOiBQcm9taXNlPHtcbiAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IGJpZ2ludDtcbiAgICAgICAgd2FsU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogYmlnaW50O1xuICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogYmlnaW50O1xuICAgIH0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgLy8gUmV0dXJucyBzdHJ1Y3QgYnkgdmFsdWUgKGF1dG9tYXRpY2FsbHkgZGVjb2RlZClcbiAgICAgICAgY29uc3Qgc3RhdHMgPSB0aGlzLmJpbmRpbmdzLnNvY2hkYl9zdGF0cyh0aGlzLmhhbmRsZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbWVtdGFibGVTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy5tZW10YWJsZV9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIHdhbFNpemVCeXRlczogQmlnSW50KHN0YXRzLndhbF9zaXplX2J5dGVzKSxcbiAgICAgICAgICAgIGFjdGl2ZVRyYW5zYWN0aW9uczogc3RhdHMuYWN0aXZlX3RyYW5zYWN0aW9ucyxcbiAgICAgICAgICAgIG1pbkFjdGl2ZVNuYXBzaG90OiBCaWdJbnQoc3RhdHMubWluX2FjdGl2ZV9zbmFwc2hvdCksXG4gICAgICAgICAgICBsYXN0Q2hlY2twb2ludExzbjogQmlnSW50KHN0YXRzLmxhc3RfY2hlY2twb2ludF9sc24pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2UgdGhlIGRhdGFiYXNlXG4gICAgICovXG4gICAgY2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYmluZGluZ3Muc29jaGRiX2Nsb3NlKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZW5zdXJlT3BlbigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcignRGF0YWJhc2UgaXMgY2xvc2VkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW50ZXJuYWwgaGFuZGxlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEhhbmRsZSgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGJpbmRpbmdzIGluc3RhbmNlIChmb3IgdHJhbnNhY3Rpb25zKVxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIGdldEJpbmRpbmdzKCk6IE5hdGl2ZUJpbmRpbmdzIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluZGluZ3M7XG4gICAgfVxufVxuIl19
611
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZW1iZWRkZWQvZGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHOzs7QUFFSCxzQ0FBMEM7QUFDMUMsNkNBQWdEO0FBQ2hELCtDQUFvRDtBQUNwRCw0Q0FBd0c7QUFXeEc7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxnQkFBZ0I7SUFDakIsTUFBTSxDQUFNO0lBQ1osUUFBUSxDQUFpQjtJQUN6QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsSUFBSSxDQUFTO0lBQ2IsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUNuQix1QkFBdUIsR0FBRyxLQUFLLENBQUM7SUFFeEMsWUFBb0IsSUFBWSxFQUFFLE1BQVcsRUFBRSxVQUFVLEdBQUcsS0FBSyxFQUFFLFFBQVEsR0FBRyxLQUFLO1FBQy9FLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxRQUFRLENBQUM7UUFDeEMsSUFBSSxDQUFDLFFBQVEsR0FBRyx5QkFBYyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBWSxFQUFFLE1BQStCO1FBQ3JELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sSUFBSSxzQkFBYSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLHlCQUFjLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDOUMsSUFBSSxNQUFNLENBQUM7UUFFWCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxPQUFP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ZSAtIEZGSSBNb2RlXG4gKiBcbiAqIERpcmVjdCBGRkkgYWNjZXNzIHRvIFNvY2hEQiBuYXRpdmUgbGlicmFyeS5cbiAqIE5vIHNlcnZlciByZXF1aXJlZCAtIHNpbWlsYXIgdG8gUHl0aG9uIFNESydzIERhdGFiYXNlIGNsYXNzLlxuICovXG5cbmltcG9ydCB7IERhdGFiYXNlRXJyb3IgfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHsgTmF0aXZlQmluZGluZ3MgfSBmcm9tICcuL2ZmaS9iaW5kaW5ncyc7XG5pbXBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBOYW1lc3BhY2UsIE5hbWVzcGFjZUNvbmZpZywgTmFtZXNwYWNlTm90Rm91bmRFcnJvciwgTmFtZXNwYWNlRXhpc3RzRXJyb3IgfSBmcm9tICcuLi9uYW1lc3BhY2UnO1xuaW1wb3J0ICogYXMga29mZmkgZnJvbSAna29mZmknO1xuXG5leHBvcnQgaW50ZXJmYWNlIEVtYmVkZGVkRGF0YWJhc2VDb25maWcge1xuICAgIHdhbEVuYWJsZWQ/OiBib29sZWFuO1xuICAgIHN5bmNNb2RlPzogJ2Z1bGwnIHwgJ25vcm1hbCcgfCAnb2ZmJztcbiAgICBtZW10YWJsZVNpemVCeXRlcz86IG51bWJlcjtcbiAgICBncm91cENvbW1pdD86IGJvb2xlYW47XG4gICAgaW5kZXhQb2xpY3k/OiAnd3JpdGVfb3B0aW1pemVkJyB8ICdiYWxhbmNlZCcgfCAnc2Nhbl9vcHRpbWl6ZWQnIHwgJ2FwcGVuZF9vbmx5Jztcbn1cblxuLyoqXG4gKiBFbWJlZGRlZCBEYXRhYmFzZSB1c2luZyBkaXJlY3QgRkZJXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiBjb25zdCBkYiA9IGF3YWl0IEVtYmVkZGVkRGF0YWJhc2Uub3BlbignLi9teWRiJyk7XG4gKiBhd2FpdCBkYi5wdXQoQnVmZmVyLmZyb20oJ2tleScpLCBCdWZmZXIuZnJvbSgndmFsdWUnKSk7XG4gKiBjb25zdCB2YWx1ZSA9IGF3YWl0IGRiLmdldChCdWZmZXIuZnJvbSgna2V5JykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkZWREYXRhYmFzZSB7XG4gICAgcHJpdmF0ZSBoYW5kbGU6IGFueTtcbiAgICBwcml2YXRlIGJpbmRpbmdzOiBOYXRpdmVCaW5kaW5ncztcbiAgICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgcGF0aDogc3RyaW5nO1xuICAgIHByaXZhdGUgY29uY3VycmVudCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2NvbmN1cnJlbnRNb2RlRmFsbGJhY2sgPSBmYWxzZTtcblxuICAgIHByaXZhdGUgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBoYW5kbGU6IGFueSwgY29uY3VycmVudCA9IGZhbHNlLCBmYWxsYmFjayA9IGZhbHNlKSB7XG4gICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIHRoaXMuaGFuZGxlID0gaGFuZGxlO1xuICAgICAgICB0aGlzLmNvbmN1cnJlbnQgPSBjb25jdXJyZW50O1xuICAgICAgICB0aGlzLl9jb25jdXJyZW50TW9kZUZhbGxiYWNrID0gZmFsbGJhY2s7XG4gICAgICAgIHRoaXMuYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGggaW4gc3RhbmRhcmQgbW9kZVxuICAgICAqIFxuICAgICAqIEZvciB3ZWIgYXBwbGljYXRpb25zIHdpdGggbXVsdGlwbGUgcHJvY2Vzc2VzLCB1c2UgYG9wZW5Db25jdXJyZW50KClgIGluc3RlYWQuXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBjb25maWcgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZVxuICAgICAqL1xuICAgIHN0YXRpYyBvcGVuKHBhdGg6IHN0cmluZywgY29uZmlnPzogRW1iZWRkZWREYXRhYmFzZUNvbmZpZyk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICAgICAgICBpZiAocGF0aC5pbmNsdWRlcygnXFx4MDAnKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIHBhdGggbXVzdCBub3QgY29udGFpbiBudWxsIGJ5dGVzJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmluZGluZ3MgPSBOYXRpdmVCaW5kaW5ncy5nZXRJbnN0YW5jZSgpO1xuICAgICAgICBsZXQgaGFuZGxlO1xuXG4gICAgICAgIGlmIChjb25maWcpIHtcbiAgICAgICAgICAgIGNvbnN0IGNDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgd2FsX2VuYWJsZWQ6IGNvbmZpZy53YWxFbmFibGVkID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIHdhbF9lbmFibGVkX3NldDogY29uZmlnLndhbEVuYWJsZWQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBzeW5jX21vZGU6IGNvbmZpZy5zeW5jTW9kZSA9PT0gJ2Z1bGwnID8gMiA6IChjb25maWcuc3luY01vZGUgPT09ICdub3JtYWwnID8gMSA6IDApLFxuICAgICAgICAgICAgICAgIHN5bmNfbW9kZV9zZXQ6IGNvbmZpZy5zeW5jTW9kZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIG1lbXRhYmxlX3NpemVfYnl0ZXM6IEJpZ0ludChjb25maWcubWVtdGFibGVTaXplQnl0ZXMgPz8gMCksXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0OiBjb25maWcuZ3JvdXBDb21taXQgPz8gZmFsc2UsXG4gICAgICAgICAgICAgICAgZ3JvdXBfY29tbWl0X3NldDogY29uZmlnLmdyb3VwQ29tbWl0ICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgZGVmYXVsdF9pbmRleF9wb2xpY3k6IDEsIC8vIERlZmF1bHQgdG8gQmFsYW5jZWRcbiAgICAgICAgICAgICAgICBkZWZhdWx0X2luZGV4X3BvbGljeV9zZXQ6IGZhbHNlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaGFuZGxlID0gYmluZGluZ3Muc29jaGRiX29wZW5fd2l0aF9jb25maWcocGF0aCwgY0NvbmZpZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFuZGxlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZERhdGFiYXNlKHBhdGgsIGhhbmRsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgZm9yIG11bHRpLXByb2Nlc3Mgd2ViIGFwcGxpY2F0aW9uc1xuICAgICAqIFxuICAgICAqIFRoaXMgbW9kZSBhbGxvd3MgbXVsdGlwbGUgTm9kZS5qcyBwcm9jZXNzZXMgKGUuZy4sIFBNMiBjbHVzdGVyIHdvcmtlcnMsXG4gICAgICogbXVsdGlwbGUgRXhwcmVzcyBpbnN0YW5jZXMpIHRvIGFjY2VzcyB0aGUgZGF0YWJhc2Ugc2ltdWx0YW5lb3VzbHkuXG4gICAgICogXG4gICAgICogRmVhdHVyZXM6XG4gICAgICogLSBMb2NrLWZyZWUgcmVhZHMgd2l0aCB+MTAwbnMgbGF0ZW5jeVxuICAgICAqIC0gTXVsdGktcmVhZGVyLCBzaW5nbGUtd3JpdGVyIGNvb3JkaW5hdGlvblxuICAgICAqIC0gQXV0b21hdGljIHdyaXRlIHNlcmlhbGl6YXRpb25cbiAgICAgKiBcbiAgICAgKiBAZXhhbXBsZVxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBpbXBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICAgICAqIGltcG9ydCBleHByZXNzIGZyb20gJ2V4cHJlc3MnO1xuICAgICAqIFxuICAgICAqIC8vIE9wZW4gaW4gY29uY3VycmVudCBtb2RlIC0gbXVsdGlwbGUgd29ya2VycyBjYW4gYWNjZXNzXG4gICAgICogY29uc3QgZGIgPSBFbWJlZGRlZERhdGFiYXNlLm9wZW5Db25jdXJyZW50KCcuL3dlYl9kYicpO1xuICAgICAqIFxuICAgICAqIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcbiAgICAgKiBcbiAgICAgKiBhcHAuZ2V0KCcvdXNlci86aWQnLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgKiAgIC8vIE11bHRpcGxlIGNvbmN1cnJlbnQgcmVxdWVzdHMgY2FuIHJlYWQgc2ltdWx0YW5lb3VzbHlcbiAgICAgKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBkYi5nZXQoQnVmZmVyLmZyb20oYHVzZXI6JHtyZXEucGFyYW1zLmlkfWApKTtcbiAgICAgKiAgIGlmICghZGF0YSkge1xuICAgICAqICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnbm90IGZvdW5kJyB9KTtcbiAgICAgKiAgICAgcmV0dXJuO1xuICAgICAqICAgfVxuICAgICAqICAgcmVzLnNlbmQoZGF0YSk7XG4gICAgICogfSk7XG4gICAgICogXG4gICAgICogYXBwLnBvc3QoJy91c2VyLzppZCcsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAqICAgLy8gV3JpdGVzIGFyZSBzZXJpYWxpemVkIGF1dG9tYXRpY2FsbHlcbiAgICAgKiAgIGF3YWl0IGRiLnB1dChCdWZmZXIuZnJvbShgdXNlcjoke3JlcS5wYXJhbXMuaWR9YCksIHJlcS5ib2R5KTtcbiAgICAgKiAgIHJlcy5qc29uKHsgc3RhdHVzOiAnb2snIH0pO1xuICAgICAqIH0pO1xuICAgICAqIFxuICAgICAqIC8vIFN0YXJ0IHdpdGggUE0yIGNsdXN0ZXIgbW9kZTpcbiAgICAgKiAvLyBwbTIgc3RhcnQgYXBwLmpzIC1pIG1heFxuICAgICAqIGFwcC5saXN0ZW4oMzAwMCk7XG4gICAgICogYGBgXG4gICAgICogXG4gICAgICogQHBhcmFtIHBhdGggLSBQYXRoIHRvIGRhdGFiYXNlIGRpcmVjdG9yeVxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgY29uY3VycmVudCBtb2RlXG4gICAgICogQHJldHVybnMgRW1iZWRkZWREYXRhYmFzZSBpbnN0YW5jZSBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBzdGF0aWMgb3BlbkNvbmN1cnJlbnQocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyBmYWxsYmFja1RvU3RhbmRhcmQ/OiBib29sZWFuIH0pOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoJ1xceDAwJykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhYmFzZUVycm9yKCdEYXRhYmFzZSBwYXRoIG11c3Qgbm90IGNvbnRhaW4gbnVsbCBieXRlcycpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gTmF0aXZlQmluZGluZ3MuZ2V0SW5zdGFuY2UoKTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2tUb1N0YW5kYXJkID0gb3B0aW9ucz8uZmFsbGJhY2tUb1N0YW5kYXJkID8/IGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFiaW5kaW5ncy5pc0NvbmN1cnJlbnRNb2RlQXZhaWxhYmxlKCkpIHtcbiAgICAgICAgICAgIGlmIChmYWxsYmFja1RvU3RhbmRhcmQpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICAgICdbU29jaERCXSBDb25jdXJyZW50IG1vZGUgbm90IGF2YWlsYWJsZSBpbiBuYXRpdmUgbGlicmFyeSAocmVxdWlyZXMgdjAuNC44KykuICcgK1xuICAgICAgICAgICAgICAgICAgICAnRmFsbGluZyBiYWNrIHRvIHN0YW5kYXJkIG1vZGUuIEZvciBwcm9kdWN0aW9uIG11bHRpLXByb2Nlc3MgZGVwbG95bWVudHMsICcgK1xuICAgICAgICAgICAgICAgICAgICAncGxlYXNlIHVwZ3JhZGUgdGhlIFNvY2hEQiBuYXRpdmUgbGlicmFyeS4nXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3BlbihwYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihgRmFpbGVkIHRvIG9wZW4gZGF0YWJhc2UgYXQgJHtwYXRofWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVtYmVkZGVkRGF0YWJhc2UocGF0aCwgaGFuZGxlLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRGF0YWJhc2VFcnJvcihcbiAgICAgICAgICAgICAgICAnQ29uY3VycmVudCBtb2RlIG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1cGdyYWRlIHRoZSBTb2NoREIgbmF0aXZlIGxpYnJhcnkgdG8gdjAuNC44KyAnICtcbiAgICAgICAgICAgICAgICAnb3IgdXNlIG9wZW5Db25jdXJyZW50KHBhdGgsIHsgZmFsbGJhY2tUb1N0YW5kYXJkOiB0cnVlIH0pIHRvIGZhbGwgYmFjayB0byBzdGFuZGFyZCBtb2RlLidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGUgPSBiaW5kaW5ncy5zb2NoZGJfb3Blbl9jb25jdXJyZW50KHBhdGgpO1xuICAgICAgICBpZiAoIWhhbmRsZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoYEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlIGluIGNvbmN1cnJlbnQgbW9kZSBhdCAke3BhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpc0NvbmN1cnJlbnQgPSBiaW5kaW5ncy5zb2NoZGJfaXNfY29uY3VycmVudD8uKGhhbmRsZSkgPT09IDE7XG4gICAgICAgIHJldHVybiBuZXcgRW1iZWRkZWREYXRhYmFzZShwYXRoLCBoYW5kbGUsIGlzQ29uY3VycmVudCwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGRhdGFiYXNlIGlzIG9wZW5lZCBpbiBjb25jdXJyZW50IG1vZGVcbiAgICAgKi9cbiAgICBnZXQgaXNDb25jdXJyZW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25jdXJyZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGNvbmN1cnJlbnQgbW9kZSBmZWxsIGJhY2sgdG8gc3RhbmRhcmQgbW9kZVxuICAgICAqL1xuICAgIGdldCBpc0NvbmN1cnJlbnRGYWxsYmFjaygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmN1cnJlbnRNb2RlRmFsbGJhY2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgY29uY3VycmVudCBtb2RlIGlzIGF2YWlsYWJsZSBpbiB0aGUgbmF0aXZlIGxpYnJhcnlcbiAgICAgKi9cbiAgICBzdGF0aWMgaXNDb25jdXJyZW50TW9kZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIE5hdGl2ZUJpbmRpbmdzLmdldEluc3RhbmNlKCkuaXNDb25jdXJyZW50TW9kZUF2YWlsYWJsZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFB1dCBhIGtleS12YWx1ZSBwYWlyIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIHB1dChrZXk6IEJ1ZmZlciwgdmFsdWU6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4ucHV0KGtleSwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHZhbHVlIGJ5IGtleSAoYXV0by10cmFuc2FjdGlvbilcbiAgICAgKi9cbiAgICBhc3luYyBnZXQoa2V5OiBCdWZmZXIpOiBQcm9taXNlPEJ1ZmZlciB8IG51bGw+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0eG4uZ2V0KGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEga2V5IChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGRlbGV0ZShrZXk6IEJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcblxuICAgICAgICBjb25zdCB0eG4gPSB0aGlzLnRyYW5zYWN0aW9uKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uZGVsZXRlKGtleSk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHV0IHZhbHVlIGF0IHBhdGggKGF1dG8tdHJhbnNhY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgcHV0UGF0aChwYXRoOiBzdHJpbmcsIHZhbHVlOiBCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgdHhuLnB1dFBhdGgocGF0aCwgdmFsdWUpO1xuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB2YWx1ZSBhdCBwYXRoIChhdXRvLXRyYW5zYWN0aW9uKVxuICAgICAqL1xuICAgIGFzeW5jIGdldFBhdGgocGF0aDogc3RyaW5nKTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgdHhuLmdldFBhdGgocGF0aCk7XG4gICAgICAgICAgICBhd2FpdCB0eG4uY29tbWl0KCk7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2NhbiBrZXlzIHdpdGggcHJlZml4XG4gICAgICovXG4gICAgYXN5bmMgKnNjYW5QcmVmaXgocHJlZml4OiBCdWZmZXIpOiBBc3luY0dlbmVyYXRvcjxbQnVmZmVyLCBCdWZmZXJdPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIGNvbnN0IHR4biA9IHRoaXMudHJhbnNhY3Rpb24oKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZW50cnkgb2YgdHhuLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHlpZWxkIGVudHJ5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdHhuLmNvbW1pdCgpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgYXdhaXQgdHhuLmFib3J0KCk7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJlZ2luIGEgdHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbigpOiBFbWJlZGRlZFRyYW5zYWN0aW9uIHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG5cbiAgICAgICAgY29uc3QgdHhuSGFuZGxlID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfYmVnaW5fdHhuKHRoaXMuaGFuZGxlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBFbWJlZGRlZFRyYW5zYWN0aW9uKHRoaXMsIHRoaXMuaGFuZGxlLCB0eG5IYW5kbGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4ZWN1dGUgb3BlcmF0aW9ucyB3aXRoaW4gYSB0cmFuc2FjdGlvbiAod2l0aCBhdXRvLWNvbW1pdC9hYm9ydClcbiAgICAgKi9cbiAgICBhc3luYyB3aXRoVHJhbnNhY3Rpb248VD4oZm46ICh0eG46IEVtYmVkZGVkVHJhbnNhY3Rpb24pID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICAgICAgY29uc3QgdHhuID0gdGhpcy50cmFuc2FjdGlvbigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4odHhuKTtcbiAgICAgICAgICAgIGF3YWl0IHR4bi5jb21taXQoKTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCB0eG4uYWJvcnQoKTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgYSBjaGVja3BvaW50XG4gICAgICovXG4gICAgYXN5bmMgY2hlY2twb2ludCgpOiBQcm9taXNlPGJpZ2ludD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgbHNuID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfY2hlY2twb2ludCh0aGlzLmhhbmRsZSk7XG4gICAgICAgIHJldHVybiBCaWdJbnQobHNuKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc3RvcmFnZSBzdGF0aXN0aWNzXG4gICAgICovXG4gICAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTx7XG4gICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBiaWdpbnQ7XG4gICAgICAgIHdhbFNpemVCeXRlczogYmlnaW50O1xuICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAgICAgbWluQWN0aXZlU25hcHNob3Q6IGJpZ2ludDtcbiAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IGJpZ2ludDtcbiAgICB9PiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuXG4gICAgICAgIC8vIFJldHVybnMgc3RydWN0IGJ5IHZhbHVlIChhdXRvbWF0aWNhbGx5IGRlY29kZWQpXG4gICAgICAgIGNvbnN0IHN0YXRzID0gdGhpcy5iaW5kaW5ncy5zb2NoZGJfc3RhdHModGhpcy5oYW5kbGUpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG1lbXRhYmxlU2l6ZUJ5dGVzOiBCaWdJbnQoc3RhdHMubWVtdGFibGVfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICB3YWxTaXplQnl0ZXM6IEJpZ0ludChzdGF0cy53YWxfc2l6ZV9ieXRlcyksXG4gICAgICAgICAgICBhY3RpdmVUcmFuc2FjdGlvbnM6IHN0YXRzLmFjdGl2ZV90cmFuc2FjdGlvbnMsXG4gICAgICAgICAgICBtaW5BY3RpdmVTbmFwc2hvdDogQmlnSW50KHN0YXRzLm1pbl9hY3RpdmVfc25hcHNob3QpLFxuICAgICAgICAgICAgbGFzdENoZWNrcG9pbnRMc246IEJpZ0ludChzdGF0cy5sYXN0X2NoZWNrcG9pbnRfbHNuKSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBkYXRhYmFzZVxuICAgICAqL1xuICAgIGNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7XG4gICAgICAgICAgICB0aGlzLmJpbmRpbmdzLnNvY2hkYl9jbG9zZSh0aGlzLmhhbmRsZSk7XG4gICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGVuc3VyZU9wZW4oKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFiYXNlRXJyb3IoJ0RhdGFiYXNlIGlzIGNsb3NlZCcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGludGVybmFsIGhhbmRsZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRIYW5kbGUoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBiaW5kaW5ncyBpbnN0YW5jZSAoZm9yIHRyYW5zYWN0aW9ucylcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBnZXRCaW5kaW5ncygpOiBOYXRpdmVCaW5kaW5ncyB7XG4gICAgICAgIHJldHVybiB0aGlzLmJpbmRpbmdzO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIE5hbWVzcGFjZSBPcGVyYXRpb25zXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgbmFtZXNwYWNlXG4gICAgICovXG4gICAgYXN5bmMgY3JlYXRlTmFtZXNwYWNlKG5hbWU6IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxOYW1lc3BhY2VDb25maWc+KTogUHJvbWlzZTxOYW1lc3BhY2U+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IG1ldGFLZXkgPSBgX25hbWVzcGFjZS8ke25hbWV9L21ldGFkYXRhYDtcbiAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldChCdWZmZXIuZnJvbShtZXRhS2V5KSk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IE5hbWVzcGFjZUV4aXN0c0Vycm9yKG5hbWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbnNDb25maWc6IE5hbWVzcGFjZUNvbmZpZyA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogY29uZmlnPy5kaXNwbGF5TmFtZSxcbiAgICAgICAgICAgIGxhYmVsczogY29uZmlnPy5sYWJlbHMsXG4gICAgICAgICAgICByZWFkT25seTogY29uZmlnPy5yZWFkT25seSA/PyBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20obWV0YUtleSksIEJ1ZmZlci5mcm9tKEpTT04uc3RyaW5naWZ5KG5zQ29uZmlnKSkpO1xuICAgICAgICByZXR1cm4gbmV3IE5hbWVzcGFjZSh0aGlzLCBuYW1lLCBuc0NvbmZpZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFuIGV4aXN0aW5nIG5hbWVzcGFjZVxuICAgICAqL1xuICAgIGFzeW5jIG5hbWVzcGFjZShuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE5hbWVzcGFjZT4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgbWV0YUtleSA9IGBfbmFtZXNwYWNlLyR7bmFtZX0vbWV0YWRhdGFgO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5nZXQoQnVmZmVyLmZyb20obWV0YUtleSkpO1xuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBOYW1lc3BhY2VOb3RGb3VuZEVycm9yKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5zQ29uZmlnID0gSlNPTi5wYXJzZShkYXRhLnRvU3RyaW5nKCkpO1xuICAgICAgICByZXR1cm4gbmV3IE5hbWVzcGFjZSh0aGlzLCBuYW1lLCBuc0NvbmZpZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yIGNyZWF0ZSBhIG5hbWVzcGFjZVxuICAgICAqL1xuICAgIGFzeW5jIGdldE9yQ3JlYXRlTmFtZXNwYWNlKG5hbWU6IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxOYW1lc3BhY2VDb25maWc+KTogUHJvbWlzZTxOYW1lc3BhY2U+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm5hbWVzcGFjZShuYW1lKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE5hbWVzcGFjZU5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVOYW1lc3BhY2UobmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgbmFtZXNwYWNlIGFuZCBhbGwgaXRzIGRhdGFcbiAgICAgKi9cbiAgICBhc3luYyBkZWxldGVOYW1lc3BhY2UobmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIHRoaXMuZW5zdXJlT3BlbigpO1xuICAgICAgICBjb25zdCBwcmVmaXggPSBCdWZmZXIuZnJvbShgX25hbWVzcGFjZS8ke25hbWV9L2ApO1xuICAgICAgICBjb25zdCBjb2xsUHJlZml4ID0gQnVmZmVyLmZyb20oYF9jb2xsZWN0aW9uLyR7bmFtZX0vYCk7XG5cbiAgICAgICAgY29uc3QgdG9EZWxldGU6IEJ1ZmZlcltdID0gW107XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFtrZXlCdWZdIG9mIHRoaXMuc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgdG9EZWxldGUucHVzaChrZXlCdWYpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBba2V5QnVmXSBvZiB0aGlzLnNjYW5QcmVmaXgoY29sbFByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICB0b0RlbGV0ZS5wdXNoKGtleUJ1Zik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBzY2FuIG5vdCBhdmFpbGFibGUgKi8gfVxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRvRGVsZXRlKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b0RlbGV0ZS5sZW5ndGggPiAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIG5hbWVzcGFjZSBuYW1lc1xuICAgICAqL1xuICAgIGFzeW5jIGxpc3ROYW1lc3BhY2VzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IEJ1ZmZlci5mcm9tKCdfbmFtZXNwYWNlLycpO1xuICAgICAgICBjb25zdCBuYW1lcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBba2V5QnVmXSBvZiB0aGlzLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleUJ1Zi50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyUHJlZml4ID0ga2V5LnN1YnN0cmluZygnX25hbWVzcGFjZS8nLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbnNOYW1lID0gYWZ0ZXJQcmVmaXguc3BsaXQoJy8nKVswXTtcbiAgICAgICAgICAgICAgICBpZiAobnNOYW1lKSBuYW1lcy5hZGQobnNOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IC8qIHNjYW4gbm90IGF2YWlsYWJsZSAqLyB9XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5hbWVzKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBHcmFwaCBPdmVybGF5IE9wZXJhdGlvbnMgKHRoaW4gd3JhcHBlcnMgdXNpbmcgS1YpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBub2RlIHRvIHRoZSBncmFwaCBvdmVybGF5XG4gICAgICovXG4gICAgYXN5bmMgYWRkTm9kZShcbiAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsIG5vZGVJZDogc3RyaW5nLCBub2RlVHlwZTogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gYF9ncmFwaC8ke25hbWVzcGFjZX0vbm9kZXMvJHtub2RlSWR9YDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBKU09OLnN0cmluZ2lmeSh7IGlkOiBub2RlSWQsIG5vZGVfdHlwZTogbm9kZVR5cGUsIHByb3BlcnRpZXM6IHByb3BlcnRpZXMgfHwge30gfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucHV0KEJ1ZmZlci5mcm9tKGtleSksIEJ1ZmZlci5mcm9tKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIGFuIGVkZ2UgYmV0d2VlbiBub2Rlc1xuICAgICAqL1xuICAgIGFzeW5jIGFkZEVkZ2UoXG4gICAgICAgIG5hbWVzcGFjZTogc3RyaW5nLCBmcm9tSWQ6IHN0cmluZywgZWRnZVR5cGU6IHN0cmluZywgdG9JZDogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3Qga2V5ID0gYF9ncmFwaC8ke25hbWVzcGFjZX0vZWRnZXMvJHtmcm9tSWR9LyR7ZWRnZVR5cGV9LyR7dG9JZH1gO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHsgZnJvbV9pZDogZnJvbUlkLCBlZGdlX3R5cGU6IGVkZ2VUeXBlLCB0b19pZDogdG9JZCwgcHJvcGVydGllczogcHJvcGVydGllcyB8fCB7fSB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20oa2V5KSwgQnVmZmVyLmZyb20odmFsdWUpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZSB0aGUgZ3JhcGggZnJvbSBhIHN0YXJ0aW5nIG5vZGVcbiAgICAgKi9cbiAgICBhc3luYyB0cmF2ZXJzZShcbiAgICAgICAgbmFtZXNwYWNlOiBzdHJpbmcsIHN0YXJ0Tm9kZTogc3RyaW5nLCBtYXhEZXB0aCA9IDEwLFxuICAgICAgICBvcmRlcjogJ2JmcycgfCAnZGZzJyA9ICdiZnMnXG4gICAgKTogUHJvbWlzZTx7IG5vZGVzOiBhbnlbXTsgZWRnZXM6IGFueVtdIH0+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgY29uc3Qgbm9kZXM6IGFueVtdID0gW107XG4gICAgICAgIGNvbnN0IGVkZ2VzOiBhbnlbXSA9IFtdO1xuICAgICAgICBjb25zdCBmcm9udGllcjogQXJyYXk8W3N0cmluZywgbnVtYmVyXT4gPSBbW3N0YXJ0Tm9kZSwgMF1dO1xuXG4gICAgICAgIHdoaWxlIChmcm9udGllci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBbY3VycmVudE5vZGUsIGRlcHRoXSA9IG9yZGVyID09PSAnYmZzJyA/IGZyb250aWVyLnNoaWZ0KCkhIDogZnJvbnRpZXIucG9wKCkhO1xuICAgICAgICAgICAgaWYgKGRlcHRoID4gbWF4RGVwdGggfHwgdmlzaXRlZC5oYXMoY3VycmVudE5vZGUpKSBjb250aW51ZTtcbiAgICAgICAgICAgIHZpc2l0ZWQuYWRkKGN1cnJlbnROb2RlKTtcblxuICAgICAgICAgICAgY29uc3Qgbm9kZURhdGEgPSBhd2FpdCB0aGlzLmdldChCdWZmZXIuZnJvbShgX2dyYXBoLyR7bmFtZXNwYWNlfS9ub2Rlcy8ke2N1cnJlbnROb2RlfWApKTtcbiAgICAgICAgICAgIGlmIChub2RlRGF0YSkgbm9kZXMucHVzaChKU09OLnBhcnNlKG5vZGVEYXRhLnRvU3RyaW5nKCkpKTtcblxuICAgICAgICAgICAgY29uc3QgZWRnZVByZWZpeCA9IEJ1ZmZlci5mcm9tKGBfZ3JhcGgvJHtuYW1lc3BhY2V9L2VkZ2VzLyR7Y3VycmVudE5vZGV9L2ApO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IFssIHZhbHVlQnVmXSBvZiB0aGlzLnNjYW5QcmVmaXgoZWRnZVByZWZpeCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRnZSA9IEpTT04ucGFyc2UodmFsdWVCdWYudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgIGVkZ2VzLnB1c2goZWRnZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZC5oYXMoZWRnZS50b19pZCkpIGZyb250aWVyLnB1c2goW2VkZ2UudG9faWQsIGRlcHRoICsgMV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggeyAvKiBzY2FuIG5vdCBhdmFpbGFibGUgKi8gfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5vZGVzLCBlZGdlcyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFNlbWFudGljIENhY2hlIE9wZXJhdGlvbnMgKHRoaW4gd3JhcHBlcnMgdXNpbmcgS1YpXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBQdXQgYSB2YWx1ZSBpbiB0aGUgc2VtYW50aWMgY2FjaGVcbiAgICAgKi9cbiAgICBhc3luYyBjYWNoZVB1dChcbiAgICAgICAgY2FjaGVOYW1lOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLFxuICAgICAgICBlbWJlZGRpbmc6IG51bWJlcltdLCB0dGxTZWNvbmRzID0gMFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3Qga2V5SGFzaCA9IEJ1ZmZlci5mcm9tKGtleSkudG9TdHJpbmcoJ2hleCcpLnNsaWNlKDAsIDE2KTtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgX2NhY2hlLyR7Y2FjaGVOYW1lfS8ke2tleUhhc2h9YDtcbiAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gdHRsU2Vjb25kcyA+IDAgPyBNYXRoLmZsb29yKERhdGUubm93KCkgLyAxMDAwKSArIHR0bFNlY29uZHMgOiAwO1xuICAgICAgICBjb25zdCBjYWNoZVZhbHVlID0gSlNPTi5zdHJpbmdpZnkoeyBrZXksIHZhbHVlLCBlbWJlZGRpbmcsIGV4cGlyZXNfYXQ6IGV4cGlyZXNBdCB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5wdXQoQnVmZmVyLmZyb20oY2FjaGVLZXkpLCBCdWZmZXIuZnJvbShjYWNoZVZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdmFsdWUgZnJvbSB0aGUgc2VtYW50aWMgY2FjaGUgYnkgZW1iZWRkaW5nIHNpbWlsYXJpdHlcbiAgICAgKi9cbiAgICBhc3luYyBjYWNoZUdldChcbiAgICAgICAgY2FjaGVOYW1lOiBzdHJpbmcsIHF1ZXJ5RW1iZWRkaW5nOiBudW1iZXJbXSwgdGhyZXNob2xkID0gMC44NVxuICAgICk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oYF9jYWNoZS8ke2NhY2hlTmFtZX0vYCk7XG4gICAgICAgIGNvbnN0IG5vdyA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApO1xuICAgICAgICBsZXQgYmVzdE1hdGNoOiB7IHNpbWlsYXJpdHk6IG51bWJlcjsgdmFsdWU6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgWywgdmFsdWVCdWZdIG9mIHRoaXMuc2NhblByZWZpeChwcmVmaXgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKHZhbHVlQnVmLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGlmIChlbnRyeS5leHBpcmVzX2F0ID4gMCAmJiBub3cgPiBlbnRyeS5leHBpcmVzX2F0KSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW50cnkuZW1iZWRkaW5nICYmIGVudHJ5LmVtYmVkZGluZy5sZW5ndGggPT09IHF1ZXJ5RW1iZWRkaW5nLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gRW1iZWRkZWREYXRhYmFzZS5jb3NpbmVTaW1pbGFyaXR5KHF1ZXJ5RW1iZWRkaW5nLCBlbnRyeS5lbWJlZGRpbmcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcml0eSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmVzdE1hdGNoIHx8IHNpbWlsYXJpdHkgPiBiZXN0TWF0Y2guc2ltaWxhcml0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IHsgc2ltaWxhcml0eSwgdmFsdWU6IGVudHJ5LnZhbHVlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggeyAvKiBzY2FuIG5vdCBhdmFpbGFibGUgKi8gfVxuXG4gICAgICAgIHJldHVybiBiZXN0TWF0Y2g/LnZhbHVlID8/IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGEgY2FjaGUgZW50cnlcbiAgICAgKi9cbiAgICBhc3luYyBjYWNoZURlbGV0ZShjYWNoZU5hbWU6IHN0cmluZywga2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5lbnN1cmVPcGVuKCk7XG4gICAgICAgIGNvbnN0IGtleUhhc2ggPSBCdWZmZXIuZnJvbShrZXkpLnRvU3RyaW5nKCdoZXgnKS5zbGljZSgwLCAxNik7XG4gICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKEJ1ZmZlci5mcm9tKGBfY2FjaGUvJHtjYWNoZU5hbWV9LyR7a2V5SGFzaH1gKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIGVudHJpZXMgaW4gYSBzZW1hbnRpYyBjYWNoZVxuICAgICAqL1xuICAgIGFzeW5jIGNhY2hlQ2xlYXIoY2FjaGVOYW1lOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICB0aGlzLmVuc3VyZU9wZW4oKTtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gQnVmZmVyLmZyb20oYF9jYWNoZS8ke2NhY2hlTmFtZX0vYCk7XG4gICAgICAgIGxldCBkZWxldGVkID0gMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRvRGVsZXRlOiBCdWZmZXJbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBba2V5QnVmXSBvZiB0aGlzLnNjYW5QcmVmaXgocHJlZml4KSkge1xuICAgICAgICAgICAgICAgIHRvRGVsZXRlLnB1c2goa2V5QnVmKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgayBvZiB0b0RlbGV0ZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGVsZXRlKGspO1xuICAgICAgICAgICAgICAgIGRlbGV0ZWQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7IC8qIHNjYW4gbm90IGF2YWlsYWJsZSAqLyB9XG4gICAgICAgIHJldHVybiBkZWxldGVkO1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFN0YXRpYyBGb3JtYXQgVXRpbGl0aWVzXG4gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHJlY29yZHMgdG8gVE9PTiBmb3JtYXRcbiAgICAgKi9cbiAgICBzdGF0aWMgdG9Ub29uKFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgcmVjb3JkczogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgICAgIGZpZWxkcz86IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFyZWNvcmRzIHx8IHJlY29yZHMubGVuZ3RoID09PSAwKSByZXR1cm4gYCR7dGFibGVOYW1lfVswXXt9OmA7XG4gICAgICAgIGNvbnN0IHVzZUZpZWxkcyA9IGZpZWxkcyA/PyBPYmplY3Qua2V5cyhyZWNvcmRzWzBdKTtcbiAgICAgICAgY29uc3QgaGVhZGVyID0gYCR7dGFibGVOYW1lfVske3JlY29yZHMubGVuZ3RofV17JHt1c2VGaWVsZHMuam9pbignLCcpfX06YDtcbiAgICAgICAgY29uc3QgZXNjYXBlVmFsdWUgPSAodjogYW55KTogc3RyaW5nID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSB2ICE9IG51bGwgPyBTdHJpbmcodikgOiAnJztcbiAgICAgICAgICAgIGlmIChzLmluY2x1ZGVzKCcsJykgfHwgcy5pbmNsdWRlcygnOycpIHx8IHMuaW5jbHVkZXMoJ1xcbicpKSByZXR1cm4gYFwiJHtzfVwiYDtcbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCByb3dzID0gcmVjb3Jkcy5tYXAociA9PiB1c2VGaWVsZHMubWFwKGYgPT4gZXNjYXBlVmFsdWUocltmXSkpLmpvaW4oJywnKSkuam9pbignOycpO1xuICAgICAgICByZXR1cm4gaGVhZGVyICsgcm93cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHJlY29yZHMgdG8gSlNPTiBmb3JtYXRcbiAgICAgKi9cbiAgICBzdGF0aWMgdG9Kc29uKFxuICAgICAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICAgICAgcmVjb3JkczogQXJyYXk8UmVjb3JkPHN0cmluZywgYW55Pj4sXG4gICAgICAgIGZpZWxkcz86IHN0cmluZ1tdLFxuICAgICAgICBjb21wYWN0ID0gdHJ1ZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGlmICghcmVjb3JkcyB8fCByZWNvcmRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdGFibGU6IHRhYmxlTmFtZSwgY291bnQ6IDAsIHJlY29yZHM6IFtdIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkUmVjb3JkcyA9IGZpZWxkc1xuICAgICAgICAgICAgPyByZWNvcmRzLm1hcChyID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJlZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZiBvZiBmaWVsZHMpIGZpbHRlcmVkW2ZdID0gcltmXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWQ7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiByZWNvcmRzO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7IHRhYmxlOiB0YWJsZU5hbWUsIGNvdW50OiBmaWx0ZXJlZFJlY29yZHMubGVuZ3RoLCByZWNvcmRzOiBmaWx0ZXJlZFJlY29yZHMgfTtcbiAgICAgICAgcmV0dXJuIGNvbXBhY3QgPyBKU09OLnN0cmluZ2lmeShvdXRwdXQpIDogSlNPTi5zdHJpbmdpZnkob3V0cHV0LCBudWxsLCAyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBKU09OIGZvcm1hdFxuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSnNvbihqc29uU3RyOiBzdHJpbmcpOiB7XG4gICAgICAgIHRhYmxlOiBzdHJpbmc7IGZpZWxkczogc3RyaW5nW107IHJlY29yZHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIGFueT4+O1xuICAgIH0ge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShqc29uU3RyKTtcbiAgICAgICAgY29uc3QgdGFibGUgPSBkYXRhLnRhYmxlID8/ICd1bmtub3duJztcbiAgICAgICAgY29uc3QgcmVjb3JkcyA9IGRhdGEucmVjb3JkcyA/PyBbXTtcbiAgICAgICAgY29uc3QgZmllbGRzID0gcmVjb3Jkcy5sZW5ndGggPiAwID8gT2JqZWN0LmtleXMocmVjb3Jkc1swXSkgOiBbXTtcbiAgICAgICAgcmV0dXJuIHsgdGFibGUsIGZpZWxkcywgcmVjb3JkcyB9O1xuICAgIH1cblxuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIFByaXZhdGUgSGVscGVyc1xuICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgY29zaW5lU2ltaWxhcml0eShhOiBudW1iZXJbXSwgYjogbnVtYmVyW10pOiBudW1iZXIge1xuICAgICAgICBsZXQgZG90ID0gMCwgbm9ybUEgPSAwLCBub3JtQiA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZG90ICs9IGFbaV0gKiBiW2ldOyBub3JtQSArPSBhW2ldICogYVtpXTsgbm9ybUIgKz0gYltpXSAqIGJbaV07XG4gICAgICAgIH1cbiAgICAgICAgbm9ybUEgPSBNYXRoLnNxcnQobm9ybUEpOyBub3JtQiA9IE1hdGguc3FydChub3JtQik7XG4gICAgICAgIHJldHVybiBub3JtQSA9PT0gMCB8fCBub3JtQiA9PT0gMCA/IDAgOiBkb3QgLyAobm9ybUEgKiBub3JtQik7XG4gICAgfVxufVxuIl19
package/dist/esm/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * SochDB Node.js SDK v0.5.1
3
+ * SochDB Node.js SDK v0.5.3
4
4
  *
5
5
  * Dual-mode architecture: Embedded (FFI) + Server (gRPC/IPC)
6
6
  *
@@ -55,7 +55,7 @@ exports.GrpcClient = exports.SplitBrainError = exports.EpochMismatchError = expo
55
55
  exports.openConcurrent = openConcurrent;
56
56
  exports.open = open;
57
57
  // Version
58
- exports.VERSION = '0.5.1';
58
+ exports.VERSION = '0.5.3';
59
59
  // Embedded mode (FFI) - NEW
60
60
  var embedded_1 = require("./embedded");
61
61
  Object.defineProperty(exports, "EmbeddedDatabase", { enumerable: true, get: function () { return embedded_1.EmbeddedDatabase; } });
@@ -152,4 +152,4 @@ Object.defineProperty(exports, "SplitBrainError", { enumerable: true, get: funct
152
152
  // Convenience alias
153
153
  var grpc_client_2 = require("./grpc-client");
154
154
  Object.defineProperty(exports, "GrpcClient", { enumerable: true, get: function () { return grpc_client_2.SochDBClient; } });
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7O0FBcUJILHdDQUVDO0FBTUQsb0JBRUM7QUE3QkQsVUFBVTtBQUNHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUUvQiw0QkFBNEI7QUFDNUIsdUNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLHVDQUFpRDtBQUF4QywrR0FBQSxtQkFBbUIsT0FBQTtBQUM1Qix1Q0FBaUU7QUFBeEQscUdBQUEsU0FBUyxPQUFBO0FBQWMsd0dBQUEsWUFBWSxPQUFBO0FBRzVDLDBDQUEwQztBQUMxQyx1Q0FBMEQ7QUFBakQsb0dBQUEsZ0JBQWdCLE9BQVk7QUFFckMsa0VBQWtFO0FBQ2xFLHlDQUFzRTtBQUV0RTs7O0dBR0c7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBWSxFQUFFLE9BQTBDO0lBQ3JGLE9BQU8sMkJBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtJQUNoRSxPQUFPLDJCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELHlCQUF5QjtBQUN6Qix5Q0FRcUI7QUFQbkIsc0dBQUEsU0FBUyxPQUFBO0FBQ1QsdUdBQUEsVUFBVSxPQUFBO0FBQ1YsMkdBQUEsY0FBYyxPQUFBO0FBQ2QsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsaUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsb0hBQUEsdUJBQXVCLE9BQUE7QUFDdkIsa0hBQUEscUJBQXFCLE9BQUE7QUFTdkIscUJBQXFCO0FBQ3JCLGlDQUlpQjtBQUhmLHNHQUFBLGFBQWEsT0FBQTtBQUNiLGtHQUFBLFNBQVMsT0FBQTtBQUNULG9HQUFBLFdBQVcsT0FBQTtBQVNiLDBCQUEwQjtBQUMxQixtREFFMEI7QUFEeEIsK0dBQUEsYUFBYSxPQUFBO0FBUWYsMkJBQTJCO0FBQzNCLHFEQUsyQjtBQUp6QixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixxSEFBQSxrQkFBa0IsT0FBQTtBQUNsQix1SEFBQSxvQkFBb0IsT0FBQTtBQU10Qix5QkFBeUI7QUFDekIsbUNBS2tCO0FBSmhCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHNHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLGVBQWUsT0FBQTtBQUNmLG9HQUFBLFVBQVUsT0FBQTtBQWdCWix3Q0FBd0M7QUFDeEMsNkJBS2U7QUFKYixnR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxTQUFTLE9BQUE7QUFDVCwrRkFBQSxRQUFRLE9BQUE7QUFDUixzR0FBQSxlQUFlLE9BQUE7QUFpQmpCLDBCQUEwQjtBQUMxQixtQ0FFa0I7QUFEaEIsdUdBQUEsYUFBYSxPQUFBO0FBZWYseUJBQXlCO0FBQ3pCLDZDQUE2QztBQUFwQywyR0FBQSxZQUFZLE9BQUE7QUFRckIsMkNBQXlDO0FBQWhDLHVHQUFBLFNBQVMsT0FBQTtBQUVsQixtQkFBbUI7QUFDbkIsbUNBTWtCO0FBTGhCLG9HQUFBLFVBQVUsT0FBQTtBQUNWLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLHFCQUFxQixPQUFBO0FBR3ZCLG1CQUFtQjtBQUNuQixpQ0FBZ0M7QUFBdkIsOEZBQUEsS0FBSyxPQUFBO0FBR2QsbUNBYWtCO0FBWmhCLHFHQUFBLFdBQVcsT0FBQTtBQUNYLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVCQUF1QjtBQUN2QixtR0FBQSxTQUFTLE9BQUE7QUFDVCxtR0FBQSxTQUFTLE9BQUE7QUFDVCw2R0FBQSxtQkFBbUIsT0FBQTtBQUNuQiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix5R0FBQSxlQUFlLE9BQUE7QUFHakIsb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC41LjFcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBDb25jdXJyZW50IE1vZGUgKEZGSSkgLSBGb3IgbXVsdGktcHJvY2VzcyBhcHBzOlxuICogICAgLSBTYW1lIEZGSSBiaW5kaW5ncyB3aXRoIE1WQ0MgZm9yIGNvbmN1cnJlbnQgYWNjZXNzXG4gKiAgICAtIE11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIGNhbiBhY2Nlc3Mgc2FtZSBkYXRhYmFzZVxuICogICAgLSBCZXN0IGZvcjogUE0yIGNsdXN0ZXIsIEV4cHJlc3Mgd29ya2Vyc1xuICogXG4gKiAzLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBDb25jdXJyZW50IE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBNdWx0aXBsZSBwcm9jZXNzZXMgY2FuIGFjY2VzcyBzaW11bHRhbmVvdXNseVxuICogY29uc3QgZGIgPSBEYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi9teWRiJyk7XG4gKiBjb25zb2xlLmxvZyhgQ29uY3VycmVudDogJHtkYi5pc0NvbmN1cnJlbnR9YCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC41LjEnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBIbnN3SW5kZXgsIEhuc3dDb25maWcsIEhuc3dCaW5kaW5ncyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuZXhwb3J0IHsgU2VhcmNoUmVzdWx0IGFzIEhuc3dTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gRW1iZWRkZWQgbW9kZSAoRkZJKSAtIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIGFzIERhdGFiYXNlIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGNvbmN1cnJlbnQgbW9kZVxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSwgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vKipcbiAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgKG11bHRpLXByb2Nlc3Mgc2FmZSkuXG4gKiBBbGlhcyBmb3IgRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuQ29uY3VycmVudChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGZhbGxiYWNrVG9TdGFuZGFyZD86IGJvb2xlYW4gfSk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICByZXR1cm4gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudChwYXRoLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBPcGVuIGEgZGF0YWJhc2UgaW4gc3RhbmRhcmQgbW9kZS5cbiAqIEFsaWFzIGZvciBFbWJlZGRlZERhdGFiYXNlLm9wZW4oKVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgcmV0dXJuIEVtYmVkZGVkRGF0YWJhc2Uub3BlbihwYXRoLCBjb25maWcpO1xufVxuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG59IGZyb20gJy4vbWVtb3J5JztcbmV4cG9ydCB0eXBlIHtcbiAgRW50aXR5LFxuICBSZWxhdGlvbixcbiAgQXNzZXJ0aW9uLFxuICBSYXdBc3NlcnRpb24sXG4gIENhbm9uaWNhbEZhY3QsXG4gIEV4dHJhY3Rpb25SZXN1bHQsXG4gIEV4dHJhY3Rpb25TY2hlbWEsXG4gIENvbnNvbGlkYXRpb25Db25maWcsXG4gIFJldHJpZXZhbENvbmZpZyxcbiAgUmV0cmlldmFsUmVzdWx0LFxuICBSZXRyaWV2YWxSZXNwb25zZSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBNQ1AgLSBNb2RlbCBDb250ZXh0IFByb3RvY29sICh2MC40LjMpXG5leHBvcnQge1xuICBNY3BTZXJ2ZXIsXG4gIE1jcENsaWVudCxcbiAgTWNwRXJyb3IsXG4gIE1DUF9FUlJPUl9DT0RFUyxcbn0gZnJvbSAnLi9tY3AnO1xuZXhwb3J0IHR5cGUge1xuICBNY3BUb29sLFxuICBNY3BUb29sQ2FsbCxcbiAgTWNwVG9vbFJlc3VsdCxcbiAgTWNwUmVzb3VyY2UsXG4gIE1jcFJlc291cmNlQ29udGVudCxcbiAgTWNwUHJvbXB0LFxuICBNY3BQcm9tcHRBcmd1bWVudCxcbiAgTWNwUHJvbXB0TWVzc2FnZSxcbiAgTWNwU2VydmVyQ2FwYWJpbGl0aWVzLFxuICBNY3BTZXJ2ZXJDb25maWcsXG4gIE1jcENsaWVudENvbmZpZyxcbiAgTWNwVHJhbnNwb3J0LFxufSBmcm9tICcuL21jcCc7XG5cbi8vIFBvbGljeSBTZXJ2aWNlICh2MC40LjMpXG5leHBvcnQge1xuICBQb2xpY3lTZXJ2aWNlLFxufSBmcm9tICcuL3BvbGljeSc7XG5leHBvcnQgdHlwZSB7XG4gIFBvbGljeVJ1bGUsXG4gIFBvbGljeUNvbmRpdGlvbixcbiAgUG9saWN5RXZhbHVhdGlvbixcbiAgTmFtZXNwYWNlUG9saWN5LFxuICBOYW1lc3BhY2VHcmFudCxcbiAgTmFtZXNwYWNlUGVybWlzc2lvbixcbiAgUG9saWN5QWN0aW9uLFxuICBQb2xpY3lSZXF1ZXN0LFxuICBQb2xpY3lTZXQsXG4gIFBvbGljeUF1ZGl0RW50cnksXG59IGZyb20gJy4vcG9saWN5JztcblxuLy8gU2VydmVyIG1vZGUgKGdSUEMvSVBDKVxuZXhwb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5leHBvcnQgdHlwZSB7XG4gIFNlYXJjaFJlc3VsdCxcbiAgRG9jdW1lbnQsXG4gIEdyYXBoTm9kZSxcbiAgR3JhcGhFZGdlLFxufSBmcm9tICcuL2dycGMtY2xpZW50JztcblxuZXhwb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnLi9pcGMtY2xpZW50JztcblxuLy8gRm9ybWF0IHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgV2lyZUZvcm1hdCxcbiAgQ29udGV4dEZvcm1hdCxcbiAgQ2Fub25pY2FsRm9ybWF0LFxuICBGb3JtYXRDYXBhYmlsaXRpZXMsXG4gIEZvcm1hdENvbnZlcnNpb25FcnJvcixcbn0gZnJvbSAnLi9mb3JtYXQnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5leHBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuZXhwb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gJy4vcXVlcnknO1xuXG5leHBvcnQge1xuICBTb2NoREJFcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvbkVycm9yLFxuICBQcm90b2NvbEVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICAvLyBMb2NrIGVycm9ycyAodjAuNC4xKVxuICBFcnJvckNvZGUsXG4gIExvY2tFcnJvcixcbiAgRGF0YWJhc2VMb2NrZWRFcnJvcixcbiAgTG9ja1RpbWVvdXRFcnJvcixcbiAgRXBvY2hNaXNtYXRjaEVycm9yLFxuICBTcGxpdEJyYWluRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCBhcyBHcnBjQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG4iXX0=
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERzs7O0FBcUJILHdDQUVDO0FBTUQsb0JBRUM7QUE3QkQsVUFBVTtBQUNHLFFBQUEsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUUvQiw0QkFBNEI7QUFDNUIsdUNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLHVDQUFpRDtBQUF4QywrR0FBQSxtQkFBbUIsT0FBQTtBQUM1Qix1Q0FBaUU7QUFBeEQscUdBQUEsU0FBUyxPQUFBO0FBQWMsd0dBQUEsWUFBWSxPQUFBO0FBRzVDLDBDQUEwQztBQUMxQyx1Q0FBMEQ7QUFBakQsb0dBQUEsZ0JBQWdCLE9BQVk7QUFFckMsa0VBQWtFO0FBQ2xFLHlDQUFzRTtBQUV0RTs7O0dBR0c7QUFDSCxTQUFnQixjQUFjLENBQUMsSUFBWSxFQUFFLE9BQTBDO0lBQ3JGLE9BQU8sMkJBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLElBQVksRUFBRSxNQUErQjtJQUNoRSxPQUFPLDJCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELHlCQUF5QjtBQUN6Qix5Q0FRcUI7QUFQbkIsc0dBQUEsU0FBUyxPQUFBO0FBQ1QsdUdBQUEsVUFBVSxPQUFBO0FBQ1YsMkdBQUEsY0FBYyxPQUFBO0FBQ2QsbUhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsaUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIsb0hBQUEsdUJBQXVCLE9BQUE7QUFDdkIsa0hBQUEscUJBQXFCLE9BQUE7QUFTdkIscUJBQXFCO0FBQ3JCLGlDQUlpQjtBQUhmLHNHQUFBLGFBQWEsT0FBQTtBQUNiLGtHQUFBLFNBQVMsT0FBQTtBQUNULG9HQUFBLFdBQVcsT0FBQTtBQVNiLDBCQUEwQjtBQUMxQixtREFFMEI7QUFEeEIsK0dBQUEsYUFBYSxPQUFBO0FBUWYsMkJBQTJCO0FBQzNCLHFEQUsyQjtBQUp6QixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixzSEFBQSxtQkFBbUIsT0FBQTtBQUNuQixxSEFBQSxrQkFBa0IsT0FBQTtBQUNsQix1SEFBQSxvQkFBb0IsT0FBQTtBQU10Qix5QkFBeUI7QUFDekIsbUNBS2tCO0FBSmhCLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLHNHQUFBLFlBQVksT0FBQTtBQUNaLHlHQUFBLGVBQWUsT0FBQTtBQUNmLG9HQUFBLFVBQVUsT0FBQTtBQWdCWix3Q0FBd0M7QUFDeEMsNkJBS2U7QUFKYixnR0FBQSxTQUFTLE9BQUE7QUFDVCxnR0FBQSxTQUFTLE9BQUE7QUFDVCwrRkFBQSxRQUFRLE9BQUE7QUFDUixzR0FBQSxlQUFlLE9BQUE7QUFpQmpCLDBCQUEwQjtBQUMxQixtQ0FFa0I7QUFEaEIsdUdBQUEsYUFBYSxPQUFBO0FBZWYseUJBQXlCO0FBQ3pCLDZDQUE2QztBQUFwQywyR0FBQSxZQUFZLE9BQUE7QUFRckIsMkNBQXlDO0FBQWhDLHVHQUFBLFNBQVMsT0FBQTtBQUVsQixtQkFBbUI7QUFDbkIsbUNBTWtCO0FBTGhCLG9HQUFBLFVBQVUsT0FBQTtBQUNWLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDRHQUFBLGtCQUFrQixPQUFBO0FBQ2xCLCtHQUFBLHFCQUFxQixPQUFBO0FBR3ZCLG1CQUFtQjtBQUNuQixpQ0FBZ0M7QUFBdkIsOEZBQUEsS0FBSyxPQUFBO0FBR2QsbUNBYWtCO0FBWmhCLHFHQUFBLFdBQVcsT0FBQTtBQUNYLHlHQUFBLGVBQWUsT0FBQTtBQUNmLDBHQUFBLGdCQUFnQixPQUFBO0FBQ2hCLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVHQUFBLGFBQWEsT0FBQTtBQUNiLHVCQUF1QjtBQUN2QixtR0FBQSxTQUFTLE9BQUE7QUFDVCxtR0FBQSxTQUFTLE9BQUE7QUFDVCw2R0FBQSxtQkFBbUIsT0FBQTtBQUNuQiwwR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiw0R0FBQSxrQkFBa0IsT0FBQTtBQUNsQix5R0FBQSxlQUFlLE9BQUE7QUFHakIsb0JBQW9CO0FBQ3BCLDZDQUEyRDtBQUFsRCx5R0FBQSxZQUFZLE9BQWMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNvY2hEQiBOb2RlLmpzIFNESyB2MC41LjNcbiAqIFxuICogRHVhbC1tb2RlIGFyY2hpdGVjdHVyZTogRW1iZWRkZWQgKEZGSSkgKyBTZXJ2ZXIgKGdSUEMvSVBDKVxuICogXG4gKiBBcmNoaXRlY3R1cmU6IEZsZXhpYmxlIERlcGxveW1lbnRcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFRoaXMgU0RLIHN1cHBvcnRzIEJPVEggbW9kZXM6XG4gKiBcbiAqIDEuIEVtYmVkZGVkIE1vZGUgKEZGSSkgLSBGb3Igc2luZ2xlLXByb2Nlc3MgYXBwczpcbiAqICAgIC0gRGlyZWN0IEZGSSBiaW5kaW5ncyB0byBSdXN0IGxpYnJhcmllc1xuICogICAgLSBObyBzZXJ2ZXIgcmVxdWlyZWQgLSBqdXN0IG5wbSBpbnN0YWxsIGFuZCBydW5cbiAqICAgIC0gQmVzdCBmb3I6IExvY2FsIGRldmVsb3BtZW50LCBzaW1wbGUgYXBwc1xuICogXG4gKiAyLiBDb25jdXJyZW50IE1vZGUgKEZGSSkgLSBGb3IgbXVsdGktcHJvY2VzcyBhcHBzOlxuICogICAgLSBTYW1lIEZGSSBiaW5kaW5ncyB3aXRoIE1WQ0MgZm9yIGNvbmN1cnJlbnQgYWNjZXNzXG4gKiAgICAtIE11bHRpcGxlIE5vZGUuanMgcHJvY2Vzc2VzIGNhbiBhY2Nlc3Mgc2FtZSBkYXRhYmFzZVxuICogICAgLSBCZXN0IGZvcjogUE0yIGNsdXN0ZXIsIEV4cHJlc3Mgd29ya2Vyc1xuICogXG4gKiAzLiBTZXJ2ZXIgTW9kZSAoZ1JQQy9JUEMpIC0gRm9yIGRpc3RyaWJ1dGVkIHN5c3RlbXM6XG4gKiAgICAtIFRoaW4gY2xpZW50IGNvbm5lY3RpbmcgdG8gc29jaGRiLWdycGMgc2VydmVyXG4gKiAgICAtIEJlc3QgZm9yOiBQcm9kdWN0aW9uLCBtdWx0aS1sYW5ndWFnZSwgc2NhbGFiaWxpdHlcbiAqIFxuICogQGV4YW1wbGUgRW1iZWRkZWQgTW9kZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tICdAc29jaGRiL3NvY2hkYic7XG4gKiBcbiAqIC8vIERpcmVjdCBGRkkgLSBubyBzZXJ2ZXIgbmVlZGVkXG4gKiBjb25zdCBkYiA9IGF3YWl0IERhdGFiYXNlLm9wZW4oJy4vbXlkYicpO1xuICogYXdhaXQgZGIucHV0KEJ1ZmZlci5mcm9tKCdrZXknKSwgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYXdhaXQgZGIuY2xvc2UoKTtcbiAqIGBgYFxuICogXG4gKiBAZXhhbXBsZSBDb25jdXJyZW50IE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IERhdGFiYXNlIH0gZnJvbSAnQHNvY2hkYi9zb2NoZGInO1xuICogXG4gKiAvLyBNdWx0aXBsZSBwcm9jZXNzZXMgY2FuIGFjY2VzcyBzaW11bHRhbmVvdXNseVxuICogY29uc3QgZGIgPSBEYXRhYmFzZS5vcGVuQ29uY3VycmVudCgnLi9teWRiJyk7XG4gKiBjb25zb2xlLmxvZyhgQ29uY3VycmVudDogJHtkYi5pc0NvbmN1cnJlbnR9YCk7XG4gKiBgYGBcbiAqIFxuICogQGV4YW1wbGUgU2VydmVyIE1vZGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IFNvY2hEQkNsaWVudCB9IGZyb20gJ0Bzb2NoZGIvc29jaGRiJztcbiAqIFxuICogLy8gQ29ubmVjdCB0byBzZXJ2ZXJcbiAqIGNvbnN0IGNsaWVudCA9IG5ldyBTb2NoREJDbGllbnQoeyBhZGRyZXNzOiAnbG9jYWxob3N0OjUwMDUxJyB9KTtcbiAqIGF3YWl0IGNsaWVudC5wdXRLdigna2V5JywgQnVmZmVyLmZyb20oJ3ZhbHVlJykpO1xuICogYGBgXG4gKi9cblxuLy8gVmVyc2lvblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnMC41LjMnO1xuXG4vLyBFbWJlZGRlZCBtb2RlIChGRkkpIC0gTkVXXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlLCBFbWJlZGRlZERhdGFiYXNlQ29uZmlnIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBFbWJlZGRlZFRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5leHBvcnQgeyBIbnN3SW5kZXgsIEhuc3dDb25maWcsIEhuc3dCaW5kaW5ncyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuZXhwb3J0IHsgU2VhcmNoUmVzdWx0IGFzIEhuc3dTZWFyY2hSZXN1bHQgfSBmcm9tICcuL2VtYmVkZGVkJztcblxuLy8gRW1iZWRkZWQgbW9kZSAoRkZJKSAtIENvbnZlbmllbmNlIGFsaWFzXG5leHBvcnQgeyBFbWJlZGRlZERhdGFiYXNlIGFzIERhdGFiYXNlIH0gZnJvbSAnLi9lbWJlZGRlZCc7XG5cbi8vIEVtYmVkZGVkIG1vZGUgKEZGSSkgLSBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGNvbmN1cnJlbnQgbW9kZVxuaW1wb3J0IHsgRW1iZWRkZWREYXRhYmFzZSwgRW1iZWRkZWREYXRhYmFzZUNvbmZpZyB9IGZyb20gJy4vZW1iZWRkZWQnO1xuXG4vKipcbiAqIE9wZW4gYSBkYXRhYmFzZSBpbiBjb25jdXJyZW50IG1vZGUgKG11bHRpLXByb2Nlc3Mgc2FmZSkuXG4gKiBBbGlhcyBmb3IgRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudCgpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuQ29uY3VycmVudChwYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7IGZhbGxiYWNrVG9TdGFuZGFyZD86IGJvb2xlYW4gfSk6IEVtYmVkZGVkRGF0YWJhc2Uge1xuICByZXR1cm4gRW1iZWRkZWREYXRhYmFzZS5vcGVuQ29uY3VycmVudChwYXRoLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBPcGVuIGEgZGF0YWJhc2UgaW4gc3RhbmRhcmQgbW9kZS5cbiAqIEFsaWFzIGZvciBFbWJlZGRlZERhdGFiYXNlLm9wZW4oKVxuICovXG5leHBvcnQgZnVuY3Rpb24gb3BlbihwYXRoOiBzdHJpbmcsIGNvbmZpZz86IEVtYmVkZGVkRGF0YWJhc2VDb25maWcpOiBFbWJlZGRlZERhdGFiYXNlIHtcbiAgcmV0dXJuIEVtYmVkZGVkRGF0YWJhc2Uub3BlbihwYXRoLCBjb25maWcpO1xufVxuXG4vLyBOYW1lc3BhY2UgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBOYW1lc3BhY2UsXG4gIENvbGxlY3Rpb24sXG4gIERpc3RhbmNlTWV0cmljLFxuICBOYW1lc3BhY2VOb3RGb3VuZEVycm9yLFxuICBOYW1lc3BhY2VFeGlzdHNFcnJvcixcbiAgQ29sbGVjdGlvbk5vdEZvdW5kRXJyb3IsXG4gIENvbGxlY3Rpb25FeGlzdHNFcnJvcixcbn0gZnJvbSAnLi9uYW1lc3BhY2UnO1xuZXhwb3J0IHR5cGUge1xuICBOYW1lc3BhY2VDb25maWcsXG4gIENvbGxlY3Rpb25Db25maWcsXG4gIFNlYXJjaFJlcXVlc3QsXG4gIFNlYXJjaFJlc3VsdCBhcyBOYW1lc3BhY2VTZWFyY2hSZXN1bHQsXG59IGZyb20gJy4vbmFtZXNwYWNlJztcblxuLy8gUXVldWUgQVBJICh2MC40LjEpXG5leHBvcnQge1xuICBQcmlvcml0eVF1ZXVlLFxuICBUYXNrU3RhdGUsXG4gIGNyZWF0ZVF1ZXVlLFxufSBmcm9tICcuL3F1ZXVlJztcbmV4cG9ydCB0eXBlIHtcbiAgUXVldWVDb25maWcsXG4gIFF1ZXVlS2V5LFxuICBUYXNrLFxuICBRdWV1ZVN0YXRzLFxufSBmcm9tICcuL3F1ZXVlJztcblxuLy8gU2VtYW50aWMgQ2FjaGUgKHYwLjQuMSlcbmV4cG9ydCB7XG4gIFNlbWFudGljQ2FjaGUsXG59IGZyb20gJy4vc2VtYW50aWMtY2FjaGUnO1xuZXhwb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhpdCxcbiAgQ2FjaGVTdGF0cyxcbn0gZnJvbSAnLi9zZW1hbnRpYy1jYWNoZSc7XG5cbi8vIENvbnRleHQgQnVpbGRlciAodjAuNC4xKVxuZXhwb3J0IHtcbiAgQ29udGV4dFF1ZXJ5QnVpbGRlcixcbiAgQ29udGV4dE91dHB1dEZvcm1hdCxcbiAgVHJ1bmNhdGlvblN0cmF0ZWd5LFxuICBjcmVhdGVDb250ZXh0QnVpbGRlcixcbn0gZnJvbSAnLi9jb250ZXh0LWJ1aWxkZXInO1xuZXhwb3J0IHR5cGUge1xuICBDb250ZXh0UmVzdWx0LFxufSBmcm9tICcuL2NvbnRleHQtYnVpbGRlcic7XG5cbi8vIE1lbW9yeSBTeXN0ZW0gKHYwLjQuMilcbmV4cG9ydCB7XG4gIEV4dHJhY3Rpb25QaXBlbGluZSxcbiAgQ29uc29saWRhdG9yLFxuICBIeWJyaWRSZXRyaWV2ZXIsXG4gIEFsbG93ZWRTZXQsXG59IGZyb20gJy4vbWVtb3J5JztcbmV4cG9ydCB0eXBlIHtcbiAgRW50aXR5LFxuICBSZWxhdGlvbixcbiAgQXNzZXJ0aW9uLFxuICBSYXdBc3NlcnRpb24sXG4gIENhbm9uaWNhbEZhY3QsXG4gIEV4dHJhY3Rpb25SZXN1bHQsXG4gIEV4dHJhY3Rpb25TY2hlbWEsXG4gIENvbnNvbGlkYXRpb25Db25maWcsXG4gIFJldHJpZXZhbENvbmZpZyxcbiAgUmV0cmlldmFsUmVzdWx0LFxuICBSZXRyaWV2YWxSZXNwb25zZSxcbn0gZnJvbSAnLi9tZW1vcnknO1xuXG4vLyBNQ1AgLSBNb2RlbCBDb250ZXh0IFByb3RvY29sICh2MC40LjMpXG5leHBvcnQge1xuICBNY3BTZXJ2ZXIsXG4gIE1jcENsaWVudCxcbiAgTWNwRXJyb3IsXG4gIE1DUF9FUlJPUl9DT0RFUyxcbn0gZnJvbSAnLi9tY3AnO1xuZXhwb3J0IHR5cGUge1xuICBNY3BUb29sLFxuICBNY3BUb29sQ2FsbCxcbiAgTWNwVG9vbFJlc3VsdCxcbiAgTWNwUmVzb3VyY2UsXG4gIE1jcFJlc291cmNlQ29udGVudCxcbiAgTWNwUHJvbXB0LFxuICBNY3BQcm9tcHRBcmd1bWVudCxcbiAgTWNwUHJvbXB0TWVzc2FnZSxcbiAgTWNwU2VydmVyQ2FwYWJpbGl0aWVzLFxuICBNY3BTZXJ2ZXJDb25maWcsXG4gIE1jcENsaWVudENvbmZpZyxcbiAgTWNwVHJhbnNwb3J0LFxufSBmcm9tICcuL21jcCc7XG5cbi8vIFBvbGljeSBTZXJ2aWNlICh2MC40LjMpXG5leHBvcnQge1xuICBQb2xpY3lTZXJ2aWNlLFxufSBmcm9tICcuL3BvbGljeSc7XG5leHBvcnQgdHlwZSB7XG4gIFBvbGljeVJ1bGUsXG4gIFBvbGljeUNvbmRpdGlvbixcbiAgUG9saWN5RXZhbHVhdGlvbixcbiAgTmFtZXNwYWNlUG9saWN5LFxuICBOYW1lc3BhY2VHcmFudCxcbiAgTmFtZXNwYWNlUGVybWlzc2lvbixcbiAgUG9saWN5QWN0aW9uLFxuICBQb2xpY3lSZXF1ZXN0LFxuICBQb2xpY3lTZXQsXG4gIFBvbGljeUF1ZGl0RW50cnksXG59IGZyb20gJy4vcG9saWN5JztcblxuLy8gU2VydmVyIG1vZGUgKGdSUEMvSVBDKVxuZXhwb3J0IHsgU29jaERCQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG5leHBvcnQgdHlwZSB7XG4gIFNlYXJjaFJlc3VsdCxcbiAgRG9jdW1lbnQsXG4gIEdyYXBoTm9kZSxcbiAgR3JhcGhFZGdlLFxufSBmcm9tICcuL2dycGMtY2xpZW50JztcblxuZXhwb3J0IHsgSXBjQ2xpZW50IH0gZnJvbSAnLi9pcGMtY2xpZW50JztcblxuLy8gRm9ybWF0IHV0aWxpdGllc1xuZXhwb3J0IHtcbiAgV2lyZUZvcm1hdCxcbiAgQ29udGV4dEZvcm1hdCxcbiAgQ2Fub25pY2FsRm9ybWF0LFxuICBGb3JtYXRDYXBhYmlsaXRpZXMsXG4gIEZvcm1hdENvbnZlcnNpb25FcnJvcixcbn0gZnJvbSAnLi9mb3JtYXQnO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5leHBvcnQgeyBRdWVyeSB9IGZyb20gJy4vcXVlcnknO1xuZXhwb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCB9IGZyb20gJy4vcXVlcnknO1xuXG5leHBvcnQge1xuICBTb2NoREJFcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBUcmFuc2FjdGlvbkVycm9yLFxuICBQcm90b2NvbEVycm9yLFxuICBEYXRhYmFzZUVycm9yLFxuICAvLyBMb2NrIGVycm9ycyAodjAuNC4xKVxuICBFcnJvckNvZGUsXG4gIExvY2tFcnJvcixcbiAgRGF0YWJhc2VMb2NrZWRFcnJvcixcbiAgTG9ja1RpbWVvdXRFcnJvcixcbiAgRXBvY2hNaXNtYXRjaEVycm9yLFxuICBTcGxpdEJyYWluRXJyb3IsXG59IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQ29udmVuaWVuY2UgYWxpYXNcbmV4cG9ydCB7IFNvY2hEQkNsaWVudCBhcyBHcnBjQ2xpZW50IH0gZnJvbSAnLi9ncnBjLWNsaWVudCc7XG4iXX0=