UNPKG

webglimpse

Version:

Webglimpse is a data visualization library for the web.

124 lines 22.9 kB
import { Program, UniformColor, Attribute } from '../shader'; import { xyNdc_VERTSHADER, solid_FRAGSHADER, putQuadXys, fracToNdc } from '../misc'; import { newDynamicBuffer } from '../buffer'; import { GL, hasval } from '../util/util'; export function newBorderPainter(color, options) { if (!hasval(options)) { options = {}; } if (!hasval(options.drawTop)) { options.drawTop = true; } if (!hasval(options.drawLeft)) { options.drawLeft = true; } if (!hasval(options.drawRight)) { options.drawRight = true; } if (!hasval(options.drawBottom)) { options.drawBottom = true; } if (!hasval(options.thickness)) { options.thickness = 1; } const simple = (options.thickness === 1 && color.a >= 1); return (simple ? newSimpleBorderPainter(color, options) : newFullBorderPainter(color, options)); } function newFullBorderPainter(color, options) { const drawTop = options.drawTop; const drawLeft = options.drawLeft; const drawRight = options.drawRight; const drawBottom = options.drawBottom; const thickness = options.thickness; const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); const u_Color = new UniformColor(program, 'u_Color'); const a_XyNdc = new Attribute(program, 'a_XyNdc'); const numVertices = (drawTop ? 6 : 0) + (drawLeft ? 6 : 0) + (drawRight ? 6 : 0) + (drawBottom ? 6 : 0); const xy_NDC = new Float32Array(2 * numVertices); const xyBuffer_NDC = newDynamicBuffer(); return function (gl, viewport) { if (color.a >= 1) { gl.disable(GL.BLEND); } else { gl.blendFuncSeparate(GL.SRC_ALPHA, GL.ONE_MINUS_SRC_ALPHA, GL.ONE, GL.ONE_MINUS_SRC_ALPHA); gl.enable(GL.BLEND); } program.use(gl); u_Color.setData(gl, color); const w_NDC = 2 * thickness / viewport.w; const h_NDC = 2 * thickness / viewport.h; let index = 0; if (drawTop) { index = putQuadXys(xy_NDC, index, -1, (drawRight ? +1 - w_NDC : +1), +1, +1 - h_NDC); } if (drawRight) { index = putQuadXys(xy_NDC, index, +1 - w_NDC, +1, +1, (drawBottom ? -1 + h_NDC : -1)); } if (drawBottom) { index = putQuadXys(xy_NDC, index, (drawLeft ? -1 + w_NDC : -1), +1, -1 + h_NDC, -1); } if (drawLeft) { index = putQuadXys(xy_NDC, index, -1, -1 + w_NDC, (drawTop ? +1 - h_NDC : +1), -1); } xyBuffer_NDC.setData(xy_NDC); a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT); gl.drawArrays(GL.TRIANGLES, 0, numVertices); a_XyNdc.disable(gl); program.endUse(gl); }; } function newSimpleBorderPainter(color, options) { const drawTop = options.drawTop; const drawLeft = options.drawLeft; const drawRight = options.drawRight; const drawBottom = options.drawBottom; const program = new Program(xyNdc_VERTSHADER, solid_FRAGSHADER); const u_Color = new UniformColor(program, 'u_Color'); const a_XyNdc = new Attribute(program, 'a_XyNdc'); const numVertices = (drawTop ? 2 : 0) + (drawLeft ? 2 : 0) + (drawRight ? 2 : 0) + (drawBottom ? 2 : 0); const xy_NDC = new Float32Array(2 * numVertices); const xyBuffer_NDC = newDynamicBuffer(); return function (gl, viewport) { gl.disable(GL.BLEND); program.use(gl); u_Color.setData(gl, color); const left_NDC = fracToNdc(0.5 / viewport.w); const bottom_NDC = fracToNdc(0.5 / viewport.h); const right_NDC = fracToNdc((viewport.w - 0.5) / viewport.w); const top_NDC = fracToNdc((viewport.h - 0.5) / viewport.h); let n = 0; if (drawTop) { xy_NDC[n++] = -1; xy_NDC[n++] = top_NDC; xy_NDC[n++] = +1; xy_NDC[n++] = top_NDC; } if (drawRight) { xy_NDC[n++] = right_NDC; xy_NDC[n++] = +1; xy_NDC[n++] = right_NDC; xy_NDC[n++] = -1; } if (drawBottom) { xy_NDC[n++] = +1; xy_NDC[n++] = bottom_NDC; xy_NDC[n++] = -1; xy_NDC[n++] = bottom_NDC; } if (drawLeft) { xy_NDC[n++] = left_NDC; xy_NDC[n++] = -1; xy_NDC[n++] = left_NDC; xy_NDC[n++] = +1; } xyBuffer_NDC.setData(xy_NDC); a_XyNdc.setDataAndEnable(gl, xyBuffer_NDC, 2, GL.FLOAT); // IE does not support lineWidths other than 1, so make sure all browsers use lineWidth of 1 gl.lineWidth(1); gl.drawArrays(GL.LINES, 0, numVertices); a_XyNdc.disable(gl); program.endUse(gl); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9yZGVyX3BhaW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvd2ViZ2xpbXBzZS9wYWludGVyL2JvcmRlcl9wYWludGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQStCQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTdDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBWTFDLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFZLEVBQUUsT0FBdUI7SUFDbEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNsQixPQUFPLEdBQUcsRUFBRSxDQUFDO0tBQ2hCO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUIsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7S0FDMUI7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMzQixPQUFPLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztLQUMzQjtJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzVCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0tBQzVCO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDN0IsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7S0FDN0I7SUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFT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O1lBQ1osTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDM0MsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUM7U0FDOUM7UUFDRCxJQUFJLFFBQVEsRUFBRTtZQUNWLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixPQUFPLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhELDRGQUE0RjtRQUM1RixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFFeEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQztBQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIE1ldHJvbiwgSW5jLlxyXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLlxyXG4gKlxyXG4gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLFxyXG4gKiBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6XHJcbiAqXHJcbiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwgdGhpc1xyXG4gKiAgICBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci5cclxuICpcclxuICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLFxyXG4gKiAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uXHJcbiAqICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLlxyXG4gKlxyXG4gKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9yc1xyXG4gKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dFxyXG4gKiAgICBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uXHJcbiAqXHJcbiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgXCJBUyBJU1wiIEFORFxyXG4gKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFxyXG4gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFXHJcbiAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SXHJcbiAqIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFU1xyXG4gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7XHJcbiAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTlxyXG4gKiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVFxyXG4gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJU1xyXG4gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS5cclxuICovXHJcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnLi4vY29sb3InO1xyXG5pbXBvcnQgeyBQYWludGVyIH0gZnJvbSAnLi4vY29yZSc7XHJcbmltcG9ydCB7IFByb2dyYW0sIFVuaWZvcm1Db2xvciwgQXR0cmlidXRlIH0gZnJvbSAnLi4vc2hhZGVyJztcclxuaW1wb3J0IHsgeHlOZGNfVkVSVFNIQURFUiwgc29saWRfRlJBR1NIQURFUiwgcHV0UXVhZFh5cywgZnJhY1RvTmRjIH0gZnJvbSAnLi4vbWlzYyc7XHJcbmltcG9ydCB7IG5ld0R5bmFtaWNCdWZmZXIgfSBmcm9tICcuLi9idWZmZXInO1xyXG5pbXBvcnQgeyBCb3VuZHNVbm1vZGlmaWFibGUgfSBmcm9tICcuLi9ib3VuZHMnO1xyXG5pbXBvcnQgeyBHTCwgaGFzdmFsIH0gZnJvbSAnLi4vdXRpbC91dGlsJztcclxuXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEJvcmRlck9wdGlvbnMge1xyXG4gICAgZHJhd1RvcD86IGJvb2xlYW47XHJcbiAgICBkcmF3TGVmdD86IGJvb2xlYW47XHJcbiAgICBkcmF3UmlnaHQ/OiBib29sZWFuO1xyXG4gICAgZHJhd0JvdHRvbT86IGJvb2xlYW47XHJcbiAgICB0aGlja25lc3M/OiBudW1iZXI7XHJcbn1cclxuXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbmV3Qm9yZGVyUGFpbnRlcihjb2xvcjogQ29sb3IsIG9wdGlvbnM/OiBCb3JkZXJPcHRpb25zKTogUGFpbnRlciB7XHJcbiAgICBpZiAoIWhhc3ZhbChvcHRpb25zKSkge1xyXG4gICAgICAgIG9wdGlvbnMgPSB7fTtcclxuICAgIH1cclxuICAgIGlmICghaGFzdmFsKG9wdGlvbnMuZHJhd1RvcCkpIHtcclxuICAgICAgICBvcHRpb25zLmRyYXdUb3AgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFoYXN2YWwob3B0aW9ucy5kcmF3TGVmdCkpIHtcclxuICAgICAgICBvcHRpb25zLmRyYXdMZWZ0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghaGFzdmFsKG9wdGlvbnMuZHJhd1JpZ2h0KSkge1xyXG4gICAgICAgIG9wdGlvbnMuZHJhd1JpZ2h0ID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmICghaGFzdmFsKG9wdGlvbnMuZHJhd0JvdHRvbSkpIHtcclxuICAgICAgICBvcHRpb25zLmRyYXdCb3R0b20gPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKCFoYXN2YWwob3B0aW9ucy50aGlja25lc3MpKSB7XHJcbiAgICAgICAgb3B0aW9ucy50aGlja25lc3MgPSAxO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHNpbXBsZSA9IChvcHRpb25zLnRoaWNrbmVzcyA9PT0gMSAmJiBjb2xvci5hID49IDEpO1xyXG4gICAgcmV0dXJuIChzaW1wbGUgPyBuZXdTaW1wbGVCb3JkZXJQYWludGVyKGNvbG9yLCBvcHRpb25zKSA6IG5ld0Z1bGxCb3JkZXJQYWludGVyKGNvbG9yLCBvcHRpb25zKSk7XHJcbn1cclxuXHJcblxyXG5mdW5jdGlvbiBuZXdGdWxsQm9yZGVyUGFpbnRlcihjb2xvcjogQ29sb3IsIG9wdGlvbnM6IEJvcmRlck9wdGlvbnMpOiBQYWludGVyIHtcclxuICAgIGNvbnN0IGRyYXdUb3AgPSBvcHRpb25zLmRyYXdUb3A7XHJcbiAgICBjb25zdCBkcmF3TGVmdCA9IG9wdGlvbnMuZHJhd0xlZnQ7XHJcbiAgICBjb25zdCBkcmF3UmlnaHQgPSBvcHRpb25zLmRyYXdSaWdodDtcclxuICAgIGNvbnN0IGRyYXdCb3R0b20gPSBvcHRpb25zLmRyYXdCb3R0b207XHJcbiAgICBjb25zdCB0aGlja25lc3MgPSBvcHRpb25zLnRoaWNrbmVzcztcclxuXHJcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFByb2dyYW0oeHlOZGNfVkVSVFNIQURFUiwgc29saWRfRlJBR1NIQURFUik7XHJcbiAgICBjb25zdCB1X0NvbG9yID0gbmV3IFVuaWZvcm1Db2xvcihwcm9ncmFtLCAndV9Db2xvcicpO1xyXG4gICAgY29uc3QgYV9YeU5kYyA9IG5ldyBBdHRyaWJ1dGUocHJvZ3JhbSwgJ2FfWHlOZGMnKTtcclxuXHJcbiAgICBjb25zdCBudW1WZXJ0aWNlcyA9IChkcmF3VG9wID8gNiA6IDApICsgKGRyYXdMZWZ0ID8gNiA6IDApICsgKGRyYXdSaWdodCA/IDYgOiAwKSArIChkcmF3Qm90dG9tID8gNiA6IDApO1xyXG4gICAgY29uc3QgeHlfTkRDID0gbmV3IEZsb2F0MzJBcnJheSgyICogbnVtVmVydGljZXMpO1xyXG4gICAgY29uc3QgeHlCdWZmZXJfTkRDID0gbmV3RHluYW1pY0J1ZmZlcigpO1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdmlld3BvcnQ6IEJvdW5kc1VubW9kaWZpYWJsZSkge1xyXG4gICAgICAgIGlmIChjb2xvci5hID49IDEpIHtcclxuICAgICAgICAgICAgZ2wuZGlzYWJsZShHTC5CTEVORCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBnbC5ibGVuZEZ1bmNTZXBhcmF0ZShHTC5TUkNfQUxQSEEsIEdMLk9ORV9NSU5VU19TUkNfQUxQSEEsIEdMLk9ORSwgR0wuT05FX01JTlVTX1NSQ19BTFBIQSk7XHJcbiAgICAgICAgICAgIGdsLmVuYWJsZShHTC5CTEVORCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcm9ncmFtLnVzZShnbCk7XHJcbiAgICAgICAgdV9Db2xvci5zZXREYXRhKGdsLCBjb2xvcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHdfTkRDID0gMiAqIHRoaWNrbmVzcyAvIHZpZXdwb3J0Lnc7XHJcbiAgICAgICAgY29uc3QgaF9OREMgPSAyICogdGhpY2tuZXNzIC8gdmlld3BvcnQuaDtcclxuICAgICAgICBsZXQgaW5kZXggPSAwO1xyXG4gICAgICAgIGlmIChkcmF3VG9wKSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gcHV0UXVhZFh5cyh4eV9OREMsIGluZGV4LCAtMSwgKGRyYXdSaWdodCA/ICsxIC0gd19OREMgOiArMSksICsxLCArMSAtIGhfTkRDKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRyYXdSaWdodCkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHB1dFF1YWRYeXMoeHlfTkRDLCBpbmRleCwgKzEgLSB3X05EQywgKzEsICsxLCAoZHJhd0JvdHRvbSA/IC0xICsgaF9OREMgOiAtMSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZHJhd0JvdHRvbSkge1xyXG4gICAgICAgICAgICBpbmRleCA9IHB1dFF1YWRYeXMoeHlfTkRDLCBpbmRleCwgKGRyYXdMZWZ0ID8gLTEgKyB3X05EQyA6IC0xKSwgKzEsIC0xICsgaF9OREMsIC0xKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRyYXdMZWZ0KSB7XHJcbiAgICAgICAgICAgIGluZGV4ID0gcHV0UXVhZFh5cyh4eV9OREMsIGluZGV4LCAtMSwgLTEgKyB3X05EQywgKGRyYXdUb3AgPyArMSAtIGhfTkRDIDogKzEpLCAtMSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB4eUJ1ZmZlcl9OREMuc2V0RGF0YSh4eV9OREMpO1xyXG4gICAgICAgIGFfWHlOZGMuc2V0RGF0YUFuZEVuYWJsZShnbCwgeHlCdWZmZXJfTkRDLCAyLCBHTC5GTE9BVCk7XHJcblxyXG4gICAgICAgIGdsLmRyYXdBcnJheXMoR0wuVFJJQU5HTEVTLCAwLCBudW1WZXJ0aWNlcyk7XHJcblxyXG4gICAgICAgIGFfWHlOZGMuZGlzYWJsZShnbCk7XHJcbiAgICAgICAgcHJvZ3JhbS5lbmRVc2UoZ2wpO1xyXG4gICAgfTtcclxufVxyXG5cclxuXHJcbmZ1bmN0aW9uIG5ld1NpbXBsZUJvcmRlclBhaW50ZXIoY29sb3I6IENvbG9yLCBvcHRpb25zOiBCb3JkZXJPcHRpb25zKTogUGFpbnRlciB7XHJcbiAgICBjb25zdCBkcmF3VG9wID0gb3B0aW9ucy5kcmF3VG9wO1xyXG4gICAgY29uc3QgZHJhd0xlZnQgPSBvcHRpb25zLmRyYXdMZWZ0O1xyXG4gICAgY29uc3QgZHJhd1JpZ2h0ID0gb3B0aW9ucy5kcmF3UmlnaHQ7XHJcbiAgICBjb25zdCBkcmF3Qm90dG9tID0gb3B0aW9ucy5kcmF3Qm90dG9tO1xyXG5cclxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgUHJvZ3JhbSh4eU5kY19WRVJUU0hBREVSLCBzb2xpZF9GUkFHU0hBREVSKTtcclxuICAgIGNvbnN0IHVfQ29sb3IgPSBuZXcgVW5pZm9ybUNvbG9yKHByb2dyYW0sICd1X0NvbG9yJyk7XHJcbiAgICBjb25zdCBhX1h5TmRjID0gbmV3IEF0dHJpYnV0ZShwcm9ncmFtLCAnYV9YeU5kYycpO1xyXG5cclxuICAgIGNvbnN0IG51bVZlcnRpY2VzID0gKGRyYXdUb3AgPyAyIDogMCkgKyAoZHJhd0xlZnQgPyAyIDogMCkgKyAoZHJhd1JpZ2h0ID8gMiA6IDApICsgKGRyYXdCb3R0b20gPyAyIDogMCk7XHJcbiAgICBjb25zdCB4eV9OREMgPSBuZXcgRmxvYXQzMkFycmF5KDIgKiBudW1WZXJ0aWNlcyk7XHJcbiAgICBjb25zdCB4eUJ1ZmZlcl9OREMgPSBuZXdEeW5hbWljQnVmZmVyKCk7XHJcblxyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB2aWV3cG9ydDogQm91bmRzVW5tb2RpZmlhYmxlKSB7XHJcbiAgICAgICAgZ2wuZGlzYWJsZShHTC5CTEVORCk7XHJcblxyXG4gICAgICAgIHByb2dyYW0udXNlKGdsKTtcclxuICAgICAgICB1X0NvbG9yLnNldERhdGEoZ2wsIGNvbG9yKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGVmdF9OREMgPSBmcmFjVG9OZGMoMC41IC8gdmlld3BvcnQudyk7XHJcbiAgICAgICAgY29uc3QgYm90dG9tX05EQyA9IGZyYWNUb05kYygwLjUgLyB2aWV3cG9ydC5oKTtcclxuICAgICAgICBjb25zdCByaWdodF9OREMgPSBmcmFjVG9OZGMoKHZpZXdwb3J0LncgLSAwLjUpIC8gdmlld3BvcnQudyk7XHJcbiAgICAgICAgY29uc3QgdG9wX05EQyA9IGZyYWNUb05kYygodmlld3BvcnQuaCAtIDAuNSkgLyB2aWV3cG9ydC5oKTtcclxuXHJcbiAgICAgICAgbGV0IG4gPSAwO1xyXG4gICAgICAgIGlmIChkcmF3VG9wKSB7XHJcbiAgICAgICAgICAgIHh5X05EQ1tuKytdID0gLTE7IHh5X05EQ1tuKytdID0gdG9wX05EQztcclxuICAgICAgICAgICAgeHlfTkRDW24rK10gPSArMTsgeHlfTkRDW24rK10gPSB0b3BfTkRDO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZHJhd1JpZ2h0KSB7XHJcbiAgICAgICAgICAgIHh5X05EQ1tuKytdID0gcmlnaHRfTkRDOyB4eV9ORENbbisrXSA9ICsxO1xyXG4gICAgICAgICAgICB4eV9ORENbbisrXSA9IHJpZ2h0X05EQzsgeHlfTkRDW24rK10gPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRyYXdCb3R0b20pIHtcclxuICAgICAgICAgICAgeHlfTkRDW24rK10gPSArMTsgeHlfTkRDW24rK10gPSBib3R0b21fTkRDO1xyXG4gICAgICAgICAgICB4eV9ORENbbisrXSA9IC0xOyB4eV9ORENbbisrXSA9IGJvdHRvbV9OREM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkcmF3TGVmdCkge1xyXG4gICAgICAgICAgICB4eV9ORENbbisrXSA9IGxlZnRfTkRDOyB4eV9ORENbbisrXSA9IC0xO1xyXG4gICAgICAgICAgICB4eV9ORENbbisrXSA9IGxlZnRfTkRDOyB4eV9ORENbbisrXSA9ICsxO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgeHlCdWZmZXJfTkRDLnNldERhdGEoeHlfTkRDKTtcclxuICAgICAgICBhX1h5TmRjLnNldERhdGFBbmRFbmFibGUoZ2wsIHh5QnVmZmVyX05EQywgMiwgR0wuRkxPQVQpO1xyXG5cclxuICAgICAgICAvLyBJRSBkb2VzIG5vdCBzdXBwb3J0IGxpbmVXaWR0aHMgb3RoZXIgdGhhbiAxLCBzbyBtYWtlIHN1cmUgYWxsIGJyb3dzZXJzIHVzZSBsaW5lV2lkdGggb2YgMVxyXG4gICAgICAgIGdsLmxpbmVXaWR0aCgxKTtcclxuICAgICAgICBnbC5kcmF3QXJyYXlzKEdMLkxJTkVTLCAwLCBudW1WZXJ0aWNlcyk7XHJcblxyXG4gICAgICAgIGFfWHlOZGMuZGlzYWJsZShnbCk7XHJcbiAgICAgICAgcHJvZ3JhbS5lbmRVc2UoZ2wpO1xyXG4gICAgfTtcclxufVxyXG5cclxuXHJcbiJdfQ==