238 lines
26 KiB
Plaintext
238 lines
26 KiB
Plaintext
/* _processed_nuxt_unctx_transform */
|
|
import { executeAsync as __executeAsync } from "/_nuxt/node_modules/unctx/dist/index.mjs?v=e4f18c29";import {
|
|
useGetInitialAuthState,
|
|
useOnAuthStateChange
|
|
} from "/_nuxt/lib/auth/composables/auth.ts";
|
|
import { useCreateLoggingTransport } from "/_nuxt/lib/core/composables/error.ts";
|
|
import { isH3Error } from "/_nuxt/lib/common/helpers/error.ts";
|
|
import { useRequestId, useServerRequestId } from "/_nuxt/lib/core/composables/server.ts";
|
|
import { isBrave, isSafari } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { isString } from "/_nuxt/node_modules/.cache/vite/client/deps/lodash-es.js?v=e4f18c29";
|
|
|
|
import { useRouter } from "/_nuxt/node_modules/nuxt/dist/app/composables/router.js?v=e4f18c29";
|
|
import { getRouteDefinition } from "/_nuxt/utils/globals.ts";
|
|
import { useRuntimeConfig, defineNuxtPlugin } from "/_nuxt/node_modules/nuxt/dist/app/nuxt.js?v=e4f18c29";
|
|
import { useLogger } from "/_nuxt/composables/logging.ts";
|
|
function initRumClient(app) {
|
|
const { keys } = resolveInitParams(app);
|
|
const router = useRouter();
|
|
const onAuthStateChange = useOnAuthStateChange();
|
|
const registerErrorTransport = useCreateLoggingTransport();
|
|
const reqId = useRequestId();
|
|
const datadog = window.DD_RUM;
|
|
if (keys.datadog && datadog) {
|
|
datadog.onReady(async () => {
|
|
if ("setGlobalContextProperty" in datadog && reqId?.length) {
|
|
datadog.setGlobalContextProperty("requestId", reqId);
|
|
if (isSafari()) {
|
|
datadog.setGlobalContextProperty("isSafari", "true");
|
|
}
|
|
if (isBrave()) {
|
|
datadog.setGlobalContextProperty("isBrave", "true");
|
|
}
|
|
}
|
|
await onAuthStateChange(
|
|
(user, { resolveDistinctId }) => {
|
|
const distinctId = resolveDistinctId(user);
|
|
if (!datadog || !("setUser" in datadog)) return;
|
|
if (distinctId && user) {
|
|
datadog.setUser({
|
|
id: distinctId
|
|
});
|
|
} else {
|
|
datadog.clearUser();
|
|
}
|
|
},
|
|
{ immediate: true }
|
|
);
|
|
router.beforeEach((to) => {
|
|
const pathDefinition = getRouteDefinition(to);
|
|
const routeName = to.meta.datadogName || pathDefinition;
|
|
const realPath = to.path;
|
|
window.DD_RUM_START_VIEW?.(realPath, routeName);
|
|
});
|
|
const resolveH3Data = (error) => error && isH3Error(error) ? {
|
|
statusCode: error.statusCode,
|
|
fatal: error.fatal,
|
|
statusMessage: error.statusMessage,
|
|
h3Data: error.data
|
|
} : {};
|
|
registerErrorTransport({
|
|
onLog: ({ args, firstError, firstString, otherData, nonObjectOtherData, level }, { prettifyMessage }) => {
|
|
if (!datadog || !("addError" in datadog) || !["error", "fatal"].includes(level))
|
|
return;
|
|
let error = firstError || firstString || args[0];
|
|
const mainErrorMessageTemplate = firstString;
|
|
const mainErrorMessage = mainErrorMessageTemplate ? prettifyMessage(mainErrorMessageTemplate) : void 0;
|
|
if (isString(error)) {
|
|
error = prettifyMessage(error);
|
|
}
|
|
datadog.addError(error, {
|
|
...otherData,
|
|
...resolveH3Data(firstError),
|
|
extraData: nonObjectOtherData,
|
|
mainErrorMessageTemplate,
|
|
mainErrorMessage,
|
|
isProperlySentError: true
|
|
});
|
|
},
|
|
onUnhandledError: ({ isUnhandledRejection, error, message }) => {
|
|
if (!datadog || !("addError" in datadog)) return;
|
|
datadog.addError(error || message, {
|
|
...resolveH3Data(error),
|
|
isUnhandledRejection,
|
|
message,
|
|
mainErrorMessage: message,
|
|
isProperlySentError: true
|
|
});
|
|
}
|
|
});
|
|
});
|
|
}
|
|
}
|
|
async function initRumServer(app) {
|
|
const { keys, baseUrl, speckleServerVersion, debugCoreWebVitals } = resolveInitParams(app);
|
|
const initUser = useGetInitialAuthState();
|
|
if (debugCoreWebVitals) {
|
|
app.hook("app:rendered", (context) => {
|
|
context.ssrContext.head.push({
|
|
script: [
|
|
{
|
|
innerHTML: `
|
|
new PerformanceObserver((list) => {
|
|
const entries = list.getEntries();
|
|
const last = entries[entries.length - 1];
|
|
// last.startTime is your current LCP candidate time
|
|
console.log('LCP candidate:', last.startTime, last);
|
|
}).observe({ type: 'largest-contentful-paint', buffered: true });
|
|
`,
|
|
type: "module"
|
|
},
|
|
{
|
|
innerHTML: `
|
|
import {
|
|
onCLS,
|
|
onLCP,
|
|
onINP,
|
|
onTTFB
|
|
} from 'https://unpkg.com/web-vitals@5/dist/web-vitals.attribution.js?module';
|
|
|
|
onCLS(console.log);
|
|
onLCP(console.log);
|
|
onINP(console.log);
|
|
onTTFB(console.log);
|
|
`,
|
|
type: "module"
|
|
}
|
|
]
|
|
});
|
|
});
|
|
}
|
|
if (keys.datadog) {
|
|
const {
|
|
datadogAppId,
|
|
datadogClientToken,
|
|
datadogSite,
|
|
datadogService,
|
|
datadogEnv
|
|
} = keys.datadog;
|
|
const { distinctId } = await initUser();
|
|
app.hook("app:rendered", (context) => {
|
|
const serverReqId = useServerRequestId();
|
|
const route = app._route;
|
|
const pathDefinition = getRouteDefinition(route);
|
|
const pathReal = route.path;
|
|
const routeName = route.meta.datadogName || pathDefinition;
|
|
context.ssrContext.head.push({
|
|
script: [
|
|
{
|
|
innerHTML: `
|
|
(function(h,o,u,n,d) {
|
|
h=h[d]=h[d]||{q:[],onReady:function(c){h.q.push(c)}}
|
|
d=o.createElement(u);d.async=1;d.src=n
|
|
n=o.getElementsByTagName(u)[0];n.parentNode.insertBefore(d,n)
|
|
})(window,document,'script','https://www.datadoghq-browser-agent.com/eu1/v5/datadog-rum.js','DD_RUM')
|
|
window.DD_RUM.onReady(function() {
|
|
` + (distinctId ? `window.DD_RUM.setUser({ id: '${distinctId}' });` : "") + `
|
|
window.DD_RUM.setGlobalContextProperty('serverBaseUrl', '${baseUrl}');
|
|
|
|
` + (serverReqId.value ? `window.DD_RUM.setGlobalContextProperty('serverRequestId', '${serverReqId.value}');` : "") + `
|
|
|
|
window.DD_RUM.init({
|
|
clientToken: '${datadogClientToken}',
|
|
applicationId: '${datadogAppId}',
|
|
site: '${datadogSite}',
|
|
service: '${datadogService}',
|
|
env: '${datadogEnv || "unknown"}',
|
|
version: '${speckleServerVersion}',
|
|
sessionSampleRate: 100,
|
|
sessionReplaySampleRate: 0,
|
|
trackUserInteractions: true,
|
|
trackResources: true,
|
|
trackLongTasks: true,
|
|
defaultPrivacyLevel: 'mask-user-input',
|
|
trackViewsManually: true,
|
|
beforeSend: (event) => {
|
|
if (event?.type === 'error') {
|
|
if (!event.context?.isProperlySentError) return false
|
|
delete event.context.isProperlySentError
|
|
}
|
|
return true
|
|
}
|
|
});
|
|
|
|
window.DD_RUM_START_VIEW = (path, name) => {
|
|
if (window.DD_RUM_REGISTERED_PATH === path) return
|
|
|
|
window.DD_RUM_REGISTERED_PATH = path
|
|
window.DD_RUM.startView({
|
|
name
|
|
})
|
|
console.debug('DDR Started view: ' + name)
|
|
}
|
|
window.DD_RUM_START_VIEW('${pathReal}', '${routeName}')
|
|
})
|
|
`
|
|
}
|
|
]
|
|
});
|
|
});
|
|
}
|
|
}
|
|
function resolveInitParams(app) {
|
|
const {
|
|
public: {
|
|
speckleServerVersion,
|
|
logCsrEmitProps,
|
|
baseUrl,
|
|
debugCoreWebVitals,
|
|
datadogClientToken,
|
|
datadogAppId,
|
|
datadogSite,
|
|
datadogService,
|
|
datadogEnv
|
|
}
|
|
} = useRuntimeConfig();
|
|
const logger = useLogger();
|
|
const datadog = datadogClientToken?.length && datadogAppId?.length && datadogSite?.length && datadogService?.length && datadogEnv?.length ? { datadogClientToken, datadogAppId, datadogSite, datadogService, datadogEnv } : null;
|
|
const shouldDebugCoreWebVitals = debugCoreWebVitals || app._route?.query.cwv === "1";
|
|
return {
|
|
keys: {
|
|
datadog
|
|
},
|
|
speckleServerVersion,
|
|
baseUrl,
|
|
debug: logCsrEmitProps && true,
|
|
debugCoreWebVitals: shouldDebugCoreWebVitals,
|
|
logger
|
|
};
|
|
}
|
|
export default defineNuxtPlugin(async (app) => {let __temp, __restore;
|
|
if (false) {
|
|
;(([__temp,__restore]=__executeAsync(()=>initRumServer(app))),await __temp,__restore());;
|
|
} else {
|
|
initRumClient(app);
|
|
}
|
|
},1);
|
|
|
|
//# sourceMappingURL=data:application/json;base64,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SUFDdEMsb0JBQW9CO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxlQUFlLGlCQUFpQixPQUFPLFFBQVE7QUFDN0MsTUFBSSxLQUFZLEVBQVE7QUFDdEIsNkNBQU0sY0FBYyxHQUFHO0FBQUEsRUFDekIsT0FBTztBQUNMLGtCQUFjLEdBQUc7QUFBQSxFQUNuQjtBQUNGLEdBQUMiLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbIjAyMC1ydW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICB1c2VHZXRJbml0aWFsQXV0aFN0YXRlLFxyXG4gIHVzZU9uQXV0aFN0YXRlQ2hhbmdlXHJcbn0gZnJvbSAnfi9saWIvYXV0aC9jb21wb3NhYmxlcy9hdXRoJ1xyXG5pbXBvcnQgeyB1c2VDcmVhdGVMb2dnaW5nVHJhbnNwb3J0IH0gZnJvbSAnfi9saWIvY29yZS9jb21wb3NhYmxlcy9lcnJvcidcclxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICcjYXBwJ1xyXG5pbXBvcnQgeyBpc0gzRXJyb3IgfSBmcm9tICd+L2xpYi9jb21tb24vaGVscGVycy9lcnJvcidcclxuaW1wb3J0IHsgdXNlUmVxdWVzdElkLCB1c2VTZXJ2ZXJSZXF1ZXN0SWQgfSBmcm9tICd+L2xpYi9jb3JlL2NvbXBvc2FibGVzL3NlcnZlcidcclxuaW1wb3J0IHsgaXNCcmF2ZSwgaXNTYWZhcmkgfSBmcm9tICdAc3BlY2tsZS9zaGFyZWQnXHJcbmltcG9ydCB7IGlzU3RyaW5nIH0gZnJvbSAnbG9kYXNoLWVzJ1xyXG5cclxudHlwZSBQbHVnaW5OdXh0QXBwID0gUGFyYW1ldGVyczxQbHVnaW4+WzBdXHJcblxyXG5mdW5jdGlvbiBpbml0UnVtQ2xpZW50KGFwcDogUGx1Z2luTnV4dEFwcCkge1xyXG4gIGNvbnN0IHsga2V5cyB9ID0gcmVzb2x2ZUluaXRQYXJhbXMoYXBwKVxyXG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpXHJcbiAgY29uc3Qgb25BdXRoU3RhdGVDaGFuZ2UgPSB1c2VPbkF1dGhTdGF0ZUNoYW5nZSgpXHJcbiAgY29uc3QgcmVnaXN0ZXJFcnJvclRyYW5zcG9ydCA9IHVzZUNyZWF0ZUxvZ2dpbmdUcmFuc3BvcnQoKVxyXG4gIGNvbnN0IHJlcUlkID0gdXNlUmVxdWVzdElkKClcclxuXHJcbiAgLy8gRGF0YWRvZ1xyXG4gIGNvbnN0IGRhdGFkb2cgPSB3aW5kb3cuRERfUlVNXHJcbiAgaWYgKGtleXMuZGF0YWRvZyAmJiBkYXRhZG9nKSB7XHJcbiAgICBkYXRhZG9nLm9uUmVhZHkoYXN5bmMgKCkgPT4ge1xyXG4gICAgICBpZiAoJ3NldEdsb2JhbENvbnRleHRQcm9wZXJ0eScgaW4gZGF0YWRvZyAmJiByZXFJZD8ubGVuZ3RoKSB7XHJcbiAgICAgICAgZGF0YWRvZy5zZXRHbG9iYWxDb250ZXh0UHJvcGVydHkoJ3JlcXVlc3RJZCcsIHJlcUlkKVxyXG5cclxuICAgICAgICBpZiAoaXNTYWZhcmkoKSkge1xyXG4gICAgICAgICAgZGF0YWRvZy5zZXRHbG9iYWxDb250ZXh0UHJvcGVydHkoJ2lzU2FmYXJpJywgJ3RydWUnKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlzQnJhdmUoKSkge1xyXG4gICAgICAgICAgZGF0YWRvZy5zZXRHbG9iYWxDb250ZXh0UHJvcGVydHkoJ2lzQnJhdmUnLCAndHJ1ZScpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICBhd2FpdCBvbkF1dGhTdGF0ZUNoYW5nZShcclxuICAgICAgICAodXNlciwgeyByZXNvbHZlRGlzdGluY3RJZCB9KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBkaXN0aW5jdElkID0gcmVzb2x2ZURpc3RpbmN0SWQodXNlcilcclxuICAgICAgICAgIC8vIHNldFVzZXIgbWlnaHQgbm90IGJlIHRoZXJlLCBpZiBibG9ja2VkIGJ5IGFkYmxvY2tcclxuICAgICAgICAgIGlmICghZGF0YWRvZyB8fCAhKCdzZXRVc2VyJyBpbiBkYXRhZG9nKSkgcmV0dXJuXHJcblxyXG4gICAgICAgICAgaWYgKGRpc3RpbmN0SWQgJiYgdXNlcikge1xyXG4gICAgICAgICAgICBkYXRhZG9nLnNldFVzZXIoe1xyXG4gICAgICAgICAgICAgIGlkOiBkaXN0aW5jdElkXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkYXRhZG9nLmNsZWFyVXNlcigpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGltbWVkaWF0ZTogdHJ1ZSB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIHJvdXRlci5iZWZvcmVFYWNoKCh0bykgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhdGhEZWZpbml0aW9uID0gZ2V0Um91dGVEZWZpbml0aW9uKHRvKVxyXG4gICAgICAgIGNvbnN0IHJvdXRlTmFtZSA9ICh0by5tZXRhLmRhdGFkb2dOYW1lIHx8IHBhdGhEZWZpbml0aW9uKSBhcyBzdHJpbmdcclxuICAgICAgICBjb25zdCByZWFsUGF0aCA9IHRvLnBhdGhcclxuXHJcbiAgICAgICAgd2luZG93LkREX1JVTV9TVEFSVF9WSUVXPy4ocmVhbFBhdGgsIHJvdXRlTmFtZSlcclxuICAgICAgfSlcclxuXHJcbiAgICAgIGNvbnN0IHJlc29sdmVIM0RhdGEgPSAoZXJyb3I6IHVua25vd24pID0+XHJcbiAgICAgICAgZXJyb3IgJiYgaXNIM0Vycm9yKGVycm9yKVxyXG4gICAgICAgICAgPyB7XHJcbiAgICAgICAgICAgICAgc3RhdHVzQ29kZTogZXJyb3Iuc3RhdHVzQ29kZSxcclxuICAgICAgICAgICAgICBmYXRhbDogZXJyb3IuZmF0YWwsXHJcbiAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogZXJyb3Iuc3RhdHVzTWVzc2FnZSxcclxuICAgICAgICAgICAgICBoM0RhdGE6IGVycm9yLmRhdGFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgOiB7fVxyXG5cclxuICAgICAgcmVnaXN0ZXJFcnJvclRyYW5zcG9ydCh7XHJcbiAgICAgICAgb25Mb2c6IChcclxuICAgICAgICAgIHsgYXJncywgZmlyc3RFcnJvciwgZmlyc3RTdHJpbmcsIG90aGVyRGF0YSwgbm9uT2JqZWN0T3RoZXJEYXRhLCBsZXZlbCB9LFxyXG4gICAgICAgICAgeyBwcmV0dGlmeU1lc3NhZ2UgfVxyXG4gICAgICAgICkgPT4ge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhZGF0YWRvZyB8fFxyXG4gICAgICAgICAgICAhKCdhZGRFcnJvcicgaW4gZGF0YWRvZykgfHxcclxuICAgICAgICAgICAgIVsnZXJyb3InLCAnZmF0YWwnXS5pbmNsdWRlcyhsZXZlbClcclxuICAgICAgICAgIClcclxuICAgICAgICAgICAgcmV0dXJuXHJcblxyXG4gICAgICAgICAgbGV0IGVycm9yID0gZmlyc3RFcnJvciB8fCBmaXJzdFN0cmluZyB8fCBhcmdzWzBdXHJcbiAgICAgICAgICBjb25zdCBtYWluRXJyb3JNZXNzYWdlVGVtcGxhdGUgPSBmaXJzdFN0cmluZ1xyXG4gICAgICAgICAgY29uc3QgbWFpbkVycm9yTWVzc2FnZSA9IG1haW5FcnJvck1lc3NhZ2VUZW1wbGF0ZVxyXG4gICAgICAgICAgICA/IHByZXR0aWZ5TWVzc2FnZShtYWluRXJyb3JNZXNzYWdlVGVtcGxhdGUpXHJcbiAgICAgICAgICAgIDogdW5kZWZpbmVkXHJcblxyXG4gICAgICAgICAgaWYgKGlzU3RyaW5nKGVycm9yKSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IHByZXR0aWZ5TWVzc2FnZShlcnJvcilcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBkYXRhZG9nLmFkZEVycm9yKGVycm9yLCB7XHJcbiAgICAgICAgICAgIC4uLm90aGVyRGF0YSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZUgzRGF0YShmaXJzdEVycm9yKSxcclxuICAgICAgICAgICAgZXh0cmFEYXRhOiBub25PYmplY3RPdGhlckRhdGEsXHJcbiAgICAgICAgICAgIG1haW5FcnJvck1lc3NhZ2VUZW1wbGF0ZSxcclxuICAgICAgICAgICAgbWFpbkVycm9yTWVzc2FnZSxcclxuICAgICAgICAgICAgaXNQcm9wZXJseVNlbnRFcnJvcjogdHJ1ZVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9LFxyXG4gICAgICAgIG9uVW5oYW5kbGVkRXJyb3I6ICh7IGlzVW5oYW5kbGVkUmVqZWN0aW9uLCBlcnJvciwgbWVzc2FnZSB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAoIWRhdGFkb2cgfHwgISgnYWRkRXJyb3InIGluIGRhdGFkb2cpKSByZXR1cm5cclxuXHJcbiAgICAgICAgICBkYXRhZG9nLmFkZEVycm9yKGVycm9yIHx8IG1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZUgzRGF0YShlcnJvciksXHJcbiAgICAgICAgICAgIGlzVW5oYW5kbGVkUmVqZWN0aW9uLFxyXG4gICAgICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgICAgICBtYWluRXJyb3JNZXNzYWdlOiBtZXNzYWdlLFxyXG4gICAgICAgICAgICBpc1Byb3Blcmx5U2VudEVycm9yOiB0cnVlXHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgfVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBpbml0UnVtU2VydmVyKGFwcDogUGx1Z2luTnV4dEFwcCkge1xyXG4gIGNvbnN0IHsga2V5cywgYmFzZVVybCwgc3BlY2tsZVNlcnZlclZlcnNpb24sIGRlYnVnQ29yZVdlYlZpdGFscyB9ID1cclxuICAgIHJlc29sdmVJbml0UGFyYW1zKGFwcClcclxuICBjb25zdCBpbml0VXNlciA9IHVzZUdldEluaXRpYWxBdXRoU3RhdGUoKVxyXG5cclxuICAvLyBDV1ZcclxuICBpZiAoZGVidWdDb3JlV2ViVml0YWxzKSB7XHJcbiAgICBhcHAuaG9vaygnYXBwOnJlbmRlcmVkJywgKGNvbnRleHQpID0+IHtcclxuICAgICAgY29udGV4dC5zc3JDb250ZXh0IS5oZWFkLnB1c2goe1xyXG4gICAgICAgIHNjcmlwdDogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICBpbm5lckhUTUw6IGBcclxuICAgICAgICAgICAgICBuZXcgUGVyZm9ybWFuY2VPYnNlcnZlcigobGlzdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZW50cmllcyA9IGxpc3QuZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IGVudHJpZXNbZW50cmllcy5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgIC8vIGxhc3Quc3RhcnRUaW1lIGlzIHlvdXIgY3VycmVudCBMQ1AgY2FuZGlkYXRlIHRpbWVcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdMQ1AgY2FuZGlkYXRlOicsIGxhc3Quc3RhcnRUaW1lLCBsYXN0KTtcclxuICAgICAgICAgICAgICB9KS5vYnNlcnZlKHsgdHlwZTogJ2xhcmdlc3QtY29udGVudGZ1bC1wYWludCcsIGJ1ZmZlcmVkOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICBgLFxyXG4gICAgICAgICAgICB0eXBlOiAnbW9kdWxlJ1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgaW5uZXJIVE1MOiBgXHJcbiAgICAgICAgICAgICAgaW1wb3J0IHtcclxuICAgICAgICAgICAgICAgIG9uQ0xTLFxyXG4gICAgICAgICAgICAgICAgb25MQ1AsXHJcbiAgICAgICAgICAgICAgICBvbklOUCxcclxuICAgICAgICAgICAgICAgIG9uVFRGQlxyXG4gICAgICAgICAgICAgIH0gZnJvbSAnaHR0cHM6Ly91bnBrZy5jb20vd2ViLXZpdGFsc0A1L2Rpc3Qvd2ViLXZpdGFscy5hdHRyaWJ1dGlvbi5qcz9tb2R1bGUnO1xyXG5cclxuICAgICAgICAgICAgICBvbkNMUyhjb25zb2xlLmxvZyk7XHJcbiAgICAgICAgICAgICAgb25MQ1AoY29uc29sZS5sb2cpO1xyXG4gICAgICAgICAgICAgIG9uSU5QKGNvbnNvbGUubG9nKTtcclxuICAgICAgICAgICAgICBvblRURkIoY29uc29sZS5sb2cpO1xyXG4gICAgICAgICAgICAgIGAsXHJcbiAgICAgICAgICAgIHR5cGU6ICdtb2R1bGUnXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIC8vIERhdGFkb2dcclxuICBpZiAoa2V5cy5kYXRhZG9nKSB7XHJcbiAgICBjb25zdCB7XHJcbiAgICAgIGRhdGFkb2dBcHBJZCxcclxuICAgICAgZGF0YWRvZ0NsaWVudFRva2VuLFxyXG4gICAgICBkYXRhZG9nU2l0ZSxcclxuICAgICAgZGF0YWRvZ1NlcnZpY2UsXHJcbiAgICAgIGRhdGFkb2dFbnZcclxuICAgIH0gPSBrZXlzLmRhdGFkb2dcclxuXHJcbiAgICBjb25zdCB7IGRpc3RpbmN0SWQgfSA9IGF3YWl0IGluaXRVc2VyKClcclxuXHJcbiAgICBhcHAuaG9vaygnYXBwOnJlbmRlcmVkJywgKGNvbnRleHQpID0+IHtcclxuICAgICAgY29uc3Qgc2VydmVyUmVxSWQgPSB1c2VTZXJ2ZXJSZXF1ZXN0SWQoKVxyXG4gICAgICBjb25zdCByb3V0ZSA9IGFwcC5fcm91dGVcclxuICAgICAgY29uc3QgcGF0aERlZmluaXRpb24gPSBnZXRSb3V0ZURlZmluaXRpb24ocm91dGUpXHJcbiAgICAgIGNvbnN0IHBhdGhSZWFsID0gcm91dGUucGF0aFxyXG4gICAgICBjb25zdCByb3V0ZU5hbWUgPSByb3V0ZS5tZXRhLmRhdGFkb2dOYW1lIHx8IHBhdGhEZWZpbml0aW9uXHJcblxyXG4gICAgICBjb250ZXh0LnNzckNvbnRleHQhLmhlYWQucHVzaCh7XHJcbiAgICAgICAgc2NyaXB0OiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGlubmVySFRNTDpcclxuICAgICAgICAgICAgICBgXHJcbiAgICAgICAgICAgICAgKGZ1bmN0aW9uKGgsbyx1LG4sZCkge1xyXG4gICAgICAgICAgICAgICAgaD1oW2RdPWhbZF18fHtxOltdLG9uUmVhZHk6ZnVuY3Rpb24oYyl7aC5xLnB1c2goYyl9fVxyXG4gICAgICAgICAgICAgICAgZD1vLmNyZWF0ZUVsZW1lbnQodSk7ZC5hc3luYz0xO2Quc3JjPW5cclxuICAgICAgICAgICAgICAgIG49by5nZXRFbGVtZW50c0J5VGFnTmFtZSh1KVswXTtuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGQsbilcclxuICAgICAgICAgICAgICB9KSh3aW5kb3csZG9jdW1lbnQsJ3NjcmlwdCcsJ2h0dHBzOi8vd3d3LmRhdGFkb2docS1icm93c2VyLWFnZW50LmNvbS9ldTEvdjUvZGF0YWRvZy1ydW0uanMnLCdERF9SVU0nKVxyXG4gICAgICAgICAgICAgIHdpbmRvdy5ERF9SVU0ub25SZWFkeShmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgIGAgK1xyXG4gICAgICAgICAgICAgIChkaXN0aW5jdElkID8gYHdpbmRvdy5ERF9SVU0uc2V0VXNlcih7IGlkOiAnJHtkaXN0aW5jdElkfScgfSk7YCA6ICcnKSArXHJcbiAgICAgICAgICAgICAgYFxyXG4gICAgICAgICAgICAgICAgd2luZG93LkREX1JVTS5zZXRHbG9iYWxDb250ZXh0UHJvcGVydHkoJ3NlcnZlckJhc2VVcmwnLCAnJHtiYXNlVXJsfScpO1xyXG5cclxuICAgICAgICAgICAgICAgIGAgK1xyXG4gICAgICAgICAgICAgIChzZXJ2ZXJSZXFJZC52YWx1ZVxyXG4gICAgICAgICAgICAgICAgPyBgd2luZG93LkREX1JVTS5zZXRHbG9iYWxDb250ZXh0UHJvcGVydHkoJ3NlcnZlclJlcXVlc3RJZCcsICcke3NlcnZlclJlcUlkLnZhbHVlfScpO2BcclxuICAgICAgICAgICAgICAgIDogJycpICtcclxuICAgICAgICAgICAgICBgXHJcblxyXG4gICAgICAgICAgICAgICAgd2luZG93LkREX1JVTS5pbml0KHtcclxuICAgICAgICAgICAgICAgICAgY2xpZW50VG9rZW46ICcke2RhdGFkb2dDbGllbnRUb2tlbn0nLFxyXG4gICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbklkOiAnJHtkYXRhZG9nQXBwSWR9JyxcclxuICAgICAgICAgICAgICAgICAgc2l0ZTogJyR7ZGF0YWRvZ1NpdGV9JyxcclxuICAgICAgICAgICAgICAgICAgc2VydmljZTogJyR7ZGF0YWRvZ1NlcnZpY2V9JyxcclxuICAgICAgICAgICAgICAgICAgZW52OiAnJHtkYXRhZG9nRW52IHx8ICd1bmtub3duJ30nLFxyXG4gICAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnJHtzcGVja2xlU2VydmVyVmVyc2lvbn0nLCBcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvblNhbXBsZVJhdGU6IDEwMCxcclxuICAgICAgICAgICAgICAgICAgc2Vzc2lvblJlcGxheVNhbXBsZVJhdGU6IDAsXHJcbiAgICAgICAgICAgICAgICAgIHRyYWNrVXNlckludGVyYWN0aW9uczogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgdHJhY2tSZXNvdXJjZXM6IHRydWUsXHJcbiAgICAgICAgICAgICAgICAgIHRyYWNrTG9uZ1Rhc2tzOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBkZWZhdWx0UHJpdmFjeUxldmVsOiAnbWFzay11c2VyLWlucHV0JyxcclxuICAgICAgICAgICAgICAgICAgdHJhY2tWaWV3c01hbnVhbGx5OiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICBiZWZvcmVTZW5kOiAoZXZlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQ/LnR5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQuY29udGV4dD8uaXNQcm9wZXJseVNlbnRFcnJvcikgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXZlbnQuY29udGV4dC5pc1Byb3Blcmx5U2VudEVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlIFxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB3aW5kb3cuRERfUlVNX1NUQVJUX1ZJRVcgPSAocGF0aCwgbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAod2luZG93LkREX1JVTV9SRUdJU1RFUkVEX1BBVEggPT09IHBhdGgpIHJldHVyblxyXG5cclxuICAgICAgICAgICAgICAgICAgd2luZG93LkREX1JVTV9SRUdJU1RFUkVEX1BBVEggPSBwYXRoXHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5ERF9SVU0uc3RhcnRWaWV3KHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lXHJcbiAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0REUiBTdGFydGVkIHZpZXc6ICcgKyBuYW1lKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2luZG93LkREX1JVTV9TVEFSVF9WSUVXKCcke3BhdGhSZWFsfScsICcke3JvdXRlTmFtZX0nKVxyXG4gICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICBgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVJbml0UGFyYW1zKGFwcDogUGx1Z2luTnV4dEFwcCkge1xyXG4gIGNvbnN0IHtcclxuICAgIHB1YmxpYzoge1xyXG4gICAgICBzcGVja2xlU2VydmVyVmVyc2lvbixcclxuICAgICAgbG9nQ3NyRW1pdFByb3BzLFxyXG4gICAgICBiYXNlVXJsLFxyXG4gICAgICBkZWJ1Z0NvcmVXZWJWaXRhbHMsXHJcbiAgICAgIGRhdGFkb2dDbGllbnRUb2tlbixcclxuICAgICAgZGF0YWRvZ0FwcElkLFxyXG4gICAgICBkYXRhZG9nU2l0ZSxcclxuICAgICAgZGF0YWRvZ1NlcnZpY2UsXHJcbiAgICAgIGRhdGFkb2dFbnZcclxuICAgIH1cclxuICB9ID0gdXNlUnVudGltZUNvbmZpZygpXHJcbiAgY29uc3QgbG9nZ2VyID0gdXNlTG9nZ2VyKClcclxuICBjb25zdCBkYXRhZG9nID1cclxuICAgIGRhdGFkb2dDbGllbnRUb2tlbj8ubGVuZ3RoICYmXHJcbiAgICBkYXRhZG9nQXBwSWQ/Lmxlbmd0aCAmJlxyXG4gICAgZGF0YWRvZ1NpdGU/Lmxlbmd0aCAmJlxyXG4gICAgZGF0YWRvZ1NlcnZpY2U/Lmxlbmd0aCAmJlxyXG4gICAgZGF0YWRvZ0Vudj8ubGVuZ3RoXHJcbiAgICAgID8geyBkYXRhZG9nQ2xpZW50VG9rZW4sIGRhdGFkb2dBcHBJZCwgZGF0YWRvZ1NpdGUsIGRhdGFkb2dTZXJ2aWNlLCBkYXRhZG9nRW52IH1cclxuICAgICAgOiBudWxsXHJcblxyXG4gIGNvbnN0IHNob3VsZERlYnVnQ29yZVdlYlZpdGFscyA9IGRlYnVnQ29yZVdlYlZpdGFscyB8fCBhcHAuX3JvdXRlPy5xdWVyeS5jd3YgPT09ICcxJ1xyXG5cclxuICByZXR1cm4ge1xyXG4gICAga2V5czoge1xyXG4gICAgICBkYXRhZG9nXHJcbiAgICB9LFxyXG4gICAgc3BlY2tsZVNlcnZlclZlcnNpb24sXHJcbiAgICBiYXNlVXJsLFxyXG4gICAgZGVidWc6IGxvZ0NzckVtaXRQcm9wcyAmJiBpbXBvcnQubWV0YS5kZXYsXHJcbiAgICBkZWJ1Z0NvcmVXZWJWaXRhbHM6IHNob3VsZERlYnVnQ29yZVdlYlZpdGFscyxcclxuICAgIGxvZ2dlclxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgZGVmaW5lTnV4dFBsdWdpbihhc3luYyAoYXBwKSA9PiB7XHJcbiAgaWYgKGltcG9ydC5tZXRhLnNlcnZlcikge1xyXG4gICAgYXdhaXQgaW5pdFJ1bVNlcnZlcihhcHApXHJcbiAgfSBlbHNlIHtcclxuICAgIGluaXRSdW1DbGllbnQoYXBwKVxyXG4gIH1cclxufSlcclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL3BsdWdpbnMvMDIwLXJ1bS50cyJ9 |