velocious 1.0.359 → 1.0.360
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/README.md +12 -0
- package/build/src/background-jobs/main.d.ts.map +1 -1
- package/build/src/background-jobs/main.js +8 -1
- package/build/src/background-jobs/types.d.ts +6 -2
- package/build/src/background-jobs/types.d.ts.map +1 -1
- package/build/src/background-jobs/types.js +3 -2
- package/build/src/background-jobs/worker.d.ts +34 -1
- package/build/src/background-jobs/worker.d.ts.map +1 -1
- package/build/src/background-jobs/worker.js +76 -7
- package/build/src/configuration-types.d.ts +5 -0
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +2 -1
- package/build/src/configuration.d.ts +4 -0
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +9 -1
- package/build/src/database/drivers/base.d.ts +47 -1
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +97 -9
- package/build/src/database/query/index.d.ts +10 -1
- package/build/src/database/query/index.d.ts.map +1 -1
- package/build/src/database/query/index.js +13 -4
- package/build/src/database/query/model-class-query.d.ts.map +1 -1
- package/build/src/database/query/model-class-query.js +13 -4
- package/build/src/database/record/index.js +5 -5
- package/build/src/logger.d.ts +5 -0
- package/build/src/logger.d.ts.map +1 -1
- package/build/src/logger.js +39 -7
- package/build/src/utils/backtrace-cleaner.d.ts +50 -0
- package/build/src/utils/backtrace-cleaner.d.ts.map +1 -1
- package/build/src/utils/backtrace-cleaner.js +165 -2
- package/package.json +1 -1
package/build/src/logger.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ export default class Logger {
|
|
|
24
24
|
* @returns {import("./configuration.js").default | undefined} - The safe configuration.
|
|
25
25
|
*/
|
|
26
26
|
_safeConfiguration(): import("./configuration.js").default | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* @param {LogLevel} level - Level.
|
|
29
|
+
* @returns {boolean} - Whether any configured output emits this level.
|
|
30
|
+
*/
|
|
31
|
+
isLevelEnabled(level: LogLevel): boolean;
|
|
27
32
|
/**
|
|
28
33
|
* @param {any[]} messages - Messages.
|
|
29
34
|
* @returns {Promise<void>} - Resolves when complete.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.js"],"names":[],"mappings":"AA4UA;IACE;;;;;;OAMG;IACH,oBANW,MAAM,GAAG,MAAM,gEAEvB;QAAoD,aAAa;QAC1C,KAAK;QAC2C,oBAAoB;KAC7F,EAcA;IAVC,gBAAmB;IACnB,0CAAmC;IACnC,2FAAiD;IAG/C,iBAAuC;IAEvC,4BAAqB;IAKzB;;OAEG;IACH,oBAFa,OAAO,oBAAoB,EAAE,OAAO,CAShD;IAED;;OAEG;IACH,sBAFa,OAAO,oBAAoB,EAAE,OAAO,GAAG,SAAS,CAQ5D;IAED;;;OAGG;IACH,sBAHW,QAAQ,GACN,OAAO,CAanB;IAED;;;OAGG;IACH,mBAHW,GAAG,EAAE,GACH,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,kBAHW,GAAG,EAAE,GACH,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,2BAHW,GAAG,EAAE,GACH,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,iBAHW,GAAG,EAAE,GACH,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,mBAHW,GAAG,EAAE,GACH,OAAO,CAAC,IAAI,CAAC,CAIzB;IAED;;;OAGG;IACH,mBAHW,OAAO,GACL,IAAI,CAIhB;IAGS,cAAU,UAAU,CAAC,OAAO,kBAAkB,CAAC,GAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAM3E;;;;;OAKG;IACH,4BAJG;QAAuB,KAAK,EAApB,QAAQ;QACoC,QAAQ,EAApD,UAAU,CAAC,OAAO,kBAAkB,CAAC;KAC7C,GAAU,OAAO,CAAC,IAAI,CAAC,CAczB;CACF;uBA7ca,iBAAiB,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;0BAN3C,oBAAoB;AAkB9C;;;GAGG;AACH,iDAHW,CAAG,GAAG,IAAC,MAAa,KAAK,CAAC,GAAG,CAAC,CAAA,GAAA,GAC5B,KAAK,CAAC,GAAG,CAAC,CAStB"}
|
package/build/src/logger.js
CHANGED
|
@@ -223,6 +223,21 @@ function isOutputLevelAllowed({ level, outputConfig, loggingConfiguration, debug
|
|
|
223
223
|
const allowedLevels = loggingConfiguration.levels || DEFAULT_LOGGING_CONFIGURATION.levels;
|
|
224
224
|
return isLevelAllowed({ level, allowedLevels, debugFlag });
|
|
225
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* @param {object} args - Options object.
|
|
228
|
+
* @param {LogLevel} args.level - Level.
|
|
229
|
+
* @param {import("./configuration-types.js").LoggingOutputConfig[]} args.outputs - Output configurations.
|
|
230
|
+
* @param {import("./configuration-types.js").LoggingConfiguration} args.loggingConfiguration - Logging configuration.
|
|
231
|
+
* @param {boolean} [args.debugFlag] - Whether debug flag.
|
|
232
|
+
* @returns {import("./configuration-types.js").LoggingOutputConfig[]} - Outputs enabled for the level.
|
|
233
|
+
*/
|
|
234
|
+
function enabledOutputConfigs({ level, outputs, loggingConfiguration, debugFlag }) {
|
|
235
|
+
return outputs.filter((outputConfig) => {
|
|
236
|
+
if (!outputConfig || !outputConfig.output || typeof outputConfig.output.write !== "function")
|
|
237
|
+
return false;
|
|
238
|
+
return isOutputLevelAllowed({ level, outputConfig, loggingConfiguration, debugFlag });
|
|
239
|
+
});
|
|
240
|
+
}
|
|
226
241
|
/**
|
|
227
242
|
* @param {object} args - Options object.
|
|
228
243
|
* @param {string} args.subject - Log subject.
|
|
@@ -236,7 +251,13 @@ function isOutputLevelAllowed({ level, outputConfig, loggingConfiguration, debug
|
|
|
236
251
|
async function writeLog({ subject, level, messages, configuration, loggingConfiguration, debugFlag }) {
|
|
237
252
|
const resolvedLoggingConfiguration = loggingConfiguration || resolveLoggingConfiguration(configuration);
|
|
238
253
|
const outputs = resolveLoggingOutputs({ loggingConfiguration: resolvedLoggingConfiguration, configuration });
|
|
239
|
-
|
|
254
|
+
const enabledOutputs = enabledOutputConfigs({
|
|
255
|
+
level,
|
|
256
|
+
outputs,
|
|
257
|
+
loggingConfiguration: resolvedLoggingConfiguration,
|
|
258
|
+
debugFlag
|
|
259
|
+
});
|
|
260
|
+
if (enabledOutputs.length === 0)
|
|
240
261
|
return;
|
|
241
262
|
const writes = [];
|
|
242
263
|
/** @type {Array<any> | undefined} */
|
|
@@ -245,11 +266,7 @@ async function writeLog({ subject, level, messages, configuration, loggingConfig
|
|
|
245
266
|
let message;
|
|
246
267
|
/** @type {import("./configuration-types.js").LoggingOutputPayload | null} */
|
|
247
268
|
let payload = null;
|
|
248
|
-
for (const outputConfig of
|
|
249
|
-
if (!outputConfig || !outputConfig.output || typeof outputConfig.output.write !== "function")
|
|
250
|
-
continue;
|
|
251
|
-
if (!isOutputLevelAllowed({ level, outputConfig, loggingConfiguration: resolvedLoggingConfiguration, debugFlag }))
|
|
252
|
-
continue;
|
|
269
|
+
for (const outputConfig of enabledOutputs) {
|
|
253
270
|
if (!payload) {
|
|
254
271
|
resolvedMessages = functionOrMessages(...messages);
|
|
255
272
|
message = messagesToMessage(subject, ...resolvedMessages);
|
|
@@ -312,6 +329,21 @@ export default class Logger {
|
|
|
312
329
|
return undefined;
|
|
313
330
|
}
|
|
314
331
|
}
|
|
332
|
+
/**
|
|
333
|
+
* @param {LogLevel} level - Level.
|
|
334
|
+
* @returns {boolean} - Whether any configured output emits this level.
|
|
335
|
+
*/
|
|
336
|
+
isLevelEnabled(level) {
|
|
337
|
+
const configuration = this._safeConfiguration();
|
|
338
|
+
const loggingConfiguration = this._loggingConfiguration || resolveLoggingConfiguration(configuration);
|
|
339
|
+
const outputs = resolveLoggingOutputs({ loggingConfiguration, configuration });
|
|
340
|
+
return enabledOutputConfigs({
|
|
341
|
+
level,
|
|
342
|
+
outputs,
|
|
343
|
+
loggingConfiguration,
|
|
344
|
+
debugFlag: this._debug
|
|
345
|
+
}).length > 0;
|
|
346
|
+
}
|
|
315
347
|
/**
|
|
316
348
|
* @param {any[]} messages - Messages.
|
|
317
349
|
* @returns {Promise<void>} - Resolves when complete.
|
|
@@ -379,4 +411,4 @@ export default class Logger {
|
|
|
379
411
|
});
|
|
380
412
|
}
|
|
381
413
|
}
|
|
382
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxtQkFBbUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLGdCQUFnQixNQUFNLGlDQUFpQyxDQUFBO0FBQzlELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RCxrRkFBa0Y7QUFFbEYsTUFBTSw2QkFBNkIsR0FBRztJQUNwQyxPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxLQUFLO0lBQ1gseUJBQXlCO0lBQ3pCLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0NBQ2xDLENBQUE7QUFFRCx5QkFBeUI7QUFDekIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUV6RTs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQUcsUUFBUTtJQUNyQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzVCLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FB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Q3BCLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTTtTQUN2QixDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSBcIi4vY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQgTG9nZ2VyQ29uc29sZU91dHB1dCBmcm9tIFwiLi9sb2dnZXIvb3V0cHV0cy9jb25zb2xlLW91dHB1dC5qc1wiXG5pbXBvcnQgTG9nZ2VyRmlsZU91dHB1dCBmcm9tIFwiLi9sb2dnZXIvb3V0cHV0cy9maWxlLW91dHB1dC5qc1wiXG5pbXBvcnQge2Zvcm1hdFZhbHVlfSBmcm9tIFwiLi91dGlscy9mb3JtYXQtdmFsdWUuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqIEB0eXBlZGVmIHtcImRlYnVnLWxvdy1sZXZlbFwiIHwgXCJkZWJ1Z1wiIHwgXCJpbmZvXCIgfCBcIndhcm5cIiB8IFwiZXJyb3JcIn0gTG9nTGV2ZWwgKi9cblxuY29uc3QgREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT04gPSB7XG4gIGNvbnNvbGU6IHRydWUsXG4gIGZpbGU6IGZhbHNlLFxuICAvKiogQHR5cGUge0xvZ0xldmVsW119ICovXG4gIGxldmVsczogW1wiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXVxufVxuXG4vKiogQHR5cGUge0xvZ0xldmVsW119ICovXG5jb25zdCBMRVZFTF9PUkRFUiA9IFtcImRlYnVnLWxvdy1sZXZlbFwiLCBcImRlYnVnXCIsIFwiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXVxuXG4vKipcbiAqIEBwYXJhbSB7Li4uYW55fGZ1bmN0aW9uKCkgOiBBcnJheTxhbnk+fSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICogQHJldHVybnMge0FycmF5PGFueT59IC0gRWl0aGVyIHRoZSBmdW5jdGlvbiByZXN1bHQgb3IgdGhlIG1lc3NhZ2VzXG4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uT3JNZXNzYWdlcyguLi5tZXNzYWdlcykge1xuICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBtZXNzYWdlc1swXSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBtZXNzYWdlc1swXSgpXG4gICAgbWVzc2FnZXMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XVxuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2VzXG59XG5cbi8qKlxuICogRm9ybWF0IGEgc2luZ2xlIHZhbHVlIGZvciBpbmNsdXNpb24gaW4gYSBsb2cgbWVzc2FnZS5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFZhbHVlIHRvIGZvcm1hdC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU3RyaW5nIHJlcHJlc2VudGF0aW9uLlxuICovXG5mdW5jdGlvbiBmb3JtYXRQYXJ0KHZhbHVlKSB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlLm1lc3NhZ2V9XFxuJHt2YWx1ZS5zdGFja31gXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlKVxuICB9XG5cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSlcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSB1c2VyLXN1cHBsaWVkIG1lc3NhZ2VzIGludG8gYSBzaW5nbGUgc3RyaW5nLlxuICpcbiAqIElmIHRoZSBmaXJzdCBtZXNzYWdlIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgcHJpbnRmLXN0eWxlIGZvcm1hdFxuICogc3BlY2lmaWVycyAoYCVzYCwgYCVkYCwgYCVqYCwgYCVvYCwgYCVPYCwgb3IgYCUlYCksIHRoZSByZW1haW5pbmdcbiAqIG1lc3NhZ2VzIGFyZSBpbnRlcnBvbGF0ZWQgaW50byBpdCBpbiBvcmRlciAobGlrZSBgY29uc29sZS5sb2dgIC9cbiAqIGB1dGlsLmZvcm1hdGApLiBBbnkgbGVmdG92ZXIgbWVzc2FnZXMgYXJlIGFwcGVuZGVkIHdpdGggYSBzcGFjZVxuICogc2VwYXJhdG9yLiBPdGhlcndpc2UsIGFsbCBwYXJ0cyBhcmUgam9pbmVkIHdpdGggc3BhY2VzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8YW55Pn0gbWVzc2FnZXMgLSBVc2VyLXN1cHBsaWVkIG1lc3NhZ2UgcGFydHMuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgdXNlciBtZXNzYWdlLlxuICovXG5mdW5jdGlvbiBmb3JtYXRVc2VyTWVzc2FnZXMobWVzc2FnZXMpIHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFwiXCJcblxuICBjb25zdCBmaXJzdCA9IG1lc3NhZ2VzWzBdXG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIiAmJiAvJVtzZGpvTyVdLy50ZXN0KGZpcnN0KSkge1xuICAgIGxldCBhcmdJbmRleCA9IDFcbiAgICBjb25zdCBmb3JtYXR0ZWQgPSBmaXJzdC5yZXBsYWNlKC8lW3Nkam9PJV0vZywgKG1hdGNoKSA9PiB7XG4gICAgICBpZiAobWF0Y2ggPT09IFwiJSVcIikgcmV0dXJuIFwiJVwiXG4gICAgICBpZiAoYXJnSW5kZXggPj0gbWVzc2FnZXMubGVuZ3RoKSByZXR1cm4gbWF0Y2hcblxuICAgICAgY29uc3QgdmFsdWUgPSBtZXNzYWdlc1thcmdJbmRleF1cblxuICAgICAgYXJnSW5kZXggKz0gMVxuXG4gICAgICBpZiAobWF0Y2ggPT09IFwiJWRcIikge1xuICAgICAgICAvLyBNYXRjaCB1dGlsLmZvcm1hdDogbmV2ZXIgdGhyb3cgZm9yIG5vbi1jb2VyY2libGUgdmFsdWVzIOKAlCB5aWVsZCBcIk5hTlwiIGluc3RlYWQuXG4gICAgICAgIC8vIE51bWJlcihTeW1ib2woKSkgdGhyb3dzLCBzbyBjYXRjaCBhbmQgZmFsbCBiYWNrLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBTdHJpbmcoTnVtYmVyKHZhbHVlKSlcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIFwiTmFOXCJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG1hdGNoID09PSBcIiVqXCIgfHwgbWF0Y2ggPT09IFwiJW9cIiB8fCBtYXRjaCA9PT0gXCIlT1wiKSByZXR1cm4gZm9ybWF0VmFsdWUodmFsdWUpXG5cbiAgICAgIHJldHVybiBmb3JtYXRQYXJ0KHZhbHVlKVxuICAgIH0pXG5cbiAgICBsZXQgbWVzc2FnZSA9IGZvcm1hdHRlZFxuXG4gICAgZm9yIChsZXQgaW5kZXggPSBhcmdJbmRleDsgaW5kZXggPCBtZXNzYWdlcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgIG1lc3NhZ2UgKz0gYCAke2Zvcm1hdFBhcnQobWVzc2FnZXNbaW5kZXhdKX1gXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lc3NhZ2VcbiAgfVxuXG4gIGxldCBtZXNzYWdlID0gXCJcIlxuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtZXNzYWdlcy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBpZiAoaW5kZXggPiAwKSBtZXNzYWdlICs9IFwiIFwiXG4gICAgbWVzc2FnZSArPSBmb3JtYXRQYXJ0KG1lc3NhZ2VzW2luZGV4XSlcbiAgfVxuXG4gIHJldHVybiBtZXNzYWdlXG59XG5cbi8qKlxuICogQ29udmVydHMgYSBsb2dnZXIgc3ViamVjdCBhbmQgbWVzc2FnZSBwYXJ0cyBpbnRvIGEgc2luZ2xlIGxvZyBsaW5lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gTG9nZ2VyIHN1YmplY3QgLyBjYXRlZ29yeSBwcmVmaXguXG4gKiBAcGFyYW0gey4uLmFueX0gbWVzc2FnZXMgLSBVc2VyLXN1cHBsaWVkIG1lc3NhZ2UgcGFydHMgKHN1cHBvcnRzIHByaW50Zi1zdHlsZSBmb3JtYXQgc3BlY2lmaWVycyBvbiB0aGUgZmlyc3QgcGFydCkuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFRoZSBmb3JtYXR0ZWQgbG9nIGxpbmUuXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VzVG9NZXNzYWdlKHN1YmplY3QsIC4uLm1lc3NhZ2VzKSB7XG4gIGNvbnN0IHVzZXJNZXNzYWdlID0gZm9ybWF0VXNlck1lc3NhZ2VzKG1lc3NhZ2VzKVxuXG4gIGlmICghc3ViamVjdCkgcmV0dXJuIHVzZXJNZXNzYWdlXG4gIGlmICghdXNlck1lc3NhZ2UpIHJldHVybiBTdHJpbmcoc3ViamVjdClcblxuICByZXR1cm4gYCR7c3ViamVjdH0gJHt1c2VyTWVzc2FnZX1gXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7UmVxdWlyZWQ8UGljazxpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIFwiY29uc29sZVwiIHwgXCJmaWxlXCIgfCBcImxldmVsc1wiPj4gJiBQYXJ0aWFsPFBpY2s8aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9uLCBcImZpbGVQYXRoXCIgfCBcIm91dHB1dHNcIj4+fSAtIFRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMb2dnaW5nQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKSB7XG4gIGNvbnN0IGRlYnVnRW5hYmxlZCA9IGNvbmZpZ3VyYXRpb24/LmRlYnVnID09PSB0cnVlXG4gIGlmIChjb25maWd1cmF0aW9uICYmIHR5cGVvZiBjb25maWd1cmF0aW9uLmdldExvZ2dpbmdDb25maWd1cmF0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGNvbmZpZ3VyYXRpb24uZ2V0TG9nZ2luZ0NvbmZpZ3VyYXRpb24oKVxuXG4gICAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ucmVzb2x2ZWQsXG4gICAgICAgIGNvbnNvbGU6IHRydWUsXG4gICAgICAgIGxldmVsczogTEVWRUxfT1JERVJcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzb2x2ZWRcbiAgfVxuXG4gIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT04sXG4gICAgICBjb25zb2xlOiB0cnVlLFxuICAgICAgbGV2ZWxzOiBMRVZFTF9PUkRFUlxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX0xPR0dJTkdfQ09ORklHVVJBVElPTlxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBhcmdzLmxldmVsIC0gTGV2ZWwuXG4gKiBAcGFyYW0ge0xvZ0xldmVsW119IGFyZ3MuYWxsb3dlZExldmVscyAtIEFsbG93ZWQgbGV2ZWxzLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z0ZsYWddIC0gV2hldGhlciBkZWJ1ZyBmbGFnLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBsZXZlbCBhbGxvd2VkLlxuICovXG5mdW5jdGlvbiBpc0xldmVsQWxsb3dlZCh7bGV2ZWwsIGFsbG93ZWRMZXZlbHMsIGRlYnVnRmxhZ30pIHtcbiAgaWYgKGFsbG93ZWRMZXZlbHMuaW5jbHVkZXMobGV2ZWwpKSByZXR1cm4gdHJ1ZVxuXG4gIGlmIChkZWJ1Z0ZsYWcgJiYgTEVWRUxfT1JERVIuaW5kZXhPZihsZXZlbCkgPj0gTEVWRUxfT1JERVIuaW5kZXhPZihcImRlYnVnXCIpKSByZXR1cm4gdHJ1ZVxuXG4gIHJldHVybiBmYWxzZVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gLSBMb2dnaW5nIG91dHB1dHMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGxvZ2dpbmdDb25maWd1cmF0aW9uLm91dHB1dHMpKSByZXR1cm4gbG9nZ2luZ0NvbmZpZ3VyYXRpb24ub3V0cHV0c1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpKSB7XG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSAqL1xuICAgIGNvbnN0IGxvZ2dlck91dHB1dHMgPSBbXVxuXG4gICAgZm9yIChjb25zdCBsb2dnZXIgb2YgbG9nZ2luZ0NvbmZpZ3VyYXRpb24ubG9nZ2Vycykge1xuICAgICAgaWYgKCFsb2dnZXIpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGxvZ2dlckNvbmZpZyA9IC8qKiBAdHlwZSB7YW55fSAqLyAobG9nZ2VyKVxuXG4gICAgICBpZiAodHlwZW9mIGxvZ2dlckNvbmZpZy50b091dHB1dENvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGxvZ2dlck91dHB1dHMucHVzaChsb2dnZXJDb25maWcudG9PdXRwdXRDb25maWcoe2NvbmZpZ3VyYXRpb259KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2dlckNvbmZpZy5vdXRwdXQgJiYgdHlwZW9mIGxvZ2dlckNvbmZpZy5vdXRwdXQud3JpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIG91dHB1dDogbG9nZ2VyQ29uZmlnLm91dHB1dCxcbiAgICAgICAgICBsZXZlbHM6IGxvZ2dlckNvbmZpZy5sZXZlbHNcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsb2dnZXJDb25maWcud3JpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIG91dHB1dDogbG9nZ2VyQ29uZmlnLFxuICAgICAgICAgIGxldmVsczogbG9nZ2VyQ29uZmlnLmxldmVsc1xuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2dnZXJOYW1lID0gbG9nZ2VyQ29uZmlnPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCBcIlVua25vd25Mb2dnZXJcIlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2dnZXIgbXVzdCBpbXBsZW1lbnQgdG9PdXRwdXRDb25maWcgb3Igd3JpdGU6ICR7bG9nZ2VyTmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBsb2dnZXJPdXRwdXRzXG4gIH1cblxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119ICovXG4gIGNvbnN0IG91dHB1dHMgPSBbXVxuICBpZiAobG9nZ2luZ0NvbmZpZ3VyYXRpb24uY29uc29sZSAhPT0gZmFsc2UpIHtcbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgb3V0cHV0OiBuZXcgTG9nZ2VyQ29uc29sZU91dHB1dCgpLFxuICAgICAgbGV2ZWxzOiBsb2dnaW5nQ29uZmlndXJhdGlvbi5sZXZlbHNcbiAgICB9KVxuICB9XG5cbiAgaWYgKGxvZ2dpbmdDb25maWd1cmF0aW9uLmZpbGUgIT09IGZhbHNlICYmIGxvZ2dpbmdDb25maWd1cmF0aW9uLmZpbGVQYXRoKSB7XG4gICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgIG91dHB1dDogbmV3IExvZ2dlckZpbGVPdXRwdXQoe1xuICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICBnZXRDb25maWd1cmF0aW9uOiAoKSA9PiBjb25maWd1cmF0aW9uLFxuICAgICAgICBmaWxlUGF0aDogbG9nZ2luZ0NvbmZpZ3VyYXRpb24uZmlsZVBhdGhcbiAgICAgIH0pLFxuICAgICAgbGV2ZWxzOiBsb2dnaW5nQ29uZmlndXJhdGlvbi5sZXZlbHNcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG91dHB1dHNcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ30gYXJncy5vdXRwdXRDb25maWcgLSBPdXRwdXQgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBhcmdzLmxvZ2dpbmdDb25maWd1cmF0aW9uIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z0ZsYWddIC0gV2hldGhlciBkZWJ1ZyBmbGFnLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBvdXRwdXQgc2hvdWxkIGxvZy5cbiAqL1xuZnVuY3Rpb24gaXNPdXRwdXRMZXZlbEFsbG93ZWQoe2xldmVsLCBvdXRwdXRDb25maWcsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG91dHB1dENvbmZpZy5sZXZlbHMpKSB7XG4gICAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVsczogb3V0cHV0Q29uZmlnLmxldmVscywgZGVidWdGbGFnOiBmYWxzZX0pXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRDb25maWcub3V0cHV0Py5sZXZlbHMpKSB7XG4gICAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVsczogb3V0cHV0Q29uZmlnLm91dHB1dC5sZXZlbHMsIGRlYnVnRmxhZzogZmFsc2V9KVxuICB9XG5cbiAgY29uc3QgYWxsb3dlZExldmVscyA9IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVscyB8fCBERUZBVUxUX0xPR0dJTkdfQ09ORklHVVJBVElPTi5sZXZlbHNcblxuICByZXR1cm4gaXNMZXZlbEFsbG93ZWQoe2xldmVsLCBhbGxvd2VkTGV2ZWxzLCBkZWJ1Z0ZsYWd9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJqZWN0IC0gTG9nIHN1YmplY3QuXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBhcmdzLmxldmVsIC0gTGV2ZWwuXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz59IGFyZ3MubWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTG9nKHtzdWJqZWN0LCBsZXZlbCwgbWVzc2FnZXMsIGNvbmZpZ3VyYXRpb24sIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIGNvbnN0IHJlc29sdmVkTG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSBsb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgY29uc3Qgb3V0cHV0cyA9IHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb246IHJlc29sdmVkTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KVxuXG4gIGlmIChvdXRwdXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuXG5cbiAgY29uc3Qgd3JpdGVzID0gW11cbiAgLyoqIEB0eXBlIHtBcnJheTxhbnk+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgcmVzb2x2ZWRNZXNzYWdlc1xuICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IG1lc3NhZ2VcbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dFBheWxvYWQgfCBudWxsfSAqL1xuICBsZXQgcGF5bG9hZCA9IG51bGxcblxuICBmb3IgKGNvbnN0IG91dHB1dENvbmZpZyBvZiBvdXRwdXRzKSB7XG4gICAgaWYgKCFvdXRwdXRDb25maWcgfHwgIW91dHB1dENvbmZpZy5vdXRwdXQgfHwgdHlwZW9mIG91dHB1dENvbmZpZy5vdXRwdXQud3JpdGUgIT09IFwiZnVuY3Rpb25cIikgY29udGludWVcbiAgICBpZiAoIWlzT3V0cHV0TGV2ZWxBbGxvd2VkKHtsZXZlbCwgb3V0cHV0Q29uZmlnLCBsb2dnaW5nQ29uZmlndXJhdGlvbjogcmVzb2x2ZWRMb2dnaW5nQ29uZmlndXJhdGlvbiwgZGVidWdGbGFnfSkpIGNvbnRpbnVlXG5cbiAgICBpZiAoIXBheWxvYWQpIHtcbiAgICAgIHJlc29sdmVkTWVzc2FnZXMgPSBmdW5jdGlvbk9yTWVzc2FnZXMoLi4ubWVzc2FnZXMpXG4gICAgICBtZXNzYWdlID0gbWVzc2FnZXNUb01lc3NhZ2Uoc3ViamVjdCwgLi4ucmVzb2x2ZWRNZXNzYWdlcylcbiAgICAgIC8vIHN1YmplY3QgaXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJnLCB0aGVuIHRoZSB1c2VyIG1lc3NhZ2VzXG4gICAgICBwYXlsb2FkID0ge1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVzLnB1c2gob3V0cHV0Q29uZmlnLm91dHB1dC53cml0ZShwYXlsb2FkKSlcbiAgfVxuXG4gIGlmICh3cml0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgYXdhaXQgd3JpdGVzWzBdXG4gIH0gZWxzZSBpZiAod3JpdGVzLmxlbmd0aCA+IDEpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3cml0ZXMpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0fSBvYmplY3QgLSBPYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z10gLSBXaGV0aGVyIGRlYnVnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gW2FyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb25dIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0LCB7Y29uZmlndXJhdGlvbiwgZGVidWcgPSBmYWxzZSwgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX2xvZ2dpbmdDb25maWd1cmF0aW9uID0gbG9nZ2luZ0NvbmZpZ3VyYXRpb25cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBvYmplY3QgfHwgXCJFbXB0eVN0cmluZ1wiXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuICAgICAgdGhpcy5fc3ViamVjdCA9IG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiVW5rbm93bkNsYXNzXCJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSAtIFRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNvbnN0IG9iamVjdFdpdGhDb25maWcgPSAvKiogQHR5cGUge3tjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSAqLyAodGhpcy5fb2JqZWN0KVxuICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IG9iamVjdFdpdGhDb25maWc/LmNvbmZpZ3VyYXRpb24gfHwgQ29uZmlndXJhdGlvbi5jdXJyZW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgc2FmZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgX3NhZmVDb25maWd1cmF0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRlYnVnKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcImRlYnVnXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5mbyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZGVidWdMb3dMZXZlbCguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJkZWJ1Zy1sb3ctbGV2ZWxcIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBsb2coLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiaW5mb1wiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGVycm9yKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcImVycm9yXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld1ZhbHVlIC0gTmV3IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXREZWJ1ZyhuZXdWYWx1ZSkge1xuICAgIHRoaXMuX2RlYnVnID0gbmV3VmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz4pID0+IFByb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YXJuKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcIndhcm5cIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7TG9nTGV2ZWx9IGFyZ3MubGV2ZWwgLSBMZXZlbC5cbiAgICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBmdW5jdGlvbk9yTWVzc2FnZXM+fSBhcmdzLm1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfd3JpdGUoe2xldmVsLCBtZXNzYWdlc30pIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5fc2FmZUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGxvZ2dpbmdDb25maWd1cmF0aW9uID0gdGhpcy5fbG9nZ2luZ0NvbmZpZ3VyYXRpb24gfHwgcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG5cbiAgICBhd2FpdCB3cml0ZUxvZyh7XG4gICAgICBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBsb2dnaW5nQ29uZmlndXJhdGlvbixcbiAgICAgIGRlYnVnRmxhZzogdGhpcy5fZGVidWdcbiAgICB9KVxuICB9XG59XG4iXX0=
|
|
414
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxhQUFhLE1BQU0sb0JBQW9CLENBQUE7QUFDOUMsT0FBTyxtQkFBbUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLGdCQUFnQixNQUFNLGlDQUFpQyxDQUFBO0FBQzlELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RCxrRkFBa0Y7QUFFbEYsTUFBTSw2QkFBNkIsR0FBRztJQUNwQyxPQUFPLEVBQUUsSUFBSTtJQUNiLElBQUksRUFBRSxLQUFLO0lBQ1gseUJBQXlCO0lBQ3pCLE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO0NBQ2xDLENBQUE7QUFFRCx5QkFBeUI7QUFDekIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUV6RTs7O0dBR0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQUcsUUFBUTtJQUNyQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQzVCLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEQsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFBO0FBQ2pCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FB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SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUTtRQUNyQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVEsQ0FBQyxRQUFRO1FBQ2YsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUE7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVE7UUFDcEIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUMsQ0FBQyxDQUFBO0lBQzlDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDO1FBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQy9DLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXJHLE1BQU0sUUFBUSxDQUFDO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLEtBQUs7WUFDTCxRQUFRO1lBQ1IsYUFBYTtZQUNiLG9CQUFvQjtZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gXCIuL2NvbmZpZ3VyYXRpb24uanNcIlxuaW1wb3J0IExvZ2dlckNvbnNvbGVPdXRwdXQgZnJvbSBcIi4vbG9nZ2VyL291dHB1dHMvY29uc29sZS1vdXRwdXQuanNcIlxuaW1wb3J0IExvZ2dlckZpbGVPdXRwdXQgZnJvbSBcIi4vbG9nZ2VyL291dHB1dHMvZmlsZS1vdXRwdXQuanNcIlxuaW1wb3J0IHtmb3JtYXRWYWx1ZX0gZnJvbSBcIi4vdXRpbHMvZm9ybWF0LXZhbHVlLmpzXCJcbmltcG9ydCByZXN0QXJnc0Vycm9yIGZyb20gXCIuL3V0aWxzL3Jlc3QtYXJncy1lcnJvci5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsICovXG5cbmNvbnN0IERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OID0ge1xuICBjb25zb2xlOiB0cnVlLFxuICBmaWxlOiBmYWxzZSxcbiAgLyoqIEB0eXBlIHtMb2dMZXZlbFtdfSAqL1xuICBsZXZlbHM6IFtcImluZm9cIiwgXCJ3YXJuXCIsIFwiZXJyb3JcIl1cbn1cblxuLyoqIEB0eXBlIHtMb2dMZXZlbFtdfSAqL1xuY29uc3QgTEVWRUxfT1JERVIgPSBbXCJkZWJ1Zy1sb3ctbGV2ZWxcIiwgXCJkZWJ1Z1wiLCBcImluZm9cIiwgXCJ3YXJuXCIsIFwiZXJyb3JcIl1cblxuLyoqXG4gKiBAcGFyYW0gey4uLmFueXxmdW5jdGlvbigpIDogQXJyYXk8YW55Pn0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAqIEByZXR1cm5zIHtBcnJheTxhbnk+fSAtIEVpdGhlciB0aGUgZnVuY3Rpb24gcmVzdWx0IG9yIHRoZSBtZXNzYWdlc1xuICovXG5mdW5jdGlvbiBmdW5jdGlvbk9yTWVzc2FnZXMoLi4ubWVzc2FnZXMpIHtcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgbWVzc2FnZXNbMF0gPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gbWVzc2FnZXNbMF0oKVxuICAgIG1lc3NhZ2VzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF1cbiAgfVxuXG4gIHJldHVybiBtZXNzYWdlc1xufVxuXG4vKipcbiAqIEZvcm1hdCBhIHNpbmdsZSB2YWx1ZSBmb3IgaW5jbHVzaW9uIGluIGEgbG9nIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBWYWx1ZSB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFydCh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBgJHt2YWx1ZS5tZXNzYWdlfVxcbiR7dmFsdWUuc3RhY2t9YFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmb3JtYXRWYWx1ZSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlcyBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAqXG4gKiBJZiB0aGUgZmlyc3QgbWVzc2FnZSBpcyBhIHN0cmluZyBjb250YWluaW5nIHByaW50Zi1zdHlsZSBmb3JtYXRcbiAqIHNwZWNpZmllcnMgKGAlc2AsIGAlZGAsIGAlamAsIGAlb2AsIGAlT2AsIG9yIGAlJWApLCB0aGUgcmVtYWluaW5nXG4gKiBtZXNzYWdlcyBhcmUgaW50ZXJwb2xhdGVkIGludG8gaXQgaW4gb3JkZXIgKGxpa2UgYGNvbnNvbGUubG9nYCAvXG4gKiBgdXRpbC5mb3JtYXRgKS4gQW55IGxlZnRvdmVyIG1lc3NhZ2VzIGFyZSBhcHBlbmRlZCB3aXRoIGEgc3BhY2VcbiAqIHNlcGFyYXRvci4gT3RoZXJ3aXNlLCBhbGwgcGFydHMgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PGFueT59IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHVzZXIgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0VXNlck1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiXG5cbiAgY29uc3QgZmlyc3QgPSBtZXNzYWdlc1swXVxuXG4gIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgLyVbc2Rqb08lXS8udGVzdChmaXJzdCkpIHtcbiAgICBsZXQgYXJnSW5kZXggPSAxXG4gICAgY29uc3QgZm9ybWF0dGVkID0gZmlyc3QucmVwbGFjZSgvJVtzZGpvTyVdL2csIChtYXRjaCkgPT4ge1xuICAgICAgaWYgKG1hdGNoID09PSBcIiUlXCIpIHJldHVybiBcIiVcIlxuICAgICAgaWYgKGFyZ0luZGV4ID49IG1lc3NhZ2VzLmxlbmd0aCkgcmV0dXJuIG1hdGNoXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZXNbYXJnSW5kZXhdXG5cbiAgICAgIGFyZ0luZGV4ICs9IDFcblxuICAgICAgaWYgKG1hdGNoID09PSBcIiVkXCIpIHtcbiAgICAgICAgLy8gTWF0Y2ggdXRpbC5mb3JtYXQ6IG5ldmVyIHRocm93IGZvciBub24tY29lcmNpYmxlIHZhbHVlcyDigJQgeWllbGQgXCJOYU5cIiBpbnN0ZWFkLlxuICAgICAgICAvLyBOdW1iZXIoU3ltYm9sKCkpIHRocm93cywgc28gY2F0Y2ggYW5kIGZhbGwgYmFjay5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKE51bWJlcih2YWx1ZSkpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIk5hTlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaCA9PT0gXCIlalwiIHx8IG1hdGNoID09PSBcIiVvXCIgfHwgbWF0Y2ggPT09IFwiJU9cIikgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlKVxuXG4gICAgICByZXR1cm4gZm9ybWF0UGFydCh2YWx1ZSlcbiAgICB9KVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBmb3JtYXR0ZWRcblxuICAgIGZvciAobGV0IGluZGV4ID0gYXJnSW5kZXg7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBtZXNzYWdlICs9IGAgJHtmb3JtYXRQYXJ0KG1lc3NhZ2VzW2luZGV4XSl9YFxuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlXG4gIH1cblxuICBsZXQgbWVzc2FnZSA9IFwiXCJcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaWYgKGluZGV4ID4gMCkgbWVzc2FnZSArPSBcIiBcIlxuICAgIG1lc3NhZ2UgKz0gZm9ybWF0UGFydChtZXNzYWdlc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbG9nZ2VyIHN1YmplY3QgYW5kIG1lc3NhZ2UgcGFydHMgaW50byBhIHNpbmdsZSBsb2cgbGluZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3ViamVjdCAtIExvZ2dlciBzdWJqZWN0IC8gY2F0ZWdvcnkgcHJlZml4LlxuICogQHBhcmFtIHsuLi5hbnl9IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzIChzdXBwb3J0cyBwcmludGYtc3R5bGUgZm9ybWF0IHNwZWNpZmllcnMgb24gdGhlIGZpcnN0IHBhcnQpLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIGxvZyBsaW5lLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlc1RvTWVzc2FnZShzdWJqZWN0LCAuLi5tZXNzYWdlcykge1xuICBjb25zdCB1c2VyTWVzc2FnZSA9IGZvcm1hdFVzZXJNZXNzYWdlcyhtZXNzYWdlcylcblxuICBpZiAoIXN1YmplY3QpIHJldHVybiB1c2VyTWVzc2FnZVxuICBpZiAoIXVzZXJNZXNzYWdlKSByZXR1cm4gU3RyaW5nKHN1YmplY3QpXG5cbiAgcmV0dXJuIGAke3N1YmplY3R9ICR7dXNlck1lc3NhZ2V9YFxufVxuXG4vKipcbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMge1JlcXVpcmVkPFBpY2s8aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9uLCBcImNvbnNvbGVcIiB8IFwiZmlsZVwiIHwgXCJsZXZlbHNcIj4+ICYgUGFydGlhbDxQaWNrPGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiwgXCJmaWxlUGF0aFwiIHwgXCJvdXRwdXRzXCI+Pn0gLSBUaGUgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbikge1xuICBjb25zdCBkZWJ1Z0VuYWJsZWQgPSBjb25maWd1cmF0aW9uPy5kZWJ1ZyA9PT0gdHJ1ZVxuICBpZiAoY29uZmlndXJhdGlvbiAmJiB0eXBlb2YgY29uZmlndXJhdGlvbi5nZXRMb2dnaW5nQ29uZmlndXJhdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSBjb25maWd1cmF0aW9uLmdldExvZ2dpbmdDb25maWd1cmF0aW9uKClcblxuICAgIGlmIChkZWJ1Z0VuYWJsZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnJlc29sdmVkLFxuICAgICAgICBjb25zb2xlOiB0cnVlLFxuICAgICAgICBsZXZlbHM6IExFVkVMX09SREVSXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc29sdmVkXG4gIH1cblxuICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLkRFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OLFxuICAgICAgY29uc29sZTogdHJ1ZSxcbiAgICAgIGxldmVsczogTEVWRUxfT1JERVJcbiAgICB9XG4gIH1cblxuICByZXR1cm4gREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT05cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtMb2dMZXZlbFtdfSBhcmdzLmFsbG93ZWRMZXZlbHMgLSBBbGxvd2VkIGxldmVscy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgbGV2ZWwgYWxsb3dlZC5cbiAqL1xuZnVuY3Rpb24gaXNMZXZlbEFsbG93ZWQoe2xldmVsLCBhbGxvd2VkTGV2ZWxzLCBkZWJ1Z0ZsYWd9KSB7XG4gIGlmIChhbGxvd2VkTGV2ZWxzLmluY2x1ZGVzKGxldmVsKSkgcmV0dXJuIHRydWVcblxuICBpZiAoZGVidWdGbGFnICYmIExFVkVMX09SREVSLmluZGV4T2YobGV2ZWwpID49IExFVkVMX09SREVSLmluZGV4T2YoXCJkZWJ1Z1wiKSkgcmV0dXJuIHRydWVcblxuICByZXR1cm4gZmFsc2Vcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb259IGFyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb24gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119IC0gTG9nZ2luZyBvdXRwdXRzLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTG9nZ2luZ091dHB1dHMoe2xvZ2dpbmdDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9ufSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShsb2dnaW5nQ29uZmlndXJhdGlvbi5vdXRwdXRzKSkgcmV0dXJuIGxvZ2dpbmdDb25maWd1cmF0aW9uLm91dHB1dHNcblxuICBpZiAoQXJyYXkuaXNBcnJheShsb2dnaW5nQ29uZmlndXJhdGlvbi5sb2dnZXJzKSkge1xuICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gKi9cbiAgICBjb25zdCBsb2dnZXJPdXRwdXRzID0gW11cblxuICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpIHtcbiAgICAgIGlmICghbG9nZ2VyKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBsb2dnZXJDb25maWcgPSAvKiogQHR5cGUge2FueX0gKi8gKGxvZ2dlcilcblxuICAgICAgaWYgKHR5cGVvZiBsb2dnZXJDb25maWcudG9PdXRwdXRDb25maWcgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2gobG9nZ2VyQ29uZmlnLnRvT3V0cHV0Q29uZmlnKHtjb25maWd1cmF0aW9ufSkpXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmIChsb2dnZXJDb25maWcub3V0cHV0ICYmIHR5cGVvZiBsb2dnZXJDb25maWcub3V0cHV0LndyaXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbG9nZ2VyT3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBvdXRwdXQ6IGxvZ2dlckNvbmZpZy5vdXRwdXQsXG4gICAgICAgICAgbGV2ZWxzOiBsb2dnZXJDb25maWcubGV2ZWxzXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgbG9nZ2VyQ29uZmlnLndyaXRlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgbG9nZ2VyT3V0cHV0cy5wdXNoKHtcbiAgICAgICAgICBvdXRwdXQ6IGxvZ2dlckNvbmZpZyxcbiAgICAgICAgICBsZXZlbHM6IGxvZ2dlckNvbmZpZy5sZXZlbHNcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9nZ2VyTmFtZSA9IGxvZ2dlckNvbmZpZz8uY29uc3RydWN0b3I/Lm5hbWUgfHwgXCJVbmtub3duTG9nZ2VyXCJcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9nZ2VyIG11c3QgaW1wbGVtZW50IHRvT3V0cHV0Q29uZmlnIG9yIHdyaXRlOiAke2xvZ2dlck5hbWV9YClcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nZ2VyT3V0cHV0c1xuICB9XG5cbiAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSAqL1xuICBjb25zdCBvdXRwdXRzID0gW11cbiAgaWYgKGxvZ2dpbmdDb25maWd1cmF0aW9uLmNvbnNvbGUgIT09IGZhbHNlKSB7XG4gICAgb3V0cHV0cy5wdXNoKHtcbiAgICAgIG91dHB1dDogbmV3IExvZ2dlckNvbnNvbGVPdXRwdXQoKSxcbiAgICAgIGxldmVsczogbG9nZ2luZ0NvbmZpZ3VyYXRpb24ubGV2ZWxzXG4gICAgfSlcbiAgfVxuXG4gIGlmIChsb2dnaW5nQ29uZmlndXJhdGlvbi5maWxlICE9PSBmYWxzZSAmJiBsb2dnaW5nQ29uZmlndXJhdGlvbi5maWxlUGF0aCkge1xuICAgIG91dHB1dHMucHVzaCh7XG4gICAgICBvdXRwdXQ6IG5ldyBMb2dnZXJGaWxlT3V0cHV0KHtcbiAgICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgICAgZ2V0Q29uZmlndXJhdGlvbjogKCkgPT4gY29uZmlndXJhdGlvbixcbiAgICAgICAgZmlsZVBhdGg6IGxvZ2dpbmdDb25maWd1cmF0aW9uLmZpbGVQYXRoXG4gICAgICB9KSxcbiAgICAgIGxldmVsczogbG9nZ2luZ0NvbmZpZ3VyYXRpb24ubGV2ZWxzXG4gICAgfSlcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRzXG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7TG9nTGV2ZWx9IGFyZ3MubGV2ZWwgLSBMZXZlbC5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWd9IGFyZ3Mub3V0cHV0Q29uZmlnIC0gT3V0cHV0IGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgb3V0cHV0IHNob3VsZCBsb2cuXG4gKi9cbmZ1bmN0aW9uIGlzT3V0cHV0TGV2ZWxBbGxvd2VkKHtsZXZlbCwgb3V0cHV0Q29uZmlnLCBsb2dnaW5nQ29uZmlndXJhdGlvbiwgZGVidWdGbGFnfSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRDb25maWcubGV2ZWxzKSkge1xuICAgIHJldHVybiBpc0xldmVsQWxsb3dlZCh7bGV2ZWwsIGFsbG93ZWRMZXZlbHM6IG91dHB1dENvbmZpZy5sZXZlbHMsIGRlYnVnRmxhZzogZmFsc2V9KVxuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0Q29uZmlnLm91dHB1dD8ubGV2ZWxzKSkge1xuICAgIHJldHVybiBpc0xldmVsQWxsb3dlZCh7bGV2ZWwsIGFsbG93ZWRMZXZlbHM6IG91dHB1dENvbmZpZy5vdXRwdXQubGV2ZWxzLCBkZWJ1Z0ZsYWc6IGZhbHNlfSlcbiAgfVxuXG4gIGNvbnN0IGFsbG93ZWRMZXZlbHMgPSBsb2dnaW5nQ29uZmlndXJhdGlvbi5sZXZlbHMgfHwgREVGQVVMVF9MT0dHSU5HX0NPTkZJR1VSQVRJT04ubGV2ZWxzXG5cbiAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVscywgZGVidWdGbGFnfSlcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSBhcmdzLm91dHB1dHMgLSBPdXRwdXQgY29uZmlndXJhdGlvbnMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ1tdfSAtIE91dHB1dHMgZW5hYmxlZCBmb3IgdGhlIGxldmVsLlxuICovXG5mdW5jdGlvbiBlbmFibGVkT3V0cHV0Q29uZmlncyh7bGV2ZWwsIG91dHB1dHMsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIHJldHVybiBvdXRwdXRzLmZpbHRlcigob3V0cHV0Q29uZmlnKSA9PiB7XG4gICAgaWYgKCFvdXRwdXRDb25maWcgfHwgIW91dHB1dENvbmZpZy5vdXRwdXQgfHwgdHlwZW9mIG91dHB1dENvbmZpZy5vdXRwdXQud3JpdGUgIT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIGZhbHNlXG5cbiAgICByZXR1cm4gaXNPdXRwdXRMZXZlbEFsbG93ZWQoe2xldmVsLCBvdXRwdXRDb25maWcsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KVxuICB9KVxufVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zdWJqZWN0IC0gTG9nIHN1YmplY3QuXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBhcmdzLmxldmVsIC0gTGV2ZWwuXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz59IGFyZ3MubWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiB8IHVuZGVmaW5lZH0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FyZ3MuZGVidWdGbGFnXSAtIFdoZXRoZXIgZGVidWcgZmxhZy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTG9nKHtzdWJqZWN0LCBsZXZlbCwgbWVzc2FnZXMsIGNvbmZpZ3VyYXRpb24sIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIGNvbnN0IHJlc29sdmVkTG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSBsb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgY29uc3Qgb3V0cHV0cyA9IHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb246IHJlc29sdmVkTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KVxuICBjb25zdCBlbmFibGVkT3V0cHV0cyA9IGVuYWJsZWRPdXRwdXRDb25maWdzKHtcbiAgICBsZXZlbCxcbiAgICBvdXRwdXRzLFxuICAgIGxvZ2dpbmdDb25maWd1cmF0aW9uOiByZXNvbHZlZExvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgIGRlYnVnRmxhZ1xuICB9KVxuXG4gIGlmIChlbmFibGVkT3V0cHV0cy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gIGNvbnN0IHdyaXRlcyA9IFtdXG4gIC8qKiBAdHlwZSB7QXJyYXk8YW55PiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IHJlc29sdmVkTWVzc2FnZXNcbiAgLyoqIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCBtZXNzYWdlXG4gIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRQYXlsb2FkIHwgbnVsbH0gKi9cbiAgbGV0IHBheWxvYWQgPSBudWxsXG5cbiAgZm9yIChjb25zdCBvdXRwdXRDb25maWcgb2YgZW5hYmxlZE91dHB1dHMpIHtcbiAgICBpZiAoIXBheWxvYWQpIHtcbiAgICAgIHJlc29sdmVkTWVzc2FnZXMgPSBmdW5jdGlvbk9yTWVzc2FnZXMoLi4ubWVzc2FnZXMpXG4gICAgICBtZXNzYWdlID0gbWVzc2FnZXNUb01lc3NhZ2Uoc3ViamVjdCwgLi4ucmVzb2x2ZWRNZXNzYWdlcylcbiAgICAgIC8vIHN1YmplY3QgaXMgdGhlIGZpcnN0IHBvc2l0aW9uYWwgYXJnLCB0aGVuIHRoZSB1c2VyIG1lc3NhZ2VzXG4gICAgICBwYXlsb2FkID0ge1xuICAgICAgICBsZXZlbCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc3ViamVjdCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgd3JpdGVzLnB1c2gob3V0cHV0Q29uZmlnLm91dHB1dC53cml0ZShwYXlsb2FkKSlcbiAgfVxuXG4gIGlmICh3cml0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgYXdhaXQgd3JpdGVzWzBdXG4gIH0gZWxzZSBpZiAod3JpdGVzLmxlbmd0aCA+IDEpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh3cml0ZXMpXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgb2JqZWN0fSBvYmplY3QgLSBPYmplY3QuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFthcmdzLmNvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z10gLSBXaGV0aGVyIGRlYnVnLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gW2FyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb25dIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqZWN0LCB7Y29uZmlndXJhdGlvbiwgZGVidWcgPSBmYWxzZSwgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIC4uLnJlc3RBcmdzfSA9IHt9KSB7XG4gICAgcmVzdEFyZ3NFcnJvcihyZXN0QXJncylcblxuICAgIHRoaXMuX2RlYnVnID0gZGVidWdcbiAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvblxuICAgIHRoaXMuX2xvZ2dpbmdDb25maWd1cmF0aW9uID0gbG9nZ2luZ0NvbmZpZ3VyYXRpb25cblxuICAgIGlmICh0eXBlb2Ygb2JqZWN0ID09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuX3N1YmplY3QgPSBvYmplY3QgfHwgXCJFbXB0eVN0cmluZ1wiXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29iamVjdCA9IG9iamVjdFxuICAgICAgdGhpcy5fc3ViamVjdCA9IG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiVW5rbm93bkNsYXNzXCJcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0fSAtIFRoZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgZ2V0Q29uZmlndXJhdGlvbigpIHtcbiAgICBpZiAoIXRoaXMuX2NvbmZpZ3VyYXRpb24pIHtcbiAgICAgIGNvbnN0IG9iamVjdFdpdGhDb25maWcgPSAvKiogQHR5cGUge3tjb25maWd1cmF0aW9uPzogaW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9fSAqLyAodGhpcy5fb2JqZWN0KVxuICAgICAgdGhpcy5fY29uZmlndXJhdGlvbiA9IG9iamVjdFdpdGhDb25maWc/LmNvbmZpZ3VyYXRpb24gfHwgQ29uZmlndXJhdGlvbi5jdXJyZW50KClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fY29uZmlndXJhdGlvblxuICB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdCB8IHVuZGVmaW5lZH0gLSBUaGUgc2FmZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgX3NhZmVDb25maWd1cmF0aW9uKCkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKClcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gbGV2ZWwgLSBMZXZlbC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBhbnkgY29uZmlndXJlZCBvdXRwdXQgZW1pdHMgdGhpcyBsZXZlbC5cbiAgICovXG4gIGlzTGV2ZWxFbmFibGVkKGxldmVsKSB7XG4gICAgY29uc3QgY29uZmlndXJhdGlvbiA9IHRoaXMuX3NhZmVDb25maWd1cmF0aW9uKClcbiAgICBjb25zdCBsb2dnaW5nQ29uZmlndXJhdGlvbiA9IHRoaXMuX2xvZ2dpbmdDb25maWd1cmF0aW9uIHx8IHJlc29sdmVMb2dnaW5nQ29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uKVxuICAgIGNvbnN0IG91dHB1dHMgPSByZXNvbHZlTG9nZ2luZ091dHB1dHMoe2xvZ2dpbmdDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9ufSlcblxuICAgIHJldHVybiBlbmFibGVkT3V0cHV0Q29uZmlncyh7XG4gICAgICBsZXZlbCxcbiAgICAgIG91dHB1dHMsXG4gICAgICBsb2dnaW5nQ29uZmlndXJhdGlvbixcbiAgICAgIGRlYnVnRmxhZzogdGhpcy5fZGVidWdcbiAgICB9KS5sZW5ndGggPiAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRlYnVnKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcImRlYnVnXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5mbyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2FueVtdfSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZGVidWdMb3dMZXZlbCguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJkZWJ1Zy1sb3ctbGV2ZWxcIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55W119IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBsb2coLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiaW5mb1wiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnlbXX0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGVycm9yKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcImVycm9yXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld1ZhbHVlIC0gTmV3IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXREZWJ1ZyhuZXdWYWx1ZSkge1xuICAgIHRoaXMuX2RlYnVnID0gbmV3VmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZSB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz4pID0+IFByb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyB3YXJuKC4uLm1lc3NhZ2VzKSB7XG4gICAgYXdhaXQgdGhpcy5fd3JpdGUoe2xldmVsOiBcIndhcm5cIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEBwYXJhbSB7TG9nTGV2ZWx9IGFyZ3MubGV2ZWwgLSBMZXZlbC5cbiAgICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBmdW5jdGlvbk9yTWVzc2FnZXM+fSBhcmdzLm1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBfd3JpdGUoe2xldmVsLCBtZXNzYWdlc30pIHtcbiAgICBjb25zdCBjb25maWd1cmF0aW9uID0gdGhpcy5fc2FmZUNvbmZpZ3VyYXRpb24oKVxuICAgIGNvbnN0IGxvZ2dpbmdDb25maWd1cmF0aW9uID0gdGhpcy5fbG9nZ2luZ0NvbmZpZ3VyYXRpb24gfHwgcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG5cbiAgICBhd2FpdCB3cml0ZUxvZyh7XG4gICAgICBzdWJqZWN0OiB0aGlzLl9zdWJqZWN0LFxuICAgICAgbGV2ZWwsXG4gICAgICBtZXNzYWdlcyxcbiAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICBsb2dnaW5nQ29uZmlndXJhdGlvbixcbiAgICAgIGRlYnVnRmxhZzogdGhpcy5fZGVidWdcbiAgICB9KVxuICB9XG59XG4iXX0=
|
|
@@ -8,6 +8,15 @@ export default class BacktraceCleaner {
|
|
|
8
8
|
static getCleanedStack(error: Error, args?: {
|
|
9
9
|
includeErrorHeader?: boolean | undefined;
|
|
10
10
|
}): string | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* @param {Error} error - Error instance.
|
|
13
|
+
* @param {object} args - Options object.
|
|
14
|
+
* @param {string} args.applicationDirectory - Application directory.
|
|
15
|
+
* @returns {string | undefined} - Source line for the first application frame.
|
|
16
|
+
*/
|
|
17
|
+
static getApplicationSourceLine(error: Error, args: {
|
|
18
|
+
applicationDirectory: string;
|
|
19
|
+
}): string | undefined;
|
|
11
20
|
/**
|
|
12
21
|
* @param {Error} error - Error instance.
|
|
13
22
|
*/
|
|
@@ -25,10 +34,51 @@ export default class BacktraceCleaner {
|
|
|
25
34
|
* @returns {string[] | undefined} - Filtered stack lines.
|
|
26
35
|
*/
|
|
27
36
|
getCleanedStackLines(): string[] | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* @param {object} args - Options object.
|
|
39
|
+
* @param {string} args.applicationDirectory - Application directory.
|
|
40
|
+
* @returns {string | undefined} - Source line for the first application frame.
|
|
41
|
+
*/
|
|
42
|
+
getApplicationSourceLine({ applicationDirectory }: {
|
|
43
|
+
applicationDirectory: string;
|
|
44
|
+
}): string | undefined;
|
|
28
45
|
/**
|
|
29
46
|
* @param {string | undefined} line - Backtrace line.
|
|
30
47
|
* @returns {boolean} - True when the line is an error header.
|
|
31
48
|
*/
|
|
32
49
|
isErrorHeaderLine(line: string | undefined): boolean;
|
|
50
|
+
/**
|
|
51
|
+
* @param {string} applicationDirectory - Normalized application directory.
|
|
52
|
+
* @returns {ParsedStackFrame | undefined} - First app-owned frame.
|
|
53
|
+
*/
|
|
54
|
+
_firstApplicationFrame(applicationDirectory: string): ParsedStackFrame | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* @param {string} sourcePath - Source path.
|
|
57
|
+
* @returns {boolean} - Whether the path belongs to Velocious internals.
|
|
58
|
+
*/
|
|
59
|
+
_frameworkSourcePath(sourcePath: string): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* @param {string} line - Stack line.
|
|
62
|
+
* @returns {boolean} - Whether to keep the stack line.
|
|
63
|
+
*/
|
|
64
|
+
_shouldKeepStackLine(line: string): boolean;
|
|
33
65
|
}
|
|
66
|
+
export type ParsedStackFrame = {
|
|
67
|
+
/**
|
|
68
|
+
* - Method/function name from the stack frame.
|
|
69
|
+
*/
|
|
70
|
+
methodName: string | undefined;
|
|
71
|
+
/**
|
|
72
|
+
* - File or URL path from the stack frame.
|
|
73
|
+
*/
|
|
74
|
+
sourcePath: string;
|
|
75
|
+
/**
|
|
76
|
+
* - Source line number.
|
|
77
|
+
*/
|
|
78
|
+
lineNumber: number;
|
|
79
|
+
/**
|
|
80
|
+
* - Source column number.
|
|
81
|
+
*/
|
|
82
|
+
columnNumber: number | undefined;
|
|
83
|
+
};
|
|
34
84
|
//# sourceMappingURL=backtrace-cleaner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backtrace-cleaner.d.ts","sourceRoot":"","sources":["../../../src/utils/backtrace-cleaner.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backtrace-cleaner.d.ts","sourceRoot":"","sources":["../../../src/utils/backtrace-cleaner.js"],"names":[],"mappings":"AAqHA;IACE;;;;;OAKG;IACH,8BALW,KAAK,SAEb;QAAuB,kBAAkB;KACzC,GAAU,MAAM,GAAG,SAAS,CAI9B;IAED;;;;;OAKG;IACH,uCALW,KAAK,QAEb;QAAqB,oBAAoB,EAAjC,MAAM;KACd,GAAU,MAAM,GAAG,SAAS,CAI9B;IAED;;OAEG;IACH,mBAFW,KAAK,EAIf;IADC,aAAkB;IAGpB;;;;OAIG;IACH,yCAHG;QAAuB,kBAAkB;KACzC,GAAU,MAAM,GAAG,SAAS,CAe9B;IAED;;OAEG;IACH,wBAFa,MAAM,EAAE,GAAG,SAAS,CAMhC;IAED;;;;OAIG;IACH,mDAHG;QAAqB,oBAAoB,EAAjC,MAAM;KACd,GAAU,MAAM,GAAG,SAAS,CAe9B;IAED;;;OAGG;IACH,wBAHW,MAAM,GAAG,SAAS,GAChB,OAAO,CAcnB;IAED;;;OAGG;IACH,6CAHW,MAAM,GACJ,gBAAgB,GAAG,SAAS,CAkBxC;IAED;;;OAGG;IACH,iCAHW,MAAM,GACJ,OAAO,CAMnB;IAED;;;OAGG;IACH,2BAHW,MAAM,GACJ,OAAO,CASnB;CACF;;;;;gBApPa,MAAM,GAAG,SAAS;;;;gBAClB,MAAM;;;;gBACN,MAAM;;;;kBACN,MAAM,GAAG,SAAS"}
|
|
@@ -6,6 +6,100 @@
|
|
|
6
6
|
function escapeRegExp(value) {
|
|
7
7
|
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
8
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* @typedef {object} ParsedStackFrame
|
|
11
|
+
* @property {string | undefined} methodName - Method/function name from the stack frame.
|
|
12
|
+
* @property {string} sourcePath - File or URL path from the stack frame.
|
|
13
|
+
* @property {number} lineNumber - Source line number.
|
|
14
|
+
* @property {number | undefined} columnNumber - Source column number.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* @returns {string | undefined} - The framework source directory.
|
|
18
|
+
*/
|
|
19
|
+
function frameworkSourceDirectory() {
|
|
20
|
+
try {
|
|
21
|
+
const sourceUrl = new URL("../", import.meta.url);
|
|
22
|
+
if (sourceUrl.protocol !== "file:")
|
|
23
|
+
return undefined;
|
|
24
|
+
return normalizePath(sourceUrl.pathname);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const FRAMEWORK_SOURCE_DIRECTORY = frameworkSourceDirectory();
|
|
31
|
+
/**
|
|
32
|
+
* @param {string | undefined} value - Path or file URL.
|
|
33
|
+
* @returns {string | undefined} - Normalized path.
|
|
34
|
+
*/
|
|
35
|
+
function normalizePath(value) {
|
|
36
|
+
if (!value)
|
|
37
|
+
return undefined;
|
|
38
|
+
let normalized = value;
|
|
39
|
+
if (normalized.startsWith("file://")) {
|
|
40
|
+
try {
|
|
41
|
+
normalized = new URL(normalized).pathname;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// Keep original value when URL parsing fails.
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
normalized = decodeURIComponent(normalized);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Keep encoded value when decoding fails.
|
|
52
|
+
}
|
|
53
|
+
return normalized.replace(/\\/g, "/");
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* @param {string | undefined} value - Directory path.
|
|
57
|
+
* @returns {string | undefined} - Normalized directory path ending with slash.
|
|
58
|
+
*/
|
|
59
|
+
function normalizeDirectory(value) {
|
|
60
|
+
const normalized = normalizePath(value);
|
|
61
|
+
if (!normalized)
|
|
62
|
+
return undefined;
|
|
63
|
+
return normalized.endsWith("/") ? normalized : `${normalized}/`;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @param {string} line - Stack line.
|
|
67
|
+
* @returns {ParsedStackFrame | undefined} - Parsed frame when possible.
|
|
68
|
+
*/
|
|
69
|
+
function parseStackFrame(line) {
|
|
70
|
+
const trimmed = line.trim();
|
|
71
|
+
if (!trimmed.startsWith("at "))
|
|
72
|
+
return undefined;
|
|
73
|
+
const frame = trimmed.slice(3);
|
|
74
|
+
const frameWithMethodMatch = frame.match(/^(.*?) \((.*)\)$/);
|
|
75
|
+
const methodName = frameWithMethodMatch ? frameWithMethodMatch[1] : undefined;
|
|
76
|
+
const location = frameWithMethodMatch ? frameWithMethodMatch[2] : frame;
|
|
77
|
+
const locationMatch = location.match(/^(.*):(\d+):(\d+)$/) || location.match(/^(.*):(\d+)$/);
|
|
78
|
+
if (!locationMatch)
|
|
79
|
+
return undefined;
|
|
80
|
+
const sourcePath = normalizePath(locationMatch[1]);
|
|
81
|
+
const lineNumber = Number(locationMatch[2]);
|
|
82
|
+
const columnNumber = locationMatch[3] === undefined ? undefined : Number(locationMatch[3]);
|
|
83
|
+
if (!sourcePath || !Number.isFinite(lineNumber))
|
|
84
|
+
return undefined;
|
|
85
|
+
return {
|
|
86
|
+
columnNumber: Number.isFinite(columnNumber) ? columnNumber : undefined,
|
|
87
|
+
lineNumber,
|
|
88
|
+
methodName,
|
|
89
|
+
sourcePath
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @param {string} sourcePath - Source path.
|
|
94
|
+
* @param {string} applicationDirectory - Application directory.
|
|
95
|
+
* @returns {string} - Path relative to the application directory when possible.
|
|
96
|
+
*/
|
|
97
|
+
function relativeApplicationPath(sourcePath, applicationDirectory) {
|
|
98
|
+
if (sourcePath.startsWith(applicationDirectory)) {
|
|
99
|
+
return sourcePath.slice(applicationDirectory.length);
|
|
100
|
+
}
|
|
101
|
+
return sourcePath;
|
|
102
|
+
}
|
|
9
103
|
export default class BacktraceCleaner {
|
|
10
104
|
/**
|
|
11
105
|
* @param {Error} error - Error instance.
|
|
@@ -16,6 +110,15 @@ export default class BacktraceCleaner {
|
|
|
16
110
|
static getCleanedStack(error, args) {
|
|
17
111
|
return new BacktraceCleaner(error).getCleanedStack(args);
|
|
18
112
|
}
|
|
113
|
+
/**
|
|
114
|
+
* @param {Error} error - Error instance.
|
|
115
|
+
* @param {object} args - Options object.
|
|
116
|
+
* @param {string} args.applicationDirectory - Application directory.
|
|
117
|
+
* @returns {string | undefined} - Source line for the first application frame.
|
|
118
|
+
*/
|
|
119
|
+
static getApplicationSourceLine(error, args) {
|
|
120
|
+
return new BacktraceCleaner(error).getApplicationSourceLine(args);
|
|
121
|
+
}
|
|
19
122
|
/**
|
|
20
123
|
* @param {Error} error - Error instance.
|
|
21
124
|
*/
|
|
@@ -44,7 +147,23 @@ export default class BacktraceCleaner {
|
|
|
44
147
|
*/
|
|
45
148
|
getCleanedStackLines() {
|
|
46
149
|
const backtrace = this.error?.stack?.split("\n");
|
|
47
|
-
return backtrace?.filter((line) =>
|
|
150
|
+
return backtrace?.filter((line) => this._shouldKeepStackLine(line));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* @param {object} args - Options object.
|
|
154
|
+
* @param {string} args.applicationDirectory - Application directory.
|
|
155
|
+
* @returns {string | undefined} - Source line for the first application frame.
|
|
156
|
+
*/
|
|
157
|
+
getApplicationSourceLine({ applicationDirectory }) {
|
|
158
|
+
const normalizedApplicationDirectory = normalizeDirectory(applicationDirectory);
|
|
159
|
+
if (!normalizedApplicationDirectory)
|
|
160
|
+
return undefined;
|
|
161
|
+
const frame = this._firstApplicationFrame(normalizedApplicationDirectory);
|
|
162
|
+
if (!frame)
|
|
163
|
+
return undefined;
|
|
164
|
+
const relativePath = relativeApplicationPath(frame.sourcePath, normalizedApplicationDirectory);
|
|
165
|
+
const methodSuffix = frame.methodName ? `:in ${frame.methodName.replace(/^async /, "")}` : "";
|
|
166
|
+
return `${relativePath}:${frame.lineNumber}${methodSuffix}`;
|
|
48
167
|
}
|
|
49
168
|
/**
|
|
50
169
|
* @param {string | undefined} line - Backtrace line.
|
|
@@ -61,5 +180,49 @@ export default class BacktraceCleaner {
|
|
|
61
180
|
const errorNamePattern = new RegExp(`^${escapeRegExp(this.error.name)}(?:\\s*\\[[^\\]]+\\])?:`);
|
|
62
181
|
return errorNamePattern.test(trimmedLine);
|
|
63
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* @param {string} applicationDirectory - Normalized application directory.
|
|
185
|
+
* @returns {ParsedStackFrame | undefined} - First app-owned frame.
|
|
186
|
+
*/
|
|
187
|
+
_firstApplicationFrame(applicationDirectory) {
|
|
188
|
+
const backtrace = this.getCleanedStackLines();
|
|
189
|
+
if (!backtrace)
|
|
190
|
+
return undefined;
|
|
191
|
+
for (const line of backtrace) {
|
|
192
|
+
const frame = parseStackFrame(line);
|
|
193
|
+
if (!frame)
|
|
194
|
+
continue;
|
|
195
|
+
if (!frame.sourcePath.startsWith(applicationDirectory))
|
|
196
|
+
continue;
|
|
197
|
+
if (this._frameworkSourcePath(frame.sourcePath))
|
|
198
|
+
continue;
|
|
199
|
+
return frame;
|
|
200
|
+
}
|
|
201
|
+
return undefined;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* @param {string} sourcePath - Source path.
|
|
205
|
+
* @returns {boolean} - Whether the path belongs to Velocious internals.
|
|
206
|
+
*/
|
|
207
|
+
_frameworkSourcePath(sourcePath) {
|
|
208
|
+
if (!FRAMEWORK_SOURCE_DIRECTORY)
|
|
209
|
+
return false;
|
|
210
|
+
return sourcePath.startsWith(FRAMEWORK_SOURCE_DIRECTORY);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @param {string} line - Stack line.
|
|
214
|
+
* @returns {boolean} - Whether to keep the stack line.
|
|
215
|
+
*/
|
|
216
|
+
_shouldKeepStackLine(line) {
|
|
217
|
+
if (line.includes("node_modules"))
|
|
218
|
+
return false;
|
|
219
|
+
if (line.includes("(node:internal/"))
|
|
220
|
+
return false;
|
|
221
|
+
if (line.includes("(node:internal/process/"))
|
|
222
|
+
return false;
|
|
223
|
+
if (line.trim().startsWith("at node:internal/"))
|
|
224
|
+
return false;
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
64
227
|
}
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNlLWNsZWFuZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvYmFja3RyYWNlLWNsZWFuZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRCxNQUFNLENBQUMsT0FBTyxPQUFPLGdCQUFnQjtJQUNuQzs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLElBQUk7UUFDaEMsT0FBTyxJQUFJLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxZQUFZLEtBQUs7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILGVBQWUsQ0FBQyxFQUFDLGtCQUFrQixHQUFHLElBQUksRUFBQyxHQUFHLEVBQUU7UUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7UUFFN0MsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUUxRCxJQUFJLGtCQUFrQjtZQUFFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVuRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDOUIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7UUFFekYsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQTtRQUVqRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDbEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsb0JBQW9CO1FBQ2xCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVoRCxPQUFPLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFBO0lBQ2pILENBQUM7SUFFRDs7O09BR0c7SUFDSCxpQkFBaUIsQ0FBQyxJQUFJO1FBQ3BCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFdkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO1FBRS9CLElBQUksQ0FBQyxXQUFXO1lBQUUsT0FBTyxLQUFLLENBQUE7UUFFOUIsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRWpELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUUvRixPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMzQyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgLSBWYWx1ZSB0byBlc2NhcGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIEVzY2FwZWQgdmFsdWUgZm9yIGEgUmVnRXhwIHBhdHRlcm4uXG4gKi9cbmZ1bmN0aW9uIGVzY2FwZVJlZ0V4cCh2YWx1ZSkge1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpXG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJhY2t0cmFjZUNsZWFuZXIge1xuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmluY2x1ZGVFcnJvckhlYWRlcl0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGBFcnJvcjogLi4uYCBoZWFkZXIgbGluZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUgY2xlYW5lZCBzdGFjay5cbiAgICovXG4gIHN0YXRpYyBnZXRDbGVhbmVkU3RhY2soZXJyb3IsIGFyZ3MpIHtcbiAgICByZXR1cm4gbmV3IEJhY2t0cmFjZUNsZWFuZXIoZXJyb3IpLmdldENsZWFuZWRTdGFjayhhcmdzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlcnJvcikge1xuICAgIHRoaXMuZXJyb3IgPSBlcnJvclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pbmNsdWRlRXJyb3JIZWFkZXJdIC0gV2hldGhlciB0byBpbmNsdWRlIHRoZSBgRXJyb3I6IC4uLmAgaGVhZGVyIGxpbmUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGNsZWFuZWQgc3RhY2suXG4gICAqL1xuICBnZXRDbGVhbmVkU3RhY2soe2luY2x1ZGVFcnJvckhlYWRlciA9IHRydWV9ID0ge30pIHtcbiAgICBjb25zdCBiYWNrdHJhY2UgPSB0aGlzLmdldENsZWFuZWRTdGFja0xpbmVzKClcblxuICAgIGlmICghYmFja3RyYWNlIHx8IGJhY2t0cmFjZS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgIGlmIChpbmNsdWRlRXJyb3JIZWFkZXIpIHJldHVybiBiYWNrdHJhY2Uuam9pbihcIlxcblwiKVxuXG4gICAgY29uc3QgZmlyc3RMaW5lID0gYmFja3RyYWNlWzBdXG4gICAgY29uc3QgcmVtYWluaW5nTGluZXMgPSB0aGlzLmlzRXJyb3JIZWFkZXJMaW5lKGZpcnN0TGluZSkgPyBiYWNrdHJhY2Uuc2xpY2UoMSkgOiBiYWNrdHJhY2VcblxuICAgIGlmIChyZW1haW5pbmdMaW5lcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWRcblxuICAgIHJldHVybiByZW1haW5pbmdMaW5lcy5qb2luKFwiXFxuXCIpXG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge3N0cmluZ1tdIHwgdW5kZWZpbmVkfSAtIEZpbHRlcmVkIHN0YWNrIGxpbmVzLlxuICAgKi9cbiAgZ2V0Q2xlYW5lZFN0YWNrTGluZXMoKSB7XG4gICAgY29uc3QgYmFja3RyYWNlID0gdGhpcy5lcnJvcj8uc3RhY2s/LnNwbGl0KFwiXFxuXCIpXG5cbiAgICByZXR1cm4gYmFja3RyYWNlPy5maWx0ZXIoKGxpbmUpID0+ICFsaW5lLmluY2x1ZGVzKFwibm9kZV9tb2R1bGVzXCIpICYmICFsaW5lLmluY2x1ZGVzKFwiKG5vZGU6aW50ZXJuYWwvcHJvY2Vzcy9cIikpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGxpbmUgLSBCYWNrdHJhY2UgbGluZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSB3aGVuIHRoZSBsaW5lIGlzIGFuIGVycm9yIGhlYWRlci5cbiAgICovXG4gIGlzRXJyb3JIZWFkZXJMaW5lKGxpbmUpIHtcbiAgICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKVxuXG4gICAgaWYgKCF0cmltbWVkTGluZSkgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIkVycm9yOlwiKSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGVycm9yTmFtZVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVSZWdFeHAodGhpcy5lcnJvci5uYW1lKX0oPzpcXFxccypcXFxcW1teXFxcXF1dK1xcXFxdKT86YClcblxuICAgIHJldHVybiBlcnJvck5hbWVQYXR0ZXJuLnRlc3QodHJpbW1lZExpbmUpXG4gIH1cbn1cbiJdfQ==
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3RyYWNlLWNsZWFuZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvYmFja3RyYWNlLWNsZWFuZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaOzs7R0FHRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQUs7SUFDekIsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFBO0FBQ3JELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFFSDs7R0FFRztBQUNILFNBQVMsd0JBQXdCO0lBQy9CLElBQUksQ0FBQztRQUNILE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBRWpELElBQUksU0FBUyxDQUFDLFFBQVEsS0FBSyxPQUFPO1lBQUUsT0FBTyxTQUFTLENBQUE7UUFFcEQsT0FBTyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzFDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sMEJBQTBCLEdBQUcsd0JBQXdCLEVBQUUsQ0FBQTtBQUU3RDs7O0dBR0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLElBQUksQ0FBQyxLQUFLO1FBQUUsT0FBTyxTQUFTLENBQUE7SUFFNUIsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFBO0lBRXRCLElBQUksVUFBVSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQztZQUNILFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxRQUFRLENBQUE7UUFDM0MsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDhDQUE4QztRQUNoRCxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUks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QyxVQUFVLENBQUMsbUJBQW1CLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQTtRQUU3RCxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHRvIGVzY2FwZS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRXNjYXBlZCB2YWx1ZSBmb3IgYSBSZWdFeHAgcGF0dGVybi5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIilcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJzZWRTdGFja0ZyYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IHVuZGVmaW5lZH0gbWV0aG9kTmFtZSAtIE1ldGhvZC9mdW5jdGlvbiBuYW1lIGZyb20gdGhlIHN0YWNrIGZyYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZVBhdGggLSBGaWxlIG9yIFVSTCBwYXRoIGZyb20gdGhlIHN0YWNrIGZyYW1lLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmVOdW1iZXIgLSBTb3VyY2UgbGluZSBudW1iZXIuXG4gKiBAcHJvcGVydHkge251bWJlciB8IHVuZGVmaW5lZH0gY29sdW1uTnVtYmVyIC0gU291cmNlIGNvbHVtbiBudW1iZXIuXG4gKi9cblxuLyoqXG4gKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSAtIFRoZSBmcmFtZXdvcmsgc291cmNlIGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gZnJhbWV3b3JrU291cmNlRGlyZWN0b3J5KCkge1xuICB0cnkge1xuICAgIGNvbnN0IHNvdXJjZVVybCA9IG5ldyBVUkwoXCIuLi9cIiwgaW1wb3J0Lm1ldGEudXJsKVxuXG4gICAgaWYgKHNvdXJjZVVybC5wcm90b2NvbCAhPT0gXCJmaWxlOlwiKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICByZXR1cm4gbm9ybWFsaXplUGF0aChzb3VyY2VVcmwucGF0aG5hbWUpXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5jb25zdCBGUkFNRVdPUktfU09VUkNFX0RJUkVDVE9SWSA9IGZyYW1ld29ya1NvdXJjZURpcmVjdG9yeSgpXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IHZhbHVlIC0gUGF0aCBvciBmaWxlIFVSTC5cbiAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gTm9ybWFsaXplZCBwYXRoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHZhbHVlKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiB1bmRlZmluZWRcblxuICBsZXQgbm9ybWFsaXplZCA9IHZhbHVlXG5cbiAgaWYgKG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcImZpbGU6Ly9cIikpIHtcbiAgICB0cnkge1xuICAgICAgbm9ybWFsaXplZCA9IG5ldyBVUkwobm9ybWFsaXplZCkucGF0aG5hbWVcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtlZXAgb3JpZ2luYWwgdmFsdWUgd2hlbiBVUkwgcGFyc2luZyBmYWlscy5cbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIG5vcm1hbGl6ZWQgPSBkZWNvZGVVUklDb21wb25lbnQobm9ybWFsaXplZClcbiAgfSBjYXRjaCB7XG4gICAgLy8gS2VlcCBlbmNvZGVkIHZhbHVlIHdoZW4gZGVjb2RpbmcgZmFpbHMuXG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKVxufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSB2YWx1ZSAtIERpcmVjdG9yeSBwYXRoLlxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBOb3JtYWxpemVkIGRpcmVjdG9yeSBwYXRoIGVuZGluZyB3aXRoIHNsYXNoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEaXJlY3RvcnkodmFsdWUpIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IG5vcm1hbGl6ZVBhdGgodmFsdWUpXG5cbiAgaWYgKCFub3JtYWxpemVkKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIG5vcm1hbGl6ZWQuZW5kc1dpdGgoXCIvXCIpID8gbm9ybWFsaXplZCA6IGAke25vcm1hbGl6ZWR9L2Bcbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGluZSAtIFN0YWNrIGxpbmUuXG4gKiBAcmV0dXJucyB7UGFyc2VkU3RhY2tGcmFtZSB8IHVuZGVmaW5lZH0gLSBQYXJzZWQgZnJhbWUgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTdGFja0ZyYW1lKGxpbmUpIHtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpXG5cbiAgaWYgKCF0cmltbWVkLnN0YXJ0c1dpdGgoXCJhdCBcIikpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBmcmFtZSA9IHRyaW1tZWQuc2xpY2UoMylcbiAgY29uc3QgZnJhbWVXaXRoTWV0aG9kTWF0Y2ggPSBmcmFtZS5tYXRjaCgvXiguKj8pIFxcKCguKilcXCkkLylcbiAgY29uc3QgbWV0aG9kTmFtZSA9IGZyYW1lV2l0aE1ldGhvZE1hdGNoID8gZnJhbWVXaXRoTWV0aG9kTWF0Y2hbMV0gOiB1bmRlZmluZWRcbiAgY29uc3QgbG9jYXRpb24gPSBmcmFtZVdpdGhNZXRob2RNYXRjaCA/IGZyYW1lV2l0aE1ldGhvZE1hdGNoWzJdIDogZnJhbWVcbiAgY29uc3QgbG9jYXRpb25NYXRjaCA9IGxvY2F0aW9uLm1hdGNoKC9eKC4qKTooXFxkKyk6KFxcZCspJC8pIHx8IGxvY2F0aW9uLm1hdGNoKC9eKC4qKTooXFxkKykkLylcblxuICBpZiAoIWxvY2F0aW9uTWF0Y2gpIHJldHVybiB1bmRlZmluZWRcblxuICBjb25zdCBzb3VyY2VQYXRoID0gbm9ybWFsaXplUGF0aChsb2NhdGlvbk1hdGNoWzFdKVxuICBjb25zdCBsaW5lTnVtYmVyID0gTnVtYmVyKGxvY2F0aW9uTWF0Y2hbMl0pXG4gIGNvbnN0IGNvbHVtbk51bWJlciA9IGxvY2F0aW9uTWF0Y2hbM10gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE51bWJlcihsb2NhdGlvbk1hdGNoWzNdKVxuXG4gIGlmICghc291cmNlUGF0aCB8fCAhTnVtYmVyLmlzRmluaXRlKGxpbmVOdW1iZXIpKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgcmV0dXJuIHtcbiAgICBjb2x1bW5OdW1iZXI6IE51bWJlci5pc0Zpbml0ZShjb2x1bW5OdW1iZXIpID8gY29sdW1uTnVtYmVyIDogdW5kZWZpbmVkLFxuICAgIGxpbmVOdW1iZXIsXG4gICAgbWV0aG9kTmFtZSxcbiAgICBzb3VyY2VQYXRoXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aCAtIFNvdXJjZSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwcGxpY2F0aW9uRGlyZWN0b3J5IC0gQXBwbGljYXRpb24gZGlyZWN0b3J5LlxuICogQHJldHVybnMge3N0cmluZ30gLSBQYXRoIHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgd2hlbiBwb3NzaWJsZS5cbiAqL1xuZnVuY3Rpb24gcmVsYXRpdmVBcHBsaWNhdGlvblBhdGgoc291cmNlUGF0aCwgYXBwbGljYXRpb25EaXJlY3RvcnkpIHtcbiAgaWYgKHNvdXJjZVBhdGguc3RhcnRzV2l0aChhcHBsaWNhdGlvbkRpcmVjdG9yeSkpIHtcbiAgICByZXR1cm4gc291cmNlUGF0aC5zbGljZShhcHBsaWNhdGlvbkRpcmVjdG9yeS5sZW5ndGgpXG4gIH1cblxuICByZXR1cm4gc291cmNlUGF0aFxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrdHJhY2VDbGVhbmVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gRXJyb3IgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtib29sZWFufSBbYXJncy5pbmNsdWRlRXJyb3JIZWFkZXJdIC0gV2hldGhlciB0byBpbmNsdWRlIHRoZSBgRXJyb3I6IC4uLmAgaGVhZGVyIGxpbmUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IC0gVGhlIGNsZWFuZWQgc3RhY2suXG4gICAqL1xuICBzdGF0aWMgZ2V0Q2xlYW5lZFN0YWNrKGVycm9yLCBhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBCYWNrdHJhY2VDbGVhbmVyKGVycm9yKS5nZXRDbGVhbmVkU3RhY2soYXJncylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hcHBsaWNhdGlvbkRpcmVjdG9yeSAtIEFwcGxpY2F0aW9uIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBTb3VyY2UgbGluZSBmb3IgdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGZyYW1lLlxuICAgKi9cbiAgc3RhdGljIGdldEFwcGxpY2F0aW9uU291cmNlTGluZShlcnJvciwgYXJncykge1xuICAgIHJldHVybiBuZXcgQmFja3RyYWNlQ2xlYW5lcihlcnJvcikuZ2V0QXBwbGljYXRpb25Tb3VyY2VMaW5lKGFyZ3MpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBFcnJvciBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGVycm9yKSB7XG4gICAgdGhpcy5lcnJvciA9IGVycm9yXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtvYmplY3R9IFthcmdzXSAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmluY2x1ZGVFcnJvckhlYWRlcl0gLSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGBFcnJvcjogLi4uYCBoZWFkZXIgbGluZS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBUaGUgY2xlYW5lZCBzdGFjay5cbiAgICovXG4gIGdldENsZWFuZWRTdGFjayh7aW5jbHVkZUVycm9ySGVhZGVyID0gdHJ1ZX0gPSB7fSkge1xuICAgIGNvbnN0IGJhY2t0cmFjZSA9IHRoaXMuZ2V0Q2xlYW5lZFN0YWNrTGluZXMoKVxuXG4gICAgaWYgKCFiYWNrdHJhY2UgfHwgYmFja3RyYWNlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgaWYgKGluY2x1ZGVFcnJvckhlYWRlcikgcmV0dXJuIGJhY2t0cmFjZS5qb2luKFwiXFxuXCIpXG5cbiAgICBjb25zdCBmaXJzdExpbmUgPSBiYWNrdHJhY2VbMF1cbiAgICBjb25zdCByZW1haW5pbmdMaW5lcyA9IHRoaXMuaXNFcnJvckhlYWRlckxpbmUoZmlyc3RMaW5lKSA/IGJhY2t0cmFjZS5zbGljZSgxKSA6IGJhY2t0cmFjZVxuXG4gICAgaWYgKHJlbWFpbmluZ0xpbmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgcmV0dXJuIHJlbWFpbmluZ0xpbmVzLmpvaW4oXCJcXG5cIilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7c3RyaW5nW10gfCB1bmRlZmluZWR9IC0gRmlsdGVyZWQgc3RhY2sgbGluZXMuXG4gICAqL1xuICBnZXRDbGVhbmVkU3RhY2tMaW5lcygpIHtcbiAgICBjb25zdCBiYWNrdHJhY2UgPSB0aGlzLmVycm9yPy5zdGFjaz8uc3BsaXQoXCJcXG5cIilcblxuICAgIHJldHVybiBiYWNrdHJhY2U/LmZpbHRlcigobGluZSkgPT4gdGhpcy5fc2hvdWxkS2VlcFN0YWNrTGluZShsaW5lKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hcHBsaWNhdGlvbkRpcmVjdG9yeSAtIEFwcGxpY2F0aW9uIGRpcmVjdG9yeS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gLSBTb3VyY2UgbGluZSBmb3IgdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGZyYW1lLlxuICAgKi9cbiAgZ2V0QXBwbGljYXRpb25Tb3VyY2VMaW5lKHthcHBsaWNhdGlvbkRpcmVjdG9yeX0pIHtcbiAgICBjb25zdCBub3JtYWxpemVkQXBwbGljYXRpb25EaXJlY3RvcnkgPSBub3JtYWxpemVEaXJlY3RvcnkoYXBwbGljYXRpb25EaXJlY3RvcnkpXG5cbiAgICBpZiAoIW5vcm1hbGl6ZWRBcHBsaWNhdGlvbkRpcmVjdG9yeSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgZnJhbWUgPSB0aGlzLl9maXJzdEFwcGxpY2F0aW9uRnJhbWUobm9ybWFsaXplZEFwcGxpY2F0aW9uRGlyZWN0b3J5KVxuXG4gICAgaWYgKCFmcmFtZSkgcmV0dXJuIHVuZGVmaW5lZFxuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVBcHBsaWNhdGlvblBhdGgoZnJhbWUuc291cmNlUGF0aCwgbm9ybWFsaXplZEFwcGxpY2F0aW9uRGlyZWN0b3J5KVxuICAgIGNvbnN0IG1ldGhvZFN1ZmZpeCA9IGZyYW1lLm1ldGhvZE5hbWUgPyBgOmluICR7ZnJhbWUubWV0aG9kTmFtZS5yZXBsYWNlKC9eYXN5bmMgLywgXCJcIil9YCA6IFwiXCJcblxuICAgIHJldHVybiBgJHtyZWxhdGl2ZVBhdGh9OiR7ZnJhbWUubGluZU51bWJlcn0ke21ldGhvZFN1ZmZpeH1gXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGxpbmUgLSBCYWNrdHJhY2UgbGluZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSB3aGVuIHRoZSBsaW5lIGlzIGFuIGVycm9yIGhlYWRlci5cbiAgICovXG4gIGlzRXJyb3JIZWFkZXJMaW5lKGxpbmUpIHtcbiAgICBpZiAoIWxpbmUpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgdHJpbW1lZExpbmUgPSBsaW5lLnRyaW0oKVxuXG4gICAgaWYgKCF0cmltbWVkTGluZSkgcmV0dXJuIGZhbHNlXG5cbiAgICBpZiAodHJpbW1lZExpbmUuc3RhcnRzV2l0aChcIkVycm9yOlwiKSkgcmV0dXJuIHRydWVcblxuICAgIGNvbnN0IGVycm9yTmFtZVBhdHRlcm4gPSBuZXcgUmVnRXhwKGBeJHtlc2NhcGVSZWdFeHAodGhpcy5lcnJvci5uYW1lKX0oPzpcXFxccypcXFxcW1teXFxcXF1dK1xcXFxdKT86YClcblxuICAgIHJldHVybiBlcnJvck5hbWVQYXR0ZXJuLnRlc3QodHJpbW1lZExpbmUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGxpY2F0aW9uRGlyZWN0b3J5IC0gTm9ybWFsaXplZCBhcHBsaWNhdGlvbiBkaXJlY3RvcnkuXG4gICAqIEByZXR1cm5zIHtQYXJzZWRTdGFja0ZyYW1lIHwgdW5kZWZpbmVkfSAtIEZpcnN0IGFwcC1vd25lZCBmcmFtZS5cbiAgICovXG4gIF9maXJzdEFwcGxpY2F0aW9uRnJhbWUoYXBwbGljYXRpb25EaXJlY3RvcnkpIHtcbiAgICBjb25zdCBiYWNrdHJhY2UgPSB0aGlzLmdldENsZWFuZWRTdGFja0xpbmVzKClcblxuICAgIGlmICghYmFja3RyYWNlKSByZXR1cm4gdW5kZWZpbmVkXG5cbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmFja3RyYWNlKSB7XG4gICAgICBjb25zdCBmcmFtZSA9IHBhcnNlU3RhY2tGcmFtZShsaW5lKVxuXG4gICAgICBpZiAoIWZyYW1lKSBjb250aW51ZVxuICAgICAgaWYgKCFmcmFtZS5zb3VyY2VQYXRoLnN0YXJ0c1dpdGgoYXBwbGljYXRpb25EaXJlY3RvcnkpKSBjb250aW51ZVxuICAgICAgaWYgKHRoaXMuX2ZyYW1ld29ya1NvdXJjZVBhdGgoZnJhbWUuc291cmNlUGF0aCkpIGNvbnRpbnVlXG5cbiAgICAgIHJldHVybiBmcmFtZVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc291cmNlUGF0aCAtIFNvdXJjZSBwYXRoLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRoZSBwYXRoIGJlbG9uZ3MgdG8gVmVsb2Npb3VzIGludGVybmFscy5cbiAgICovXG4gIF9mcmFtZXdvcmtTb3VyY2VQYXRoKHNvdXJjZVBhdGgpIHtcbiAgICBpZiAoIUZSQU1FV09SS19TT1VSQ0VfRElSRUNUT1JZKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBzb3VyY2VQYXRoLnN0YXJ0c1dpdGgoRlJBTUVXT1JLX1NPVVJDRV9ESVJFQ1RPUlkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpbmUgLSBTdGFjayBsaW5lLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHRvIGtlZXAgdGhlIHN0YWNrIGxpbmUuXG4gICAqL1xuICBfc2hvdWxkS2VlcFN0YWNrTGluZShsaW5lKSB7XG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoXCJub2RlX21vZHVsZXNcIikpIHJldHVybiBmYWxzZVxuICAgIGlmIChsaW5lLmluY2x1ZGVzKFwiKG5vZGU6aW50ZXJuYWwvXCIpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobGluZS5pbmNsdWRlcyhcIihub2RlOmludGVybmFsL3Byb2Nlc3MvXCIpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aChcImF0IG5vZGU6aW50ZXJuYWwvXCIpKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cbiJdfQ==
|