@ultipa-graph/ultipa-driver 6.2.1 → 6.2.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.
package/dist/client.js CHANGED
@@ -356,13 +356,101 @@ class GqldbClient {
356
356
  async insertEdgesBatchAuto(graphName, edges, config) {
357
357
  return this.dataService.insertEdges(graphName, edges, config);
358
358
  }
359
- /** Delete nodes from a graph */
360
- async deleteNodes(graphName, nodeIds, labels, where) {
361
- return this.dataService.deleteNodes(graphName, nodeIds, labels, where);
359
+ /**
360
+ * Delete nodes by id list. Emits
361
+ * `MATCH (n) WHERE id(n) IN [...] DETACH DELETE n RETURN n`.
362
+ *
363
+ * Empty/null `nodeIds` short-circuits without contacting the server.
364
+ *
365
+ * @returns Response with one row per actually-deleted node, column
366
+ * "n" holding the GqldbNode. Use `response.alias("n").asNodes()`.
367
+ * With `returnDeleted=false` the response carries only
368
+ * `rowsAffected`; rows is empty.
369
+ */
370
+ async deleteNodesByIds(nodeIds, config) {
371
+ const cfg = { returnDeleted: true, allowDeleteAll: false, ...config };
372
+ if (!nodeIds || nodeIds.length === 0) {
373
+ return new response_1.Response([], [], 0, false, [], 0);
374
+ }
375
+ let gql = `MATCH (n) WHERE id(n) IN [${formatStringList(nodeIds)}] DETACH DELETE n`;
376
+ if (cfg.returnDeleted !== false)
377
+ gql += ' RETURN n';
378
+ return this.gql(gql, cfg);
379
+ }
380
+ /**
381
+ * Delete nodes matching labels and/or where clause. Emits
382
+ * `MATCH (n:L1|L2) WHERE <where> DETACH DELETE n RETURN n`.
383
+ *
384
+ * Throws if both labels and where are empty unless
385
+ * `config.allowDeleteAll = true`.
386
+ */
387
+ async deleteNodesByCondition(labels, where, limit, config) {
388
+ const cfg = { returnDeleted: true, allowDeleteAll: false, ...config };
389
+ const noLabels = !labels || labels.length === 0;
390
+ const noWhere = !where || !where.trim();
391
+ if (noLabels && noWhere && !cfg.allowDeleteAll) {
392
+ throw new Error('deleteNodesByCondition with no labels and no where would delete every '
393
+ + 'node in the graph. If this is intentional, set DeleteConfig.allowDeleteAll = true.');
394
+ }
395
+ let gql = 'MATCH (n';
396
+ if (!noLabels)
397
+ gql += ':' + labels.map(l => `\`${l}\``).join('|');
398
+ gql += ')';
399
+ if (!noWhere)
400
+ gql += ' WHERE ' + where;
401
+ if (limit !== undefined && limit > 0)
402
+ gql += ` LIMIT ${limit}`;
403
+ gql += ' DETACH DELETE n';
404
+ if (cfg.returnDeleted !== false)
405
+ gql += ' RETURN n';
406
+ return this.gql(gql, cfg);
407
+ }
408
+ /**
409
+ * Delete edges by id list. Emits 5-column GQL with `id(e)` so the
410
+ * same emit works on graphs with or without EDGE_ID enabled, then
411
+ * reshapes the response into a single "e" column holding GqldbEdge.
412
+ */
413
+ async deleteEdgesByIds(edgeIds, config) {
414
+ const cfg = { returnDeleted: true, allowDeleteAll: false, ...config };
415
+ if (!edgeIds || edgeIds.length === 0) {
416
+ return new response_1.Response([], [], 0, false, [], 0);
417
+ }
418
+ let gql = `MATCH ()-[e]->() WHERE id(e) IN [${formatStringList(edgeIds)}] DELETE e`;
419
+ if (cfg.returnDeleted !== false) {
420
+ gql += ' RETURN id(e), e._from, e._to, labels(e)[0], properties(e)';
421
+ }
422
+ const raw = await this.gql(gql, cfg);
423
+ return cfg.returnDeleted === false ? raw : reshapeEdgeDelete(raw);
362
424
  }
363
- /** Delete edges from a graph */
364
- async deleteEdges(graphName, edgeIds, label, where) {
365
- return this.dataService.deleteEdges(graphName, edgeIds, label, where);
425
+ /**
426
+ * Delete edges matching label and/or where. Emits 5-column GQL,
427
+ * then reshapes into a single "e" column.
428
+ *
429
+ * Throws if both label and where are empty unless
430
+ * `config.allowDeleteAll = true`.
431
+ */
432
+ async deleteEdgesByCondition(label, where, limit, config) {
433
+ const cfg = { returnDeleted: true, allowDeleteAll: false, ...config };
434
+ const noLabel = !label;
435
+ const noWhere = !where || !where.trim();
436
+ if (noLabel && noWhere && !cfg.allowDeleteAll) {
437
+ throw new Error('deleteEdgesByCondition with no label and no where would delete every '
438
+ + 'edge in the graph. If this is intentional, set DeleteConfig.allowDeleteAll = true.');
439
+ }
440
+ let gql = 'MATCH ()-[e';
441
+ if (!noLabel)
442
+ gql += `:\`${label}\``;
443
+ gql += ']->()';
444
+ if (!noWhere)
445
+ gql += ' WHERE ' + where;
446
+ if (limit !== undefined && limit > 0)
447
+ gql += ` LIMIT ${limit}`;
448
+ gql += ' DELETE e';
449
+ if (cfg.returnDeleted !== false) {
450
+ gql += ' RETURN id(e), e._from, e._to, labels(e)[0], properties(e)';
451
+ }
452
+ const raw = await this.gql(gql, cfg);
453
+ return cfg.returnDeleted === false ? raw : reshapeEdgeDelete(raw);
366
454
  }
367
455
  /**
368
456
  * Export graph data in JSON Lines format (streaming).
@@ -962,7 +1050,15 @@ class GqldbClient {
962
1050
  const edge = edges[i];
963
1051
  const varName = `e${i}`;
964
1052
  const labelPart = edge.label ? ':' + GqldbClient.quoteLabel(edge.label) : '';
965
- const propStr = (0, types_1.buildPropertiesValueString)(edge.properties);
1053
+ // Build properties including _id if set — mirrors the node
1054
+ // emitter. The server's GQL parser accepts
1055
+ // `[e0:Knows {_id:'...', ...}]` and stores the edge id verbatim
1056
+ // when EDGE_ID is enabled on the graph.
1057
+ let props = edge.properties;
1058
+ if (edge.id && edge.id.length > 0) {
1059
+ props = { _id: edge.id, ...(edge.properties ?? {}) };
1060
+ }
1061
+ const propStr = (0, types_1.buildPropertiesValueString)(props);
966
1062
  const edgePart = propStr ? `[${varName}${labelPart} ${propStr}]` : `[${varName}${labelPart}]`;
967
1063
  const gqlStr = `MATCH (src WHERE id(src) = '${edge.fromNodeId}'), `
968
1064
  + `(dst WHERE id(dst) = '${edge.toNodeId}') `
@@ -1405,4 +1501,43 @@ function parseGraphStats(resp) {
1405
1501
  }
1406
1502
  return gs;
1407
1503
  }
1408
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBV29CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBNENpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBMkMxQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUE0QjtJQUN4RCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxrQkFBVSxDQUFDLFNBQVM7WUFDdkIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixLQUFLLGtCQUFVLENBQUMsTUFBTTtZQUNwQixPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQWEsV0FBVztJQUNkLE1BQU0sQ0FBYztJQUNwQixPQUFPLENBQWlCO0lBQ3hCLFFBQVEsQ0FBaUI7SUFDekIsU0FBUyxDQUFxQjtJQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXZCLHdDQUF3QztJQUNoQyxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUVqQyxvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVB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LFFBQVEsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlDLElBQUksUUFBUSxHQUFHLENBQUM7UUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRS9CLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFaEYsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbkMsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDeEUsSUFBSSxHQUFHLENBQUMsVUFBVSxLQUFLLFNBQVM7WUFBRSxFQUFFLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdFLElBQUksR0FBRyxDQUFDLFVBQVUsS0FBSyxTQUFTO1lBQUUsRUFBRSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYWluIGNsaWVudCBmb3IgR1FMREIgTm9kZS5qcyBkcml2ZXIuXG4gKi9cblxuaW1wb3J0ICogYXMgZ3JwYyBmcm9tICdAZ3JwYy9ncnBjLWpzJztcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQgeyBHcWxkYkNvbmZpZywgdmFsaWRhdGVDb25maWcgfSBmcm9tICcuL2NvbmZpZyc7XG5pbXBvcnQgeyBFbXB0eVF1ZXJ5RXJyb3IsIExvZ2luRmFpbGVkRXJyb3IsIFF1ZXJ5RmFpbGVkRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1xuICBSZXNwb25zZSxcbiAgUm93LFxuICBJbnNlcnROb2Rlc1Jlc3VsdCxcbiAgSW5zZXJ0RWRnZXNSZXN1bHQsXG4gIERlbGV0ZVJlc3VsdCxcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXG4gIEV4cG9ydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydENodW5rLFxuICBFeHBvcnRTdGF0cyxcbn0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBHcmFwaEluZm8sXG4gIEdyYXBoVHlwZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVN0YXRzLFxuICBDYWNoZVR5cGUsXG4gIFN0YXRpc3RpY3MsXG4gIENvbXBhY3RSZXN1bHQsXG4gIENvbXB1dGVUb3BvbG9neVJlc3VsdCxcbiAgU3lzdGVtTWV0cmljcyxcbiAgTm9kZURhdGEsXG4gIEVkZ2VEYXRhLFxuICBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zLFxuICBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zLFxuICBCdWxrSW1wb3J0T3B0aW9ucyxcbiAgQnVsa0ltcG9ydFNlc3Npb24sXG4gIENoZWNrcG9pbnRSZXN1bHQsXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEFib3J0QnVsa0ltcG9ydFJlc3VsdCxcbiAgQnVsa0ltcG9ydFN0YXR1cyxcbiAgVHJhbnNhY3Rpb25JbmZvLFxuICBUcmFuc2FjdGlvblJvdyxcbiAgREJUeXBlLFxuICBJbnNlcnRUeXBlLFxuICBMYWJlbEluZm8sXG4gIE5vZGVUeXBlSW5mbyxcbiAgRWRnZVR5cGVJbmZvLFxuICBMYWJlbERlZixcbiAgQ29udlByb3BlcnR5RGVmLFxuICBJbmRleFByb3BlcnR5LFxuICBJbmRleEluZm8sXG4gIEZ1bGx0ZXh0SW5mbyxcbiAgVGFza0luZm8sXG4gIFByb2Nlc3NJbmZvLFxuICBHcmFwaFN0YXRzLFxuICBBbGdvSW5mbyxcbiAgQWlTdGFnZSxcbiAgQWlSZWFkUmVzdWx0LFxuICBwYXJzZVByb3BlcnR5U3RyaW5nLFxuICBidWlsZFByb3BlcnR5RGVmU3RyaW5nLFxuICBidWlsZEluZGV4UHJvcGVydHlTdHJpbmcsXG4gIGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nLFxuICB1c2VHcmFwaFByZWZpeCxcbiAgZGJUeXBlVG9LZXl3b3JkLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZVNlcnZpY2VDbGllbnRzLCBwcm9taXNpZnlDYWxsLCBwcm9taXNpZnlDYWxsV2l0aERlYWRsaW5lIH0gZnJvbSAnLi9zZXJ2aWNlcyc7XG5pbXBvcnQge1xuICBTZXJ2aWNlQ29udGV4dCxcbiAgU2VydmljZUNsaWVudHMsXG4gIFNlc3Npb25TZXJ2aWNlLFxuICBRdWVyeVNlcnZpY2UsXG4gIEdyYXBoU2VydmljZSxcbiAgVHJhbnNhY3Rpb25TZXJ2aWNlLFxuICBEYXRhU2VydmljZSxcbiAgSGVhbHRoU2VydmljZSxcbiAgQWRtaW5TZXJ2aWNlLFxuICBCdWxrSW1wb3J0U2VydmljZSxcbn0gZnJvbSAnLi9zZXJ2aWNlcy9pbmRleCc7XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBhIHF1ZXJ5ICovXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q29uZmlnIHtcbiAgZ3JhcGhOYW1lPzogc3RyaW5nO1xuICBwYXJhbWV0ZXJzPzogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgdHJhbnNhY3Rpb25JZD86IG51bWJlcjtcbiAgdGltZW91dD86IG51bWJlcjtcbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuICAvKiogTWF4IHBhdGhzIHRvIHJldHVybiBmcm9tIHBhdGggcXVlcmllcyAoMCA9IHVubGltaXRlZCkgKi9cbiAgbWF4UGF0aFJlc3VsdHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0Tm9kZXMgLyBpbnNlcnRFZGdlcyBjb252ZW5pZW5jZSBtZXRob2RzLlxuICogRXh0ZW5kcyBRdWVyeUNvbmZpZyB3aXRoIGluc2VydC1zcGVjaWZpYyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydENvbmZpZyBleHRlbmRzIFF1ZXJ5Q29uZmlnIHtcbiAgLyoqIEluc2VydCBtb2RlLiBEZWZhdWx0cyB0byBJbnNlcnRUeXBlLk5vcm1hbCB3aGVuIG9taXR0ZWQuICovXG4gIGluc2VydFR5cGU/OiBJbnNlcnRUeXBlO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0IG5vZGVzICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydE5vZGVzQ29uZmlnIHtcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XG4gIGJ1bGtJbXBvcnRTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgZWRnZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0RWRnZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWFsdGggd2F0Y2hlciBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZyBoZWFsdGggdXBkYXRlcy5cbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1hcCBhbiBgSW5zZXJ0VHlwZWAgdmFsdWUgdG8gdGhlIEdRTCBrZXl3b3JkKHMpIHNlbGVjdGluZyB0aGVcbiAqIG1hdGNoaW5nIHNlcnZlci1zaWRlIHNlbWFudGljcy5cbiAqXG4gKiAgIC0gYEluc2VydFR5cGUuTm9ybWFsYCAgICAtPiBgXCJJTlNFUlRcImAgKGVycm9yIG9uIGR1cGxpY2F0ZSBgX2lkYClcbiAqICAgLSBgSW5zZXJ0VHlwZS5PdmVyd3JpdGVgIC0+IGBcIklOU0VSVCBPVkVSV1JJVEVcImAgKHJlcGxhY2Ugb24gZHVwbGljYXRlKVxuICogICAtIGBJbnNlcnRUeXBlLlVwc2VydGAgICAgLT4gYFwiVVBTRVJUXCJgIChtZXJnZSBvbiBkdXBsaWNhdGUpXG4gKlxuICogYE92ZXJ3cml0ZWAgYW5kIGBVcHNlcnRgIGFyZSBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIGV4aXN0aW5nIHJvd3M7XG4gKiB0aGV5IGFyZSBOT1QgaW50ZXJjaGFuZ2VhYmxlLiBTZWUge0BsaW5rIEluc2VydFR5cGV9IGRvY3MuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEtleXdvcmRGb3JUeXBlKHR5cGU6IEluc2VydFR5cGUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEluc2VydFR5cGUuT3ZlcndyaXRlOlxuICAgICAgcmV0dXJuICdJTlNFUlQgT1ZFUldSSVRFJztcbiAgICBjYXNlIEluc2VydFR5cGUuVXBzZXJ0OlxuICAgICAgcmV0dXJuICdVUFNFUlQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ0lOU0VSVCc7XG4gIH1cbn1cblxuLyoqIE1haW4gY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIEdRTERCICovXG5leHBvcnQgY2xhc3MgR3FsZGJDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogR3FsZGJDb25maWc7XG4gIHByaXZhdGUgY2xpZW50czogU2VydmljZUNsaWVudHM7XG4gIHByaXZhdGUgc2Vzc2lvbnM6IFNlc3Npb25NYW5hZ2VyO1xuICBwcml2YXRlIHR4TWFuYWdlcjogVHJhbnNhY3Rpb25NYW5hZ2VyO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIC8vIFN0b3JlZCBjcmVkZW50aWFscyBmb3IgYXV0by1yZWNvbm5lY3RcbiAgcHJpdmF0ZSBzdG9yZWRVc2VybmFtZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHN0b3JlZEdyYXBoOiBzdHJpbmcgPSAnJztcblxuICAvLyBTZXJ2aWNlIGluc3RhbmNlc1xuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcbiAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcbiAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IEdyYXBoU2VydmljZTtcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgaGVhbHRoU2VydmljZTogSGVhbHRoU2VydmljZTtcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcbiAgcHJpdmF0ZSBidWxrSW1wb3J0U2VydmljZTogQnVsa0ltcG9ydFNlcnZpY2U7XG5cbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbk1ldGFkYXRhKCk6IGdycGMuTWV0YWRhdGEge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgbWV0YWRhdGEuYWRkKCdzZXNzaW9uLWlkJywgc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnKTtcbiAgICBpZiAodGhpcy5jbGllbnRTZXNzaW9uSWQpIHtcbiAgICAgIG1ldGFkYXRhLmFkZCgneC11bHRpcGEtc2Vzc2lvbi1pZCcsIHRoaXMuY2xpZW50U2Vzc2lvbklkKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWJsZSBwZXItY2xpZW50IGxvZ2ljYWwgc2Vzc2lvbiBpZCBzdXJmYWNlZCB1bmRlciB0aGVcbiAgICogdHJhbnNhY3Rpb24tYnJhbmNoIG1vZGVsLiBTZWUgVFJBTlNBQ1RJT05TX0RSSVZFUl9HVUlERS5tZCDCpzIuMOKAkzIuMS5cbiAgICogRmFsbHMgYmFjayB0byBhIFVVSUQgdjQgaGV4IGdlbmVyYXRlZCBhdCBjb25zdHJ1Y3Rpb24gd2hlblxuICAgKiBgY29uZmlnLnNlc3Npb25JZGAgaXMgbm90IHNldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnRTZXNzaW9uSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdxbGRiQ29uZmlnKSB7XG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XG4gICAgLy8gQm9vdHN0cmFwIHN0YWJsZSBwZXItY2xpZW50IHNlc3Npb24gaWQgKHVzZWQgYXMgYHgtdWx0aXBhLXNlc3Npb24taWRgXG4gICAgLy8gbWV0YWRhdGEgd2hlbiDCpzIuMSBvcHQtaW4gaXMgZW5hYmxlZCwgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IFRyYW5zYWN0aW9uKS5cbiAgICBjb25zdCBjZmdTaWQgPSAoY29uZmlnIGFzIGFueSkuc2Vzc2lvbklkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsaWVudFNlc3Npb25JZCA9IGNmZ1NpZCAmJiBjZmdTaWQubGVuZ3RoID4gMFxuICAgICAgPyBjZmdTaWRcbiAgICAgIDogcmVxdWlyZSgnY3J5cHRvJykucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIENyZWF0ZSBnUlBDIGNyZWRlbnRpYWxzXG4gICAgbGV0IGNyZWRlbnRpYWxzOiBncnBjLkNoYW5uZWxDcmVkZW50aWFscztcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2woKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uczogZ3JwYy5DaGFubmVsT3B0aW9ucyA9IHtcbiAgICAgICdncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDY0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA2NCAqIDEwMjQgKiAxMDI0LFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVfbXMnOiAzMDAwMCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lb3V0X21zJzogMTAwMDAsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfcGVybWl0X3dpdGhvdXRfY2FsbHMnOiAxLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgc2VydmljZSBjbGllbnRzIGZvciB0aGUgZmlyc3QgaG9zdFxuICAgIGNvbnN0IGhvc3QgPSBjb25maWcuaG9zdHNbMF07XG4gICAgdGhpcy5jbGllbnRzID0gY3JlYXRlU2VydmljZUNsaWVudHMoaG9zdCwgY3JlZGVudGlhbHMsIG9wdGlvbnMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2aWNlIGNvbnRleHRcbiAgICBjb25zdCBjdHggPSBuZXcgU2VydmljZUNvbnRleHQodGhpcy5jb25maWcsIHRoaXMuc2Vzc2lvbnMsIHRoaXMudHhNYW5hZ2VyLCB0aGlzLmNsaWVudHMsIHRoaXMuY2xpZW50U2Vzc2lvbklkKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICAgIC8vIFN0b3JlIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICAgIHRoaXMuc3RvcmVkVXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnN0b3JlZFBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBmbiBhbmQgYXV0by1yZWNvbm5lY3Qgb24gVU5BVVRIRU5USUNBVEVEIGVycm9yLlxuICAgKiBJZiBmbiB0aHJvd3MgYW4gVU5BVVRIRU5USUNBVEVEIGdSUEMgZXJyb3IgYW5kIGNyZWRlbnRpYWxzIGFyZSBzdG9yZWQsXG4gICAqIHJlLWxvZ2luIGFuZCByZXRyeSBmbiBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQXV0b1JlY29ubmVjdDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZ0xvd2VyID0gZT8ubWVzc2FnZSA/IFN0cmluZyhlLm1lc3NhZ2UpLnRvTG93ZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGlzVW5hdXRoZW50aWNhdGVkID1cbiAgICAgICAgKGU/LmNvZGUgPT09IGdycGMuc3RhdHVzLlVOQVVUSEVOVElDQVRFRCkgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3VuYXV0aGVudGljYXRlZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIG5vdCBmb3VuZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIGV4cGlyZWQnKTtcbiAgICAgIGlmIChpc1VuYXV0aGVudGljYXRlZCAmJiB0aGlzLnN0b3JlZFVzZXJuYW1lKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBncmFwaCBjb250ZXh0IGJlZm9yZSByZS1sb2dpblxuICAgICAgICBjb25zdCBzYXZlZEdyYXBoID0gdGhpcy5zdG9yZWRHcmFwaDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKHRoaXMuc3RvcmVkVXNlcm5hbWUsIHRoaXMuc3RvcmVkUGFzc3dvcmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBlOyAvLyBSZXR1cm4gb3JpZ2luYWwgZXJyb3IgaWYgcmUtbG9naW4gZmFpbHNcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0b3JlIGdyYXBoIGNvbnRleHQgYWZ0ZXIgcmUtbG9naW5cbiAgICAgICAgaWYgKHNhdmVkR3JhcGggJiYgc2F2ZWRHcmFwaCAhPT0gJ19fc3lzdGVtX18nKSB7XG4gICAgICAgICAgdHJ5IHsgYXdhaXQgdGhpcy51c2VHcmFwaChzYXZlZEdyYXBoKTsgfSBjYXRjaCB7IC8qIGJlc3QgZWZmb3J0ICovIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oKTsgLy8gUmV0cnkgb25jZVxuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGVybWluYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLmxvZ291dCgpO1xuICB9XG5cbiAgLyoqIENoZWNrIHRoZSBjb25uZWN0aW9uIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBRdWVyeSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqL1xuICBhc3luYyBncWwocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cbiAgYXN5bmMgZ3FsU3RyZWFtKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXG4gICAgY2FsbGJhY2s/OiAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmdxbFN0cmVhbShxdWVyeSwgY29uZmlnLCBjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cbiAgYXN5bmMgZXhwbGFpbihxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZXhwbGFpbihxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIHF1ZXJ5IHdpdGggcHJvZmlsaW5nIGFuZCByZXR1cm4gc3RhdGlzdGljcyAqL1xuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHcmFwaCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgZ3JhcGggKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGgoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSBncmFwaCAqL1xuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmRyb3BHcmFwaChuYW1lLCBpZkV4aXN0cyk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjdXJyZW50IGdyYXBoIGZvciB0aGUgc2Vzc2lvbiAqL1xuICBhc3luYyB1c2VHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdyYXBoU2VydmljZS51c2VHcmFwaChuYW1lKTtcbiAgICB0aGlzLnN0b3JlZEdyYXBoID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBncmFwaHMgKi9cbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmxpc3RHcmFwaHMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBncmFwaCAqL1xuICBhc3luYyBnZXRHcmFwaEluZm8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxHcmFwaEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zYWN0aW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmJlZ2luVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCByZWFkT25seSwgdGltZW91dCk7XG4gICAgLy8gU3VyZmFjZSB0aGUgcGVyLWNsaWVudCBsb2dpY2FsIHNlc3Npb24gaWQgb24gdGhlIHJldHVybmVkIHR4XG4gICAgLy8gKHRyYW5zYWN0aW9uLWJyYW5jaCBlcmdvbm9taWMsIHNlZSBUUkFOU0FDVElPTlNfRFJJVkVSX0dVSURFLm1kKS5cbiAgICAodHggYXMgYW55KS5jbGllbnRTZXNzaW9uSWQgPSB0aGlzLmNsaWVudFNlc3Npb25JZDtcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQ29tbWl0IGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgY29tbWl0KHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5jb21taXQodHJhbnNhY3Rpb25JZCk7XG4gIH1cblxuICAvKiogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyByb2xsYmFjayh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi9cbiAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucygpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmxpc3RUcmFuc2FjdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2l0aGluIGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGZuOiAodHhJZDogbnVtYmVyKSA9PiBQcm9taXNlPFQ+LFxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLndpdGhUcmFuc2FjdGlvbihncmFwaE5hbWUsIGZuLCByZWFkT25seSk7XG4gIH1cblxuICAvLyAtLS0tIEFkbWluIERETCBzdXJmYWNlICh0cmFuc2FjdGlvbi1icmFuY2gpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgdmlhIHRoZSBHUUwgYWRtaW4gRERMIGBTSE9XIFRSQU5TQUNUSU9OU2AuXG4gICAqIEVhY2ggcm93IG1pcnJvcnMgdGhlIDUtY29sdW1uIHNlcnZlci1zaWRlIHNjaGVtYTpcbiAgICogYHRyYW5zYWN0aW9uSWQgLyBzdGF0dXMgLyByZWFkT25seSAvIHN0YXJ0VGltZSAvIHNlc3Npb25JZGAuXG4gICAqIGBzZXNzaW9uSWRgIGlzIGAnJ2AgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIGF1dG8tZGVyaXZlZCBvbmUgZnJvbSBwZWVyXG4gICAqIGluZm8gb3IgdGhlIGRyaXZlciBleHBsaWNpdGx5IHN1cmZhY2VzIGB4LXVsdGlwYS1zZXNzaW9uLWlkYCBtZXRhZGF0YS5cbiAgICpcbiAgICogRGlzdGluY3QgZnJvbSBgbGlzdFRyYW5zYWN0aW9ucygpYCB3aGljaCB1c2VzIHRoZSBsZWdhY3kgZ1JQQy5cbiAgICovXG4gIGFzeW5jIHNob3dUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJvd1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIFRSQU5TQUNUSU9OUycpO1xuICAgIGNvbnN0IGlkeDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHJlc3AuY29sdW1ucy5mb3JFYWNoKChjLCBpKSA9PiB7IGlkeFtjXSA9IGk7IH0pO1xuICAgIGNvbnN0IHJvd3M6IFRyYW5zYWN0aW9uUm93W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXNwLnJvd3MpIHtcbiAgICAgIGNvbnN0IGdldCA9IChuOiBzdHJpbmcsIGZhbGxiYWNrOiBhbnkgPSAnJykgPT4ge1xuICAgICAgICBjb25zdCBpID0gaWR4W25dO1xuICAgICAgICByZXR1cm4gaSA9PT0gdW5kZWZpbmVkID8gZmFsbGJhY2sgOiAocm93LnZhbHVlc1tpXSBhcyBhbnkpPy52YWx1ZSA/PyByb3cudmFsdWVzW2ldO1xuICAgICAgfTtcbiAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IFN0cmluZyhnZXQoJ3RyYW5zYWN0aW9uX2lkJywgJycpID8/ICcnKSxcbiAgICAgICAgc3RhdHVzOiBTdHJpbmcoZ2V0KCdzdGF0dXMnLCAnJykgPz8gJycpLFxuICAgICAgICByZWFkT25seTogQm9vbGVhbihnZXQoJ3JlYWRfb25seScsIGZhbHNlKSksXG4gICAgICAgIHN0YXJ0VGltZTogU3RyaW5nKGdldCgnc3RhcnRfdGltZScsICcnKSA/PyAnJyksXG4gICAgICAgIHNlc3Npb25JZDogU3RyaW5nKGdldCgnc2Vzc2lvbl9pZCcsICcnKSA/PyAnJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogUm9sbCBiYWNrIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGJ5IGlkIHZpYSBgS0lMTCBUUkFOU0FDVElPTiAnPGlkPidgLlxuICAgKiBgdHJhbnNhY3Rpb25JZGAgaGVyZSBpcyB0aGUgKipzdHJpbmcqKiBpZCBzdXJmYWNlZCBieVxuICAgKiBgc2hvd1RyYW5zYWN0aW9ucygpYCAoZS5nLiBgJ3R4X2EzOTZjNTMxLS4uLidgKSwgZGlzdGluY3QgZnJvbSB0aGVcbiAgICogYG51bWJlcmAgaWQgcmV0dXJuZWQgYnkgYGJlZ2luKClgLlxuICAgKi9cbiAgYXN5bmMga2lsbFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBlc2NhcGVkID0gU3RyaW5nKHRyYW5zYWN0aW9uSWQpLnJlcGxhY2UoLycvZywgXCInJ1wiKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEtJTEwgVFJBTlNBQ1RJT04gJyR7ZXNjYXBlZH0nYCk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbCBiYWNrIGV2ZXJ5IGFjdGl2ZSB0cmFuc2FjdGlvbiB2aWEgYFJFU0VUIFRSQU5TQUNUSU9OU2AuIEFkbWluLW9ubHkuXG4gICAqIEludGVuZGVkIGFzIGFuIGVzY2FwZSBoYXRjaCB3aGVuIGFuIG9ycGhhbiB0eCBibG9ja3MgbmV3IEJFR0lOcy5cbiAgICovXG4gIGFzeW5jIHJlc2V0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoJ1JFU0VUIFRSQU5TQUNUSU9OUycpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERhdGEgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIG5vZGVzIGludG8gYSBncmFwaCB1c2luZyBnUlBDIGJ1bGsgaW5zZXJ0ICovXG4gIGFzeW5jIGluc2VydE5vZGVzQmF0Y2hBdXRvKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhncmFwaE5hbWUsIG5vZGVzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGggdXNpbmcgZ1JQQyBidWxrIGluc2VydCAqL1xuICBhc3luYyBpbnNlcnRFZGdlc0JhdGNoQXV0byhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0RWRnZXMoZ3JhcGhOYW1lLCBlZGdlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgbm9kZXMgZnJvbSBhIGdyYXBoICovXG4gIGFzeW5jIGRlbGV0ZU5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIG5vZGVJZHM/OiBzdHJpbmdbXSxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICB3aGVyZT86IHN0cmluZ1xuICApOiBQcm9taXNlPERlbGV0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmRlbGV0ZU5vZGVzKGdyYXBoTmFtZSwgbm9kZUlkcywgbGFiZWxzLCB3aGVyZSk7XG4gIH1cblxuICAvKiogRGVsZXRlIGVkZ2VzIGZyb20gYSBncmFwaCAqL1xuICBhc3luYyBkZWxldGVFZGdlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBlZGdlSWRzPzogc3RyaW5nW10sXG4gICAgbGFiZWw/OiBzdHJpbmcsXG4gICAgd2hlcmU/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxEZWxldGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5kZWxldGVFZGdlcyhncmFwaE5hbWUsIGVkZ2VJZHMsIGxhYmVsLCB3aGVyZSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGdyYXBoIGRhdGEgaW4gSlNPTiBMaW5lcyBmb3JtYXQgKHN0cmVhbWluZykuXG4gICAqIEBwYXJhbSBjb25maWcgRXhwb3J0IGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZvciBlYWNoIGV4cG9ydGVkIGNodW5rXG4gICAqL1xuICBhc3luYyBleHBvcnQoXG4gICAgY29uZmlnOiBFeHBvcnRDb25maWcsXG4gICAgY2FsbGJhY2s/OiAoY2h1bms6IEV4cG9ydENodW5rKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydChjb25maWcsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gbm9kZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnROb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydE5vZGVzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydE5vZGVzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGhcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0RWRnZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0RWRnZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGVhbHRoIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENoZWNrIHRoZSBoZWFsdGggb2YgYSBzZXJ2aWNlICovXG4gIGFzeW5jIGhlYWx0aENoZWNrKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxIZWFsdGhTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLmhlYWx0aENoZWNrKHNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIGhlYWx0aCBzdGF0dXMgY2hhbmdlcyB2aWEgc2VydmVyLXNpZGUgc3RyZWFtaW5nLlxuICAgKiBSZXR1cm5zIGEgSGVhbHRoV2F0Y2hlciB0aGF0IGVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyB2YWx1ZXMuXG4gICAqIENhbGwgc3RvcCgpIHRvIGNhbmNlbCB0aGUgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSAtIE9wdGlvbmFsIHNlcnZpY2UgbmFtZSB0byB3YXRjaFxuICAgKiBAcmV0dXJucyBIZWFsdGhXYXRjaGVyIC0gRXZlbnRFbWl0dGVyIHdpdGggc3RvcCgpIG1ldGhvZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHdhdGNoZXIgPSBjbGllbnQud2F0Y2goKTtcbiAgICogd2F0Y2hlci5vbignc3RhdHVzJywgKHN0YXR1czogSGVhbHRoU3RhdHVzKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ0hlYWx0aCBzdGF0dXM6Jywgc3RhdHVzKTtcbiAgICogfSk7XG4gICAqIHdhdGNoZXIub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1dhdGNoIGVycm9yOicsIGVycik7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ1dhdGNoIHN0cmVhbSBlbmRlZCcpO1xuICAgKiB9KTtcbiAgICogLy8gTGF0ZXIsIHRvIHN0b3Agd2F0Y2hpbmc6XG4gICAqIHdhdGNoZXIuc3RvcCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHdhdGNoKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogSGVhbHRoV2F0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS53YXRjaChzZXJ2aWNlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZG1pbiBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBQcmUtYWxsb2NhdGUgcGFyc2VyIGluc3RhbmNlcyAqL1xuICBhc3luYyB3YXJtdXBQYXJzZXIoY291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YXJtdXBQYXJzZXIoY291bnQpO1xuICB9XG5cbiAgLyoqIFJldHVybiBjYWNoZSBzdGF0aXN0aWNzICovXG4gIGFzeW5jIGdldENhY2hlU3RhdHMoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTxDYWNoZVN0YXRzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldENhY2hlU3RhdHMoY2FjaGVUeXBlKTtcbiAgfVxuXG4gIC8qKiBDbGVhciB0aGUgc3BlY2lmaWVkIGNhY2hlICovXG4gIGFzeW5jIGNsZWFyQ2FjaGUoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNsZWFyQ2FjaGUoY2FjaGVUeXBlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gZGF0YWJhc2Ugc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRTdGF0aXN0aWNzKGdyYXBoTmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPFN0YXRpc3RpY3M+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0U3RhdGlzdGljcyhncmFwaE5hbWUpO1xuICB9XG5cbiAgLyoqIEludmFsaWRhdGUgdGhlIFJCQUMgcGVybWlzc2lvbiBjYWNoZSAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5pbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3lzdGVtLWxldmVsIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBkaXNrIEkvTywgc3RvcmFnZSwgbmV0d29yaykgKi9cbiAgYXN5bmMgZ2V0U3lzdGVtTWV0cmljcygpOiBQcm9taXNlPFN5c3RlbU1ldHJpY3M+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0U3lzdGVtTWV0cmljcygpO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgbWFudWFsIGNvbXBhY3Rpb24gb2YgdGhlIGRhdGFiYXNlIHN0b3JhZ2UgKi9cbiAgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPENvbXBhY3RSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuY29tcGFjdCgpO1xuICB9XG5cbiAgLyoqIFdhaXQgZm9yIHRoZSBjb21wdXRpbmcgZW5naW5lIHRvcG9sb2d5IHRvIGJlIHJlYWR5ICovXG4gIGFzeW5jIHdhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lOiBzdHJpbmcsIHRpbWVvdXRNczogbnVtYmVyID0gMCk6IFByb21pc2U8Q29tcHV0ZVRvcG9sb2d5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lLCB0aW1lb3V0TXMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJ1bGsgSW1wb3J0IFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgYnVsayBpbXBvcnQgc2Vzc2lvbiBmb3Igb3B0aW1pemVkIGhpZ2gtdGhyb3VnaHB1dCBpbnNlcnRzLlxuICAgKiBAcGFyYW0gZ3JhcGhOYW1lIFRhcmdldCBncmFwaCBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGJ1bGsgaW1wb3J0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEJ1bGtJbXBvcnRPcHRpb25zKTogUHJvbWlzZTxCdWxrSW1wb3J0U2Vzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLnN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIENoZWNrcG9pbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gVXNlIGVuZEJ1bGtJbXBvcnQoKSB3aGljaCBwZXJmb3JtcyBhIGZpbmFsIGZsdXNoLlxuICAgKi9cbiAgYXN5bmMgY2hlY2twb2ludChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q2hlY2twb2ludFJlc3VsdD4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVjb3JkQ291bnQ6IDAsXG4gICAgICBsYXN0Q2hlY2twb2ludENvdW50OiAwLFxuICAgICAgbWVzc2FnZTogJ0NoZWNrcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZDsgdXNlIGVuZEJ1bGtJbXBvcnQgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGJ1bGsgaW1wb3J0IHNlc3Npb24gd2l0aCBhIGZpbmFsIGNoZWNrcG9pbnQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgZW5kQnVsa0ltcG9ydChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8RW5kQnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdGhlIGJ1bGsgaW1wb3J0IHNlc3Npb24gd2l0aG91dCBmaW5hbCBzeW5jLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QWJvcnRCdWxrSW1wb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhIGJ1bGsgaW1wb3J0IHNlc3Npb24uXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QnVsa0ltcG9ydFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBNZXRob2RzIOKAlCBHZXR0ZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiAqL1xuICBnZXRTZXNzaW9uKCk6IFNlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHNlc3Npb24gKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiAqL1xuICBnZXRDb25maWcoKTogR3FsZGJDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2xpZW50IGlzIGNvbm5lY3RlZCB0byBhIGNsdXN0ZXIgZGVwbG95bWVudCAqL1xuICBnZXQgaXNDbHVzdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8uaXNDbHVzdGVyIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2x1c3RlciBJRCAoZW1wdHkgc3RyaW5nIGlmIG5vdCBhIGNsdXN0ZXIpICovXG4gIGdldCBjbHVzdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmNsdXN0ZXJJZCB8fCAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHBhcnRpdGlvbiBjb3VudCAoMCBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgcGFydGl0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LnBhcnRpdGlvbkNvdW50IHx8IDA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW50ZXJuYWwgSGVscGVycyDigJQgTmFtZSBRdW90aW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBXcmFwIGEgbmFtZSBpbiBiYWNrdGlja3MgZm9yIHNhZmUgdXNlIGluIEdRTCBzdGF0ZW1lbnRzLlxuICAgKiBMYWJlbCBuYW1lcyBhbmQgcHJvcGVydHkgbmFtZXMgc2hvdWxkIGJlIHF1b3RlZDsgZ3JhcGggbmFtZXMsIGluZGV4IG5hbWVzLFxuICAgKiBhbmQgZnVsbHRleHQgbmFtZXMgc2hvdWxkIE5PVCBiZSB3cmFwcGVkIGluIGJhY2t0aWNrcy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYCcgKyBuYW1lICsgJ2AnO1xuICB9XG5cbiAgLyoqIFdyYXAgZWFjaCBsYWJlbCBuYW1lIGluIGJhY2t0aWNrcyBhbmQgam9pbiB3aXRoIFwiLCBcIiAqL1xuICBwcml2YXRlIHN0YXRpYyBxdW90ZUxhYmVscyguLi5uYW1lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lcy5tYXAobiA9PiAnYCcgKyBuICsgJ2AnKS5qb2luKCcsICcpO1xuICB9XG5cbiAgLyoqIEpvaW4gbmFtZXMgd2l0aCBcIiwgXCIgd2l0aG91dCBiYWNrdGljayB3cmFwcGluZyAqL1xuICBwcml2YXRlIHN0YXRpYyBqb2luTmFtZXMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEdyYXBoIE9wZXJhdGlvbnMgKDYgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBvcGVuIChzY2hlbWEtbGVzcykgZ3JhcGhcbiAgICpcbiAgICogdjYgR1FMOiBgQ1JFQVRFIEdSQVBIIGdgIC0+IE9QRU47IGBDUkVBVEUgR1JBUEggZyB7fWAgLT4gQ0xPU0VELiBUaGVcbiAgICogYnJhY2UtbGVzcyBmb3JtIGlzIHJlcXVpcmVkIHRvIGFjdHVhbGx5IGdldCBhbiBPUEVOIGdyYXBoLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlT3BlbkdyYXBoKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IGNsb3NlZCAoc2NoZW1hLWVuZm9yY2VkKSBncmFwaCB3aXRoIG5vZGUgYW5kIGVkZ2UgbGFiZWwgZGVmaW5pdGlvbnMgKi9cbiAgYXN5bmMgY3JlYXRlQ2xvc2VkR3JhcGgobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBHUkFQSCAke25hbWV9IHt9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBncmFwaCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdyYXBoIHdhcyBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVHcmFwaElmTm90RXhpc3QoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUdyYXBoKG5hbWUsIGdyYXBoVHlwZSwgZGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBtc2cgPSAoZS5tZXNzYWdlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKG1zZy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdCcpIHx8IG1zZy5pbmNsdWRlcygnZHVwbGljYXRlJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciBhIGdyYXBoIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzICovXG4gIGFzeW5jIGhhc0dyYXBoKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGdyYXBocyA9IGF3YWl0IHRoaXMubGlzdEdyYXBocygpO1xuICAgIHJldHVybiBncmFwaHMuc29tZShnID0+IGcubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKiogUmVuYW1lIGEgZ3JhcGggKi9cbiAgYXN5bmMgYWx0ZXJHcmFwaChncmFwaE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7Z3JhcGhOYW1lfSBSRU5BTUUgVE8gJHtuZXdOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGFsbCBkYXRhIGZyb20gYSBncmFwaCB3aGlsZSBrZWVwaW5nIGl0cyBzdHJ1Y3R1cmUgKi9cbiAgYXN5bmMgdHJ1bmNhdGUoZ3JhcGhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgVFJVTkNBVEUgR1JBUEggJHtncmFwaE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIExhYmVsIE9wZXJhdGlvbnMgKDE2IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGxhYmVscyAobm9kZSBhbmQgZWRnZSkgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0xhYmVscyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBsYWJlbHMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd05vZGVMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3AsICdOT0RFJyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGxhYmVscyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RWRnZUxhYmVscyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBMQUJFTFMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCwgJ0VER0UnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgdHlwZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIHNob3dOb2RlVHlwZXMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPE5vZGVUeXBlSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgVFlQRVMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZU5vZGVUeXBlSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIHR5cGVzIHdpdGggdGhlaXIgcHJvcGVydGllcyAqL1xuICBhc3luYyBzaG93RWRnZVR5cGVzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxFZGdlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIFRZUEVTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VFZGdlVHlwZUluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHNwZWNpZmljIGxhYmVsIGJ5IG5hbWUgZnJvbSB0aGUgY3VycmVudCBncmFwaCwgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gICAqIE1hdGNoZXMgZW50cmllcyB3aGVyZSBgbmFtZWAgaXMgb25lIG9mIHRoZSAubGFiZWxzIChzdXBwb3J0cyBtdWx0aS1sYWJlbCBncm91cHMpLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IGxhYmVscyA9IGF3YWl0IHRoaXMuc2hvd0xhYmVscyhjb25maWcpO1xuICAgIHJldHVybiBsYWJlbHMuZmluZChsID0+IGwubGFiZWxzLmluY2x1ZGVzKG5hbWUpKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIG5vZGUgdHlwZSBieSBuYW1lLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXROb2RlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Tm9kZVR5cGVJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5zaG93Tm9kZVR5cGVzKGNvbmZpZyk7XG4gICAgcmV0dXJuIHR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgZWRnZSB0eXBlIGJ5IG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldEVkZ2VMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxFZGdlVHlwZUluZm8gfCBudWxsPiB7XG4gICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0aGlzLnNob3dFZGdlVHlwZXMoY29uZmlnKTtcbiAgICByZXR1cm4gdHlwZXMuZmluZCh0ID0+IHQubmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBub2RlIGxhYmVsIGluIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVMYWJlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBBREQgTk9ERSB7ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX0gKCR7cHJvcFN0cn0pIH1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBlZGdlIGxhYmVsIGluIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VMYWJlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBBREQgRURHRSB7ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX0gKCktWyR7cHJvcFN0cn1dLT4oKSB9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBsYWJlbCBmcm9tIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGRyb3BOb2RlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBEUk9QIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBvbmUgb3IgbW9yZSBlZGdlIGxhYmVscyBmcm9tIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGRyb3BFZGdlTGFiZWwoLi4ubmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIC8vIExhc3QgYXJnIG1heSBiZSBhIFF1ZXJ5Q29uZmlnIChvciB1bmRlZmluZWQpOyB0cmVhdCBub24tc3RyaW5nIGFzIGNvbmZpZy5cbiAgICBsZXQgY29uZmlnOiBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuICAgIGlmIChuYW1lc09yQ29uZmlnLmxlbmd0aCA+IDAgJiYgdHlwZW9mIG5hbWVzT3JDb25maWdbbmFtZXNPckNvbmZpZy5sZW5ndGggLSAxXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IG5hbWVzT3JDb25maWdbbmFtZXNPckNvbmZpZy5sZW5ndGggLSAxXSBhcyBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgIG5hbWVzID0gbmFtZXNPckNvbmZpZy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzID0gbmFtZXNPckNvbmZpZyBhcyBzdHJpbmdbXTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gRFJPUCBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbGFiZWwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIGNyZWF0ZWQsIGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUxhYmVsSWZOb3RFeGlzdChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxhYmVscyA9IGF3YWl0IHRoaXMuc2hvd0xhYmVscyhjb25maWcpO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlT3JFZGdlID09PSBEQlR5cGUuRURHRSA/ICdFREdFJyA6ICdOT0RFJztcblxuICAgIGlmIChsYWJlbHMuc29tZShsID0+IGwubGFiZWxzLmluY2x1ZGVzKG5hbWUpICYmIGwudHlwZSA9PT0gdGFyZ2V0VHlwZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlTm9kZUxhYmVsKG5hbWUsIHByb3BzLCBjb25maWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUVkZ2VMYWJlbChuYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUmVuYW1lIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBhbHRlck5vZGVMYWJlbChvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChvbGROYW1lKX0gUkVOQU1FIFRPICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuZXdOYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGFsdGVyRWRnZUxhYmVsKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG9sZE5hbWUpfSBSRU5BTUUgVE8gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5ld05hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBhdmFpbGFibGUgYWxnb3JpdGhtcyAqL1xuICBhc3luYyBzaG93QWxnb3MoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEFsZ29JbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgQUxHT1MnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUFsZ29JbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFByb3BlcnR5IE9wZXJhdGlvbnMgKDEzIG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYSBsYWJlbCAobm9kZSBvciBlZGdlKSBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93UHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dOb2RlUHJvcGVydHkobGFiZWxOYW1lLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG93RWRnZVByb3BlcnR5KGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIHNob3dOb2RlUHJvcGVydHkobGFiZWxOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWZbXT4ge1xuICAgIGNvbnN0IG50ID0gYXdhaXQgdGhpcy5nZXROb2RlTGFiZWwobGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGlmICghbnQpIHRocm93IG5ldyBFcnJvcihgTm9kZSBsYWJlbCBcIiR7bGFiZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBudC5wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIHNob3dFZGdlUHJvcGVydHkobGFiZWxOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWZbXT4ge1xuICAgIGNvbnN0IGV0ID0gYXdhaXQgdGhpcy5nZXRFZGdlTGFiZWwobGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGlmICghZXQpIHRocm93IG5ldyBFcnJvcihgRWRnZSBsYWJlbCBcIiR7bGFiZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBldC5wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGEgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldFByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIGNvbnN0IHByb3BzID0gYXdhaXQgdGhpcy5zaG93UHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBjb25maWcpO1xuICAgIHJldHVybiBwcm9wcy5maW5kKHAgPT4gcC5uYW1lID09PSBwcm9wTmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhIG5vZGUgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldE5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5KERCVHlwZS5OT0RFLCBsYWJlbE5hbWUsIHByb3BOYW1lLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGFuIGVkZ2UgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldEVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5KERCVHlwZS5FREdFLCBsYWJlbE5hbWUsIHByb3BOYW1lLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgKi9cbiAgYXN5bmMgY3JlYXRlUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVOb2RlUHJvcGVydHkobGFiZWxOYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRWRnZVByb3BlcnR5KGxhYmVsTmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBQUk9QRVJUWSAke3Byb3BTdHJ9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBQUk9QRVJUWSAke3Byb3BTdHJ9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhIGxhYmVsIChub2RlIG9yIGVkZ2UpICovXG4gIGFzeW5jIGRyb3BQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BOb2RlUHJvcGVydHkobGFiZWxOYW1lLCAuLi5uYW1lcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZHJvcEVkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIC4uLm5hbWVzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBkcm9wTm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIFBST1BFUlRZICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBkcm9wRWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIFBST1BFUlRZICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb3BlcnRpZXMgb24gYSBsYWJlbCBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHByb3BlcnRpZXMgd2VyZSBjcmVhdGVkLCBmYWxzZSBpZiBhbGwgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUHJvcGVydHlJZk5vdEV4aXN0KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNob3dQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgY29uc3QgZXhpc3RpbmdTZXQgPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChwID0+IHAubmFtZSkpO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gcHJvcHMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nU2V0LmhhcyhwLm5hbWUpKTtcblxuICAgIGlmIChuZXdQcm9wcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBuZXdQcm9wcywgY29uZmlnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIENvbnN0cmFpbnQgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvLyBTZXJ2ZXIgcmVwbGFjZWQgYEFMVEVSIC4uLiBBREQvRFJPUCBDT05TVFJBSU5UYCB3aXRoIHRoZVxuICAvLyBgQ1JFQVRFIENPTlNUUkFJTlQgPG5hbWU+IEZPUiAuLi4gUkVRVUlSRSAuLi4gSVMgTk9UIE5VTEwvVU5JUVVFYFxuICAvLyBmb3JtLiBDb25zdHJhaW50IG5hbWVzIGFyZSBkZXJpdmVkIGZyb20ge2tpbmR9X3tub2RlfGVkZ2V9X3tsYWJlbH1fe3Byb3B9XG4gIC8vIHNvIGNyZWF0ZS9kcm9wIHByb2R1Y2UgbWF0Y2hpbmcgaWRlbnRpZmllcnMgd2l0aG91dCBleHBvc2luZyBuYW1pbmcuXG4gIHByaXZhdGUgc3RhdGljIGNvbnN0cmFpbnROYW1lKFxuICAgIGtpbmQ6ICdubicgfCAndXEnLFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZXM6IHN0cmluZ1tdXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW50ID0gbm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUgPyAnbm9kZScgOiAnZWRnZSc7XG4gICAgY29uc3QgcHJvcHMgPSBwcm9wTmFtZXMubWFwKHAgPT4gcC50b0xvd2VyQ2FzZSgpKS5qb2luKCdfJyk7XG4gICAgcmV0dXJuIGAke2tpbmR9XyR7ZW50fV8ke2xhYmVsTmFtZS50b0xvd2VyQ2FzZSgpfV8ke3Byb3BzfWA7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb25zdHJhaW50VGFyZ2V0KG5vZGVPckVkZ2U6IERCVHlwZSwgbGFiZWxOYW1lOiBzdHJpbmcpOiB7IHBhdHRlcm46IHN0cmluZzsgdmFyaWFibGU6IHN0cmluZyB9IHtcbiAgICBjb25zdCBxbCA9IEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKTtcbiAgICByZXR1cm4gbm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREVcbiAgICAgID8geyBwYXR0ZXJuOiBgKG46JHtxbH0pYCwgdmFyaWFibGU6ICduJyB9XG4gICAgICA6IHsgcGF0dGVybjogYCgpLVtlOiR7cWx9XS0+KClgLCB2YXJpYWJsZTogJ2UnIH07XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgTk9UIE5VTEwgY29uc3RyYWludCBvbiBhIHByb3BlcnR5ICovXG4gIGFzeW5jIGNyZWF0ZU5vdE51bGxDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBuYW1lID0gR3FsZGJDbGllbnQuY29uc3RyYWludE5hbWUoJ25uJywgbm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBbcHJvcE5hbWVdKTtcbiAgICBjb25zdCB7IHBhdHRlcm4sIHZhcmlhYmxlIH0gPSBHcWxkYkNsaWVudC5jb25zdHJhaW50VGFyZ2V0KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgQ09OU1RSQUlOVCAke25hbWV9IEZPUiAke3BhdHRlcm59IFJFUVVJUkUgJHt2YXJpYWJsZX0uJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKHByb3BOYW1lKX0gSVMgTk9UIE5VTExgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIFVOSVFVRSBjb25zdHJhaW50IG9uIG9uZSBvciBtb3JlIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgY3JlYXRlVW5pcXVlQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBjb25zdCBjbmFtZSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnROYW1lKCd1cScsIG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmFtZXMpO1xuICAgIGNvbnN0IHsgcGF0dGVybiwgdmFyaWFibGUgfSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnRUYXJnZXQobm9kZU9yRWRnZSwgbGFiZWxOYW1lKTtcbiAgICBjb25zdCBwcm9wc0xpc3QgPSBuYW1lcy5tYXAobiA9PiBgJHt2YXJpYWJsZX0uJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG4pfWApLmpvaW4oJywgJyk7XG4gICAgY29uc3QgcmVxdWlyZUV4cHIgPSBuYW1lcy5sZW5ndGggPiAxID8gYCgke3Byb3BzTGlzdH0pYCA6IHByb3BzTGlzdDtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBDT05TVFJBSU5UICR7Y25hbWV9IEZPUiAke3BhdHRlcm59IFJFUVVJUkUgJHtyZXF1aXJlRXhwcn0gSVMgVU5JUVVFYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYSBOT1QgTlVMTCBjb25zdHJhaW50IGZyb20gYSBwcm9wZXJ0eSAqL1xuICBhc3luYyBkcm9wTm90TnVsbENvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBHcWxkYkNsaWVudC5jb25zdHJhaW50TmFtZSgnbm4nLCBub2RlT3JFZGdlLCBsYWJlbE5hbWUsIFtwcm9wTmFtZV0pO1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBDT05TVFJBSU5UICR7bmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIFVOSVFVRSBjb25zdHJhaW50IGZyb20gb25lIG9yIG1vcmUgcHJvcGVydGllcyAqL1xuICBhc3luYyBkcm9wVW5pcXVlQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBjb25zdCBjbmFtZSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnROYW1lKCd1cScsIG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmFtZXMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBDT05TVFJBSU5UICR7Y25hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEluZGV4IE9wZXJhdGlvbnMgKDcgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93SW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dOb2RlSW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0VkZ2VJbmRleChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gaW5kZXggb24gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVJbmRleChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW5kZXhQcm9wZXJ0eVtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBJTkRFWCAke2luZGV4TmFtZX0gT04gTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7cHJvcFN0cn0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gaW5kZXggb24gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlSW5kZXgoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluZGV4UHJvcGVydHlbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgSU5ERVggJHtpbmRleE5hbWV9IE9OIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke3Byb3BTdHJ9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wTm9kZUluZGV4KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgTk9ERSBJTkRFWCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYW4gZWRnZSBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BFZGdlSW5kZXgoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBFREdFIElOREVYICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBGdWxsdGV4dCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGZ1bGx0ZXh0IGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0Z1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgZnVsbHRleHQgaW5kZXhlcyAqL1xuICBhc3luYyBzaG93Tm9kZUZ1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBmdWxsdGV4dCBpbmRleGVzICovXG4gIGFzeW5jIHNob3dFZGdlRnVsbHRleHQoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEZ1bGx0ZXh0SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgZnVsbHRleHQgaW5kZXggb24gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVGdWxsdGV4dChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogc3RyaW5nW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEZVTExURVhUICR7aW5kZXhOYW1lfSBPTiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5wcm9wcyl9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgZnVsbHRleHQgaW5kZXggb24gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlRnVsbHRleHQoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBGVUxMVEVYVCAke2luZGV4TmFtZX0gT04gRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ucHJvcHMpfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGZ1bGx0ZXh0IGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcE5vZGVGdWxsdGV4dChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIE5PREUgRlVMTFRFWFQgJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGFuIGVkZ2UgZnVsbHRleHQgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wRWRnZUZ1bGx0ZXh0KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgRURHRSBGVUxMVEVYVCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgVGFzayBPcGVyYXRpb25zICgzIG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIHRhc2tzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dUYXNrcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8VGFza0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBUQVNLUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlVGFza0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBhIHRhc2sgYnkgSUQgKi9cbiAgYXN5bmMgZGVsZXRlVGFzayh0YXNrSWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBERUxFVEUgVEFTSyAke3Rhc2tJZH1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFN0b3AgYSBydW5uaW5nIHRhc2sgYnkgSUQgKi9cbiAgYXN5bmMgc3RvcFRhc2sodGFza0lkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgU1RPUCBUQVNLICR7dGFza0lkfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBEYXRhIEluc2VydCBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgbm9kZXMg4oCUIGJhY2t3YXJkLWNvbXBhdGlibGUgb3ZlcmxvYWRlZCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogVHdvIGNhbGwgc2hhcGVzIGFyZSBhY2NlcHRlZDsgdGhlIHJ1bnRpbWUgZGlzcGF0Y2hlcyBvbiB0aGUgZmlyc3RcbiAgICogYXJndW1lbnQncyB0eXBlOlxuICAgKlxuICAgKiAgIDEuIGBpbnNlcnROb2RlcyhncmFwaE5hbWU6IHN0cmluZywgbm9kZXMsIGNvbmZpZz8pYCDigJQgb3JpZ2luYWxcbiAgICogICAgICA2LjAuMCBzaWduYXR1cmUsIHJvdXRlcyB0aHJvdWdoIHRoZSBidWxrLWltcG9ydCBnUlBDIHBhdGhcbiAgICogICAgICAoYERhdGFTZXJ2aWNlLkluc2VydE5vZGVzYCkuIFJldHVybnMgYEluc2VydE5vZGVzUmVzdWx0YCB3aXRoXG4gICAqICAgICAgZ1JQQy1sZXZlbCBtZXRhZGF0YS4gUHJlc2VydmVzIHNvdXJjZSBjb21wYXRpYmlsaXR5IGZvclxuICAgKiAgICAgIGNhbGxlcnMgd3JpdHRlbiBhZ2FpbnN0IDYuMC4wIChlLmcuIGdxbGRiLW1hbmFnZXIpLlxuICAgKlxuICAgKiAgIDIuIGBpbnNlcnROb2Rlcyhub2RlcywgY29uZmlnPylgIOKAlCBjb252ZW5pZW5jZSBHUUwgZW1pdHRlciAoYWRkZWRcbiAgICogICAgICBhZnRlciA2LjAuMCkuIFN5bnRoZXNpemVzXG4gICAqICAgICAgYElOU0VSVCAobjA6TGFiZWwgey4uLn0pLCAobjE6TGFiZWwgey4uLn0pIFJFVFVSTiBuMCwgbjFgLFxuICAgKiAgICAgIHdpdGggYElOU0VSVCBPVkVSV1JJVEVgIHdoZW4gYGNvbmZpZy5pbnNlcnRUeXBlYCBpc1xuICAgKiAgICAgIGBJbnNlcnRUeXBlLk92ZXJ3cml0ZWAuIFJldHVybnMgdGhlIHJhdyBgUmVzcG9uc2VgLlxuICAgKiAgICAgIGBOb2RlRGF0YS5pZGAsIHdoZW4gc2V0LCBpcyBlbWl0dGVkIGFzIHRoZSBgX2lkYCBwcm9wZXJ0eS5cbiAgICovXG4gIGFzeW5jIGluc2VydE5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQ+O1xuICBhc3luYyBpbnNlcnROb2RlcyhcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT47XG4gIGFzeW5jIGluc2VydE5vZGVzKFxuICAgIGFyZzE6IHN0cmluZyB8IE5vZGVEYXRhW10sXG4gICAgYXJnMj86IE5vZGVEYXRhW10gfCBJbnNlcnRDb25maWcsXG4gICAgYXJnMz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQgfCBSZXNwb25zZT4ge1xuICAgIC8vIFBhdGggMTogbGVnYWN5IGJ1bGstZ1JQQyBzaWduYXR1cmUgKGdyYXBoTmFtZSwgbm9kZXMsIGNvbmZpZz8pXG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoXG4gICAgICAgIGFyZzEsXG4gICAgICAgIGFyZzIgYXMgTm9kZURhdGFbXSxcbiAgICAgICAgYXJnM1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQYXRoIDI6IGNvbnZlbmllbmNlIEdRTC1lbWl0dGVyIHNpZ25hdHVyZSAobm9kZXMsIGNvbmZpZz8pXG4gICAgY29uc3Qgbm9kZXMgPSBhcmcxO1xuICAgIGNvbnN0IGNvbmZpZyA9IGFyZzIgYXMgSW5zZXJ0Q29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBSZXNwb25zZShbXSwgW10sIDAsIGZhbHNlLCBbXSwgMCk7XG5cbiAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICBpZiAoIW5vZGUubGFiZWxzIHx8IG5vZGUubGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgYXQgaW5kZXggJHtpfSBoYXMgbm8gbGFiZWxzLiBBdCBsZWFzdCBvbmUgbGFiZWwgaXMgcmVxdWlyZWQuYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2YXJOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYXJ0cyA9IG5vZGVzLm1hcCgobm9kZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmFyTmFtZSA9IGBuJHtpfWA7XG4gICAgICB2YXJOYW1lcy5wdXNoKHZhck5hbWUpO1xuICAgICAgLy8gR1FMIElOU0VSVCBvbmx5IHN1cHBvcnRzIHNpbmdsZSBsYWJlbCBwZXIgbm9kZVxuICAgICAgY29uc3QgbGFiZWwgPSBHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5vZGUubGFiZWxzWzBdKTtcbiAgICAgIC8vIEJ1aWxkIHByb3BlcnRpZXMgaW5jbHVkaW5nIF9pZCBpZiBzZXRcbiAgICAgIGxldCBwcm9wcyA9IG5vZGUucHJvcGVydGllcztcbiAgICAgIGlmIChub2RlLmlkKSB7XG4gICAgICAgIHByb3BzID0geyBfaWQ6IG5vZGUuaWQsIC4uLnByb3BzIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcocHJvcHMpO1xuICAgICAgcmV0dXJuIHByb3BTdHIgPyBgKCR7dmFyTmFtZX06JHtsYWJlbH0gJHtwcm9wU3RyfSlgIDogYCgke3Zhck5hbWV9OiR7bGFiZWx9KWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnNlcnRLZXl3b3JkID0gaW5zZXJ0S2V5d29yZEZvclR5cGUoY29uZmlnPy5pbnNlcnRUeXBlKTtcbiAgICBjb25zdCBncWxTdHIgPSBpbnNlcnRLZXl3b3JkICsgJyAnICsgcGFydHMuam9pbignLCAnKSArICcgUkVUVVJOICcgKyB2YXJOYW1lcy5qb2luKCcsICcpO1xuICAgIHJldHVybiB0aGlzLmdxbChncWxTdHIsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGVkZ2VzIOKAlCBiYWNrd2FyZC1jb21wYXRpYmxlIG92ZXJsb2FkZWQgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFR3byBjYWxsIHNoYXBlcyBhcmUgYWNjZXB0ZWQ7IHRoZSBydW50aW1lIGRpc3BhdGNoZXMgb24gdGhlIGZpcnN0XG4gICAqIGFyZ3VtZW50J3MgdHlwZTpcbiAgICpcbiAgICogICAxLiBgaW5zZXJ0RWRnZXMoZ3JhcGhOYW1lOiBzdHJpbmcsIGVkZ2VzLCBjb25maWc/KWAg4oCUIG9yaWdpbmFsXG4gICAqICAgICAgNi4wLjAgc2lnbmF0dXJlLCByb3V0ZXMgdGhyb3VnaCB0aGUgYnVsay1pbXBvcnQgZ1JQQyBwYXRoXG4gICAqICAgICAgKGBEYXRhU2VydmljZS5JbnNlcnRFZGdlc2ApLiBSZXR1cm5zIGBJbnNlcnRFZGdlc1Jlc3VsdGAgd2l0aFxuICAgKiAgICAgIGdSUEMtbGV2ZWwgbWV0YWRhdGEuIFByZXNlcnZlcyBzb3VyY2UgY29tcGF0aWJpbGl0eSBmb3JcbiAgICogICAgICA2LjAuMCBjYWxsZXJzLlxuICAgKlxuICAgKiAgIDIuIGBpbnNlcnRFZGdlcyhlZGdlcywgY29uZmlnPylgIOKAlCBjb252ZW5pZW5jZSBHUUwgZW1pdHRlclxuICAgKiAgICAgIChhZGRlZCBhZnRlciA2LjAuMCkuIFBlciBlZGdlIHN5bnRoZXNpemVzXG4gICAqICAgICAgYE1BVENIIChzcmMgV0hFUkUgaWQoc3JjKSA9ICdmcm9tJyksIChkc3QgV0hFUkUgaWQoZHN0KSA9ICd0bycpIElOU0VSVCAoc3JjKS1bZTA6TGFiZWwgey4uLn1dLT4oZHN0KSBSRVRVUk4gZTBgLlxuICAgKiAgICAgIFJldHVybnMgYSBtZXJnZWQgYFJlc3BvbnNlYCB3aXRoIGNvbHVtbnMgYGUwLCBlMSwgLi4uYC5cbiAgICovXG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+O1xuICBhc3luYyBpbnNlcnRFZGdlcyhcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT47XG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGFyZzE6IHN0cmluZyB8IEVkZ2VEYXRhW10sXG4gICAgYXJnMj86IEVkZ2VEYXRhW10gfCBJbnNlcnRDb25maWcsXG4gICAgYXJnMz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQgfCBSZXNwb25zZT4ge1xuICAgIC8vIFBhdGggMTogbGVnYWN5IGJ1bGstZ1JQQyBzaWduYXR1cmVcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnRFZGdlcyhcbiAgICAgICAgYXJnMSxcbiAgICAgICAgYXJnMiBhcyBFZGdlRGF0YVtdLFxuICAgICAgICBhcmczXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBhdGggMjogY29udmVuaWVuY2UgR1FMLWVtaXR0ZXIgc2lnbmF0dXJlXG4gICAgY29uc3QgZWRnZXMgPSBhcmcxO1xuICAgIGNvbnN0IGNvbmZpZyA9IGFyZzIgYXMgSW5zZXJ0Q29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBSZXNwb25zZShbXSwgW10sIDAsIGZhbHNlLCBbXSwgMCk7XG5cbiAgICBjb25zdCBpbnNlcnRLZXl3b3JkID0gaW5zZXJ0S2V5d29yZEZvclR5cGUoY29uZmlnPy5pbnNlcnRUeXBlKTtcbiAgICBjb25zdCBhbGxDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFZhbHVlczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxBZmZlY3RlZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgY29uc3QgdmFyTmFtZSA9IGBlJHtpfWA7XG4gICAgICBjb25zdCBsYWJlbFBhcnQgPSBlZGdlLmxhYmVsID8gJzonICsgR3FsZGJDbGllbnQucXVvdGVMYWJlbChlZGdlLmxhYmVsKSA6ICcnO1xuICAgICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nKGVkZ2UucHJvcGVydGllcyk7XG4gICAgICBjb25zdCBlZGdlUGFydCA9IHByb3BTdHIgPyBgWyR7dmFyTmFtZX0ke2xhYmVsUGFydH0gJHtwcm9wU3RyfV1gIDogYFske3Zhck5hbWV9JHtsYWJlbFBhcnR9XWA7XG4gICAgICBjb25zdCBncWxTdHIgPSBgTUFUQ0ggKHNyYyBXSEVSRSBpZChzcmMpID0gJyR7ZWRnZS5mcm9tTm9kZUlkfScpLCBgXG4gICAgICAgICsgYChkc3QgV0hFUkUgaWQoZHN0KSA9ICcke2VkZ2UudG9Ob2RlSWR9JykgYFxuICAgICAgICArIGAke2luc2VydEtleXdvcmR9IChzcmMpLSR7ZWRnZVBhcnR9LT4oZHN0KSBSRVRVUk4gJHt2YXJOYW1lfWA7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsU3RyLCBjb25maWcpO1xuICAgICAgdG90YWxBZmZlY3RlZCArPSByZXNwLnJvd3NBZmZlY3RlZDtcbiAgICAgIGFsbENvbHVtbnMucHVzaCh2YXJOYW1lKTtcbiAgICAgIGlmIChyZXNwLnJvd3MubGVuZ3RoID4gMCAmJiByZXNwLnJvd3NbMF0udmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWxsVmFsdWVzLnB1c2gocmVzcC5yb3dzWzBdLnZhbHVlc1swXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG1lcmdlZFJvdyA9IG5ldyBSb3coYWxsVmFsdWVzKTtcbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKGFsbENvbHVtbnMsIFttZXJnZWRSb3ddLCAxLCBmYWxzZSwgW10sIHRvdGFsQWZmZWN0ZWQpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgU3lzdGVtICYgUHJvY2VzcyBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gY3VycmVudGx5IHJ1bm5pbmcgcHJvY2Vzc2VzIChxdWVyaWVzKSAqL1xuICBhc3luYyB0b3AoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFByb2Nlc3NJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1RPUCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlUHJvY2Vzc0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFRlcm1pbmF0ZSBhIHJ1bm5pbmcgcXVlcnkgYnkgaXRzIHF1ZXJ5IElEICovXG4gIGFzeW5jIGtpbGwocXVlcnlJZDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEtJTEwgJyR7cXVlcnlJZH0nYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3RhdGlzdGljcyBmb3IgdGhlIGN1cnJlbnQgZ3JhcGggdXNpbmcgZGIuc3RhdHMoKSAqL1xuICBhc3luYyBzdGF0cyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8R3JhcGhTdGF0cz4ge1xuICAgIGNvbnN0IGN1cnJlbnRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdSRVRVUk4gZGIuc3RhdHMoKSBBUyBzdGF0cycsIGNvbmZpZyk7XG4gICAgY29uc3QgZ3MgPSBwYXJzZUdyYXBoU3RhdHMocmVzcCk7XG4gICAgaWYgKCFncy5ncmFwaE5hbWUpIGdzLmdyYXBoTmFtZSA9IGN1cnJlbnRHcmFwaDtcbiAgICByZXR1cm4gZ3M7XG4gIH1cblxuICAvKiogU2VuZCBhIHBpbmcgdG8gdGhlIHNlcnZlciBhbmQgcmV0dXJuIHRoZSBsYXRlbmN5IGluIG5hbm9zZWNvbmRzICovXG4gIGFzeW5jIHRlc3QoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5waW5nKCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBBSSBPcGVyYXRpb25zICgyIG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBZSUVMRCBjb2x1bW5zIGVtaXR0ZWQgYnkgQ0FMTCBhaS5yZWFkIC8gYWkuZ3FsIChrZXB0IGluIHN5bmMgd2l0aCBzZXJ2ZXIpLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBBSV9ZSUVMRF9DT0xTID1cbiAgICAnc3RhZ2UsIGRldGFpbCwgZWxhcHNlZF9tcywgdG9rZW5zX2lucHV0LCB0b2tlbnNfb3V0cHV0LCB0b2tlbnNfY2FjaGVkLCBkYXRhJztcblxuICAvKipcbiAgICogQXNrIHRoZSBBSSB0byBnZW5lcmF0ZSBhIEdRTCBzdGF0ZW1lbnQgYW5kIGF1dG8tZXhlY3V0ZSBpdC5cbiAgICpcbiAgICogV3JhcHMgYENBTEwgYWkucmVhZChcIjxwcm9tcHQ+XCIpIFlJRUxEIC4uLmAsIHN0cmVhbXMgc3RhZ2Ugcm93cyBmcm9tIHRoZVxuICAgKiBzZXJ2ZXIsIGFuZCByZS1ydW5zIHRoZSBzeW50aGVzaXplZCBHUUwgc28gYEFpUmVhZFJlc3VsdC5kYXRhYCBob2xkcyB0aGVcbiAgICogcmVhbCBxdWVyeSB7QGxpbmsgUmVzcG9uc2V9IChyb3dzIC8gY29sdW1ucykg4oCUIG1hdGNoaW5nIHdoYXQgTWFuYWdlciBVSVxuICAgKiBkaXNwbGF5cy5cbiAgICpcbiAgICogT25seSB0cmFuc3BvcnQtbGV2ZWwgZXJyb3JzIHJlamVjdCB0aGUgUHJvbWlzZS4gQUktc2lkZSBlcnJvcnMgc2V0XG4gICAqIGBzdWNjZXNzPWZhbHNlYCBhbmQgcG9wdWxhdGUgYGVycm9yYCwgd2l0aCBgZGF0YT1udWxsYC5cbiAgICovXG4gIGFzeW5jIGFpUmVhZChwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEFpUmVhZFJlc3VsdD4ge1xuICAgIGNvbnN0IGdxbCA9IGBDQUxMIGFpLnJlYWQoXCIke0dxbGRiQ2xpZW50LmVzY2FwZUFpUHJvbXB0KHByb21wdCl9XCIpIFlJRUxEICR7R3FsZGJDbGllbnQuQUlfWUlFTERfQ09MU31gO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbChncWwsIGNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZUFpUmVzdWx0KHJlc3ApO1xuICAgIC8vIEF1dG8gcmUtcnVuIHRoZSBnZW5lcmF0ZWQgR1FMIHNvIGBkYXRhYCBpcyBhIHByb3BlciBSZXNwb25zZSAocm93cy9jb2x1bW5zKSxcbiAgICAvLyBub3QgdGhlIGV4ZWN1dGlvbiBtZXRhZGF0YSBkaWN0IHJldHVybmVkIGluIHRoZSBmaW5hbCBzdGFnZS5cbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MgJiYgcmVzdWx0LmdlbmVyYXRlZEdxbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0LmRhdGEgPSBhd2FpdCB0aGlzLmdxbChyZXN1bHQuZ2VuZXJhdGVkR3FsLCBjb25maWcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IGBHZW5lcmF0ZWQgR1FMIGZhaWxlZCB0byBleGVjdXRlOiAke2U/Lm1lc3NhZ2UgPz8gU3RyaW5nKGUpfWA7XG4gICAgICAgIHJlc3VsdC5kYXRhID0gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LmRhdGEgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzayB0aGUgQUkgdG8gZ2VuZXJhdGUgYSBHUUwgc3RhdGVtZW50ICp3aXRob3V0KiBleGVjdXRpbmcgaXQuXG4gICAqXG4gICAqIFRoZSBnZW5lcmF0ZWQgR1FMIGlzIGV4cG9zZWQgdmlhIGBBaVJlYWRSZXN1bHQuZ2VuZXJhdGVkR3FsYCBzbyB0aGVcbiAgICogY2FsbGVyIGNhbiByZXZpZXcgLyBlZGl0IGl0IGJlZm9yZSBydW5uaW5nIGl0IG1hbnVhbGx5IHZpYSBgY2xpZW50LmdxbCgpYC5cbiAgICogYEFpUmVhZFJlc3VsdC5kYXRhYCBpcyBhbHdheXMgbnVsbCBmb3IgYGFpR3FsYC5cbiAgICovXG4gIGFzeW5jIGFpR3FsKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8QWlSZWFkUmVzdWx0PiB7XG4gICAgY29uc3QgZ3FsID0gYENBTEwgYWkuZ3FsKFwiJHtHcWxkYkNsaWVudC5lc2NhcGVBaVByb21wdChwcm9tcHQpfVwiKSBZSUVMRCAke0dxbGRiQ2xpZW50LkFJX1lJRUxEX0NPTFN9YDtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjb25maWcpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGFyc2VBaVJlc3VsdChyZXNwKTtcbiAgICAvLyBhaV9ncWwgaXMgXCJnZW5lcmF0ZSBvbmx5XCIg4oCUIG5ldmVyIGF1dG8tZXhlY3V0ZS5cbiAgICByZXN1bHQuZGF0YSA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBFc2NhcGUgYSBwcm9tcHQgc28gaXQgY2FuIGJlIHNhZmVseSBlbWJlZGRlZCBpbiBhIGRvdWJsZS1xdW90ZWQgR1FMIHN0cmluZy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZXNjYXBlQWlQcm9tcHQocHJvbXB0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcm9tcHQucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKS5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG4gIH1cblxuICAvKiogUGFyc2UgYSBDQUxMIGFpLnJlYWQgLyBhaS5ncWwgWUlFTEQgcmVzcG9uc2UgaW50byBhbiBBaVJlYWRSZXN1bHQuICovXG4gIHByaXZhdGUgcGFyc2VBaVJlc3VsdChyZXNwOiBSZXNwb25zZSk6IEFpUmVhZFJlc3VsdCB7XG4gICAgY29uc3QgcmVzdWx0OiBBaVJlYWRSZXN1bHQgPSB7XG4gICAgICBzdGFnZXM6IFtdLFxuICAgICAgZ2VuZXJhdGVkR3FsOiBudWxsLFxuICAgICAgZGF0YTogbnVsbCxcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBlcnJvcjogbnVsbCxcbiAgICAgIHRvdGFsRWxhcHNlZE1zOiAwLFxuICAgICAgdG90YWxUb2tlbnNJbnB1dDogMCxcbiAgICAgIHRvdGFsVG9rZW5zT3V0cHV0OiAwLFxuICAgICAgdG90YWxUb2tlbnNDYWNoZWQ6IDAsXG4gICAgfTtcblxuICAgIGNvbnN0IGNvbElkeDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb2xJZHhbcmVzcC5jb2x1bW5zW2ldXSA9IGk7XG4gICAgfVxuICAgIGNvbnN0IGdldENvbCA9IChyb3c6IFJvdywgbmFtZTogc3RyaW5nKTogYW55ID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IGNvbElkeFtuYW1lXTtcbiAgICAgIGlmIChpZHggPT09IHVuZGVmaW5lZCkgcmV0dXJuIG51bGw7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gcm93LmdldChpZHgpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXNwLnJvd3MpIHtcbiAgICAgIGNvbnN0IHN0YWdlVmFsID0gZ2V0Q29sKHJvdywgJ3N0YWdlJyk7XG4gICAgICBjb25zdCBkZXRhaWxWYWwgPSBnZXRDb2wocm93LCAnZGV0YWlsJyk7XG4gICAgICBjb25zdCBlbGFwc2VkVmFsID0gZ2V0Q29sKHJvdywgJ2VsYXBzZWRfbXMnKTtcbiAgICAgIGNvbnN0IHRJblZhbCA9IGdldENvbChyb3csICd0b2tlbnNfaW5wdXQnKTtcbiAgICAgIGNvbnN0IHRPdXRWYWwgPSBnZXRDb2wocm93LCAndG9rZW5zX291dHB1dCcpO1xuICAgICAgY29uc3QgdENhY2hlZFZhbCA9IGdldENvbChyb3csICd0b2tlbnNfY2FjaGVkJyk7XG4gICAgICBjb25zdCBkYXRhVmFsID0gZ2V0Q29sKHJvdywgJ2RhdGEnKTtcblxuICAgICAgY29uc3Qgc3RhZ2U6IEFpU3RhZ2UgPSB7XG4gICAgICAgIHN0YWdlOiBzdGFnZVZhbCA9PSBudWxsID8gJycgOiBTdHJpbmcoc3RhZ2VWYWwpLFxuICAgICAgICBkZXRhaWw6IGRldGFpbFZhbCA9PSBudWxsID8gJycgOiBTdHJpbmcoZGV0YWlsVmFsKSxcbiAgICAgICAgZWxhcHNlZE1zOiBlbGFwc2VkVmFsID09IG51bGwgPyAwIDogTnVtYmVyKGVsYXBzZWRWYWwpIHx8IDAsXG4gICAgICAgIHRva2Vuc0lucHV0OiB0SW5WYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIodEluVmFsKSB8fCAwLFxuICAgICAgICB0b2tlbnNPdXRwdXQ6IHRPdXRWYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIodE91dFZhbCkgfHwgMCxcbiAgICAgICAgdG9rZW5zQ2FjaGVkOiB0Q2FjaGVkVmFsID09IG51bGwgPyAwIDogTnVtYmVyKHRDYWNoZWRWYWwpIHx8IDAsXG4gICAgICAgIGRhdGE6IGRhdGFWYWwsXG4gICAgICB9O1xuICAgICAgcmVzdWx0LnN0YWdlcy5wdXNoKHN0YWdlKTtcblxuICAgICAgLy8gVHJhY2sgYWdncmVnYXRlczogZWxhcHNlZF9tcyBpcyBjdW11bGF0aXZlIG9uIHNlcnZlciBzaWRlLCB0YWtlIG1heC5cbiAgICAgIGlmIChzdGFnZS5lbGFwc2VkTXMgPiByZXN1bHQudG90YWxFbGFwc2VkTXMpIHtcbiAgICAgICAgcmVzdWx0LnRvdGFsRWxhcHNlZE1zID0gc3RhZ2UuZWxhcHNlZE1zO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnRvdGFsVG9rZW5zSW5wdXQgKz0gc3RhZ2UudG9rZW5zSW5wdXQ7XG4gICAgICByZXN1bHQudG90YWxUb2tlbnNPdXRwdXQgKz0gc3RhZ2UudG9rZW5zT3V0cHV0O1xuICAgICAgcmVzdWx0LnRvdGFsVG9rZW5zQ2FjaGVkICs9IHN0YWdlLnRva2Vuc0NhY2hlZDtcblxuICAgICAgLy8gRXh0cmFjdCBnZW5lcmF0ZWQgR1FMIGZyb20gYW55IHN0YWdlJ3MgZGF0YS5ncWwgLyAuZmluYWxfZ3FsIC8gLmNhbmRpZGF0ZVxuICAgICAgaWYgKHN0YWdlLmRhdGEgJiYgdHlwZW9mIHN0YWdlLmRhdGEgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHN0YWdlLmRhdGEpKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIFsnZ3FsJywgJ2ZpbmFsX2dxbCcsICdjYW5kaWRhdGUnXSkge1xuICAgICAgICAgIGNvbnN0IHZhbCA9IChzdGFnZS5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW2tleV07XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC50cmltKCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5nZW5lcmF0ZWRHcWwgPSB2YWw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN0YWdlLnN0YWdlID09PSAnZXJyb3InKSB7XG4gICAgICAgIHJlc3VsdC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgIHJlc3VsdC5lcnJvciA9IHN0YWdlLmRldGFpbCB8fCAnQUkgc3RhZ2UgcmVwb3J0ZWQgZXJyb3InO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhZ2Uuc3RhZ2UgPT09ICdmaW5hbCcpIHtcbiAgICAgICAgLy8gU2VydmVyIGVtaXRzIGV4ZWN1dGlvbiBtZXRhZGF0YSBkaWN0IGhlcmU7IGFpUmVhZCBvdmVyd3JpdGVzIHdpdGggYSByZWFsXG4gICAgICAgIC8vIFJlc3BvbnNlIGFmdGVyIHJlLWV4ZWN1dGluZyB0aGUgZ2VuZXJhdGVkIEdRTC4gVGhlIGBhbnlgIGhlcmUgaXMgdW5hdm9pZGFibGVcbiAgICAgICAgLy8gYmVjYXVzZSB0aGUgc2VydmVyIGhhbmRzIGJhY2sgYSBKU09OIGRpY3QgYmVmb3JlIHdlIGtub3cgdGhlIGZpbmFsIHNoYXBlLlxuICAgICAgICAocmVzdWx0IGFzIGFueSkuZGF0YSA9IHN0YWdlLmRhdGE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGlmIGdlbmVyYXRlZF9ncWwgd2FzIG5ldmVyIGNhcHR1cmVkIGZyb20gYSBkYXRhIGRpY3QsXG4gICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBmaW5hbCBzdGFnZSdzIGRldGFpbCBzdHJpbmcuXG4gICAgaWYgKHJlc3VsdC5nZW5lcmF0ZWRHcWwgPT09IG51bGwpIHtcbiAgICAgIGZvciAobGV0IGkgPSByZXN1bHQuc3RhZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIGNvbnN0IHMgPSByZXN1bHQuc3RhZ2VzW2ldO1xuICAgICAgICBpZiAocy5zdGFnZSA9PT0gJ2ZpbmFsJyAmJiBzLmRldGFpbCkge1xuICAgICAgICAgIHJlc3VsdC5nZW5lcmF0ZWRHcWwgPSBzLmRldGFpbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEludGVybmFsIEhlbHBlcnMg4oCUIFRyYWlsaW5nIENvbmZpZyBTcGxpdHRlclxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTcGxpdCBhIHZhcmlhZGljIGFyZyBsaXN0IHdoZXJlIHRoZSBsYXN0IGVsZW1lbnQgKm1heSogYmUgYSBRdWVyeUNvbmZpZ1xuICogaW50byBzZXBhcmF0ZSBzdHJpbmcgbmFtZXMgYW5kIGFuIG9wdGlvbmFsIGNvbmZpZy4gUHl0aG9uIHVzZXMga2V5d29yZC1vbmx5XG4gKiBgY29uZmlnYCBpbiB0aGVzZSBBUElzOyB0aGUgVHlwZVNjcmlwdCBlcXVpdmFsZW50IGlzIGFuIG9wdGlvbmFsIHRyYWlsaW5nXG4gKiBjb25maWcgb2JqZWN0IGRldGVjdGVkIGJ5IFwibm90IGEgc3RyaW5nXCIuXG4gKi9cbmZ1bmN0aW9uIHNwbGl0VHJhaWxpbmdDb25maWcoXG4gIGFyZ3M6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuKTogeyBuYW1lczogc3RyaW5nW107IGNvbmZpZz86IFF1ZXJ5Q29uZmlnIH0ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHJldHVybiB7IG5hbWVzOiBbXSB9O1xuICBjb25zdCBsYXN0ID0gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuICBpZiAobGFzdCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBsYXN0ICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB7IG5hbWVzOiBhcmdzLnNsaWNlKDAsIC0xKSBhcyBzdHJpbmdbXSwgY29uZmlnOiBsYXN0IGFzIFF1ZXJ5Q29uZmlnIH07XG4gIH1cbiAgLy8gSWYgbGFzdCBpcyB1bmRlZmluZWQsIHN0cmlwIGl0IGFzIGEgdHJhaWxpbmcgb3B0aW9uYWwgY29uZmlnIHBsYWNlaG9sZGVyLlxuICBpZiAobGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGFyZ3Muc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdIH07XG4gIH1cbiAgcmV0dXJuIHsgbmFtZXM6IGFyZ3MgYXMgc3RyaW5nW10gfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEludGVybmFsIEhlbHBlcnMg4oCUIFBhcnNpbmcgUmVzcG9uc2UgUm93c1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIEZpbmQgdGhlIGluZGV4IG9mIGEgY29sdW1uIGJ5IG5hbWUgKGNhc2UtaW5zZW5zaXRpdmUpLCBvciAtMSBpZiBub3QgZm91bmQgKi9cbmZ1bmN0aW9uIGZpbmRDb2x1bW5JbmRleChyZXNwOiBSZXNwb25zZSwgbmFtZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgbG93ZXIgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHJlc3AuY29sdW1uc1tpXS50b0xvd2VyQ2FzZSgpID09PSBsb3dlcikgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogU2FmZWx5IGV4dHJhY3QgYSBzdHJpbmcgZnJvbSBhIHJvdyBhdCB0aGUgZ2l2ZW4gY29sdW1uIGluZGV4ICovXG5mdW5jdGlvbiBnZXRTdHJpbmdWYWwocm93OiBSb3csIGlkeDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKGlkeCA8IDApIHJldHVybiAnJztcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWwgPSByb3cuZ2V0KGlkeCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuICcnO1xuICAgIHJldHVybiBTdHJpbmcodmFsKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICcnO1xuICB9XG59XG5cbi8qKiBTYWZlbHkgZXh0cmFjdCBhIG51bWJlciBmcm9tIGEgcm93IGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbmZ1bmN0aW9uIGdldE51bWJlclZhbChyb3c6IFJvdywgaWR4OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuIDA7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsID0gcm93LmdldChpZHgpO1xuICAgIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICAgIGNvbnN0IG51bSA9IE51bWJlcih2YWwpO1xuICAgIHJldHVybiBpc05hTihudW0pID8gMCA6IG51bTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBhIGxhYmVsIGNvbHVtbiB2YWx1ZSB0byBhIHN0cmluZyBhcnJheS5cbiAqXG4gKiBTZXJ2ZXIgcmV0dXJucyBhIGxpc3QgKG11bHRpLWxhYmVsIHN1cHBvcnQpLiBBY2NlcHQgbGlzdCBvZiBzdHJpbmdzLFxuICogYSBzaW5nbGUgc3RyaW5nIChkZWdyYWRlZCBzZXJ2ZXJzKSwgb3IgbnVsbC91bmRlZmluZWQuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlTGFiZWxzVmFsdWUodmFsOiBhbnkpOiBzdHJpbmdbXSB7XG4gIGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkgcmV0dXJuIHZhbC5tYXAoKHg6IGFueSkgPT4gU3RyaW5nKHgpKTtcbiAgcmV0dXJuIFtTdHJpbmcodmFsKV07XG59XG5cbmZ1bmN0aW9uIHBhcnNlTGFiZWxJbmZvUm93cyhyZXNwOiBSZXNwb25zZSwgZm9yY2VkVHlwZT86IHN0cmluZyk6IExhYmVsSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbGFiZWxJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2xhYmVsJyk7XG4gIGlmIChsYWJlbElkeCA8IDApIGxhYmVsSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGxldCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGlmICh0eXBlSWR4IDwgMCkgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZWxlbWVudF90eXBlJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+IHtcbiAgICBjb25zdCByYXdMYWJlbCA9IGxhYmVsSWR4ID49IDAgPyByb3cuZ2V0KGxhYmVsSWR4KSA6IG51bGw7XG4gICAgY29uc3QgdHlwZSA9IGZvcmNlZFR5cGUgIT09IHVuZGVmaW5lZCA/IGZvcmNlZFR5cGUgOiBnZXRTdHJpbmdWYWwocm93LCB0eXBlSWR4KTtcbiAgICByZXR1cm4ge1xuICAgICAgbGFiZWxzOiBwYXJzZUxhYmVsc1ZhbHVlKHJhd0xhYmVsKSxcbiAgICAgIHR5cGUsXG4gICAgfTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlTm9kZVR5cGVJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IE5vZGVUeXBlSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBsZXQgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IHByb3BzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG5cbiAgaWYgKG5hbWVJZHggPCAwKSBuYW1lSWR4ID0gdHlwZUlkeDtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBuYW1lOiBnZXRTdHJpbmdWYWwocm93LCBuYW1lSWR4KSxcbiAgICBwcm9wZXJ0aWVzOiBwYXJzZVByb3BlcnR5U3RyaW5nKGdldFN0cmluZ1ZhbChyb3csIHByb3BzSWR4KSksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VFZGdlVHlwZUluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogRWRnZVR5cGVJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgcHJvcHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcblxuICBpZiAobmFtZUlkeCA8IDApIG5hbWVJZHggPSB0eXBlSWR4O1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIHByb3BlcnRpZXM6IHBhcnNlUHJvcGVydHlTdHJpbmcoZ2V0U3RyaW5nVmFsKHJvdywgcHJvcHNJZHgpKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUFsZ29JbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEFsZ29JbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgZGVzY0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZGVzY3JpcHRpb24nKTtcbiAgY29uc3QgdmVySWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd2ZXJzaW9uJyk7XG4gIGNvbnN0IHBhcmFtc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncGFyYW1ldGVycycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIGRlc2NyaXB0aW9uOiBnZXRTdHJpbmdWYWwocm93LCBkZXNjSWR4KSxcbiAgICB2ZXJzaW9uOiBnZXRTdHJpbmdWYWwocm93LCB2ZXJJZHgpLFxuICAgIHBhcmFtZXRlcnM6IGdldFN0cmluZ1ZhbChyb3csIHBhcmFtc0lkeCksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogSW5kZXhJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeE5hbWUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4X25hbWUnKTtcbiAgY29uc3QgaWR4RW50aXR5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbnRpdHlfdHlwZScpO1xuICBjb25zdCBpZHhMYWJlbCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbGFiZWwnKTtcbiAgY29uc3QgaWR4UHJvcCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydHknKTtcbiAgY29uc3QgaWR4UHJlZml4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcmVmaXhfbGVuZ3RoJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuICBjb25zdCBpZHhJbmRleGVkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleGVkX2NvdW50Jyk7XG4gIGNvbnN0IGlkeFRvdGFsID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0b3RhbF9jb3VudCcpO1xuICBjb25zdCBpZHhFcnJvciA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZXJyb3InKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IGluZm86IEluZGV4SW5mbyA9IHtcbiAgICAgIGluZGV4TmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TmFtZSksXG4gICAgICBlbnRpdHlUeXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhFbnRpdHkpLFxuICAgICAgbGFiZWw6IGdldFN0cmluZ1ZhbChyb3csIGlkeExhYmVsKSxcbiAgICAgIHByb3BlcnR5OiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9wKSxcbiAgICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gICAgICBpbmRleGVkQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeEluZGV4ZWQpLFxuICAgICAgdG90YWxDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4VG90YWwpLFxuICAgICAgZXJyb3I6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVycm9yKSxcbiAgICB9O1xuICAgIGlmIChpZHhQcmVmaXggPj0gMCkge1xuICAgICAgaW5mby5wcmVmaXhMZW5ndGggPSBnZXROdW1iZXJWYWwocm93LCBpZHhQcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gaW5mbztcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IEZ1bGx0ZXh0SW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhOYW1lID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdpbmRleF9uYW1lJyk7XG4gIGNvbnN0IGlkeEVudGl0eSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZW50aXR5X3R5cGUnKTtcbiAgY29uc3QgaWR4U2NoZW1hID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzY2hlbWFfbmFtZScpO1xuICBjb25zdCBpZHhQcm9wcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuICBjb25zdCBpZHhBbmFseXplciA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnYW5hbHl6ZXInKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4RG9jQ291bnQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2RvY19jb3VudCcpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICBpbmRleE5hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeE5hbWUpLFxuICAgIGVudGl0eVR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVudGl0eSksXG4gICAgc2NoZW1hTmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U2NoZW1hKSxcbiAgICBwcm9wZXJ0aWVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9wcyksXG4gICAgYW5hbHl6ZXI6IGdldFN0cmluZ1ZhbChyb3csIGlkeEFuYWx5emVyKSxcbiAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgZG9jQ291bnQ6IGdldE51bWJlclZhbChyb3csIGlkeERvY0NvdW50KSxcbiAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVGFza0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogVGFza0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4SWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Rhc2tfaWQnKTtcbiAgY29uc3QgaWR4VHlwZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBpZHhRdWVyeSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncXVlcnknKTtcbiAgY29uc3QgaWR4QWxnbyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnYWxnb19uYW1lJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG4gIGNvbnN0IGlkeFN0YXJ0ZWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXJ0ZWRfYXQnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG4gIGNvbnN0IGlkeFBhcmFtcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncGFyYW1ldGVycycpO1xuICBjb25zdCBpZHhOb2RlcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbm9kZXNfd3JpdHRlbicpO1xuICBjb25zdCBpZHhDb21wdXRlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdjb21wdXRlX3RpbWVfbXMnKTtcbiAgY29uc3QgaWR4V3JpdGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3dyaXRlX3RpbWVfbXMnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4gKHtcbiAgICB0YXNrSWQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeElkKSxcbiAgICB0eXBlOiBnZXRTdHJpbmdWYWwocm93LCBpZHhUeXBlKSxcbiAgICBxdWVyeTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UXVlcnkpLFxuICAgIGFsZ29OYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhBbGdvKSxcbiAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gICAgc3RhcnRlZEF0OiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGFydGVkKSxcbiAgICBwcm9ncmVzczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UHJvZ3Jlc3MpLFxuICAgIHBhcmFtZXRlcnM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFBhcmFtcyksXG4gICAgbm9kZXNXcml0dGVuOiBnZXROdW1iZXJWYWwocm93LCBpZHhOb2RlcyksXG4gICAgY29tcHV0ZVRpbWVNczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4Q29tcHV0ZSksXG4gICAgd3JpdGVUaW1lTXM6IGdldE51bWJlclZhbChyb3csIGlkeFdyaXRlKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZVByb2Nlc3NJbmZvUm93cyhyZXNwOiBSZXNwb25zZSk6IFByb2Nlc3NJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeElkID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeV9pZCcpO1xuICBjb25zdCBpZHhUZXh0ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeV90ZXh0Jyk7XG4gIGNvbnN0IGlkeFN0YXJ0ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGFydF90aW1lJyk7XG4gIGNvbnN0IGlkeER1cmF0aW9uID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkdXJhdGlvbl9tcycpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIHF1ZXJ5SWQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeElkKSxcbiAgICBxdWVyeVRleHQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeFRleHQpLFxuICAgIHN0YXJ0VGltZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhcnQpLFxuICAgIGR1cmF0aW9uTXM6IGdldE51bWJlclZhbChyb3csIGlkeER1cmF0aW9uKSxcbiAgICBzdGF0dXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXR1cyksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VHcmFwaFN0YXRzKHJlc3A6IFJlc3BvbnNlKTogR3JhcGhTdGF0cyB7XG4gIGNvbnN0IGdzOiBHcmFwaFN0YXRzID0ge1xuICAgIGdyYXBoTmFtZTogJycsXG4gICAgbm9kZUNvdW50OiAwLFxuICAgIGVkZ2VDb3VudDogMCxcbiAgICBsYWJlbENvdW50czoge30sXG4gICAgZWRnZUxhYmVsQ291bnRzOiB7fSxcbiAgICBub2RlUHJvcGVydHlTdGF0czoge30sXG4gICAgZWRnZVByb3BlcnR5U3RhdHM6IHt9LFxuICB9O1xuXG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gZ3M7XG5cbiAgbGV0IHN0YXRzSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0cycpO1xuICBpZiAoc3RhdHNJZHggPCAwKSBzdGF0c0lkeCA9IDA7XG5cbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDAgfHwgc3RhdHNJZHggPj0gcmVzcC5yb3dzWzBdLnZhbHVlcy5sZW5ndGgpIHJldHVybiBncztcblxuICBjb25zdCB2YWwgPSByZXNwLnJvd3NbMF0uZ2V0KHN0YXRzSWR4KTtcbiAgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0Jykge1xuICAgIGlmICh2YWwuZ3JhcGhfbmFtZSAhPT0gdW5kZWZpbmVkKSBncy5ncmFwaE5hbWUgPSBTdHJpbmcodmFsLmdyYXBoX25hbWUpO1xuICAgIGlmICh2YWwubm9kZV9jb3VudCAhPT0gdW5kZWZpbmVkKSBncy5ub2RlQ291bnQgPSBOdW1iZXIodmFsLm5vZGVfY291bnQpIHx8IDA7XG4gICAgaWYgKHZhbC5lZGdlX2NvdW50ICE9PSB1bmRlZmluZWQpIGdzLmVkZ2VDb3VudCA9IE51bWJlcih2YWwuZWRnZV9jb3VudCkgfHwgMDtcbiAgfVxuXG4gIHJldHVybiBncztcbn1cbiJdfQ==
1504
+ // --- Delete API helpers ---
1505
+ function formatStringList(ids) {
1506
+ // Escape single quotes and backslashes for safe GQL injection.
1507
+ return ids.map(id => {
1508
+ if (id == null)
1509
+ return "''";
1510
+ const escaped = id.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
1511
+ return `'${escaped}'`;
1512
+ }).join(', ');
1513
+ }
1514
+ /**
1515
+ * Reshape raw 5-col edge-delete response into single "e" column
1516
+ * holding GqldbEdge objects — symmetric with the node path
1517
+ * (`response.alias("n").asNodes()` vs `response.alias("e").asEdges()`).
1518
+ * Rows with a null id are skipped (no id = no meaningful Edge).
1519
+ */
1520
+ function reshapeEdgeDelete(raw) {
1521
+ const newRows = [];
1522
+ for (const r of raw.rows) {
1523
+ const id = r.length > 0 ? r.get(0) : null;
1524
+ if (id == null)
1525
+ continue;
1526
+ const from = r.length > 1 ? r.get(1) : null;
1527
+ const to = r.length > 2 ? r.get(2) : null;
1528
+ const label = r.length > 3 ? r.get(3) : null;
1529
+ const props = r.length > 4 ? r.get(4) : {};
1530
+ const edge = {
1531
+ id: String(id),
1532
+ uuid: '',
1533
+ label: label ? String(label) : '',
1534
+ fromNodeId: from ? String(from) : '',
1535
+ toNodeId: to ? String(to) : '',
1536
+ properties: (props && typeof props === 'object') ? props : {},
1537
+ };
1538
+ // Mark the column as PropertyType.EDGE so AliasResult.asEdges() picks it up.
1539
+ newRows.push(new response_1.Row([edge], [types_1.PropertyType.EDGE]));
1540
+ }
1541
+ return new response_1.Response(['e'], newRows, newRows.length, raw.hasMore, raw.warnings, raw.rowsAffected, raw.currentGraph, raw.timeCostNs, raw.diskCostNs, raw.computeCostNs);
1542
+ }
1543
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILG9EQUFzQztBQUV0QyxxQ0FBdUQ7QUFFdkQseUNBVW9CO0FBQ3BCLHVDQUFvRDtBQUNwRCwrQ0FBZ0U7QUFDaEUsbUNBNkNpQjtBQUNqQix5Q0FBNEY7QUFDNUYsNENBVzBCO0FBK0QxQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FBQyxJQUE0QjtJQUN4RCxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ2IsS0FBSyxrQkFBVSxDQUFDLFNBQVM7WUFDdkIsT0FBTyxrQkFBa0IsQ0FBQztRQUM1QixLQUFLLGtCQUFVLENBQUMsTUFBTTtZQUNwQixPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQWEsV0FBVztJQUNkLE1BQU0sQ0FBYztJQUNwQixPQUFPLENBQWlCO0lBQ3hCLFFBQVEsQ0FBaUI7SUFDekIsU0FBUyxDQUFxQjtJQUM5QixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBRXZCLHdDQUF3QztJQUNoQyxjQUFjLEdBQVcsRUFBRSxDQUFDO0lBQzVCLGNBQWMsR0FBVyxFQUFFLENBQUM7SUFDNUIsV0FBVyxHQUFXLEVBQUUsQ0FBQztJQUVqQyxvQkFBb0I7SUFDWixjQUFjLENBQWlCO0lBQy9CLFlBQVksQ0FBZTtJQUMzQixZQUFZLENBQWU7SUFDM0Isa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUN6QixhQUFhLENBQWdCO0lBQzdCLFlBQVksQ0FBZTtJQUMzQixpQkFBaUIsQ0FBb0I7SUFFN0Msc0RBQXNEO0lBQzlDLGtCQUFrQjtRQUN4QixNQUFNLFFBQVEsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLEVB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VUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ3hFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1haW4gY2xpZW50IGZvciBHUUxEQiBOb2RlLmpzIGRyaXZlci5cbiAqL1xuXG5pbXBvcnQgKiBhcyBncnBjIGZyb20gJ0BncnBjL2dycGMtanMnO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCB7IEdxbGRiQ29uZmlnLCB2YWxpZGF0ZUNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IEVtcHR5UXVlcnlFcnJvciwgTG9naW5GYWlsZWRFcnJvciwgUXVlcnlGYWlsZWRFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7XG4gIFJlc3BvbnNlLFxuICBSb3csXG4gIEluc2VydE5vZGVzUmVzdWx0LFxuICBJbnNlcnRFZGdlc1Jlc3VsdCxcbiAgRXhwb3J0Tm9kZXNSZXN1bHQsXG4gIEV4cG9ydEVkZ2VzUmVzdWx0LFxuICBFeHBvcnRDb25maWcsXG4gIEV4cG9ydENodW5rLFxuICBFeHBvcnRTdGF0cyxcbn0gZnJvbSAnLi9yZXNwb25zZSc7XG5pbXBvcnQgeyBTZXNzaW9uLCBTZXNzaW9uTWFuYWdlciB9IGZyb20gJy4vc2Vzc2lvbic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgVHJhbnNhY3Rpb25NYW5hZ2VyIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQge1xuICBHcmFwaEluZm8sXG4gIEdyYXBoVHlwZSxcbiAgSGVhbHRoU3RhdHVzLFxuICBDYWNoZVN0YXRzLFxuICBDYWNoZVR5cGUsXG4gIFN0YXRpc3RpY3MsXG4gIENvbXBhY3RSZXN1bHQsXG4gIENvbXB1dGVUb3BvbG9neVJlc3VsdCxcbiAgU3lzdGVtTWV0cmljcyxcbiAgTm9kZURhdGEsXG4gIEVkZ2VEYXRhLFxuICBCdWxrQ3JlYXRlTm9kZXNPcHRpb25zLFxuICBCdWxrQ3JlYXRlRWRnZXNPcHRpb25zLFxuICBCdWxrSW1wb3J0T3B0aW9ucyxcbiAgQnVsa0ltcG9ydFNlc3Npb24sXG4gIENoZWNrcG9pbnRSZXN1bHQsXG4gIEVuZEJ1bGtJbXBvcnRSZXN1bHQsXG4gIEFib3J0QnVsa0ltcG9ydFJlc3VsdCxcbiAgQnVsa0ltcG9ydFN0YXR1cyxcbiAgVHJhbnNhY3Rpb25JbmZvLFxuICBUcmFuc2FjdGlvblJvdyxcbiAgREJUeXBlLFxuICBJbnNlcnRUeXBlLFxuICBQcm9wZXJ0eVR5cGUsXG4gIExhYmVsSW5mbyxcbiAgTm9kZVR5cGVJbmZvLFxuICBFZGdlVHlwZUluZm8sXG4gIExhYmVsRGVmLFxuICBDb252UHJvcGVydHlEZWYsXG4gIEluZGV4UHJvcGVydHksXG4gIEluZGV4SW5mbyxcbiAgRnVsbHRleHRJbmZvLFxuICBUYXNrSW5mbyxcbiAgUHJvY2Vzc0luZm8sXG4gIEdyYXBoU3RhdHMsXG4gIEFsZ29JbmZvLFxuICBBaVN0YWdlLFxuICBBaVJlYWRSZXN1bHQsXG4gIHBhcnNlUHJvcGVydHlTdHJpbmcsXG4gIGJ1aWxkUHJvcGVydHlEZWZTdHJpbmcsXG4gIGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyxcbiAgYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcsXG4gIHVzZUdyYXBoUHJlZml4LFxuICBkYlR5cGVUb0tleXdvcmQsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgY3JlYXRlU2VydmljZUNsaWVudHMsIHByb21pc2lmeUNhbGwsIHByb21pc2lmeUNhbGxXaXRoRGVhZGxpbmUgfSBmcm9tICcuL3NlcnZpY2VzJztcbmltcG9ydCB7XG4gIFNlcnZpY2VDb250ZXh0LFxuICBTZXJ2aWNlQ2xpZW50cyxcbiAgU2Vzc2lvblNlcnZpY2UsXG4gIFF1ZXJ5U2VydmljZSxcbiAgR3JhcGhTZXJ2aWNlLFxuICBUcmFuc2FjdGlvblNlcnZpY2UsXG4gIERhdGFTZXJ2aWNlLFxuICBIZWFsdGhTZXJ2aWNlLFxuICBBZG1pblNlcnZpY2UsXG4gIEJ1bGtJbXBvcnRTZXJ2aWNlLFxufSBmcm9tICcuL3NlcnZpY2VzL2luZGV4JztcblxuLyoqIENvbmZpZ3VyYXRpb24gZm9yIGEgcXVlcnkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDb25maWcge1xuICBncmFwaE5hbWU/OiBzdHJpbmc7XG4gIHBhcmFtZXRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICB0cmFuc2FjdGlvbklkPzogbnVtYmVyO1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICByZWFkT25seT86IGJvb2xlYW47XG4gIC8qKiBNYXggcGF0aHMgdG8gcmV0dXJuIGZyb20gcGF0aCBxdWVyaWVzICgwID0gdW5saW1pdGVkKSAqL1xuICBtYXhQYXRoUmVzdWx0cz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnROb2RlcyAvIGluc2VydEVkZ2VzIGNvbnZlbmllbmNlIG1ldGhvZHMuXG4gKiBFeHRlbmRzIFF1ZXJ5Q29uZmlnIHdpdGggaW5zZXJ0LXNwZWNpZmljIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0Q29uZmlnIGV4dGVuZHMgUXVlcnlDb25maWcge1xuICAvKiogSW5zZXJ0IG1vZGUuIERlZmF1bHRzIHRvIEluc2VydFR5cGUuTm9ybWFsIHdoZW4gb21pdHRlZC4gKi9cbiAgaW5zZXJ0VHlwZT86IEluc2VydFR5cGU7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIG5ldyBHUUwtZW1pdHRlciBkZWxldGUgQVBJXG4gKiAoZGVsZXRlTm9kZXNCeUlkcyAvIGRlbGV0ZU5vZGVzQnlDb25kaXRpb24gL1xuICogIGRlbGV0ZUVkZ2VzQnlJZHMgLyBkZWxldGVFZGdlc0J5Q29uZGl0aW9uKS5cbiAqXG4gKiBFeHRlbmRzIFF1ZXJ5Q29uZmlnIHNvIHBlci1jYWxsIGBncmFwaE5hbWVgIHdvcmtzIHRoZSBzYW1lIGFzXG4gKiBgSW5zZXJ0Q29uZmlnYC4gVHdvIGRlbGV0ZS1zcGVjaWZpYyBrbm9iczpcbiAqICAgLSBgcmV0dXJuRGVsZXRlZGAgKGRlZmF1bHQgdHJ1ZSkg4oCUIGVtaXQgYFJFVFVSTiAuLi5gIHNvIHRoZVxuICogICAgIHJlc3BvbnNlIGNhcnJpZXMgdGhlIGZ1bGwgZGVsZXRlZCBub2RlL2VkZ2UgZGF0YS4gU2V0IHRvIGZhbHNlXG4gKiAgICAgb24gbGFyZ2UgYnVsayBkZWxldGVzIHRvIHNhdmUgYmFuZHdpZHRoOyBgcm93c0FmZmVjdGVkYCBzdGlsbFxuICogICAgIGNhcnJpZXMgdGhlIGNvdW50LlxuICogICAtIGBhbGxvd0RlbGV0ZUFsbGAgKGRlZmF1bHQgZmFsc2UpIOKAlCBzYWZldHkgbGF0Y2guIFdpdGggZW1wdHlcbiAqICAgICBsYWJlbHMvaWRzIEFORCBlbXB0eSB3aGVyZSwgdGhlIFNESyB3b3VsZCBvdGhlcndpc2UgZW1pdCBhXG4gKiAgICAgZ3JhcGgtd2lkZSBkZWxldGU7IHRoaXMgZmxhZyBtdXN0IGJlIGV4cGxpY2l0bHkgdHJ1ZSB0byBvcHQgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQ29uZmlnIGV4dGVuZHMgUXVlcnlDb25maWcge1xuICByZXR1cm5EZWxldGVkPzogYm9vbGVhbjtcbiAgYWxsb3dEZWxldGVBbGw/OiBib29sZWFuO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBmb3IgaW5zZXJ0IG5vZGVzICovXG5leHBvcnQgaW50ZXJmYWNlIEluc2VydE5vZGVzQ29uZmlnIHtcbiAgb3B0aW9ucz86IEJ1bGtDcmVhdGVOb2Rlc09wdGlvbnM7XG4gIGJ1bGtJbXBvcnRTZXNzaW9uSWQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb25maWd1cmF0aW9uIGZvciBpbnNlcnQgZWRnZXMgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zZXJ0RWRnZXNDb25maWcge1xuICBvcHRpb25zPzogQnVsa0NyZWF0ZUVkZ2VzT3B0aW9ucztcbiAgYnVsa0ltcG9ydFNlc3Npb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBIZWFsdGggd2F0Y2hlciBpbnRlcmZhY2UgZm9yIHN0cmVhbWluZyBoZWFsdGggdXBkYXRlcy5cbiAqIEVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyBhbmQgJ2Vycm9yJyBldmVudHMgb24gZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIZWFsdGhXYXRjaGVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqIFN0b3Agd2F0Y2hpbmcgaGVhbHRoIHVwZGF0ZXMgKi9cbiAgc3RvcCgpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1hcCBhbiBgSW5zZXJ0VHlwZWAgdmFsdWUgdG8gdGhlIEdRTCBrZXl3b3JkKHMpIHNlbGVjdGluZyB0aGVcbiAqIG1hdGNoaW5nIHNlcnZlci1zaWRlIHNlbWFudGljcy5cbiAqXG4gKiAgIC0gYEluc2VydFR5cGUuTm9ybWFsYCAgICAtPiBgXCJJTlNFUlRcImAgKGVycm9yIG9uIGR1cGxpY2F0ZSBgX2lkYClcbiAqICAgLSBgSW5zZXJ0VHlwZS5PdmVyd3JpdGVgIC0+IGBcIklOU0VSVCBPVkVSV1JJVEVcImAgKHJlcGxhY2Ugb24gZHVwbGljYXRlKVxuICogICAtIGBJbnNlcnRUeXBlLlVwc2VydGAgICAgLT4gYFwiVVBTRVJUXCJgIChtZXJnZSBvbiBkdXBsaWNhdGUpXG4gKlxuICogYE92ZXJ3cml0ZWAgYW5kIGBVcHNlcnRgIGFyZSBkaWZmZXJlbnQgc2VtYW50aWNzIG9uIGV4aXN0aW5nIHJvd3M7XG4gKiB0aGV5IGFyZSBOT1QgaW50ZXJjaGFuZ2VhYmxlLiBTZWUge0BsaW5rIEluc2VydFR5cGV9IGRvY3MuXG4gKi9cbmZ1bmN0aW9uIGluc2VydEtleXdvcmRGb3JUeXBlKHR5cGU6IEluc2VydFR5cGUgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEluc2VydFR5cGUuT3ZlcndyaXRlOlxuICAgICAgcmV0dXJuICdJTlNFUlQgT1ZFUldSSVRFJztcbiAgICBjYXNlIEluc2VydFR5cGUuVXBzZXJ0OlxuICAgICAgcmV0dXJuICdVUFNFUlQnO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gJ0lOU0VSVCc7XG4gIH1cbn1cblxuLyoqIE1haW4gY2xpZW50IGZvciBpbnRlcmFjdGluZyB3aXRoIEdRTERCICovXG5leHBvcnQgY2xhc3MgR3FsZGJDbGllbnQge1xuICBwcml2YXRlIGNvbmZpZzogR3FsZGJDb25maWc7XG4gIHByaXZhdGUgY2xpZW50czogU2VydmljZUNsaWVudHM7XG4gIHByaXZhdGUgc2Vzc2lvbnM6IFNlc3Npb25NYW5hZ2VyO1xuICBwcml2YXRlIHR4TWFuYWdlcjogVHJhbnNhY3Rpb25NYW5hZ2VyO1xuICBwcml2YXRlIGNsb3NlZCA9IGZhbHNlO1xuXG4gIC8vIFN0b3JlZCBjcmVkZW50aWFscyBmb3IgYXV0by1yZWNvbm5lY3RcbiAgcHJpdmF0ZSBzdG9yZWRVc2VybmFtZTogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgc3RvcmVkUGFzc3dvcmQ6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIHN0b3JlZEdyYXBoOiBzdHJpbmcgPSAnJztcblxuICAvLyBTZXJ2aWNlIGluc3RhbmNlc1xuICBwcml2YXRlIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZTtcbiAgcHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcbiAgcHJpdmF0ZSBncmFwaFNlcnZpY2U6IEdyYXBoU2VydmljZTtcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvblNlcnZpY2U6IFRyYW5zYWN0aW9uU2VydmljZTtcbiAgcHJpdmF0ZSBkYXRhU2VydmljZTogRGF0YVNlcnZpY2U7XG4gIHByaXZhdGUgaGVhbHRoU2VydmljZTogSGVhbHRoU2VydmljZTtcbiAgcHJpdmF0ZSBhZG1pblNlcnZpY2U6IEFkbWluU2VydmljZTtcbiAgcHJpdmF0ZSBidWxrSW1wb3J0U2VydmljZTogQnVsa0ltcG9ydFNlcnZpY2U7XG5cbiAgLyoqIEdldCBzZXNzaW9uIG1ldGFkYXRhIGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzICovXG4gIHByaXZhdGUgZ2V0U2Vzc2lvbk1ldGFkYXRhKCk6IGdycGMuTWV0YWRhdGEge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gbmV3IGdycGMuTWV0YWRhdGEoKTtcbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gICAgbWV0YWRhdGEuYWRkKCdzZXNzaW9uLWlkJywgc2Vzc2lvbj8uaWQ/LnRvU3RyaW5nKCkgfHwgJzAnKTtcbiAgICBpZiAodGhpcy5jbGllbnRTZXNzaW9uSWQpIHtcbiAgICAgIG1ldGFkYXRhLmFkZCgneC11bHRpcGEtc2Vzc2lvbi1pZCcsIHRoaXMuY2xpZW50U2Vzc2lvbklkKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YWJsZSBwZXItY2xpZW50IGxvZ2ljYWwgc2Vzc2lvbiBpZCBzdXJmYWNlZCB1bmRlciB0aGVcbiAgICogdHJhbnNhY3Rpb24tYnJhbmNoIG1vZGVsLiBTZWUgVFJBTlNBQ1RJT05TX0RSSVZFUl9HVUlERS5tZCDCpzIuMOKAkzIuMS5cbiAgICogRmFsbHMgYmFjayB0byBhIFVVSUQgdjQgaGV4IGdlbmVyYXRlZCBhdCBjb25zdHJ1Y3Rpb24gd2hlblxuICAgKiBgY29uZmlnLnNlc3Npb25JZGAgaXMgbm90IHNldC5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBjbGllbnRTZXNzaW9uSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IEdxbGRiQ29uZmlnKSB7XG4gICAgdmFsaWRhdGVDb25maWcoY29uZmlnKTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLnNlc3Npb25zID0gbmV3IFNlc3Npb25NYW5hZ2VyKCk7XG4gICAgdGhpcy50eE1hbmFnZXIgPSBuZXcgVHJhbnNhY3Rpb25NYW5hZ2VyKCk7XG4gICAgLy8gQm9vdHN0cmFwIHN0YWJsZSBwZXItY2xpZW50IHNlc3Npb24gaWQgKHVzZWQgYXMgYHgtdWx0aXBhLXNlc3Npb24taWRgXG4gICAgLy8gbWV0YWRhdGEgd2hlbiDCpzIuMSBvcHQtaW4gaXMgZW5hYmxlZCwgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IFRyYW5zYWN0aW9uKS5cbiAgICBjb25zdCBjZmdTaWQgPSAoY29uZmlnIGFzIGFueSkuc2Vzc2lvbklkIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsaWVudFNlc3Npb25JZCA9IGNmZ1NpZCAmJiBjZmdTaWQubGVuZ3RoID4gMFxuICAgICAgPyBjZmdTaWRcbiAgICAgIDogcmVxdWlyZSgnY3J5cHRvJykucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgIC8vIENyZWF0ZSBnUlBDIGNyZWRlbnRpYWxzXG4gICAgbGV0IGNyZWRlbnRpYWxzOiBncnBjLkNoYW5uZWxDcmVkZW50aWFscztcbiAgICBpZiAoY29uZmlnLnRsc09wdGlvbnMpIHtcbiAgICAgIGNyZWRlbnRpYWxzID0gZ3JwYy5jcmVkZW50aWFscy5jcmVhdGVTc2woKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3JlZGVudGlhbHMgPSBncnBjLmNyZWRlbnRpYWxzLmNyZWF0ZUluc2VjdXJlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hhbm5lbCBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uczogZ3JwYy5DaGFubmVsT3B0aW9ucyA9IHtcbiAgICAgICdncnBjLm1heF9yZWNlaXZlX21lc3NhZ2VfbGVuZ3RoJzogY29uZmlnLm1heFJlY3ZTaXplID8/IDY0ICogMTAyNCAqIDEwMjQsXG4gICAgICAnZ3JwYy5tYXhfc2VuZF9tZXNzYWdlX2xlbmd0aCc6IGNvbmZpZy5tYXhSZWN2U2l6ZSA/PyA2NCAqIDEwMjQgKiAxMDI0LFxuICAgICAgJ2dycGMua2VlcGFsaXZlX3RpbWVfbXMnOiAzMDAwMCxcbiAgICAgICdncnBjLmtlZXBhbGl2ZV90aW1lb3V0X21zJzogMTAwMDAsXG4gICAgICAnZ3JwYy5rZWVwYWxpdmVfcGVybWl0X3dpdGhvdXRfY2FsbHMnOiAxLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgc2VydmljZSBjbGllbnRzIGZvciB0aGUgZmlyc3QgaG9zdFxuICAgIGNvbnN0IGhvc3QgPSBjb25maWcuaG9zdHNbMF07XG4gICAgdGhpcy5jbGllbnRzID0gY3JlYXRlU2VydmljZUNsaWVudHMoaG9zdCwgY3JlZGVudGlhbHMsIG9wdGlvbnMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzZXJ2aWNlIGNvbnRleHRcbiAgICBjb25zdCBjdHggPSBuZXcgU2VydmljZUNvbnRleHQodGhpcy5jb25maWcsIHRoaXMuc2Vzc2lvbnMsIHRoaXMudHhNYW5hZ2VyLCB0aGlzLmNsaWVudHMsIHRoaXMuY2xpZW50U2Vzc2lvbklkKTtcblxuICAgIC8vIEluaXRpYWxpemUgc2VydmljZSBpbnN0YW5jZXNcbiAgICB0aGlzLnNlc3Npb25TZXJ2aWNlID0gbmV3IFNlc3Npb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5xdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5ncmFwaFNlcnZpY2UgPSBuZXcgR3JhcGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy50cmFuc2FjdGlvblNlcnZpY2UgPSBuZXcgVHJhbnNhY3Rpb25TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5kYXRhU2VydmljZSA9IG5ldyBEYXRhU2VydmljZShjdHgpO1xuICAgIHRoaXMuaGVhbHRoU2VydmljZSA9IG5ldyBIZWFsdGhTZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5hZG1pblNlcnZpY2UgPSBuZXcgQWRtaW5TZXJ2aWNlKGN0eCk7XG4gICAgdGhpcy5idWxrSW1wb3J0U2VydmljZSA9IG5ldyBCdWxrSW1wb3J0U2VydmljZShjdHgpO1xuICB9XG5cbiAgLyoqIENsb3NlIHRoZSBjbGllbnQgYW5kIGFsbCBjb25uZWN0aW9ucyAqL1xuICBhc3luYyBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICBpZiAodGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMubG9nb3V0KCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIElnbm9yZSBsb2dvdXQgZXJyb3JzIGR1cmluZyBjbG9zZVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENsb3NlIGFsbCBzZXJ2aWNlIGNsaWVudHNcbiAgICB0cnkge1xuICAgICAgKHRoaXMuY2xpZW50cy5zZXNzaW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMucXVlcnlTZXJ2aWNlIGFzIGFueSkuY2xvc2U/LigpO1xuICAgICAgKHRoaXMuY2xpZW50cy5ncmFwaFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLnRyYW5zYWN0aW9uU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuZGF0YVNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmhlYWx0aFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgICAodGhpcy5jbGllbnRzLmFkbWluU2VydmljZSBhcyBhbnkpLmNsb3NlPy4oKTtcbiAgICAgICh0aGlzLmNsaWVudHMuYnVsa0ltcG9ydFNlcnZpY2UgYXMgYW55KS5jbG9zZT8uKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIGNsb3NlIGVycm9yc1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTZXNzaW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIEF1dGhlbnRpY2F0ZSB0aGUgdXNlciBhbmQgY3JlYXRlIGEgc2Vzc2lvbiAqL1xuICBhc3luYyBsb2dpbih1c2VybmFtZTogc3RyaW5nLCBwYXNzd29yZDogc3RyaW5nKTogUHJvbWlzZTxTZXNzaW9uPiB7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuc2Vzc2lvblNlcnZpY2UubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkLCB0aGlzLmNvbmZpZy5kZWZhdWx0R3JhcGggfHwgJycpO1xuICAgIC8vIFN0b3JlIGNyZWRlbnRpYWxzIGZvciBhdXRvLXJlY29ubmVjdFxuICAgIHRoaXMuc3RvcmVkVXNlcm5hbWUgPSB1c2VybmFtZTtcbiAgICB0aGlzLnN0b3JlZFBhc3N3b3JkID0gcGFzc3dvcmQ7XG4gICAgcmV0dXJuIHNlc3Npb247XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBmbiBhbmQgYXV0by1yZWNvbm5lY3Qgb24gVU5BVVRIRU5USUNBVEVEIGVycm9yLlxuICAgKiBJZiBmbiB0aHJvd3MgYW4gVU5BVVRIRU5USUNBVEVEIGdSUEMgZXJyb3IgYW5kIGNyZWRlbnRpYWxzIGFyZSBzdG9yZWQsXG4gICAqIHJlLWxvZ2luIGFuZCByZXRyeSBmbiBvbmNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3aXRoQXV0b1JlY29ubmVjdDxUPihmbjogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnN0IG1zZ0xvd2VyID0gZT8ubWVzc2FnZSA/IFN0cmluZyhlLm1lc3NhZ2UpLnRvTG93ZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGlzVW5hdXRoZW50aWNhdGVkID1cbiAgICAgICAgKGU/LmNvZGUgPT09IGdycGMuc3RhdHVzLlVOQVVUSEVOVElDQVRFRCkgfHxcbiAgICAgICAgbXNnTG93ZXIuaW5jbHVkZXMoJ3VuYXV0aGVudGljYXRlZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIG5vdCBmb3VuZCcpIHx8XG4gICAgICAgIG1zZ0xvd2VyLmluY2x1ZGVzKCdzZXNzaW9uIGV4cGlyZWQnKTtcbiAgICAgIGlmIChpc1VuYXV0aGVudGljYXRlZCAmJiB0aGlzLnN0b3JlZFVzZXJuYW1lKSB7XG4gICAgICAgIC8vIFNhdmUgY3VycmVudCBncmFwaCBjb250ZXh0IGJlZm9yZSByZS1sb2dpblxuICAgICAgICBjb25zdCBzYXZlZEdyYXBoID0gdGhpcy5zdG9yZWRHcmFwaDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmxvZ2luKHRoaXMuc3RvcmVkVXNlcm5hbWUsIHRoaXMuc3RvcmVkUGFzc3dvcmQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICB0aHJvdyBlOyAvLyBSZXR1cm4gb3JpZ2luYWwgZXJyb3IgaWYgcmUtbG9naW4gZmFpbHNcbiAgICAgICAgfVxuICAgICAgICAvLyBSZXN0b3JlIGdyYXBoIGNvbnRleHQgYWZ0ZXIgcmUtbG9naW5cbiAgICAgICAgaWYgKHNhdmVkR3JhcGggJiYgc2F2ZWRHcmFwaCAhPT0gJ19fc3lzdGVtX18nKSB7XG4gICAgICAgICAgdHJ5IHsgYXdhaXQgdGhpcy51c2VHcmFwaChzYXZlZEdyYXBoKTsgfSBjYXRjaCB7IC8qIGJlc3QgZWZmb3J0ICovIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm4oKTsgLy8gUmV0cnkgb25jZVxuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGVybWluYXRlIHRoZSBjdXJyZW50IHNlc3Npb24gKi9cbiAgYXN5bmMgbG9nb3V0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLmxvZ291dCgpO1xuICB9XG5cbiAgLyoqIENoZWNrIHRoZSBjb25uZWN0aW9uIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgcGluZygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25TZXJ2aWNlLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBRdWVyeSBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCByZXR1cm4gdGhlIHJlc3VsdCAqL1xuICBhc3luYyBncWwocXVlcnk6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZ3FsKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgR1FMIHF1ZXJ5IGFuZCBzdHJlYW0gdGhlIHJlc3VsdHMgKi9cbiAgYXN5bmMgZ3FsU3RyZWFtKFxuICAgIHF1ZXJ5OiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWcsXG4gICAgY2FsbGJhY2s/OiAocmVzcG9uc2U6IFJlc3BvbnNlKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLndpdGhBdXRvUmVjb25uZWN0KCgpID0+IHRoaXMucXVlcnlTZXJ2aWNlLmdxbFN0cmVhbShxdWVyeSwgY29uZmlnLCBjYWxsYmFjaykpO1xuICB9XG5cbiAgLyoqIFJldHVybiB0aGUgZXhlY3V0aW9uIHBsYW4gZm9yIGEgcXVlcnkgKi9cbiAgYXN5bmMgZXhwbGFpbihxdWVyeTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMud2l0aEF1dG9SZWNvbm5lY3QoKCkgPT4gdGhpcy5xdWVyeVNlcnZpY2UuZXhwbGFpbihxdWVyeSwgY29uZmlnKSk7XG4gIH1cblxuICAvKiogRXhlY3V0ZSBhIHF1ZXJ5IHdpdGggcHJvZmlsaW5nIGFuZCByZXR1cm4gc3RhdGlzdGljcyAqL1xuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53aXRoQXV0b1JlY29ubmVjdCgoKSA9PiB0aGlzLnF1ZXJ5U2VydmljZS5wcm9maWxlKHF1ZXJ5LCBjb25maWcpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBHcmFwaCBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBDcmVhdGUgYSBuZXcgZ3JhcGggKi9cbiAgYXN5bmMgY3JlYXRlR3JhcGgoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmdyYXBoU2VydmljZS5jcmVhdGVHcmFwaChuYW1lLCBncmFwaFR5cGUsIGRlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgYSBncmFwaCAqL1xuICBhc3luYyBkcm9wR3JhcGgobmFtZTogc3RyaW5nLCBpZkV4aXN0czogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmRyb3BHcmFwaChuYW1lLCBpZkV4aXN0cyk7XG4gIH1cblxuICAvKiogU2V0IHRoZSBjdXJyZW50IGdyYXBoIGZvciB0aGUgc2Vzc2lvbiAqL1xuICBhc3luYyB1c2VHcmFwaChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmdyYXBoU2VydmljZS51c2VHcmFwaChuYW1lKTtcbiAgICB0aGlzLnN0b3JlZEdyYXBoID0gbmFtZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIGF2YWlsYWJsZSBncmFwaHMgKi9cbiAgYXN5bmMgbGlzdEdyYXBocygpOiBQcm9taXNlPEdyYXBoSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JhcGhTZXJ2aWNlLmxpc3RHcmFwaHMoKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBncmFwaCAqL1xuICBhc3luYyBnZXRHcmFwaEluZm8obmFtZTogc3RyaW5nKTogUHJvbWlzZTxHcmFwaEluZm8+IHtcbiAgICByZXR1cm4gdGhpcy5ncmFwaFNlcnZpY2UuZ2V0R3JhcGhJbmZvKG5hbWUpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zYWN0aW9uIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uICovXG4gIGFzeW5jIGJlZ2luVHJhbnNhY3Rpb24oXG4gICAgZ3JhcGhOYW1lOiBzdHJpbmcsXG4gICAgcmVhZE9ubHk6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICB0aW1lb3V0OiBudW1iZXIgPSAwXG4gICk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICBjb25zdCB0eCA9IGF3YWl0IHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmJlZ2luVHJhbnNhY3Rpb24oZ3JhcGhOYW1lLCByZWFkT25seSwgdGltZW91dCk7XG4gICAgLy8gU3VyZmFjZSB0aGUgcGVyLWNsaWVudCBsb2dpY2FsIHNlc3Npb24gaWQgb24gdGhlIHJldHVybmVkIHR4XG4gICAgLy8gKHRyYW5zYWN0aW9uLWJyYW5jaCBlcmdvbm9taWMsIHNlZSBUUkFOU0FDVElPTlNfRFJJVkVSX0dVSURFLm1kKS5cbiAgICAodHggYXMgYW55KS5jbGllbnRTZXNzaW9uSWQgPSB0aGlzLmNsaWVudFNlc3Npb25JZDtcbiAgICByZXR1cm4gdHg7XG4gIH1cblxuICAvKiogQ29tbWl0IGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgY29tbWl0KHRyYW5zYWN0aW9uSWQ6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU2VydmljZS5jb21taXQodHJhbnNhY3Rpb25JZCk7XG4gIH1cblxuICAvKiogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbiAqL1xuICBhc3luYyByb2xsYmFjayh0cmFuc2FjdGlvbklkOiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblNlcnZpY2Uucm9sbGJhY2sodHJhbnNhY3Rpb25JZCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgKi9cbiAgYXN5bmMgbGlzdFRyYW5zYWN0aW9ucygpOiBQcm9taXNlPFRyYW5zYWN0aW9uSW5mb1tdPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLmxpc3RUcmFuc2FjdGlvbnMoKTtcbiAgfVxuXG4gIC8qKiBFeGVjdXRlIGEgZnVuY3Rpb24gd2l0aGluIGEgdHJhbnNhY3Rpb24gKi9cbiAgYXN5bmMgd2l0aFRyYW5zYWN0aW9uPFQ+KFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGZuOiAodHhJZDogbnVtYmVyKSA9PiBQcm9taXNlPFQ+LFxuICAgIHJlYWRPbmx5OiBib29sZWFuID0gZmFsc2VcbiAgKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TZXJ2aWNlLndpdGhUcmFuc2FjdGlvbihncmFwaE5hbWUsIGZuLCByZWFkT25seSk7XG4gIH1cblxuICAvLyAtLS0tIEFkbWluIERETCBzdXJmYWNlICh0cmFuc2FjdGlvbi1icmFuY2gpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKipcbiAgICogUmV0dXJuIGFjdGl2ZSB0cmFuc2FjdGlvbnMgdmlhIHRoZSBHUUwgYWRtaW4gRERMIGBTSE9XIFRSQU5TQUNUSU9OU2AuXG4gICAqIEVhY2ggcm93IG1pcnJvcnMgdGhlIDUtY29sdW1uIHNlcnZlci1zaWRlIHNjaGVtYTpcbiAgICogYHRyYW5zYWN0aW9uSWQgLyBzdGF0dXMgLyByZWFkT25seSAvIHN0YXJ0VGltZSAvIHNlc3Npb25JZGAuXG4gICAqIGBzZXNzaW9uSWRgIGlzIGAnJ2AgdW5sZXNzIHRoZSBzZXJ2ZXIgaGFzIGF1dG8tZGVyaXZlZCBvbmUgZnJvbSBwZWVyXG4gICAqIGluZm8gb3IgdGhlIGRyaXZlciBleHBsaWNpdGx5IHN1cmZhY2VzIGB4LXVsdGlwYS1zZXNzaW9uLWlkYCBtZXRhZGF0YS5cbiAgICpcbiAgICogRGlzdGluY3QgZnJvbSBgbGlzdFRyYW5zYWN0aW9ucygpYCB3aGljaCB1c2VzIHRoZSBsZWdhY3kgZ1JQQy5cbiAgICovXG4gIGFzeW5jIHNob3dUcmFuc2FjdGlvbnMoKTogUHJvbWlzZTxUcmFuc2FjdGlvblJvd1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIFRSQU5TQUNUSU9OUycpO1xuICAgIGNvbnN0IGlkeDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHJlc3AuY29sdW1ucy5mb3JFYWNoKChjLCBpKSA9PiB7IGlkeFtjXSA9IGk7IH0pO1xuICAgIGNvbnN0IHJvd3M6IFRyYW5zYWN0aW9uUm93W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByZXNwLnJvd3MpIHtcbiAgICAgIGNvbnN0IGdldCA9IChuOiBzdHJpbmcsIGZhbGxiYWNrOiBhbnkgPSAnJykgPT4ge1xuICAgICAgICBjb25zdCBpID0gaWR4W25dO1xuICAgICAgICByZXR1cm4gaSA9PT0gdW5kZWZpbmVkID8gZmFsbGJhY2sgOiAocm93LnZhbHVlc1tpXSBhcyBhbnkpPy52YWx1ZSA/PyByb3cudmFsdWVzW2ldO1xuICAgICAgfTtcbiAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IFN0cmluZyhnZXQoJ3RyYW5zYWN0aW9uX2lkJywgJycpID8/ICcnKSxcbiAgICAgICAgc3RhdHVzOiBTdHJpbmcoZ2V0KCdzdGF0dXMnLCAnJykgPz8gJycpLFxuICAgICAgICByZWFkT25seTogQm9vbGVhbihnZXQoJ3JlYWRfb25seScsIGZhbHNlKSksXG4gICAgICAgIHN0YXJ0VGltZTogU3RyaW5nKGdldCgnc3RhcnRfdGltZScsICcnKSA/PyAnJyksXG4gICAgICAgIHNlc3Npb25JZDogU3RyaW5nKGdldCgnc2Vzc2lvbl9pZCcsICcnKSA/PyAnJyksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJvd3M7XG4gIH1cblxuICAvKipcbiAgICogUm9sbCBiYWNrIGEgc2luZ2xlIHRyYW5zYWN0aW9uIGJ5IGlkIHZpYSBgS0lMTCBUUkFOU0FDVElPTiAnPGlkPidgLlxuICAgKiBgdHJhbnNhY3Rpb25JZGAgaGVyZSBpcyB0aGUgKipzdHJpbmcqKiBpZCBzdXJmYWNlZCBieVxuICAgKiBgc2hvd1RyYW5zYWN0aW9ucygpYCAoZS5nLiBgJ3R4X2EzOTZjNTMxLS4uLidgKSwgZGlzdGluY3QgZnJvbSB0aGVcbiAgICogYG51bWJlcmAgaWQgcmV0dXJuZWQgYnkgYGJlZ2luKClgLlxuICAgKi9cbiAgYXN5bmMga2lsbFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBlc2NhcGVkID0gU3RyaW5nKHRyYW5zYWN0aW9uSWQpLnJlcGxhY2UoLycvZywgXCInJ1wiKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEtJTEwgVFJBTlNBQ1RJT04gJyR7ZXNjYXBlZH0nYCk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbCBiYWNrIGV2ZXJ5IGFjdGl2ZSB0cmFuc2FjdGlvbiB2aWEgYFJFU0VUIFRSQU5TQUNUSU9OU2AuIEFkbWluLW9ubHkuXG4gICAqIEludGVuZGVkIGFzIGFuIGVzY2FwZSBoYXRjaCB3aGVuIGFuIG9ycGhhbiB0eCBibG9ja3MgbmV3IEJFR0lOcy5cbiAgICovXG4gIGFzeW5jIHJlc2V0VHJhbnNhY3Rpb25zKCk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoJ1JFU0VUIFRSQU5TQUNUSU9OUycpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIERhdGEgU2VydmljZVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKiogSW5zZXJ0IG11bHRpcGxlIG5vZGVzIGludG8gYSBncmFwaCB1c2luZyBnUlBDIGJ1bGsgaW5zZXJ0ICovXG4gIGFzeW5jIGluc2VydE5vZGVzQmF0Y2hBdXRvKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnROb2RlcyhncmFwaE5hbWUsIG5vZGVzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEluc2VydCBtdWx0aXBsZSBlZGdlcyBpbnRvIGEgZ3JhcGggdXNpbmcgZ1JQQyBidWxrIGluc2VydCAqL1xuICBhc3luYyBpbnNlcnRFZGdlc0JhdGNoQXV0byhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRFZGdlc0NvbmZpZ1xuICApOiBQcm9taXNlPEluc2VydEVkZ2VzUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0RWRnZXMoZ3JhcGhOYW1lLCBlZGdlcywgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgbm9kZXMgYnkgaWQgbGlzdC4gRW1pdHNcbiAgICogYE1BVENIIChuKSBXSEVSRSBpZChuKSBJTiBbLi4uXSBERVRBQ0ggREVMRVRFIG4gUkVUVVJOIG5gLlxuICAgKlxuICAgKiBFbXB0eS9udWxsIGBub2RlSWRzYCBzaG9ydC1jaXJjdWl0cyB3aXRob3V0IGNvbnRhY3RpbmcgdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHJldHVybnMgUmVzcG9uc2Ugd2l0aCBvbmUgcm93IHBlciBhY3R1YWxseS1kZWxldGVkIG5vZGUsIGNvbHVtblxuICAgKiAgIFwiblwiIGhvbGRpbmcgdGhlIEdxbGRiTm9kZS4gVXNlIGByZXNwb25zZS5hbGlhcyhcIm5cIikuYXNOb2RlcygpYC5cbiAgICogICBXaXRoIGByZXR1cm5EZWxldGVkPWZhbHNlYCB0aGUgcmVzcG9uc2UgY2FycmllcyBvbmx5XG4gICAqICAgYHJvd3NBZmZlY3RlZGA7IHJvd3MgaXMgZW1wdHkuXG4gICAqL1xuICBhc3luYyBkZWxldGVOb2Rlc0J5SWRzKFxuICAgIG5vZGVJZHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgaWYgKCFub2RlSWRzIHx8IG5vZGVJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcbiAgICB9XG4gICAgbGV0IGdxbCA9IGBNQVRDSCAobikgV0hFUkUgaWQobikgSU4gWyR7Zm9ybWF0U3RyaW5nTGlzdChub2RlSWRzKX1dIERFVEFDSCBERUxFVEUgbmA7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkgZ3FsICs9ICcgUkVUVVJOIG4nO1xuICAgIHJldHVybiB0aGlzLmdxbChncWwsIGNmZyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG5vZGVzIG1hdGNoaW5nIGxhYmVscyBhbmQvb3Igd2hlcmUgY2xhdXNlLiBFbWl0c1xuICAgKiBgTUFUQ0ggKG46TDF8TDIpIFdIRVJFIDx3aGVyZT4gREVUQUNIIERFTEVURSBuIFJFVFVSTiBuYC5cbiAgICpcbiAgICogVGhyb3dzIGlmIGJvdGggbGFiZWxzIGFuZCB3aGVyZSBhcmUgZW1wdHkgdW5sZXNzXG4gICAqIGBjb25maWcuYWxsb3dEZWxldGVBbGwgPSB0cnVlYC5cbiAgICovXG4gIGFzeW5jIGRlbGV0ZU5vZGVzQnlDb25kaXRpb24oXG4gICAgbGFiZWxzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgICB3aGVyZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGxpbWl0PzogbnVtYmVyLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgY29uc3Qgbm9MYWJlbHMgPSAhbGFiZWxzIHx8IGxhYmVscy5sZW5ndGggPT09IDA7XG4gICAgY29uc3Qgbm9XaGVyZSA9ICF3aGVyZSB8fCAhd2hlcmUudHJpbSgpO1xuICAgIGlmIChub0xhYmVscyAmJiBub1doZXJlICYmICFjZmcuYWxsb3dEZWxldGVBbGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2RlbGV0ZU5vZGVzQnlDb25kaXRpb24gd2l0aCBubyBsYWJlbHMgYW5kIG5vIHdoZXJlIHdvdWxkIGRlbGV0ZSBldmVyeSAnXG4gICAgICAgICsgJ25vZGUgaW4gdGhlIGdyYXBoLiBJZiB0aGlzIGlzIGludGVudGlvbmFsLCBzZXQgRGVsZXRlQ29uZmlnLmFsbG93RGVsZXRlQWxsID0gdHJ1ZS4nXG4gICAgICApO1xuICAgIH1cbiAgICBsZXQgZ3FsID0gJ01BVENIIChuJztcbiAgICBpZiAoIW5vTGFiZWxzKSBncWwgKz0gJzonICsgbGFiZWxzIS5tYXAobCA9PiBgXFxgJHtsfVxcYGApLmpvaW4oJ3wnKTtcbiAgICBncWwgKz0gJyknO1xuICAgIGlmICghbm9XaGVyZSkgZ3FsICs9ICcgV0hFUkUgJyArIHdoZXJlO1xuICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID4gMCkgZ3FsICs9IGAgTElNSVQgJHtsaW1pdH1gO1xuICAgIGdxbCArPSAnIERFVEFDSCBERUxFVEUgbic7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkgZ3FsICs9ICcgUkVUVVJOIG4nO1xuICAgIHJldHVybiB0aGlzLmdxbChncWwsIGNmZyk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGVkZ2VzIGJ5IGlkIGxpc3QuIEVtaXRzIDUtY29sdW1uIEdRTCB3aXRoIGBpZChlKWAgc28gdGhlXG4gICAqIHNhbWUgZW1pdCB3b3JrcyBvbiBncmFwaHMgd2l0aCBvciB3aXRob3V0IEVER0VfSUQgZW5hYmxlZCwgdGhlblxuICAgKiByZXNoYXBlcyB0aGUgcmVzcG9uc2UgaW50byBhIHNpbmdsZSBcImVcIiBjb2x1bW4gaG9sZGluZyBHcWxkYkVkZ2UuXG4gICAqL1xuICBhc3luYyBkZWxldGVFZGdlc0J5SWRzKFxuICAgIGVkZ2VJZHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IERlbGV0ZUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgY2ZnOiBEZWxldGVDb25maWcgPSB7IHJldHVybkRlbGV0ZWQ6IHRydWUsIGFsbG93RGVsZXRlQWxsOiBmYWxzZSwgLi4uY29uZmlnIH07XG4gICAgaWYgKCFlZGdlSWRzIHx8IGVkZ2VJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFtdLCBbXSwgMCwgZmFsc2UsIFtdLCAwKTtcbiAgICB9XG4gICAgbGV0IGdxbCA9IGBNQVRDSCAoKS1bZV0tPigpIFdIRVJFIGlkKGUpIElOIFske2Zvcm1hdFN0cmluZ0xpc3QoZWRnZUlkcyl9XSBERUxFVEUgZWA7XG4gICAgaWYgKGNmZy5yZXR1cm5EZWxldGVkICE9PSBmYWxzZSkge1xuICAgICAgZ3FsICs9ICcgUkVUVVJOIGlkKGUpLCBlLl9mcm9tLCBlLl90bywgbGFiZWxzKGUpWzBdLCBwcm9wZXJ0aWVzKGUpJztcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgdGhpcy5ncWwoZ3FsLCBjZmcpO1xuICAgIHJldHVybiBjZmcucmV0dXJuRGVsZXRlZCA9PT0gZmFsc2UgPyByYXcgOiByZXNoYXBlRWRnZURlbGV0ZShyYXcpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBlZGdlcyBtYXRjaGluZyBsYWJlbCBhbmQvb3Igd2hlcmUuIEVtaXRzIDUtY29sdW1uIEdRTCxcbiAgICogdGhlbiByZXNoYXBlcyBpbnRvIGEgc2luZ2xlIFwiZVwiIGNvbHVtbi5cbiAgICpcbiAgICogVGhyb3dzIGlmIGJvdGggbGFiZWwgYW5kIHdoZXJlIGFyZSBlbXB0eSB1bmxlc3NcbiAgICogYGNvbmZpZy5hbGxvd0RlbGV0ZUFsbCA9IHRydWVgLlxuICAgKi9cbiAgYXN5bmMgZGVsZXRlRWRnZXNCeUNvbmRpdGlvbihcbiAgICBsYWJlbDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHdoZXJlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgbGltaXQ/OiBudW1iZXIsXG4gICAgY29uZmlnPzogRGVsZXRlQ29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBjZmc6IERlbGV0ZUNvbmZpZyA9IHsgcmV0dXJuRGVsZXRlZDogdHJ1ZSwgYWxsb3dEZWxldGVBbGw6IGZhbHNlLCAuLi5jb25maWcgfTtcbiAgICBjb25zdCBub0xhYmVsID0gIWxhYmVsO1xuICAgIGNvbnN0IG5vV2hlcmUgPSAhd2hlcmUgfHwgIXdoZXJlLnRyaW0oKTtcbiAgICBpZiAobm9MYWJlbCAmJiBub1doZXJlICYmICFjZmcuYWxsb3dEZWxldGVBbGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ2RlbGV0ZUVkZ2VzQnlDb25kaXRpb24gd2l0aCBubyBsYWJlbCBhbmQgbm8gd2hlcmUgd291bGQgZGVsZXRlIGV2ZXJ5ICdcbiAgICAgICAgKyAnZWRnZSBpbiB0aGUgZ3JhcGguIElmIHRoaXMgaXMgaW50ZW50aW9uYWwsIHNldCBEZWxldGVDb25maWcuYWxsb3dEZWxldGVBbGwgPSB0cnVlLidcbiAgICAgICk7XG4gICAgfVxuICAgIGxldCBncWwgPSAnTUFUQ0ggKCktW2UnO1xuICAgIGlmICghbm9MYWJlbCkgZ3FsICs9IGA6XFxgJHtsYWJlbH1cXGBgO1xuICAgIGdxbCArPSAnXS0+KCknO1xuICAgIGlmICghbm9XaGVyZSkgZ3FsICs9ICcgV0hFUkUgJyArIHdoZXJlO1xuICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ID4gMCkgZ3FsICs9IGAgTElNSVQgJHtsaW1pdH1gO1xuICAgIGdxbCArPSAnIERFTEVURSBlJztcbiAgICBpZiAoY2ZnLnJldHVybkRlbGV0ZWQgIT09IGZhbHNlKSB7XG4gICAgICBncWwgKz0gJyBSRVRVUk4gaWQoZSksIGUuX2Zyb20sIGUuX3RvLCBsYWJlbHMoZSlbMF0sIHByb3BlcnRpZXMoZSknO1xuICAgIH1cbiAgICBjb25zdCByYXcgPSBhd2FpdCB0aGlzLmdxbChncWwsIGNmZyk7XG4gICAgcmV0dXJuIGNmZy5yZXR1cm5EZWxldGVkID09PSBmYWxzZSA/IHJhdyA6IHJlc2hhcGVFZGdlRGVsZXRlKHJhdyk7XG4gIH1cblxuICAvKipcbiAgICogRXhwb3J0IGdyYXBoIGRhdGEgaW4gSlNPTiBMaW5lcyBmb3JtYXQgKHN0cmVhbWluZykuXG4gICAqIEBwYXJhbSBjb25maWcgRXhwb3J0IGNvbmZpZ3VyYXRpb25cbiAgICogQHBhcmFtIGNhbGxiYWNrIENhbGxiYWNrIGZvciBlYWNoIGV4cG9ydGVkIGNodW5rXG4gICAqL1xuICBhc3luYyBleHBvcnQoXG4gICAgY29uZmlnOiBFeHBvcnRDb25maWcsXG4gICAgY2FsbGJhY2s/OiAoY2h1bms6IEV4cG9ydENodW5rKSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydChjb25maWcsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJlYW0gbm9kZXMgZnJvbSBhIGdyYXBoXG4gICAqIEBkZXByZWNhdGVkIFVzZSBleHBvcnQoKSB3aXRoIEV4cG9ydENvbmZpZyBpbnN0ZWFkXG4gICAqL1xuICBhc3luYyBleHBvcnROb2RlcyhcbiAgICBncmFwaE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbHM/OiBzdHJpbmdbXSxcbiAgICBsaW1pdDogbnVtYmVyID0gMCxcbiAgICBjYWxsYmFjaz86IChyZXN1bHQ6IEV4cG9ydE5vZGVzUmVzdWx0KSA9PiB2b2lkXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFTZXJ2aWNlLmV4cG9ydE5vZGVzKGdyYXBoTmFtZSwgbGFiZWxzLCBsaW1pdCwgY2FsbGJhY2spO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmVhbSBlZGdlcyBmcm9tIGEgZ3JhcGhcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGV4cG9ydCgpIHdpdGggRXhwb3J0Q29uZmlnIGluc3RlYWRcbiAgICovXG4gIGFzeW5jIGV4cG9ydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGxhYmVscz86IHN0cmluZ1tdLFxuICAgIGxpbWl0OiBudW1iZXIgPSAwLFxuICAgIGNhbGxiYWNrPzogKHJlc3VsdDogRXhwb3J0RWRnZXNSZXN1bHQpID0+IHZvaWRcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuZXhwb3J0RWRnZXMoZ3JhcGhOYW1lLCBsYWJlbHMsIGxpbWl0LCBjYWxsYmFjayk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGVhbHRoIFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENoZWNrIHRoZSBoZWFsdGggb2YgYSBzZXJ2aWNlICovXG4gIGFzeW5jIGhlYWx0aENoZWNrKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogUHJvbWlzZTxIZWFsdGhTdGF0dXM+IHtcbiAgICByZXR1cm4gdGhpcy5oZWFsdGhTZXJ2aWNlLmhlYWx0aENoZWNrKHNlcnZpY2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIGhlYWx0aCBzdGF0dXMgY2hhbmdlcyB2aWEgc2VydmVyLXNpZGUgc3RyZWFtaW5nLlxuICAgKiBSZXR1cm5zIGEgSGVhbHRoV2F0Y2hlciB0aGF0IGVtaXRzICdzdGF0dXMnIGV2ZW50cyB3aXRoIEhlYWx0aFN0YXR1cyB2YWx1ZXMuXG4gICAqIENhbGwgc3RvcCgpIHRvIGNhbmNlbCB0aGUgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZSAtIE9wdGlvbmFsIHNlcnZpY2UgbmFtZSB0byB3YXRjaFxuICAgKiBAcmV0dXJucyBIZWFsdGhXYXRjaGVyIC0gRXZlbnRFbWl0dGVyIHdpdGggc3RvcCgpIG1ldGhvZFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHdhdGNoZXIgPSBjbGllbnQud2F0Y2goKTtcbiAgICogd2F0Y2hlci5vbignc3RhdHVzJywgKHN0YXR1czogSGVhbHRoU3RhdHVzKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ0hlYWx0aCBzdGF0dXM6Jywgc3RhdHVzKTtcbiAgICogfSk7XG4gICAqIHdhdGNoZXIub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgKiAgIGNvbnNvbGUuZXJyb3IoJ1dhdGNoIGVycm9yOicsIGVycik7XG4gICAqIH0pO1xuICAgKiB3YXRjaGVyLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ1dhdGNoIHN0cmVhbSBlbmRlZCcpO1xuICAgKiB9KTtcbiAgICogLy8gTGF0ZXIsIHRvIHN0b3Agd2F0Y2hpbmc6XG4gICAqIHdhdGNoZXIuc3RvcCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHdhdGNoKHNlcnZpY2U6IHN0cmluZyA9ICcnKTogSGVhbHRoV2F0Y2hlciB7XG4gICAgcmV0dXJuIHRoaXMuaGVhbHRoU2VydmljZS53YXRjaChzZXJ2aWNlKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBZG1pbiBTZXJ2aWNlXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBQcmUtYWxsb2NhdGUgcGFyc2VyIGluc3RhbmNlcyAqL1xuICBhc3luYyB3YXJtdXBQYXJzZXIoY291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS53YXJtdXBQYXJzZXIoY291bnQpO1xuICB9XG5cbiAgLyoqIFJldHVybiBjYWNoZSBzdGF0aXN0aWNzICovXG4gIGFzeW5jIGdldENhY2hlU3RhdHMoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTxDYWNoZVN0YXRzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmdldENhY2hlU3RhdHMoY2FjaGVUeXBlKTtcbiAgfVxuXG4gIC8qKiBDbGVhciB0aGUgc3BlY2lmaWVkIGNhY2hlICovXG4gIGFzeW5jIGNsZWFyQ2FjaGUoY2FjaGVUeXBlOiBDYWNoZVR5cGUgPSBDYWNoZVR5cGUuQUxMKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLmNsZWFyQ2FjaGUoY2FjaGVUeXBlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gZGF0YWJhc2Ugc3RhdGlzdGljcyAqL1xuICBhc3luYyBnZXRTdGF0aXN0aWNzKGdyYXBoTmFtZTogc3RyaW5nID0gJycpOiBQcm9taXNlPFN0YXRpc3RpY3M+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0U3RhdGlzdGljcyhncmFwaE5hbWUpO1xuICB9XG5cbiAgLyoqIEludmFsaWRhdGUgdGhlIFJCQUMgcGVybWlzc2lvbiBjYWNoZSAqL1xuICBhc3luYyBpbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lOiBzdHJpbmcgPSAnJyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmFkbWluU2VydmljZS5pbnZhbGlkYXRlUGVybWlzc2lvbkNhY2hlKHVzZXJuYW1lKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gc3lzdGVtLWxldmVsIG1ldHJpY3MgKENQVSwgbWVtb3J5LCBkaXNrIEkvTywgc3RvcmFnZSwgbmV0d29yaykgKi9cbiAgYXN5bmMgZ2V0U3lzdGVtTWV0cmljcygpOiBQcm9taXNlPFN5c3RlbU1ldHJpY3M+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuZ2V0U3lzdGVtTWV0cmljcygpO1xuICB9XG5cbiAgLyoqIFRyaWdnZXIgbWFudWFsIGNvbXBhY3Rpb24gb2YgdGhlIGRhdGFiYXNlIHN0b3JhZ2UgKi9cbiAgYXN5bmMgY29tcGFjdCgpOiBQcm9taXNlPENvbXBhY3RSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5hZG1pblNlcnZpY2UuY29tcGFjdCgpO1xuICB9XG5cbiAgLyoqIFdhaXQgZm9yIHRoZSBjb21wdXRpbmcgZW5naW5lIHRvcG9sb2d5IHRvIGJlIHJlYWR5ICovXG4gIGFzeW5jIHdhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lOiBzdHJpbmcsIHRpbWVvdXRNczogbnVtYmVyID0gMCk6IFByb21pc2U8Q29tcHV0ZVRvcG9sb2d5UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYWRtaW5TZXJ2aWNlLndhaXRGb3JDb21wdXRlVG9wb2xvZ3koZ3JhcGhOYW1lLCB0aW1lb3V0TXMpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEJ1bGsgSW1wb3J0IFNlcnZpY2VcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgYnVsayBpbXBvcnQgc2Vzc2lvbiBmb3Igb3B0aW1pemVkIGhpZ2gtdGhyb3VnaHB1dCBpbnNlcnRzLlxuICAgKiBAcGFyYW0gZ3JhcGhOYW1lIFRhcmdldCBncmFwaCBuYW1lXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIGJ1bGsgaW1wb3J0IGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIGFzeW5jIHN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEJ1bGtJbXBvcnRPcHRpb25zKTogUHJvbWlzZTxCdWxrSW1wb3J0U2Vzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLnN0YXJ0QnVsa0ltcG9ydChncmFwaE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIENoZWNrcG9pbnQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4gVXNlIGVuZEJ1bGtJbXBvcnQoKSB3aGljaCBwZXJmb3JtcyBhIGZpbmFsIGZsdXNoLlxuICAgKi9cbiAgYXN5bmMgY2hlY2twb2ludChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8Q2hlY2twb2ludFJlc3VsdD4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgcmVjb3JkQ291bnQ6IDAsXG4gICAgICBsYXN0Q2hlY2twb2ludENvdW50OiAwLFxuICAgICAgbWVzc2FnZTogJ0NoZWNrcG9pbnQgaGFzIGJlZW4gcmVtb3ZlZDsgdXNlIGVuZEJ1bGtJbXBvcnQgd2hpY2ggcGVyZm9ybXMgYSBmaW5hbCBmbHVzaCcsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgdGhlIGJ1bGsgaW1wb3J0IHNlc3Npb24gd2l0aCBhIGZpbmFsIGNoZWNrcG9pbnQuXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgZW5kQnVsa0ltcG9ydChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8RW5kQnVsa0ltcG9ydFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmVuZEJ1bGtJbXBvcnQoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYW5jZWwgdGhlIGJ1bGsgaW1wb3J0IHNlc3Npb24gd2l0aG91dCBmaW5hbCBzeW5jLlxuICAgKiBAcGFyYW0gc2Vzc2lvbklkIEJ1bGsgaW1wb3J0IHNlc3Npb24gSURcbiAgICovXG4gIGFzeW5jIGFib3J0QnVsa0ltcG9ydChzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QWJvcnRCdWxrSW1wb3J0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuYnVsa0ltcG9ydFNlcnZpY2UuYWJvcnRCdWxrSW1wb3J0KHNlc3Npb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBhIGJ1bGsgaW1wb3J0IHNlc3Npb24uXG4gICAqIEBwYXJhbSBzZXNzaW9uSWQgQnVsayBpbXBvcnQgc2Vzc2lvbiBJRFxuICAgKi9cbiAgYXN5bmMgZ2V0QnVsa0ltcG9ydFN0YXR1cyhzZXNzaW9uSWQ6IHN0cmluZyk6IFByb21pc2U8QnVsa0ltcG9ydFN0YXR1cz4ge1xuICAgIHJldHVybiB0aGlzLmJ1bGtJbXBvcnRTZXJ2aWNlLmdldEJ1bGtJbXBvcnRTdGF0dXMoc2Vzc2lvbklkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBNZXRob2RzIOKAlCBHZXR0ZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBHZXQgdGhlIGN1cnJlbnQgc2Vzc2lvbiAqL1xuICBnZXRTZXNzaW9uKCk6IFNlc3Npb24gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk7XG4gIH1cblxuICAvKiogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIHNlc3Npb24gKi9cbiAgaXNMb2dnZWRJbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5pc0xvZ2dlZEluKCk7XG4gIH1cblxuICAvKiogR2V0IHRoZSBjbGllbnQgY29uZmlndXJhdGlvbiAqL1xuICBnZXRDb25maWcoKTogR3FsZGJDb25maWcge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoaXMgY2xpZW50IGlzIGNvbm5lY3RlZCB0byBhIGNsdXN0ZXIgZGVwbG95bWVudCAqL1xuICBnZXQgaXNDbHVzdGVyKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlc3Npb25zLmdldFNlc3Npb24oKT8uaXNDbHVzdGVyIHx8IGZhbHNlO1xuICB9XG5cbiAgLyoqIEdldCB0aGUgY2x1c3RlciBJRCAoZW1wdHkgc3RyaW5nIGlmIG5vdCBhIGNsdXN0ZXIpICovXG4gIGdldCBjbHVzdGVySWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LmNsdXN0ZXJJZCB8fCAnJztcbiAgfVxuXG4gIC8qKiBHZXQgdGhlIHBhcnRpdGlvbiBjb3VudCAoMCBpZiBub3QgYSBjbHVzdGVyKSAqL1xuICBnZXQgcGFydGl0aW9uQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXNzaW9ucy5nZXRTZXNzaW9uKCk/LnBhcnRpdGlvbkNvdW50IHx8IDA7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW50ZXJuYWwgSGVscGVycyDigJQgTmFtZSBRdW90aW5nXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBXcmFwIGEgbmFtZSBpbiBiYWNrdGlja3MgZm9yIHNhZmUgdXNlIGluIEdRTCBzdGF0ZW1lbnRzLlxuICAgKiBMYWJlbCBuYW1lcyBhbmQgcHJvcGVydHkgbmFtZXMgc2hvdWxkIGJlIHF1b3RlZDsgZ3JhcGggbmFtZXMsIGluZGV4IG5hbWVzLFxuICAgKiBhbmQgZnVsbHRleHQgbmFtZXMgc2hvdWxkIE5PVCBiZSB3cmFwcGVkIGluIGJhY2t0aWNrcy4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcXVvdGVMYWJlbChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAnYCcgKyBuYW1lICsgJ2AnO1xuICB9XG5cbiAgLyoqIFdyYXAgZWFjaCBsYWJlbCBuYW1lIGluIGJhY2t0aWNrcyBhbmQgam9pbiB3aXRoIFwiLCBcIiAqL1xuICBwcml2YXRlIHN0YXRpYyBxdW90ZUxhYmVscyguLi5uYW1lczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lcy5tYXAobiA9PiAnYCcgKyBuICsgJ2AnKS5qb2luKCcsICcpO1xuICB9XG5cbiAgLyoqIEpvaW4gbmFtZXMgd2l0aCBcIiwgXCIgd2l0aG91dCBiYWNrdGljayB3cmFwcGluZyAqL1xuICBwcml2YXRlIHN0YXRpYyBqb2luTmFtZXMoLi4ubmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZXMuam9pbignLCAnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEdyYXBoIE9wZXJhdGlvbnMgKDYgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBvcGVuIChzY2hlbWEtbGVzcykgZ3JhcGhcbiAgICpcbiAgICogdjYgR1FMOiBgQ1JFQVRFIEdSQVBIIGdgIC0+IE9QRU47IGBDUkVBVEUgR1JBUEggZyB7fWAgLT4gQ0xPU0VELiBUaGVcbiAgICogYnJhY2UtbGVzcyBmb3JtIGlzIHJlcXVpcmVkIHRvIGFjdHVhbGx5IGdldCBhbiBPUEVOIGdyYXBoLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlT3BlbkdyYXBoKG5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgR1JBUEggJHtuYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IGNsb3NlZCAoc2NoZW1hLWVuZm9yY2VkKSBncmFwaCB3aXRoIG5vZGUgYW5kIGVkZ2UgbGFiZWwgZGVmaW5pdGlvbnMgKi9cbiAgYXN5bmMgY3JlYXRlQ2xvc2VkR3JhcGgobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBHUkFQSCAke25hbWV9IHt9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBncmFwaCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdyYXBoIHdhcyBjcmVhdGVkLCBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0ZWQuXG4gICAqL1xuICBhc3luYyBjcmVhdGVHcmFwaElmTm90RXhpc3QoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGdyYXBoVHlwZTogR3JhcGhUeXBlID0gR3JhcGhUeXBlLk9QRU4sXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUdyYXBoKG5hbWUsIGdyYXBoVHlwZSwgZGVzY3JpcHRpb24pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBjb25zdCBtc2cgPSAoZS5tZXNzYWdlIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKG1zZy5pbmNsdWRlcygnYWxyZWFkeSBleGlzdCcpIHx8IG1zZy5pbmNsdWRlcygnZHVwbGljYXRlJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2hlY2sgd2hldGhlciBhIGdyYXBoIHdpdGggdGhlIGdpdmVuIG5hbWUgZXhpc3RzICovXG4gIGFzeW5jIGhhc0dyYXBoKG5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGdyYXBocyA9IGF3YWl0IHRoaXMubGlzdEdyYXBocygpO1xuICAgIHJldHVybiBncmFwaHMuc29tZShnID0+IGcubmFtZSA9PT0gbmFtZSk7XG4gIH1cblxuICAvKiogUmVuYW1lIGEgZ3JhcGggKi9cbiAgYXN5bmMgYWx0ZXJHcmFwaChncmFwaE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEdSQVBIICR7Z3JhcGhOYW1lfSBSRU5BTUUgVE8gJHtuZXdOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmVtb3ZlIGFsbCBkYXRhIGZyb20gYSBncmFwaCB3aGlsZSBrZWVwaW5nIGl0cyBzdHJ1Y3R1cmUgKi9cbiAgYXN5bmMgdHJ1bmNhdGUoZ3JhcGhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgVFJVTkNBVEUgR1JBUEggJHtncmFwaE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIExhYmVsIE9wZXJhdGlvbnMgKDE2IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGxhYmVscyAobm9kZSBhbmQgZWRnZSkgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0xhYmVscyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBsYWJlbHMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd05vZGVMYWJlbHMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPExhYmVsSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgTEFCRUxTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3AsICdOT0RFJyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGxhYmVscyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93RWRnZUxhYmVscyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBMQUJFTFMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUxhYmVsSW5mb1Jvd3MocmVzcCwgJ0VER0UnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgdHlwZXMgd2l0aCB0aGVpciBwcm9wZXJ0aWVzICovXG4gIGFzeW5jIHNob3dOb2RlVHlwZXMoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPE5vZGVUeXBlSW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgVFlQRVMnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZU5vZGVUeXBlSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIHR5cGVzIHdpdGggdGhlaXIgcHJvcGVydGllcyAqL1xuICBhc3luYyBzaG93RWRnZVR5cGVzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxFZGdlVHlwZUluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBFREdFIFRZUEVTJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VFZGdlVHlwZUluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHNwZWNpZmljIGxhYmVsIGJ5IG5hbWUgZnJvbSB0aGUgY3VycmVudCBncmFwaCwgb3IgbnVsbCBpZiBub3QgZm91bmQuXG4gICAqIE1hdGNoZXMgZW50cmllcyB3aGVyZSBgbmFtZWAgaXMgb25lIG9mIHRoZSAubGFiZWxzIChzdXBwb3J0cyBtdWx0aS1sYWJlbCBncm91cHMpLlxuICAgKi9cbiAgYXN5bmMgZ2V0TGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8TGFiZWxJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IGxhYmVscyA9IGF3YWl0IHRoaXMuc2hvd0xhYmVscyhjb25maWcpO1xuICAgIHJldHVybiBsYWJlbHMuZmluZChsID0+IGwubGFiZWxzLmluY2x1ZGVzKG5hbWUpKSB8fCBudWxsO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIG5vZGUgdHlwZSBieSBuYW1lLCBvciBudWxsIGlmIG5vdCBmb3VuZCAqL1xuICBhc3luYyBnZXROb2RlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8Tm9kZVR5cGVJbmZvIHwgbnVsbD4ge1xuICAgIGNvbnN0IHR5cGVzID0gYXdhaXQgdGhpcy5zaG93Tm9kZVR5cGVzKGNvbmZpZyk7XG4gICAgcmV0dXJuIHR5cGVzLmZpbmQodCA9PiB0Lm5hbWUgPT09IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICAvKiogUmV0dXJuIGEgc3BlY2lmaWMgZWRnZSB0eXBlIGJ5IG5hbWUsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldEVkZ2VMYWJlbChuYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxFZGdlVHlwZUluZm8gfCBudWxsPiB7XG4gICAgY29uc3QgdHlwZXMgPSBhd2FpdCB0aGlzLnNob3dFZGdlVHlwZXMoY29uZmlnKTtcbiAgICByZXR1cm4gdHlwZXMuZmluZCh0ID0+IHQubmFtZSA9PT0gbmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYSBub2RlIGxhYmVsIGluIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVMYWJlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBBREQgTk9ERSB7ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX0gKCR7cHJvcFN0cn0pIH1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhbiBlZGdlIGxhYmVsIGluIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VMYWJlbChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IENvbnZQcm9wZXJ0eURlZltdID0gW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHRhcmdldEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0eURlZlN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBBREQgRURHRSB7ICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuYW1lKX0gKCktWyR7cHJvcFN0cn1dLT4oKSB9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgbm9kZSBsYWJlbCBmcm9tIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGRyb3BOb2RlTGFiZWwobmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCB0YXJnZXRHcmFwaCA9IGNvbmZpZz8uZ3JhcGhOYW1lIHx8IHRoaXMuc2Vzc2lvbnMuZ2V0RGVmYXVsdEdyYXBoKCk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBHUkFQSCAke3RhcmdldEdyYXBofSBEUk9QIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBvbmUgb3IgbW9yZSBlZGdlIGxhYmVscyBmcm9tIHRoZSBjdXJyZW50IGdyYXBoIChjbG9zZWQgZ3JhcGgpICovXG4gIGFzeW5jIGRyb3BFZGdlTGFiZWwoLi4ubmFtZXNPckNvbmZpZzogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIC8vIExhc3QgYXJnIG1heSBiZSBhIFF1ZXJ5Q29uZmlnIChvciB1bmRlZmluZWQpOyB0cmVhdCBub24tc3RyaW5nIGFzIGNvbmZpZy5cbiAgICBsZXQgY29uZmlnOiBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbmFtZXM6IHN0cmluZ1tdO1xuICAgIGlmIChuYW1lc09yQ29uZmlnLmxlbmd0aCA+IDAgJiYgdHlwZW9mIG5hbWVzT3JDb25maWdbbmFtZXNPckNvbmZpZy5sZW5ndGggLSAxXSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZyA9IG5hbWVzT3JDb25maWdbbmFtZXNPckNvbmZpZy5sZW5ndGggLSAxXSBhcyBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICAgIG5hbWVzID0gbmFtZXNPckNvbmZpZy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW107XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzID0gbmFtZXNPckNvbmZpZyBhcyBzdHJpbmdbXTtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0R3JhcGggPSBjb25maWc/LmdyYXBoTmFtZSB8fCB0aGlzLnNlc3Npb25zLmdldERlZmF1bHRHcmFwaCgpO1xuICAgIHJldHVybiB0aGlzLmdxbChgQUxURVIgR1JBUEggJHt0YXJnZXRHcmFwaH0gRFJPUCBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbGFiZWwgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC5cbiAgICogUmV0dXJucyB0cnVlIGlmIGNyZWF0ZWQsIGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RlZC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUxhYmVsSWZOb3RFeGlzdChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSA9IFtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxhYmVscyA9IGF3YWl0IHRoaXMuc2hvd0xhYmVscyhjb25maWcpO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBub2RlT3JFZGdlID09PSBEQlR5cGUuRURHRSA/ICdFREdFJyA6ICdOT0RFJztcblxuICAgIGlmIChsYWJlbHMuc29tZShsID0+IGwubGFiZWxzLmluY2x1ZGVzKG5hbWUpICYmIGwudHlwZSA9PT0gdGFyZ2V0VHlwZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlTm9kZUxhYmVsKG5hbWUsIHByb3BzLCBjb25maWcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUVkZ2VMYWJlbChuYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKiogUmVuYW1lIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBhbHRlck5vZGVMYWJlbChvbGROYW1lOiBzdHJpbmcsIG5ld05hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChvbGROYW1lKX0gUkVOQU1FIFRPICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChuZXdOYW1lKX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbmFtZSBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGFsdGVyRWRnZUxhYmVsKG9sZE5hbWU6IHN0cmluZywgbmV3TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG9sZE5hbWUpfSBSRU5BTUUgVE8gJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5ld05hbWUpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBhdmFpbGFibGUgYWxnb3JpdGhtcyAqL1xuICBhc3luYyBzaG93QWxnb3MoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEFsZ29JbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgQUxHT1MnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUFsZ29JbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIFByb3BlcnR5IE9wZXJhdGlvbnMgKDEzIG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYSBsYWJlbCAobm9kZSBvciBlZGdlKSBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93UHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmW10+IHtcbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIHJldHVybiB0aGlzLnNob3dOb2RlUHJvcGVydHkobGFiZWxOYW1lLCBjb25maWcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5zaG93RWRnZVByb3BlcnR5KGxhYmVsTmFtZSwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcHJvcGVydGllcyBmb3IgYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIHNob3dOb2RlUHJvcGVydHkobGFiZWxOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWZbXT4ge1xuICAgIGNvbnN0IG50ID0gYXdhaXQgdGhpcy5nZXROb2RlTGFiZWwobGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGlmICghbnQpIHRocm93IG5ldyBFcnJvcihgTm9kZSBsYWJlbCBcIiR7bGFiZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBudC5wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqIFJldHVybiBwcm9wZXJ0aWVzIGZvciBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIHNob3dFZGdlUHJvcGVydHkobGFiZWxOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxDb252UHJvcGVydHlEZWZbXT4ge1xuICAgIGNvbnN0IGV0ID0gYXdhaXQgdGhpcy5nZXRFZGdlTGFiZWwobGFiZWxOYW1lLCBjb25maWcpO1xuICAgIGlmICghZXQpIHRocm93IG5ldyBFcnJvcihgRWRnZSBsYWJlbCBcIiR7bGFiZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuICAgIHJldHVybiBldC5wcm9wZXJ0aWVzO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGEgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldFByb3BlcnR5KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIGNvbnN0IHByb3BzID0gYXdhaXQgdGhpcy5zaG93UHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBjb25maWcpO1xuICAgIHJldHVybiBwcm9wcy5maW5kKHAgPT4gcC5uYW1lID09PSBwcm9wTmFtZSkgfHwgbnVsbDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYSBzcGVjaWZpYyBwcm9wZXJ0eSBkZWZpbml0aW9uIGZvciBhIG5vZGUgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldE5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5KERCVHlwZS5OT0RFLCBsYWJlbE5hbWUsIHByb3BOYW1lLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBhIHNwZWNpZmljIHByb3BlcnR5IGRlZmluaXRpb24gZm9yIGFuIGVkZ2UgbGFiZWwsIG9yIG51bGwgaWYgbm90IGZvdW5kICovXG4gIGFzeW5jIGdldEVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8Q29udlByb3BlcnR5RGVmIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb3BlcnR5KERCVHlwZS5FREdFLCBsYWJlbE5hbWUsIHByb3BOYW1lLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbGFiZWwgKG5vZGUgb3IgZWRnZSkgKi9cbiAgYXN5bmMgY3JlYXRlUHJvcGVydHkoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BzOiBDb252UHJvcGVydHlEZWZbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKG5vZGVPckVkZ2UgPT09IERCVHlwZS5OT0RFKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVOb2RlUHJvcGVydHkobGFiZWxOYW1lLCBwcm9wcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRWRnZVByb3BlcnR5KGxhYmVsTmFtZSwgcHJvcHMsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQWRkIHByb3BlcnRpZXMgdG8gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIE5PREUgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBQUk9QRVJUWSAke3Byb3BTdHJ9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBBZGQgcHJvcGVydGllcyB0byBhbiBlZGdlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZUVkZ2VQcm9wZXJ0eShcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHByb3BTdHIgPSBidWlsZFByb3BlcnR5RGVmU3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYEFMVEVSIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9IEFERCBQUk9QRVJUWSAke3Byb3BTdHJ9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIHByb3BlcnRpZXMgZnJvbSBhIGxhYmVsIChub2RlIG9yIGVkZ2UpICovXG4gIGFzeW5jIGRyb3BQcm9wZXJ0eShcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBpZiAobm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUpIHtcbiAgICAgIHJldHVybiB0aGlzLmRyb3BOb2RlUHJvcGVydHkobGFiZWxOYW1lLCAuLi5uYW1lcywgY29uZmlnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZHJvcEVkZ2VQcm9wZXJ0eShsYWJlbE5hbWUsIC4uLm5hbWVzLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgcHJvcGVydGllcyBmcm9tIGEgbm9kZSBsYWJlbCAqL1xuICBhc3luYyBkcm9wTm9kZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIFBST1BFUlRZICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBwcm9wZXJ0aWVzIGZyb20gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBkcm9wRWRnZVByb3BlcnR5KFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIC4uLnByb3BOYW1lc09yQ29uZmlnOiBBcnJheTxzdHJpbmcgfCBRdWVyeUNvbmZpZyB8IHVuZGVmaW5lZD5cbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgbmFtZXMsIGNvbmZpZyB9ID0gc3BsaXRUcmFpbGluZ0NvbmZpZyhwcm9wTmFtZXNPckNvbmZpZyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBBTFRFUiBFREdFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSBEUk9QIFBST1BFUlRZICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ubmFtZXMpfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHByb3BlcnRpZXMgb24gYSBsYWJlbCBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0LlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYW55IHByb3BlcnRpZXMgd2VyZSBjcmVhdGVkLCBmYWxzZSBpZiBhbGwgYWxyZWFkeSBleGlzdGVkLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlUHJvcGVydHlJZk5vdEV4aXN0KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogQ29udlByb3BlcnR5RGVmW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnNob3dQcm9wZXJ0eShub2RlT3JFZGdlLCBsYWJlbE5hbWUsIGNvbmZpZyk7XG4gICAgY29uc3QgZXhpc3RpbmdTZXQgPSBuZXcgU2V0KGV4aXN0aW5nLm1hcChwID0+IHAubmFtZSkpO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gcHJvcHMuZmlsdGVyKHAgPT4gIWV4aXN0aW5nU2V0LmhhcyhwLm5hbWUpKTtcblxuICAgIGlmIChuZXdQcm9wcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvcGVydHkobm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBuZXdQcm9wcywgY29uZmlnKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIENvbnN0cmFpbnQgT3BlcmF0aW9ucyAoNCBtZXRob2RzKVxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvLyBTZXJ2ZXIgcmVwbGFjZWQgYEFMVEVSIC4uLiBBREQvRFJPUCBDT05TVFJBSU5UYCB3aXRoIHRoZVxuICAvLyBgQ1JFQVRFIENPTlNUUkFJTlQgPG5hbWU+IEZPUiAuLi4gUkVRVUlSRSAuLi4gSVMgTk9UIE5VTEwvVU5JUVVFYFxuICAvLyBmb3JtLiBDb25zdHJhaW50IG5hbWVzIGFyZSBkZXJpdmVkIGZyb20ge2tpbmR9X3tub2RlfGVkZ2V9X3tsYWJlbH1fe3Byb3B9XG4gIC8vIHNvIGNyZWF0ZS9kcm9wIHByb2R1Y2UgbWF0Y2hpbmcgaWRlbnRpZmllcnMgd2l0aG91dCBleHBvc2luZyBuYW1pbmcuXG4gIHByaXZhdGUgc3RhdGljIGNvbnN0cmFpbnROYW1lKFxuICAgIGtpbmQ6ICdubicgfCAndXEnLFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZXM6IHN0cmluZ1tdXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3QgZW50ID0gbm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREUgPyAnbm9kZScgOiAnZWRnZSc7XG4gICAgY29uc3QgcHJvcHMgPSBwcm9wTmFtZXMubWFwKHAgPT4gcC50b0xvd2VyQ2FzZSgpKS5qb2luKCdfJyk7XG4gICAgcmV0dXJuIGAke2tpbmR9XyR7ZW50fV8ke2xhYmVsTmFtZS50b0xvd2VyQ2FzZSgpfV8ke3Byb3BzfWA7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjb25zdHJhaW50VGFyZ2V0KG5vZGVPckVkZ2U6IERCVHlwZSwgbGFiZWxOYW1lOiBzdHJpbmcpOiB7IHBhdHRlcm46IHN0cmluZzsgdmFyaWFibGU6IHN0cmluZyB9IHtcbiAgICBjb25zdCBxbCA9IEdxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKTtcbiAgICByZXR1cm4gbm9kZU9yRWRnZSA9PT0gREJUeXBlLk5PREVcbiAgICAgID8geyBwYXR0ZXJuOiBgKG46JHtxbH0pYCwgdmFyaWFibGU6ICduJyB9XG4gICAgICA6IHsgcGF0dGVybjogYCgpLVtlOiR7cWx9XS0+KClgLCB2YXJpYWJsZTogJ2UnIH07XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgTk9UIE5VTEwgY29uc3RyYWludCBvbiBhIHByb3BlcnR5ICovXG4gIGFzeW5jIGNyZWF0ZU5vdE51bGxDb25zdHJhaW50KFxuICAgIG5vZGVPckVkZ2U6IERCVHlwZSxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wTmFtZTogc3RyaW5nLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBuYW1lID0gR3FsZGJDbGllbnQuY29uc3RyYWludE5hbWUoJ25uJywgbm9kZU9yRWRnZSwgbGFiZWxOYW1lLCBbcHJvcE5hbWVdKTtcbiAgICBjb25zdCB7IHBhdHRlcm4sIHZhcmlhYmxlIH0gPSBHcWxkYkNsaWVudC5jb25zdHJhaW50VGFyZ2V0KG5vZGVPckVkZ2UsIGxhYmVsTmFtZSk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgQ09OU1RSQUlOVCAke25hbWV9IEZPUiAke3BhdHRlcm59IFJFUVVJUkUgJHt2YXJpYWJsZX0uJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKHByb3BOYW1lKX0gSVMgTk9UIE5VTExgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIFVOSVFVRSBjb25zdHJhaW50IG9uIG9uZSBvciBtb3JlIHByb3BlcnRpZXMgKi9cbiAgYXN5bmMgY3JlYXRlVW5pcXVlQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBjb25zdCBjbmFtZSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnROYW1lKCd1cScsIG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmFtZXMpO1xuICAgIGNvbnN0IHsgcGF0dGVybiwgdmFyaWFibGUgfSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnRUYXJnZXQobm9kZU9yRWRnZSwgbGFiZWxOYW1lKTtcbiAgICBjb25zdCBwcm9wc0xpc3QgPSBuYW1lcy5tYXAobiA9PiBgJHt2YXJpYWJsZX0uJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG4pfWApLmpvaW4oJywgJyk7XG4gICAgY29uc3QgcmVxdWlyZUV4cHIgPSBuYW1lcy5sZW5ndGggPiAxID8gYCgke3Byb3BzTGlzdH0pYCA6IHByb3BzTGlzdDtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBDT05TVFJBSU5UICR7Y25hbWV9IEZPUiAke3BhdHRlcm59IFJFUVVJUkUgJHtyZXF1aXJlRXhwcn0gSVMgVU5JUVVFYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBSZW1vdmUgYSBOT1QgTlVMTCBjb25zdHJhaW50IGZyb20gYSBwcm9wZXJ0eSAqL1xuICBhc3luYyBkcm9wTm90TnVsbENvbnN0cmFpbnQoXG4gICAgbm9kZU9yRWRnZTogREJUeXBlLFxuICAgIGxhYmVsTmFtZTogc3RyaW5nLFxuICAgIHByb3BOYW1lOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIGNvbnN0IG5hbWUgPSBHcWxkYkNsaWVudC5jb25zdHJhaW50TmFtZSgnbm4nLCBub2RlT3JFZGdlLCBsYWJlbE5hbWUsIFtwcm9wTmFtZV0pO1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBDT05TVFJBSU5UICR7bmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBhIFVOSVFVRSBjb25zdHJhaW50IGZyb20gb25lIG9yIG1vcmUgcHJvcGVydGllcyAqL1xuICBhc3luYyBkcm9wVW5pcXVlQ29uc3RyYWludChcbiAgICBub2RlT3JFZGdlOiBEQlR5cGUsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgLi4ucHJvcE5hbWVzT3JDb25maWc6IEFycmF5PHN0cmluZyB8IFF1ZXJ5Q29uZmlnIHwgdW5kZWZpbmVkPlxuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgeyBuYW1lcywgY29uZmlnIH0gPSBzcGxpdFRyYWlsaW5nQ29uZmlnKHByb3BOYW1lc09yQ29uZmlnKTtcbiAgICBjb25zdCBjbmFtZSA9IEdxbGRiQ2xpZW50LmNvbnN0cmFpbnROYW1lKCd1cScsIG5vZGVPckVkZ2UsIGxhYmVsTmFtZSwgbmFtZXMpO1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBDT05TVFJBSU5UICR7Y25hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEluZGV4IE9wZXJhdGlvbnMgKDcgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBhbGwgaW5kZXhlcyBpbiB0aGUgY3VycmVudCBncmFwaCAqL1xuICBhc3luYyBzaG93SW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIElOREVYJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VJbmRleEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgbm9kZSBpbmRleGVzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dOb2RlSW5kZXgoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEluZGV4SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIE5PREUgSU5ERVgnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogUmV0dXJuIGFsbCBlZGdlIGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0VkZ2VJbmRleChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8SW5kZXhJbmZvW10+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1NIT1cgRURHRSBJTkRFWCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlSW5kZXhJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gaW5kZXggb24gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVJbmRleChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogSW5kZXhQcm9wZXJ0eVtdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRJbmRleFByb3BlcnR5U3RyaW5nKHByb3BzKTtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBJTkRFWCAke2luZGV4TmFtZX0gT04gTk9ERSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7cHJvcFN0cn0pYCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBDcmVhdGUgYW4gaW5kZXggb24gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlSW5kZXgoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IEluZGV4UHJvcGVydHlbXSxcbiAgICBjb25maWc/OiBRdWVyeUNvbmZpZ1xuICApOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkSW5kZXhQcm9wZXJ0eVN0cmluZyhwcm9wcyk7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBDUkVBVEUgSU5ERVggJHtpbmRleE5hbWV9IE9OIEVER0UgJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVsKGxhYmVsTmFtZSl9ICgke3Byb3BTdHJ9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogRHJvcCBhIG5vZGUgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wTm9kZUluZGV4KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgTk9ERSBJTkRFWCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYW4gZWRnZSBpbmRleCBieSBuYW1lICovXG4gIGFzeW5jIGRyb3BFZGdlSW5kZXgoaW5kZXhOYW1lOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgRFJPUCBFREdFIElOREVYICR7aW5kZXhOYW1lfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBGdWxsdGV4dCBPcGVyYXRpb25zICg3IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIGZ1bGx0ZXh0IGluZGV4ZXMgaW4gdGhlIGN1cnJlbnQgZ3JhcGggKi9cbiAgYXN5bmMgc2hvd0Z1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBGVUxMVEVYVCcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlRnVsbHRleHRJbmZvUm93cyhyZXNwKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYWxsIG5vZGUgZnVsbHRleHQgaW5kZXhlcyAqL1xuICBhc3luYyBzaG93Tm9kZUZ1bGx0ZXh0KGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxGdWxsdGV4dEluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBOT0RFIEZVTExURVhUJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIFJldHVybiBhbGwgZWRnZSBmdWxsdGV4dCBpbmRleGVzICovXG4gIGFzeW5jIHNob3dFZGdlRnVsbHRleHQoY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPEZ1bGx0ZXh0SW5mb1tdPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKCdTSE9XIEVER0UgRlVMTFRFWFQnLCBjb25maWcpO1xuICAgIHJldHVybiBwYXJzZUZ1bGx0ZXh0SW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgZnVsbHRleHQgaW5kZXggb24gYSBub2RlIGxhYmVsICovXG4gIGFzeW5jIGNyZWF0ZU5vZGVGdWxsdGV4dChcbiAgICBpbmRleE5hbWU6IHN0cmluZyxcbiAgICBsYWJlbE5hbWU6IHN0cmluZyxcbiAgICBwcm9wczogc3RyaW5nW10sXG4gICAgY29uZmlnPzogUXVlcnlDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgQ1JFQVRFIEZVTExURVhUICR7aW5kZXhOYW1lfSBPTiBOT0RFICR7R3FsZGJDbGllbnQucXVvdGVMYWJlbChsYWJlbE5hbWUpfSAoJHtHcWxkYkNsaWVudC5xdW90ZUxhYmVscyguLi5wcm9wcyl9KWAsIGNvbmZpZyk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgZnVsbHRleHQgaW5kZXggb24gYW4gZWRnZSBsYWJlbCAqL1xuICBhc3luYyBjcmVhdGVFZGdlRnVsbHRleHQoXG4gICAgaW5kZXhOYW1lOiBzdHJpbmcsXG4gICAgbGFiZWxOYW1lOiBzdHJpbmcsXG4gICAgcHJvcHM6IHN0cmluZ1tdLFxuICAgIGNvbmZpZz86IFF1ZXJ5Q29uZmlnXG4gICk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYENSRUFURSBGVUxMVEVYVCAke2luZGV4TmFtZX0gT04gRURHRSAke0dxbGRiQ2xpZW50LnF1b3RlTGFiZWwobGFiZWxOYW1lKX0gKCR7R3FsZGJDbGllbnQucXVvdGVMYWJlbHMoLi4ucHJvcHMpfSlgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIERyb3AgYSBub2RlIGZ1bGx0ZXh0IGluZGV4IGJ5IG5hbWUgKi9cbiAgYXN5bmMgZHJvcE5vZGVGdWxsdGV4dChpbmRleE5hbWU6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBEUk9QIE5PREUgRlVMTFRFWFQgJHtpbmRleE5hbWV9YCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKiBEcm9wIGFuIGVkZ2UgZnVsbHRleHQgaW5kZXggYnkgbmFtZSAqL1xuICBhc3luYyBkcm9wRWRnZUZ1bGx0ZXh0KGluZGV4TmFtZTogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5ncWwoYERST1AgRURHRSBGVUxMVEVYVCAke2luZGV4TmFtZX1gLCBjb25maWcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENvbnZlbmllbmNlIEFQSSDigJQgVGFzayBPcGVyYXRpb25zICgzIG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBSZXR1cm4gYWxsIHRhc2tzIGluIHRoZSBjdXJyZW50IGdyYXBoICovXG4gIGFzeW5jIHNob3dUYXNrcyhjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8VGFza0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnU0hPVyBUQVNLUycsIGNvbmZpZyk7XG4gICAgcmV0dXJuIHBhcnNlVGFza0luZm9Sb3dzKHJlc3ApO1xuICB9XG5cbiAgLyoqIERlbGV0ZSBhIHRhc2sgYnkgSUQgKi9cbiAgYXN5bmMgZGVsZXRlVGFzayh0YXNrSWQ6IHN0cmluZywgY29uZmlnPzogUXVlcnlDb25maWcpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuZ3FsKGBERUxFVEUgVEFTSyAke3Rhc2tJZH1gLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFN0b3AgYSBydW5uaW5nIHRhc2sgYnkgSUQgKi9cbiAgYXN5bmMgc3RvcFRhc2sodGFza0lkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgU1RPUCBUQVNLICR7dGFza0lkfWAsIGNvbmZpZyk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBEYXRhIEluc2VydCBPcGVyYXRpb25zICg0IG1ldGhvZHMpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBJbnNlcnQgbm9kZXMg4oCUIGJhY2t3YXJkLWNvbXBhdGlibGUgb3ZlcmxvYWRlZCBlbnRyeSBwb2ludC5cbiAgICpcbiAgICogVHdvIGNhbGwgc2hhcGVzIGFyZSBhY2NlcHRlZDsgdGhlIHJ1bnRpbWUgZGlzcGF0Y2hlcyBvbiB0aGUgZmlyc3RcbiAgICogYXJndW1lbnQncyB0eXBlOlxuICAgKlxuICAgKiAgIDEuIGBpbnNlcnROb2RlcyhncmFwaE5hbWU6IHN0cmluZywgbm9kZXMsIGNvbmZpZz8pYCDigJQgb3JpZ2luYWxcbiAgICogICAgICA2LjAuMCBzaWduYXR1cmUsIHJvdXRlcyB0aHJvdWdoIHRoZSBidWxrLWltcG9ydCBnUlBDIHBhdGhcbiAgICogICAgICAoYERhdGFTZXJ2aWNlLkluc2VydE5vZGVzYCkuIFJldHVybnMgYEluc2VydE5vZGVzUmVzdWx0YCB3aXRoXG4gICAqICAgICAgZ1JQQy1sZXZlbCBtZXRhZGF0YS4gUHJlc2VydmVzIHNvdXJjZSBjb21wYXRpYmlsaXR5IGZvclxuICAgKiAgICAgIGNhbGxlcnMgd3JpdHRlbiBhZ2FpbnN0IDYuMC4wIChlLmcuIGdxbGRiLW1hbmFnZXIpLlxuICAgKlxuICAgKiAgIDIuIGBpbnNlcnROb2Rlcyhub2RlcywgY29uZmlnPylgIOKAlCBjb252ZW5pZW5jZSBHUUwgZW1pdHRlciAoYWRkZWRcbiAgICogICAgICBhZnRlciA2LjAuMCkuIFN5bnRoZXNpemVzXG4gICAqICAgICAgYElOU0VSVCAobjA6TGFiZWwgey4uLn0pLCAobjE6TGFiZWwgey4uLn0pIFJFVFVSTiBuMCwgbjFgLFxuICAgKiAgICAgIHdpdGggYElOU0VSVCBPVkVSV1JJVEVgIHdoZW4gYGNvbmZpZy5pbnNlcnRUeXBlYCBpc1xuICAgKiAgICAgIGBJbnNlcnRUeXBlLk92ZXJ3cml0ZWAuIFJldHVybnMgdGhlIHJhdyBgUmVzcG9uc2VgLlxuICAgKiAgICAgIGBOb2RlRGF0YS5pZGAsIHdoZW4gc2V0LCBpcyBlbWl0dGVkIGFzIHRoZSBgX2lkYCBwcm9wZXJ0eS5cbiAgICovXG4gIGFzeW5jIGluc2VydE5vZGVzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIG5vZGVzOiBOb2RlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQ+O1xuICBhc3luYyBpbnNlcnROb2RlcyhcbiAgICBub2RlczogTm9kZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT47XG4gIGFzeW5jIGluc2VydE5vZGVzKFxuICAgIGFyZzE6IHN0cmluZyB8IE5vZGVEYXRhW10sXG4gICAgYXJnMj86IE5vZGVEYXRhW10gfCBJbnNlcnRDb25maWcsXG4gICAgYXJnMz86IEluc2VydE5vZGVzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0Tm9kZXNSZXN1bHQgfCBSZXNwb25zZT4ge1xuICAgIC8vIFBhdGggMTogbGVnYWN5IGJ1bGstZ1JQQyBzaWduYXR1cmUgKGdyYXBoTmFtZSwgbm9kZXMsIGNvbmZpZz8pXG4gICAgaWYgKHR5cGVvZiBhcmcxID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGF0YVNlcnZpY2UuaW5zZXJ0Tm9kZXMoXG4gICAgICAgIGFyZzEsXG4gICAgICAgIGFyZzIgYXMgTm9kZURhdGFbXSxcbiAgICAgICAgYXJnM1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQYXRoIDI6IGNvbnZlbmllbmNlIEdRTC1lbWl0dGVyIHNpZ25hdHVyZSAobm9kZXMsIGNvbmZpZz8pXG4gICAgY29uc3Qgbm9kZXMgPSBhcmcxO1xuICAgIGNvbnN0IGNvbmZpZyA9IGFyZzIgYXMgSW5zZXJ0Q29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5vZGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBSZXNwb25zZShbXSwgW10sIDAsIGZhbHNlLCBbXSwgMCk7XG5cbiAgICBub2Rlcy5mb3JFYWNoKChub2RlLCBpKSA9PiB7XG4gICAgICBpZiAoIW5vZGUubGFiZWxzIHx8IG5vZGUubGFiZWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGUgYXQgaW5kZXggJHtpfSBoYXMgbm8gbGFiZWxzLiBBdCBsZWFzdCBvbmUgbGFiZWwgaXMgcmVxdWlyZWQuYCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2YXJOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBwYXJ0cyA9IG5vZGVzLm1hcCgobm9kZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmFyTmFtZSA9IGBuJHtpfWA7XG4gICAgICB2YXJOYW1lcy5wdXNoKHZhck5hbWUpO1xuICAgICAgLy8gR1FMIElOU0VSVCBvbmx5IHN1cHBvcnRzIHNpbmdsZSBsYWJlbCBwZXIgbm9kZVxuICAgICAgY29uc3QgbGFiZWwgPSBHcWxkYkNsaWVudC5xdW90ZUxhYmVsKG5vZGUubGFiZWxzWzBdKTtcbiAgICAgIC8vIEJ1aWxkIHByb3BlcnRpZXMgaW5jbHVkaW5nIF9pZCBpZiBzZXRcbiAgICAgIGxldCBwcm9wcyA9IG5vZGUucHJvcGVydGllcztcbiAgICAgIGlmIChub2RlLmlkKSB7XG4gICAgICAgIHByb3BzID0geyBfaWQ6IG5vZGUuaWQsIC4uLnByb3BzIH07XG4gICAgICB9XG4gICAgICBjb25zdCBwcm9wU3RyID0gYnVpbGRQcm9wZXJ0aWVzVmFsdWVTdHJpbmcocHJvcHMpO1xuICAgICAgcmV0dXJuIHByb3BTdHIgPyBgKCR7dmFyTmFtZX06JHtsYWJlbH0gJHtwcm9wU3RyfSlgIDogYCgke3Zhck5hbWV9OiR7bGFiZWx9KWA7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbnNlcnRLZXl3b3JkID0gaW5zZXJ0S2V5d29yZEZvclR5cGUoY29uZmlnPy5pbnNlcnRUeXBlKTtcbiAgICBjb25zdCBncWxTdHIgPSBpbnNlcnRLZXl3b3JkICsgJyAnICsgcGFydHMuam9pbignLCAnKSArICcgUkVUVVJOICcgKyB2YXJOYW1lcy5qb2luKCcsICcpO1xuICAgIHJldHVybiB0aGlzLmdxbChncWxTdHIsIGNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogSW5zZXJ0IGVkZ2VzIOKAlCBiYWNrd2FyZC1jb21wYXRpYmxlIG92ZXJsb2FkZWQgZW50cnkgcG9pbnQuXG4gICAqXG4gICAqIFR3byBjYWxsIHNoYXBlcyBhcmUgYWNjZXB0ZWQ7IHRoZSBydW50aW1lIGRpc3BhdGNoZXMgb24gdGhlIGZpcnN0XG4gICAqIGFyZ3VtZW50J3MgdHlwZTpcbiAgICpcbiAgICogICAxLiBgaW5zZXJ0RWRnZXMoZ3JhcGhOYW1lOiBzdHJpbmcsIGVkZ2VzLCBjb25maWc/KWAg4oCUIG9yaWdpbmFsXG4gICAqICAgICAgNi4wLjAgc2lnbmF0dXJlLCByb3V0ZXMgdGhyb3VnaCB0aGUgYnVsay1pbXBvcnQgZ1JQQyBwYXRoXG4gICAqICAgICAgKGBEYXRhU2VydmljZS5JbnNlcnRFZGdlc2ApLiBSZXR1cm5zIGBJbnNlcnRFZGdlc1Jlc3VsdGAgd2l0aFxuICAgKiAgICAgIGdSUEMtbGV2ZWwgbWV0YWRhdGEuIFByZXNlcnZlcyBzb3VyY2UgY29tcGF0aWJpbGl0eSBmb3JcbiAgICogICAgICA2LjAuMCBjYWxsZXJzLlxuICAgKlxuICAgKiAgIDIuIGBpbnNlcnRFZGdlcyhlZGdlcywgY29uZmlnPylgIOKAlCBjb252ZW5pZW5jZSBHUUwgZW1pdHRlclxuICAgKiAgICAgIChhZGRlZCBhZnRlciA2LjAuMCkuIFBlciBlZGdlIHN5bnRoZXNpemVzXG4gICAqICAgICAgYE1BVENIIChzcmMgV0hFUkUgaWQoc3JjKSA9ICdmcm9tJyksIChkc3QgV0hFUkUgaWQoZHN0KSA9ICd0bycpIElOU0VSVCAoc3JjKS1bZTA6TGFiZWwgey4uLn1dLT4oZHN0KSBSRVRVUk4gZTBgLlxuICAgKiAgICAgIFJldHVybnMgYSBtZXJnZWQgYFJlc3BvbnNlYCB3aXRoIGNvbHVtbnMgYGUwLCBlMSwgLi4uYC5cbiAgICovXG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGdyYXBoTmFtZTogc3RyaW5nLFxuICAgIGVkZ2VzOiBFZGdlRGF0YVtdLFxuICAgIGNvbmZpZz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQ+O1xuICBhc3luYyBpbnNlcnRFZGdlcyhcbiAgICBlZGdlczogRWRnZURhdGFbXSxcbiAgICBjb25maWc/OiBJbnNlcnRDb25maWdcbiAgKTogUHJvbWlzZTxSZXNwb25zZT47XG4gIGFzeW5jIGluc2VydEVkZ2VzKFxuICAgIGFyZzE6IHN0cmluZyB8IEVkZ2VEYXRhW10sXG4gICAgYXJnMj86IEVkZ2VEYXRhW10gfCBJbnNlcnRDb25maWcsXG4gICAgYXJnMz86IEluc2VydEVkZ2VzQ29uZmlnXG4gICk6IFByb21pc2U8SW5zZXJ0RWRnZXNSZXN1bHQgfCBSZXNwb25zZT4ge1xuICAgIC8vIFBhdGggMTogbGVnYWN5IGJ1bGstZ1JQQyBzaWduYXR1cmVcbiAgICBpZiAodHlwZW9mIGFyZzEgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhU2VydmljZS5pbnNlcnRFZGdlcyhcbiAgICAgICAgYXJnMSxcbiAgICAgICAgYXJnMiBhcyBFZGdlRGF0YVtdLFxuICAgICAgICBhcmczXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFBhdGggMjogY29udmVuaWVuY2UgR1FMLWVtaXR0ZXIgc2lnbmF0dXJlXG4gICAgY29uc3QgZWRnZXMgPSBhcmcxO1xuICAgIGNvbnN0IGNvbmZpZyA9IGFyZzIgYXMgSW5zZXJ0Q29uZmlnIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKGVkZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG5ldyBSZXNwb25zZShbXSwgW10sIDAsIGZhbHNlLCBbXSwgMCk7XG5cbiAgICBjb25zdCBpbnNlcnRLZXl3b3JkID0gaW5zZXJ0S2V5d29yZEZvclR5cGUoY29uZmlnPy5pbnNlcnRUeXBlKTtcbiAgICBjb25zdCBhbGxDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFsbFZhbHVlczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxBZmZlY3RlZCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWRnZSA9IGVkZ2VzW2ldO1xuICAgICAgY29uc3QgdmFyTmFtZSA9IGBlJHtpfWA7XG4gICAgICBjb25zdCBsYWJlbFBhcnQgPSBlZGdlLmxhYmVsID8gJzonICsgR3FsZGJDbGllbnQucXVvdGVMYWJlbChlZGdlLmxhYmVsKSA6ICcnO1xuICAgICAgLy8gQnVpbGQgcHJvcGVydGllcyBpbmNsdWRpbmcgX2lkIGlmIHNldCDigJQgbWlycm9ycyB0aGUgbm9kZVxuICAgICAgLy8gZW1pdHRlci4gIFRoZSBzZXJ2ZXIncyBHUUwgcGFyc2VyIGFjY2VwdHNcbiAgICAgIC8vIGBbZTA6S25vd3Mge19pZDonLi4uJywgLi4ufV1gIGFuZCBzdG9yZXMgdGhlIGVkZ2UgaWQgdmVyYmF0aW1cbiAgICAgIC8vIHdoZW4gRURHRV9JRCBpcyBlbmFibGVkIG9uIHRoZSBncmFwaC5cbiAgICAgIGxldCBwcm9wcyA9IGVkZ2UucHJvcGVydGllcztcbiAgICAgIGlmIChlZGdlLmlkICYmIGVkZ2UuaWQubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9wcyA9IHsgX2lkOiBlZGdlLmlkLCAuLi4oZWRnZS5wcm9wZXJ0aWVzID8/IHt9KSB9O1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvcFN0ciA9IGJ1aWxkUHJvcGVydGllc1ZhbHVlU3RyaW5nKHByb3BzKTtcbiAgICAgIGNvbnN0IGVkZ2VQYXJ0ID0gcHJvcFN0ciA/IGBbJHt2YXJOYW1lfSR7bGFiZWxQYXJ0fSAke3Byb3BTdHJ9XWAgOiBgWyR7dmFyTmFtZX0ke2xhYmVsUGFydH1dYDtcbiAgICAgIGNvbnN0IGdxbFN0ciA9IGBNQVRDSCAoc3JjIFdIRVJFIGlkKHNyYykgPSAnJHtlZGdlLmZyb21Ob2RlSWR9JyksIGBcbiAgICAgICAgKyBgKGRzdCBXSEVSRSBpZChkc3QpID0gJyR7ZWRnZS50b05vZGVJZH0nKSBgXG4gICAgICAgICsgYCR7aW5zZXJ0S2V5d29yZH0gKHNyYyktJHtlZGdlUGFydH0tPihkc3QpIFJFVFVSTiAke3Zhck5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbChncWxTdHIsIGNvbmZpZyk7XG4gICAgICB0b3RhbEFmZmVjdGVkICs9IHJlc3Aucm93c0FmZmVjdGVkO1xuICAgICAgYWxsQ29sdW1ucy5wdXNoKHZhck5hbWUpO1xuICAgICAgaWYgKHJlc3Aucm93cy5sZW5ndGggPiAwICYmIHJlc3Aucm93c1swXS52YWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBhbGxWYWx1ZXMucHVzaChyZXNwLnJvd3NbMF0udmFsdWVzWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbWVyZ2VkUm93ID0gbmV3IFJvdyhhbGxWYWx1ZXMpO1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYWxsQ29sdW1ucywgW21lcmdlZFJvd10sIDEsIGZhbHNlLCBbXSwgdG90YWxBZmZlY3RlZCk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ29udmVuaWVuY2UgQVBJIOKAlCBTeXN0ZW0gJiBQcm9jZXNzIE9wZXJhdGlvbnMgKDQgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFJldHVybiBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzZXMgKHF1ZXJpZXMpICovXG4gIGFzeW5jIHRvcChjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8UHJvY2Vzc0luZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbCgnVE9QJywgY29uZmlnKTtcbiAgICByZXR1cm4gcGFyc2VQcm9jZXNzSW5mb1Jvd3MocmVzcCk7XG4gIH1cblxuICAvKiogVGVybWluYXRlIGEgcnVubmluZyBxdWVyeSBieSBpdHMgcXVlcnkgSUQgKi9cbiAgYXN5bmMga2lsbChxdWVyeUlkOiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmdxbChgS0lMTCAnJHtxdWVyeUlkfSdgLCBjb25maWcpO1xuICB9XG5cbiAgLyoqIFJldHVybiBzdGF0aXN0aWNzIGZvciB0aGUgY3VycmVudCBncmFwaCB1c2luZyBkYi5zdGF0cygpICovXG4gIGFzeW5jIHN0YXRzKGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxHcmFwaFN0YXRzPiB7XG4gICAgY29uc3QgY3VycmVudEdyYXBoID0gY29uZmlnPy5ncmFwaE5hbWUgfHwgdGhpcy5zZXNzaW9ucy5nZXREZWZhdWx0R3JhcGgoKTtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5ncWwoJ1JFVFVSTiBkYi5zdGF0cygpIEFTIHN0YXRzJywgY29uZmlnKTtcbiAgICBjb25zdCBncyA9IHBhcnNlR3JhcGhTdGF0cyhyZXNwKTtcbiAgICBpZiAoIWdzLmdyYXBoTmFtZSkgZ3MuZ3JhcGhOYW1lID0gY3VycmVudEdyYXBoO1xuICAgIHJldHVybiBncztcbiAgfVxuXG4gIC8qKiBTZW5kIGEgcGluZyB0byB0aGUgc2VydmVyIGFuZCByZXR1cm4gdGhlIGxhdGVuY3kgaW4gbmFub3NlY29uZHMgKi9cbiAgYXN5bmMgdGVzdCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnBpbmcoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb252ZW5pZW5jZSBBUEkg4oCUIEFJIE9wZXJhdGlvbnMgKDIgbWV0aG9kcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqIFlJRUxEIGNvbHVtbnMgZW1pdHRlZCBieSBDQUxMIGFpLnJlYWQgLyBhaS5ncWwgKGtlcHQgaW4gc3luYyB3aXRoIHNlcnZlcikuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEFJX1lJRUxEX0NPTFMgPVxuICAgICdzdGFnZSwgZGV0YWlsLCBlbGFwc2VkX21zLCB0b2tlbnNfaW5wdXQsIHRva2Vuc19vdXRwdXQsIHRva2Vuc19jYWNoZWQsIGRhdGEnO1xuXG4gIC8qKlxuICAgKiBBc2sgdGhlIEFJIHRvIGdlbmVyYXRlIGEgR1FMIHN0YXRlbWVudCBhbmQgYXV0by1leGVjdXRlIGl0LlxuICAgKlxuICAgKiBXcmFwcyBgQ0FMTCBhaS5yZWFkKFwiPHByb21wdD5cIikgWUlFTEQgLi4uYCwgc3RyZWFtcyBzdGFnZSByb3dzIGZyb20gdGhlXG4gICAqIHNlcnZlciwgYW5kIHJlLXJ1bnMgdGhlIHN5bnRoZXNpemVkIEdRTCBzbyBgQWlSZWFkUmVzdWx0LmRhdGFgIGhvbGRzIHRoZVxuICAgKiByZWFsIHF1ZXJ5IHtAbGluayBSZXNwb25zZX0gKHJvd3MgLyBjb2x1bW5zKSDigJQgbWF0Y2hpbmcgd2hhdCBNYW5hZ2VyIFVJXG4gICAqIGRpc3BsYXlzLlxuICAgKlxuICAgKiBPbmx5IHRyYW5zcG9ydC1sZXZlbCBlcnJvcnMgcmVqZWN0IHRoZSBQcm9taXNlLiBBSS1zaWRlIGVycm9ycyBzZXRcbiAgICogYHN1Y2Nlc3M9ZmFsc2VgIGFuZCBwb3B1bGF0ZSBgZXJyb3JgLCB3aXRoIGBkYXRhPW51bGxgLlxuICAgKi9cbiAgYXN5bmMgYWlSZWFkKHByb21wdDogc3RyaW5nLCBjb25maWc/OiBRdWVyeUNvbmZpZyk6IFByb21pc2U8QWlSZWFkUmVzdWx0PiB7XG4gICAgY29uc3QgZ3FsID0gYENBTEwgYWkucmVhZChcIiR7R3FsZGJDbGllbnQuZXNjYXBlQWlQcm9tcHQocHJvbXB0KX1cIikgWUlFTEQgJHtHcWxkYkNsaWVudC5BSV9ZSUVMRF9DT0xTfWA7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuZ3FsKGdxbCwgY29uZmlnKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBhcnNlQWlSZXN1bHQocmVzcCk7XG4gICAgLy8gQXV0byByZS1ydW4gdGhlIGdlbmVyYXRlZCBHUUwgc28gYGRhdGFgIGlzIGEgcHJvcGVyIFJlc3BvbnNlIChyb3dzL2NvbHVtbnMpLFxuICAgIC8vIG5vdCB0aGUgZXhlY3V0aW9uIG1ldGFkYXRhIGRpY3QgcmV0dXJuZWQgaW4gdGhlIGZpbmFsIHN0YWdlLlxuICAgIGlmIChyZXN1bHQuc3VjY2VzcyAmJiByZXN1bHQuZ2VuZXJhdGVkR3FsKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQuZGF0YSA9IGF3YWl0IHRoaXMuZ3FsKHJlc3VsdC5nZW5lcmF0ZWRHcWwsIGNvbmZpZyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gYEdlbmVyYXRlZCBHUUwgZmFpbGVkIHRvIGV4ZWN1dGU6ICR7ZT8ubWVzc2FnZSA/PyBTdHJpbmcoZSl9YDtcbiAgICAgICAgcmVzdWx0LmRhdGEgPSBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuZGF0YSA9IG51bGw7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQXNrIHRoZSBBSSB0byBnZW5lcmF0ZSBhIEdRTCBzdGF0ZW1lbnQgKndpdGhvdXQqIGV4ZWN1dGluZyBpdC5cbiAgICpcbiAgICogVGhlIGdlbmVyYXRlZCBHUUwgaXMgZXhwb3NlZCB2aWEgYEFpUmVhZFJlc3VsdC5nZW5lcmF0ZWRHcWxgIHNvIHRoZVxuICAgKiBjYWxsZXIgY2FuIHJldmlldyAvIGVkaXQgaXQgYmVmb3JlIHJ1bm5pbmcgaXQgbWFudWFsbHkgdmlhIGBjbGllbnQuZ3FsKClgLlxuICAgKiBgQWlSZWFkUmVzdWx0LmRhdGFgIGlzIGFsd2F5cyBudWxsIGZvciBgYWlHcWxgLlxuICAgKi9cbiAgYXN5bmMgYWlHcWwocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IFF1ZXJ5Q29uZmlnKTogUHJvbWlzZTxBaVJlYWRSZXN1bHQ+IHtcbiAgICBjb25zdCBncWwgPSBgQ0FMTCBhaS5ncWwoXCIke0dxbGRiQ2xpZW50LmVzY2FwZUFpUHJvbXB0KHByb21wdCl9XCIpIFlJRUxEICR7R3FsZGJDbGllbnQuQUlfWUlFTERfQ09MU31gO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCB0aGlzLmdxbChncWwsIGNvbmZpZyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wYXJzZUFpUmVzdWx0KHJlc3ApO1xuICAgIC8vIGFpX2dxbCBpcyBcImdlbmVyYXRlIG9ubHlcIiDigJQgbmV2ZXIgYXV0by1leGVjdXRlLlxuICAgIHJlc3VsdC5kYXRhID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqIEVzY2FwZSBhIHByb21wdCBzbyBpdCBjYW4gYmUgc2FmZWx5IGVtYmVkZGVkIGluIGEgZG91YmxlLXF1b3RlZCBHUUwgc3RyaW5nLiAqL1xuICBwcml2YXRlIHN0YXRpYyBlc2NhcGVBaVByb21wdChwcm9tcHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByb21wdC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKTtcbiAgfVxuXG4gIC8qKiBQYXJzZSBhIENBTEwgYWkucmVhZCAvIGFpLmdxbCBZSUVMRCByZXNwb25zZSBpbnRvIGFuIEFpUmVhZFJlc3VsdC4gKi9cbiAgcHJpdmF0ZSBwYXJzZUFpUmVzdWx0KHJlc3A6IFJlc3BvbnNlKTogQWlSZWFkUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQ6IEFpUmVhZFJlc3VsdCA9IHtcbiAgICAgIHN0YWdlczogW10sXG4gICAgICBnZW5lcmF0ZWRHcWw6IG51bGwsXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgIGVycm9yOiBudWxsLFxuICAgICAgdG90YWxFbGFwc2VkTXM6IDAsXG4gICAgICB0b3RhbFRva2Vuc0lucHV0OiAwLFxuICAgICAgdG90YWxUb2tlbnNPdXRwdXQ6IDAsXG4gICAgICB0b3RhbFRva2Vuc0NhY2hlZDogMCxcbiAgICB9O1xuXG4gICAgY29uc3QgY29sSWR4OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbElkeFtyZXNwLmNvbHVtbnNbaV1dID0gaTtcbiAgICB9XG4gICAgY29uc3QgZ2V0Q29sID0gKHJvdzogUm93LCBuYW1lOiBzdHJpbmcpOiBhbnkgPT4ge1xuICAgICAgY29uc3QgaWR4ID0gY29sSWR4W25hbWVdO1xuICAgICAgaWYgKGlkeCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiByb3cuZ2V0KGlkeCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJlc3Aucm93cykge1xuICAgICAgY29uc3Qgc3RhZ2VWYWwgPSBnZXRDb2wocm93LCAnc3RhZ2UnKTtcbiAgICAgIGNvbnN0IGRldGFpbFZhbCA9IGdldENvbChyb3csICdkZXRhaWwnKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRWYWwgPSBnZXRDb2wocm93LCAnZWxhcHNlZF9tcycpO1xuICAgICAgY29uc3QgdEluVmFsID0gZ2V0Q29sKHJvdywgJ3Rva2Vuc19pbnB1dCcpO1xuICAgICAgY29uc3QgdE91dFZhbCA9IGdldENvbChyb3csICd0b2tlbnNfb3V0cHV0Jyk7XG4gICAgICBjb25zdCB0Q2FjaGVkVmFsID0gZ2V0Q29sKHJvdywgJ3Rva2Vuc19jYWNoZWQnKTtcbiAgICAgIGNvbnN0IGRhdGFWYWwgPSBnZXRDb2wocm93LCAnZGF0YScpO1xuXG4gICAgICBjb25zdCBzdGFnZTogQWlTdGFnZSA9IHtcbiAgICAgICAgc3RhZ2U6IHN0YWdlVmFsID09IG51bGwgPyAnJyA6IFN0cmluZyhzdGFnZVZhbCksXG4gICAgICAgIGRldGFpbDogZGV0YWlsVmFsID09IG51bGwgPyAnJyA6IFN0cmluZyhkZXRhaWxWYWwpLFxuICAgICAgICBlbGFwc2VkTXM6IGVsYXBzZWRWYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIoZWxhcHNlZFZhbCkgfHwgMCxcbiAgICAgICAgdG9rZW5zSW5wdXQ6IHRJblZhbCA9PSBudWxsID8gMCA6IE51bWJlcih0SW5WYWwpIHx8IDAsXG4gICAgICAgIHRva2Vuc091dHB1dDogdE91dFZhbCA9PSBudWxsID8gMCA6IE51bWJlcih0T3V0VmFsKSB8fCAwLFxuICAgICAgICB0b2tlbnNDYWNoZWQ6IHRDYWNoZWRWYWwgPT0gbnVsbCA/IDAgOiBOdW1iZXIodENhY2hlZFZhbCkgfHwgMCxcbiAgICAgICAgZGF0YTogZGF0YVZhbCxcbiAgICAgIH07XG4gICAgICByZXN1bHQuc3RhZ2VzLnB1c2goc3RhZ2UpO1xuXG4gICAgICAvLyBUcmFjayBhZ2dyZWdhdGVzOiBlbGFwc2VkX21zIGlzIGN1bXVsYXRpdmUgb24gc2VydmVyIHNpZGUsIHRha2UgbWF4LlxuICAgICAgaWYgKHN0YWdlLmVsYXBzZWRNcyA+IHJlc3VsdC50b3RhbEVsYXBzZWRNcykge1xuICAgICAgICByZXN1bHQudG90YWxFbGFwc2VkTXMgPSBzdGFnZS5lbGFwc2VkTXM7XG4gICAgICB9XG4gICAgICByZXN1bHQudG90YWxUb2tlbnNJbnB1dCArPSBzdGFnZS50b2tlbnNJbnB1dDtcbiAgICAgIHJlc3VsdC50b3RhbFRva2Vuc091dHB1dCArPSBzdGFnZS50b2tlbnNPdXRwdXQ7XG4gICAgICByZXN1bHQudG90YWxUb2tlbnNDYWNoZWQgKz0gc3RhZ2UudG9rZW5zQ2FjaGVkO1xuXG4gICAgICAvLyBFeHRyYWN0IGdlbmVyYXRlZCBHUUwgZnJvbSBhbnkgc3RhZ2UncyBkYXRhLmdxbCAvIC5maW5hbF9ncWwgLyAuY2FuZGlkYXRlXG4gICAgICBpZiAoc3RhZ2UuZGF0YSAmJiB0eXBlb2Ygc3RhZ2UuZGF0YSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoc3RhZ2UuZGF0YSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgWydncWwnLCAnZmluYWxfZ3FsJywgJ2NhbmRpZGF0ZSddKSB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHN0YWdlLmRhdGEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKSkge1xuICAgICAgICAgICAgcmVzdWx0LmdlbmVyYXRlZEdxbCA9IHZhbDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc3RhZ2Uuc3RhZ2UgPT09ICdlcnJvcicpIHtcbiAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBmYWxzZTtcbiAgICAgICAgcmVzdWx0LmVycm9yID0gc3RhZ2UuZGV0YWlsIHx8ICdBSSBzdGFnZSByZXBvcnRlZCBlcnJvcic7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFnZS5zdGFnZSA9PT0gJ2ZpbmFsJykge1xuICAgICAgICAvLyBTZXJ2ZXIgZW1pdHMgZXhlY3V0aW9uIG1ldGFkYXRhIGRpY3QgaGVyZTsgYWlSZWFkIG92ZXJ3cml0ZXMgd2l0aCBhIHJlYWxcbiAgICAgICAgLy8gUmVzcG9uc2UgYWZ0ZXIgcmUtZXhlY3V0aW5nIHRoZSBnZW5lcmF0ZWQgR1FMLiBUaGUgYGFueWAgaGVyZSBpcyB1bmF2b2lkYWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHRoZSBzZXJ2ZXIgaGFuZHMgYmFjayBhIEpTT04gZGljdCBiZWZvcmUgd2Uga25vdyB0aGUgZmluYWwgc2hhcGUuXG4gICAgICAgIChyZXN1bHQgYXMgYW55KS5kYXRhID0gc3RhZ2UuZGF0YTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjazogaWYgZ2VuZXJhdGVkX2dxbCB3YXMgbmV2ZXIgY2FwdHVyZWQgZnJvbSBhIGRhdGEgZGljdCxcbiAgICAvLyBmYWxsIGJhY2sgdG8gdGhlIGZpbmFsIHN0YWdlJ3MgZGV0YWlsIHN0cmluZy5cbiAgICBpZiAocmVzdWx0LmdlbmVyYXRlZEdxbCA9PT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgaSA9IHJlc3VsdC5zdGFnZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgY29uc3QgcyA9IHJlc3VsdC5zdGFnZXNbaV07XG4gICAgICAgIGlmIChzLnN0YWdlID09PSAnZmluYWwnICYmIHMuZGV0YWlsKSB7XG4gICAgICAgICAgcmVzdWx0LmdlbmVyYXRlZEdxbCA9IHMuZGV0YWlsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW50ZXJuYWwgSGVscGVycyDigJQgVHJhaWxpbmcgQ29uZmlnIFNwbGl0dGVyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIFNwbGl0IGEgdmFyaWFkaWMgYXJnIGxpc3Qgd2hlcmUgdGhlIGxhc3QgZWxlbWVudCAqbWF5KiBiZSBhIFF1ZXJ5Q29uZmlnXG4gKiBpbnRvIHNlcGFyYXRlIHN0cmluZyBuYW1lcyBhbmQgYW4gb3B0aW9uYWwgY29uZmlnLiBQeXRob24gdXNlcyBrZXl3b3JkLW9ubHlcbiAqIGBjb25maWdgIGluIHRoZXNlIEFQSXM7IHRoZSBUeXBlU2NyaXB0IGVxdWl2YWxlbnQgaXMgYW4gb3B0aW9uYWwgdHJhaWxpbmdcbiAqIGNvbmZpZyBvYmplY3QgZGV0ZWN0ZWQgYnkgXCJub3QgYSBzdHJpbmdcIi5cbiAqL1xuZnVuY3Rpb24gc3BsaXRUcmFpbGluZ0NvbmZpZyhcbiAgYXJnczogQXJyYXk8c3RyaW5nIHwgUXVlcnlDb25maWcgfCB1bmRlZmluZWQ+XG4pOiB7IG5hbWVzOiBzdHJpbmdbXTsgY29uZmlnPzogUXVlcnlDb25maWcgfSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgbmFtZXM6IFtdIH07XG4gIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gIGlmIChsYXN0ICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGxhc3QgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGFyZ3Muc2xpY2UoMCwgLTEpIGFzIHN0cmluZ1tdLCBjb25maWc6IGxhc3QgYXMgUXVlcnlDb25maWcgfTtcbiAgfVxuICAvLyBJZiBsYXN0IGlzIHVuZGVmaW5lZCwgc3RyaXAgaXQgYXMgYSB0cmFpbGluZyBvcHRpb25hbCBjb25maWcgcGxhY2Vob2xkZXIuXG4gIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyBuYW1lczogYXJncy5zbGljZSgwLCAtMSkgYXMgc3RyaW5nW10gfTtcbiAgfVxuICByZXR1cm4geyBuYW1lczogYXJncyBhcyBzdHJpbmdbXSB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gSW50ZXJuYWwgSGVscGVycyDigJQgUGFyc2luZyBSZXNwb25zZSBSb3dzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKiogRmluZCB0aGUgaW5kZXggb2YgYSBjb2x1bW4gYnkgbmFtZSAoY2FzZS1pbnNlbnNpdGl2ZSksIG9yIC0xIGlmIG5vdCBmb3VuZCAqL1xuZnVuY3Rpb24gZmluZENvbHVtbkluZGV4KHJlc3A6IFJlc3BvbnNlLCBuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBsb3dlciA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAocmVzcC5jb2x1bW5zW2ldLnRvTG93ZXJDYXNlKCkgPT09IGxvd2VyKSByZXR1cm4gaTtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbi8qKiBTYWZlbHkgZXh0cmFjdCBhIHN0cmluZyBmcm9tIGEgcm93IGF0IHRoZSBnaXZlbiBjb2x1bW4gaW5kZXggKi9cbmZ1bmN0aW9uIGdldFN0cmluZ1ZhbChyb3c6IFJvdywgaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoaWR4IDwgMCkgcmV0dXJuICcnO1xuICB0cnkge1xuICAgIGNvbnN0IHZhbCA9IHJvdy5nZXQoaWR4KTtcbiAgICBpZiAodmFsID09PSBudWxsIHx8IHZhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XG4gICAgcmV0dXJuIFN0cmluZyh2YWwpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuLyoqIFNhZmVseSBleHRyYWN0IGEgbnVtYmVyIGZyb20gYSByb3cgYXQgdGhlIGdpdmVuIGNvbHVtbiBpbmRleCAqL1xuZnVuY3Rpb24gZ2V0TnVtYmVyVmFsKHJvdzogUm93LCBpZHg6IG51bWJlcik6IG51bWJlciB7XG4gIGlmIChpZHggPCAwKSByZXR1cm4gMDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2YWwgPSByb3cuZ2V0KGlkeCk7XG4gICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIDA7XG4gICAgY29uc3QgbnVtID0gTnVtYmVyKHZhbCk7XG4gICAgcmV0dXJuIGlzTmFOKG51bSkgPyAwIDogbnVtO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufVxuXG4vKiogTm9ybWFsaXplIGEgbGFiZWwgY29sdW1uIHZhbHVlIHRvIGEgc3RyaW5nIGFycmF5LlxuICpcbiAqIFNlcnZlciByZXR1cm5zIGEgbGlzdCAobXVsdGktbGFiZWwgc3VwcG9ydCkuIEFjY2VwdCBsaXN0IG9mIHN0cmluZ3MsXG4gKiBhIHNpbmdsZSBzdHJpbmcgKGRlZ3JhZGVkIHNlcnZlcnMpLCBvciBudWxsL3VuZGVmaW5lZC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VMYWJlbHNWYWx1ZSh2YWw6IGFueSk6IHN0cmluZ1tdIHtcbiAgaWYgKHZhbCA9PT0gbnVsbCB8fCB2YWwgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSByZXR1cm4gdmFsLm1hcCgoeDogYW55KSA9PiBTdHJpbmcoeCkpO1xuICByZXR1cm4gW1N0cmluZyh2YWwpXTtcbn1cblxuZnVuY3Rpb24gcGFyc2VMYWJlbEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlLCBmb3JjZWRUeXBlPzogc3RyaW5nKTogTGFiZWxJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBsYWJlbElkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbGFiZWwnKTtcbiAgaWYgKGxhYmVsSWR4IDwgMCkgbGFiZWxJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgbGV0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgaWYgKHR5cGVJZHggPCAwKSB0eXBlSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbGVtZW50X3R5cGUnKTtcblxuICByZXR1cm4gcmVzcC5yb3dzLm1hcChyb3cgPT4ge1xuICAgIGNvbnN0IHJhd0xhYmVsID0gbGFiZWxJZHggPj0gMCA/IHJvdy5nZXQobGFiZWxJZHgpIDogbnVsbDtcbiAgICBjb25zdCB0eXBlID0gZm9yY2VkVHlwZSAhPT0gdW5kZWZpbmVkID8gZm9yY2VkVHlwZSA6IGdldFN0cmluZ1ZhbChyb3csIHR5cGVJZHgpO1xuICAgIHJldHVybiB7XG4gICAgICBsYWJlbHM6IHBhcnNlTGFiZWxzVmFsdWUocmF3TGFiZWwpLFxuICAgICAgdHlwZSxcbiAgICB9O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VOb2RlVHlwZUluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogTm9kZVR5cGVJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGxldCBuYW1lSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICduYW1lJyk7XG4gIGNvbnN0IHR5cGVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3R5cGUnKTtcbiAgY29uc3QgcHJvcHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb3BlcnRpZXMnKTtcblxuICBpZiAobmFtZUlkeCA8IDApIG5hbWVJZHggPSB0eXBlSWR4O1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIG5hbWU6IGdldFN0cmluZ1ZhbChyb3csIG5hbWVJZHgpLFxuICAgIHByb3BlcnRpZXM6IHBhcnNlUHJvcGVydHlTdHJpbmcoZ2V0U3RyaW5nVmFsKHJvdywgcHJvcHNJZHgpKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUVkZ2VUeXBlSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBFZGdlVHlwZUluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgbGV0IG5hbWVJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ25hbWUnKTtcbiAgY29uc3QgdHlwZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndHlwZScpO1xuICBjb25zdCBwcm9wc0lkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvcGVydGllcycpO1xuXG4gIGlmIChuYW1lSWR4IDwgMCkgbmFtZUlkeCA9IHR5cGVJZHg7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgcHJvcGVydGllczogcGFyc2VQcm9wZXJ0eVN0cmluZyhnZXRTdHJpbmdWYWwocm93LCBwcm9wc0lkeCkpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlQWxnb0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogQWxnb0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgbmFtZUlkeCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnbmFtZScpO1xuICBjb25zdCBkZXNjSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdkZXNjcmlwdGlvbicpO1xuICBjb25zdCB2ZXJJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3ZlcnNpb24nKTtcbiAgY29uc3QgcGFyYW1zSWR4ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwYXJhbWV0ZXJzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgbmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgbmFtZUlkeCksXG4gICAgZGVzY3JpcHRpb246IGdldFN0cmluZ1ZhbChyb3csIGRlc2NJZHgpLFxuICAgIHZlcnNpb246IGdldFN0cmluZ1ZhbChyb3csIHZlcklkeCksXG4gICAgcGFyYW1ldGVyczogZ2V0U3RyaW5nVmFsKHJvdywgcGFyYW1zSWR4KSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUluZGV4SW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBJbmRleEluZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4TmFtZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnaW5kZXhfbmFtZScpO1xuICBjb25zdCBpZHhFbnRpdHkgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2VudGl0eV90eXBlJyk7XG4gIGNvbnN0IGlkeExhYmVsID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdsYWJlbCcpO1xuICBjb25zdCBpZHhQcm9wID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0eScpO1xuICBjb25zdCBpZHhQcmVmaXggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3ByZWZpeF9sZW5ndGgnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4UHJvZ3Jlc3MgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3Byb2dyZXNzJyk7XG4gIGNvbnN0IGlkeEluZGV4ZWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4ZWRfY291bnQnKTtcbiAgY29uc3QgaWR4VG90YWwgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3RvdGFsX2NvdW50Jyk7XG4gIGNvbnN0IGlkeEVycm9yID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlcnJvcicpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiB7XG4gICAgY29uc3QgaW5mbzogSW5kZXhJbmZvID0ge1xuICAgICAgaW5kZXhOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhOYW1lKSxcbiAgICAgIGVudGl0eVR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEVudGl0eSksXG4gICAgICBsYWJlbDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TGFiZWwpLFxuICAgICAgcHJvcGVydHk6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb3ApLFxuICAgICAgc3RhdHVzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGF0dXMpLFxuICAgICAgcHJvZ3Jlc3M6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb2dyZXNzKSxcbiAgICAgIGluZGV4ZWRDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4SW5kZXhlZCksXG4gICAgICB0b3RhbENvdW50OiBnZXROdW1iZXJWYWwocm93LCBpZHhUb3RhbCksXG4gICAgICBlcnJvcjogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RXJyb3IpLFxuICAgIH07XG4gICAgaWYgKGlkeFByZWZpeCA+PSAwKSB7XG4gICAgICBpbmZvLnByZWZpeExlbmd0aCA9IGdldE51bWJlclZhbChyb3csIGlkeFByZWZpeCk7XG4gICAgfVxuICAgIHJldHVybiBpbmZvO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGdWxsdGV4dEluZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogRnVsbHRleHRJbmZvW10ge1xuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIGNvbnN0IGlkeE5hbWUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2luZGV4X25hbWUnKTtcbiAgY29uc3QgaWR4RW50aXR5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdlbnRpdHlfdHlwZScpO1xuICBjb25zdCBpZHhTY2hlbWEgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3NjaGVtYV9uYW1lJyk7XG4gIGNvbnN0IGlkeFByb3BzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9wZXJ0aWVzJyk7XG4gIGNvbnN0IGlkeEFuYWx5emVyID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdhbmFseXplcicpO1xuICBjb25zdCBpZHhTdGF0dXMgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXR1cycpO1xuICBjb25zdCBpZHhEb2NDb3VudCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnZG9jX2NvdW50Jyk7XG4gIGNvbnN0IGlkeFByb2dyZXNzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwcm9ncmVzcycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIGluZGV4TmFtZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4TmFtZSksXG4gICAgZW50aXR5VHlwZTogZ2V0U3RyaW5nVmFsKHJvdywgaWR4RW50aXR5KSxcbiAgICBzY2hlbWFOYW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTY2hlbWEpLFxuICAgIHByb3BlcnRpZXM6IGdldFN0cmluZ1ZhbChyb3csIGlkeFByb3BzKSxcbiAgICBhbmFseXplcjogZ2V0U3RyaW5nVmFsKHJvdywgaWR4QW5hbHl6ZXIpLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICBkb2NDb3VudDogZ2V0TnVtYmVyVmFsKHJvdywgaWR4RG9jQ291bnQpLFxuICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gIH0pKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUYXNrSW5mb1Jvd3MocmVzcDogUmVzcG9uc2UpOiBUYXNrSW5mb1tdIHtcbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBbXTtcblxuICBjb25zdCBpZHhJZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAndGFza19pZCcpO1xuICBjb25zdCBpZHhUeXBlID0gZmluZENvbHVtbkluZGV4KHJlc3AsICd0eXBlJyk7XG4gIGNvbnN0IGlkeFF1ZXJ5ID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdxdWVyeScpO1xuICBjb25zdCBpZHhBbGdvID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdhbGdvX25hbWUnKTtcbiAgY29uc3QgaWR4U3RhdHVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdzdGF0dXMnKTtcbiAgY29uc3QgaWR4U3RhcnRlZCA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhcnRlZF9hdCcpO1xuICBjb25zdCBpZHhQcm9ncmVzcyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAncHJvZ3Jlc3MnKTtcbiAgY29uc3QgaWR4UGFyYW1zID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdwYXJhbWV0ZXJzJyk7XG4gIGNvbnN0IGlkeE5vZGVzID0gZmluZENvbHVtbkluZGV4KHJlc3AsICdub2Rlc193cml0dGVuJyk7XG4gIGNvbnN0IGlkeENvbXB1dGUgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2NvbXB1dGVfdGltZV9tcycpO1xuICBjb25zdCBpZHhXcml0ZSA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnd3JpdGVfdGltZV9tcycpO1xuXG4gIHJldHVybiByZXNwLnJvd3MubWFwKHJvdyA9PiAoe1xuICAgIHRhc2tJZDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4SWQpLFxuICAgIHR5cGU6IGdldFN0cmluZ1ZhbChyb3csIGlkeFR5cGUpLFxuICAgIHF1ZXJ5OiBnZXRTdHJpbmdWYWwocm93LCBpZHhRdWVyeSksXG4gICAgYWxnb05hbWU6IGdldFN0cmluZ1ZhbChyb3csIGlkeEFsZ28pLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgICBzdGFydGVkQXQ6IGdldFN0cmluZ1ZhbChyb3csIGlkeFN0YXJ0ZWQpLFxuICAgIHByb2dyZXNzOiBnZXRTdHJpbmdWYWwocm93LCBpZHhQcm9ncmVzcyksXG4gICAgcGFyYW1ldGVyczogZ2V0U3RyaW5nVmFsKHJvdywgaWR4UGFyYW1zKSxcbiAgICBub2Rlc1dyaXR0ZW46IGdldE51bWJlclZhbChyb3csIGlkeE5vZGVzKSxcbiAgICBjb21wdXRlVGltZU1zOiBnZXROdW1iZXJWYWwocm93LCBpZHhDb21wdXRlKSxcbiAgICB3cml0ZVRpbWVNczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4V3JpdGUpLFxuICB9KSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvY2Vzc0luZm9Sb3dzKHJlc3A6IFJlc3BvbnNlKTogUHJvY2Vzc0luZm9bXSB7XG4gIGlmIChyZXNwLnJvd3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgY29uc3QgaWR4SWQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5X2lkJyk7XG4gIGNvbnN0IGlkeFRleHQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3F1ZXJ5X3RleHQnKTtcbiAgY29uc3QgaWR4U3RhcnQgPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXJ0X3RpbWUnKTtcbiAgY29uc3QgaWR4RHVyYXRpb24gPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ2R1cmF0aW9uX21zJyk7XG4gIGNvbnN0IGlkeFN0YXR1cyA9IGZpbmRDb2x1bW5JbmRleChyZXNwLCAnc3RhdHVzJyk7XG5cbiAgcmV0dXJuIHJlc3Aucm93cy5tYXAocm93ID0+ICh7XG4gICAgcXVlcnlJZDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4SWQpLFxuICAgIHF1ZXJ5VGV4dDogZ2V0U3RyaW5nVmFsKHJvdywgaWR4VGV4dCksXG4gICAgc3RhcnRUaW1lOiBnZXRTdHJpbmdWYWwocm93LCBpZHhTdGFydCksXG4gICAgZHVyYXRpb25NczogZ2V0TnVtYmVyVmFsKHJvdywgaWR4RHVyYXRpb24pLFxuICAgIHN0YXR1czogZ2V0U3RyaW5nVmFsKHJvdywgaWR4U3RhdHVzKSxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBwYXJzZUdyYXBoU3RhdHMocmVzcDogUmVzcG9uc2UpOiBHcmFwaFN0YXRzIHtcbiAgY29uc3QgZ3M6IEdyYXBoU3RhdHMgPSB7XG4gICAgZ3JhcGhOYW1lOiAnJyxcbiAgICBub2RlQ291bnQ6IDAsXG4gICAgZWRnZUNvdW50OiAwLFxuICAgIGxhYmVsQ291bnRzOiB7fSxcbiAgICBlZGdlTGFiZWxDb3VudHM6IHt9LFxuICAgIG5vZGVQcm9wZXJ0eVN0YXRzOiB7fSxcbiAgICBlZGdlUHJvcGVydHlTdGF0czoge30sXG4gIH07XG5cbiAgaWYgKHJlc3Aucm93cy5sZW5ndGggPT09IDApIHJldHVybiBncztcblxuICBsZXQgc3RhdHNJZHggPSBmaW5kQ29sdW1uSW5kZXgocmVzcCwgJ3N0YXRzJyk7XG4gIGlmIChzdGF0c0lkeCA8IDApIHN0YXRzSWR4ID0gMDtcblxuICBpZiAocmVzcC5yb3dzLmxlbmd0aCA9PT0gMCB8fCBzdGF0c0lkeCA+PSByZXNwLnJvd3NbMF0udmFsdWVzLmxlbmd0aCkgcmV0dXJuIGdzO1xuXG4gIGNvbnN0IHZhbCA9IHJlc3Aucm93c1swXS5nZXQoc3RhdHNJZHgpO1xuICBpZiAodmFsICYmIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKHZhbC5ncmFwaF9uYW1lICE9PSB1bmRlZmluZWQpIGdzLmdyYXBoTmFtZSA9IFN0cmluZyh2YWwuZ3JhcGhfbmFtZSk7XG4gICAgaWYgKHZhbC5ub2RlX2NvdW50ICE9PSB1bmRlZmluZWQpIGdzLm5vZGVDb3VudCA9IE51bWJlcih2YWwubm9kZV9jb3VudCkgfHwgMDtcbiAgICBpZiAodmFsLmVkZ2VfY291bnQgIT09IHVuZGVmaW5lZCkgZ3MuZWRnZUNvdW50ID0gTnVtYmVyKHZhbC5lZGdlX2NvdW50KSB8fCAwO1xuICB9XG5cbiAgcmV0dXJuIGdzO1xufVxuXG4vLyAtLS0gRGVsZXRlIEFQSSBoZWxwZXJzIC0tLVxuXG5mdW5jdGlvbiBmb3JtYXRTdHJpbmdMaXN0KGlkczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAvLyBFc2NhcGUgc2luZ2xlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMgZm9yIHNhZmUgR1FMIGluamVjdGlvbi5cbiAgcmV0dXJuIGlkcy5tYXAoaWQgPT4ge1xuICAgIGlmIChpZCA9PSBudWxsKSByZXR1cm4gXCInJ1wiO1xuICAgIGNvbnN0IGVzY2FwZWQgPSBpZC5yZXBsYWNlKC9cXFxcL2csICdcXFxcXFxcXCcpLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKTtcbiAgICByZXR1cm4gYCcke2VzY2FwZWR9J2A7XG4gIH0pLmpvaW4oJywgJyk7XG59XG5cbi8qKlxuICogUmVzaGFwZSByYXcgNS1jb2wgZWRnZS1kZWxldGUgcmVzcG9uc2UgaW50byBzaW5nbGUgXCJlXCIgY29sdW1uXG4gKiBob2xkaW5nIEdxbGRiRWRnZSBvYmplY3RzIOKAlCBzeW1tZXRyaWMgd2l0aCB0aGUgbm9kZSBwYXRoXG4gKiAoYHJlc3BvbnNlLmFsaWFzKFwiblwiKS5hc05vZGVzKClgIHZzIGByZXNwb25zZS5hbGlhcyhcImVcIikuYXNFZGdlcygpYCkuXG4gKiBSb3dzIHdpdGggYSBudWxsIGlkIGFyZSBza2lwcGVkIChubyBpZCA9IG5vIG1lYW5pbmdmdWwgRWRnZSkuXG4gKi9cbmZ1bmN0aW9uIHJlc2hhcGVFZGdlRGVsZXRlKHJhdzogUmVzcG9uc2UpOiBSZXNwb25zZSB7XG4gIGNvbnN0IG5ld1Jvd3M6IFJvd1tdID0gW107XG4gIGZvciAoY29uc3QgciBvZiByYXcucm93cykge1xuICAgIGNvbnN0IGlkID0gci5sZW5ndGggPiAwID8gci5nZXQoMCkgOiBudWxsO1xuICAgIGlmIChpZCA9PSBudWxsKSBjb250aW51ZTtcbiAgICBjb25zdCBmcm9tICA9IHIubGVuZ3RoID4gMSA/IHIuZ2V0KDEpIDogbnVsbDtcbiAgICBjb25zdCB0byAgICA9IHIubGVuZ3RoID4gMiA/IHIuZ2V0KDIpIDogbnVsbDtcbiAgICBjb25zdCBsYWJlbCA9IHIubGVuZ3RoID4gMyA/IHIuZ2V0KDMpIDogbnVsbDtcbiAgICBjb25zdCBwcm9wcyA9IHIubGVuZ3RoID4gNCA/IHIuZ2V0KDQpIDoge307XG4gICAgY29uc3QgZWRnZSA9IHtcbiAgICAgIGlkOiBTdHJpbmcoaWQpLFxuICAgICAgdXVpZDogJycsXG4gICAgICBsYWJlbDogbGFiZWwgPyBTdHJpbmcobGFiZWwpIDogJycsXG4gICAgICBmcm9tTm9kZUlkOiBmcm9tID8gU3RyaW5nKGZyb20pIDogJycsXG4gICAgICB0b05vZGVJZDogdG8gPyBTdHJpbmcodG8pIDogJycsXG4gICAgICBwcm9wZXJ0aWVzOiAocHJvcHMgJiYgdHlwZW9mIHByb3BzID09PSAnb2JqZWN0JykgPyBwcm9wcyA6IHt9LFxuICAgIH07XG4gICAgLy8gTWFyayB0aGUgY29sdW1uIGFzIFByb3BlcnR5VHlwZS5FREdFIHNvIEFsaWFzUmVzdWx0LmFzRWRnZXMoKSBwaWNrcyBpdCB1cC5cbiAgICBuZXdSb3dzLnB1c2gobmV3IFJvdyhbZWRnZV0sIFtQcm9wZXJ0eVR5cGUuRURHRV0pKTtcbiAgfVxuICByZXR1cm4gbmV3IFJlc3BvbnNlKFsnZSddLCBuZXdSb3dzLCBuZXdSb3dzLmxlbmd0aCwgcmF3Lmhhc01vcmUsXG4gICAgICAgICAgICAgICAgICAgICByYXcud2FybmluZ3MsIHJhdy5yb3dzQWZmZWN0ZWQsIHJhdy5jdXJyZW50R3JhcGgsXG4gICAgICAgICAgICAgICAgICAgICByYXcudGltZUNvc3ROcywgcmF3LmRpc2tDb3N0TnMsIHJhdy5jb21wdXRlQ29zdE5zKTtcbn1cbiJdfQ==