UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

183 lines 28.1 kB
import { get } from 'lodash-es'; import { GenericStatusColor, GenericStatusIcon, } from '../constants/status-icons'; export var WorkloadKind; (function (WorkloadKind) { WorkloadKind["Deployment"] = "Deployment"; WorkloadKind["StatefulSet"] = "StatefulSet"; WorkloadKind["DaemonSet"] = "DaemonSet"; })(WorkloadKind || (WorkloadKind = {})); export var JobStatusEnum; (function (JobStatusEnum) { JobStatusEnum["EXECUTING"] = "executing"; JobStatusEnum["EXECUTE_SUCCEEDED"] = "execute_succeeded"; JobStatusEnum["EXECUTE_FAILED"] = "execute_failed"; JobStatusEnum["UNKNOWN"] = "unknown"; })(JobStatusEnum || (JobStatusEnum = {})); export const JobStatusColorMapper = { [JobStatusEnum.EXECUTING]: GenericStatusColor.Pending, [JobStatusEnum.EXECUTE_SUCCEEDED]: GenericStatusColor.Succeeded, [JobStatusEnum.EXECUTE_FAILED]: GenericStatusColor.Failed, [JobStatusEnum.UNKNOWN]: GenericStatusColor.Empty, }; export const JobStatusIconMapper = { [JobStatusEnum.EXECUTING]: GenericStatusIcon.Pending, [JobStatusEnum.EXECUTE_SUCCEEDED]: GenericStatusIcon.Check, [JobStatusEnum.EXECUTE_FAILED]: GenericStatusIcon.Error, [JobStatusEnum.UNKNOWN]: GenericStatusIcon.Question, }; export var WorkloadStatusEnum; (function (WorkloadStatusEnum) { WorkloadStatusEnum["running"] = "running"; WorkloadStatusEnum["stopped"] = "stopped"; WorkloadStatusEnum["pending"] = "pending"; WorkloadStatusEnum["killed"] = "killed"; })(WorkloadStatusEnum || (WorkloadStatusEnum = {})); export const WorkloadStatusColorMapper = { [WorkloadStatusEnum.running]: GenericStatusColor.Running, [WorkloadStatusEnum.pending]: GenericStatusColor.Pending, [WorkloadStatusEnum.stopped]: GenericStatusColor.Stopped, [WorkloadStatusEnum.killed]: GenericStatusColor.Stopped, }; export const WorkloadStatusIconMapper = { [WorkloadStatusEnum.running]: GenericStatusIcon.Running, [WorkloadStatusEnum.pending]: GenericStatusIcon.Pending, [WorkloadStatusEnum.stopped]: GenericStatusIcon.Stopped, [WorkloadStatusEnum.killed]: GenericStatusIcon.Stopped, }; export const STATUS = 'status'; export function parseDeploymentStatus(res) { const status = res.status; if (larger(res.spec.replicas, 0) && equal(status.updatedReplicas, res.spec.replicas) && equal(status.replicas, res.spec.replicas) && equal(status.availableReplicas, res.spec.replicas) && largerEqual(status.observedGeneration, res.metadata.generation)) { return WorkloadStatusEnum.running; } if (equal(res.spec.replicas, 0) && equal(status.replicas, res.spec.replicas) && equal(status.updatedReplicas, res.spec.replicas) && equal(status.availableReplicas, res.spec.replicas) && largerEqual(status.observedGeneration, res.metadata.generation)) { return WorkloadStatusEnum.stopped; } return WorkloadStatusEnum.pending; } export function parseDaemonSetStatus(res) { const status = res.status; if (larger(status.desiredNumberScheduled, 0) && largerEqual(status.observedGeneration, res.metadata.generation) && equal(status.desiredNumberScheduled, status.currentNumberScheduled) && equal(status.numberReady, status.desiredNumberScheduled) && equal(status.numberAvailable, status.desiredNumberScheduled) && (res.spec.updateStrategy.type !== 'RollingUpdate' || equal(status.updatedNumberScheduled, status.desiredNumberScheduled))) { return WorkloadStatusEnum.running; } if (equal(status.desiredNumberScheduled, 0) && largerEqual(status.observedGeneration, res.metadata.generation) && equal(status.desiredNumberScheduled, status.desiredNumberScheduled) && equal(status.numberReady, status.desiredNumberScheduled) && equal(status.numberAvailable, status.desiredNumberScheduled) && equal(status.currentNumberScheduled, status.desiredNumberScheduled) && (res.spec.updateStrategy.type !== 'RollingUpdate' || equal(status.updatedNumberScheduled, status.desiredNumberScheduled))) { return WorkloadStatusEnum.stopped; } return WorkloadStatusEnum.pending; } export function parseStatefulSetStatus(res) { const status = res.status; if (larger(res.spec.replicas, 0) && equal(status.replicas, res.spec.replicas) && equal(status.readyReplicas, res.spec.replicas) && largerEqual(status.observedGeneration, res.metadata.generation) && (res.spec.updateStrategy.type !== 'RollingUpdate' || (equal(status.currentRevision, status.updateRevision) ? equal(status.currentReplicas, res.spec.replicas) : largerEqual(status?.updatedReplicas, status.replicas - +res.spec.updateStrategy.rollingUpdate?.partition)))) { return WorkloadStatusEnum.running; } if (equal(res.spec.replicas, 0) && equal(status.replicas, res.spec.replicas) && equal(status.readyReplicas, res.spec.replicas) && largerEqual(status.observedGeneration, res.metadata.generation) && (res.spec.updateStrategy.type !== 'RollingUpdate' || (equal(status.currentRevision, status.updateRevision) && equal(status.currentReplicas, res.spec.replicas)))) { return WorkloadStatusEnum.stopped; } return WorkloadStatusEnum.pending; } export function parseToWorkloadStatus(data) { switch (data?.kind) { case WorkloadKind.Deployment: { return { status: parseDeploymentStatus(data), desired: get(data, ['spec', 'replicas'], 0), current: get(data, [STATUS, 'availableReplicas'], 0), }; } case WorkloadKind.DaemonSet: { return { status: parseDaemonSetStatus(data), desired: get(data, [STATUS, 'desiredNumberScheduled'], 0), current: get(data, [STATUS, 'numberReady'], 0), }; } case WorkloadKind.StatefulSet: { return { status: parseStatefulSetStatus(data), desired: get(data, ['spec', 'replicas'], 0), current: get(data, [STATUS, 'readyReplicas'], 0), }; } default: { return { status: WorkloadStatusEnum.stopped, desired: 0, current: 0, }; } } } function equal(x, y) { return defaultZero(x) === defaultZero(y); } function largerEqual(x, y) { return defaultZero(x) >= defaultZero(y); } function larger(x, y) { return defaultZero(x) > defaultZero(y); } function defaultZero(x) { return x || 0; } export function getJobStatus(data) { const status = data.status; if (status.conditions?.some(_item => _item.type === 'Failed')) { return JobStatusEnum.EXECUTE_FAILED; } // when Complete and succeeded, judge to execute_succeeded if (status.conditions?.some(_item => _item.type === 'Complete')) { if (status.succeeded) { return JobStatusEnum.EXECUTE_SUCCEEDED; } if (status.failed) { return JobStatusEnum.EXECUTE_FAILED; } } // no condition and no Complete when running if (status.active) { return JobStatusEnum.EXECUTING; } return JobStatusEnum.UNKNOWN; } export function getWorkloadStatus(status) { return status.status.toLowerCase(); } export function getPodIPs(pod) { const podIPs = pod.status.podIPs?.map(({ ip }) => ip); return podIPs?.length ? podIPs : [pod.status.podIP].filter(Boolean); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2xvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbW1vbi9zcmMvY29yZS91dGlscy93b3JrbG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhDLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsaUJBQWlCLEdBQ2xCLE1BQU0sMkJBQTJCLENBQUM7QUFLbkMsTUFBTSxDQUFOLElBQVksWUFJWDtBQUpELFdBQVksWUFBWTtJQUN0Qix5Q0FBeUIsQ0FBQTtJQUN6QiwyQ0FBMkIsQ0FBQTtJQUMzQix1Q0FBdUIsQ0FBQTtBQUN6QixDQUFDLEVBSlcsWUFBWSxLQUFaLFlBQVksUUFJdkI7QUFFRCxNQUFNLENBQU4sSUFBWSxhQUtYO0FBTEQsV0FBWSxhQUFhO0lBQ3ZCLHdDQUF1QixDQUFBO0lBQ3ZCLHdEQUF1QyxDQUFBO0lBQ3ZDLGtEQUFpQyxDQUFBO0lBQ2pDLG9DQUFtQixDQUFBO0FBQ3JCLENBQUMsRUFMVyxhQUFhLEtBQWIsYUFBYSxRQUt4QjtBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLE9BQU87SUFDckQsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO0lBQy9ELENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLE1BQU07SUFDekQsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsa0JBQWtCLENBQUMsS0FBSztDQUNsRCxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsT0FBTztJQUNwRCxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxF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R0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0RCxPQUFPLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0IH0gZnJvbSAnbG9kYXNoLWVzJztcblxuaW1wb3J0IHtcbiAgR2VuZXJpY1N0YXR1c0NvbG9yLFxuICBHZW5lcmljU3RhdHVzSWNvbixcbn0gZnJvbSAnLi4vY29uc3RhbnRzL3N0YXR1cy1pY29ucyc7XG5pbXBvcnQgeyBEYWVtb25TZXQsIERlcGxveW1lbnQsIEpvYiwgUG9kLCBTdGF0ZWZ1bFNldCB9IGZyb20gJy4uL3R5cGVzL2s4cy9yYXcnO1xuXG5leHBvcnQgdHlwZSBXb3JrbG9hZCA9IERlcGxveW1lbnQgfCBTdGF0ZWZ1bFNldCB8IERhZW1vblNldDtcblxuZXhwb3J0IGVudW0gV29ya2xvYWRLaW5kIHtcbiAgRGVwbG95bWVudCA9ICdEZXBsb3ltZW50JyxcbiAgU3RhdGVmdWxTZXQgPSAnU3RhdGVmdWxTZXQnLFxuICBEYWVtb25TZXQgPSAnRGFlbW9uU2V0Jyxcbn1cblxuZXhwb3J0IGVudW0gSm9iU3RhdHVzRW51bSB7XG4gIEVYRUNVVElORyA9ICdleGVjdXRpbmcnLFxuICBFWEVDVVRFX1NVQ0NFRURFRCA9ICdleGVjdXRlX3N1Y2NlZWRlZCcsXG4gIEVYRUNVVEVfRkFJTEVEID0gJ2V4ZWN1dGVfZmFpbGVkJyxcbiAgVU5LTk9XTiA9ICd1bmtub3duJywgLy8g5q+U5aaCIG5hbWVzcGFjZSBwb2Qg5pWw6YeP6L6+5Yiw6ZmQ6aKd5LiK6ZmQ77yM5Lu75Yqh5bCx5Lya5Y+q6Kem5Y+R77yM5L2G5piv5rKh5pyJ54q25oCBXG59XG5cbmV4cG9ydCBjb25zdCBKb2JTdGF0dXNDb2xvck1hcHBlciA9IHtcbiAgW0pvYlN0YXR1c0VudW0uRVhFQ1VUSU5HXTogR2VuZXJpY1N0YXR1c0NvbG9yLlBlbmRpbmcsXG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVEVfU1VDQ0VFREVEXTogR2VuZXJpY1N0YXR1c0NvbG9yLlN1Y2NlZWRlZCxcbiAgW0pvYlN0YXR1c0VudW0uRVhFQ1VURV9GQUlMRURdOiBHZW5lcmljU3RhdHVzQ29sb3IuRmFpbGVkLFxuICBbSm9iU3RhdHVzRW51bS5VTktOT1dOXTogR2VuZXJpY1N0YXR1c0NvbG9yLkVtcHR5LFxufTtcblxuZXhwb3J0IGNvbnN0IEpvYlN0YXR1c0ljb25NYXBwZXIgPSB7XG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVElOR106IEdlbmVyaWNTdGF0dXNJY29uLlBlbmRpbmcsXG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVEVfU1VDQ0VFREVEXTogR2VuZXJpY1N0YXR1c0ljb24uQ2hlY2ssXG4gIFtKb2JTdGF0dXNFbnVtLkVYRUNVVEVfRkFJTEVEXTogR2VuZXJpY1N0YXR1c0ljb24uRXJyb3IsXG4gIFtKb2JTdGF0dXNFbnVtLlVOS05PV05dOiBHZW5lcmljU3RhdHVzSWNvbi5RdWVzdGlvbixcbn07XG5cbmV4cG9ydCBlbnVtIFdvcmtsb2FkU3RhdHVzRW51bSB7XG4gIHJ1bm5pbmcgPSAncnVubmluZycsXG4gIHN0b3BwZWQgPSAnc3RvcHBlZCcsXG4gIHBlbmRpbmcgPSAncGVuZGluZycsXG4gIGtpbGxlZCA9ICdraWxsZWQnLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNXb3JrbG9hZFN0YXR1cyB7XG4gIHN0YXR1cz86IFdvcmtsb2FkU3RhdHVzRW51bTtcbiAgZGVzaXJlZD86IG51bWJlcjtcbiAgY3VycmVudD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrbG9hZFN0YXR1cyBleHRlbmRzIEdlbmVyaWNXb3JrbG9hZFN0YXR1cyB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGdyb3VwPzogc3RyaW5nO1xuICBraW5kPzogc3RyaW5nO1xuICBtZXNzYWdlcz86IEFycmF5PHtcbiAgICBtZXNzYWdlOiBzdHJpbmc7XG4gICAgcmVhc29uPzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGNvbnN0IFdvcmtsb2FkU3RhdHVzQ29sb3JNYXBwZXIgPSB7XG4gIFtXb3JrbG9hZFN0YXR1c0VudW0ucnVubmluZ106IEdlbmVyaWNTdGF0dXNDb2xvci5SdW5uaW5nLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLnBlbmRpbmddOiBHZW5lcmljU3RhdHVzQ29sb3IuUGVuZGluZyxcbiAgW1dvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkXTogR2VuZXJpY1N0YXR1c0NvbG9yLlN0b3BwZWQsXG4gIFtXb3JrbG9hZFN0YXR1c0VudW0ua2lsbGVkXTogR2VuZXJpY1N0YXR1c0NvbG9yLlN0b3BwZWQsXG59O1xuXG5leHBvcnQgY29uc3QgV29ya2xvYWRTdGF0dXNJY29uTWFwcGVyID0ge1xuICBbV29ya2xvYWRTdGF0dXNFbnVtLnJ1bm5pbmddOiBHZW5lcmljU3RhdHVzSWNvbi5SdW5uaW5nLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLnBlbmRpbmddOiBHZW5lcmljU3RhdHVzSWNvbi5QZW5kaW5nLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLnN0b3BwZWRdOiBHZW5lcmljU3RhdHVzSWNvbi5TdG9wcGVkLFxuICBbV29ya2xvYWRTdGF0dXNFbnVtLmtpbGxlZF06IEdlbmVyaWNTdGF0dXNJY29uLlN0b3BwZWQsXG59O1xuXG5leHBvcnQgY29uc3QgU1RBVFVTID0gJ3N0YXR1cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlcGxveW1lbnRTdGF0dXMocmVzOiBEZXBsb3ltZW50KSB7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGlmIChcbiAgICBsYXJnZXIocmVzLnNwZWMucmVwbGljYXMsIDApICYmXG4gICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLnJlcGxpY2FzLCByZXMuc3BlYy5yZXBsaWNhcykgJiZcbiAgICBlcXVhbChzdGF0dXMuYXZhaWxhYmxlUmVwbGljYXMsIHJlcy5zcGVjLnJlcGxpY2FzKSAmJlxuICAgIGxhcmdlckVxdWFsKHN0YXR1cy5vYnNlcnZlZEdlbmVyYXRpb24sIHJlcy5tZXRhZGF0YS5nZW5lcmF0aW9uKVxuICApIHtcbiAgICByZXR1cm4gV29ya2xvYWRTdGF0dXNFbnVtLnJ1bm5pbmc7XG4gIH1cbiAgaWYgKFxuICAgIGVxdWFsKHJlcy5zcGVjLnJlcGxpY2FzLCAwKSAmJlxuICAgIGVxdWFsKHN0YXR1cy5yZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLmF2YWlsYWJsZVJlcGxpY2FzLCByZXMuc3BlYy5yZXBsaWNhcykgJiZcbiAgICBsYXJnZXJFcXVhbChzdGF0dXMub2JzZXJ2ZWRHZW5lcmF0aW9uLCByZXMubWV0YWRhdGEuZ2VuZXJhdGlvbilcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkO1xuICB9XG4gIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucGVuZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGFlbW9uU2V0U3RhdHVzKHJlczogRGFlbW9uU2V0KSB7XG4gIGNvbnN0IHN0YXR1cyA9IHJlcy5zdGF0dXM7XG4gIGlmIChcbiAgICBsYXJnZXIoc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQsIDApICYmXG4gICAgbGFyZ2VyRXF1YWwoc3RhdHVzLm9ic2VydmVkR2VuZXJhdGlvbiwgcmVzLm1ldGFkYXRhLmdlbmVyYXRpb24pICYmXG4gICAgZXF1YWwoc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQsIHN0YXR1cy5jdXJyZW50TnVtYmVyU2NoZWR1bGVkKSAmJlxuICAgIGVxdWFsKHN0YXR1cy5udW1iZXJSZWFkeSwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgZXF1YWwoc3RhdHVzLm51bWJlckF2YWlsYWJsZSwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgKHJlcy5zcGVjLnVwZGF0ZVN0cmF0ZWd5LnR5cGUgIT09ICdSb2xsaW5nVXBkYXRlJyB8fFxuICAgICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWROdW1iZXJTY2hlZHVsZWQsIHN0YXR1cy5kZXNpcmVkTnVtYmVyU2NoZWR1bGVkKSlcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5ydW5uaW5nO1xuICB9XG4gIGlmIChcbiAgICBlcXVhbChzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCwgMCkgJiZcbiAgICBsYXJnZXJFcXVhbChzdGF0dXMub2JzZXJ2ZWRHZW5lcmF0aW9uLCByZXMubWV0YWRhdGEuZ2VuZXJhdGlvbikgJiZcbiAgICBlcXVhbChzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgZXF1YWwoc3RhdHVzLm51bWJlclJlYWR5LCBzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCkgJiZcbiAgICBlcXVhbChzdGF0dXMubnVtYmVyQXZhaWxhYmxlLCBzdGF0dXMuZGVzaXJlZE51bWJlclNjaGVkdWxlZCkgJiZcbiAgICBlcXVhbChzdGF0dXMuY3VycmVudE51bWJlclNjaGVkdWxlZCwgc3RhdHVzLmRlc2lyZWROdW1iZXJTY2hlZHVsZWQpICYmXG4gICAgKHJlcy5zcGVjLnVwZGF0ZVN0cmF0ZWd5LnR5cGUgIT09ICdSb2xsaW5nVXBkYXRlJyB8fFxuICAgICAgZXF1YWwoc3RhdHVzLnVwZGF0ZWROdW1iZXJTY2hlZHVsZWQsIHN0YXR1cy5kZXNpcmVkTnVtYmVyU2NoZWR1bGVkKSlcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkO1xuICB9XG4gIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucGVuZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3RhdGVmdWxTZXRTdGF0dXMocmVzOiBTdGF0ZWZ1bFNldCkge1xuICBjb25zdCBzdGF0dXMgPSByZXMuc3RhdHVzO1xuICBpZiAoXG4gICAgbGFyZ2VyKHJlcy5zcGVjLnJlcGxpY2FzLCAwKSAmJlxuICAgIGVxdWFsKHN0YXR1cy5yZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgZXF1YWwoc3RhdHVzLnJlYWR5UmVwbGljYXMsIHJlcy5zcGVjLnJlcGxpY2FzKSAmJlxuICAgIGxhcmdlckVxdWFsKHN0YXR1cy5vYnNlcnZlZEdlbmVyYXRpb24sIHJlcy5tZXRhZGF0YS5nZW5lcmF0aW9uKSAmJlxuICAgIChyZXMuc3BlYy51cGRhdGVTdHJhdGVneS50eXBlICE9PSAnUm9sbGluZ1VwZGF0ZScgfHxcbiAgICAgIChlcXVhbChzdGF0dXMuY3VycmVudFJldmlzaW9uLCBzdGF0dXMudXBkYXRlUmV2aXNpb24pXG4gICAgICAgID8gZXF1YWwoc3RhdHVzLmN1cnJlbnRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpXG4gICAgICAgIDogbGFyZ2VyRXF1YWwoXG4gICAgICAgICAgICBzdGF0dXM/LnVwZGF0ZWRSZXBsaWNhcyxcbiAgICAgICAgICAgIHN0YXR1cy5yZXBsaWNhcyAtICtyZXMuc3BlYy51cGRhdGVTdHJhdGVneS5yb2xsaW5nVXBkYXRlPy5wYXJ0aXRpb24sXG4gICAgICAgICAgKSkpXG4gICkge1xuICAgIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucnVubmluZztcbiAgfVxuICBpZiAoXG4gICAgZXF1YWwocmVzLnNwZWMucmVwbGljYXMsIDApICYmXG4gICAgZXF1YWwoc3RhdHVzLnJlcGxpY2FzLCByZXMuc3BlYy5yZXBsaWNhcykgJiZcbiAgICBlcXVhbChzdGF0dXMucmVhZHlSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpICYmXG4gICAgbGFyZ2VyRXF1YWwoc3RhdHVzLm9ic2VydmVkR2VuZXJhdGlvbiwgcmVzLm1ldGFkYXRhLmdlbmVyYXRpb24pICYmXG4gICAgKHJlcy5zcGVjLnVwZGF0ZVN0cmF0ZWd5LnR5cGUgIT09ICdSb2xsaW5nVXBkYXRlJyB8fFxuICAgICAgKGVxdWFsKHN0YXR1cy5jdXJyZW50UmV2aXNpb24sIHN0YXR1cy51cGRhdGVSZXZpc2lvbikgJiZcbiAgICAgICAgZXF1YWwoc3RhdHVzLmN1cnJlbnRSZXBsaWNhcywgcmVzLnNwZWMucmVwbGljYXMpKSlcbiAgKSB7XG4gICAgcmV0dXJuIFdvcmtsb2FkU3RhdHVzRW51bS5zdG9wcGVkO1xuICB9XG4gIHJldHVybiBXb3JrbG9hZFN0YXR1c0VudW0ucGVuZGluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9Xb3JrbG9hZFN0YXR1cyhkYXRhOiBEZXBsb3ltZW50KTogR2VuZXJpY1dvcmtsb2FkU3RhdHVzIHtcbiAgc3dpdGNoIChkYXRhPy5raW5kKSB7XG4gICAgY2FzZSBXb3JrbG9hZEtpbmQuRGVwbG95bWVudDoge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3RhdHVzOiBwYXJzZURlcGxveW1lbnRTdGF0dXMoZGF0YSksXG4gICAgICAgIGRlc2lyZWQ6IGdldChkYXRhLCBbJ3NwZWMnLCAncmVwbGljYXMnXSwgMCksXG4gICAgICAgIGN1cnJlbnQ6IGdldChkYXRhLCBbU1RBVFVTLCAnYXZhaWxhYmxlUmVwbGljYXMnXSwgMCksXG4gICAgICB9O1xuICAgIH1cbiAgICBjYXNlIFdvcmtsb2FkS2luZC5EYWVtb25TZXQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogcGFyc2VEYWVtb25TZXRTdGF0dXMoZGF0YSksXG4gICAgICAgIGRlc2lyZWQ6IGdldChkYXRhLCBbU1RBVFVTLCAnZGVzaXJlZE51bWJlclNjaGVkdWxlZCddLCAwKSxcbiAgICAgICAgY3VycmVudDogZ2V0KGRhdGEsIFtTVEFUVVMsICdudW1iZXJSZWFkeSddLCAwKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGNhc2UgV29ya2xvYWRLaW5kLlN0YXRlZnVsU2V0OiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGF0dXM6IHBhcnNlU3RhdGVmdWxTZXRTdGF0dXMoZGF0YSksXG4gICAgICAgIGRlc2lyZWQ6IGdldChkYXRhLCBbJ3NwZWMnLCAncmVwbGljYXMnXSwgMCksXG4gICAgICAgIGN1cnJlbnQ6IGdldChkYXRhLCBbU1RBVFVTLCAncmVhZHlSZXBsaWNhcyddLCAwKSxcbiAgICAgIH07XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0YXR1czogV29ya2xvYWRTdGF0dXNFbnVtLnN0b3BwZWQsXG4gICAgICAgIGRlc2lyZWQ6IDAsXG4gICAgICAgIGN1cnJlbnQ6IDAsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBlcXVhbCh4OiBudW1iZXIgfCBzdHJpbmcsIHk6IG51bWJlciB8IHN0cmluZykge1xuICByZXR1cm4gZGVmYXVsdFplcm8oeCkgPT09IGRlZmF1bHRaZXJvKHkpO1xufVxuXG5mdW5jdGlvbiBsYXJnZXJFcXVhbCh4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICByZXR1cm4gZGVmYXVsdFplcm8oeCkgPj0gZGVmYXVsdFplcm8oeSk7XG59XG5cbmZ1bmN0aW9uIGxhcmdlcih4OiBudW1iZXIsIHk6IG51bWJlcikge1xuICByZXR1cm4gZGVmYXVsdFplcm8oeCkgPiBkZWZhdWx0WmVybyh5KTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFplcm8oeDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gIHJldHVybiB4IHx8IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRKb2JTdGF0dXMoZGF0YTogSm9iKTogSm9iU3RhdHVzRW51bSB7XG4gIGNvbnN0IHN0YXR1cyA9IGRhdGEuc3RhdHVzO1xuICBpZiAoc3RhdHVzLmNvbmRpdGlvbnM/LnNvbWUoX2l0ZW0gPT4gX2l0ZW0udHlwZSA9PT0gJ0ZhaWxlZCcpKSB7XG4gICAgcmV0dXJuIEpvYlN0YXR1c0VudW0uRVhFQ1VURV9GQUlMRUQ7XG4gIH1cbiAgLy8gd2hlbiBDb21wbGV0ZSBhbmQgc3VjY2VlZGVkLCBqdWRnZSB0byBleGVjdXRlX3N1Y2NlZWRlZFxuICBpZiAoc3RhdHVzLmNvbmRpdGlvbnM/LnNvbWUoX2l0ZW0gPT4gX2l0ZW0udHlwZSA9PT0gJ0NvbXBsZXRlJykpIHtcbiAgICBpZiAoc3RhdHVzLnN1Y2NlZWRlZCkge1xuICAgICAgcmV0dXJuIEpvYlN0YXR1c0VudW0uRVhFQ1VURV9TVUNDRUVERUQ7XG4gICAgfVxuICAgIGlmIChzdGF0dXMuZmFpbGVkKSB7XG4gICAgICByZXR1cm4gSm9iU3RhdHVzRW51bS5FWEVDVVRFX0ZBSUxFRDtcbiAgICB9XG4gIH1cbiAgLy8gbm8gY29uZGl0aW9uIGFuZCBubyBDb21wbGV0ZSB3aGVuIHJ1bm5pbmdcbiAgaWYgKHN0YXR1cy5hY3RpdmUpIHtcbiAgICByZXR1cm4gSm9iU3RhdHVzRW51bS5FWEVDVVRJTkc7XG4gIH1cbiAgcmV0dXJuIEpvYlN0YXR1c0VudW0uVU5LTk9XTjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdvcmtsb2FkU3RhdHVzKHN0YXR1czogR2VuZXJpY1dvcmtsb2FkU3RhdHVzKSB7XG4gIHJldHVybiBzdGF0dXMuc3RhdHVzLnRvTG93ZXJDYXNlKCkgYXMgV29ya2xvYWRTdGF0dXNFbnVtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9kSVBzKHBvZDogUG9kKSB7XG4gIGNvbnN0IHBvZElQcyA9IHBvZC5zdGF0dXMucG9kSVBzPy5tYXAoKHsgaXAgfSkgPT4gaXApO1xuICByZXR1cm4gcG9kSVBzPy5sZW5ndGggPyBwb2RJUHMgOiBbcG9kLnN0YXR1cy5wb2RJUF0uZmlsdGVyKEJvb2xlYW4pO1xufVxuIl19