ng-cornerstone
Version:
[](https://github.com/prettier/prettier) [](http://commitizen.git
155 lines • 22.1 kB
JavaScript
import { Enums as csCoreEnum } from '@cornerstonejs/core';
export var LayoutEnum;
(function (LayoutEnum) {
LayoutEnum[LayoutEnum["LAYOUT_1x1"] = 0] = "LAYOUT_1x1";
LayoutEnum[LayoutEnum["LAYOUT_1x2"] = 1] = "LAYOUT_1x2";
LayoutEnum[LayoutEnum["LAYOUT_1x3"] = 2] = "LAYOUT_1x3";
LayoutEnum[LayoutEnum["LAYOUT_2x2"] = 3] = "LAYOUT_2x2";
})(LayoutEnum || (LayoutEnum = {}));
export const STACK_VIEWPORT_INPUTS = [
{
viewportId: 'viewport-stack',
type: csCoreEnum.ViewportType.STACK,
defaultOptions: {
background: [0, 0, 0],
},
},
];
export const SAGITTAL_VIEWPORT_INPUTS = [
{
viewportId: 'viewport-mpr-sagittal',
type: csCoreEnum.ViewportType.ORTHOGRAPHIC,
defaultOptions: {
background: [0, 0, 0],
orientation: csCoreEnum.OrientationAxis.SAGITTAL,
},
},
];
export const CORONAL_VIEWPORT_INPUTS = [
{
viewportId: 'viewport-mpr-coronal',
type: csCoreEnum.ViewportType.ORTHOGRAPHIC,
defaultOptions: {
background: [0, 0, 0],
orientation: csCoreEnum.OrientationAxis.CORONAL,
},
},
];
export const AXIAL_VIEWPORT_INPUTS = [
{
viewportId: 'viewport-mpr-axial',
type: csCoreEnum.ViewportType.ORTHOGRAPHIC,
defaultOptions: {
background: [0, 0, 0],
orientation: csCoreEnum.OrientationAxis.AXIAL,
},
},
];
export const VOLUME_3D_VIEWPORT_INPUTS = [
{
viewportId: 'viewport-volume',
type: csCoreEnum.ViewportType.VOLUME_3D,
defaultOptions: {
background: [0.2, 0, 0.2],
},
},
];
export function generateViewportInputs(layout, suffix, imageInfo) {
const viewportType = imageInfo?.viewportType || csCoreEnum.ViewportType.STACK;
const isStack = viewportType === csCoreEnum.ViewportType.STACK;
const result = [];
switch (layout) {
case LayoutEnum.LAYOUT_1x1:
// 1x1 layout: set viewportType according to imageType
if (viewportType === csCoreEnum.ViewportType.STACK) {
const viewportInput = structuredClone(STACK_VIEWPORT_INPUTS[0]);
viewportInput.viewportId = `viewport-stack-${suffix}`;
result.push(viewportInput);
}
else if (viewportType === csCoreEnum.ViewportType.VOLUME_3D) {
const viewportInput = structuredClone(VOLUME_3D_VIEWPORT_INPUTS[0]);
viewportInput.viewportId = `viewport-volume-${suffix}`;
result.push(viewportInput);
}
else {
const viewportInput = structuredClone(SAGITTAL_VIEWPORT_INPUTS[0]);
viewportInput.viewportId = `viewport-sagittal-${suffix}`;
result.push(viewportInput);
}
break;
case LayoutEnum.LAYOUT_1x2:
// 1x2 layout: all stack when imageType is stack, otherwise one volume3D one sagittal
if (isStack) {
for (let i = 0; i < 2; i++) {
const viewportInput = structuredClone(STACK_VIEWPORT_INPUTS[0]);
viewportInput.viewportId = `viewport-stack-${i + 1}${suffix}`;
result.push(viewportInput);
}
}
else {
const sagittalViewport = structuredClone(SAGITTAL_VIEWPORT_INPUTS[0]);
sagittalViewport.viewportId = `viewport-sagittal-${suffix}`;
result.push(sagittalViewport);
const volumeViewport = structuredClone(VOLUME_3D_VIEWPORT_INPUTS[0]);
volumeViewport.viewportId = `viewport-volume-${suffix}`;
result.push(volumeViewport);
}
break;
case LayoutEnum.LAYOUT_1x3:
// 1x3 layout: all stack when imageType is stack, otherwise one volume3D one sagittal one axial
if (isStack) {
for (let i = 0; i < 3; i++) {
const viewportInput = structuredClone(STACK_VIEWPORT_INPUTS[0]);
viewportInput.viewportId = `viewport-stack-${i + 1}${suffix}`;
result.push(viewportInput);
}
}
else {
const sagittalViewport = structuredClone(SAGITTAL_VIEWPORT_INPUTS[0]);
sagittalViewport.viewportId = `viewport-sagittal-${suffix}`;
result.push(sagittalViewport);
const axialViewport = structuredClone(AXIAL_VIEWPORT_INPUTS[0]);
axialViewport.viewportId = `viewport-axial-${suffix}`;
result.push(axialViewport);
const volumeViewport = structuredClone(VOLUME_3D_VIEWPORT_INPUTS[0]);
volumeViewport.viewportId = `viewport-volume-${suffix}`;
result.push(volumeViewport);
}
break;
case LayoutEnum.LAYOUT_2x2:
// 2x2 layout: all stack when imageType is stack, otherwise one volume3D one sagittal one axial one coronal
if (isStack) {
for (let i = 0; i < 4; i++) {
const viewportInput = structuredClone(STACK_VIEWPORT_INPUTS[0]);
viewportInput.viewportId = `viewport-stack-${i + 1}${suffix}`;
result.push(viewportInput);
}
}
else {
const sagittalViewport = structuredClone(SAGITTAL_VIEWPORT_INPUTS[0]);
sagittalViewport.viewportId = `viewport-sagittal-${suffix}`;
result.push(sagittalViewport);
const axialViewport = structuredClone(AXIAL_VIEWPORT_INPUTS[0]);
axialViewport.viewportId = `viewport-axial-${suffix}`;
result.push(axialViewport);
const coronalViewport = structuredClone(CORONAL_VIEWPORT_INPUTS[0]);
coronalViewport.viewportId = `viewport-coronal-${suffix}`;
result.push(coronalViewport);
const volumeViewport = structuredClone(VOLUME_3D_VIEWPORT_INPUTS[0]);
volumeViewport.viewportId = `viewport-volume-${suffix}`;
result.push(volumeViewport);
}
break;
}
return result;
}
export function generateRandomString(length = 6) {
const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
let result = '';
for (let i = 0; i < length; i++) {
const randomIndex = Math.floor(Math.random() * characters.length);
result += characters[randomIndex];
}
return '-' + result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctY29ybmVyc3RvbmUvc3JjL2xpYi9jb3JlL2NvbmZpZy9sYXlvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUdqRSxNQUFNLENBQU4sSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLHVEQUFVLENBQUE7SUFDVix1REFBVSxDQUFBO0lBQ1YsdURBQVUsQ0FBQTtJQUNWLHVEQUFVLENBQUE7QUFDWixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFFRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBeUM7SUFDekU7UUFDRSxVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLElBQUksRUFBRSxVQUFVLENBQUMsWUFBWSxDQUFDLEtBQUs7UUFDbkMsY0FBYyxFQUFFO1lBQ2QsVUFBVSxFQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3BDO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQXlDO0lBQzVFO1FBQ0UsVUFBVSxFQUFFLHVCQUF1QjtRQUNuQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZO1FBQzFDLGNBQWMsRUFBRTtZQUNkLFVBQVUsRUFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNuQyxXQUFXLEVBQUUsVUFBVSxDQUFDLGVBQWUsQ0FBQyxRQUFRO1NBQ2pEO0tBQ0Y7Q0FDRixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQXlDO0lBQzNFO1FBQ0UsVUFBVSxFQUFFLHNCQUFzQjtRQUNsQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFlBQVksQ0FBQyxZQUFZO1FBQzFDLGNBQWMsRUFBRTtZQUNkLFVBQVUs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QUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRTNCLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxlQUFlLENBQUMsVUFBVSxHQUFHLG9CQUFvQixNQUFNLEVBQUUsQ0FBQztnQkFDMUQsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztnQkFFN0IsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLGNBQWMsQ0FBQyxVQUFVLEdBQUcsbUJBQW1CLE1BQU0sRUFBRSxDQUFDO2dCQUN4RCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxNQUFNO0lBQ1YsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBTSxHQUFHLENBQUM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsZ0VBQWdFLENBQUM7SUFDcEYsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEUsTUFBTSxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLEdBQUcsTUFBTSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnVtcyBhcyBjc0NvcmVFbnVtLCBUeXBlcyB9IGZyb20gJ0Bjb3JuZXJzdG9uZWpzL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VJbmZvIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBlbnVtIExheW91dEVudW0ge1xuICBMQVlPVVRfMXgxLCAvLyBTaW5nbGUgdmlld3BvcnQgbGF5b3V0XG4gIExBWU9VVF8xeDIsIC8vIDEgcm93IDIgY29sdW1ucyBsYXlvdXRcbiAgTEFZT1VUXzF4MywgLy8gMSByb3cgMyBjb2x1bW5zIGxheW91dFxuICBMQVlPVVRfMngyLCAvLyAyIHJvd3MgMiBjb2x1bW5zIGxheW91dFxufVxuXG5leHBvcnQgY29uc3QgU1RBQ0tfVklFV1BPUlRfSU5QVVRTOiBQYXJ0aWFsPFR5cGVzLlB1YmxpY1ZpZXdwb3J0SW5wdXQ+W10gPSBbXG4gIHtcbiAgICB2aWV3cG9ydElkOiAndmlld3BvcnQtc3RhY2snLFxuICAgIHR5cGU6IGNzQ29yZUVudW0uVmlld3BvcnRUeXBlLlNUQUNLLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBiYWNrZ3JvdW5kOiA8VHlwZXMuUG9pbnQzPlswLCAwLCAwXSxcbiAgICB9LFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFNBR0lUVEFMX1ZJRVdQT1JUX0lOUFVUUzogUGFydGlhbDxUeXBlcy5QdWJsaWNWaWV3cG9ydElucHV0PltdID0gW1xuICB7XG4gICAgdmlld3BvcnRJZDogJ3ZpZXdwb3J0LW1wci1zYWdpdHRhbCcsXG4gICAgdHlwZTogY3NDb3JlRW51bS5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBiYWNrZ3JvdW5kOiA8VHlwZXMuUG9pbnQzPlswLCAwLCAwXSxcbiAgICAgIG9yaWVudGF0aW9uOiBjc0NvcmVFbnVtLk9yaWVudGF0aW9uQXhpcy5TQUdJVFRBTCxcbiAgICB9LFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IENPUk9OQUxfVklFV1BPUlRfSU5QVVRTOiBQYXJ0aWFsPFR5cGVzLlB1YmxpY1ZpZXdwb3J0SW5wdXQ+W10gPSBbXG4gIHtcbiAgICB2aWV3cG9ydElkOiAndmlld3BvcnQtbXByLWNvcm9uYWwnLFxuICAgIHR5cGU6IGNzQ29yZUVudW0uVmlld3BvcnRUeXBlLk9SVEhPR1JBUEhJQyxcbiAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgYmFja2dyb3VuZDogPFR5cGVzLlBvaW50Mz5bMCwgMCwgMF0sXG4gICAgICBvcmllbnRhdGlvbjogY3NDb3JlRW51bS5PcmllbnRhdGlvbkF4aXMuQ09ST05BTCxcbiAgICB9LFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IEFYSUFMX1ZJRVdQT1JUX0lOUFVUUzogUGFydGlhbDxUeXBlcy5QdWJsaWNWaWV3cG9ydElucHV0PltdID0gW1xuICB7XG4gICAgdmlld3BvcnRJZDogJ3ZpZXdwb3J0LW1wci1heGlhbCcsXG4gICAgdHlwZTogY3NDb3JlRW51bS5WaWV3cG9ydFR5cGUuT1JUSE9HUkFQSElDLFxuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBiYWNrZ3JvdW5kOiA8VHlwZXMuUG9pbnQzPlswLCAwLCAwXSxcbiAgICAgIG9yaWVudGF0aW9uOiBjc0NvcmVFbnVtLk9yaWVudGF0aW9uQXhpcy5BWElBTCxcbiAgICB9LFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFZPTFVNRV8zRF9WSUVXUE9SVF9JTlBVVFM6IFBhcnRpYWw8VHlwZXMuUHVibGljVmlld3BvcnRJbnB1dD5bXSA9IFtcbiAge1xuICAgIHZpZXdwb3J0SWQ6ICd2aWV3cG9ydC12b2x1bWUnLFxuICAgIHR5cGU6IGNzQ29yZUVudW0uVmlld3BvcnRUeXBlLlZPTFVNRV8zRCxcbiAgICBkZWZhdWx0T3B0aW9uczoge1xuICAgICAgYmFja2dyb3VuZDogPFR5cGVzLlBvaW50Mz5bMC4yLCAwLCAwLjJdLFxuICAgIH0sXG4gIH0sXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVWaWV3cG9ydElucHV0cyhcbiAgbGF5b3V0OiBMYXlvdXRFbnVtLFxuICBzdWZmaXg6IHN0cmluZyxcbiAgaW1hZ2VJbmZvPzogSW1hZ2VJbmZvLFxuKTogUGFydGlhbDxUeXBlcy5QdWJsaWNWaWV3cG9ydElucHV0PltdIHtcbiAgY29uc3Qgdmlld3BvcnRUeXBlID0gaW1hZ2VJbmZvPy52aWV3cG9ydFR5cGUgfHwgY3NDb3JlRW51bS5WaWV3cG9ydFR5cGUuU1RBQ0s7XG4gIGNvbnN0IGlzU3RhY2sgPSB2aWV3cG9ydFR5cGUgPT09IGNzQ29yZUVudW0uVmlld3BvcnRUeXBlLlNUQUNLO1xuICBjb25zdCByZXN1bHQ6IFBhcnRpYWw8VHlwZXMuUHVibGljVmlld3BvcnRJbnB1dD5bXSA9IFtdO1xuXG4gIHN3aXRjaCAobGF5b3V0KSB7XG4gICAgY2FzZSBMYXlvdXRFbnVtLkxBWU9VVF8xeDE6XG4gICAgICAvLyAxeDEgbGF5b3V0OiBzZXQgdmlld3BvcnRUeXBlIGFjY29yZGluZyB0byBpbWFnZVR5cGVcbiAgICAgIGlmICh2aWV3cG9ydFR5cGUgPT09IGNzQ29yZUVudW0uVmlld3BvcnRUeXBlLlNUQUNLKSB7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0SW5wdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUoU1RBQ0tfVklFV1BPUlRfSU5QVVRTWzBdKTtcbiAgICAgICAgdmlld3BvcnRJbnB1dC52aWV3cG9ydElkID0gYHZpZXdwb3J0LXN0YWNrLSR7c3VmZml4fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZpZXdwb3J0SW5wdXQpO1xuICAgICAgfSBlbHNlIGlmICh2aWV3cG9ydFR5cGUgPT09IGNzQ29yZUVudW0uVmlld3BvcnRUeXBlLlZPTFVNRV8zRCkge1xuICAgICAgICBjb25zdCB2aWV3cG9ydElucHV0ID0gc3RydWN0dXJlZENsb25lKFZPTFVNRV8zRF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICB2aWV3cG9ydElucHV0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtdm9sdW1lLSR7c3VmZml4fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZpZXdwb3J0SW5wdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgdmlld3BvcnRJbnB1dCA9IHN0cnVjdHVyZWRDbG9uZShTQUdJVFRBTF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICB2aWV3cG9ydElucHV0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtc2FnaXR0YWwtJHtzdWZmaXh9YDtcbiAgICAgICAgcmVzdWx0LnB1c2godmlld3BvcnRJbnB1dCk7XG4gICAgICB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgTGF5b3V0RW51bS5MQVlPVVRfMXgyOlxuICAgICAgLy8gMXgyIGxheW91dDogYWxsIHN0YWNrIHdoZW4gaW1hZ2VUeXBlIGlzIHN0YWNrLCBvdGhlcndpc2Ugb25lIHZvbHVtZTNEIG9uZSBzYWdpdHRhbFxuICAgICAgaWYgKGlzU3RhY2spIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydElucHV0ID0gc3RydWN0dXJlZENsb25lKFNUQUNLX1ZJRVdQT1JUX0lOUFVUU1swXSk7XG4gICAgICAgICAgdmlld3BvcnRJbnB1dC52aWV3cG9ydElkID0gYHZpZXdwb3J0LXN0YWNrLSR7aSArIDF9JHtzdWZmaXh9YDtcbiAgICAgICAgICByZXN1bHQucHVzaCh2aWV3cG9ydElucHV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2FnaXR0YWxWaWV3cG9ydCA9IHN0cnVjdHVyZWRDbG9uZShTQUdJVFRBTF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICBzYWdpdHRhbFZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtc2FnaXR0YWwtJHtzdWZmaXh9YDtcbiAgICAgICAgcmVzdWx0LnB1c2goc2FnaXR0YWxWaWV3cG9ydCk7XG5cbiAgICAgICAgY29uc3Qgdm9sdW1lVmlld3BvcnQgPSBzdHJ1Y3R1cmVkQ2xvbmUoVk9MVU1FXzNEX1ZJRVdQT1JUX0lOUFVUU1swXSk7XG4gICAgICAgIHZvbHVtZVZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtdm9sdW1lLSR7c3VmZml4fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZvbHVtZVZpZXdwb3J0KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMYXlvdXRFbnVtLkxBWU9VVF8xeDM6XG4gICAgICAvLyAxeDMgbGF5b3V0OiBhbGwgc3RhY2sgd2hlbiBpbWFnZVR5cGUgaXMgc3RhY2ssIG90aGVyd2lzZSBvbmUgdm9sdW1lM0Qgb25lIHNhZ2l0dGFsIG9uZSBheGlhbFxuICAgICAgaWYgKGlzU3RhY2spIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydElucHV0ID0gc3RydWN0dXJlZENsb25lKFNUQUNLX1ZJRVdQT1JUX0lOUFVUU1swXSk7XG4gICAgICAgICAgdmlld3BvcnRJbnB1dC52aWV3cG9ydElkID0gYHZpZXdwb3J0LXN0YWNrLSR7aSArIDF9JHtzdWZmaXh9YDtcbiAgICAgICAgICByZXN1bHQucHVzaCh2aWV3cG9ydElucHV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2FnaXR0YWxWaWV3cG9ydCA9IHN0cnVjdHVyZWRDbG9uZShTQUdJVFRBTF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICBzYWdpdHRhbFZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtc2FnaXR0YWwtJHtzdWZmaXh9YDtcbiAgICAgICAgcmVzdWx0LnB1c2goc2FnaXR0YWxWaWV3cG9ydCk7XG5cbiAgICAgICAgY29uc3QgYXhpYWxWaWV3cG9ydCA9IHN0cnVjdHVyZWRDbG9uZShBWElBTF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICBheGlhbFZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtYXhpYWwtJHtzdWZmaXh9YDtcbiAgICAgICAgcmVzdWx0LnB1c2goYXhpYWxWaWV3cG9ydCk7XG5cbiAgICAgICAgY29uc3Qgdm9sdW1lVmlld3BvcnQgPSBzdHJ1Y3R1cmVkQ2xvbmUoVk9MVU1FXzNEX1ZJRVdQT1JUX0lOUFVUU1swXSk7XG4gICAgICAgIHZvbHVtZVZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtdm9sdW1lLSR7c3VmZml4fWA7XG4gICAgICAgIHJlc3VsdC5wdXNoKHZvbHVtZVZpZXdwb3J0KTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBMYXlvdXRFbnVtLkxBWU9VVF8yeDI6XG4gICAgICAvLyAyeDIgbGF5b3V0OiBhbGwgc3RhY2sgd2hlbiBpbWFnZVR5cGUgaXMgc3RhY2ssIG90aGVyd2lzZSBvbmUgdm9sdW1lM0Qgb25lIHNhZ2l0dGFsIG9uZSBheGlhbCBvbmUgY29yb25hbFxuICAgICAgaWYgKGlzU3RhY2spIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2aWV3cG9ydElucHV0ID0gc3RydWN0dXJlZENsb25lKFNUQUNLX1ZJRVdQT1JUX0lOUFVUU1swXSk7XG4gICAgICAgICAgdmlld3BvcnRJbnB1dC52aWV3cG9ydElkID0gYHZpZXdwb3J0LXN0YWNrLSR7aSArIDF9JHtzdWZmaXh9YDtcbiAgICAgICAgICByZXN1bHQucHVzaCh2aWV3cG9ydElucHV0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2FnaXR0YWxWaWV3cG9ydCA9IHN0cnVjdHVyZWRDbG9uZShTQUdJVFRBTF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICBzYWdpdHRhbFZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtc2FnaXR0YWwtJHtzdWZmaXh9YDtcbiAgICAgICAgcmVzdWx0LnB1c2goc2FnaXR0YWxWaWV3cG9ydCk7XG5cbiAgICAgICAgY29uc3QgYXhpYWxWaWV3cG9ydCA9IHN0cnVjdHVyZWRDbG9uZShBWElBTF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICBheGlhbFZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtYXhpYWwtJHtzdWZmaXh9YDtcbiAgICAgICAgcmVzdWx0LnB1c2goYXhpYWxWaWV3cG9ydCk7XG5cbiAgICAgICAgY29uc3QgY29yb25hbFZpZXdwb3J0ID0gc3RydWN0dXJlZENsb25lKENPUk9OQUxfVklFV1BPUlRfSU5QVVRTWzBdKTtcbiAgICAgICAgY29yb25hbFZpZXdwb3J0LnZpZXdwb3J0SWQgPSBgdmlld3BvcnQtY29yb25hbC0ke3N1ZmZpeH1gO1xuICAgICAgICByZXN1bHQucHVzaChjb3JvbmFsVmlld3BvcnQpO1xuXG4gICAgICAgIGNvbnN0IHZvbHVtZVZpZXdwb3J0ID0gc3RydWN0dXJlZENsb25lKFZPTFVNRV8zRF9WSUVXUE9SVF9JTlBVVFNbMF0pO1xuICAgICAgICB2b2x1bWVWaWV3cG9ydC52aWV3cG9ydElkID0gYHZpZXdwb3J0LXZvbHVtZS0ke3N1ZmZpeH1gO1xuICAgICAgICByZXN1bHQucHVzaCh2b2x1bWVWaWV3cG9ydCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVN0cmluZyhsZW5ndGggPSA2KSB7XG4gIGNvbnN0IGNoYXJhY3RlcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknO1xuICBsZXQgcmVzdWx0ID0gJyc7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNoYXJhY3RlcnMubGVuZ3RoKTtcbiAgICByZXN1bHQgKz0gY2hhcmFjdGVyc1tyYW5kb21JbmRleF07XG4gIH1cbiAgcmV0dXJuICctJyArIHJlc3VsdDtcbn1cbiJdfQ==