332 lines
40 KiB
Plaintext
332 lines
40 KiB
Plaintext
import { isNullOrUndefined } from "/_nuxt/@fs/D:/speckle-server/packages/shared/dist/esm/index.js";
|
|
import { useApolloClient, useMutation, useSubscription } from "/_nuxt/node_modules/@vue/apollo-composable/dist/index.mjs?v=e4f18c29";
|
|
import { useLock } from "/_nuxt/lib/common/composables/singleton.ts";
|
|
import {
|
|
ProjectAutomationsUpdatedMessageType,
|
|
ProjectTriggeredAutomationsStatusUpdatedMessageType
|
|
} from "/_nuxt/lib/common/generated/gql/graphql.ts";
|
|
import {
|
|
convertThrowIntoFetchResult,
|
|
getCacheId,
|
|
getFirstErrorMessage,
|
|
modifyObjectFields
|
|
} from "/_nuxt/lib/common/helpers/graphql.ts";
|
|
import {
|
|
createAutomationMutation,
|
|
createAutomationRevisionMutation,
|
|
createTestAutomationMutation,
|
|
deleteAutomationMutation,
|
|
triggerAutomationMutation,
|
|
updateAutomationMutation
|
|
} from "/_nuxt/lib/projects/graphql/mutations.ts";
|
|
import {
|
|
onProjectAutomationsUpdatedSubscription,
|
|
onProjectTriggeredAutomationsStatusUpdatedSubscription
|
|
} from "/_nuxt/lib/projects/graphql/subscriptions.ts";
|
|
|
|
import { useActiveUser, useGlobalToast, useIsAutomateModuleEnabled } from "/_nuxt/composables/globals.ts";
|
|
import { ToastNotificationType, modifyObjectField } from "/_nuxt/utils/globals.ts";
|
|
import { computed, unref, ref } from "/_nuxt/node_modules/vue/dist/vue.runtime.esm-bundler.js?v=e4f18c29";
|
|
export function useCreateAutomation() {
|
|
const { activeUser } = useActiveUser();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const { mutate: createAutomation } = useMutation(createAutomationMutation);
|
|
return async (input) => {
|
|
if (!activeUser.value) return;
|
|
const res = await createAutomation(input).catch(convertThrowIntoFetchResult);
|
|
if (res?.data?.projectMutations?.automationMutations?.create?.id) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: "Automation created"
|
|
});
|
|
} else {
|
|
const errMsg = getFirstErrorMessage(res?.errors);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to create automation",
|
|
description: errMsg
|
|
});
|
|
}
|
|
return res?.data?.projectMutations.automationMutations.create;
|
|
};
|
|
}
|
|
export function useDeleteAutomation() {
|
|
const { activeUser } = useActiveUser();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const { client: apollo } = useApolloClient();
|
|
return async (projectId, automationId) => {
|
|
if (!activeUser.value) return;
|
|
const result = await apollo.mutate({
|
|
mutation: deleteAutomationMutation,
|
|
variables: {
|
|
projectId,
|
|
automationId
|
|
},
|
|
update: (cache, res) => {
|
|
const { data } = res;
|
|
if (!data?.projectMutations?.automationMutations?.delete) return;
|
|
modifyObjectField(
|
|
cache,
|
|
getCacheId("Project", projectId),
|
|
"automations",
|
|
({ value, helpers }) => {
|
|
return {
|
|
...value,
|
|
items: value.items?.filter(
|
|
(automation) => helpers.readField(automation, "id") !== automationId
|
|
)
|
|
};
|
|
}
|
|
);
|
|
}
|
|
}).catch(convertThrowIntoFetchResult);
|
|
if (result?.data) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: "Automation deleted"
|
|
});
|
|
} else {
|
|
const errorMessage = getFirstErrorMessage(result?.errors);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to delete automation",
|
|
description: errorMessage
|
|
});
|
|
}
|
|
return result?.data?.projectMutations?.automationMutations?.delete;
|
|
};
|
|
}
|
|
export function useCreateTestAutomation() {
|
|
const { activeUser } = useActiveUser();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const { mutate: createTestAutomation } = useMutation(createTestAutomationMutation);
|
|
return async (input) => {
|
|
if (!activeUser.value) return;
|
|
const res = await createTestAutomation(input).catch(convertThrowIntoFetchResult);
|
|
if (res?.data?.projectMutations?.automationMutations?.createTestAutomation?.id) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: "Test automation created"
|
|
});
|
|
} else {
|
|
const errMsg = getFirstErrorMessage(res?.errors);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to create test automation",
|
|
description: errMsg
|
|
});
|
|
}
|
|
return res?.data?.projectMutations?.automationMutations?.createTestAutomation?.id;
|
|
};
|
|
}
|
|
export function useUpdateAutomation() {
|
|
const { activeUser } = useActiveUser();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const { mutate: updateAutomation } = useMutation(updateAutomationMutation);
|
|
return async (update, options) => {
|
|
const { messages, hideSuccessToast } = options || {};
|
|
if (!activeUser.value) return;
|
|
const result = await updateAutomation(update, {
|
|
optimisticResponse: options?.optimisticResponse
|
|
}).catch(convertThrowIntoFetchResult);
|
|
if (result?.data?.projectMutations.automationMutations.update?.id) {
|
|
if (!hideSuccessToast) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: messages?.success || "Automation updated"
|
|
});
|
|
}
|
|
} else {
|
|
const errMsg = getFirstErrorMessage(result?.errors);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: messages?.failure || "Automation update failed",
|
|
description: errMsg
|
|
});
|
|
}
|
|
return result?.data?.projectMutations.automationMutations.update;
|
|
};
|
|
}
|
|
export function useCreateAutomationRevision() {
|
|
const { activeUser } = useActiveUser();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const { mutate } = useMutation(createAutomationRevisionMutation);
|
|
return async (input, options) => {
|
|
const { hideSuccessToast } = options || {};
|
|
if (!activeUser.value) return;
|
|
const res = await mutate(input).catch(convertThrowIntoFetchResult);
|
|
if (res?.data?.projectMutations?.automationMutations?.createRevision?.id) {
|
|
if (!hideSuccessToast) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: "Automation revision created"
|
|
});
|
|
}
|
|
} else {
|
|
const errMsg = getFirstErrorMessage(res?.errors);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to create automation revision",
|
|
description: errMsg
|
|
});
|
|
}
|
|
return res?.data?.projectMutations?.automationMutations?.createRevision;
|
|
};
|
|
}
|
|
export const useTriggerAutomation = () => {
|
|
const { activeUser } = useActiveUser();
|
|
const { triggerNotification } = useGlobalToast();
|
|
const { mutate } = useMutation(triggerAutomationMutation);
|
|
return async (projectId, automationId) => {
|
|
if (!activeUser.value) return;
|
|
const res = await mutate({
|
|
projectId,
|
|
automationId
|
|
}).catch(convertThrowIntoFetchResult);
|
|
if (res?.data?.projectMutations?.automationMutations?.trigger) {
|
|
triggerNotification({
|
|
type: ToastNotificationType.Success,
|
|
title: "Automation triggered"
|
|
});
|
|
} else {
|
|
const errMsg = getFirstErrorMessage(res?.errors);
|
|
triggerNotification({
|
|
type: ToastNotificationType.Danger,
|
|
title: "Failed to trigger automation",
|
|
description: errMsg
|
|
});
|
|
}
|
|
return res?.data?.projectMutations?.automationMutations?.trigger;
|
|
};
|
|
};
|
|
export const useProjectTriggeredAutomationsStatusUpdateTracking = (params) => {
|
|
const { projectId, handler } = params;
|
|
const apollo = useApolloClient().client;
|
|
const { hasLock } = useLock(
|
|
computed(
|
|
() => `useProjectTriggeredAutomationsStatusUpdateTracking-${unref(projectId)}`
|
|
)
|
|
);
|
|
const isAutomateModuleEnabled = useIsAutomateModuleEnabled();
|
|
const isEnabled = computed(
|
|
() => isAutomateModuleEnabled.value && !!(hasLock.value || handler)
|
|
);
|
|
const { onResult } = useSubscription(
|
|
onProjectTriggeredAutomationsStatusUpdatedSubscription,
|
|
() => ({
|
|
id: unref(projectId)
|
|
}),
|
|
{ enabled: isEnabled, errorPolicy: "all" }
|
|
);
|
|
onResult((res) => {
|
|
const event = res.data?.projectTriggeredAutomationsStatusUpdated;
|
|
if (!event || !hasLock.value) return;
|
|
apollo.cache.modify({
|
|
id: getCacheId("Model", event.model.id),
|
|
fields: {
|
|
automationsStatus: () => event.version.automationsStatus || null
|
|
}
|
|
});
|
|
const run = event?.run;
|
|
if (run && event.type === ProjectTriggeredAutomationsStatusUpdatedMessageType.RunCreated) {
|
|
const automationid = run.automationId;
|
|
const automationCacheId = getCacheId("Automation", automationid);
|
|
modifyObjectFields(
|
|
apollo.cache,
|
|
automationCacheId,
|
|
(_fieldName, vars, data, { ref }) => {
|
|
const limit = vars["limit"];
|
|
let newItems = data["items"];
|
|
if (limit !== 0) {
|
|
if (newItems) {
|
|
newItems = [ref("AutomateRun", run.id), ...newItems];
|
|
}
|
|
}
|
|
let totalCount = data["totalCount"];
|
|
if (!isNullOrUndefined(totalCount)) {
|
|
totalCount++;
|
|
}
|
|
return {
|
|
...data,
|
|
items: newItems,
|
|
totalCount
|
|
};
|
|
},
|
|
{ fieldNameWhitelist: ["runs"] }
|
|
);
|
|
}
|
|
});
|
|
onResult((res) => {
|
|
const event = res.data?.projectTriggeredAutomationsStatusUpdated;
|
|
if (!event) return;
|
|
handler?.(event, apollo.cache);
|
|
});
|
|
};
|
|
export const useProjectAutomationsUpdateTracking = (params) => {
|
|
const { projectId, handler } = params;
|
|
const apollo = useApolloClient().client;
|
|
const { hasLock } = useLock(
|
|
computed(() => `useProjectAutomationsUpdateTracking-${unref(projectId)}`)
|
|
);
|
|
const isAutomateModuleEnabled = useIsAutomateModuleEnabled();
|
|
const isEnabled = computed(
|
|
() => isAutomateModuleEnabled.value && !!(hasLock.value || handler)
|
|
);
|
|
const { onResult } = useSubscription(
|
|
onProjectAutomationsUpdatedSubscription,
|
|
() => ({
|
|
id: unref(projectId)
|
|
}),
|
|
{ enabled: isEnabled, errorPolicy: "all" }
|
|
);
|
|
onResult((res) => {
|
|
const event = res.data?.projectAutomationsUpdated;
|
|
if (!event || !hasLock.value) return;
|
|
const projectCacheId = getCacheId("Project", unref(projectId));
|
|
if (event.type === ProjectAutomationsUpdatedMessageType.Created && event.automation) {
|
|
const newAutomation = event.automation;
|
|
modifyObjectFields(
|
|
apollo.cache,
|
|
projectCacheId,
|
|
(fieldName, vars, _data, { ref }) => {
|
|
if (fieldName !== "automation") return;
|
|
if (vars.id !== newAutomation.id) return;
|
|
return ref("Automation", newAutomation.id);
|
|
}
|
|
);
|
|
modifyObjectFields(
|
|
apollo.cache,
|
|
projectCacheId,
|
|
(_fieldName, vars, data, { ref, DELETE }) => {
|
|
if (vars["filter"]?.length) {
|
|
return DELETE;
|
|
}
|
|
const limit = vars["limit"];
|
|
let newItems = data["items"];
|
|
if (limit !== 0) {
|
|
if (newItems) {
|
|
newItems = [ref("Automation", newAutomation.id), ...newItems];
|
|
}
|
|
}
|
|
let totalCount = data["totalCount"];
|
|
if (!isNullOrUndefined(totalCount)) {
|
|
totalCount++;
|
|
}
|
|
return {
|
|
...data,
|
|
items: newItems,
|
|
totalCount
|
|
};
|
|
},
|
|
{ fieldNameWhitelist: ["automations"] }
|
|
);
|
|
}
|
|
});
|
|
onResult((res) => {
|
|
const event = res.data?.projectAutomationsUpdated;
|
|
if (!event) return;
|
|
handler?.(event, apollo.cache);
|
|
});
|
|
};
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IkFBQ0EsU0FBUyx5QkFBeUI7QUFDbEMsU0FBUyxpQkFBaUIsYUFBYSx1QkFBdUI7QUFFOUQsU0FBUyxlQUFlO0FBQ3hCO0FBQUEsRUFXRTtBQUFBLEVBQ0E7QUFBQSxPQUdLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLOzs7OztBQUVBLGdCQUFTLHNCQUFzQjtBQUNwQyxRQUFNLEVBQUUsV0FBVyxJQUFJLGNBQWM7QUFDckMsUUFBTSxFQUFFLG9CQUFvQixJQUFJLGVBQWU7QUFDL0MsUUFBTSxFQUFFLFFBQVEsaUJBQWlCLElBQUksWUFBWSx3QkFBd0I7QUFFekUsU0FBTyxPQUFPLFVBQTZDO0FBQ3pELFFBQUksQ0FBQyxXQUFXLE1BQU87QUFFdkIsVUFBTSxNQUFNLE1BQU0saUJBQWlCLEtBQUssRUFBRSxNQUFNLDJCQUEyQjtBQUMzRSxRQUFJLEtBQUssTUFBTSxrQkFBa0IscUJBQXFCLFFBQVEsSUFBSTtBQUNoRSwwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNILE9BQU87QUFDTCxZQUFNLFNBQVMscUJBQXFCLEtBQUssTUFBTTtBQUMvQywwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxRQUNQLGFBQWE7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNIO0FBRUEsV0FBTyxLQUFLLE1BQU0saUJBQWlCLG9CQUFvQjtBQUFBLEVBQ3pEO0FBQ0Y7QUFFTyxnQkFBUyxzQkFBc0I7QUFDcEMsUUFBTSxFQUFFLFdBQVcsSUFBSSxjQUFjO0FBQ3JDLFFBQU0sRUFBRSxvQkFBb0IsSUFBSSxlQUFlO0FBQy9DLFFBQU0sRUFBRSxRQUFRLE9BQU8sSUFBSSxnQkFBZ0I7QUFFM0MsU0FBTyxPQUFPLFdBQW1CLGlCQUF5QjtBQUN4RCxRQUFJLENBQUMsV0FBVyxNQUFPO0FBRXZCLFVBQU0sU0FBUyxNQUFNLE9BQ2xCLE9BQU87QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWLFdBQVc7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUNBLFFBQVEsQ0FBQyxPQUFPLFFBQVE7QUFDdEIsY0FBTSxFQUFFLEtBQUssSUFBSTtBQUNqQixZQUFJLENBQUMsTUFBTSxrQkFBa0IscUJBQXFCLE9BQVE7QUFDMUQ7QUFBQSxVQUNFO0FBQUEsVUFDQSxXQUFXLFdBQVcsU0FBUztBQUFBLFVBQy9CO0FBQUEsVUFDQSxDQUFDLEVBQUUsT0FBTyxRQUFRLE1BQU07QUFDdEIsbUJBQU87QUFBQSxjQUNMLEdBQUc7QUFBQSxjQUNILE9BQU8sTUFBTSxPQUFPO0FBQUEsZ0JBQ2xCLENBQUMsZUFBZSxRQUFRLFVBQVUsWUFBWSxJQUFJLE1BQU07QUFBQSxjQUMxRDtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGLENBQUMsRUFDQSxNQUFNLDJCQUEyQjtBQUVwQyxRQUFJLFFBQVEsTUFBTTtBQUNoQiwwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNILE9BQU87QUFDTCxZQUFNLGVBQWUscUJBQXFCLFFBQVEsTUFBTTtBQUN4RCwwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxRQUNQLGFBQWE7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNIO0FBRUEsV0FBTyxRQUFRLE1BQU0sa0JBQWtCLHFCQUFxQjtBQUFBLEVBQzlEO0FBQ0Y7QUFFTyxnQkFBUywwQkFBMEI7QUFDeEMsUUFBTSxFQUFFLFdBQVcsSUFBSSxjQUFjO0FBQ3JDLFFBQU0sRUFBRSxvQkFBb0IsSUFBSSxlQUFlO0FBQy9DLFFBQU0sRUFBRSxRQUFRLHFCQUFxQixJQUFJLFlBQVksNEJBQTRCO0FBRWpGLFNBQU8sT0FBTyxVQUFpRDtBQUM3RCxRQUFJLENBQUMsV0FBVyxNQUFPO0FBRXZCLFVBQU0sTUFBTSxNQUFNLHFCQUFxQixLQUFLLEVBQUUsTUFBTSwyQkFBMkI7QUFDL0UsUUFBSSxLQUFLLE1BQU0sa0JBQWtCLHFCQUFxQixzQkFBc0IsSUFBSTtBQUM5RSwwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxNQUNULENBQUM7QUFBQSxJQUNILE9BQU87QUFDTCxZQUFNLFNBQVMscUJBQXFCLEtBQUssTUFBTTtBQUMvQywwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxRQUNQLGFBQWE7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNIO0FBRUEsV0FBTyxLQUFLLE1BQU0sa0JBQWtCLHFCQUFxQixzQkFBc0I7QUFBQSxFQUNqRjtBQUNGO0FBRU8sZ0JBQVMsc0JBQXNCO0FBQ3BDLFFBQU0sRUFBRSxXQUFXLElBQUksY0FBYztBQUNyQyxRQUFNLEVBQUUsb0JBQW9CLElBQUksZUFBZTtBQUMvQyxRQUFNLEVBQUUsUUFBUSxpQkFBaUIsSUFBSSxZQUFZLHdCQUF3QjtBQUV6RSxTQUFPLE9BQ0wsUUFDQSxZQUtHO0FBQ0gsVUFBTSxFQUFFLFVBQVUsaUJBQWlCLElBQUksV0FBVyxDQUFDO0FBQ25ELFFBQUksQ0FBQyxXQUFXLE1BQU87QUFFdkIsVUFBTSxTQUFTLE1BQU0saUJBQWlCLFFBQVE7QUFBQSxNQUM1QyxvQkFBb0IsU0FBUztBQUFBLElBQy9CLENBQUMsRUFBRSxNQUFNLDJCQUEyQjtBQUVwQyxRQUFJLFFBQVEsTUFBTSxpQkFBaUIsb0JBQW9CLFFBQVEsSUFBSTtBQUNqRSxVQUFJLENBQUMsa0JBQWtCO0FBQ3JCLDRCQUFvQjtBQUFBLFVBQ2xCLE1BQU0sc0JBQXNCO0FBQUEsVUFDNUIsT0FBTyxVQUFVLFdBQVc7QUFBQSxRQUM5QixDQUFDO0FBQUEsTUFDSDtBQUFBLElBQ0YsT0FBTztBQUNMLFlBQU0sU0FBUyxxQkFBcUIsUUFBUSxNQUFNO0FBQ2xELDBCQUFvQjtBQUFBLFFBQ2xCLE1BQU0sc0JBQXNCO0FBQUEsUUFDNUIsT0FBTyxVQUFVLFdBQVc7QUFBQSxRQUM1QixhQUFhO0FBQUEsTUFDZixDQUFDO0FBQUEsSUFDSDtBQUVBLFdBQU8sUUFBUSxNQUFNLGlCQUFpQixvQkFBb0I7QUFBQSxFQUM1RDtBQUNGO0FBRU8sZ0JBQVMsOEJBQThCO0FBQzVDLFFBQU0sRUFBRSxXQUFXLElBQUksY0FBYztBQUNyQyxRQUFNLEVBQUUsb0JBQW9CLElBQUksZUFBZTtBQUMvQyxRQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVksZ0NBQWdDO0FBRS9ELFNBQU8sT0FDTCxPQUNBLFlBR0c7QUFDSCxVQUFNLEVBQUUsaUJBQWlCLElBQUksV0FBVyxDQUFDO0FBQ3pDLFFBQUksQ0FBQyxXQUFXLE1BQU87QUFFdkIsVUFBTSxNQUFNLE1BQU0sT0FBTyxLQUFLLEVBQUUsTUFBTSwyQkFBMkI7QUFDakUsUUFBSSxLQUFLLE1BQU0sa0JBQWtCLHFCQUFxQixnQkFBZ0IsSUFBSTtBQUN4RSxVQUFJLENBQUMsa0JBQWtCO0FBQ3JCLDRCQUFvQjtBQUFBLFVBQ2xCLE1BQU0sc0JBQXNCO0FBQUEsVUFDNUIsT0FBTztBQUFBLFFBQ1QsQ0FBQztBQUFBLE1BQ0g7QUFBQSxJQUNGLE9BQU87QUFDTCxZQUFNLFNBQVMscUJBQXFCLEtBQUssTUFBTTtBQUMvQywwQkFBb0I7QUFBQSxRQUNsQixNQUFNLHNCQUFzQjtBQUFBLFFBQzVCLE9BQU87QUFBQSxRQUNQLGFBQWE7QUFBQSxNQUNmLENBQUM7QUFBQSxJQUNIO0FBRUEsV0FBTyxLQUFLLE1BQU0sa0JBQWtCLHFCQUFxQjtBQUFBLEVBQzNEO0FBQ0Y7QUFFTyxhQUFNLHVCQUF1QixNQUFNO0FBQ3hDLFFBQU0sRUFBRSxXQUFXLElBQUksY0FBYztBQUNyQyxRQUFNLEVBQUUsb0JBQW9CLElBQUksZUFBZTtBQUMvQyxRQUFNLEVBQUUsT0FBTyxJQUFJLFlBQVkseUJBQXlCO0FBRXhELFNBQU8sT0FBTyxXQUFtQixpQkFBeUI7QUFDeEQsUUFBSSxDQUFDLFdBQVcsTUFBTztBQUV2QixVQUFNLE1BQU0sTUFBTSxPQUFPO0FBQUEsTUFDdkI7QUFBQSxNQUNBO0FBQUEsSUFDRixDQUFDLEVBQUUsTUFBTSwyQkFBMkI7QUFFcEMsUUFBSSxLQUFLLE1BQU0sa0JBQWtCLHFCQUFxQixTQUFTO0FBQzdELDBCQUFvQjtBQUFBLFFBQ2xCLE1BQU0sc0JBQXNCO0FBQUEsUUFDNUIsT0FBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0gsT0FBTztBQUNMLFlBQU0sU0FBUyxxQkFBcUIsS0FBSyxNQUFNO0FBQy9DLDBCQUFvQjtBQUFBLFFBQ2xCLE1BQU0sc0JBQXNCO0FBQUEsUUFDNUIsT0FBTztBQUFBLFFBQ1AsYUFBYTtBQUFBLE1BQ2YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUFPLEtBQUssTUFBTSxrQkFBa0IscUJBQXFCO0FBQUEsRUFDM0Q7QUFDRjtBQUVPLGFBQU0scURBQXFELENBQUMsV0FXN0Q7QUFDSixRQUFNLEVBQUUsV0FBVyxRQUFRLElBQUk7QUFFL0IsUUFBTSxTQUFTLGdCQUFnQixFQUFFO0FBQ2pDLFFBQU0sRUFBRSxRQUFRLElBQUk7QUFBQSxJQUNsQjtBQUFBLE1BQ0UsTUFBTSxzREFBc0QsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUM5RTtBQUFBLEVBQ0Y7QUFHQSxRQUFNLDBCQUEwQiwyQkFBMkI7QUFDM0QsUUFBTSxZQUFZO0FBQUEsSUFDaEIsTUFBTSx3QkFBd0IsU0FBUyxDQUFDLEVBQUUsUUFBUSxTQUFTO0FBQUEsRUFDN0Q7QUFFQSxRQUFNLEVBQUUsU0FBUyxJQUFJO0FBQUEsSUFDbkI7QUFBQSxJQUNBLE9BQU87QUFBQSxNQUNMLElBQUksTUFBTSxTQUFTO0FBQUEsSUFDckI7QUFBQSxJQUNBLEVBQUUsU0FBUyxXQUFXLGFBQWEsTUFBTTtBQUFBLEVBQzNDO0FBRUEsV0FBUyxDQUFDLFFBQVE7QUFDaEIsVUFBTSxRQUFRLElBQUksTUFBTTtBQUN4QixRQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsTUFBTztBQUc5QixXQUFPLE1BQU0sT0FBTztBQUFBLE1BQ2xCLElBQUksV0FBVyxTQUFTLE1BQU0sTUFBTSxFQUFFO0FBQUEsTUFDdEMsUUFBUTtBQUFBLFFBQ04sbUJBQW1CLE1BQU0sTUFBTSxRQUFRLHFCQUFxQjtBQUFBLE1BQzlEO0FBQUEsSUFDRixDQUFDO0FBR0QsVUFBTSxNQUFNLE9BQU87QUFDbkIsUUFDRSxPQUNBLE1BQU0sU0FBUyxvREFBb0QsWUFDbkU7QUFDQSxZQUFNLGVBQWUsSUFBSTtBQUN6QixZQUFNLG9CQUFvQixXQUFXLGNBQWMsWUFBWTtBQUUvRDtBQUFBLFFBQ0UsT0FBTztBQUFBLFFBQ1A7QUFBQSxRQUNBLENBQUMsWUFBWSxNQUFNLE1BQU0sRUFBRSxJQUFJLE1BQU07QUFDbkMsZ0JBQU0sUUFBUSxLQUFLLE9BQU87QUFDMUIsY0FBSSxXQUFXLEtBQUssT0FBTztBQUUzQixjQUFJLFVBQVUsR0FBRztBQUNmLGdCQUFJLFVBQVU7QUFJWix5QkFBVyxDQUFDLElBQUksZUFBZSxJQUFJLEVBQUUsR0FBRyxHQUFHLFFBQVE7QUFBQSxZQUNyRDtBQUFBLFVBQ0Y7QUFFQSxjQUFJLGFBQWEsS0FBSyxZQUFZO0FBQ2xDLGNBQUksQ0FBQyxrQkFBa0IsVUFBVSxHQUFHO0FBQ2xDO0FBQUEsVUFDRjtBQUVBLGlCQUFPO0FBQUEsWUFDTCxHQUFHO0FBQUEsWUFDSCxPQUFPO0FBQUEsWUFDUDtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsUUFDQSxFQUFFLG9CQUFvQixDQUFDLE1BQU0sRUFBRTtBQUFBLE1BQ2pDO0FBQUEsSUFDRjtBQUFBLEVBQ0YsQ0FBQztBQUVELFdBQVMsQ0FBQyxRQUFRO0FBQ2hCLFVBQU0sUUFBUSxJQUFJLE1BQU07QUFDeEIsUUFBSSxDQUFDLE1BQU87QUFFWixjQUFVLE9BQU8sT0FBTyxLQUFLO0FBQUEsRUFDL0IsQ0FBQztBQUNIO0FBRU8sYUFBTSxzQ0FBc0MsQ0FBQyxXQVM5QztBQUNKLFFBQU0sRUFBRSxXQUFXLFFBQVEsSUFBSTtBQUUvQixRQUFNLFNBQVMsZ0JBQWdCLEVBQUU7QUFDakMsUUFBTSxFQUFFLFFBQVEsSUFBSTtBQUFBLElBQ2xCLFNBQVMsTUFBTSx1Q0FBdUMsTUFBTSxTQUFTLENBQUMsRUFBRTtBQUFBLEVBQzFFO0FBQ0EsUUFBTSwwQkFBMEIsMkJBQTJCO0FBQzNELFFBQU0sWUFBWTtBQUFBLElBQ2hCLE1BQU0sd0JBQXdCLFNBQVMsQ0FBQyxFQUFFLFFBQVEsU0FBUztBQUFBLEVBQzdEO0FBRUEsUUFBTSxFQUFFLFNBQVMsSUFBSTtBQUFBLElBQ25CO0FBQUEsSUFDQSxPQUFPO0FBQUEsTUFDTCxJQUFJLE1BQU0sU0FBUztBQUFBLElBQ3JCO0FBQUEsSUFDQSxFQUFFLFNBQVMsV0FBVyxhQUFhLE1BQU07QUFBQSxFQUMzQztBQUVBLFdBQVMsQ0FBQyxRQUFRO0FBQ2hCLFVBQU0sUUFBUSxJQUFJLE1BQU07QUFDeEIsUUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLE1BQU87QUFFOUIsVUFBTSxpQkFBaUIsV0FBVyxXQUFXLE1BQU0sU0FBUyxDQUFDO0FBRzdELFFBQ0UsTUFBTSxTQUFTLHFDQUFxQyxXQUNwRCxNQUFNLFlBQ047QUFDQSxZQUFNLGdCQUFnQixNQUFNO0FBRzVCO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUDtBQUFBLFFBQ0EsQ0FBQyxXQUFXLE1BQU0sT0FBTyxFQUFFLElBQUksTUFBTTtBQUNuQyxjQUFJLGNBQWMsYUFBYztBQUNoQyxjQUFJLEtBQUssT0FBTyxjQUFjLEdBQUk7QUFFbEMsaUJBQU8sSUFBSSxjQUFjLGNBQWMsRUFBRTtBQUFBLFFBQzNDO0FBQUEsTUFDRjtBQUdBO0FBQUEsUUFDRSxPQUFPO0FBQUEsUUFDUDtBQUFBLFFBQ0EsQ0FBQyxZQUFZLE1BQU0sTUFBTSxFQUFFLEtBQUssT0FBTyxNQUFNO0FBQzNDLGNBQUksS0FBSyxRQUFRLEdBQUcsUUFBUTtBQUMxQixtQkFBTztBQUFBLFVBQ1Q7QUFFQSxnQkFBTSxRQUFRLEtBQUssT0FBTztBQUMxQixjQUFJLFdBQVcsS0FBSyxPQUFPO0FBRTNCLGNBQUksVUFBVSxHQUFHO0FBQ2YsZ0JBQUksVUFBVTtBQUNaLHlCQUFXLENBQUMsSUFBSSxjQUFjLGNBQWMsRUFBRSxHQUFHLEdBQUcsUUFBUTtBQUFBLFlBQzlEO0FBQUEsVUFDRjtBQUVBLGNBQUksYUFBYSxLQUFLLFlBQVk7QUFDbEMsY0FBSSxDQUFDLGtCQUFrQixVQUFVLEdBQUc7QUFDbEM7QUFBQSxVQUNGO0FBRUEsaUJBQU87QUFBQSxZQUNMLEdBQUc7QUFBQSxZQUNILE9BQU87QUFBQSxZQUNQO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEVBQUUsb0JBQW9CLENBQUMsYUFBYSxFQUFFO0FBQUEsTUFDeEM7QUFBQSxJQUNGO0FBQUEsRUFDRixDQUFDO0FBRUQsV0FBUyxDQUFDLFFBQVE7QUFDaEIsVUFBTSxRQUFRLElBQUksTUFBTTtBQUN4QixRQUFJLENBQUMsTUFBTztBQUVaLGNBQVUsT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUMvQixDQUFDO0FBQ0giLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VzIjpbImF1dG9tYXRpb25NYW5hZ2VtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQXBvbGxvQ2FjaGUgfSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJ1xyXG5pbXBvcnQgeyBpc051bGxPclVuZGVmaW5lZCB9IGZyb20gJ0BzcGVja2xlL3NoYXJlZCdcclxuaW1wb3J0IHsgdXNlQXBvbGxvQ2xpZW50LCB1c2VNdXRhdGlvbiwgdXNlU3Vic2NyaXB0aW9uIH0gZnJvbSAnQHZ1ZS9hcG9sbG8tY29tcG9zYWJsZSdcclxuaW1wb3J0IHR5cGUgeyBHZXQgfSBmcm9tICd0eXBlLWZlc3QnXHJcbmltcG9ydCB7IHVzZUxvY2sgfSBmcm9tICd+L2xpYi9jb21tb24vY29tcG9zYWJsZXMvc2luZ2xldG9uJ1xyXG5pbXBvcnQge1xyXG4gIHR5cGUgUHJvamVjdEF1dG9tYXRpb25zQXJncyxcclxuICB0eXBlIENyZWF0ZUF1dG9tYXRpb25NdXRhdGlvblZhcmlhYmxlcyxcclxuICB0eXBlIENyZWF0ZUF1dG9tYXRpb25SZXZpc2lvbk11dGF0aW9uVmFyaWFibGVzLFxyXG4gIHR5cGUgQ3JlYXRlVGVzdEF1dG9tYXRpb25NdXRhdGlvblZhcmlhYmxlcyxcclxuICB0eXBlIE9uUHJvamVjdEF1dG9tYXRpb25zVXBkYXRlZFN1YnNjcmlwdGlvbixcclxuICB0eXBlIE9uUHJvamVjdFRyaWdnZXJlZEF1dG9tYXRpb25zU3RhdHVzVXBkYXRlZFN1YnNjcmlwdGlvbixcclxuICB0eXBlIFByb2plY3QsXHJcbiAgdHlwZSBQcm9qZWN0QXV0b21hdGlvbkFyZ3MsXHJcbiAgdHlwZSBVcGRhdGVBdXRvbWF0aW9uTXV0YXRpb24sXHJcbiAgdHlwZSBVcGRhdGVBdXRvbWF0aW9uTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgUHJvamVjdEF1dG9tYXRpb25zVXBkYXRlZE1lc3NhZ2VUeXBlLFxyXG4gIFByb2plY3RUcmlnZ2VyZWRBdXRvbWF0aW9uc1N0YXR1c1VwZGF0ZWRNZXNzYWdlVHlwZSxcclxuICB0eXBlIEF1dG9tYXRpb25SdW5zQXJncyxcclxuICB0eXBlIEF1dG9tYXRpb25cclxufSBmcm9tICd+L2xpYi9jb21tb24vZ2VuZXJhdGVkL2dxbC9ncmFwaHFsJ1xyXG5pbXBvcnQge1xyXG4gIGNvbnZlcnRUaHJvd0ludG9GZXRjaFJlc3VsdCxcclxuICBnZXRDYWNoZUlkLFxyXG4gIGdldEZpcnN0RXJyb3JNZXNzYWdlLFxyXG4gIG1vZGlmeU9iamVjdEZpZWxkc1xyXG59IGZyb20gJ34vbGliL2NvbW1vbi9oZWxwZXJzL2dyYXBocWwnXHJcbmltcG9ydCB7XHJcbiAgY3JlYXRlQXV0b21hdGlvbk11dGF0aW9uLFxyXG4gIGNyZWF0ZUF1dG9tYXRpb25SZXZpc2lvbk11dGF0aW9uLFxyXG4gIGNyZWF0ZVRlc3RBdXRvbWF0aW9uTXV0YXRpb24sXHJcbiAgZGVsZXRlQXV0b21hdGlvbk11dGF0aW9uLFxyXG4gIHRyaWdnZXJBdXRvbWF0aW9uTXV0YXRpb24sXHJcbiAgdXBkYXRlQXV0b21hdGlvbk11dGF0aW9uXHJcbn0gZnJvbSAnfi9saWIvcHJvamVjdHMvZ3JhcGhxbC9tdXRhdGlvbnMnXHJcbmltcG9ydCB7XHJcbiAgb25Qcm9qZWN0QXV0b21hdGlvbnNVcGRhdGVkU3Vic2NyaXB0aW9uLFxyXG4gIG9uUHJvamVjdFRyaWdnZXJlZEF1dG9tYXRpb25zU3RhdHVzVXBkYXRlZFN1YnNjcmlwdGlvblxyXG59IGZyb20gJ34vbGliL3Byb2plY3RzL2dyYXBocWwvc3Vic2NyaXB0aW9ucydcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VDcmVhdGVBdXRvbWF0aW9uKCkge1xyXG4gIGNvbnN0IHsgYWN0aXZlVXNlciB9ID0gdXNlQWN0aXZlVXNlcigpXHJcbiAgY29uc3QgeyB0cmlnZ2VyTm90aWZpY2F0aW9uIH0gPSB1c2VHbG9iYWxUb2FzdCgpXHJcbiAgY29uc3QgeyBtdXRhdGU6IGNyZWF0ZUF1dG9tYXRpb24gfSA9IHVzZU11dGF0aW9uKGNyZWF0ZUF1dG9tYXRpb25NdXRhdGlvbilcclxuXHJcbiAgcmV0dXJuIGFzeW5jIChpbnB1dDogQ3JlYXRlQXV0b21hdGlvbk11dGF0aW9uVmFyaWFibGVzKSA9PiB7XHJcbiAgICBpZiAoIWFjdGl2ZVVzZXIudmFsdWUpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNyZWF0ZUF1dG9tYXRpb24oaW5wdXQpLmNhdGNoKGNvbnZlcnRUaHJvd0ludG9GZXRjaFJlc3VsdClcclxuICAgIGlmIChyZXM/LmRhdGE/LnByb2plY3RNdXRhdGlvbnM/LmF1dG9tYXRpb25NdXRhdGlvbnM/LmNyZWF0ZT8uaWQpIHtcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3MsXHJcbiAgICAgICAgdGl0bGU6ICdBdXRvbWF0aW9uIGNyZWF0ZWQnXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnJNc2cgPSBnZXRGaXJzdEVycm9yTWVzc2FnZShyZXM/LmVycm9ycylcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICB0aXRsZTogJ0ZhaWxlZCB0byBjcmVhdGUgYXV0b21hdGlvbicsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGVyck1zZ1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXM/LmRhdGE/LnByb2plY3RNdXRhdGlvbnMuYXV0b21hdGlvbk11dGF0aW9ucy5jcmVhdGVcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VEZWxldGVBdXRvbWF0aW9uKCkge1xyXG4gIGNvbnN0IHsgYWN0aXZlVXNlciB9ID0gdXNlQWN0aXZlVXNlcigpXHJcbiAgY29uc3QgeyB0cmlnZ2VyTm90aWZpY2F0aW9uIH0gPSB1c2VHbG9iYWxUb2FzdCgpXHJcbiAgY29uc3QgeyBjbGllbnQ6IGFwb2xsbyB9ID0gdXNlQXBvbGxvQ2xpZW50KClcclxuXHJcbiAgcmV0dXJuIGFzeW5jIChwcm9qZWN0SWQ6IHN0cmluZywgYXV0b21hdGlvbklkOiBzdHJpbmcpID0+IHtcclxuICAgIGlmICghYWN0aXZlVXNlci52YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYXBvbGxvXHJcbiAgICAgIC5tdXRhdGUoe1xyXG4gICAgICAgIG11dGF0aW9uOiBkZWxldGVBdXRvbWF0aW9uTXV0YXRpb24sXHJcbiAgICAgICAgdmFyaWFibGVzOiB7XHJcbiAgICAgICAgICBwcm9qZWN0SWQsXHJcbiAgICAgICAgICBhdXRvbWF0aW9uSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHVwZGF0ZTogKGNhY2hlLCByZXMpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHsgZGF0YSB9ID0gcmVzXHJcbiAgICAgICAgICBpZiAoIWRhdGE/LnByb2plY3RNdXRhdGlvbnM/LmF1dG9tYXRpb25NdXRhdGlvbnM/LmRlbGV0ZSkgcmV0dXJuXHJcbiAgICAgICAgICBtb2RpZnlPYmplY3RGaWVsZChcclxuICAgICAgICAgICAgY2FjaGUsXHJcbiAgICAgICAgICAgIGdldENhY2hlSWQoJ1Byb2plY3QnLCBwcm9qZWN0SWQpLFxyXG4gICAgICAgICAgICAnYXV0b21hdGlvbnMnLFxyXG4gICAgICAgICAgICAoeyB2YWx1ZSwgaGVscGVycyB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxyXG4gICAgICAgICAgICAgICAgaXRlbXM6IHZhbHVlLml0ZW1zPy5maWx0ZXIoXHJcbiAgICAgICAgICAgICAgICAgIChhdXRvbWF0aW9uKSA9PiBoZWxwZXJzLnJlYWRGaWVsZChhdXRvbWF0aW9uLCAnaWQnKSAhPT0gYXV0b21hdGlvbklkXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goY29udmVydFRocm93SW50b0ZldGNoUmVzdWx0KVxyXG5cclxuICAgIGlmIChyZXN1bHQ/LmRhdGEpIHtcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3MsXHJcbiAgICAgICAgdGl0bGU6ICdBdXRvbWF0aW9uIGRlbGV0ZWQnXHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBnZXRGaXJzdEVycm9yTWVzc2FnZShyZXN1bHQ/LmVycm9ycylcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICB0aXRsZTogJ0ZhaWxlZCB0byBkZWxldGUgYXV0b21hdGlvbicsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGVycm9yTWVzc2FnZVxyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ/LmRhdGE/LnByb2plY3RNdXRhdGlvbnM/LmF1dG9tYXRpb25NdXRhdGlvbnM/LmRlbGV0ZVxyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZUNyZWF0ZVRlc3RBdXRvbWF0aW9uKCkge1xyXG4gIGNvbnN0IHsgYWN0aXZlVXNlciB9ID0gdXNlQWN0aXZlVXNlcigpXHJcbiAgY29uc3QgeyB0cmlnZ2VyTm90aWZpY2F0aW9uIH0gPSB1c2VHbG9iYWxUb2FzdCgpXHJcbiAgY29uc3QgeyBtdXRhdGU6IGNyZWF0ZVRlc3RBdXRvbWF0aW9uIH0gPSB1c2VNdXRhdGlvbihjcmVhdGVUZXN0QXV0b21hdGlvbk11dGF0aW9uKVxyXG5cclxuICByZXR1cm4gYXN5bmMgKGlucHV0OiBDcmVhdGVUZXN0QXV0b21hdGlvbk11dGF0aW9uVmFyaWFibGVzKSA9PiB7XHJcbiAgICBpZiAoIWFjdGl2ZVVzZXIudmFsdWUpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNyZWF0ZVRlc3RBdXRvbWF0aW9uKGlucHV0KS5jYXRjaChjb252ZXJ0VGhyb3dJbnRvRmV0Y2hSZXN1bHQpXHJcbiAgICBpZiAocmVzPy5kYXRhPy5wcm9qZWN0TXV0YXRpb25zPy5hdXRvbWF0aW9uTXV0YXRpb25zPy5jcmVhdGVUZXN0QXV0b21hdGlvbj8uaWQpIHtcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3MsXHJcbiAgICAgICAgdGl0bGU6ICdUZXN0IGF1dG9tYXRpb24gY3JlYXRlZCdcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyck1zZyA9IGdldEZpcnN0RXJyb3JNZXNzYWdlKHJlcz8uZXJyb3JzKVxyXG4gICAgICB0cmlnZ2VyTm90aWZpY2F0aW9uKHtcclxuICAgICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICAgIHRpdGxlOiAnRmFpbGVkIHRvIGNyZWF0ZSB0ZXN0IGF1dG9tYXRpb24nLFxyXG4gICAgICAgIGRlc2NyaXB0aW9uOiBlcnJNc2dcclxuICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzPy5kYXRhPy5wcm9qZWN0TXV0YXRpb25zPy5hdXRvbWF0aW9uTXV0YXRpb25zPy5jcmVhdGVUZXN0QXV0b21hdGlvbj8uaWRcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VVcGRhdGVBdXRvbWF0aW9uKCkge1xyXG4gIGNvbnN0IHsgYWN0aXZlVXNlciB9ID0gdXNlQWN0aXZlVXNlcigpXHJcbiAgY29uc3QgeyB0cmlnZ2VyTm90aWZpY2F0aW9uIH0gPSB1c2VHbG9iYWxUb2FzdCgpXHJcbiAgY29uc3QgeyBtdXRhdGU6IHVwZGF0ZUF1dG9tYXRpb24gfSA9IHVzZU11dGF0aW9uKHVwZGF0ZUF1dG9tYXRpb25NdXRhdGlvbilcclxuXHJcbiAgcmV0dXJuIGFzeW5jIChcclxuICAgIHVwZGF0ZTogVXBkYXRlQXV0b21hdGlvbk11dGF0aW9uVmFyaWFibGVzLFxyXG4gICAgb3B0aW9ucz86IFBhcnRpYWw8e1xyXG4gICAgICBvcHRpbWlzdGljUmVzcG9uc2U6IFVwZGF0ZUF1dG9tYXRpb25NdXRhdGlvblxyXG4gICAgICBtZXNzYWdlcz86IFBhcnRpYWw8eyBzdWNjZXNzOiBzdHJpbmc7IGZhaWx1cmU6IHN0cmluZyB9PlxyXG4gICAgICBoaWRlU3VjY2Vzc1RvYXN0OiBib29sZWFuXHJcbiAgICB9PlxyXG4gICkgPT4ge1xyXG4gICAgY29uc3QgeyBtZXNzYWdlcywgaGlkZVN1Y2Nlc3NUb2FzdCB9ID0gb3B0aW9ucyB8fCB7fVxyXG4gICAgaWYgKCFhY3RpdmVVc2VyLnZhbHVlKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB1cGRhdGVBdXRvbWF0aW9uKHVwZGF0ZSwge1xyXG4gICAgICBvcHRpbWlzdGljUmVzcG9uc2U6IG9wdGlvbnM/Lm9wdGltaXN0aWNSZXNwb25zZVxyXG4gICAgfSkuY2F0Y2goY29udmVydFRocm93SW50b0ZldGNoUmVzdWx0KVxyXG5cclxuICAgIGlmIChyZXN1bHQ/LmRhdGE/LnByb2plY3RNdXRhdGlvbnMuYXV0b21hdGlvbk11dGF0aW9ucy51cGRhdGU/LmlkKSB7XHJcbiAgICAgIGlmICghaGlkZVN1Y2Nlc3NUb2FzdCkge1xyXG4gICAgICAgIHRyaWdnZXJOb3RpZmljYXRpb24oe1xyXG4gICAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3MsXHJcbiAgICAgICAgICB0aXRsZTogbWVzc2FnZXM/LnN1Y2Nlc3MgfHwgJ0F1dG9tYXRpb24gdXBkYXRlZCdcclxuICAgICAgICB9KVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zdCBlcnJNc2cgPSBnZXRGaXJzdEVycm9yTWVzc2FnZShyZXN1bHQ/LmVycm9ycylcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLkRhbmdlcixcclxuICAgICAgICB0aXRsZTogbWVzc2FnZXM/LmZhaWx1cmUgfHwgJ0F1dG9tYXRpb24gdXBkYXRlIGZhaWxlZCcsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGVyck1zZ1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ/LmRhdGE/LnByb2plY3RNdXRhdGlvbnMuYXV0b21hdGlvbk11dGF0aW9ucy51cGRhdGVcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1c2VDcmVhdGVBdXRvbWF0aW9uUmV2aXNpb24oKSB7XHJcbiAgY29uc3QgeyBhY3RpdmVVc2VyIH0gPSB1c2VBY3RpdmVVc2VyKClcclxuICBjb25zdCB7IHRyaWdnZXJOb3RpZmljYXRpb24gfSA9IHVzZUdsb2JhbFRvYXN0KClcclxuICBjb25zdCB7IG11dGF0ZSB9ID0gdXNlTXV0YXRpb24oY3JlYXRlQXV0b21hdGlvblJldmlzaW9uTXV0YXRpb24pXHJcblxyXG4gIHJldHVybiBhc3luYyAoXHJcbiAgICBpbnB1dDogQ3JlYXRlQXV0b21hdGlvblJldmlzaW9uTXV0YXRpb25WYXJpYWJsZXMsXHJcbiAgICBvcHRpb25zPzogUGFydGlhbDx7XHJcbiAgICAgIGhpZGVTdWNjZXNzVG9hc3Q6IGJvb2xlYW5cclxuICAgIH0+XHJcbiAgKSA9PiB7XHJcbiAgICBjb25zdCB7IGhpZGVTdWNjZXNzVG9hc3QgfSA9IG9wdGlvbnMgfHwge31cclxuICAgIGlmICghYWN0aXZlVXNlci52YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgY29uc3QgcmVzID0gYXdhaXQgbXV0YXRlKGlucHV0KS5jYXRjaChjb252ZXJ0VGhyb3dJbnRvRmV0Y2hSZXN1bHQpXHJcbiAgICBpZiAocmVzPy5kYXRhPy5wcm9qZWN0TXV0YXRpb25zPy5hdXRvbWF0aW9uTXV0YXRpb25zPy5jcmVhdGVSZXZpc2lvbj8uaWQpIHtcclxuICAgICAgaWYgKCFoaWRlU3VjY2Vzc1RvYXN0KSB7XHJcbiAgICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuU3VjY2VzcyxcclxuICAgICAgICAgIHRpdGxlOiAnQXV0b21hdGlvbiByZXZpc2lvbiBjcmVhdGVkJ1xyXG4gICAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyck1zZyA9IGdldEZpcnN0RXJyb3JNZXNzYWdlKHJlcz8uZXJyb3JzKVxyXG4gICAgICB0cmlnZ2VyTm90aWZpY2F0aW9uKHtcclxuICAgICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICAgIHRpdGxlOiAnRmFpbGVkIHRvIGNyZWF0ZSBhdXRvbWF0aW9uIHJldmlzaW9uJyxcclxuICAgICAgICBkZXNjcmlwdGlvbjogZXJyTXNnXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlcz8uZGF0YT8ucHJvamVjdE11dGF0aW9ucz8uYXV0b21hdGlvbk11dGF0aW9ucz8uY3JlYXRlUmV2aXNpb25cclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB1c2VUcmlnZ2VyQXV0b21hdGlvbiA9ICgpID0+IHtcclxuICBjb25zdCB7IGFjdGl2ZVVzZXIgfSA9IHVzZUFjdGl2ZVVzZXIoKVxyXG4gIGNvbnN0IHsgdHJpZ2dlck5vdGlmaWNhdGlvbiB9ID0gdXNlR2xvYmFsVG9hc3QoKVxyXG4gIGNvbnN0IHsgbXV0YXRlIH0gPSB1c2VNdXRhdGlvbih0cmlnZ2VyQXV0b21hdGlvbk11dGF0aW9uKVxyXG5cclxuICByZXR1cm4gYXN5bmMgKHByb2plY3RJZDogc3RyaW5nLCBhdXRvbWF0aW9uSWQ6IHN0cmluZykgPT4ge1xyXG4gICAgaWYgKCFhY3RpdmVVc2VyLnZhbHVlKSByZXR1cm5cclxuXHJcbiAgICBjb25zdCByZXMgPSBhd2FpdCBtdXRhdGUoe1xyXG4gICAgICBwcm9qZWN0SWQsXHJcbiAgICAgIGF1dG9tYXRpb25JZFxyXG4gICAgfSkuY2F0Y2goY29udmVydFRocm93SW50b0ZldGNoUmVzdWx0KVxyXG5cclxuICAgIGlmIChyZXM/LmRhdGE/LnByb2plY3RNdXRhdGlvbnM/LmF1dG9tYXRpb25NdXRhdGlvbnM/LnRyaWdnZXIpIHtcclxuICAgICAgdHJpZ2dlck5vdGlmaWNhdGlvbih7XHJcbiAgICAgICAgdHlwZTogVG9hc3ROb3RpZmljYXRpb25UeXBlLlN1Y2Nlc3MsXHJcbiAgICAgICAgdGl0bGU6ICdBdXRvbWF0aW9uIHRyaWdnZXJlZCdcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGVyck1zZyA9IGdldEZpcnN0RXJyb3JNZXNzYWdlKHJlcz8uZXJyb3JzKVxyXG4gICAgICB0cmlnZ2VyTm90aWZpY2F0aW9uKHtcclxuICAgICAgICB0eXBlOiBUb2FzdE5vdGlmaWNhdGlvblR5cGUuRGFuZ2VyLFxyXG4gICAgICAgIHRpdGxlOiAnRmFpbGVkIHRvIHRyaWdnZXIgYXV0b21hdGlvbicsXHJcbiAgICAgICAgZGVzY3JpcHRpb246IGVyck1zZ1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXM/LmRhdGE/LnByb2plY3RNdXRhdGlvbnM/LmF1dG9tYXRpb25NdXRhdGlvbnM/LnRyaWdnZXJcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB1c2VQcm9qZWN0VHJpZ2dlcmVkQXV0b21hdGlvbnNTdGF0dXNVcGRhdGVUcmFja2luZyA9IChwYXJhbXM6IHtcclxuICBwcm9qZWN0SWQ6IE1heWJlUmVmPHN0cmluZz5cclxuICBoYW5kbGVyPzogKFxyXG4gICAgZGF0YTogTm9uTnVsbGFibGU8XHJcbiAgICAgIEdldDxcclxuICAgICAgICBPblByb2plY3RUcmlnZ2VyZWRBdXRvbWF0aW9uc1N0YXR1c1VwZGF0ZWRTdWJzY3JpcHRpb24sXHJcbiAgICAgICAgJ3Byb2plY3RUcmlnZ2VyZWRBdXRvbWF0aW9uc1N0YXR1c1VwZGF0ZWQnXHJcbiAgICAgID5cclxuICAgID4sXHJcbiAgICBjYWNoZTogQXBvbGxvQ2FjaGU8dW5rbm93bj5cclxuICApID0+IHZvaWRcclxufSkgPT4ge1xyXG4gIGNvbnN0IHsgcHJvamVjdElkLCBoYW5kbGVyIH0gPSBwYXJhbXNcclxuXHJcbiAgY29uc3QgYXBvbGxvID0gdXNlQXBvbGxvQ2xpZW50KCkuY2xpZW50XHJcbiAgY29uc3QgeyBoYXNMb2NrIH0gPSB1c2VMb2NrKFxyXG4gICAgY29tcHV0ZWQoXHJcbiAgICAgICgpID0+IGB1c2VQcm9qZWN0VHJpZ2dlcmVkQXV0b21hdGlvbnNTdGF0dXNVcGRhdGVUcmFja2luZy0ke3VucmVmKHByb2plY3RJZCl9YFxyXG4gICAgKVxyXG4gIClcclxuICAvLyBjb25zdCBpc0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiAhIShoYXNMb2NrLnZhbHVlIHx8IGhhbmRsZXIpKVxyXG5cclxuICBjb25zdCBpc0F1dG9tYXRlTW9kdWxlRW5hYmxlZCA9IHVzZUlzQXV0b21hdGVNb2R1bGVFbmFibGVkKClcclxuICBjb25zdCBpc0VuYWJsZWQgPSBjb21wdXRlZChcclxuICAgICgpID0+IGlzQXV0b21hdGVNb2R1bGVFbmFibGVkLnZhbHVlICYmICEhKGhhc0xvY2sudmFsdWUgfHwgaGFuZGxlcilcclxuICApXHJcblxyXG4gIGNvbnN0IHsgb25SZXN1bHQgfSA9IHVzZVN1YnNjcmlwdGlvbihcclxuICAgIG9uUHJvamVjdFRyaWdnZXJlZEF1dG9tYXRpb25zU3RhdHVzVXBkYXRlZFN1YnNjcmlwdGlvbixcclxuICAgICgpID0+ICh7XHJcbiAgICAgIGlkOiB1bnJlZihwcm9qZWN0SWQpXHJcbiAgICB9KSxcclxuICAgIHsgZW5hYmxlZDogaXNFbmFibGVkLCBlcnJvclBvbGljeTogJ2FsbCcgfVxyXG4gIClcclxuXHJcbiAgb25SZXN1bHQoKHJlcykgPT4ge1xyXG4gICAgY29uc3QgZXZlbnQgPSByZXMuZGF0YT8ucHJvamVjdFRyaWdnZXJlZEF1dG9tYXRpb25zU3RhdHVzVXBkYXRlZFxyXG4gICAgaWYgKCFldmVudCB8fCAhaGFzTG9jay52YWx1ZSkgcmV0dXJuXHJcblxyXG4gICAgLy8gVXBkYXRlIG1vZGVsIHRvIHJlZmxlY3QgdGhlIG5ldyBhdXRvbWF0aW9ucyBzdGF0dXNcclxuICAgIGFwb2xsby5jYWNoZS5tb2RpZnkoe1xyXG4gICAgICBpZDogZ2V0Q2FjaGVJZCgnTW9kZWwnLCBldmVudC5tb2RlbC5pZCksXHJcbiAgICAgIGZpZWxkczoge1xyXG4gICAgICAgIGF1dG9tYXRpb25zU3RhdHVzOiAoKSA9PiBldmVudC52ZXJzaW9uLmF1dG9tYXRpb25zU3RhdHVzIHx8IG51bGxcclxuICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICAvLyBBZGQgcnVuIHRvIGF1dG9tYXRpb24sIGlmIG5ldyBydW5cclxuICAgIGNvbnN0IHJ1biA9IGV2ZW50Py5ydW5cclxuICAgIGlmIChcclxuICAgICAgcnVuICYmXHJcbiAgICAgIGV2ZW50LnR5cGUgPT09IFByb2plY3RUcmlnZ2VyZWRBdXRvbWF0aW9uc1N0YXR1c1VwZGF0ZWRNZXNzYWdlVHlwZS5SdW5DcmVhdGVkXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgYXV0b21hdGlvbmlkID0gcnVuLmF1dG9tYXRpb25JZFxyXG4gICAgICBjb25zdCBhdXRvbWF0aW9uQ2FjaGVJZCA9IGdldENhY2hlSWQoJ0F1dG9tYXRpb24nLCBhdXRvbWF0aW9uaWQpXHJcblxyXG4gICAgICBtb2RpZnlPYmplY3RGaWVsZHM8QXV0b21hdGlvblJ1bnNBcmdzLCBBdXRvbWF0aW9uWydydW5zJ10+KFxyXG4gICAgICAgIGFwb2xsby5jYWNoZSxcclxuICAgICAgICBhdXRvbWF0aW9uQ2FjaGVJZCxcclxuICAgICAgICAoX2ZpZWxkTmFtZSwgdmFycywgZGF0YSwgeyByZWYgfSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbGltaXQgPSB2YXJzWydsaW1pdCddXHJcbiAgICAgICAgICBsZXQgbmV3SXRlbXMgPSBkYXRhWydpdGVtcyddXHJcblxyXG4gICAgICAgICAgaWYgKGxpbWl0ICE9PSAwKSB7XHJcbiAgICAgICAgICAgIGlmIChuZXdJdGVtcykge1xyXG4gICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbm90IHNsaWNpbmcgb2ZmIGl0ZW1zIG92ZXIgbGltaXQsIGNhdXNlIHdlIGhhdmUgbm8gd2F5IG9mXHJcbiAgICAgICAgICAgICAgLy8ga25vd2luZyBpZiB0aGlzIGlzIGEgcGFnaW5hYmxlIGxpc3Qgdy8gbW9yZSByZXN1bHRzIGxvYWRlZCB0aHJvdWdoIGZldGNoTW9yZVxyXG4gICAgICAgICAgICAgIC8vIEFsc28gaWYgd2Ugc2xpY2Ugb2ZmIHRoZSBlbmQsIHdlJ2QgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlIGN1cnNvclxyXG4gICAgICAgICAgICAgIG5ld0l0ZW1zID0gW3JlZignQXV0b21hdGVSdW4nLCBydW4uaWQpLCAuLi5uZXdJdGVtc11cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGxldCB0b3RhbENvdW50ID0gZGF0YVsndG90YWxDb3VudCddXHJcbiAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKHRvdGFsQ291bnQpKSB7XHJcbiAgICAgICAgICAgIHRvdGFsQ291bnQrK1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLmRhdGEsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBuZXdJdGVtcyxcclxuICAgICAgICAgICAgdG90YWxDb3VudFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeyBmaWVsZE5hbWVXaGl0ZWxpc3Q6IFsncnVucyddIH1cclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIG9uUmVzdWx0KChyZXMpID0+IHtcclxuICAgIGNvbnN0IGV2ZW50ID0gcmVzLmRhdGE/LnByb2plY3RUcmlnZ2VyZWRBdXRvbWF0aW9uc1N0YXR1c1VwZGF0ZWRcclxuICAgIGlmICghZXZlbnQpIHJldHVyblxyXG5cclxuICAgIGhhbmRsZXI/LihldmVudCwgYXBvbGxvLmNhY2hlKVxyXG4gIH0pXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCB1c2VQcm9qZWN0QXV0b21hdGlvbnNVcGRhdGVUcmFja2luZyA9IChwYXJhbXM6IHtcclxuICBwcm9qZWN0SWQ6IE1heWJlUmVmPHN0cmluZz5cclxuXHJcbiAgaGFuZGxlcj86IChcclxuICAgIGRhdGE6IE5vbk51bGxhYmxlPFxyXG4gICAgICBHZXQ8T25Qcm9qZWN0QXV0b21hdGlvbnNVcGRhdGVkU3Vic2NyaXB0aW9uLCAncHJvamVjdEF1dG9tYXRpb25zVXBkYXRlZCc+XHJcbiAgICA+LFxyXG4gICAgY2FjaGU6IEFwb2xsb0NhY2hlPHVua25vd24+XHJcbiAgKSA9PiB2b2lkXHJcbn0pID0+IHtcclxuICBjb25zdCB7IHByb2plY3RJZCwgaGFuZGxlciB9ID0gcGFyYW1zXHJcblxyXG4gIGNvbnN0IGFwb2xsbyA9IHVzZUFwb2xsb0NsaWVudCgpLmNsaWVudFxyXG4gIGNvbnN0IHsgaGFzTG9jayB9ID0gdXNlTG9jayhcclxuICAgIGNvbXB1dGVkKCgpID0+IGB1c2VQcm9qZWN0QXV0b21hdGlvbnNVcGRhdGVUcmFja2luZy0ke3VucmVmKHByb2plY3RJZCl9YClcclxuICApXHJcbiAgY29uc3QgaXNBdXRvbWF0ZU1vZHVsZUVuYWJsZWQgPSB1c2VJc0F1dG9tYXRlTW9kdWxlRW5hYmxlZCgpXHJcbiAgY29uc3QgaXNFbmFibGVkID0gY29tcHV0ZWQoXHJcbiAgICAoKSA9PiBpc0F1dG9tYXRlTW9kdWxlRW5hYmxlZC52YWx1ZSAmJiAhIShoYXNMb2NrLnZhbHVlIHx8IGhhbmRsZXIpXHJcbiAgKVxyXG5cclxuICBjb25zdCB7IG9uUmVzdWx0IH0gPSB1c2VTdWJzY3JpcHRpb24oXHJcbiAgICBvblByb2plY3RBdXRvbWF0aW9uc1VwZGF0ZWRTdWJzY3JpcHRpb24sXHJcbiAgICAoKSA9PiAoe1xyXG4gICAgICBpZDogdW5yZWYocHJvamVjdElkKVxyXG4gICAgfSksXHJcbiAgICB7IGVuYWJsZWQ6IGlzRW5hYmxlZCwgZXJyb3JQb2xpY3k6ICdhbGwnIH1cclxuICApXHJcblxyXG4gIG9uUmVzdWx0KChyZXMpID0+IHtcclxuICAgIGNvbnN0IGV2ZW50ID0gcmVzLmRhdGE/LnByb2plY3RBdXRvbWF0aW9uc1VwZGF0ZWRcclxuICAgIGlmICghZXZlbnQgfHwgIWhhc0xvY2sudmFsdWUpIHJldHVyblxyXG5cclxuICAgIGNvbnN0IHByb2plY3RDYWNoZUlkID0gZ2V0Q2FjaGVJZCgnUHJvamVjdCcsIHVucmVmKHByb2plY3RJZCkpXHJcblxyXG4gICAgLy8gSWYgY3JlYXRlZCwgdXBkYXRlIGxvY2FsIGNhY2hlXHJcbiAgICBpZiAoXHJcbiAgICAgIGV2ZW50LnR5cGUgPT09IFByb2plY3RBdXRvbWF0aW9uc1VwZGF0ZWRNZXNzYWdlVHlwZS5DcmVhdGVkICYmXHJcbiAgICAgIGV2ZW50LmF1dG9tYXRpb25cclxuICAgICkge1xyXG4gICAgICBjb25zdCBuZXdBdXRvbWF0aW9uID0gZXZlbnQuYXV0b21hdGlvblxyXG5cclxuICAgICAgLy8gVXBkYXRlIFByb2plY3QuYXV0b21hdGlvbiwgaWYgc29tZWhvdyBpdCB3YXMgcXVlcmllZCBmb3IgYWxyZWFkeSAodmVyeSB1bmxpa2VseSwgaGFkIHRvIGhhdmUgdmlzaXRlZCBhIDQwNCBwYWdlKVxyXG4gICAgICBtb2RpZnlPYmplY3RGaWVsZHM8UHJvamVjdEF1dG9tYXRpb25BcmdzLCBQcm9qZWN0WydhdXRvbWF0aW9uJ10+KFxyXG4gICAgICAgIGFwb2xsby5jYWNoZSxcclxuICAgICAgICBwcm9qZWN0Q2FjaGVJZCxcclxuICAgICAgICAoZmllbGROYW1lLCB2YXJzLCBfZGF0YSwgeyByZWYgfSkgPT4ge1xyXG4gICAgICAgICAgaWYgKGZpZWxkTmFtZSAhPT0gJ2F1dG9tYXRpb24nKSByZXR1cm5cclxuICAgICAgICAgIGlmICh2YXJzLmlkICE9PSBuZXdBdXRvbWF0aW9uLmlkKSByZXR1cm5cclxuXHJcbiAgICAgICAgICByZXR1cm4gcmVmKCdBdXRvbWF0aW9uJywgbmV3QXV0b21hdGlvbi5pZClcclxuICAgICAgICB9XHJcbiAgICAgIClcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSBQcm9qZWN0LmF1dG9tYXRpb25zIGxpc3RcclxuICAgICAgbW9kaWZ5T2JqZWN0RmllbGRzPFByb2plY3RBdXRvbWF0aW9uc0FyZ3MsIFByb2plY3RbJ2F1dG9tYXRpb25zJ10+KFxyXG4gICAgICAgIGFwb2xsby5jYWNoZSxcclxuICAgICAgICBwcm9qZWN0Q2FjaGVJZCxcclxuICAgICAgICAoX2ZpZWxkTmFtZSwgdmFycywgZGF0YSwgeyByZWYsIERFTEVURSB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAodmFyc1snZmlsdGVyJ10/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gREVMRVRFIC8vIEV2aWN0IHRob3NlIGxpc3RzIHcvIGZpbHRlcnNcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBjb25zdCBsaW1pdCA9IHZhcnNbJ2xpbWl0J11cclxuICAgICAgICAgIGxldCBuZXdJdGVtcyA9IGRhdGFbJ2l0ZW1zJ11cclxuXHJcbiAgICAgICAgICBpZiAobGltaXQgIT09IDApIHtcclxuICAgICAgICAgICAgaWYgKG5ld0l0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgbmV3SXRlbXMgPSBbcmVmKCdBdXRvbWF0aW9uJywgbmV3QXV0b21hdGlvbi5pZCksIC4uLm5ld0l0ZW1zXVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgbGV0IHRvdGFsQ291bnQgPSBkYXRhWyd0b3RhbENvdW50J11cclxuICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQodG90YWxDb3VudCkpIHtcclxuICAgICAgICAgICAgdG90YWxDb3VudCsrXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgLi4uZGF0YSxcclxuICAgICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxyXG4gICAgICAgICAgICB0b3RhbENvdW50XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSxcclxuICAgICAgICB7IGZpZWxkTmFtZVdoaXRlbGlzdDogWydhdXRvbWF0aW9ucyddIH1cclxuICAgICAgKVxyXG4gICAgfVxyXG4gIH0pXHJcblxyXG4gIG9uUmVzdWx0KChyZXMpID0+IHtcclxuICAgIGNvbnN0IGV2ZW50ID0gcmVzLmRhdGE/LnByb2plY3RBdXRvbWF0aW9uc1VwZGF0ZWRcclxuICAgIGlmICghZXZlbnQpIHJldHVyblxyXG5cclxuICAgIGhhbmRsZXI/LihldmVudCwgYXBvbGxvLmNhY2hlKVxyXG4gIH0pXHJcbn1cclxuIl0sImZpbGUiOiJEOi9zcGVja2xlLXNlcnZlci9wYWNrYWdlcy9mcm9udGVuZC0yL2xpYi9wcm9qZWN0cy9jb21wb3NhYmxlcy9hdXRvbWF0aW9uTWFuYWdlbWVudC50cyJ9 |