@dollhousemcp/mcp-server 2.0.30 → 2.0.31

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.
@@ -11,7 +11,7 @@ import { homedir } from 'node:os';
11
11
  import { logger } from '../../utils/logger.js';
12
12
  import { formatPermissionResponse } from '../../handlers/mcp-aql/evaluatePermission.js';
13
13
  import { ensureLatestPortFile } from '../portDiscovery.js';
14
- import { getLastPermissionHookStartupRepairSummary, getPermissionHookStatusAsync, reconcilePermissionHookStatus, summarizePermissionHookHealth, } from '../../utils/permissionHooks.js';
14
+ import { getLastPermissionHookStartupRepairSummary, getPermissionHookDiagnosticsPath, getPermissionHookStatusAsync, readLastPermissionHookDiagnostic, reconcilePermissionHookStatus, summarizePermissionHookHealth, } from '../../utils/permissionHooks.js';
15
15
  import { SlidingWindowRateLimiter } from '../../utils/SlidingWindowRateLimiter.js';
16
16
  import { PERMISSION_AUTHORITY_HOSTS, PERMISSION_AUTHORITY_MODES, readPermissionAuthorityState, setPermissionAuthorityMode, } from '../../utils/permissionAuthority.js';
17
17
  const PERMISSION_ROUTE_RATE_LIMIT_REQUESTS = 120;
