UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

153 lines 27.1 kB
import { hasval, isNumber } from '../util/util'; // 'pref' indicates the child's height should be its preferred height // 'pref-max' indicates the child's height should be at most its preferred height, but should be made smaller // (treated as a flex with child.layoutOptions.height === null) if their is insufficient room in the // parentViewport to accommodate all children at their set size // // This layout is essentially a generalization of timeline_layout.ts. If you use a row_layout with the center element set to pref-max // you get the same effect as timeline_layout). function childHeight(child) { const usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref' || child.layoutOptions.height === 'pref-max'); return (usePrefHeight ? child.prefSize.h : child.layoutOptions.height); } // see above, like childHeight( ) but don't count 'pref-max' function childHeightOverfull(child) { const usePrefHeight = (!hasval(child.layoutOptions) || child.layoutOptions.height === undefined || child.layoutOptions.height === 'pref'); if (usePrefHeight) { return child.prefSize.h; } else if (child.layoutOptions.height === 'pref-max') { return null; } else { return child.layoutOptions.height; } } function calculateFlexData(childrenToPlace, parentViewport, getChildHeight) { let numFlexible = 0; let totalHeight = 0; for (let c = 0; c < childrenToPlace.length; c++) { const h = getChildHeight(childrenToPlace[c]); if (hasval(h)) { totalHeight += h; } else { numFlexible++; } } const totalFlexHeight = parentViewport.h - totalHeight; const flexHeight = totalFlexHeight / numFlexible; return { numFlexible: numFlexible, totalHeight: totalHeight, flexHeight: flexHeight, totalFlexHeight: totalFlexHeight, childHeight: getChildHeight }; } export function newRowLayout(topToBottom = true) { return { updatePrefSize: function (parentPrefSize, children) { const childrenToPlace = []; for (let c = 0; c < children.length; c++) { const child = children[c]; if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { childrenToPlace.push(child); } } let wMax = 0; let hSum = 0; for (let c = 0; c < childrenToPlace.length; c++) { const child = childrenToPlace[c]; const honorChildWidth = !(child.layoutOptions && child.layoutOptions.ignoreWidth); if (honorChildWidth) { const w = child.prefSize.w; if (hasval(wMax) && hasval(w)) { wMax = Math.max(wMax, w); } else { wMax = null; } } const h = childHeight(child); if (hasval(hSum) && hasval(h)) { hSum += h; } else { hSum = null; } } parentPrefSize.w = wMax; parentPrefSize.h = hSum; }, updateChildViewports: function (children, parentViewport) { const childrenToPlace = []; const childrenToHide = []; for (let c = 0; c < children.length; c++) { const child = children[c]; if (isNumber(child.layoutArg) && !(child.layoutOptions && child.layoutOptions.hide)) { childrenToPlace.push(child); } else { childrenToHide.push(child); } } // Use the original index to make the sort stable const indexProp = 'webglimpse_rowLayout_index'; for (let c = 0; c < childrenToPlace.length; c++) { const child = childrenToPlace[c]; child[indexProp] = c; } childrenToPlace.sort(function (a, b) { const orderDiff = a.layoutArg - b.layoutArg; return (orderDiff !== 0 ? orderDiff : (a[indexProp] - b[indexProp])); }); // calculate assuming sufficient space let flexData = calculateFlexData(children, parentViewport, childHeight); // recalculate allowing 'pref-max' children to shrink if insufficient space if (flexData.totalHeight > parentViewport.h) { flexData = calculateFlexData(children, parentViewport, childHeightOverfull); } if (topToBottom) { const iStart = parentViewport.iStart; const iEnd = parentViewport.iEnd; let jEnd = parentViewport.jEnd; let jRemainder = 0; for (let c = 0; c < childrenToPlace.length; c++) { const child = childrenToPlace[c]; let jStart; const h = flexData.childHeight(child); if (hasval(h)) { jStart = jEnd - h; } else { const jStart0 = jEnd - flexData.flexHeight - jRemainder; jStart = Math.round(jStart0); jRemainder = jStart - jStart0; } child.viewport.setEdges(iStart, iEnd, jStart, jEnd); jEnd = jStart; } } else { const iStart = parentViewport.iStart; const iEnd = parentViewport.iEnd; let jStart = parentViewport.jStart; let jRemainder = 0; for (let c = 0; c < childrenToPlace.length; c++) { const child = childrenToPlace[c]; let jEnd; const h = flexData.childHeight(child); if (hasval(h)) { jEnd = jStart + h; } else { const jEnd0 = jStart + flexData.flexHeight + jRemainder; jEnd = Math.round(jEnd0); jRemainder = jEnd0 - jEnd; } child.viewport.setEdges(iStart, iEnd, jStart, jEnd); jStart = jEnd; } } for (let c = 0; c < childrenToHide.length; c++) { childrenToHide[c].viewport.setEdges(0, 0, 0, 0); } } }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm93X2xheW91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy93ZWJnbGltcHNlL2xheW91dC9yb3dfbGF5b3V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStCQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUdoRCx5RUFBeUU7QUFDekUsNkdBQTZHO0FBQzdHLCtHQUErRztBQUMvRywwRUFBMEU7QUFDMUUsRUFBRTtBQUNGLHFJQUFxSTtBQUNySSwrQ0FBK0M7QUFDL0MsU0FBUyxXQUFXLENBQUMsS0FBa0I7SUFDbkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQztJQUN2TCxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsNERBQTREO0FBQzVELFNBQVMsbUJBQW1CLENBQUMsS0FBa0I7SUFDM0MsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxDQUFDO0lBRTFJLElBQUksYUFBYSxFQUFFO1FBQ2YsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztLQUMzQjtTQUNJLElBQUksS0FBSyxDQUFDLGFBQWEs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QUFJLENBQUM7aUJBQ2pCO2FBQ0o7WUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDNUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDbkQ7UUFDTCxDQUFDO0tBQ0osQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IExheW91dEVudHJ5LCBMYXlvdXQgfSBmcm9tICcuLi9jb3JlJztcclxuaW1wb3J0IHsgQm91bmRzVW5tb2RpZmlhYmxlLCBTaXplIH0gZnJvbSAnLi4vYm91bmRzJztcclxuaW1wb3J0IHsgaGFzdmFsLCBpc051bWJlciB9IGZyb20gJy4uL3V0aWwvdXRpbCc7XHJcblxyXG5cclxuLy8gJ3ByZWYnICAgICBpbmRpY2F0ZXMgdGhlIGNoaWxkJ3MgaGVpZ2h0IHNob3VsZCBiZSBpdHMgcHJlZmVycmVkIGhlaWdodFxyXG4vLyAncHJlZi1tYXgnIGluZGljYXRlcyB0aGUgY2hpbGQncyBoZWlnaHQgc2hvdWxkIGJlIGF0IG1vc3QgaXRzIHByZWZlcnJlZCBoZWlnaHQsIGJ1dCBzaG91bGQgYmUgbWFkZSBzbWFsbGVyXHJcbi8vICAgICAgICAgICAgKHRyZWF0ZWQgYXMgYSBmbGV4IHdpdGggY2hpbGQubGF5b3V0T3B0aW9ucy5oZWlnaHQgPT09IG51bGwpIGlmIHRoZWlyIGlzIGluc3VmZmljaWVudCByb29tIGluIHRoZVxyXG4vLyAgICAgICAgICAgIHBhcmVudFZpZXdwb3J0IHRvIGFjY29tbW9kYXRlIGFsbCBjaGlsZHJlbiBhdCB0aGVpciBzZXQgc2l6ZVxyXG4vL1xyXG4vLyBUaGlzIGxheW91dCBpcyBlc3NlbnRpYWxseSBhIGdlbmVyYWxpemF0aW9uIG9mIHRpbWVsaW5lX2xheW91dC50cy4gSWYgeW91IHVzZSBhIHJvd19sYXlvdXQgd2l0aCB0aGUgY2VudGVyIGVsZW1lbnQgc2V0IHRvIHByZWYtbWF4XHJcbi8vIHlvdSBnZXQgdGhlIHNhbWUgZWZmZWN0IGFzIHRpbWVsaW5lX2xheW91dCkuXHJcbmZ1bmN0aW9uIGNoaWxkSGVpZ2h0KGNoaWxkOiBMYXlvdXRFbnRyeSk6IG51bWJlciB7XHJcbiAgICBjb25zdCB1c2VQcmVmSGVpZ2h0ID0gKCFoYXN2YWwoY2hpbGQubGF5b3V0T3B0aW9ucykgfHwgY2hpbGQubGF5b3V0T3B0aW9ucy5oZWlnaHQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZC5sYXlvdXRPcHRpb25zLmhlaWdodCA9PT0gJ3ByZWYnIHx8IGNoaWxkLmxheW91dE9wdGlvbnMuaGVpZ2h0ID09PSAncHJlZi1tYXgnKTtcclxuICAgIHJldHVybiAodXNlUHJlZkhlaWdodCA/IGNoaWxkLnByZWZTaXplLmggOiBjaGlsZC5sYXlvdXRPcHRpb25zLmhlaWdodCk7XHJcbn1cclxuXHJcbi8vIHNlZSBhYm92ZSwgbGlrZSBjaGlsZEhlaWdodCggKSBidXQgZG9uJ3QgY291bnQgJ3ByZWYtbWF4J1xyXG5mdW5jdGlvbiBjaGlsZEhlaWdodE92ZXJmdWxsKGNoaWxkOiBMYXlvdXRFbnRyeSk6IG51bWJlciB7XHJcbiAgICBjb25zdCB1c2VQcmVmSGVpZ2h0ID0gKCFoYXN2YWwoY2hpbGQubGF5b3V0T3B0aW9ucykgfHwgY2hpbGQubGF5b3V0T3B0aW9ucy5oZWlnaHQgPT09IHVuZGVmaW5lZCB8fCBjaGlsZC5sYXlvdXRPcHRpb25zLmhlaWdodCA9PT0gJ3ByZWYnKTtcclxuXHJcbiAgICBpZiAodXNlUHJlZkhlaWdodCkge1xyXG4gICAgICAgIHJldHVybiBjaGlsZC5wcmVmU2l6ZS5oO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAoY2hpbGQubGF5b3V0T3B0aW9ucy5oZWlnaHQgPT09ICdwcmVmLW1heCcpIHtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBjaGlsZC5sYXlvdXRPcHRpb25zLmhlaWdodDtcclxuICAgIH1cclxufVxyXG5cclxuaW50ZXJmYWNlIEZsZXhEYXRhIHtcclxuICAgIG51bUZsZXhpYmxlOiBudW1iZXI7XHJcbiAgICB0b3RhbEhlaWdodDogbnVtYmVyO1xyXG4gICAgdG90YWxGbGV4SGVpZ2h0OiBudW1iZXI7XHJcbiAgICBmbGV4SGVpZ2h0OiBudW1iZXI7XHJcbiAgICBjaGlsZEhlaWdodDogKGNoaWxkOiBMYXlvdXRFbnRyeSkgPT4gbnVtYmVyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhdGVGbGV4RGF0YShjaGlsZHJlblRvUGxhY2U6IExheW91dEVudHJ5W10sIHBhcmVudFZpZXdwb3J0OiBCb3VuZHNVbm1vZGlmaWFibGUsIGdldENoaWxkSGVpZ2h0OiAoY2hpbGQ6IExheW91dEVudHJ5KSA9PiBudW1iZXIpOiBGbGV4RGF0YSB7XHJcbiAgICBsZXQgbnVtRmxleGlibGUgPSAwO1xyXG4gICAgbGV0IHRvdGFsSGVpZ2h0ID0gMDtcclxuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub1BsYWNlLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgY29uc3QgaCA9IGdldENoaWxkSGVpZ2h0KGNoaWxkcmVuVG9QbGFjZVtjXSk7XHJcbiAgICAgICAgaWYgKGhhc3ZhbChoKSkge1xyXG4gICAgICAgICAgICB0b3RhbEhlaWdodCArPSBoO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgbnVtRmxleGlibGUrKztcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCB0b3RhbEZsZXhIZWlnaHQgPSBwYXJlbnRWaWV3cG9ydC5oIC0gdG90YWxIZWlnaHQ7XHJcbiAgICBjb25zdCBmbGV4SGVpZ2h0ID0gdG90YWxGbGV4SGVpZ2h0IC8gbnVtRmxleGlibGU7XHJcbiAgICByZXR1cm4geyBudW1GbGV4aWJsZTogbnVtRmxleGlibGUsIHRvdGFsSGVpZ2h0OiB0b3RhbEhlaWdodCwgZmxleEhlaWdodDogZmxleEhlaWdodCwgdG90YWxGbGV4SGVpZ2h0OiB0b3RhbEZsZXhIZWlnaHQsIGNoaWxkSGVpZ2h0OiBnZXRDaGlsZEhlaWdodCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3Um93TGF5b3V0KHRvcFRvQm90dG9tOiBib29sZWFuID0gdHJ1ZSk6IExheW91dCB7XHJcblxyXG4gICAgcmV0dXJuIDxMYXlvdXQ+e1xyXG5cclxuXHJcbiAgICAgICAgdXBkYXRlUHJlZlNpemU6IGZ1bmN0aW9uIChwYXJlbnRQcmVmU2l6ZTogU2l6ZSwgY2hpbGRyZW46IExheW91dEVudHJ5W10pIHtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Ub1BsYWNlID0gPExheW91dEVudHJ5W10+W107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW4ubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bY107XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNOdW1iZXIoY2hpbGQubGF5b3V0QXJnKSAmJiAhKGNoaWxkLmxheW91dE9wdGlvbnMgJiYgY2hpbGQubGF5b3V0T3B0aW9ucy5oaWRlKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuVG9QbGFjZS5wdXNoKGNoaWxkKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IHdNYXggPSAwO1xyXG4gICAgICAgICAgICBsZXQgaFN1bSA9IDA7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub1BsYWNlLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IGNoaWxkcmVuVG9QbGFjZVtjXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBob25vckNoaWxkV2lkdGggPSAhKGNoaWxkLmxheW91dE9wdGlvbnMgJiYgY2hpbGQubGF5b3V0T3B0aW9ucy5pZ25vcmVXaWR0aCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaG9ub3JDaGlsZFdpZHRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdyA9IGNoaWxkLnByZWZTaXplLnc7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc3ZhbCh3TWF4KSAmJiBoYXN2YWwodykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd01heCA9IE1hdGgubWF4KHdNYXgsIHcpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgd01heCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGggPSBjaGlsZEhlaWdodChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaGFzdmFsKGhTdW0pICYmIGhhc3ZhbChoKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhTdW0gKz0gaDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGhTdW0gPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHBhcmVudFByZWZTaXplLncgPSB3TWF4O1xyXG4gICAgICAgICAgICBwYXJlbnRQcmVmU2l6ZS5oID0gaFN1bTtcclxuICAgICAgICB9LFxyXG5cclxuXHJcbiAgICAgICAgdXBkYXRlQ2hpbGRWaWV3cG9ydHM6IGZ1bmN0aW9uIChjaGlsZHJlbjogTGF5b3V0RW50cnlbXSwgcGFyZW50Vmlld3BvcnQ6IEJvdW5kc1VubW9kaWZpYWJsZSkge1xyXG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlblRvUGxhY2UgPSA8TGF5b3V0RW50cnlbXT5bXTtcclxuICAgICAgICAgICAgY29uc3QgY2hpbGRyZW5Ub0hpZGUgPSA8TGF5b3V0RW50cnlbXT5bXTtcclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGlsZHJlbi5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlbltjXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc051bWJlcihjaGlsZC5sYXlvdXRBcmcpICYmICEoY2hpbGQubGF5b3V0T3B0aW9ucyAmJiBjaGlsZC5sYXlvdXRPcHRpb25zLmhpZGUpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Ub1BsYWNlLnB1c2goY2hpbGQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5Ub0hpZGUucHVzaChjaGlsZCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgaW5kZXggdG8gbWFrZSB0aGUgc29ydCBzdGFibGVcclxuICAgICAgICAgICAgY29uc3QgaW5kZXhQcm9wID0gJ3dlYmdsaW1wc2Vfcm93TGF5b3V0X2luZGV4JztcclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGlsZHJlblRvUGxhY2UubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5Ub1BsYWNlW2NdO1xyXG4gICAgICAgICAgICAgICAgY2hpbGRbaW5kZXhQcm9wXSA9IGM7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkcmVuVG9QbGFjZS5zb3J0KGZ1bmN0aW9uIChhOiBMYXlvdXRFbnRyeSwgYjogTGF5b3V0RW50cnkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9yZGVyRGlmZiA9IGEubGF5b3V0QXJnIC0gYi5sYXlvdXRBcmc7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKG9yZGVyRGlmZiAhPT0gMCA/IG9yZGVyRGlmZiA6IChhW2luZGV4UHJvcF0gLSBiW2luZGV4UHJvcF0pKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBjYWxjdWxhdGUgYXNzdW1pbmcgc3VmZmljaWVudCBzcGFjZVxyXG4gICAgICAgICAgICBsZXQgZmxleERhdGEgPSBjYWxjdWxhdGVGbGV4RGF0YShjaGlsZHJlbiwgcGFyZW50Vmlld3BvcnQsIGNoaWxkSGVpZ2h0KTtcclxuXHJcbiAgICAgICAgICAgIC8vIHJlY2FsY3VsYXRlIGFsbG93aW5nICdwcmVmLW1heCcgY2hpbGRyZW4gdG8gc2hyaW5rIGlmIGluc3VmZmljaWVudCBzcGFjZVxyXG4gICAgICAgICAgICBpZiAoZmxleERhdGEudG90YWxIZWlnaHQgPiBwYXJlbnRWaWV3cG9ydC5oKSB7XHJcbiAgICAgICAgICAgICAgICBmbGV4RGF0YSA9IGNhbGN1bGF0ZUZsZXhEYXRhKGNoaWxkcmVuLCBwYXJlbnRWaWV3cG9ydCwgY2hpbGRIZWlnaHRPdmVyZnVsbCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0b3BUb0JvdHRvbSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaVN0YXJ0ID0gcGFyZW50Vmlld3BvcnQuaVN0YXJ0O1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaUVuZCA9IHBhcmVudFZpZXdwb3J0LmlFbmQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgakVuZCA9IHBhcmVudFZpZXdwb3J0LmpFbmQ7XHJcbiAgICAgICAgICAgICAgICBsZXQgalJlbWFpbmRlciA9IDA7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoaWxkcmVuVG9QbGFjZS5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5Ub1BsYWNlW2NdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgalN0YXJ0OiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IGZsZXhEYXRhLmNoaWxkSGVpZ2h0KGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzdmFsKGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpTdGFydCA9IGpFbmQgLSBoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgalN0YXJ0MCA9IGpFbmQgLSBmbGV4RGF0YS5mbGV4SGVpZ2h0IC0galJlbWFpbmRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalN0YXJ0ID0gTWF0aC5yb3VuZChqU3RhcnQwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgalJlbWFpbmRlciA9IGpTdGFydCAtIGpTdGFydDA7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjaGlsZC52aWV3cG9ydC5zZXRFZGdlcyhpU3RhcnQsIGlFbmQsIGpTdGFydCwgakVuZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgakVuZCA9IGpTdGFydDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlTdGFydCA9IHBhcmVudFZpZXdwb3J0LmlTdGFydDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGlFbmQgPSBwYXJlbnRWaWV3cG9ydC5pRW5kO1xyXG4gICAgICAgICAgICAgICAgbGV0IGpTdGFydCA9IHBhcmVudFZpZXdwb3J0LmpTdGFydDtcclxuICAgICAgICAgICAgICAgIGxldCBqUmVtYWluZGVyID0gMDtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub1BsYWNlLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBjaGlsZHJlblRvUGxhY2VbY107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBqRW5kOiBudW1iZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaCA9IGZsZXhEYXRhLmNoaWxkSGVpZ2h0KGNoaWxkKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzdmFsKGgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGpFbmQgPSBqU3RhcnQgKyBoO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgakVuZDAgPSBqU3RhcnQgKyBmbGV4RGF0YS5mbGV4SGVpZ2h0ICsgalJlbWFpbmRlcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgakVuZCA9IE1hdGgucm91bmQoakVuZDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBqUmVtYWluZGVyID0gakVuZDAgLSBqRW5kO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQudmlld3BvcnQuc2V0RWRnZXMoaVN0YXJ0LCBpRW5kLCBqU3RhcnQsIGpFbmQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGpTdGFydCA9IGpFbmQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hpbGRyZW5Ub0hpZGUubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuVG9IaWRlW2NdLnZpZXdwb3J0LnNldEVkZ2VzKDAsIDAsIDAsIDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG4iXX0=