@@ -319,12 +319,16 @@ export function registerPermissionRoutes(router, handler, options = {}) {
319
319
  const allowOperations = data.combinedAllowOperations ?? [];
320
320
  const confirmOperations = data.combinedConfirmOperations ?? [];
321
321
  const hookStartupRepair = getLastPermissionHookStartupRepairSummary();
322
+ const hookDiagnosticsPath = getPermissionHookDiagnosticsPath(authorityHomeDir);
323
+ const hookLastDiagnostic = await readLastPermissionHookDiagnostic(authorityHomeDir);
322
324
  const hookHealthHost = hookStatus.host ?? hookHost ?? 'managed-host';
323
325
  const hookHealth = summarizePermissionHookHealth({
324
326
  installedHosts: hookStatus.installed || hookStatus.assetsPrepared ? [hookHealthHost] : [],
325
327
  currentHosts: hookStatus.assetsCurrent ? [hookHealthHost] : [],
326
328
  repairedHosts: hookStatus.autoRepaired ? [hookHealthHost] : [],
327
329
  needsRepairHosts: hookStatus.needsRepair ? [hookHealthHost] : [],
330
+ diagnosticsPath: hookDiagnosticsPath,
331
+ lastDiagnostic: hookLastDiagnostic,
328
332
  lastStartupRepair: hookStartupRepair,
329
333
  });
330
334
  res.json({
@@ -352,6 +356,10 @@ export function registerPermissionRoutes(router, handler, options = {}) {
352
356
  hookRepairError: hookStatus.repairError,
353
357
  hookHealth,
354
358
  hookStartupRepair,
359
+ hookDiagnostics: {
360
+ logPath: hookDiagnosticsPath,
361
+ lastEvent: hookLastDiagnostic,
362
+ },
355
363
  authority: authorityState,
356
364
  authoritySupportedHosts: installedAuthorityHosts,
357
365
  authoritySupportedModes: [...PERMISSION_AUTHORITY_MODES],
@@ -446,4 +454,4 @@ function normalizeAuthorityMode(value) {
446
454
  function asStringArray(value) {
447
455
  return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
448
456
  }
449
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlDQUF5QyxFQUN6Qyw0QkFBNEIsRUFDNUIsNkJBQTZCLEVBQzdCLDZCQUE2QixHQUM5QixNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFHTCwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDRCQUE0QixFQUM1QiwwQkFBMEIsR0FDM0IsTUFBTSxvQ0FBb0MsQ0FBQztBQXlENUMsTUFBTSxvQ0FBb0MsR0FBRyxHQUFHLENBQUM7QUFDakQsTUFBTSxxQ0FBcUMsR0FBRyxNQUFNLENBQUM7QUFDckQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFhakMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzVFLE1BQU0saUNBQWlDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFHNUUsMEVBQTBFO0FBQzFFLFNBQVMsYUFBYSxDQUFDLEdBQTRCLEVBQUUsSUFBYyxFQUFFLFFBQWdCO0lBQ25GLEtB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QUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkIsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHVDQUF1QzthQUNwRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxLQUFnQyxDQUFDO1FBQ3ZHLENBQUMsQ0FBQyxLQUFnQztRQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYztJQUM1QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLENBQUMsS0FBZ0MsQ0FBQztRQUN2RyxDQUFDLENBQUMsS0FBZ0M7UUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDekcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVybWlzc2lvbiBldmFsdWF0aW9uIEhUVFAgcm91dGVzIGFuZCBkZWNpc2lvbiB0cmFja2luZy5cbiAqXG4gKiBQcm92aWRlczpcbiAqIC0gUE9TVCAvZXZhbHVhdGVfcGVybWlzc2lvbiDigJQgZXZhbHVhdGVzIHRvb2wgcGVybWlzc2lvbnMgdmlhIE1DUC1BUUxcbiAqIC0gR0VUIC9wZXJtaXNzaW9ucy9zdGF0dXMg4oCUIHJldHVybnMgY3VycmVudCBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICogLSBEZWNpc2lvbiB0cmFja2luZyByaW5nIGJ1ZmZlciBmb3IgdGhlIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9ldmFsdWF0ZVBlcm1pc3Npb24uanMnO1xuaW1wb3J0IHsgZW5zdXJlTGF0ZXN0UG9ydEZpbGUgfSBmcm9tICcuLi9wb3J0RGlzY292ZXJ5LmpzJztcbmltcG9ydCB7XG4gIGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5LFxuICBnZXRQZXJtaXNzaW9uSG9va1N0YXR1c0FzeW5jLFxuICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0LFxuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG4gIHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uQXV0aG9yaXR5LmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBkZWNpc2lvbjogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIHRhcmdldExhYmVsPzogc3RyaW5nO1xuICBkZXRhaWxzPzogUGVybWlzc2lvbkRlY2lzaW9uRGV0YWlsW107XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWwge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufVxuXG50eXBlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleSA9XG4gIHwgJ2ZpbGVfcGF0aCdcbiAgfCAncGF0aCdcbiAgfCAndXJsJ1xuICB8ICdwYXR0ZXJuJ1xuICB8ICdxdWVyeSdcbiAgfCAnZWxlbWVudF9uYW1lJ1xuICB8ICdyZXF1ZXN0X2lkJztcblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbklucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBmaWxlX3BhdGg/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgcGF0dGVybj86IHN0cmluZztcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIGVsZW1lbnRfbmFtZT86IHN0cmluZztcbiAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldERlc2NyaXB0b3Ige1xuICBrZXk6IFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleTtcbiAgbGFiZWw6IHN0cmluZztcbiAgbW9ub3NwYWNlPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEtub3duUG9saWN5U2Vzc2lvbiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2U6ICdwb2xpY3knO1xufVxuXG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfUkVRVUVTVFMgPSAxMjA7XG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TID0gNjBfMDAwO1xuY29uc3QgREVDSVNJT05fQlVGRkVSX1NJWkUgPSAyMDA7XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyIHtcbiAgdHJhY2tEZWNpc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHZvaWQ7XG4gIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXTtcbn1cblxuY29uc3QgQ0xBVURFX0NPTVBBVElCTEVfSE9PS19QTEFURk9STVMgPSBuZXcgU2V0KFsnY2xhdWRlX2NvZGUnLCAndnNjb2RlJ10pO1xuY29uc3QgTk9STUFMSVpBQkxFX1BFUk1JU1NJT05fREVDSVNJT05TID0gbmV3IFNldChbJ2FsbG93JywgJ2RlbnknLCAnYXNrJ10pO1xudHlwZSBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24gPSAnYWxsb3cnIHwgJ2RlbnknIHwgJ2Fzayc7XG5cbi8qKiBFeHRyYWN0IGEgc3RyaW5nIGZpZWxkIGZyb20gYSByZWNvcmQsIHRyeWluZyBtdWx0aXBsZSBrZXlzIGluIG9yZGVyICovXG5mdW5jdGlvbiBleHRyYWN0U3RyaW5nKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleXM6IHN0cmluZ1tdLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbCA9IG9iaj8uW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY2lzaW9uKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBjb25zdCBuZXN0ZWQgPSByZXN1bHQuaG9va1NwZWNpZmljT3V0cHV0O1xuICBpZiAobmVzdGVkICYmIHR5cGVvZiBuZXN0ZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG5lc3RlZCkpIHtcbiAgICBjb25zdCBuZXN0ZWREZWNpc2lvbiA9IChuZXN0ZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBlcm1pc3Npb25EZWNpc2lvbjtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERlY2lzaW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZERlY2lzaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQucGVybWlzc2lvbiA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQucGVybWlzc2lvbjtcbiAgaWYgKHR5cGVvZiByZXN1bHQuZGVjaXNpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LmRlY2lzaW9uO1xuICBpZiAodHlwZW9mIHJlc3VsdC5iZWhhdmlvciA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQuYmVoYXZpb3I7XG4gIGlmICh0eXBlb2YgcmVzdWx0LmFsbG93ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJlc3VsdC5hbGxvd2VkID8gJ2FsbG93JyA6ICdkZW55JztcbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlYXNvbihyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkUmVhc29uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uUmVhc29uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkUmVhc29uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZFJlYXNvbjtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBDTEFVREVfQ09NUEFUSUJMRV9IT09LX1BMQVRGT1JNUy5oYXMocGxhdGZvcm0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IHN0cmluZyxcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm0pKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZCA9IHJlc3VsdC5ob29rU3BlY2lmaWNPdXRwdXQ7XG4gIGlmIChuZXN0ZWQgJiYgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobmVzdGVkKSkge1xuICAgIGNvbnN0IG5lc3RlZERlY2lzaW9uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGVjaXNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3VsdCk7XG4gIGlmIChOT1JNQUxJWkFCTEVfUEVSTUlTU0lPTl9ERUNJU0lPTlMuaGFzKGRlY2lzaW9uKSkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICBkZWNpc2lvbiBhcyBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24sXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGlucHV0LFxuICAgICAgZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVjaXNpb25EZXRhaWxzKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQsXG4gIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBsYXRmb3JtOiBzdHJpbmcsXG4pOiB7IHRhcmdldD86IHN0cmluZzsgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7IGRldGFpbHM6IFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbFtdIH0ge1xuICBjb25zdCBkZXRhaWxzOiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXSA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUGxhdGZvcm0nLCB2YWx1ZTogcGxhdGZvcm0sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiBpbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21tYW5kICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnQ29tbWFuZCcsIHZhbHVlOiBpbnB1dC5jb21tYW5kLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0YXJnZXREZXNjcmlwdG9yczogUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0RGVzY3JpcHRvcltdID0gW1xuICAgIHsga2V5OiAnZmlsZV9wYXRoJywgbGFiZWw6ICdGaWxlJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdwYXRoJywgbGFiZWw6ICdQYXRoJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICd1cmwnLCBsYWJlbDogJ1VSTCcgfSxcbiAgICB7IGtleTogJ3BhdHRlcm4nLCBsYWJlbDogJ1BhdHRlcm4nLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3F1ZXJ5JywgbGFiZWw6ICdRdWVyeScgfSxcbiAgICB7IGtleTogJ2VsZW1lbnRfbmFtZScsIGxhYmVsOiAnRWxlbWVudCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAncmVxdWVzdF9pZCcsIGxhYmVsOiAnUmVxdWVzdCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGxldCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcmdldExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRhcmdldERlc2NyaXB0b3JzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtkZXNjcmlwdG9yLmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB2YWx1ZTtcbiAgICB0YXJnZXRMYWJlbCA9IGRlc2NyaXB0b3IubGFiZWw7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6IGRlc2NyaXB0b3IubGFiZWwsIHZhbHVlLCBtb25vc3BhY2U6IGRlc2NyaXB0b3IubW9ub3NwYWNlIH0pO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFBhdHRlcm4gPSBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydtYXRjaGVkX3BhdHRlcm4nLCAnbWF0Y2hlZFBhdHRlcm4nXSwgJycpO1xuICBpZiAobWF0Y2hlZFBhdHRlcm4gIT09ICcnKSB7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6ICdNYXRjaGVkIFBhdHRlcm4nLCB2YWx1ZTogbWF0Y2hlZFBhdHRlcm4sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBvbGljeVNvdXJjZSA9IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ3BvbGljeV9zb3VyY2UnLCAncG9saWN5U291cmNlJ10sICcnKTtcbiAgaWYgKHBvbGljeVNvdXJjZSAhPT0gJycpIHtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogJ1BvbGljeSBTb3VyY2UnLCB2YWx1ZTogcG9saWN5U291cmNlLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4geyB0YXJnZXQsIHRhcmdldExhYmVsLCBkZXRhaWxzIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoYnVmZmVyU2l6ZSA9IERFQ0lTSU9OX0JVRkZFUl9TSVpFKTogUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlciB7XG4gIGNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbiAgbGV0IGRlY2lzaW9uQ291bnRlciA9IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja0RlY2lzaW9uKFxuICAgICAgc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgICAgaW5wdXQ6IFBlcm1pc3Npb25EZWNpc2lvbklucHV0LFxuICAgICAgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBkZXRhaWxTdGF0ZSA9IGJ1aWxkRGVjaXNpb25EZXRhaWxzKHRvb2xOYW1lLCBpbnB1dCwgcmVzdWx0LCBwbGF0Zm9ybSk7XG4gICAgICBjb25zdCBlbnRyeTogUGVybWlzc2lvbkRlY2lzaW9uID0ge1xuICAgICAgICBpZDogYGQtJHsrK2RlY2lzaW9uQ291bnRlcn1gLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2lzaW9uOiBleHRyYWN0RGVjaXNpb24ocmVzdWx0KSxcbiAgICAgICAgcmVhc29uOiBleHRyYWN0UmVhc29uKHJlc3VsdCksXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICB0YXJnZXQ6IGRldGFpbFN0YXRlLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0TGFiZWw6IGRldGFpbFN0YXRlLnRhcmdldExhYmVsLFxuICAgICAgICBkZXRhaWxzOiBkZXRhaWxTdGF0ZS5kZXRhaWxzLFxuICAgICAgfTtcbiAgICAgIHJlY2VudERlY2lzaW9ucy51bnNoaWZ0KGVudHJ5KTtcbiAgICAgIGlmIChyZWNlbnREZWNpc2lvbnMubGVuZ3RoID4gYnVmZmVyU2l6ZSkge1xuICAgICAgICByZWNlbnREZWNpc2lvbnMubGVuZ3RoID0gYnVmZmVyU2l6ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXSB7XG4gICAgICByZXR1cm4gcmVjZW50RGVjaXNpb25zO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUFycmF5cyguLi5zb3VyY2VzOiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1lcmdlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyAmJiBlbnRyeSAhPT0gJycpIHtcbiAgICAgICAgbWVyZ2VkLmFkZChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiAoe1xuICAgIC4uLmVsZW1lbnQsXG4gICAgZWxlbWVudF9uYW1lOiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudCksXG4gICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuYWxsb3dQYXR0ZXJucywgZWxlbWVudC5hbGxvd09wZXJhdGlvbnMpLFxuICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuY29uZmlybVBhdHRlcm5zLCBlbGVtZW50LmNvbmZpcm1PcGVyYXRpb25zKSxcbiAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmRlbnlQYXR0ZXJucywgZWxlbWVudC5kZW55T3BlcmF0aW9ucyksXG4gICAgaW52YWxpZEdhdGVrZWVwZXJQb2xpY3k6ICEhZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlclBvbGljeSxcbiAgICBpbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2U6IHR5cGVvZiBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA6IHVuZGVmaW5lZCxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVsZW1lbnQuZWxlbWVudF9uYW1lID09PSAnc3RyaW5nJykgcmV0dXJuIGVsZW1lbnQuZWxlbWVudF9uYW1lO1xuICBpZiAodHlwZW9mIGVsZW1lbnQubmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50Lm5hbWU7XG4gIHJldHVybiAnJztcbn1cblxuLyoqIEhlbHBlciB0byBleHRyYWN0IHNpbmdsZSByZXN1bHQgZnJvbSBNQ1AtQVFMIGJhdGNoIHJlc3BvbnNlICovXG5mdW5jdGlvbiBhc1NpbmdsZVJlc3VsdChyZXN1bHRzOiB1bmtub3duKTogeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0c1swXSB8fCB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VtcHR5IHJlc3VsdCcgfTtcbiAgcmV0dXJuIHJlc3VsdHMgYXMgeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEtub3duUG9saWN5U2Vzc2lvbltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBrbm93blNlc3Npb25zOiBLbm93blBvbGljeVNlc3Npb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IHNlc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuc2Vzc2lvbklkcykgPyBlbGVtZW50LnNlc3Npb25JZHMgOiBbXTtcbiAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBzZXNzaW9uSWRzKSB7XG4gICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCAhPT0gJ3N0cmluZycgfHwgc2Vzc2lvbklkID09PSAnJyB8fCBzZWVuLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuLmFkZChzZXNzaW9uSWQpO1xuICAgICAga25vd25TZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6ICdwb2xpY3knLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtub3duU2Vzc2lvbnMuc29ydCgoYSwgYikgPT4gYS5zZXNzaW9uSWQubG9jYWxlQ29tcGFyZShiLnNlc3Npb25JZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZUxhdGVzdFBvcnRGaWxlKHBvcnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tXZWJVSS9HYXRld2F5XSBDb3VsZCBub3QgcmVmcmVzaCBwZXJtaXNzaW9uLXNlcnZlci5wb3J0Jywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgaG9tZURpcjogc3RyaW5nLFxuICBhdXRob3JpdHlTdGF0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlPj4sXG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzOiBib29sZWFuLFxuKTogUHJvbWlzZTxQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFtdPiB7XG4gIGNvbnN0IGluc3RhbGxlZFN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMubWFwKGFzeW5jIChob3N0KSA9PiAoe1xuICAgICAgaG9zdCxcbiAgICAgIHN0YXR1czogYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwgeyBob21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFsbGVkSG9zdHMgPSBpbnN0YWxsZWRTdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5pbnN0YWxsZWQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuXG4gIGNvbnN0IHBlcnNpc3RlZEhvc3RzID0gT2JqZWN0LmtleXMoYXV0aG9yaXR5U3RhdGUuaG9zdHMgfHwge30pLmZpbHRlcigoaG9zdCk6IGhvc3QgaXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgPT5cbiAgICAoUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGhvc3QpLFxuICApO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaW5zdGFsbGVkSG9zdHMuY29uY2F0KHBlcnNpc3RlZEhvc3RzKSkpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHBlcm1pc3Npb24tcmVsYXRlZCByb3V0ZXMgb24gYSBnYXRld2F5IHJvdXRlci5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIE1DUC1BUUwgaGFuZGxlciBmb3IgcG9saWN5IGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzT3B0aW9ucyB7XG4gIGhvbWVEaXI/OiBzdHJpbmc7XG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhcbiAgcm91dGVyOiBSb3V0ZXIsXG4gIGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIsXG4gIG9wdGlvbnM6IFJlZ2lzdGVyUGVybWlzc2lvblJvdXRlc09wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBhdXRob3JpdHlIb21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKTtcbiAgY29uc3QgYXV0b1JlcGFpckhvb2tBc3NldHMgPSBvcHRpb25zLmF1dG9SZXBhaXJIb29rQXNzZXRzID8/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCc7XG4gIGNvbnN0IGRlY2lzaW9uVHJhY2tlciA9IGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9ldmFsdWF0ZV9wZXJtaXNzaW9uXG4gICAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBlbmRwb2ludCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAgICogUm91dGVzIHRocm91Z2ggZXZhbHVhdGVfcGVybWlzc2lvbiBNQ1AtQVFMIFJFQUQgb3BlcmF0aW9uLlxuICAgKiBGYWlsLW9wZW46IHJldHVybnMgYWxsb3cgb24gYW55IGVycm9yIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3QgcGVybWlzc2lvbkxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFxuICAgIFBFUk1JU1NJT05fUk9VVEVfUkFURV9MSU1JVF9SRVFVRVNUUyxcbiAgICBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TLFxuICApO1xuICByb3V0ZXIucG9zdCgnL2V2YWx1YXRlX3Blcm1pc3Npb24nLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgYXdhaXQgc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocmVxLnNvY2tldC5sb2NhbFBvcnQpO1xuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IGFzIHtcbiAgICAgIHRvb2xfbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0PzogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQ7XG4gICAgICBwbGF0Zm9ybT86IHN0cmluZztcbiAgICAgIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6ICdjbGF1ZGVfY29kZSc7XG5cbiAgICBpZiAoIXBlcm1pc3Npb25MaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZXNzaW9uX2lkID0gdHlwZW9mIGJvZHkuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBib2R5LnNlc3Npb25faWQubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbnB1dCA9IGJvZHkuaW5wdXQ7XG5cbiAgICBpZiAoIXRvb2xfbmFtZSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCB8fCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gYmFkIGlucHV0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZXZhbHVhdGVfcGVybWlzc2lvbicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHRvb2xfbmFtZSxcbiAgICAgICAgICBpbnB1dDogaW5wdXQgfHwge30sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgLi4uKHNlc3Npb25faWQgPyB7IHNlc3Npb25faWQgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoIW9wUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uIGZhaWxlZCAoJHtlbGFwc2VkTXN9bXMpOiAke29wUmVzdWx0LmVycm9yfWApO1xuICAgICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGlucHV0IHx8IHt9LFxuICAgICAgICByYXdSZXN1bHQsXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhY2tlZFJlc3VsdCA9IHsgLi4ucmF3UmVzdWx0LCAuLi5yZXNwb25zZURhdGEgfTtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3BvbnNlRGF0YSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uOiAke3Rvb2xfbmFtZX0g4oaSICR7ZGVjaXNpb259ICgke2VsYXBzZWRNc31tcylgKTtcblxuICAgICAgLy8gVHJhY2sgZGVjaXNpb24gZm9yIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAgICAgIGRlY2lzaW9uVHJhY2tlci50cmFja0RlY2lzaW9uKHNlc3Npb25faWQsIHRvb2xfbmFtZSwgaW5wdXQgfHwge30sIHRyYWNrZWRSZXN1bHQsIHBsYXRmb3JtKTtcblxuICAgICAgcmVzLmpzb24ocmVzcG9uc2VEYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbiBlcnJvciAoJHtlbGFwc2VkTXN9bXMpOmAsIGVycik7XG4gICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3Blcm1pc3Npb25zL3N0YXR1c1xuICAgKiBSZXR1cm5zIGN1cnJlbnQgcGVybWlzc2lvbiBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICAgKiBmb3IgdGhlIGxpdmUgcGVybWlzc2lvbnMgZGFzaGJvYXJkLlxuICAgKi9cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL3N0YXR1cycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShyZXEuc29ja2V0LmxvY2FsUG9ydCk7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHR5cGVvZiByZXEucXVlcnlbJ3Nlc3Npb25JZCddID09PSAnc3RyaW5nJyAmJiByZXEucXVlcnlbJ3Nlc3Npb25JZCddXG4gICAgICAgID8gcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgb3BSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBvcFJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGdldCBwb2xpY2llcycgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rSG9zdCA9IHR5cGVvZiBkYXRhLmhvb2tIb3N0ID09PSAnc3RyaW5nJyA/IGRhdGEuaG9va0hvc3QgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob29rU3RhdHVzID0gaG9va0hvc3RcbiAgICAgICAgPyBhd2FpdCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhob29rSG9zdCwgeyBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KVxuICAgICAgICA6IGF3YWl0IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKChkYXRhLmVsZW1lbnRzIHx8IFtdKSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuXG4gICAgICBjb25zdCBkZW55UGF0dGVybnMgPSAoZGF0YS5jb21iaW5lZERlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gKGRhdGEuY29tYmluZWRBbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGNvbmZpcm1QYXR0ZXJucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGRlbnlPcGVyYXRpb25zID0gKGRhdGEuY29tYmluZWREZW55T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd09wZXJhdGlvbnMgPSAoZGF0YS5jb21iaW5lZEFsbG93T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjb25maXJtT3BlcmF0aW9ucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgICBjb25zdCBob29rU3RhcnR1cFJlcGFpciA9IGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5KCk7XG4gICAgICBjb25zdCBob29rSGVhbHRoSG9zdCA9IGhvb2tTdGF0dXMuaG9zdCA/PyBob29rSG9zdCA/PyAnbWFuYWdlZC1ob3N0JztcbiAgICAgIGNvbnN0IGhvb2tIZWFsdGggPSBzdW1tYXJpemVQZXJtaXNzaW9uSG9va0hlYWx0aCh7XG4gICAgICAgIGluc3RhbGxlZEhvc3RzOiBob29rU3RhdHVzLmluc3RhbGxlZCB8fCBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkID8gW2hvb2tIZWFsdGhIb3N0XSA6IFtdLFxuICAgICAgICBjdXJyZW50SG9zdHM6IGhvb2tTdGF0dXMuYXNzZXRzQ3VycmVudCA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgcmVwYWlyZWRIb3N0czogaG9va1N0YXR1cy5hdXRvUmVwYWlyZWQgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIG5lZWRzUmVwYWlySG9zdHM6IGhvb2tTdGF0dXMubmVlZHNSZXBhaXIgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIGxhc3RTdGFydHVwUmVwYWlyOiBob29rU3RhcnR1cFJlcGFpcixcbiAgICAgIH0pO1xuXG4gICAgICByZXMuanNvbih7XG4gICAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgICBhY3RpdmVFbGVtZW50Q291bnQ6IGRhdGEuYWN0aXZlRWxlbWVudENvdW50LFxuICAgICAgICBoYXNBbGxvd2xpc3Q6IGRhdGEuaGFzQWxsb3dsaXN0LFxuICAgICAgICBkZW55UGF0dGVybnMsXG4gICAgICAgIGFsbG93UGF0dGVybnMsXG4gICAgICAgIGNvbmZpcm1QYXR0ZXJucyxcbiAgICAgICAgZGVueU9wZXJhdGlvbnMsXG4gICAgICAgIGFsbG93T3BlcmF0aW9ucyxcbiAgICAgICAgY29uZmlybU9wZXJhdGlvbnMsXG4gICAgICAgIGRlbnlSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGRlbnlQYXR0ZXJucywgZGVueU9wZXJhdGlvbnMpLFxuICAgICAgICBhbGxvd1J1bGVzOiBtZXJnZVJ1bGVBcnJheXMoYWxsb3dQYXR0ZXJucywgYWxsb3dPcGVyYXRpb25zKSxcbiAgICAgICAgY29uZmlybVJ1bGVzOiBtZXJnZVJ1bGVBcnJheXMoY29uZmlybVBhdHRlcm5zLCBjb25maXJtT3BlcmF0aW9ucyksXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBrbm93blNlc3Npb25zOiBleHRyYWN0S25vd25Qb2xpY3lTZXNzaW9ucyhlbGVtZW50cyksXG4gICAgICAgIHBlcm1pc3Npb25Qcm9tcHRBY3RpdmU6IGRhdGEucGVybWlzc2lvblByb21wdEFjdGl2ZSxcbiAgICAgICAgaG9va0luc3RhbGxlZDogaG9va1N0YXR1cy5pbnN0YWxsZWQsXG4gICAgICAgIGhvb2tIb3N0OiBkYXRhLmhvb2tIb3N0LFxuICAgICAgICBob29rQXNzZXRzUHJlcGFyZWQ6IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQsXG4gICAgICAgIGhvb2tBc3NldHNDdXJyZW50OiBob29rU3RhdHVzLmFzc2V0c0N1cnJlbnQsXG4gICAgICAgIGhvb2tBdXRvUmVwYWlyZWQ6IGhvb2tTdGF0dXMuYXV0b1JlcGFpcmVkLFxuICAgICAgICBob29rTmVlZHNSZXBhaXI6IGhvb2tTdGF0dXMubmVlZHNSZXBhaXIsXG4gICAgICAgIGhvb2tSZXBhaXJFcnJvcjogaG9va1N0YXR1cy5yZXBhaXJFcnJvcixcbiAgICAgICAgaG9va0hlYWx0aCxcbiAgICAgICAgaG9va1N0YXJ0dXBSZXBhaXIsXG4gICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5U3RhdGUsXG4gICAgICAgIGF1dGhvcml0eVN1cHBvcnRlZEhvc3RzOiBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyxcbiAgICAgICAgYXV0aG9yaXR5U3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgIGF1dGhvcml0eUFpTXV0YWJsZTogZmFsc2UsXG4gICAgICAgIGVuZm9yY2VtZW50UmVhZHk6IGRhdGEuZW5mb3JjZW1lbnRSZWFkeSxcbiAgICAgICAgaW52YWxpZFBvbGljeUVsZW1lbnRDb3VudDogZGF0YS5pbnZhbGlkUG9saWN5RWxlbWVudENvdW50ID8/IDAsXG4gICAgICAgIGFkdmlzb3J5OiBkYXRhLmFkdmlzb3J5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnM6IGRlY2lzaW9uVHJhY2tlci5nZXRSZWNlbnREZWNpc2lvbnMoKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvc3RhdHVzIGVycm9yOicsIGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGdldCBwZXJtaXNzaW9uIHN0YXR1cycgfSk7XG4gICAgfVxuICB9KTtcblxuICByb3V0ZXIuZ2V0KCcvcGVybWlzc2lvbnMvYXV0aG9yaXR5JywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICByZXMuanNvbih7XG4gICAgICAgIC4uLmF1dGhvcml0eVN0YXRlLFxuICAgICAgICBzdXBwb3J0ZWRIb3N0czogaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMsXG4gICAgICAgIHN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICBhaU11dGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9hdXRob3JpdHkgZXJyb3I6JywgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gZ2V0IHBlcm1pc3Npb24gYXV0aG9yaXR5JyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJvdXRlci5wb3N0KCcvcGVybWlzc2lvbnMvYXV0aG9yaXR5JywgZXhwcmVzcy5qc29uKCksIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3N0ID0gbm9ybWFsaXplQXV0aG9yaXR5SG9zdChyZXEuYm9keT8uaG9zdCk7XG4gICAgICBjb25zdCBtb2RlID0gbm9ybWFsaXplQXV0aG9yaXR5TW9kZShyZXEuYm9keT8ubW9kZSk7XG4gICAgICBjb25zdCByZWFzb24gPSB0eXBlb2YgcmVxLmJvZHk/LnJlYXNvbiA9PT0gJ3N0cmluZycgJiYgcmVxLmJvZHkucmVhc29uLnRyaW0oKSAhPT0gJydcbiAgICAgICAgPyByZXEuYm9keS5yZWFzb24udHJpbSgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIWhvc3QgfHwgIW1vZGUpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgIGVycm9yOiAnaG9zdCBhbmQgbW9kZSBhcmUgcmVxdWlyZWQnLFxuICAgICAgICAgIHN1cHBvcnRlZEhvc3RzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFNdLFxuICAgICAgICAgIHN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgcG9saWNpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1vZGUgPT09ICdhdXRob3JpdGF0aXZlJykge1xuICAgICAgICBjb25zdCBwb2xpY3lSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2dldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzJyxcbiAgICAgICAgICBwYXJhbXM6IHsgcmVwb3J0aW5nX3Njb3BlOiAnZGFzaGJvYXJkJyB9LFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKCFwb2xpY3lSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6IHBvbGljeVJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIGVmZmVjdGl2ZSBwb2xpY2llcycgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9saWNpZXMgPSBwb2xpY3lSZXN1bHQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yaXR5U3RhdGUgPSBhd2FpdCBzZXRQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgaG9tZURpcjogYXV0aG9yaXR5SG9tZURpcixcbiAgICAgICAgcG9saWNpZXM6IG1vZGUgPT09ICdhdXRob3JpdGF0aXZlJ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgY29tYmluZWRBbGxvd1BhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZEFsbG93UGF0dGVybnMpLFxuICAgICAgICAgICAgY29tYmluZWRDb25maXJtUGF0dGVybnM6IGFzU3RyaW5nQXJyYXkocG9saWNpZXM/LmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zKSxcbiAgICAgICAgICAgIGNvbWJpbmVkRGVueVBhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZERlbnlQYXR0ZXJucyksXG4gICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgYXV0aG9yaXR5OiBhdXRob3JpdHlTdGF0ZSB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYFtXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9hdXRob3JpdHkgdXBkYXRlIGVycm9yIChob3N0PSR7U3RyaW5nKHJlcS5ib2R5Py5ob3N0ID8/ICcnKX0sIG1vZGU9JHtTdHJpbmcocmVxLmJvZHk/Lm1vZGUgPz8gJycpfSk6YCxcbiAgICAgICAgZXJyLFxuICAgICAgKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIHVwZGF0ZSBwZXJtaXNzaW9uIGF1dGhvcml0eScsXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBdXRob3JpdHlIb3N0KHZhbHVlOiB1bmtub3duKTogUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMuaW5jbHVkZXModmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QpXG4gICAgPyB2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXV0aG9yaXR5TW9kZSh2YWx1ZTogdW5rbm93bik6IFBlcm1pc3Npb25BdXRob3JpdHlNb2RlIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTLmluY2x1ZGVzKHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlKVxuICAgID8gdmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eU1vZGVcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykgOiBbXTtcbn1cbiJdfQ==
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlDQUF5QyxFQUN6QyxnQ0FBZ0MsRUFDaEMsNEJBQTRCLEVBQzVCLGdDQUFnQyxFQUNoQyw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUdMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBeUQ1QyxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUNqRCxNQUFNLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQztBQUNyRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQWFqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUUsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUc1RSwwRUFBMEU7QUFDMUUsU0FBUyxhQUFhLENBQUMsR0FBNEIsRUFB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QyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBIVFRQIHJvdXRlcyBhbmQgZGVjaXNpb24gdHJhY2tpbmcuXG4gKlxuICogUHJvdmlkZXM6XG4gKiAtIFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24g4oCUIGV2YWx1YXRlcyB0b29sIHBlcm1pc3Npb25zIHZpYSBNQ1AtQVFMXG4gKiAtIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzIOKAlCByZXR1cm5zIGN1cnJlbnQgcG9saWNpZXMgYW5kIHJlY2VudCBkZWNpc2lvbnNcbiAqIC0gRGVjaXNpb24gdHJhY2tpbmcgcmluZyBidWZmZXIgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB7IGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvZXZhbHVhdGVQZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IGVuc3VyZUxhdGVzdFBvcnRGaWxlIH0gZnJvbSAnLi4vcG9ydERpc2NvdmVyeS5qcyc7XG5pbXBvcnQge1xuICBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSxcbiAgZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgsXG4gIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMsXG4gIHJlYWRMYXN0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljLFxuICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0LFxuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG4gIHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uQXV0aG9yaXR5LmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBkZWNpc2lvbjogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIHRhcmdldExhYmVsPzogc3RyaW5nO1xuICBkZXRhaWxzPzogUGVybWlzc2lvbkRlY2lzaW9uRGV0YWlsW107XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWwge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufVxuXG50eXBlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleSA9XG4gIHwgJ2ZpbGVfcGF0aCdcbiAgfCAncGF0aCdcbiAgfCAndXJsJ1xuICB8ICdwYXR0ZXJuJ1xuICB8ICdxdWVyeSdcbiAgfCAnZWxlbWVudF9uYW1lJ1xuICB8ICdyZXF1ZXN0X2lkJztcblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbklucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBmaWxlX3BhdGg/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgcGF0dGVybj86IHN0cmluZztcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIGVsZW1lbnRfbmFtZT86IHN0cmluZztcbiAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldERlc2NyaXB0b3Ige1xuICBrZXk6IFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleTtcbiAgbGFiZWw6IHN0cmluZztcbiAgbW9ub3NwYWNlPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEtub3duUG9saWN5U2Vzc2lvbiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2U6ICdwb2xpY3knO1xufVxuXG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfUkVRVUVTVFMgPSAxMjA7XG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TID0gNjBfMDAwO1xuY29uc3QgREVDSVNJT05fQlVGRkVSX1NJWkUgPSAyMDA7XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyIHtcbiAgdHJhY2tEZWNpc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHZvaWQ7XG4gIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXTtcbn1cblxuY29uc3QgQ0xBVURFX0NPTVBBVElCTEVfSE9PS19QTEFURk9STVMgPSBuZXcgU2V0KFsnY2xhdWRlX2NvZGUnLCAndnNjb2RlJ10pO1xuY29uc3QgTk9STUFMSVpBQkxFX1BFUk1JU1NJT05fREVDSVNJT05TID0gbmV3IFNldChbJ2FsbG93JywgJ2RlbnknLCAnYXNrJ10pO1xudHlwZSBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24gPSAnYWxsb3cnIHwgJ2RlbnknIHwgJ2Fzayc7XG5cbi8qKiBFeHRyYWN0IGEgc3RyaW5nIGZpZWxkIGZyb20gYSByZWNvcmQsIHRyeWluZyBtdWx0aXBsZSBrZXlzIGluIG9yZGVyICovXG5mdW5jdGlvbiBleHRyYWN0U3RyaW5nKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleXM6IHN0cmluZ1tdLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbCA9IG9iaj8uW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY2lzaW9uKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBjb25zdCBuZXN0ZWQgPSByZXN1bHQuaG9va1NwZWNpZmljT3V0cHV0O1xuICBpZiAobmVzdGVkICYmIHR5cGVvZiBuZXN0ZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG5lc3RlZCkpIHtcbiAgICBjb25zdCBuZXN0ZWREZWNpc2lvbiA9IChuZXN0ZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBlcm1pc3Npb25EZWNpc2lvbjtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERlY2lzaW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZERlY2lzaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQucGVybWlzc2lvbiA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQucGVybWlzc2lvbjtcbiAgaWYgKHR5cGVvZiByZXN1bHQuZGVjaXNpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LmRlY2lzaW9uO1xuICBpZiAodHlwZW9mIHJlc3VsdC5iZWhhdmlvciA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQuYmVoYXZpb3I7XG4gIGlmICh0eXBlb2YgcmVzdWx0LmFsbG93ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJlc3VsdC5hbGxvd2VkID8gJ2FsbG93JyA6ICdkZW55JztcbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlYXNvbihyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkUmVhc29uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uUmVhc29uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkUmVhc29uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZFJlYXNvbjtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBDTEFVREVfQ09NUEFUSUJMRV9IT09LX1BMQVRGT1JNUy5oYXMocGxhdGZvcm0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IHN0cmluZyxcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm0pKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZCA9IHJlc3VsdC5ob29rU3BlY2lmaWNPdXRwdXQ7XG4gIGlmIChuZXN0ZWQgJiYgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobmVzdGVkKSkge1xuICAgIGNvbnN0IG5lc3RlZERlY2lzaW9uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGVjaXNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3VsdCk7XG4gIGlmIChOT1JNQUxJWkFCTEVfUEVSTUlTU0lPTl9ERUNJU0lPTlMuaGFzKGRlY2lzaW9uKSkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICBkZWNpc2lvbiBhcyBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24sXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGlucHV0LFxuICAgICAgZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVjaXNpb25EZXRhaWxzKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQsXG4gIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBsYXRmb3JtOiBzdHJpbmcsXG4pOiB7IHRhcmdldD86IHN0cmluZzsgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7IGRldGFpbHM6IFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbFtdIH0ge1xuICBjb25zdCBkZXRhaWxzOiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXSA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUGxhdGZvcm0nLCB2YWx1ZTogcGxhdGZvcm0sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiBpbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21tYW5kICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnQ29tbWFuZCcsIHZhbHVlOiBpbnB1dC5jb21tYW5kLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0YXJnZXREZXNjcmlwdG9yczogUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0RGVzY3JpcHRvcltdID0gW1xuICAgIHsga2V5OiAnZmlsZV9wYXRoJywgbGFiZWw6ICdGaWxlJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdwYXRoJywgbGFiZWw6ICdQYXRoJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICd1cmwnLCBsYWJlbDogJ1VSTCcgfSxcbiAgICB7IGtleTogJ3BhdHRlcm4nLCBsYWJlbDogJ1BhdHRlcm4nLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3F1ZXJ5JywgbGFiZWw6ICdRdWVyeScgfSxcbiAgICB7IGtleTogJ2VsZW1lbnRfbmFtZScsIGxhYmVsOiAnRWxlbWVudCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAncmVxdWVzdF9pZCcsIGxhYmVsOiAnUmVxdWVzdCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGxldCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcmdldExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRhcmdldERlc2NyaXB0b3JzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtkZXNjcmlwdG9yLmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB2YWx1ZTtcbiAgICB0YXJnZXRMYWJlbCA9IGRlc2NyaXB0b3IubGFiZWw7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6IGRlc2NyaXB0b3IubGFiZWwsIHZhbHVlLCBtb25vc3BhY2U6IGRlc2NyaXB0b3IubW9ub3NwYWNlIH0pO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFBhdHRlcm4gPSBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydtYXRjaGVkX3BhdHRlcm4nLCAnbWF0Y2hlZFBhdHRlcm4nXSwgJycpO1xuICBpZiAobWF0Y2hlZFBhdHRlcm4gIT09ICcnKSB7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6ICdNYXRjaGVkIFBhdHRlcm4nLCB2YWx1ZTogbWF0Y2hlZFBhdHRlcm4sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBvbGljeVNvdXJjZSA9IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ3BvbGljeV9zb3VyY2UnLCAncG9saWN5U291cmNlJ10sICcnKTtcbiAgaWYgKHBvbGljeVNvdXJjZSAhPT0gJycpIHtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogJ1BvbGljeSBTb3VyY2UnLCB2YWx1ZTogcG9saWN5U291cmNlLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4geyB0YXJnZXQsIHRhcmdldExhYmVsLCBkZXRhaWxzIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoYnVmZmVyU2l6ZSA9IERFQ0lTSU9OX0JVRkZFUl9TSVpFKTogUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlciB7XG4gIGNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbiAgbGV0IGRlY2lzaW9uQ291bnRlciA9IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja0RlY2lzaW9uKFxuICAgICAgc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgICAgaW5wdXQ6IFBlcm1pc3Npb25EZWNpc2lvbklucHV0LFxuICAgICAgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBkZXRhaWxTdGF0ZSA9IGJ1aWxkRGVjaXNpb25EZXRhaWxzKHRvb2xOYW1lLCBpbnB1dCwgcmVzdWx0LCBwbGF0Zm9ybSk7XG4gICAgICBjb25zdCBlbnRyeTogUGVybWlzc2lvbkRlY2lzaW9uID0ge1xuICAgICAgICBpZDogYGQtJHsrK2RlY2lzaW9uQ291bnRlcn1gLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2lzaW9uOiBleHRyYWN0RGVjaXNpb24ocmVzdWx0KSxcbiAgICAgICAgcmVhc29uOiBleHRyYWN0UmVhc29uKHJlc3VsdCksXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICB0YXJnZXQ6IGRldGFpbFN0YXRlLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0TGFiZWw6IGRldGFpbFN0YXRlLnRhcmdldExhYmVsLFxuICAgICAgICBkZXRhaWxzOiBkZXRhaWxTdGF0ZS5kZXRhaWxzLFxuICAgICAgfTtcbiAgICAgIHJlY2VudERlY2lzaW9ucy51bnNoaWZ0KGVudHJ5KTtcbiAgICAgIGlmIChyZWNlbnREZWNpc2lvbnMubGVuZ3RoID4gYnVmZmVyU2l6ZSkge1xuICAgICAgICByZWNlbnREZWNpc2lvbnMubGVuZ3RoID0gYnVmZmVyU2l6ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXSB7XG4gICAgICByZXR1cm4gcmVjZW50RGVjaXNpb25zO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUFycmF5cyguLi5zb3VyY2VzOiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1lcmdlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyAmJiBlbnRyeSAhPT0gJycpIHtcbiAgICAgICAgbWVyZ2VkLmFkZChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiAoe1xuICAgIC4uLmVsZW1lbnQsXG4gICAgZWxlbWVudF9uYW1lOiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudCksXG4gICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuYWxsb3dQYXR0ZXJucywgZWxlbWVudC5hbGxvd09wZXJhdGlvbnMpLFxuICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuY29uZmlybVBhdHRlcm5zLCBlbGVtZW50LmNvbmZpcm1PcGVyYXRpb25zKSxcbiAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmRlbnlQYXR0ZXJucywgZWxlbWVudC5kZW55T3BlcmF0aW9ucyksXG4gICAgaW52YWxpZEdhdGVrZWVwZXJQb2xpY3k6ICEhZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlclBvbGljeSxcbiAgICBpbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2U6IHR5cGVvZiBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA6IHVuZGVmaW5lZCxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVsZW1lbnQuZWxlbWVudF9uYW1lID09PSAnc3RyaW5nJykgcmV0dXJuIGVsZW1lbnQuZWxlbWVudF9uYW1lO1xuICBpZiAodHlwZW9mIGVsZW1lbnQubmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50Lm5hbWU7XG4gIHJldHVybiAnJztcbn1cblxuLyoqIEhlbHBlciB0byBleHRyYWN0IHNpbmdsZSByZXN1bHQgZnJvbSBNQ1AtQVFMIGJhdGNoIHJlc3BvbnNlICovXG5mdW5jdGlvbiBhc1NpbmdsZVJlc3VsdChyZXN1bHRzOiB1bmtub3duKTogeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0c1swXSB8fCB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VtcHR5IHJlc3VsdCcgfTtcbiAgcmV0dXJuIHJlc3VsdHMgYXMgeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEtub3duUG9saWN5U2Vzc2lvbltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBrbm93blNlc3Npb25zOiBLbm93blBvbGljeVNlc3Npb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IHNlc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuc2Vzc2lvbklkcykgPyBlbGVtZW50LnNlc3Npb25JZHMgOiBbXTtcbiAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBzZXNzaW9uSWRzKSB7XG4gICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCAhPT0gJ3N0cmluZycgfHwgc2Vzc2lvbklkID09PSAnJyB8fCBzZWVuLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuLmFkZChzZXNzaW9uSWQpO1xuICAgICAga25vd25TZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6ICdwb2xpY3knLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtub3duU2Vzc2lvbnMuc29ydCgoYSwgYikgPT4gYS5zZXNzaW9uSWQubG9jYWxlQ29tcGFyZShiLnNlc3Npb25JZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZUxhdGVzdFBvcnRGaWxlKHBvcnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tXZWJVSS9HYXRld2F5XSBDb3VsZCBub3QgcmVmcmVzaCBwZXJtaXNzaW9uLXNlcnZlci5wb3J0Jywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgaG9tZURpcjogc3RyaW5nLFxuICBhdXRob3JpdHlTdGF0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlPj4sXG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzOiBib29sZWFuLFxuKTogUHJvbWlzZTxQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFtdPiB7XG4gIGNvbnN0IGluc3RhbGxlZFN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMubWFwKGFzeW5jIChob3N0KSA9PiAoe1xuICAgICAgaG9zdCxcbiAgICAgIHN0YXR1czogYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwgeyBob21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFsbGVkSG9zdHMgPSBpbnN0YWxsZWRTdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5pbnN0YWxsZWQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuXG4gIGNvbnN0IHBlcnNpc3RlZEhvc3RzID0gT2JqZWN0LmtleXMoYXV0aG9yaXR5U3RhdGUuaG9zdHMgfHwge30pLmZpbHRlcigoaG9zdCk6IGhvc3QgaXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgPT5cbiAgICAoUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGhvc3QpLFxuICApO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaW5zdGFsbGVkSG9zdHMuY29uY2F0KHBlcnNpc3RlZEhvc3RzKSkpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHBlcm1pc3Npb24tcmVsYXRlZCByb3V0ZXMgb24gYSBnYXRld2F5IHJvdXRlci5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIE1DUC1BUUwgaGFuZGxlciBmb3IgcG9saWN5IGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzT3B0aW9ucyB7XG4gIGhvbWVEaXI/OiBzdHJpbmc7XG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhcbiAgcm91dGVyOiBSb3V0ZXIsXG4gIGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIsXG4gIG9wdGlvbnM6IFJlZ2lzdGVyUGVybWlzc2lvblJvdXRlc09wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBhdXRob3JpdHlIb21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKTtcbiAgY29uc3QgYXV0b1JlcGFpckhvb2tBc3NldHMgPSBvcHRpb25zLmF1dG9SZXBhaXJIb29rQXNzZXRzID8/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCc7XG4gIGNvbnN0IGRlY2lzaW9uVHJhY2tlciA9IGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9ldmFsdWF0ZV9wZXJtaXNzaW9uXG4gICAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBlbmRwb2ludCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAgICogUm91dGVzIHRocm91Z2ggZXZhbHVhdGVfcGVybWlzc2lvbiBNQ1AtQVFMIFJFQUQgb3BlcmF0aW9uLlxuICAgKiBGYWlsLW9wZW46IHJldHVybnMgYWxsb3cgb24gYW55IGVycm9yIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3QgcGVybWlzc2lvbkxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFxuICAgIFBFUk1JU1NJT05fUk9VVEVfUkFURV9MSU1JVF9SRVFVRVNUUyxcbiAgICBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TLFxuICApO1xuICByb3V0ZXIucG9zdCgnL2V2YWx1YXRlX3Blcm1pc3Npb24nLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgYXdhaXQgc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocmVxLnNvY2tldC5sb2NhbFBvcnQpO1xuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IGFzIHtcbiAgICAgIHRvb2xfbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0PzogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQ7XG4gICAgICBwbGF0Zm9ybT86IHN0cmluZztcbiAgICAgIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6ICdjbGF1ZGVfY29kZSc7XG5cbiAgICBpZiAoIXBlcm1pc3Npb25MaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZXNzaW9uX2lkID0gdHlwZW9mIGJvZHkuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBib2R5LnNlc3Npb25faWQubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbnB1dCA9IGJvZHkuaW5wdXQ7XG5cbiAgICBpZiAoIXRvb2xfbmFtZSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCB8fCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gYmFkIGlucHV0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZXZhbHVhdGVfcGVybWlzc2lvbicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHRvb2xfbmFtZSxcbiAgICAgICAgICBpbnB1dDogaW5wdXQgfHwge30sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgLi4uKHNlc3Npb25faWQgPyB7IHNlc3Npb25faWQgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoIW9wUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uIGZhaWxlZCAoJHtlbGFwc2VkTXN9bXMpOiAke29wUmVzdWx0LmVycm9yfWApO1xuICAgICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGlucHV0IHx8IHt9LFxuICAgICAgICByYXdSZXN1bHQsXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhY2tlZFJlc3VsdCA9IHsgLi4ucmF3UmVzdWx0LCAuLi5yZXNwb25zZURhdGEgfTtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3BvbnNlRGF0YSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uOiAke3Rvb2xfbmFtZX0g4oaSICR7ZGVjaXNpb259ICgke2VsYXBzZWRNc31tcylgKTtcblxuICAgICAgLy8gVHJhY2sgZGVjaXNpb24gZm9yIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAgICAgIGRlY2lzaW9uVHJhY2tlci50cmFja0RlY2lzaW9uKHNlc3Npb25faWQsIHRvb2xfbmFtZSwgaW5wdXQgfHwge30sIHRyYWNrZWRSZXN1bHQsIHBsYXRmb3JtKTtcblxuICAgICAgcmVzLmpzb24ocmVzcG9uc2VEYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbiBlcnJvciAoJHtlbGFwc2VkTXN9bXMpOmAsIGVycik7XG4gICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3Blcm1pc3Npb25zL3N0YXR1c1xuICAgKiBSZXR1cm5zIGN1cnJlbnQgcGVybWlzc2lvbiBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICAgKiBmb3IgdGhlIGxpdmUgcGVybWlzc2lvbnMgZGFzaGJvYXJkLlxuICAgKi9cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL3N0YXR1cycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShyZXEuc29ja2V0LmxvY2FsUG9ydCk7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHR5cGVvZiByZXEucXVlcnlbJ3Nlc3Npb25JZCddID09PSAnc3RyaW5nJyAmJiByZXEucXVlcnlbJ3Nlc3Npb25JZCddXG4gICAgICAgID8gcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgb3BSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBvcFJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGdldCBwb2xpY2llcycgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rSG9zdCA9IHR5cGVvZiBkYXRhLmhvb2tIb3N0ID09PSAnc3RyaW5nJyA/IGRhdGEuaG9va0hvc3QgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob29rU3RhdHVzID0gaG9va0hvc3RcbiAgICAgICAgPyBhd2FpdCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhob29rSG9zdCwgeyBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KVxuICAgICAgICA6IGF3YWl0IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKChkYXRhLmVsZW1lbnRzIHx8IFtdKSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuXG4gICAgICBjb25zdCBkZW55UGF0dGVybnMgPSAoZGF0YS5jb21iaW5lZERlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gKGRhdGEuY29tYmluZWRBbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGNvbmZpcm1QYXR0ZXJucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGRlbnlPcGVyYXRpb25zID0gKGRhdGEuY29tYmluZWREZW55T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd09wZXJhdGlvbnMgPSAoZGF0YS5jb21iaW5lZEFsbG93T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjb25maXJtT3BlcmF0aW9ucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgICBjb25zdCBob29rU3RhcnR1cFJlcGFpciA9IGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5KCk7XG4gICAgICBjb25zdCBob29rRGlhZ25vc3RpY3NQYXRoID0gZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBob29rTGFzdERpYWdub3N0aWMgPSBhd2FpdCByZWFkTGFzdFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpYyhhdXRob3JpdHlIb21lRGlyKTtcbiAgICAgIGNvbnN0IGhvb2tIZWFsdGhIb3N0ID0gaG9va1N0YXR1cy5ob3N0ID8/IGhvb2tIb3N0ID8/ICdtYW5hZ2VkLWhvc3QnO1xuICAgICAgY29uc3QgaG9va0hlYWx0aCA9IHN1bW1hcml6ZVBlcm1pc3Npb25Ib29rSGVhbHRoKHtcbiAgICAgICAgaW5zdGFsbGVkSG9zdHM6IGhvb2tTdGF0dXMuaW5zdGFsbGVkIHx8IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIGN1cnJlbnRIb3N0czogaG9va1N0YXR1cy5hc3NldHNDdXJyZW50ID8gW2hvb2tIZWFsdGhIb3N0XSA6IFtdLFxuICAgICAgICByZXBhaXJlZEhvc3RzOiBob29rU3RhdHVzLmF1dG9SZXBhaXJlZCA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgbmVlZHNSZXBhaXJIb3N0czogaG9va1N0YXR1cy5uZWVkc1JlcGFpciA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgZGlhZ25vc3RpY3NQYXRoOiBob29rRGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICBsYXN0RGlhZ25vc3RpYzogaG9va0xhc3REaWFnbm9zdGljLFxuICAgICAgICBsYXN0U3RhcnR1cFJlcGFpcjogaG9va1N0YXJ0dXBSZXBhaXIsXG4gICAgICB9KTtcblxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICAuLi4oc2Vzc2lvbklkID8geyBzZXNzaW9uSWQgfSA6IHt9KSxcbiAgICAgICAgYWN0aXZlRWxlbWVudENvdW50OiBkYXRhLmFjdGl2ZUVsZW1lbnRDb3VudCxcbiAgICAgICAgaGFzQWxsb3dsaXN0OiBkYXRhLmhhc0FsbG93bGlzdCxcbiAgICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgICBhbGxvd1BhdHRlcm5zLFxuICAgICAgICBjb25maXJtUGF0dGVybnMsXG4gICAgICAgIGRlbnlPcGVyYXRpb25zLFxuICAgICAgICBhbGxvd09wZXJhdGlvbnMsXG4gICAgICAgIGNvbmZpcm1PcGVyYXRpb25zLFxuICAgICAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhkZW55UGF0dGVybnMsIGRlbnlPcGVyYXRpb25zKSxcbiAgICAgICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGFsbG93UGF0dGVybnMsIGFsbG93T3BlcmF0aW9ucyksXG4gICAgICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGNvbmZpcm1QYXR0ZXJucywgY29uZmlybU9wZXJhdGlvbnMpLFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAga25vd25TZXNzaW9uczogZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHMpLFxuICAgICAgICBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlOiBkYXRhLnBlcm1pc3Npb25Qcm9tcHRBY3RpdmUsXG4gICAgICAgIGhvb2tJbnN0YWxsZWQ6IGhvb2tTdGF0dXMuaW5zdGFsbGVkLFxuICAgICAgICBob29rSG9zdDogZGF0YS5ob29rSG9zdCxcbiAgICAgICAgaG9va0Fzc2V0c1ByZXBhcmVkOiBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkLFxuICAgICAgICBob29rQXNzZXRzQ3VycmVudDogaG9va1N0YXR1cy5hc3NldHNDdXJyZW50LFxuICAgICAgICBob29rQXV0b1JlcGFpcmVkOiBob29rU3RhdHVzLmF1dG9SZXBhaXJlZCxcbiAgICAgICAgaG9va05lZWRzUmVwYWlyOiBob29rU3RhdHVzLm5lZWRzUmVwYWlyLFxuICAgICAgICBob29rUmVwYWlyRXJyb3I6IGhvb2tTdGF0dXMucmVwYWlyRXJyb3IsXG4gICAgICAgIGhvb2tIZWFsdGgsXG4gICAgICAgIGhvb2tTdGFydHVwUmVwYWlyLFxuICAgICAgICBob29rRGlhZ25vc3RpY3M6IHtcbiAgICAgICAgICBsb2dQYXRoOiBob29rRGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICAgIGxhc3RFdmVudDogaG9va0xhc3REaWFnbm9zdGljLFxuICAgICAgICB9LFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRob3JpdHlTdXBwb3J0ZWRIb3N0czogaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMsXG4gICAgICAgIGF1dGhvcml0eVN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICBhdXRob3JpdHlBaU11dGFibGU6IGZhbHNlLFxuICAgICAgICBlbmZvcmNlbWVudFJlYWR5OiBkYXRhLmVuZm9yY2VtZW50UmVhZHksXG4gICAgICAgIGludmFsaWRQb2xpY3lFbGVtZW50Q291bnQ6IGRhdGEuaW52YWxpZFBvbGljeUVsZW1lbnRDb3VudCA/PyAwLFxuICAgICAgICBhZHZpc29yeTogZGF0YS5hZHZpc29yeSxcbiAgICAgICAgcmVjZW50RGVjaXNpb25zOiBkZWNpc2lvblRyYWNrZXIuZ2V0UmVjZW50RGVjaXNpb25zKCksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL3N0YXR1cyBlcnJvcjonLCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBzdGF0dXMnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL2F1dGhvcml0eScsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXV0aG9yaXR5U3RhdGUgPSBhd2FpdCByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlKGF1dGhvcml0eUhvbWVEaXIpO1xuICAgICAgY29uc3QgaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkUGVybWlzc2lvbkF1dGhvcml0eUhvc3RzKFxuICAgICAgICBhdXRob3JpdHlIb21lRGlyLFxuICAgICAgICBhdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgYXV0b1JlcGFpckhvb2tBc3NldHMsXG4gICAgICApO1xuICAgICAgcmVzLmpzb24oe1xuICAgICAgICAuLi5hdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgc3VwcG9ydGVkSG9zdHM6IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzLFxuICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgYWlNdXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvYXV0aG9yaXR5IGVycm9yOicsIGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGdldCBwZXJtaXNzaW9uIGF1dGhvcml0eScgfSk7XG4gICAgfVxuICB9KTtcblxuICByb3V0ZXIucG9zdCgnL3Blcm1pc3Npb25zL2F1dGhvcml0eScsIGV4cHJlc3MuanNvbigpLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaG9zdCA9IG5vcm1hbGl6ZUF1dGhvcml0eUhvc3QocmVxLmJvZHk/Lmhvc3QpO1xuICAgICAgY29uc3QgbW9kZSA9IG5vcm1hbGl6ZUF1dGhvcml0eU1vZGUocmVxLmJvZHk/Lm1vZGUpO1xuICAgICAgY29uc3QgcmVhc29uID0gdHlwZW9mIHJlcS5ib2R5Py5yZWFzb24gPT09ICdzdHJpbmcnICYmIHJlcS5ib2R5LnJlYXNvbi50cmltKCkgIT09ICcnXG4gICAgICAgID8gcmVxLmJvZHkucmVhc29uLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCFob3N0IHx8ICFtb2RlKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogJ2hvc3QgYW5kIG1vZGUgYXJlIHJlcXVpcmVkJyxcbiAgICAgICAgICBzdXBwb3J0ZWRIb3N0czogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTXSxcbiAgICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHBvbGljaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtb2RlID09PSAnYXV0aG9yaXRhdGl2ZScpIHtcbiAgICAgICAgY29uc3QgcG9saWN5UmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgICAgcGFyYW1zOiB7IHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcgfSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmICghcG9saWN5UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBwb2xpY3lSZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBlZmZlY3RpdmUgcG9saWNpZXMnIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvbGljaWVzID0gcG9saWN5UmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhvcml0eVN0YXRlID0gYXdhaXQgc2V0UGVybWlzc2lvbkF1dGhvcml0eU1vZGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBtb2RlLFxuICAgICAgICByZWFzb24sXG4gICAgICAgIGhvbWVEaXI6IGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIHBvbGljaWVzOiBtb2RlID09PSAnYXV0aG9yaXRhdGl2ZSdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGNvbWJpbmVkQWxsb3dQYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWRBbGxvd1BhdHRlcm5zKSxcbiAgICAgICAgICAgIGNvbWJpbmVkQ29uZmlybVBhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZENvbmZpcm1QYXR0ZXJucyksXG4gICAgICAgICAgICBjb21iaW5lZERlbnlQYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWREZW55UGF0dGVybnMpLFxuICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIGF1dGhvcml0eTogYXV0aG9yaXR5U3RhdGUgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvYXV0aG9yaXR5IHVwZGF0ZSBlcnJvciAoaG9zdD0ke1N0cmluZyhyZXEuYm9keT8uaG9zdCA/PyAnJyl9LCBtb2RlPSR7U3RyaW5nKHJlcS5ib2R5Py5tb2RlID8/ICcnKX0pOmAsXG4gICAgICAgIGVycixcbiAgICAgICk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byB1cGRhdGUgcGVybWlzc2lvbiBhdXRob3JpdHknLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXV0aG9yaXR5SG9zdCh2YWx1ZTogdW5rbm93bik6IFBlcm1pc3Npb25BdXRob3JpdHlIb3N0IHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTLmluY2x1ZGVzKHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0KVxuICAgID8gdmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3RcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGhvcml0eU1vZGUodmFsdWU6IHVua25vd24pOiBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBQRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFUy5pbmNsdWRlcyh2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSlcbiAgICA/IHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIDogW107XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dollhousemcp/mcp-server",
3
- "version": "2.0.30",
3
+ "version": "2.0.31",
4
4
  "description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,6 +25,23 @@ PORT_FILE="$RUN_DIR/permission-server.port"
25
25
  AUTHORITY_FILE="$RUN_DIR/permission-authority.json"
26
26
  HOOK_PLATFORM="${DOLLHOUSE_HOOK_PLATFORM:-claude_code}"
27
27
  permission_hook_load_runtime_config
28
+ DIAGNOSTICS_LOG="${DOLLHOUSE_HOOK_DIAGNOSTICS_LOG:-$RUN_DIR/permission-hook-diagnostics.jsonl}"
29
+ INVOCATION_ID="$(date +%s)-$$-${RANDOM:-0}"
30
+
31
+ INPUT=""
32
+ TOOL_NAME=""
33
+ TOOL_INPUT=""
34
+ AUTHORITY_HOST=""
35
+ AUTHORITY_MODE=""
36
+ PAYLOAD=""
37
+ RESPONSE=""
38
+ NORMALIZED_RESPONSE=""
39
+ EMITTED_RESPONSE=""
40
+ PORT=""
41
+ ENDPOINT=""
42
+ LAST_ATTEMPT="0"
43
+ LAST_CURL_EXIT=""
44
+ CURRENT_TIMEOUT="$INITIAL_TIMEOUT"
28
45
 
29
46
  # Debug logging helper — writes to stderr so it doesn't pollute stdout
30
47
  debug() {
@@ -34,22 +51,110 @@ debug() {
34
51
  return 0
35
52
  }
36
53
 
37
- emit_allow_response() {
54
+ append_diagnostic_record() {
55
+ local event="$1"
56
+ local stage="$2"
57
+ local outcome="${3:-}"
58
+ local reason="${4:-}"
59
+ local diagnostic_json
60
+
61
+ mkdir -p "$(dirname "$DIAGNOSTICS_LOG")" 2>/dev/null || return 0
62
+
63
+ diagnostic_json=$(
64
+ jq -cn \
65
+ --arg timestamp "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
66
+ --arg invocationId "$INVOCATION_ID" \
67
+ --arg event "$event" \
68
+ --arg platform "$HOOK_PLATFORM" \
69
+ --arg stage "$stage" \
70
+ --arg outcome "$outcome" \
71
+ --arg reason "$reason" \
72
+ --arg hookPath "$0" \
73
+ --arg diagnosticsLogPath "$DIAGNOSTICS_LOG" \
74
+ --arg sessionId "${DOLLHOUSE_SESSION_ID:-}" \
75
+ --arg toolName "${TOOL_NAME:-}" \
76
+ --arg toolInput "${TOOL_INPUT:-}" \
77
+ --arg rawInput "${INPUT:-}" \
78
+ --arg authorityHost "${AUTHORITY_HOST:-}" \
79
+ --arg authorityMode "${AUTHORITY_MODE:-}" \
80
+ --arg endpoint "${ENDPOINT:-}" \
81
+ --arg port "${PORT:-}" \
82
+ --arg payload "${PAYLOAD:-}" \
83
+ --arg response "${RESPONSE:-}" \
84
+ --arg normalizedResponse "${NORMALIZED_RESPONSE:-}" \
85
+ --arg emittedResponse "${EMITTED_RESPONSE:-}" \
86
+ --arg attempt "${LAST_ATTEMPT:-}" \
87
+ --arg maxRetries "${MAX_RETRIES:-}" \
88
+ --arg timeoutSeconds "${CURRENT_TIMEOUT:-}" \
89
+ --arg curlExit "${LAST_CURL_EXIT:-}" \
90
+ --argjson rawInputLength "${#INPUT}" \
91
+ --argjson normalizedResponseLength "${#NORMALIZED_RESPONSE}" \
92
+ --argjson emittedResponseLength "${#EMITTED_RESPONSE}" \
93
+ --argjson responseLength "${#RESPONSE}" \
94
+ '{
95
+ timestamp: $timestamp,
96
+ invocationId: $invocationId,
97
+ event: $event,
98
+ platform: $platform,
99
+ stage: $stage,
100
+ rawInputLength: $rawInputLength,
101
+ normalizedResponseLength: $normalizedResponseLength,
102
+ emittedResponseLength: $emittedResponseLength,
103
+ responseLength: $responseLength
104
+ }
105
+ + (if $outcome != "" then { outcome: $outcome } else {} end)
106
+ + (if $reason != "" then { reason: $reason } else {} end)
107
+ + (if $hookPath != "" then { hookPath: $hookPath } else {} end)
108
+ + (if $diagnosticsLogPath != "" then { diagnosticsLogPath: $diagnosticsLogPath } else {} end)
109
+ + (if $sessionId != "" then { sessionId: $sessionId } else {} end)
110
+ + (if $toolName != "" then { toolName: $toolName } else {} end)
111
+ + (if $toolInput != "" then { toolInput: $toolInput } else {} end)
112
+ + (if $rawInput != "" then { rawInput: $rawInput } else {} end)
113
+ + (if $authorityHost != "" then { authorityHost: $authorityHost } else {} end)
114
+ + (if $authorityMode != "" then { authorityMode: $authorityMode } else {} end)
115
+ + (if $endpoint != "" then { endpoint: $endpoint } else {} end)
116
+ + (if $port != "" then { port: $port } else {} end)
117
+ + (if $payload != "" then { payload: $payload } else {} end)
118
+ + (if $response != "" then { response: $response } else {} end)
119
+ + (if $normalizedResponse != "" then { normalizedResponse: $normalizedResponse } else {} end)
120
+ + (if $emittedResponse != "" then { emittedResponse: $emittedResponse } else {} end)
121
+ + (if $attempt != "" then { attempt: $attempt } else {} end)
122
+ + (if $maxRetries != "" then { maxRetries: $maxRetries } else {} end)
123
+ + (if $timeoutSeconds != "" then { timeoutSeconds: $timeoutSeconds } else {} end)
124
+ + (if $curlExit != "" then { curlExit: $curlExit } else {} end)'
125
+ ) || return 0
126
+
127
+ printf '%s\n' "$diagnostic_json" >> "$DIAGNOSTICS_LOG" 2>/dev/null || true
128
+ return 0
129
+ }
130
+
131
+ emit_response() {
132
+ local response="$1"
133
+
134
+ EMITTED_RESPONSE="$response"
135
+ if [[ -n "$response" ]]; then
136
+ printf '%s\n' "$response"
137
+ fi
138
+
139
+ return 0
140
+ }
141
+
142
+ build_allow_response() {
38
143
  case "$HOOK_PLATFORM" in
39
144
  claude_code|vscode)
40
- printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
145
+ printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
41
146
  ;;
42
147
  codex)
43
- printf '%s\n' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow","permissionDecisionReason":""}}'
148
+ printf '%s' ''
44
149
  ;;
45
150
  cursor)
46
- printf '%s\n' '{"permission":"allow"}'
151
+ printf '%s' '{"permission":"allow"}'
47
152
  ;;
48
153
  gemini)
49
- printf '%s\n' '{"decision":"allow"}'
154
+ printf '%s' '{"decision":"allow"}'
50
155
  ;;
51
156
  *)
52
- printf '%s\n' '{}'
157
+ printf '%s' '{}'
53
158
  ;;
54
159
  esac
55
160
 
@@ -57,9 +162,12 @@ emit_allow_response() {
57
162
  }
58
163
 
59
164
  fail_open() {
60
- local message="$1"
165
+ local stage="$1"
166
+ local message="$2"
61
167
  debug "$message"
62
- emit_allow_response
168
+ EMITTED_RESPONSE=$(build_allow_response)
169
+ append_diagnostic_record "complete" "$stage" "fail_open" "$message"
170
+ emit_response "$EMITTED_RESPONSE"
63
171
  return 0
64
172
  }
65
173
 
@@ -147,29 +255,28 @@ normalize_response() {
147
255
  codex)
148
256
  echo "$response" | jq -c '
149
257
  if type == "object" and (keys | length) == 0 then
258
+ empty
259
+ elif (.hookSpecificOutput.permissionDecision? | type) == "string" and .hookSpecificOutput.permissionDecision == "deny" then
150
260
  {
151
261
  hookSpecificOutput: {
152
262
  hookEventName: "PreToolUse",
153
- permissionDecision: "allow",
154
- permissionDecisionReason: ""
155
- }
156
- }
157
- elif (.hookSpecificOutput.permissionDecision? | type) == "string" then
158
- {
159
- hookSpecificOutput: {
160
- hookEventName: "PreToolUse",
161
- permissionDecision: (if .hookSpecificOutput.permissionDecision == "allow" then "allow" else "deny" end),
263
+ permissionDecision: "deny",
162
264
  permissionDecisionReason: (.hookSpecificOutput.permissionDecisionReason // .hookSpecificOutput.reason // .reason // .message // "")
163
265
  }
164
266
  }
267
+ elif (.hookSpecificOutput.permissionDecision? | type) == "string" then
268
+ empty
165
269
  elif (.decision? | type) == "string" and (.decision | IN("allow", "deny", "ask")) then
166
- {
167
- hookSpecificOutput: {
168
- hookEventName: "PreToolUse",
169
- permissionDecision: (if .decision == "allow" then "allow" else "deny" end),
170
- permissionDecisionReason: (.reason // .message // "")
270
+ if .decision == "deny"
271
+ then {
272
+ hookSpecificOutput: {
273
+ hookEventName: "PreToolUse",
274
+ permissionDecision: "deny",
275
+ permissionDecisionReason: (.reason // .message // "")
276
+ }
171
277
  }
172
- }
278
+ else empty
279
+ end
173
280
  else
174
281
  empty
175
282
  end
@@ -186,17 +293,9 @@ normalize_response() {
186
293
  # shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
187
294
  source "$SCRIPT_DIR/permission-port-discovery.sh"
188
295
 
189
- # Discover the port from the shared file or the newest live PID-keyed file
190
- if ! PORT=$(resolve_permission_port); then
191
- fail_open "No usable permission server port file found — fail open"
192
- exit 0
193
- fi
194
-
195
- ENDPOINT="http://127.0.0.1:${PORT}/api/evaluate_permission"
196
- debug "Endpoint: $ENDPOINT"
197
-
198
296
  # Read the hook input from stdin
199
297
  INPUT=$(cat)
298
+ append_diagnostic_record "received_input" "received_input"
200
299
 
201
300
  # Extract tool_name and tool_input from the hook payload
202
301
  TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // .toolName // .tool // .name // empty' 2>/dev/null)
@@ -204,10 +303,19 @@ TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // .toolInput // .input // {}' 2
204
303
 
205
304
  # If we can't parse the input, fail open
206
305
  if [[ -z "$TOOL_NAME" ]]; then
207
- fail_open "Could not parse tool_name from input — fail open"
306
+ fail_open "parse_tool_name_failed" "Could not parse tool_name from input — fail open"
307
+ exit 0
308
+ fi
309
+
310
+ # Discover the port from the shared file or the newest live PID-keyed file
311
+ if ! PORT=$(resolve_permission_port); then
312
+ fail_open "port_discovery_failed" "No usable permission server port file found — fail open"
208
313
  exit 0
209
314
  fi
210
315
 
316
+ ENDPOINT="http://127.0.0.1:${PORT}/api/evaluate_permission"
317
+ debug "Endpoint: $ENDPOINT"
318
+
211
319
  debug "Evaluating: $TOOL_NAME"
212
320
  debug "Platform: $HOOK_PLATFORM"
213
321
 
@@ -216,7 +324,7 @@ AUTHORITY_MODE=$(resolve_authority_mode "$AUTHORITY_HOST")
216
324
  debug "Authority mode for ${AUTHORITY_HOST:-unknown}: $AUTHORITY_MODE"
217
325
 
218
326
  if [[ "$AUTHORITY_MODE" == "off" ]]; then
219
- fail_open "Authority mode is off — hook no-op"
327
+ fail_open "authority_off" "Authority mode is off — hook no-op"
220
328
  exit 0
221
329
  fi
222
330
 
@@ -241,23 +349,31 @@ ATTEMPT=0
241
349
  TIMEOUT=$INITIAL_TIMEOUT
242
350
 
243
351
  while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
352
+ LAST_ATTEMPT="$ATTEMPT"
353
+ CURRENT_TIMEOUT="$TIMEOUT"
244
354
  RESPONSE=$(curl -s --max-time "$TIMEOUT" -X POST "$ENDPOINT" \
245
355
  -H "Content-Type: application/json" \
246
356
  -d "$PAYLOAD" \
247
357
  2>/dev/null)
248
358
  CURL_EXIT=$?
359
+ LAST_CURL_EXIT="$CURL_EXIT"
249
360
 
250
361
  if [[ $CURL_EXIT -eq 0 ]] && [[ -n "$RESPONSE" ]]; then
251
362
  debug "Response (attempt $((ATTEMPT+1))): $RESPONSE"
252
363
  if ! echo "$RESPONSE" | jq -e . >/dev/null 2>&1; then
253
- fail_open "Non-JSON response for platform $HOOK_PLATFORM — fail open"
364
+ fail_open "response_not_json" "Non-JSON response for platform $HOOK_PLATFORM — fail open"
254
365
  exit 0
255
366
  fi
256
367
  NORMALIZED_RESPONSE=$(normalize_response "$RESPONSE")
257
368
  if [[ -n "$NORMALIZED_RESPONSE" ]]; then
258
- echo "$NORMALIZED_RESPONSE"
369
+ EMITTED_RESPONSE="$NORMALIZED_RESPONSE"
370
+ append_diagnostic_record "complete" "response_normalized" "success"
371
+ emit_response "$NORMALIZED_RESPONSE"
372
+ elif [[ "$HOOK_PLATFORM" == "codex" ]]; then
373
+ EMITTED_RESPONSE=""
374
+ append_diagnostic_record "complete" "response_allowed_without_output" "success"
259
375
  else
260
- fail_open "Malformed response for platform $HOOK_PLATFORM — fail open"
376
+ fail_open "response_malformed" "Malformed response for platform $HOOK_PLATFORM — fail open"
261
377
  exit 0
262
378
  fi
263
379
  exit 0
@@ -266,12 +382,14 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
266
382
  ATTEMPT=$((ATTEMPT + 1))
267
383
  if [[ $ATTEMPT -le $MAX_RETRIES ]]; then
268
384
  BACKOFF=$((TIMEOUT * ATTEMPT))
269
- debug "Attempt $ATTEMPT failed (curl exit $CURL_EXIT) — retrying in ${BACKOFF}s (timeout ${TIMEOUT}s → $((TIMEOUT * 2))s)"
385
+ RETRY_MESSAGE="Attempt $ATTEMPT failed (curl exit $CURL_EXIT) — retrying in ${BACKOFF}s (timeout ${TIMEOUT}s → $((TIMEOUT * 2))s)"
386
+ debug "$RETRY_MESSAGE"
387
+ append_diagnostic_record "retry" "curl_retry" "retrying" "$RETRY_MESSAGE"
270
388
  sleep "$BACKOFF"
271
389
  TIMEOUT=$((TIMEOUT * 2))
272
390
  fi
273
391
  done
274
392
 
275
393
  # All retries exhausted — fail open
276
- fail_open "All $((MAX_RETRIES + 1)) attempts failed — fail open"
394
+ fail_open "curl_attempts_exhausted" "All $((MAX_RETRIES + 1)) attempts failed — fail open"
277
395
  exit 0
package/server.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "name": "io.github.DollhouseMCP/mcp-server",
4
4
  "title": "DollhouseMCP",
5
5
  "description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
6
- "version": "2.0.30",
6
+ "version": "2.0.31",
7
7
  "homepage": "https://dollhousemcp.com",
8
8
  "repository": {
9
9
  "type": "git",
@@ -29,7 +29,7 @@
29
29
  {
30
30
  "registryType": "npm",
31
31
  "identifier": "@dollhousemcp/mcp-server",
32
- "version": "2.0.30",
32
+ "version": "2.0.31",
33
33
  "transport": {
34
34
  "type": "stdio"
35
35
  }