{"version":3,"sources":["img/line@2x.png","img/rectangle@2x.png","img/ellipse@2x.png","literally_canvas/fontmetrics.js","literally_canvas/tools/base.js","literally_canvas/lineEndCapShapes.js","literally_canvas/canvasRenderer.js","literally_canvas/svgRenderer.js","literally_canvas/util.js","literally_canvas/TextRenderer.js","literally_canvas/shapes.js","literally_canvas/tools/Pencil.js","literally_canvas/actions.js","literally_canvas/bindEvents.js","literally_canvas/defaultOptions.js","literally_canvas/renderSnapshotToImage.js","literally_canvas/renderSnapshotToSVG.js","literally_canvas/LiterallyCanvas.js","literally_canvas/localization.js","literally_canvas/math.js","literally_canvas/index.js","CanvasContainer.js","PrimaryToolBar.js","constants.js","SecondaryToolBar.js","CanvasTools/Pencil.js","CanvasTools/Eraser.js","initializeCanvasRenderers.js","CanvasTools/Rectangle.js","CanvasTools/Ellipse.js","CanvasTools/Arrow.js","CanvasTools/Line.js","CanvasTools/Text.js","App.js","serviceWorker.js","index.js","img/brush@2x.png","img/image@2x.png","img/pen@2x.png","img/eraser@2x.png","img/redo@2x.png","img/shape@2x.png","img/text@2x.png","img/undo@2x.png","img/arrow@2x.png"],"names":["module","exports","entityMap","&","<",">","\"","'","/","`","=","escapeHTML","string","String","replace","s","document","defaultView","getComputedStyle","CanvasRenderingContext2D","prototype","measureTextWidth","measureText","measureText2","textstring","fontSize","fontString","metrics","this","isSpace","test","fontsize","leadDiv","createElement","style","position","opacity","font","innerHTML","body","appendChild","leading","element","property","leadDivHeight","getPropertyValue","removeChild","ascent","descent","bounds","minx","maxx","width","miny","maxy","height","canvas","ctx","getContext","w","h","baseline","fillStyle","fillRect","fillText","padding","pixelData","getImageData","data","i","w4","len","length","step","Tool","constructor","begin","x","y","lc","continue","end","didBecomeActive","willBecomeInactive","name","iconName","usesSimpleAPI","optionsStyle","ToolWithStroke","super","strokeWidth","opts","defaultStrokeWidth","unsubscribeFuncs","unsubscribe","map","func","push","on","trigger","getPoints","angle","Math","cos","PI","sin","lineEndCapShapes","arrow","drawToCanvas","color","lineWidth","strokeStyle","beginPath","points","moveTo","lineTo","fill","svg","concat","p","renderers","defineCanvasRenderer","shapeName","drawFunc","drawLatestFunc","noop","renderShapeToContext","shape","shouldIgnoreUnsupportedShapes","retryCallback","shouldOnlyDrawLatest","bufferCtx","className","console","warn","renderShapeToCanvas","fillColor","strokeColor","strokeRect","save","halfWidth","floor","halfHeight","centerX","centerY","translate","scale","abs","arc","closePath","restore","stroke","_drawHandle","_ref","handleSize","getTopLeftHandleRect","getTopRightHandleRect","getBottomLeftHandleRect","getBottomRightHandleRect","backgroundColor","_br","margin","setLineDash","image","drawImage","onload","x1","x2","y1","y2","lineCap","capStyle","dash","arrowWidth","max","endCapShapes","atan2","_drawRawLinePath","close","size","point","slice","drawLinePath","smoothedPoints","drawLinePathLatest","tail","segmentStart","segmentSize","tailSize","drawStart","drawEnd","globalCompositeOperation","renderer","_makeRenderer","draw","isClosed","defineSVGRenderer","shapeToSVGFunc","renderShapeToSVG","addImageOnload","img","fn","oldOnload","last","array","n","arguments","undefined","Array","call","classSet","classNameToIsPresent","classNames","key","join","matchElementSize","elementToMatch","elementsToResize","callback","resize","el","offsetWidth","offsetHeight","setAttribute","addEventListener","window","combineCanvases","c","_len","canvases","_key","renderShapes","shapes","renderShapesToSVG","getBoundingRect","rects","minX","minY","maxX","maxY","rect","min","ceil","getDefaultImageRect","shapeBoundingRects","explicitSize","top","right","bottom","left","getBackingScale","context","devicePixelRatio","getGUID","s4","random","toString","substring","requestAnimationFrame","f","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","cancelAnimationFrame","webkitCancelRequestAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","clearTimeout","naturalWidth","naturalHeight","src","dashString","capString","offset","widthString","forcedWidth","heightString","forcedHeight","textSplitOnLines","text","split","lines","line","dy","parseFontString","fontItems","item","maybeSize","parseInt","isNaN","fontFamily","getNextLine","endIndex","lastGoodIndex","lastOkayIndex","wasInWord","isEndOfString","isWhitespace","match","isNonWord","textToHere","doesSubstringFit","nextWordStartIndex","getLinesToRender","textLine","nextLine","remainingText","TextRenderer","textBaseline","emDashWidth","caratWidth","metricses","_ref2","_ref3","_ref4","_ref5","_ref6","_ref7","_ref8","_ref9","_ref10","boundingBoxWidth","getWidth","isEditing","getHeight","defineShape","props","Shape","a","b","d","e","g","j","k","l","m","o","fromJSON","legacyDrawFunc","legacyDrawLatestFunc","drawLatest","toSVG","legacySVGFunc","svgFunc","createShape","id","JSONToShape","log","shapeToJSON","toJSON","bspline","order","_dual","_refine","refined","index","_mid","dualed","args","crossOrigin","toJSONData","imageSrc","imageObject","Image","move","moveInfo","xDiff","yDiff","setUpperLeft","upperLeft","br","_createLinePathFromData","pointData","pointCoordinatePairs","pointSize","pointColor","smooth","smoothedPointCoordinatePairs","linePathFuncs","pow","sampleSize","addPoint","_doAllPointsShareStyle","pts","pt","forEach","v","lineHeight","setText","setFont","setPosition","setSize","enforceMaxBoundingRect","lcBoundingRect","dx","Pencil","getColor","currentShape","makeShape","makePoint","lastEventTime","Date","now","timeDiff","eventTimeThreshold","drawShapeInProgress","saveShape","ClearAction","oldShapes","newShapes","do","repaintLayer","undo","MoveAction","selectedShape","previousPosition","newPosition","AddShapeAction","previousShapeId","found","pop","coordsForTouchEvent","tx","changedTouches","clientX","ty","clientY","getBoundingClientRect","bindEvents","panWithKeyboard","unsubs","mouseMoveListener","preventDefault","pointerMove","mouseUpListener","onselectstart","pointerUp","removeEventListener","target","tagName","toLowerCase","pointerDown","touchMoveListener","touchEndListener","touches","listener","keyCode","pan","repaintAllLayers","defaultOptions","imageURLPrefix","primaryColor","secondaryColor","strokeWidths","toolbarPosition","keyboardShortcuts","imageSize","backgroundShapes","watermarkImage","watermarkScale","zoomMin","zoomMax","zoomStep","snapshot","onInit","tools","renderSnapshotToImage","colors","background","allShapes","watermarkCanvas","watermarkCtx","renderSnapshotToSVG","INFINITE","LiterallyCanvas","arg1","arg2","setImageSize","bind","containerEl","HTMLElement","config","primary","secondary","backgroundCanvas","backgroundCtx","buffer","backingScale","_shapesInProgress","undoStack","redoStack","isDragging","setTool","setZoom","loadSnapshot","isBound","bindToElement","_unsubscribeEvents","repaintAll","keepPanInImageBounds","respondToSizeChange","tool","_teardown","dispatchEvent","CustomEvent","detail","wrapper","getRenderScale","clientCoordsToDrawingCoords","drawingCoordsToClientCoords","setShapesInProgress","newVal","rawX","rawY","setColor","triggerShapeSaveEvent","execute","actions","setPan","renderScale","zoom","factor","newScale","round","center","oldScale","setWatermarkImage","newImage","repaintLayerKey","dirty","clearRect","_renderWatermark","clipped","transformed","layerKey","worryAboutRetina","drawShapes","contexts","clip","_len2","_key2","clear","triggerClearEvent","action","redo","canUndo","canRedo","getPixel","pixel","getContentBounds","getImage","includeWatermark","scaleDownRetina","getSnapshot","canvasForExport","canvasWithBackground","backgroundImageOrCanvas","keys","indexOf","getSnapshotJSON","JSON","stringify","getSVGString","undostack","shapeRepr","loadSnapshotJSON","str","parse","strings","localize","localStrings","_","math","polyLeft","polyRight","normals","_slope","diff","slope","vector","unit","sqrt","scalePositionScalar","val","viewportSize","LC","canvasRenderer","localization","svgRenderer","util","toolsBase","LCCanvasContainer","React","Component","shouldComponentUpdate","render","PrimaryToolBar","handleFileUploadRef","r","fileUpload","handleFileUpload","click","renderLine1","onClick","showPenColorPicker","penColor","tooltip","showBorderPicker","showBrushPicker","IconBrush","alt","showShapePicker","IconShape","handleTextSelection","IconText","handlePenSelection","IconPen","hidePhoto","Fragment","IconImage","type","accept","ref","onChange","handlePhoto","renderLine2","handleUndo","IconUndo","handleRedo","IconRedo","handleEraseSelection","IconErase","strokeOptions","value","cssBorderWidth","SecondaryToolBar","renderColorSelection","additionalColors","colorType","GithubPicker","selectedColor","onItemSelect","hex","renderBrushSelection","content","opt","isDashed","brushSize","borderTopWidth","borderColor","renderShapeSelection","IconArrow","IconLine","IconRect","IconEllipse","selected","JPencil","getStrokeWidth","Eraser","initializeCanvasRenderers","JRectangle","JEllipse","JArrow","JLine","hasEndArrow","Text","getIsPointInBox","box","[object Object]","currentShapeState","initialShapeBoundingRect","dragAction","didDrag","updateInputEl","_updateInputEl","switchAway","_ensureNotEditing","_clearCurrentShape","newColor","_setShapesInProgress","commit","_exitEditingState","_getSelectionShape","selectionShape","dragOffset","brRight","brBottom","_enterEditingState","inputEl","transformOrigin","border","outline","zIndex","overflow","stopPropagation","focus","withMargin","transformString","transform","webkitTransform","MozTransform","msTransform","OTransform","initClass","App","_this","state","hideUpload","newUpload","formData","valid","availableShapes","JEraser","backgroundSizes","buttonsAndMargins","onDocumentResize","setInitialSizes","expectedHeight","canvasContainerDOM","canvasFrameDOM","addListenerMulti","eventNames","events","iLen","subscribeToWidget","JFCustomWidget","subscribe","setState","onlyBlankCanvas","uploadImage","getWidgetSettings","exportScale","canvasScale","canvasFrame","getElementById","sendData","ourLC","toDataURL","hideWidgetError","mouseUpEvent","createEvent","initMouseEvent","sendDisableOrEnableButtons","JFCustomWidgetUtils","getFormDomain","getTime","enterprise","setLCBackgroundFromURL","base","url","owner","location","href","arr","requestFrameResize","sendSubmit","showfillColorPicker","setLCBackgroundFromImage","optWidth","viewWidth","expectedWidth","backgroundShape","imgSrc","addCors","event","files","firstFile","alert","loadImage","details","orientation","handleClear","handleSecondaryToolbarSelect","toolIndex","findIndex","t","componentDidMount","documentWidth","CanvasContainer","Boolean","hostname","ReactDOM","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.1564042a.chunk.js","sourcesContent":["module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAoCAYAAACFFRgXAAAAAXNSR0IArs4c6QAABFRJREFUWAnVmF9oHFUUxu+Z2c3urBappXVRilZBFPRFQaRgoUXUpBrxD62IFcTWpSa7kVgzs02UK02ysw8WMklaA60aW1vYgoRQ7YMPraDog1Sx+CBURKlGoYhS7eyymbl+05DdO9ttTNLZ3XFe9tyPIfd3vzn33HPD2P/g4fxkJJ8/uMJDpbDzGob1oHDZISKxRjB6M9TAum49zwQ7wJiIzhlLjhJWhwE7wISYrMIiHYj9EDqHvXy17TP7ALtDNpMY/UQqPRIqYM7Hr7VtpwDYdhkW3p7WEupmzrt+Cw0wYJP2RecjpMA9PliiE5qmbgHs354eCuCBvvE7Z5lzQjBxswyLNDgQT9y9k/ONs/N6y4F1fWwDMXdKCLFyHurSL9Hr+Xxm0Kdh0FLg3frYM45w30MaxKpgVFZU8WIu13OoqlUjtRo2N8rqI7tcwd4GbKQyM9FfakTpzOUyUxWtJmi6w4VCQT391YwlGHvZx0J0Dh+8I59Pn/HpNYOmAnM+kSheLB3F5uqUOQDxrRpt6xga2vmLrNeLm3bScb5/jW2XTtbCYhd9Ek/QA4uB9RbQFIez2bHbhYuyJditsmuksMl16+I7UqlUWdYXihsO3K+PrHcYTaNsrZJBALvHNHvekLXFxA0FNozRp3DMHgZsfB4GDcwsupiUaWbemdeW8tuwHNb10R4m3IIMC7ALClMeXS6st7DAHeZcKEXb2ot87ZGdg7MzihrpGB7u+kbWlxoHCsz5u3HbvvAB0uBJHwjRd4zFUGNTP/v0ZQwCA0YlWOW67jRg18scRHQqrq14gvMX/pT15caB5PDAgHWb6zhf1MIi4Y7EteTDQcF6i7xqh/v7rPscYsexuVb7XCNmYnPthsM4hYN7rgo4mx3tFK44CthEFYkcUqjbNNNobIJ/lt2t6fpIF1JgEtWgTcL6R1HVpwF7RNICDZcMDDepWLw+j+v3EEgqXwhl6/dIVHloeDh9KlDCmj9WmbBGrzu0LCv26zk2iQZma80L30fblPbBwfSPNXrgw0UDG8a+lUyUcZVhG3wUxD7TtGse53z7Hz69QYNqt7/ABIax/xbAet3WHfJrqADHbryJbctktpdkvZHxfzpsGCP3CpeO4yqT9IEQ7cXm2hV02fLNUWew4MGB06sD/4j7VIbF5nKx1TK40b7abFiP/4pVAs6+BNjDeEe60TJbUZWtOBDer7P4pkh1HUYfOwjYCTgrL+h8hNGmXC59xRttM4h9Ocx5oa1ozxzE5npOnhyf/iwjtd00u87KeiviCrCuT1xHrPQhDoZNPhCiLzUt9hjnqfM+vUWDS8D9/eNrnfLsx+hS7vJz0NQNyeSzvb1bbL/eulEkm7VWO2Xnc8CulTEUUkZjWvcrvb3kynqr4wjydTOOWgmWBG60r+XM9FuMpVvNd9n8HvDX6GGcuYpAJbSG23AgHLvszZAIczncZ93vMLExSur0nnw37l/hff4FrOp+fn+l9O0AAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAAALhJREFUaAXtmsENwjAUxQCxK1sA7RRlWpAqpQNYsoDIuSSX95Rv55jz8tzepwnWZYIZ9hGuY5D74zaOf7Wvy2u/7zRGGuTX3l9GMiIR6GlJYHFtRjA6KZgRCSyuzQhGJwUzIoHFtRnB6KRgRiSwuDYjGJ0UzIgEFtdmBKOTghmRwOLajGB0UjAjElhcmxGMTgpmRAKLazOC0UnBjEhgcW1GMDopmBEJLK6dxsjxO2j8ssFIvhycxsgHOl4HnAQToC0AAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAAAXNSR0IArs4c6QAABYhJREFUaAXdml1MW2UYx5/3rdCyxK06jIvpNhw4uJjemQlXrLCYmIgajSbesGbK7oxcDbOAH8TIrpZ45+bSLHFcaXRbwo1TuDCg8cKE7GJ8LYWRZYlsdiNLaaHn9fm/p297WuhaWGl7eG7OOT1fv3/f7/9zBJUohoa+27MWl28kSbUKpZoVqSYhaI9S4mm8Qgi1rBQ9ECRmlRBTHhITT3mtkb6+Uw9KgSCe5CFnz14IxOOqi5T1NqO2K6VqNvM8IcQqkRojIX/xesXV06c/XtzM/c5rtyQEAlZWrK9IqW5+mMQDpZTU0PACNTYGqP65Z2jvXj/V1XnJ67W1xeOrFIvF6d69KC39+x/NzS1SJHKHLMsyPBYX2yWfTw5sRdCmhJw7F/Y/fLjaJ8j6hKtJncfjoeaWBmppbqCXDh9g6FoDVdQ2Hk/QzPQC3ZyK0NTNCCWTSdZCMUXy2927a4Z6e0PRoh7EFxUtZHDwfJeVVGGuCs9ylaAjR5roWPBV8vt1Eyj2fXmvi0aXafT3v+nGjVkuaAW0+9IjQv39PVfz3uQ4UZSQwS/Pf8aN92t+gTh0KECdx4/Svn31jseUbvfu3SW6/utfdOvWIpeOUNw5nOn/vOebQm94rJBwOOy7PZ+4yCI+RCl0Hn+NWltfKfTMkpyfmJhkQX/q0mExw/sP1p4MhUIr+R6eVwhELMwnfuOq1Ia6/+57ndTUtD/fc7bl99nZ2/TTj9cJbYmr2viBg7Ud+cToHmcjCpQERKANnPzonbKLABP+OLzbboeqzWbaiJbIs9HPqTbxKUqi+0QX1df7N7qsLL/t2uWjRhY0OTlDa8nkyx3HuhKjY9f+yH35OiHonbhRX+A2Id7/4HUKBJ7PvafsxxCDzgU9Gkcw2NH1z+jotSknSFbVwjiBLha9Exp2uduEEyx3HyxgAhsYweq8JksIBjuME+hiy9U7OWEK7YMJbGC0WTN3pIVg2oER2+5mj2auqLI9jGFgBCuYDV5aCOZOmHZgxN6uwc689Em2YAMjWPV8L/UwLUQr4wkg5k6YdlR7gBGsrKbblIoWklix3mJ4iQlgqeZO2/lngBGsYNbLCOzgiKcgEKJnsdi6ITDj1qHXQiwEKzse/tuxnsBU3C0BVjCDHRoklqfcN9dgUbTZ9UQlRYMVzGCHBmkpqw1AmAa4LbAaRUCDJKGacVDJ+RTev5XAkloHa5DcHzfiAGtst4VhhgbJgyQ3dtJGgduEwNxAQAOXiO07GbfDTWIMMzToccRN8PlYuWqpZZyE7+S2MMzQgMauLUuYZ26LDLOIorHPQQAcQLdFmlnRnCQl9JIRNqbbwjDDFJdSyHEIgBfrtjDMcPYlrH1eca1GIndS/pE75MDrAjPYoUHa+Qk1BlcchrJbAqy2k6/GoMEeRzg/AQFwxd0SadYUuxaCJAsLsGDtwxWv9gAjWDmsFLu9QtSJFU6yID8Ba7/aA4xg5QZyySSF0lMUZIp4TInBzYO1X60BNjCCFcyGMy0EypAp4hWXzk+YC6pti9wJGMFqSgOMaSE4QLqLy+s+kizIT1RbgAlsYLRZM4RZQpCzQ7qL+2aFJAvyE9USYAET2MCYm19c58bD5Q6ydc/F1zE9PU8tLS8S3PBKxtJSlC7/MEJra0nimciZ/oEezt1kxzohOI38Q7D9zcPIR8zMLGhjolJiIGL48gg9ehRjv1cMD3xxqjdbgn2UVbWcFyBnx3VxHH32xe9/rkg1Q3XCu+2xTYzbTE7KzH7eHCIu2RHJ0IxWItenp7PE7IQPBoygHfEJhxGDLXISrv6oxinGCEJuxU5LbP0zJ+5Wr9T65BXnlCP3XYWOH9trFbrZed58eKZNcfZiYWPCATQGICwbODba7GCfAEvsUn549j9QVeWYtyHjrAAAAABJRU5ErkJggg==\"","/**\n This library rewrites the Canvas2D \"measureText\" function\n so that it returns a more complete metrics object.\n This library is licensed under the MIT (Expat) license,\n the text for which is included below.\n\n** -----------------------------------------------------------------------------\n\n CHANGELOG:\n\n 2012-01-21 - Whitespace handling added by Joe Turner\n (https://github.com/oampo)\n\n 2015-06-08 - Various hacks added by Steve Johnson\n\n** -----------------------------------------------------------------------------\n\n Copyright (C) 2011 by Mike \"Pomax\" Kamermans\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in\n all copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n**/\n(function() {\n var NAME = \"FontMetrics Library\";\n var VERSION = \"1-2012.0121.1300\";\n\n var entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\",\n };\n\n function escapeHTML(string) {\n return String(string).replace(/[&<>\"'`=/]/g, function(s) {\n return entityMap[s];\n });\n }\n\n // if there is no getComputedStyle, this library won't work.\n if (!document.defaultView.getComputedStyle) {\n throw \"ERROR: 'document.defaultView.getComputedStyle' not found. This library only works in browsers that can report computed CSS values.\";\n }\n\n // store the old text metrics function on the Canvas2D prototype\n CanvasRenderingContext2D.prototype.measureTextWidth =\n CanvasRenderingContext2D.prototype.measureText;\n\n /**\n * shortcut function for getting computed CSS values\n */\n var getCSSValue = function(element, property) {\n return document.defaultView\n .getComputedStyle(element, null)\n .getPropertyValue(property);\n };\n\n // debug function\n var show = function(canvas, ctx, xstart, w, h, metrics) {\n document.body.appendChild(canvas);\n ctx.strokeStyle = \"rgba(0, 0, 0, 0.5)\";\n\n ctx.beginPath();\n ctx.moveTo(xstart, 0);\n ctx.lineTo(xstart, h);\n ctx.closePath();\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(xstart + metrics.bounds.maxx, 0);\n ctx.lineTo(xstart + metrics.bounds.maxx, h);\n ctx.closePath();\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(0, h / 2 - metrics.ascent);\n ctx.lineTo(w, h / 2 - metrics.ascent);\n ctx.closePath();\n ctx.stroke();\n\n ctx.beginPath();\n ctx.moveTo(0, h / 2 + metrics.descent);\n ctx.lineTo(w, h / 2 + metrics.descent);\n ctx.closePath();\n ctx.stroke();\n };\n\n /**\n * The new text metrics function\n */\n CanvasRenderingContext2D.prototype.measureText2 = function(\n textstring,\n fontSize,\n fontString,\n ) {\n var metrics = this.measureTextWidth(textstring),\n isSpace = !/\\S/.test(textstring);\n metrics.fontsize = fontSize;\n\n // for text lead values, we meaure a multiline text container.\n var leadDiv = document.createElement(\"div\");\n leadDiv.style.position = \"absolute\";\n leadDiv.style.opacity = 0;\n leadDiv.style.font = fontString;\n leadDiv.innerHTML =\n escapeHTML(textstring) + \"
\" + escapeHTML(textstring);\n document.body.appendChild(leadDiv);\n\n // make some initial guess at the text leading (using the standard TeX ratio)\n metrics.leading = 1.2 * fontSize;\n\n // then we try to get the real value from the browser\n var leadDivHeight = getCSSValue(leadDiv, \"height\");\n leadDivHeight = leadDivHeight.replace(\"px\", \"\");\n if (leadDivHeight >= fontSize * 2) {\n metrics.leading = (leadDivHeight / 2) | 0;\n }\n document.body.removeChild(leadDiv);\n\n // if we're not dealing with white space, we can compute metrics\n if (!isSpace) {\n // Have characters, so measure the text\n var canvas = document.createElement(\"canvas\");\n var padding = 100;\n canvas.width = metrics.width + padding;\n canvas.height = 3 * fontSize;\n canvas.style.opacity = 1;\n canvas.style.font = fontString;\n var ctx = canvas.getContext(\"2d\");\n ctx.font = fontString;\n\n var w = canvas.width,\n h = canvas.height,\n baseline = h / 2;\n\n // Set all canvas pixeldata values to 255, with all the content\n // data being 0. This lets us scan for data[i] != 255.\n ctx.fillStyle = \"white\";\n ctx.fillRect(-1, -1, w + 2, h + 2);\n ctx.fillStyle = \"black\";\n ctx.fillText(textstring, padding / 2, baseline);\n var pixelData = ctx.getImageData(0, 0, w, h).data;\n\n // canvas pixel data is w*4 by h*4, because R, G, B and A are separate,\n // consecutive values in the array, rather than stored as 32 bit ints.\n var i = 0,\n w4 = w * 4,\n len = pixelData.length;\n\n // Finding the ascent uses a normal, forward scanline\n while (++i < len && pixelData[i] === 255) {}\n var ascent = (i / w4) | 0;\n\n // Finding the descent uses a reverse scanline\n i = len - 1;\n while (--i > 0 && pixelData[i] === 255) {}\n var descent = (i / w4) | 0;\n\n // find the min-x coordinate\n for (i = 0; i < len && pixelData[i] === 255; ) {\n i += w4;\n if (i >= len) {\n i = i - len + 4;\n }\n }\n var minx = ((i % w4) / 4) | 0;\n\n // find the max-x coordinate\n var step = 1;\n for (i = len - 3; i >= 0 && pixelData[i] === 255; ) {\n i -= w4;\n if (i < 0) {\n i = len - 3 - step++ * 4;\n }\n }\n var maxx = ((i % w4) / 4 + 1) | 0;\n\n // set font metrics\n metrics.ascent = baseline - ascent;\n metrics.descent = descent - baseline;\n metrics.bounds = {\n minx: minx - padding / 2,\n maxx: maxx - padding / 2,\n miny: 0,\n maxy: descent - ascent,\n };\n metrics.height = 1 + (descent - ascent);\n }\n\n // if we ARE dealing with whitespace, most values will just be zero.\n else {\n // Only whitespace, so we can't measure the text\n metrics.ascent = 0;\n metrics.descent = 0;\n metrics.bounds = {\n minx: 0,\n maxx: metrics.width, // Best guess\n miny: 0,\n maxy: 0,\n };\n metrics.height = 0;\n }\n return metrics;\n };\n})();\n","class Tool {\n constructor() {}\n\n // called when the user starts dragging\n begin(x, y, lc) {}\n\n // called when the user moves while dragging\n continue(x, y, lc) {}\n\n // called when the user finishes dragging\n end(x, y, lc) {}\n\n didBecomeActive(lc) {}\n willBecomeInactive(lc) {}\n}\n\nTool.prototype.name = null; // for debugging\nTool.prototype.iconName = null; // {imageURLPrefix}/{iconName}.png\nTool.prototype.usesSimpleAPI = true;\nTool.prototype.optionsStyle = null; // kind of options GUI to display\n\nclass ToolWithStroke extends Tool {\n constructor(lc) {\n super();\n this.strokeWidth = lc.opts.defaultStrokeWidth;\n }\n\n didBecomeActive(lc) {\n const unsubscribeFuncs = [];\n this.unsubscribe = () => {\n unsubscribeFuncs.map(func => func());\n };\n\n unsubscribeFuncs.push(\n lc.on(\"setStrokeWidth\", strokeWidth => {\n this.strokeWidth = strokeWidth;\n lc.trigger(\"toolDidUpdateOptions\");\n }),\n );\n }\n\n willBecomeInactive(lc) {\n this.unsubscribe();\n }\n}\n\nToolWithStroke.prototype.optionsStyle = \"stroke-width\";\n\nexport {Tool, ToolWithStroke};\n","const getPoints = (x, y, angle, width, length) => [\n {\n x: x + (Math.cos(angle + Math.PI / 2) * width) / 2,\n y: y + (Math.sin(angle + Math.PI / 2) * width) / 2,\n },\n {\n x: x + Math.cos(angle) * length,\n y: y + Math.sin(angle) * length,\n },\n {\n x: x + (Math.cos(angle - Math.PI / 2) * width) / 2,\n y: y + (Math.sin(angle - Math.PI / 2) * width) / 2,\n },\n];\n\nconst arrow = {\n drawToCanvas(ctx, x, y, angle, width, color, length) {\n if (length == null) {\n length = 0;\n }\n length = length || width;\n\n ctx.fillStyle = color;\n ctx.lineWidth = 0;\n ctx.strokeStyle = \"transparent\";\n ctx.beginPath();\n const points = getPoints(x, y, angle, width, length);\n\n ctx.moveTo(points[0].x, points[0].y);\n ctx.lineTo(points[1].x, points[1].y);\n ctx.lineTo(points[2].x, points[2].y);\n ctx.fill();\n },\n\n svg(x, y, angle, width, color, length) {\n if (length == null) {\n length = 0;\n }\n length = length || width;\n const points = getPoints(x, y, angle, width, length);\n\n return `\\\n\\\n`;\n },\n};\n\nexport default {arrow};\n","import lineEndCapShapes from \"./lineEndCapShapes\";\n\nconst renderers = {};\n\n// drawFunc(ctx, shape, retryCallback)\n// drawLatest(ctx, bufferCtx, shape, retryCallback)\nconst defineCanvasRenderer = (shapeName, drawFunc, drawLatestFunc) =>\n (renderers[shapeName] = {drawFunc, drawLatestFunc});\n\nconst noop = function() {};\nconst renderShapeToContext = function(ctx, shape, opts) {\n if (opts == null) {\n opts = {};\n }\n if (opts.shouldIgnoreUnsupportedShapes == null) {\n opts.shouldIgnoreUnsupportedShapes = false;\n }\n if (opts.retryCallback == null) {\n opts.retryCallback = noop;\n }\n if (opts.shouldOnlyDrawLatest == null) {\n opts.shouldOnlyDrawLatest = false;\n }\n if (opts.bufferCtx == null) {\n opts.bufferCtx = null;\n }\n const {bufferCtx} = opts;\n\n if (renderers[shape.className]) {\n if (\n opts.shouldOnlyDrawLatest &&\n renderers[shape.className].drawLatestFunc\n ) {\n renderers[shape.className].drawLatestFunc(\n ctx,\n bufferCtx,\n shape,\n opts.retryCallback,\n );\n } else {\n renderers[shape.className].drawFunc(ctx, shape, opts.retryCallback);\n }\n } else if (opts.shouldIgnoreUnsupportedShapes) {\n console.warn(`Can't render shape of type ${shape.className} to canvas`);\n } else {\n throw `Can't render shape of type ${shape.className} to canvas`;\n }\n};\n\nconst renderShapeToCanvas = (canvas, shape, opts) =>\n renderShapeToContext(canvas.getContext(\"2d\"), shape, opts);\n\ndefineCanvasRenderer(\"Rectangle\", function(ctx, shape) {\n let {x} = shape;\n let {y} = shape;\n if (shape.strokeWidth % 2 !== 0) {\n x += 0.5;\n y += 0.5;\n }\n\n ctx.fillStyle = shape.fillColor;\n ctx.fillRect(x, y, shape.width, shape.height);\n ctx.lineWidth = shape.strokeWidth;\n ctx.strokeStyle = shape.strokeColor;\n ctx.strokeRect(x, y, shape.width, shape.height);\n});\n\ndefineCanvasRenderer(\"Ellipse\", function(ctx, shape) {\n ctx.save();\n const halfWidth = Math.floor(shape.width / 2);\n const halfHeight = Math.floor(shape.height / 2);\n const centerX = shape.x + halfWidth;\n const centerY = shape.y + halfHeight;\n\n ctx.translate(centerX, centerY);\n ctx.scale(1, Math.abs(shape.height / shape.width));\n ctx.beginPath();\n ctx.arc(0, 0, Math.abs(halfWidth), 0, Math.PI * 2);\n ctx.closePath();\n ctx.restore();\n\n ctx.fillStyle = shape.fillColor;\n ctx.fill();\n ctx.lineWidth = shape.strokeWidth;\n ctx.strokeStyle = shape.strokeColor;\n ctx.stroke();\n});\n\ndefineCanvasRenderer(\n \"SelectionBox\",\n (function() {\n const _drawHandle = function(ctx, {x, y}, handleSize) {\n if (handleSize === 0) {\n return;\n }\n\n ctx.fillStyle = \"#fff\";\n ctx.fillRect(x, y, handleSize, handleSize);\n ctx.strokeStyle = \"#000\";\n ctx.strokeRect(x, y, handleSize, handleSize);\n };\n\n return function(ctx, shape) {\n _drawHandle(ctx, shape.getTopLeftHandleRect(), shape.handleSize);\n _drawHandle(ctx, shape.getTopRightHandleRect(), shape.handleSize);\n _drawHandle(ctx, shape.getBottomLeftHandleRect(), shape.handleSize);\n _drawHandle(\n ctx,\n shape.getBottomRightHandleRect(),\n shape.handleSize,\n );\n\n if (shape.backgroundColor) {\n ctx.fillStyle = shape.backgroundColor;\n ctx.fillRect(\n shape._br.x - shape.margin,\n shape._br.y - shape.margin,\n shape._br.width + shape.margin * 2,\n shape._br.height + shape.margin * 2,\n );\n }\n ctx.lineWidth = 1;\n ctx.strokeStyle = shape.backgroundColor || \"#000\";\n ctx.setLineDash([2, 4]);\n ctx.strokeRect(\n shape._br.x - shape.margin,\n shape._br.y - shape.margin,\n shape._br.width + shape.margin * 2,\n shape._br.height + shape.margin * 2,\n );\n\n ctx.setLineDash([]);\n };\n })(),\n);\n\ndefineCanvasRenderer(\"Image\", function(ctx, shape, retryCallback) {\n if (shape.image.width) {\n if (shape.scale === 1) {\n ctx.drawImage(shape.image, shape.x, shape.y);\n } else {\n return ctx.drawImage(\n shape.image,\n shape.x,\n shape.y,\n shape.image.width * shape.scale,\n shape.image.height * shape.scale,\n );\n }\n } else if (retryCallback) {\n shape.image.onload = retryCallback;\n }\n});\n\ndefineCanvasRenderer(\"Line\", function(ctx, shape) {\n if (shape.x1 === shape.x2 && shape.y1 === shape.y2) {\n // browser behavior is not consistent for this case.\n return;\n }\n\n let {x1} = shape;\n let {x2} = shape;\n let {y1} = shape;\n let {y2} = shape;\n if (shape.strokeWidth % 2 !== 0) {\n x1 += 0.5;\n x2 += 0.5;\n y1 += 0.5;\n y2 += 0.5;\n }\n\n ctx.lineWidth = shape.strokeWidth;\n ctx.strokeStyle = shape.color;\n ctx.lineCap = shape.capStyle;\n if (shape.dash) {\n ctx.setLineDash(shape.dash);\n }\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n if (shape.dash) {\n ctx.setLineDash([]);\n }\n\n const arrowWidth = Math.max(shape.strokeWidth * 2.2, 5);\n if (shape.endCapShapes[0]) {\n lineEndCapShapes[shape.endCapShapes[0]].drawToCanvas(\n ctx,\n x1,\n y1,\n Math.atan2(y1 - y2, x1 - x2),\n arrowWidth,\n shape.color,\n );\n }\n if (shape.endCapShapes[1]) {\n lineEndCapShapes[shape.endCapShapes[1]].drawToCanvas(\n ctx,\n x2,\n y2,\n Math.atan2(y2 - y1, x2 - x1),\n arrowWidth,\n shape.color,\n );\n }\n});\n\nconst _drawRawLinePath = function(ctx, points, close, lineCap) {\n if (close == null) {\n close = false;\n }\n if (lineCap == null) {\n lineCap = \"round\";\n }\n if (!points.length) {\n return;\n }\n\n ctx.lineCap = lineCap;\n\n ctx.strokeStyle = points[0].color;\n ctx.lineWidth = points[0].size;\n\n ctx.beginPath();\n\n if (points[0].size % 2 === 0) {\n ctx.moveTo(points[0].x, points[0].y);\n } else {\n ctx.moveTo(points[0].x + 0.5, points[0].y + 0.5);\n }\n\n for (let point of points.slice(1)) {\n if (points[0].size % 2 === 0) {\n ctx.lineTo(point.x, point.y);\n } else {\n ctx.lineTo(point.x + 0.5, point.y + 0.5);\n }\n }\n\n if (close) {\n ctx.closePath();\n }\n};\n\nconst drawLinePath = function(ctx, shape) {\n _drawRawLinePath(ctx, shape.smoothedPoints);\n ctx.stroke();\n};\nconst drawLinePathLatest = function(ctx, bufferCtx, shape) {\n if (shape.tail) {\n const segmentStart =\n shape.smoothedPoints.length - shape.segmentSize * shape.tailSize;\n const drawStart =\n segmentStart < shape.segmentSize * 2 ? 0 : segmentStart;\n\n const drawEnd = segmentStart + shape.segmentSize + 1;\n\n _drawRawLinePath(\n bufferCtx,\n shape.smoothedPoints.slice(drawStart, drawEnd),\n );\n bufferCtx.stroke();\n } else {\n _drawRawLinePath(bufferCtx, shape.smoothedPoints);\n bufferCtx.stroke();\n }\n};\n\ndefineCanvasRenderer(\"LinePath\", drawLinePath, drawLinePathLatest);\n\n// same as the line path funcs, but erase instead of draw\nconst drawErasedLinePath = function(ctx, shape) {\n ctx.save();\n ctx.globalCompositeOperation = \"destination-out\";\n drawLinePath(ctx, shape);\n ctx.restore();\n};\nconst drawErasedLinePathLatest = function(ctx, bufferCtx, shape) {\n ctx.save();\n ctx.globalCompositeOperation = \"destination-out\";\n bufferCtx.save();\n bufferCtx.globalCompositeOperation = \"destination-out\";\n\n drawLinePathLatest(ctx, bufferCtx, shape);\n\n ctx.restore();\n bufferCtx.restore();\n};\n\ndefineCanvasRenderer(\n \"ErasedLinePath\",\n drawErasedLinePath,\n drawErasedLinePathLatest,\n);\n\ndefineCanvasRenderer(\"Text\", function(ctx, shape) {\n if (!shape.renderer) {\n shape._makeRenderer(ctx);\n }\n ctx.fillStyle = shape.color;\n shape.renderer.draw(ctx, shape.x, shape.y);\n});\n\ndefineCanvasRenderer(\"Polygon\", function(ctx, shape) {\n ctx.fillStyle = shape.fillColor;\n _drawRawLinePath(ctx, shape.points, shape.isClosed, \"butt\");\n ctx.fill();\n ctx.stroke();\n});\n\nexport {defineCanvasRenderer, renderShapeToCanvas, renderShapeToContext};\n","import lineEndCapShapes from \"./lineEndCapShapes\";\n\nconst renderers = {};\n\n// shapeToSVG(shape) -> string\nconst defineSVGRenderer = (shapeName, shapeToSVGFunc) =>\n (renderers[shapeName] = shapeToSVGFunc);\n\nconst renderShapeToSVG = function(shape, opts) {\n if (opts == null) {\n opts = {};\n }\n if (opts.shouldIgnoreUnsupportedShapes == null) {\n opts.shouldIgnoreUnsupportedShapes = false;\n }\n\n if (renderers[shape.className]) {\n return renderers[shape.className](shape);\n } else if (opts.shouldIgnoreUnsupportedShapes) {\n console.warn(`Can't render shape of type ${shape.className} to SVG`);\n return \"\";\n } else {\n throw `Can't render shape of type ${shape.className} to SVG`;\n }\n};\n\nconst entityMap = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n \"=\": \"=\",\n};\n\nconst escapeHTML = string =>\n String(string).replace(/[&<>\"'`=/]/g, s => entityMap[s]);\n\ndefineSVGRenderer(\"Rectangle\", function(shape) {\n const x1 = shape.x;\n const y1 = shape.y;\n const x2 = shape.x + shape.width;\n const y2 = shape.y + shape.height;\n\n let x = Math.min(x1, x2);\n let y = Math.min(y1, y2);\n const width = Math.max(x1, x2) - x;\n const height = Math.max(y1, y2) - y;\n\n if (shape.strokeWidth % 2 !== 0) {\n x += 0.5;\n y += 0.5;\n }\n\n return `\\\n\\\n`;\n});\n\ndefineSVGRenderer(\"SelectionBox\", () => {});\n\ndefineSVGRenderer(\"Ellipse\", function(shape) {\n const halfWidth = Math.floor(shape.width / 2);\n const halfHeight = Math.floor(shape.height / 2);\n const centerX = shape.x + halfWidth;\n const centerY = shape.y + halfHeight;\n return `\\\n\\\n`;\n});\n\ndefineSVGRenderer(\n \"Image\",\n shape =>\n // This will only work when embedded in a web page.\n `\\\n\\\n`,\n);\n\ndefineSVGRenderer(\"Line\", function(shape) {\n const dashString = shape.dash\n ? `stroke-dasharray='${shape.dash.join(\", \")}'`\n : \"\";\n let capString = \"\";\n const arrowWidth = Math.max(shape.strokeWidth * 2.2, 5);\n\n let {x1} = shape;\n let {x2} = shape;\n let {y1} = shape;\n let {y2} = shape;\n if (shape.strokeWidth % 2 !== 0) {\n x1 += 0.5;\n x2 += 0.5;\n y1 += 0.5;\n y2 += 0.5;\n }\n\n if (shape.endCapShapes[0]) {\n capString += lineEndCapShapes[shape.endCapShapes[0]].svg(\n x1,\n y1,\n Math.atan2(y1 - y2, x1 - x2),\n arrowWidth,\n shape.color,\n );\n }\n if (shape.endCapShapes[1]) {\n capString += lineEndCapShapes[shape.endCapShapes[1]].svg(\n x2,\n y2,\n Math.atan2(y2 - y1, x2 - x1),\n arrowWidth,\n shape.color,\n );\n }\n return `\\\n \\\n \\\n${capString} \\\n\\\n`;\n});\n\ndefineSVGRenderer(\n \"LinePath\",\n shape =>\n `\\\n\\\n`,\n);\n\n// silently skip erasers\ndefineSVGRenderer(\"ErasedLinePath\", () => {});\n\ndefineSVGRenderer(\"Polygon\", function(shape) {\n if (shape.isClosed) {\n return `\\\n\\\n`;\n } else {\n return `\\\n \\\n\\\n`;\n }\n});\n\ndefineSVGRenderer(\"Text\", function(shape) {\n // fallback: don't worry about auto-wrapping\n const widthString = shape.forcedWidth\n ? `width='${shape.forcedWidth}px'`\n : \"\";\n const heightString = shape.forcedHeight\n ? `height='${shape.forcedHeight}px'`\n : \"\";\n let textSplitOnLines = shape.text.split(/\\r\\n|\\r|\\n/g);\n\n if (shape.renderer) {\n textSplitOnLines = shape.renderer.lines;\n }\n\n return `\\\n \\\n${textSplitOnLines\n .map((line, i) => {\n const dy = i === 0 ? 0 : \"1.2em\";\n return `\\\n \\\n${escapeHTML(line)} \\\n`;\n })\n .join(\"\")} \\\n\\\n`;\n});\n\nexport {defineSVGRenderer, renderShapeToSVG};\n","import {renderShapeToContext} from \"./canvasRenderer\";\nimport {renderShapeToSVG} from \"./svgRenderer\";\n\nfunction addImageOnload(img, fn) {\n const oldOnload = img.onload;\n img.onload = function() {\n if (typeof oldOnload === \"function\") {\n oldOnload();\n }\n fn();\n };\n return img;\n}\n\nfunction last(array, n = null) {\n if (n) {\n return Array.prototype.slice.call(array, Math.max(array.length - n, 0));\n } else {\n return array[array.length - 1];\n }\n}\n\nfunction classSet(classNameToIsPresent) {\n const classNames = [];\n for (let key in classNameToIsPresent) {\n if (classNameToIsPresent[key]) {\n classNames.push(key);\n }\n }\n return classNames.join(\" \");\n}\n\nfunction matchElementSize(elementToMatch, elementsToResize, scale, callback) {\n if (callback == null) {\n callback = function() {};\n }\n const resize = () => {\n for (let el of elementsToResize) {\n el.style.width = `${elementToMatch.offsetWidth}px`;\n el.style.height = `${elementToMatch.offsetHeight}px`;\n if (el.width != null) {\n el.setAttribute(\"width\", el.offsetWidth * scale);\n el.setAttribute(\"height\", el.offsetHeight * scale);\n }\n }\n callback();\n };\n\n elementToMatch.addEventListener(\"resize\", resize);\n window.addEventListener(\"resize\", resize);\n window.addEventListener(\"orientationchange\", resize);\n resize();\n return resize;\n}\n\nfunction combineCanvases(...canvases) {\n const c = document.createElement(\"canvas\");\n c.width = canvases[0].width;\n c.height = canvases[0].height;\n for (var canvas of canvases) {\n c.width = Math.max(canvas.width, c.width);\n c.height = Math.max(canvas.height, c.height);\n }\n const ctx = c.getContext(\"2d\");\n\n for (canvas of canvases) {\n ctx.drawImage(canvas, 0, 0);\n }\n return c;\n}\n\nfunction renderShapes(shapes, bounds, scale, canvas = null) {\n if (scale == null) {\n scale = 1;\n }\n canvas = canvas || document.createElement(\"canvas\");\n canvas.width = bounds.width * scale;\n canvas.height = bounds.height * scale;\n const ctx = canvas.getContext(\"2d\");\n ctx.translate(-bounds.x * scale, -bounds.y * scale);\n ctx.scale(scale, scale);\n for (let shape of shapes) {\n renderShapeToContext(ctx, shape);\n }\n return canvas;\n}\n\nfunction renderShapesToSVG(shapes, {x, y, width, height}, backgroundColor) {\n return `\\\n \\\n \\\n \\\n${shapes.map(shape => renderShapeToSVG(shape)).join(\"\")} \\\n \\\n\\\n`.replace(/(\\r\\n|\\n|\\r)/gm, \"\");\n}\n\n// [{x, y, width, height}]\nfunction getBoundingRect(rects, width, height) {\n if (!rects.length) {\n return {x: 0, y: 0, width: 0 || width, height: 0 || height};\n }\n\n // Calculate the bounds for infinite canvas\n let minX = rects[0].x;\n let minY = rects[0].y;\n let maxX = rects[0].x + rects[0].width;\n let maxY = rects[0].y + rects[0].height;\n for (let rect of rects) {\n minX = Math.floor(Math.min(rect.x, minX));\n minY = Math.floor(Math.min(rect.y, minY));\n maxX = Math.ceil(Math.max(maxX, rect.x + rect.width));\n maxY = Math.ceil(Math.max(maxY, rect.y + rect.height));\n }\n\n // Use the image size bounds if they exist\n minX = width ? 0 : minX;\n minY = height ? 0 : minY;\n maxX = width || maxX;\n maxY = height || maxY;\n\n return {x: minX, y: minY, width: maxX - minX, height: maxY - minY};\n}\n\n// Returns the rect LC will use for exporting images using the given params\nfunction getDefaultImageRect(shapeBoundingRects, explicitSize, margin) {\n if (explicitSize == null) {\n explicitSize = {width: 0, height: 0};\n }\n if (margin == null) {\n margin = {top: 0, right: 0, bottom: 0, left: 0};\n }\n const {width, height} = explicitSize;\n\n const rect = getBoundingRect(\n shapeBoundingRects,\n width === \"infinite\" ? 0 : width,\n height === \"infinite\" ? 0 : height,\n );\n\n rect.x -= margin.left;\n rect.y -= margin.top;\n rect.width += margin.left + margin.right;\n rect.height += margin.top + margin.bottom;\n\n return rect;\n}\n\nfunction getBackingScale(context) {\n if (window.devicePixelRatio == null) {\n return 1;\n }\n if (!(window.devicePixelRatio > 1)) {\n return 1;\n }\n return window.devicePixelRatio;\n}\n\nfunction getGUID() {\n const s4 = () =>\n Math.floor((1 + Math.random()) * 0x10000)\n .toString(16)\n .substring(1);\n return (\n s4() +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n \"-\" +\n s4() +\n s4() +\n s4()\n );\n}\n\nfunction requestAnimationFrame(f) {\n if (window.requestAnimationFrame) {\n return window.requestAnimationFrame(f);\n }\n if (window.webkitRequestAnimationFrame) {\n return window.webkitRequestAnimationFrame(f);\n }\n if (window.mozRequestAnimationFrame) {\n return window.mozRequestAnimationFrame(f);\n }\n return setTimeout(f, 0);\n}\n\nfunction cancelAnimationFrame(f) {\n if (window.cancelAnimationFrame) {\n window.cancelAnimationFrame(f);\n }\n if (window.webkitCancelRequestAnimationFrame) {\n window.webkitCancelRequestAnimationFrame(f);\n }\n if (window.webkitCancelAnimationFrame) {\n window.webkitCancelAnimationFrame(f);\n }\n if (window.mozCancelAnimationFrame) {\n window.mozCancelAnimationFrame(f);\n }\n clearTimeout(f);\n}\n\nexport {\n addImageOnload,\n last,\n classSet,\n matchElementSize,\n combineCanvases,\n renderShapes,\n renderShapesToSVG,\n getBoundingRect,\n getDefaultImageRect,\n getBackingScale,\n getGUID,\n requestAnimationFrame,\n cancelAnimationFrame,\n};\n","import \"./fontmetrics.js\";\n\nconst parseFontString = function(font) {\n const fontItems = font.split(\" \");\n\n let fontSize = 0;\n\n for (let item of fontItems) {\n const maybeSize = parseInt(item.replace(\"px\", \"\"), 10);\n if (!isNaN(maybeSize)) {\n fontSize = maybeSize;\n }\n }\n if (!fontSize) {\n throw \"Font size not found\";\n }\n\n const remainingFontString = font\n .substring(fontItems[0].length + 1)\n .replace(\"bold \", \"\")\n .replace(\"italic \", \"\")\n .replace(\"underline \", \"\");\n\n const fontFamily = remainingFontString;\n\n return {fontSize, fontFamily};\n};\n\nconst getNextLine = function(ctx, text, forcedWidth) {\n if (!text.length) {\n return [\"\", \"\"];\n }\n\n let endIndex = 0;\n let lastGoodIndex = 0;\n let lastOkayIndex = 0;\n let wasInWord = false;\n\n while (true) {\n endIndex += 1;\n const isEndOfString = endIndex >= text.length;\n\n const isWhitespace = !isEndOfString && text[endIndex].match(/\\s/);\n const isNonWord = isWhitespace || isEndOfString;\n\n const textToHere = text.substring(0, endIndex);\n const doesSubstringFit = forcedWidth\n ? ctx.measureTextWidth(textToHere).width <= forcedWidth\n : true;\n\n if (doesSubstringFit) {\n lastOkayIndex = endIndex;\n }\n\n // word -> non-word\n if (isNonWord && wasInWord) {\n wasInWord = false;\n if (doesSubstringFit) {\n lastGoodIndex = endIndex;\n }\n }\n\n wasInWord = !isWhitespace;\n\n if (isEndOfString || !doesSubstringFit) {\n if (doesSubstringFit) {\n return [text, \"\"];\n } else if (lastGoodIndex > 0) {\n let nextWordStartIndex = lastGoodIndex + 1;\n while (\n nextWordStartIndex < text.length &&\n text[nextWordStartIndex].match(/\\s/)\n ) {\n nextWordStartIndex += 1;\n }\n return [\n text.substring(0, lastGoodIndex),\n text.substring(nextWordStartIndex),\n ];\n } else {\n return [\n text.substring(0, lastOkayIndex),\n text.substring(lastOkayIndex),\n ];\n }\n }\n }\n};\n\nconst getLinesToRender = function(ctx, text, forcedWidth) {\n const textSplitOnLines = text.split(/\\r\\n|\\r|\\n/g);\n\n const lines = [];\n for (let textLine of textSplitOnLines) {\n let [nextLine, remainingText] = getNextLine(ctx, textLine, forcedWidth);\n if (nextLine) {\n while (nextLine) {\n lines.push(nextLine);\n [nextLine, remainingText] = getNextLine(\n ctx,\n remainingText,\n forcedWidth,\n );\n }\n } else {\n lines.push(textLine);\n }\n }\n return lines;\n};\n\nclass TextRenderer {\n constructor(ctx, text, font, forcedWidth, forcedHeight) {\n this.text = text;\n this.font = font;\n this.forcedWidth = forcedWidth;\n this.forcedHeight = forcedHeight;\n const {fontFamily, fontSize} = parseFontString(this.font);\n\n ctx.font = this.font;\n ctx.textBaseline = \"baseline\";\n this.emDashWidth = ctx.measureTextWidth(\n \"—\",\n fontSize,\n fontFamily,\n ).width;\n this.caratWidth = ctx.measureTextWidth(\"|\", fontSize, fontFamily).width;\n\n this.lines = getLinesToRender(ctx, this.text, this.forcedWidth);\n\n // we need to get metrics line by line and combine them. :-(\n this.metricses = this.lines.map(line => {\n return ctx.measureText2(line || \"X\", fontSize, this.font);\n });\n\n this.metrics = {\n ascent: Math.max(...this.metricses.map(({ascent}) => ascent)),\n descent: Math.max(...this.metricses.map(({descent}) => descent)),\n fontsize: Math.max(...this.metricses.map(({fontsize}) => fontsize)),\n leading: Math.max(...this.metricses.map(({leading}) => leading)),\n width: Math.max(...this.metricses.map(({width}) => width)),\n height: Math.max(...this.metricses.map(({height}) => height)),\n bounds: {\n minx: Math.min(\n ...this.metricses.map(({bounds}) => bounds.minx),\n ),\n miny: Math.min(\n ...this.metricses.map(({bounds}) => bounds.miny),\n ),\n maxx: Math.max(\n ...this.metricses.map(({bounds}) => bounds.maxx),\n ),\n maxy: Math.max(\n ...this.metricses.map(({bounds}) => bounds.maxy),\n ),\n },\n };\n\n this.boundingBoxWidth = Math.ceil(this.metrics.width);\n }\n\n draw(ctx, x, y) {\n ctx.textBaseline = \"top\";\n ctx.font = this.font;\n let i = 0;\n\n for (let line of this.lines) {\n ctx.fillText(line, x, y + i++ * this.metrics.leading);\n }\n }\n\n getWidth(isEditing) {\n // if isEditing == true, add X padding to account for carat\n if (isEditing == null) {\n isEditing = false;\n }\n if (this.forcedWidth) {\n return this.forcedWidth;\n } else {\n if (isEditing) {\n return this.metrics.bounds.maxx + this.caratWidth;\n } else {\n return this.metrics.bounds.maxx;\n }\n }\n }\n getHeight() {\n return this.forcedHeight || this.metrics.leading * this.lines.length;\n }\n}\n\nexport default TextRenderer;\n","/*\n * decaffeinate suggestions:\n * DS201: Simplify complex destructure assignments\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\n\nimport {getGUID, last, getBoundingRect} from \"./util\";\nimport TextRenderer from \"./TextRenderer\";\nimport {defineCanvasRenderer, renderShapeToContext} from \"./canvasRenderer\";\nimport {defineSVGRenderer, renderShapeToSVG} from \"./svgRenderer\";\n\nconst shapes = {};\n\nconst defineShape = function(name, props) {\n // improve Chrome JIT perf by not using arguments object\n const Shape = function(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p) {\n props.constructor.call(\n this,\n a,\n b,\n c,\n d,\n e,\n f,\n g,\n h,\n i,\n j,\n k,\n l,\n m,\n n,\n o,\n p,\n );\n return this;\n };\n Shape.prototype.className = name;\n Shape.fromJSON = props.fromJSON;\n\n // support old style of defining canvas drawing methods on shapes\n if (props.draw) {\n const legacyDrawFunc = props.draw;\n const legacyDrawLatestFunc =\n props.draw ||\n function(ctx, bufferCtx, retryCallback) {\n this.draw(ctx, bufferCtx, retryCallback);\n };\n const drawFunc = (ctx, shape, retryCallback) =>\n legacyDrawFunc.call(shape, ctx, retryCallback);\n const drawLatestFunc = (ctx, bufferCtx, shape, retryCallback) =>\n legacyDrawLatestFunc.call(shape, ctx, bufferCtx, retryCallback);\n delete props.draw;\n if (props.drawLatest) {\n delete props.drawLatest;\n }\n\n defineCanvasRenderer(name, drawFunc, drawLatestFunc);\n }\n\n // support old style of defining SVG drawing methods on shapes\n if (props.toSVG) {\n const legacySVGFunc = props.toSVG;\n const svgFunc = shape => legacySVGFunc.call(shape);\n delete props.toSVG;\n defineSVGRenderer(name, svgFunc);\n }\n\n Shape.prototype.draw = function(ctx, retryCallback) {\n renderShapeToContext(ctx, this, {retryCallback});\n };\n Shape.prototype.drawLatest = function(ctx, bufferCtx, retryCallback) {\n renderShapeToContext(ctx, this, {\n retryCallback,\n bufferCtx,\n shouldOnlyDrawLatest: true,\n });\n };\n Shape.prototype.toSVG = function() {\n renderShapeToSVG(this);\n };\n\n for (let k in props) {\n if (k !== \"fromJSON\") {\n Shape.prototype[k] = props[k];\n }\n }\n\n shapes[name] = Shape;\n return Shape;\n};\n\n// improve Chrome JIT perf by not using arguments object\nconst createShape = function(\n name,\n a,\n b,\n c,\n d,\n e,\n f,\n g,\n h,\n i,\n j,\n k,\n l,\n m,\n n,\n o,\n p,\n) {\n const s = new shapes[name](a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p);\n s.id = getGUID();\n return s;\n};\n\nconst JSONToShape = function({className, data, id}) {\n if (className in shapes) {\n const shape = shapes[className].fromJSON(data);\n if (shape) {\n if (id) {\n shape.id = id;\n }\n return shape;\n } else {\n console.log(\"Unreadable shape:\", className, data);\n return null;\n }\n } else {\n console.log(\"Unknown shape:\", className, data);\n return null;\n }\n};\n\nconst shapeToJSON = shape => ({\n className: shape.className,\n data: shape.toJSON(),\n id: shape.id,\n});\n\n// this fn depends on Point, but LinePathShape depends on it, so it can't be\n// moved out of this file yet.\nvar bspline = function(points, order) {\n if (!order) {\n return points;\n }\n return bspline(_dual(_dual(_refine(points))), order - 1);\n};\n\nvar _refine = function(points) {\n points = [points[0]].concat(points).concat(last(points));\n const refined = [];\n\n let index = 0;\n for (let point of points) {\n refined[index * 2] = point;\n if (points[index + 1]) {\n refined[index * 2 + 1] = _mid(point, points[index + 1]);\n }\n index += 1;\n }\n\n return refined;\n};\n\nvar _dual = function(points) {\n const dualed = [];\n\n let index = 0;\n for (let point of points) {\n if (points[index + 1]) {\n dualed[index] = _mid(point, points[index + 1]);\n }\n index += 1;\n }\n\n return dualed;\n};\n\nvar _mid = (a, b) =>\n createShape(\"Point\", {\n x: a.x + (b.x - a.x) / 2,\n y: a.y + (b.y - a.y) / 2,\n size: a.size + (b.size - a.size) / 2,\n color: a.color,\n });\n\ndefineShape(\"Image\", {\n // TODO: allow resizing/filling\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.scale = args.scale || 1;\n this.image = args.image || null;\n this.crossOrigin = (args.image && args.image.crossOrigin) || null;\n },\n getBoundingRect() {\n return {\n x: this.x,\n y: this.y,\n width: this.image.width * this.scale,\n height: this.image.height * this.scale,\n };\n },\n toJSON() {\n const toJSONData = {\n x: this.x,\n y: this.y,\n imageSrc: this.image.src,\n imageObject: this.image,\n scale: this.scale,\n };\n if (this.crossOrigin) {\n toJSONData[\"crossOrigin\"] = this.crossOrigin;\n }\n return toJSONData;\n },\n fromJSON(data) {\n let img = null;\n if (data.imageObject != null ? data.imageObject.width : undefined) {\n img = data.imageObject;\n } else {\n img = new Image();\n img.src = data.imageSrc;\n if (data.crossOrigin) {\n img.crossOrigin = data.crossOrigin;\n }\n }\n return createShape(\"Image\", {\n x: data.x,\n y: data.y,\n image: img,\n scale: data.scale,\n });\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n});\n\ndefineShape(\"Rectangle\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.width = args.width || 0;\n this.height = args.height || 0;\n this.strokeWidth = args.strokeWidth || 1;\n this.strokeColor = args.strokeColor || \"black\";\n this.fillColor = args.fillColor || \"transparent\";\n },\n\n getBoundingRect() {\n return {\n x: this.x - this.strokeWidth / 2,\n y: this.y - this.strokeWidth / 2,\n width: this.width + this.strokeWidth,\n height: this.height + this.strokeWidth,\n };\n },\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n strokeColor: this.strokeColor,\n fillColor: this.fillColor,\n };\n },\n fromJSON(data) {\n return createShape(\"Rectangle\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n});\n\n// this is pretty similar to the Rectangle shape. maybe consolidate somehow.\ndefineShape(\"Ellipse\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.width = args.width || 0;\n this.height = args.height || 0;\n this.strokeWidth = args.strokeWidth || 1;\n this.strokeColor = args.strokeColor || \"black\";\n this.fillColor = args.fillColor || \"transparent\";\n },\n\n getBoundingRect() {\n return {\n x: this.x - this.strokeWidth / 2,\n y: this.y - this.strokeWidth / 2,\n width: this.width + this.strokeWidth,\n height: this.height + this.strokeWidth,\n };\n },\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n strokeColor: this.strokeColor,\n fillColor: this.fillColor,\n };\n },\n fromJSON(data) {\n return createShape(\"Ellipse\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n});\n\ndefineShape(\"Line\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x1 = args.x1 || 0;\n this.y1 = args.y1 || 0;\n this.x2 = args.x2 || 0;\n this.y2 = args.y2 || 0;\n this.strokeWidth = args.strokeWidth || 1;\n this.color = args.color || \"black\";\n this.capStyle = args.capStyle || \"round\";\n this.endCapShapes = args.endCapShapes || [null, null];\n this.dash = args.dash || null;\n },\n\n getBoundingRect() {\n return {\n x: Math.min(this.x1, this.x2) - this.strokeWidth / 2,\n y: Math.min(this.y1, this.y2) - this.strokeWidth / 2,\n width: Math.abs(this.x2 - this.x1) + this.strokeWidth / 2,\n height: Math.abs(this.y2 - this.y1) + this.strokeWidth / 2,\n };\n },\n toJSON() {\n return {\n x1: this.x1,\n y1: this.y1,\n x2: this.x2,\n y2: this.y2,\n strokeWidth: this.strokeWidth,\n color: this.color,\n capStyle: this.capStyle,\n dash: this.dash,\n endCapShapes: this.endCapShapes,\n };\n },\n fromJSON(data) {\n return createShape(\"Line\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x1 = this.x1 - moveInfo.xDiff;\n this.y1 = this.y1 - moveInfo.yDiff;\n this.x2 = this.x2 - moveInfo.xDiff;\n this.y2 = this.y2 - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n const br = this.getBoundingRect();\n const xDiff = br.x - upperLeft.x;\n const yDiff = br.y - upperLeft.y;\n this.move({xDiff, yDiff});\n },\n});\n\n// returns false if no points because there are no points to share style\nconst _doAllPointsShareStyle = function(points) {\n if (!points.length) {\n return false;\n }\n const {size} = points[0];\n const {color} = points[0];\n for (let point of points) {\n if (point.size !== size || point.color !== color) {\n console.log(size, color, point.size, point.color);\n }\n if (point.size !== size || point.color !== color) {\n return false;\n }\n }\n return true;\n};\n\nconst _createLinePathFromData = function(shapeName, data) {\n let x, y;\n let points = null;\n if (data.points) {\n points = data.points.map(pointData => JSONToShape(pointData));\n } else if (data.pointCoordinatePairs) {\n points = data.pointCoordinatePairs.map(([x, y]) =>\n JSONToShape({\n className: \"Point\",\n data: {\n x,\n y,\n size: data.pointSize,\n color: data.pointColor,\n smooth: data.smooth,\n },\n }),\n );\n }\n\n let smoothedPoints = null;\n if (data.smoothedPointCoordinatePairs) {\n smoothedPoints = data.smoothedPointCoordinatePairs.map(([x, y]) =>\n JSONToShape({\n className: \"Point\",\n data: {\n x,\n y,\n size: data.pointSize,\n color: data.pointColor,\n smooth: data.smooth,\n },\n }),\n );\n }\n\n if (!points[0]) {\n return null;\n }\n return createShape(shapeName, {\n points,\n smoothedPoints,\n order: data.order,\n tailSize: data.tailSize,\n smooth: data.smooth,\n });\n};\n\nconst linePathFuncs = {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n const points = args.points || [];\n this.order = args.order || 3;\n this.tailSize = args.tailSize || 3;\n this.smooth = \"smooth\" in args ? args.smooth : true;\n\n // The number of smoothed points generated for each point added\n this.segmentSize = Math.pow(2, this.order);\n\n // The number of points used to calculate the bspline to the newest point\n this.sampleSize = this.tailSize + 1;\n\n if (args.smoothedPoints) {\n this.points = args.points;\n this.smoothedPoints = args.smoothedPoints;\n } else {\n this.points = [];\n points.map(point => this.addPoint(point));\n }\n },\n\n getBoundingRect() {\n return getBoundingRect(\n this.points.map(p => ({\n x: p.x - p.size / 2,\n y: p.y - p.size / 2,\n width: p.size,\n height: p.size,\n })),\n );\n },\n\n toJSON() {\n if (_doAllPointsShareStyle(this.points)) {\n return {\n order: this.order,\n tailSize: this.tailSize,\n smooth: this.smooth,\n pointCoordinatePairs: this.points.map(point => [\n point.x,\n point.y,\n ]),\n smoothedPointCoordinatePairs: this.smoothedPoints.map(point => [\n point.x,\n point.y,\n ]),\n pointSize: this.points[0].size,\n pointColor: this.points[0].color,\n };\n } else {\n return {\n order: this.order,\n tailSize: this.tailSize,\n smooth: this.smooth,\n points: this.points.map(p => shapeToJSON(p)),\n };\n }\n },\n\n fromJSON(data) {\n return _createLinePathFromData(\"LinePath\", data);\n },\n\n addPoint(point) {\n this.points.push(point);\n\n if (!this.smooth) {\n this.smoothedPoints = this.points;\n return;\n }\n\n if (!this.smoothedPoints || this.points.length < this.sampleSize) {\n this.smoothedPoints = bspline(this.points, this.order);\n } else {\n this.tail = last(\n bspline(last(this.points, this.sampleSize), this.order),\n this.segmentSize * this.tailSize,\n );\n\n // Remove the last @tailSize - 1 segments from @smoothedPoints\n // then concat the tail. This is done because smoothed points\n // close to the end of the path will change as new points are\n // added.\n this.smoothedPoints = this.smoothedPoints\n .slice(\n 0,\n this.smoothedPoints.length -\n this.segmentSize * (this.tailSize - 1),\n )\n .concat(this.tail);\n }\n },\n\n move(moveInfo) {\n let pts;\n if (moveInfo == null) {\n moveInfo = {};\n }\n if (!this.smooth) {\n pts = this.points;\n } else {\n pts = this.smoothedPoints;\n }\n\n for (let pt of pts) {\n pt.move(moveInfo);\n }\n\n this.points = this.smoothedPoints;\n },\n\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n const br = this.getBoundingRect();\n const xDiff = br.x - upperLeft.x;\n const yDiff = br.y - upperLeft.y;\n this.move({xDiff, yDiff});\n },\n};\n\nconst LinePath = defineShape(\"LinePath\", linePathFuncs);\n\ndefineShape(\"ErasedLinePath\", {\n constructor: linePathFuncs.constructor,\n toJSON: linePathFuncs.toJSON,\n addPoint: linePathFuncs.addPoint,\n getBoundingRect: linePathFuncs.getBoundingRect,\n\n fromJSON(data) {\n return _createLinePathFromData(\"ErasedLinePath\", data);\n },\n});\n\n// this is currently just used for LinePath/ErasedLinePath internal storage.\ndefineShape(\"Point\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.size = args.size || 0;\n this.color = args.color || \"\";\n },\n getBoundingRect() {\n return {\n x: this.x - this.size / 2,\n y: this.y - this.size / 2,\n width: this.size,\n height: this.size,\n };\n },\n toJSON() {\n return {x: this.x, y: this.y, size: this.size, color: this.color};\n },\n fromJSON(data) {\n return createShape(\"Point\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n});\n\ndefineShape(\"Polygon\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.points = args.points;\n this.fillColor = args.fillColor || \"white\";\n this.strokeColor = args.strokeColor || \"black\";\n this.strokeWidth = args.strokeWidth;\n this.dash = args.dash || null;\n\n if (args.isClosed == null) {\n args.isClosed = true;\n }\n this.isClosed = args.isClosed;\n\n // ignore point values\n this.points.forEach(point => {\n point.color = this.strokeColor;\n point.size = this.strokeWidth;\n });\n },\n\n addPoint(x, y) {\n this.points.push(createShape(\"Point\", {x, y}));\n },\n\n getBoundingRect() {\n return getBoundingRect(this.points.map(p => p.getBoundingRect()));\n },\n\n toJSON() {\n return {\n strokeWidth: this.strokeWidth,\n fillColor: this.fillColor,\n strokeColor: this.strokeColor,\n dash: this.dash,\n isClosed: this.isClosed,\n pointCoordinatePairs: this.points.map(p => [p.x, p.y]),\n };\n },\n fromJSON(data) {\n data.points = data.pointCoordinatePairs.map(function(...args) {\n const [x, y] = args[0];\n return createShape(\"Point\", {\n x,\n y,\n size: data.strokeWidth,\n color: data.strokeColor,\n });\n });\n return createShape(\"Polygon\", data);\n },\n\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.points.map(pt => pt.move(moveInfo));\n },\n\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n const br = this.getBoundingRect();\n const xDiff = br.x - upperLeft.x;\n const yDiff = br.y - upperLeft.y;\n this.move({xDiff, yDiff});\n },\n});\n\ndefineShape(\"Text\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.v = args.v || 0; // version (<1 needs position repaired)\n this.text = args.text || \"\";\n this.color = args.color || \"black\";\n this.font = args.font || \"18px sans-serif\";\n this.forcedWidth = args.forcedWidth || null;\n this.forcedHeight = args.forcedHeight || null;\n },\n\n _makeRenderer(ctx) {\n ctx.lineHeight = 1.2;\n this.renderer = new TextRenderer(\n ctx,\n this.text,\n this.font,\n this.forcedWidth,\n this.forcedHeight,\n );\n\n if (this.v < 1) {\n console.log(\"repairing baseline\");\n this.v = 1;\n this.x -= this.renderer.metrics.bounds.minx;\n this.y -=\n this.renderer.metrics.leading - this.renderer.metrics.descent;\n }\n },\n\n setText(text) {\n this.text = text;\n this.renderer = null;\n },\n\n setFont(font) {\n this.font = font;\n this.renderer = null;\n },\n\n setPosition(x, y) {\n this.x = x;\n this.y = y;\n },\n\n setSize(forcedWidth, forcedHeight) {\n this.forcedWidth = Math.max(forcedWidth, 0);\n this.forcedHeight = Math.max(forcedHeight, 0);\n this.renderer = null;\n },\n\n enforceMaxBoundingRect(lc) {\n const br = this.getBoundingRect(lc.ctx);\n const lcBoundingRect = {\n x: -lc.position.x / lc.scale,\n y: -lc.position.y / lc.scale,\n width: lc.canvas.width / lc.scale,\n height: lc.canvas.height / lc.scale,\n };\n // really just enforce max width\n if (br.x + br.width > lcBoundingRect.x + lcBoundingRect.width) {\n const dx = br.x - lcBoundingRect.x;\n this.forcedWidth = lcBoundingRect.width - dx - 10;\n this.renderer = null;\n }\n },\n\n getBoundingRect(ctx, isEditing) {\n // if isEditing == true, add X padding to account for carat\n if (isEditing == null) {\n isEditing = false;\n }\n if (!this.renderer) {\n if (ctx) {\n this._makeRenderer(ctx);\n } else {\n throw \"Must pass ctx if text hasn't been rendered yet\";\n }\n }\n return {\n x: Math.floor(this.x),\n y: Math.floor(this.y),\n width: Math.ceil(this.renderer.getWidth(true)),\n height: Math.ceil(this.renderer.getHeight()),\n };\n },\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n text: this.text,\n color: this.color,\n font: this.font,\n forcedWidth: this.forcedWidth,\n forcedHeight: this.forcedHeight,\n v: this.v,\n };\n },\n fromJSON(data) {\n return createShape(\"Text\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n});\n\ndefineShape(\"SelectionBox\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.shape = args.shape;\n if (args.handleSize != null) {\n this.handleSize = args.handleSize;\n } else {\n this.handleSize = 10;\n }\n this.margin = 4;\n this.backgroundColor = args.backgroundColor || null;\n this._br = this.shape.getBoundingRect(args.ctx);\n },\n\n toJSON() {\n return {\n shape: shapeToJSON(this.shape),\n backgroundColor: this.backgroundColor,\n };\n },\n fromJSON({shape, handleSize, margin, backgroundColor}) {\n return createShape(\"SelectionBox\", {\n shape: JSONToShape(shape),\n backgroundColor,\n });\n },\n\n getTopLeftHandleRect() {\n return {\n x: this._br.x - this.handleSize - this.margin,\n y: this._br.y - this.handleSize - this.margin,\n width: this.handleSize,\n height: this.handleSize,\n };\n },\n\n getBottomLeftHandleRect() {\n return {\n x: this._br.x - this.handleSize - this.margin,\n y: this._br.y + this._br.height + this.margin,\n width: this.handleSize,\n height: this.handleSize,\n };\n },\n\n getTopRightHandleRect() {\n return {\n x: this._br.x + this._br.width + this.margin,\n y: this._br.y - this.handleSize - this.margin,\n width: this.handleSize,\n height: this.handleSize,\n };\n },\n\n getBottomRightHandleRect() {\n return {\n x: this._br.x + this._br.width + this.margin,\n y: this._br.y + this._br.height + this.margin,\n width: this.handleSize,\n height: this.handleSize,\n };\n },\n\n getBoundingRect() {\n return {\n x: this._br.x - this.margin,\n y: this._br.y - this.margin,\n width: this._br.width + this.margin * 2,\n height: this._br.height + this.margin * 2,\n };\n },\n});\n\nexport {defineShape, createShape, JSONToShape, shapeToJSON};\n","import {ToolWithStroke} from \"./base\";\nimport {createShape} from \"../shapes\";\n\nclass Pencil extends ToolWithStroke {\n begin(x, y, lc) {\n this.color = lc.getColor(\"primary\");\n this.currentShape = this.makeShape();\n this.currentShape.addPoint(this.makePoint(x, y, lc));\n this.lastEventTime = Date.now();\n }\n\n continue(x, y, lc) {\n const timeDiff = Date.now() - this.lastEventTime;\n\n if (timeDiff > this.eventTimeThreshold) {\n this.lastEventTime += timeDiff;\n this.currentShape.addPoint(this.makePoint(x, y, lc));\n lc.drawShapeInProgress(this.currentShape);\n }\n }\n\n end(x, y, lc) {\n lc.saveShape(this.currentShape);\n this.currentShape = undefined;\n }\n\n makePoint(x, y, lc) {\n return createShape(\"Point\", {\n x,\n y,\n size: this.strokeWidth,\n color: this.color,\n });\n }\n makeShape() {\n return createShape(\"LinePath\");\n }\n}\n\nPencil.prototype.name = \"Pencil\";\nPencil.prototype.iconName = \"pencil\";\nPencil.prototype.eventTimeThreshold = 10;\n\nexport default Pencil;\n","// maybe add checks to these in the future to make sure you never double-undo or\n// double-redo\nclass ClearAction {\n constructor(lc, oldShapes, newShapes) {\n this.lc = lc;\n this.oldShapes = oldShapes;\n this.newShapes = newShapes;\n }\n\n do() {\n this.lc.shapes = this.newShapes;\n this.lc.repaintLayer(\"main\");\n }\n\n undo() {\n this.lc.shapes = this.oldShapes;\n this.lc.repaintLayer(\"main\");\n }\n}\n\nclass MoveAction {\n constructor(lc, selectedShape, previousPosition, newPosition) {\n this.lc = lc;\n this.selectedShape = selectedShape;\n this.previousPosition = previousPosition;\n this.newPosition = newPosition;\n }\n\n do() {\n this.selectedShape.setUpperLeft({\n x: this.newPosition.x,\n y: this.newPosition.y,\n });\n this.lc.repaintLayer(\"main\");\n }\n\n undo() {\n this.selectedShape.setUpperLeft({\n x: this.previousPosition.x,\n y: this.previousPosition.y,\n });\n this.lc.repaintLayer(\"main\");\n }\n}\n\nclass AddShapeAction {\n constructor(lc, shape, previousShapeId = null) {\n this.lc = lc;\n this.shape = shape;\n this.previousShapeId = previousShapeId;\n }\n\n do() {\n // common case: just add it to the end\n if (\n !this.lc.shapes.length ||\n this.lc.shapes[this.lc.shapes.length - 1].id ===\n this.previousShapeId ||\n this.previousShapeId === null\n ) {\n this.lc.shapes.push(this.shape);\n // uncommon case: insert it somewhere\n } else {\n const newShapes = [];\n let found = false;\n for (let shape of this.lc.shapes) {\n newShapes.push(shape);\n if (shape.id === this.previousShapeId) {\n newShapes.push(this.shape);\n found = true;\n }\n }\n if (!found) {\n // given ID doesn't exist, just shove it on top\n newShapes.push(this.shape);\n }\n this.lc.shapes = newShapes;\n }\n this.lc.repaintLayer(\"main\");\n }\n\n undo() {\n // common case: it's the most recent shape\n if (this.lc.shapes[this.lc.shapes.length - 1].id === this.shape.id) {\n this.lc.shapes.pop();\n // uncommon case: it's in the array somewhere\n } else {\n const newShapes = [];\n for (let shape of this.lc.shapes) {\n if (shape.id !== this.shape.id) {\n newShapes.push(shape);\n }\n }\n this.lc.shapes = newShapes;\n }\n this.lc.repaintLayer(\"main\");\n }\n}\n\nexport {ClearAction, MoveAction, AddShapeAction};\n","const coordsForTouchEvent = function(el, e) {\n const tx = e.changedTouches[0].clientX;\n const ty = e.changedTouches[0].clientY;\n const p = el.getBoundingClientRect();\n return [tx - p.left, ty - p.top];\n};\n\nconst position = function(el, e) {\n const p = el.getBoundingClientRect();\n return {\n left: e.clientX - p.left,\n top: e.clientY - p.top,\n };\n};\n\nconst buttonIsDown = function(e) {\n if (e.buttons != null) {\n return e.buttons === 1;\n } else {\n return e.which > 0;\n }\n};\n\nconst bindEvents = function(lc, canvas, panWithKeyboard) {\n if (panWithKeyboard == null) {\n panWithKeyboard = false;\n }\n const unsubs = [];\n\n const mouseMoveListener = e => {\n e.preventDefault();\n const p = position(canvas, e);\n lc.pointerMove(p.left, p.top);\n };\n\n var mouseUpListener = e => {\n e.preventDefault();\n canvas.onselectstart = () => true; // enable selection while dragging\n const p = position(canvas, e);\n lc.pointerUp(p.left, p.top);\n document.removeEventListener(\"mousemove\", mouseMoveListener);\n document.removeEventListener(\"mouseup\", mouseUpListener);\n\n canvas.addEventListener(\"mousemove\", mouseMoveListener);\n };\n\n canvas.addEventListener(\"mousedown\", e => {\n if (e.target.tagName.toLowerCase() !== \"canvas\") {\n return;\n }\n\n const down = true;\n e.preventDefault();\n canvas.onselectstart = () => false; // disable selection while dragging\n const p = position(canvas, e);\n lc.pointerDown(p.left, p.top);\n\n canvas.removeEventListener(\"mousemove\", mouseMoveListener);\n document.addEventListener(\"mousemove\", mouseMoveListener);\n document.addEventListener(\"mouseup\", mouseUpListener);\n });\n\n const touchMoveListener = function(e) {\n e.preventDefault();\n lc.pointerMove(...coordsForTouchEvent(canvas, e));\n };\n\n var touchEndListener = function(e) {\n e.preventDefault();\n lc.pointerUp(...coordsForTouchEvent(canvas, e));\n document.removeEventListener(\"touchmove\", touchMoveListener);\n document.removeEventListener(\"touchend\", touchEndListener);\n document.removeEventListener(\"touchcancel\", touchEndListener);\n };\n\n canvas.addEventListener(\"touchstart\", function(e) {\n if (e.target.tagName.toLowerCase() !== \"canvas\") {\n return;\n }\n e.preventDefault();\n if (e.touches.length === 1) {\n lc.pointerDown(...coordsForTouchEvent(canvas, e));\n document.addEventListener(\"touchmove\", touchMoveListener);\n document.addEventListener(\"touchend\", touchEndListener);\n document.addEventListener(\"touchcancel\", touchEndListener);\n } else {\n lc.pointerMove(...coordsForTouchEvent(canvas, e));\n }\n });\n\n if (panWithKeyboard) {\n console.warn(\"Keyboard panning is deprecated.\");\n const listener = function(e) {\n switch (e.keyCode) {\n case 37:\n lc.pan(-10, 0);\n break;\n case 38:\n lc.pan(0, -10);\n break;\n case 39:\n lc.pan(10, 0);\n break;\n case 40:\n lc.pan(0, 10);\n break;\n }\n lc.repaintAllLayers();\n };\n\n document.addEventListener(\"keydown\", listener);\n unsubs.push(() => document.removeEventListener(listener));\n }\n\n return () => unsubs.map(f => f());\n};\n\nexport default bindEvents;\n","import Pencil from \"./tools/Pencil\";\n\nconst defaultOptions = {\n imageURLPrefix: \"lib/img\",\n primaryColor: \"hsla(0, 0%, 0%, 1)\",\n secondaryColor: \"hsla(0, 0%, 100%, 1)\",\n backgroundColor: \"transparent\",\n strokeWidths: [1, 2, 5, 10, 20, 30],\n defaultStrokeWidth: 5,\n toolbarPosition: \"top\",\n keyboardShortcuts: false,\n imageSize: {width: \"infinite\", height: \"infinite\"},\n backgroundShapes: [],\n watermarkImage: null,\n watermarkScale: 1,\n zoomMin: 0.2,\n zoomMax: 4.0,\n zoomStep: 0.2,\n snapshot: null,\n onInit: () => {},\n tools: [Pencil],\n};\n\nexport default defaultOptions;\n","import {renderShapes, combineCanvases, getDefaultImageRect} from \"./util\";\nimport {JSONToShape} from \"./shapes\";\n\n// mostly copypasta from LiterallyCanvas.coffee\nconst INFINITE = \"infinite\";\nconst renderWatermark = function(ctx, image, scale) {\n if (!image.width) {\n return;\n }\n\n ctx.save();\n ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2);\n ctx.scale(scale, scale);\n ctx.drawImage(image, -image.width / 2, -image.height / 2);\n ctx.restore();\n};\n\nconst renderSnapshotToImage = function(snapshot, opts) {\n let s;\n if (opts == null) {\n opts = {};\n }\n if (opts.scale == null) {\n opts.scale = 1;\n }\n\n const shapes = snapshot.shapes.map(s => JSONToShape(s));\n let backgroundShapes = snapshot.backgroundShapes.map(s => JSONToShape(s));\n\n if (opts.margin == null) {\n opts.margin = {top: 0, right: 0, bottom: 0, left: 0};\n }\n const imageSize = snapshot.imageSize || {\n width: INFINITE,\n height: INFINITE,\n };\n\n const colors = snapshot.colors || {background: \"transparent\"};\n const allShapes = shapes.concat(backgroundShapes);\n\n const watermarkCanvas = document.createElement(\"canvas\");\n const watermarkCtx = watermarkCanvas.getContext(\"2d\");\n\n if (opts.rect) {\n opts.rect.x -= opts.margin.left;\n opts.rect.y -= opts.margin.top;\n opts.rect.width += opts.margin.left + opts.margin.right;\n opts.rect.height += opts.margin.top + opts.margin.bottom;\n } else {\n opts.rect = getDefaultImageRect(\n allShapes.map(s => s.getBoundingRect(watermarkCtx)),\n imageSize,\n opts.margin,\n );\n }\n\n watermarkCanvas.width = opts.rect.width * opts.scale;\n watermarkCanvas.height = opts.rect.height * opts.scale;\n watermarkCtx.fillStyle = colors.background;\n watermarkCtx.fillRect(0, 0, watermarkCanvas.width, watermarkCanvas.height);\n\n if (!(opts.rect.width && opts.rect.height)) {\n return null;\n }\n\n if (opts.watermarkImage) {\n renderWatermark(watermarkCtx, opts.watermarkImage, opts.watermarkScale);\n }\n\n return combineCanvases(\n watermarkCanvas,\n renderShapes(backgroundShapes, opts.rect, opts.scale),\n renderShapes(shapes, opts.rect, opts.scale),\n );\n};\n\nexport default renderSnapshotToImage;\n","import {getDefaultImageRect, renderShapesToSVG} from \"./util\";\nimport {JSONToShape} from \"./shapes\";\n\nconst INFINITE = \"infinite\";\n\nconst renderSnapshotToSVG = function(snapshot, opts) {\n if (opts == null) {\n opts = {};\n }\n const shapes = snapshot.shapes.map(s => JSONToShape(s));\n const backgroundShapes = snapshot.backgroundShapes.map(s => JSONToShape(s));\n\n if (opts.margin == null) {\n opts.margin = {top: 0, right: 0, bottom: 0, left: 0};\n }\n const imageSize = snapshot.imageSize || {\n width: INFINITE,\n height: INFINITE,\n };\n\n const colors = snapshot.colors || {background: \"transparent\"};\n const allShapes = shapes.concat(backgroundShapes);\n\n const dummyCanvas = document.createElement(\"canvas\");\n const ctx = dummyCanvas.getContext(\"2d\");\n\n if (opts.rect) {\n opts.rect.x -= opts.margin.left;\n opts.rect.y -= opts.margin.top;\n opts.rect.width += opts.margin.left + opts.margin.right;\n opts.rect.height += opts.margin.top + opts.margin.bottom;\n } else {\n opts.rect = getDefaultImageRect(\n allShapes.map(s => s.getBoundingRect(ctx)),\n imageSize,\n opts.margin,\n );\n }\n\n return renderShapesToSVG(\n backgroundShapes.concat(shapes),\n opts.rect,\n colors.background,\n );\n};\n\nexport default renderSnapshotToSVG;\n","import * as actions from \"./actions\";\nimport bindEvents from \"./bindEvents\";\nimport {JSONToShape, shapeToJSON} from \"./shapes\";\nimport {renderShapeToContext} from \"./canvasRenderer\";\nimport defaultOptions from \"./defaultOptions\";\nimport renderSnapshotToImage from \"./renderSnapshotToImage\";\nimport renderSnapshotToSVG from \"./renderSnapshotToSVG\";\nimport {\n getBackingScale,\n matchElementSize,\n requestAnimationFrame,\n addImageOnload,\n getBoundingRect,\n getDefaultImageRect,\n combineCanvases,\n} from \"./util\";\n\nconst INFINITE = \"infinite\";\n\nclass LiterallyCanvas {\n constructor(arg1, arg2) {\n this.setImageSize = this.setImageSize.bind(this);\n let opts = null;\n let containerEl = null;\n if (arg1 instanceof HTMLElement) {\n containerEl = arg1;\n opts = arg2;\n } else {\n opts = arg1;\n }\n\n this.opts = opts || {};\n\n this.config = {\n zoomMin: opts.zoomMin || 0.2,\n zoomMax: opts.zoomMax || 4.0,\n zoomStep: opts.zoomStep || 0.2,\n };\n\n this.colors = {\n primary: opts.primaryColor || \"#000\",\n secondary: opts.secondaryColor || \"#fff\",\n background: opts.backgroundColor || \"transparent\",\n };\n\n this.watermarkImage = opts.watermarkImage;\n this.watermarkScale = opts.watermarkScale || 1;\n\n this.backgroundCanvas = document.createElement(\"canvas\");\n this.backgroundCtx = this.backgroundCanvas.getContext(\"2d\");\n\n this.canvas = document.createElement(\"canvas\");\n this.canvas.style[\"background-color\"] = \"transparent\";\n\n this.buffer = document.createElement(\"canvas\");\n this.buffer.style[\"background-color\"] = \"transparent\";\n this.ctx = this.canvas.getContext(\"2d\");\n this.bufferCtx = this.buffer.getContext(\"2d\");\n\n this.backingScale = getBackingScale(this.ctx);\n\n this.backgroundShapes = opts.backgroundShapes || [];\n this._shapesInProgress = [];\n this.shapes = [];\n this.undoStack = [];\n this.redoStack = [];\n this.tools = [];\n\n this.isDragging = false;\n this.position = {x: 0, y: 0};\n this.scale = 1.0;\n // GUI immediately replaces this value, but it's initialized so you can have\n // something really simple\n this.setTool(new this.opts.tools[0](this));\n\n this.width = opts.imageSize.width || INFINITE;\n this.height = opts.imageSize.height || INFINITE;\n\n // This will ensure that we are zoomed to @scale, panned to @position, and\n // that all layers are repainted.\n this.setZoom(this.scale);\n\n if (opts.snapshot) {\n this.loadSnapshot(opts.snapshot);\n }\n\n this.isBound = false;\n if (containerEl) {\n this.bindToElement(containerEl);\n }\n\n }\n\n bindToElement(containerEl) {\n if (this.containerEl) {\n console.warn(\n \"Trying to bind Literally Canvas to a DOM element more than once is unsupported.\",\n );\n return;\n }\n\n this.containerEl = containerEl;\n this._unsubscribeEvents = bindEvents(\n this,\n this.containerEl,\n this.opts.keyboardShortcuts,\n );\n this.containerEl.style[\"background-color\"] = this.colors.background;\n this.containerEl.appendChild(this.backgroundCanvas);\n this.containerEl.appendChild(this.canvas);\n\n this.isBound = true;\n\n const repaintAll = () => {\n this.keepPanInImageBounds();\n this.repaintAllLayers();\n };\n\n this.respondToSizeChange = matchElementSize(\n this.containerEl,\n [this.backgroundCanvas, this.canvas],\n this.backingScale,\n repaintAll,\n );\n\n if (this.watermarkImage) {\n this.watermarkImage.onload = () => this.repaintLayer(\"background\");\n }\n\n if (this.tool != null) {\n this.tool.didBecomeActive(this);\n }\n\n repaintAll();\n }\n\n _teardown() {\n if (this.tool != null) {\n this.tool.willBecomeInactive(this);\n }\n if (typeof this._unsubscribeEvents === \"function\") {\n this._unsubscribeEvents();\n }\n this.tool = null;\n this.containerEl = null;\n this.isBound = false;\n }\n\n trigger(name, data) {\n this.canvas.dispatchEvent(new CustomEvent(name, {detail: data}));\n // dispatchEvent has a boolean value that doesn't mean anything to us, so\n // don't let CoffeeScript send it back\n return null;\n }\n\n on(name, fn) {\n const wrapper = e => fn(e.detail);\n this.canvas.addEventListener(name, wrapper);\n return () => {\n this.canvas.removeEventListener(name, wrapper);\n };\n }\n\n // actual ratio of drawing-space pixels to perceived pixels, accounting for\n // both zoom and displayPixelWidth. use this when converting between\n // drawing-space and screen-space.\n getRenderScale() {\n return this.scale * this.backingScale;\n }\n\n clientCoordsToDrawingCoords(x, y) {\n return {\n x:\n (x * this.backingScale - this.position.x) /\n this.getRenderScale(),\n y:\n (y * this.backingScale - this.position.y) /\n this.getRenderScale(),\n };\n }\n\n drawingCoordsToClientCoords(x, y) {\n return {\n x: x * this.getRenderScale() + this.position.x,\n y: y * this.getRenderScale() + this.position.y,\n };\n }\n\n setImageSize(width, height) {\n this.width = width || INFINITE;\n this.height = height || INFINITE;\n this.keepPanInImageBounds();\n this.repaintAllLayers();\n this.trigger(\"imageSizeChange\", {\n width: this.width,\n height: this.height,\n });\n }\n\n setTool(tool) {\n if (this.isBound) {\n if (this.tool != null) {\n this.tool.willBecomeInactive(this);\n }\n }\n this.tool = tool;\n this.tools.push(tool);\n this.trigger(\"toolChange\", {tool});\n if (this.isBound) {\n this.tool.didBecomeActive(this);\n }\n }\n\n setShapesInProgress(newVal) {\n this._shapesInProgress = newVal;\n }\n\n pointerDown(x, y) {\n const p = this.clientCoordsToDrawingCoords(x, y);\n if (this.tool.usesSimpleAPI) {\n this.tool.begin(p.x, p.y, this);\n this.isDragging = true;\n this.trigger(\"drawStart\", {tool: this.tool});\n } else {\n this.isDragging = true;\n this.trigger(\"lc-pointerdown\", {\n tool: this.tool,\n x: p.x,\n y: p.y,\n rawX: x,\n rawY: y,\n });\n }\n }\n\n pointerMove(x, y) {\n // FIXME: requestAnimationFrame returns a value to be used in order to\n // cancel animationFrame when it is no longer required...\n requestAnimationFrame(() => {\n const p = this.clientCoordsToDrawingCoords(x, y);\n if (this.tool != null ? this.tool.usesSimpleAPI : undefined) {\n if (this.isDragging) {\n this.tool.continue(p.x, p.y, this);\n this.trigger(\"drawContinue\", {tool: this.tool});\n }\n } else {\n if (this.isDragging) {\n this.trigger(\"lc-pointerdrag\", {\n tool: this.tool,\n x: p.x,\n y: p.y,\n rawX: x,\n rawY: y,\n });\n } else {\n this.trigger(\"lc-pointermove\", {\n tool: this.tool,\n x: p.x,\n y: p.y,\n rawX: x,\n rawY: y,\n });\n }\n }\n });\n }\n\n pointerUp(x, y) {\n const p = this.clientCoordsToDrawingCoords(x, y);\n if (this.tool.usesSimpleAPI) {\n if (this.isDragging) {\n this.tool.end(p.x, p.y, this);\n this.isDragging = false;\n this.trigger(\"drawEnd\", {tool: this.tool});\n }\n } else {\n this.isDragging = false;\n this.trigger(\"lc-pointerup\", {\n tool: this.tool,\n x: p.x,\n y: p.y,\n rawX: x,\n rawY: y,\n });\n }\n }\n\n setColor(name, color) {\n this.colors[name] = color;\n if (!this.isBound) {\n return;\n }\n switch (name) {\n case \"background\":\n this.containerEl.style.backgroundColor = this.colors.background;\n this.repaintLayer(\"background\");\n break;\n case \"primary\":\n this.repaintLayer(\"main\");\n break;\n case \"secondary\":\n this.repaintLayer(\"main\");\n break;\n }\n this.trigger(`${name}ColorChange`, this.colors[name]);\n if (name === \"background\") {\n this.trigger(\"drawingChange\");\n }\n }\n\n getColor(name) {\n return this.colors[name];\n }\n\n saveShape(shape, triggerShapeSaveEvent, previousShapeId = null) {\n if (triggerShapeSaveEvent == null) {\n triggerShapeSaveEvent = true;\n }\n if (!previousShapeId) {\n previousShapeId = this.shapes.length\n ? this.shapes[this.shapes.length - 1].id\n : null;\n }\n this.execute(new actions.AddShapeAction(this, shape, previousShapeId));\n if (triggerShapeSaveEvent) {\n this.trigger(\"shapeSave\", {shape, previousShapeId});\n }\n this.trigger(\"drawingChange\");\n }\n\n pan(x, y) {\n // Subtract because we are moving the viewport\n this.setPan(this.position.x - x, this.position.y - y);\n }\n\n keepPanInImageBounds() {\n const renderScale = this.getRenderScale();\n let {x, y} = this.position;\n\n if (this.width !== INFINITE) {\n if (this.canvas.width > this.width * renderScale) {\n x = (this.canvas.width - this.width * renderScale) / 2;\n } else {\n x = Math.max(\n Math.min(0, x),\n this.canvas.width - this.width * renderScale,\n );\n }\n }\n\n if (this.height !== INFINITE) {\n if (this.canvas.height > this.height * renderScale) {\n y = (this.canvas.height - this.height * renderScale) / 2;\n } else {\n y = Math.max(\n Math.min(0, y),\n this.canvas.height - this.height * renderScale,\n );\n }\n }\n\n this.position = {x, y};\n }\n\n setPan(x, y) {\n this.position = {x, y};\n this.keepPanInImageBounds();\n this.repaintAllLayers();\n this.trigger(\"pan\", {x: this.position.x, y: this.position.y});\n }\n\n zoom(factor) {\n let newScale = this.scale + factor;\n newScale = Math.max(newScale, this.config.zoomMin);\n newScale = Math.min(newScale, this.config.zoomMax);\n newScale = Math.round(newScale * 100) / 100;\n this.setZoom(newScale);\n }\n\n setZoom(scale) {\n const center = this.clientCoordsToDrawingCoords(\n this.canvas.width / 2,\n this.canvas.height / 2,\n );\n const oldScale = this.scale;\n this.scale = scale;\n\n this.position.x =\n (this.canvas.width / 2) * this.backingScale -\n center.x * this.getRenderScale();\n this.position.y =\n (this.canvas.height / 2) * this.backingScale -\n center.y * this.getRenderScale();\n\n this.keepPanInImageBounds();\n\n this.repaintAllLayers();\n this.trigger(\"zoom\", {oldScale, newScale: this.scale});\n }\n\n setWatermarkImage(newImage) {\n this.watermarkImage = newImage;\n addImageOnload(newImage, () => this.repaintLayer(\"background\"));\n if (newImage.width) {\n this.repaintLayer(\"background\");\n }\n }\n\n repaintAllLayers() {\n for (let key of [\"background\", \"main\"]) {\n this.repaintLayer(key);\n }\n return null;\n }\n\n // Repaints the canvas.\n // If dirty is true then all saved shapes are completely redrawn,\n // otherwise the back buffer is simply copied to the screen as is.\n repaintLayer(repaintLayerKey, dirty) {\n if (dirty == null) {\n dirty = repaintLayerKey === \"main\";\n }\n if (!this.isBound) {\n return;\n }\n switch (repaintLayerKey) {\n case \"background\":\n this.backgroundCtx.clearRect(\n 0,\n 0,\n this.backgroundCanvas.width,\n this.backgroundCanvas.height,\n );\n var retryCallback = () => this.repaintLayer(\"background\");\n if (this.watermarkImage) {\n this._renderWatermark(\n this.backgroundCtx,\n true,\n retryCallback,\n );\n }\n this.draw(\n this.backgroundShapes,\n this.backgroundCtx,\n retryCallback,\n );\n break;\n case \"main\":\n retryCallback = () => this.repaintLayer(\"main\", true);\n if (dirty) {\n this.buffer.width = this.canvas.width;\n this.buffer.height = this.canvas.height;\n this.bufferCtx.clearRect(\n 0,\n 0,\n this.buffer.width,\n this.buffer.height,\n );\n this.draw(this.shapes, this.bufferCtx, retryCallback);\n }\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n if (this.canvas.width > 0 && this.canvas.height > 0) {\n this.ctx.fillStyle = \"#ccc\";\n this.ctx.fillRect(\n 0,\n 0,\n this.canvas.width,\n this.canvas.height,\n );\n this.clipped(() => {\n this.ctx.clearRect(\n 0,\n 0,\n this.canvas.width,\n this.canvas.height,\n );\n this.ctx.drawImage(this.buffer, 0, 0);\n }, this.ctx);\n\n this.clipped(\n () => {\n this.transformed(\n () => {\n this._shapesInProgress.map(shape =>\n renderShapeToContext(this.ctx, shape, {\n bufferCtx: this.bufferCtx,\n shouldOnlyDrawLatest: true,\n }),\n );\n },\n this.ctx,\n this.bufferCtx,\n );\n },\n this.ctx,\n this.bufferCtx,\n );\n }\n break;\n }\n\n this.trigger(\"repaint\", {layerKey: repaintLayerKey});\n }\n\n _renderWatermark(ctx, worryAboutRetina, retryCallback) {\n if (worryAboutRetina == null) {\n worryAboutRetina = true;\n }\n if (!this.watermarkImage.width) {\n this.watermarkImage.onload = retryCallback;\n return;\n }\n\n ctx.save();\n ctx.translate(ctx.canvas.width / 2, ctx.canvas.height / 2);\n ctx.scale(this.watermarkScale, this.watermarkScale);\n if (worryAboutRetina) {\n ctx.scale(this.backingScale, this.backingScale);\n }\n ctx.drawImage(\n this.watermarkImage,\n -this.watermarkImage.width / 2,\n -this.watermarkImage.height / 2,\n );\n ctx.restore();\n }\n\n // Redraws the back buffer to the screen in its current state\n // then draws the given shape translated and scaled on top of that.\n // This is used for updating a shape while it is being drawn\n // without doing a full repaint.\n // The context is restored to its original state before returning.\n drawShapeInProgress(shape) {\n this.repaintLayer(\"main\", false);\n this.clipped(\n () => {\n this.transformed(\n () => {\n renderShapeToContext(this.ctx, shape, {\n bufferCtx: this.bufferCtx,\n shouldOnlyDrawLatest: true,\n });\n },\n this.ctx,\n this.bufferCtx,\n );\n },\n this.ctx,\n this.bufferCtx,\n );\n }\n\n // Draws the given shapes translated and scaled to the given context.\n // The context is restored to its original state before returning.\n draw(shapes, ctx, retryCallback) {\n if (!shapes.length) {\n return;\n }\n const drawShapes = () => {\n shapes.map(shape =>\n renderShapeToContext(ctx, shape, {retryCallback}),\n );\n };\n this.clipped(() => this.transformed(drawShapes, ctx), ctx);\n }\n\n // Executes the given function after clipping the canvas to the image size.\n // The context is restored to its original state before returning.\n // This should not be called inside an @transformed block.\n clipped(fn, ...contexts) {\n const x = this.width === INFINITE ? 0 : this.position.x;\n const y = this.height === INFINITE ? 0 : this.position.y;\n const width =\n this.width === INFINITE\n ? this.canvas.width\n : this.width * this.getRenderScale();\n const height =\n this.height === INFINITE\n ? this.canvas.height\n : this.height * this.getRenderScale();\n\n for (var ctx of contexts) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(x, y, width, height);\n ctx.clip();\n }\n\n fn();\n\n for (ctx of contexts) {\n ctx.restore();\n }\n }\n\n // Executes the given function after translating and scaling the context.\n // The context is restored to its original state before returning.\n transformed(fn, ...contexts) {\n for (var ctx of contexts) {\n ctx.save();\n ctx.translate(\n Math.floor(this.position.x),\n Math.floor(this.position.y),\n );\n const scale = this.getRenderScale();\n ctx.scale(scale, scale);\n }\n\n fn();\n\n for (ctx of contexts) {\n ctx.restore();\n }\n }\n\n clear(triggerClearEvent) {\n if (triggerClearEvent == null) {\n triggerClearEvent = true;\n }\n const oldShapes = this.shapes;\n const newShapes = [];\n this.setShapesInProgress([]);\n this.execute(new actions.ClearAction(this, oldShapes, newShapes));\n this.repaintLayer(\"main\");\n if (triggerClearEvent) {\n this.trigger(\"clear\", null);\n }\n this.trigger(\"drawingChange\", {});\n }\n\n execute(action) {\n this.undoStack.push(action);\n action.do();\n this.redoStack = [];\n }\n\n undo() {\n if (!this.undoStack.length) {\n return;\n }\n const action = this.undoStack.pop();\n action.undo();\n this.redoStack.push(action);\n this.trigger(\"undo\", {action});\n this.trigger(\"drawingChange\", {});\n }\n\n redo() {\n if (!this.redoStack.length) {\n return;\n }\n const action = this.redoStack.pop();\n this.undoStack.push(action);\n action.do();\n this.trigger(\"redo\", {action});\n this.trigger(\"drawingChange\", {});\n }\n\n canUndo() {\n return !!this.undoStack.length;\n }\n canRedo() {\n return !!this.redoStack.length;\n }\n\n getPixel(x, y) {\n const p = this.drawingCoordsToClientCoords(x, y);\n const pixel = this.ctx.getImageData(p.x, p.y, 1, 1).data;\n if (pixel[3]) {\n return `rgb(${pixel[0]}, ${pixel[1]}, ${pixel[2]})`;\n } else {\n return null;\n }\n }\n\n getContentBounds() {\n return getBoundingRect(\n this.shapes\n .concat(this.backgroundShapes)\n .map(s => s.getBoundingRect()),\n this.width === INFINITE ? 0 : this.width,\n this.height === INFINITE ? 0 : this.height,\n );\n }\n\n getDefaultImageRect(explicitSize, margin) {\n if (explicitSize == null) {\n explicitSize = {width: 0, height: 0};\n }\n if (margin == null) {\n margin = {top: 0, right: 0, bottom: 0, left: 0};\n }\n return getDefaultImageRect(\n this.shapes\n .concat(this.backgroundShapes)\n .map(s => s.getBoundingRect(this.ctx)),\n explicitSize,\n margin,\n );\n }\n\n getImage(opts) {\n if (opts == null) {\n opts = {};\n }\n if (opts.includeWatermark == null) {\n opts.includeWatermark = true;\n }\n if (opts.scaleDownRetina == null) {\n opts.scaleDownRetina = true;\n }\n if (opts.scale == null) {\n opts.scale = 1;\n }\n if (!opts.scaleDownRetina) {\n opts.scale *= this.backingScale;\n }\n\n if (opts.includeWatermark) {\n opts.watermarkImage = this.watermarkImage;\n opts.watermarkScale = this.watermarkScale;\n if (!opts.scaleDownRetina) {\n opts.watermarkScale *= this.backingScale;\n }\n }\n return renderSnapshotToImage(this.getSnapshot(), opts);\n }\n\n canvasForExport() {\n this.repaintAllLayers();\n return combineCanvases(this.backgroundCanvas, this.canvas);\n }\n\n canvasWithBackground(backgroundImageOrCanvas) {\n return combineCanvases(backgroundImageOrCanvas, this.canvasForExport());\n }\n\n getSnapshot(keys = null) {\n if (keys == null) {\n keys = [\n \"shapes\",\n \"imageSize\",\n \"colors\",\n \"position\",\n \"scale\",\n \"backgroundShapes\",\n ];\n }\n const snapshot = {};\n for (let k of [\"colors\", \"position\", \"scale\"]) {\n if (keys.indexOf(k) >= 0) {\n snapshot[k] = this[k];\n }\n }\n if (keys.indexOf(\"shapes\") >= 0) {\n snapshot.shapes = this.shapes.map(shape => shapeToJSON(shape));\n }\n if (keys.indexOf(\"backgroundShapes\") >= 0) {\n snapshot.backgroundShapes = this.backgroundShapes.map(shape =>\n shapeToJSON(shape),\n );\n }\n if (keys.indexOf(\"imageSize\") >= 0) {\n snapshot.imageSize = {width: this.width, height: this.height};\n }\n\n return snapshot;\n }\n getSnapshotJSON() {\n console.warn(\n \"lc.getSnapshotJSON() is deprecated. use JSON.stringify(lc.getSnapshot()) instead.\",\n );\n return JSON.stringify(this.getSnapshot());\n }\n\n getSVGString(opts) {\n if (opts == null) {\n opts = {};\n }\n return renderSnapshotToSVG(this.getSnapshot(), opts);\n }\n\n loadSnapshot(snapshot) {\n if (!snapshot) {\n return;\n }\n\n if (snapshot.colors) {\n for (let k of [\"primary\", \"secondary\", \"background\"]) {\n this.setColor(k, snapshot.colors[k]);\n }\n }\n\n if (snapshot.shapes) {\n // reset shapes\n this.shapes = [];\n // reset undostack aswell when loading a snapshot\n this.undostack = [];\n\n for (let shapeRepr of snapshot.shapes) {\n const shape = JSONToShape(shapeRepr);\n if (shape) {\n this.execute(new actions.AddShapeAction(this, shape));\n }\n }\n }\n\n if (snapshot.backgroundShapes) {\n this.backgroundShapes = snapshot.backgroundShapes.map(s =>\n JSONToShape(s),\n );\n }\n\n if (snapshot.imageSize) {\n this.width = snapshot.imageSize.width;\n this.height = snapshot.imageSize.height;\n }\n\n if (snapshot.position) {\n this.position = snapshot.position;\n }\n if (snapshot.scale) {\n this.scale = snapshot.scale;\n }\n\n this.repaintAllLayers();\n this.trigger(\"snapshotLoad\");\n this.trigger(\"drawingChange\", {});\n }\n\n loadSnapshotJSON(str) {\n console.warn(\n \"lc.loadSnapshotJSON() is deprecated. use lc.loadSnapshot(JSON.parse(snapshot)) instead.\",\n );\n this.loadSnapshot(JSON.parse(str));\n }\n}\n\nLiterallyCanvas.defaultOptions = defaultOptions;\n\nexport default LiterallyCanvas;\n","let strings = {};\n\nconst localize = localStrings => (strings = localStrings);\n\nconst _ = function(string) {\n const translation = strings[string];\n return translation || string;\n};\n\nexport {localize, _};\n","const math = {};\n\nmath.toPoly = function(line) {\n let polyLeft = [];\n let polyRight = [];\n\n let index = 0;\n for (let point of line) {\n const n = normals(point, _slope(line, index));\n polyLeft = polyLeft.concat([n[0]]);\n polyRight = [n[1]].concat(polyRight);\n index += 1;\n }\n\n return polyLeft.concat(polyRight);\n};\n\nvar _slope = function(line, index) {\n let point;\n if (line.length < 3) {\n point = {x: 0, y: 0};\n }\n if (index === 0) {\n point = _slope(line, index + 1);\n } else if (index === line.length - 1) {\n point = _slope(line, index - 1);\n } else {\n point = math.diff(line[index - 1], line[index + 1]);\n }\n\n return point;\n};\n\nmath.diff = (a, b) => ({x: b.x - a.x, y: b.y - a.y});\n\nconst unit = function(vector) {\n const length = math.len(vector);\n return {x: vector.x / length, y: vector.y / length};\n};\n\nvar normals = function(p, slope) {\n slope = unit(slope);\n slope.x = (slope.x * p.size) / 2;\n slope.y = (slope.y * p.size) / 2;\n return [\n {x: p.x - slope.y, y: p.y + slope.x, color: p.color},\n {x: p.x + slope.y, y: p.y - slope.x, color: p.color},\n ];\n};\n\nmath.len = vector => Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n\nmath.scalePositionScalar = function(val, viewportSize, oldScale, newScale) {\n const oldSize = viewportSize * oldScale;\n const newSize = viewportSize * newScale;\n return val + (oldSize - newSize) / 2;\n};\n\nexport default math;\n","import * as toolsBase from \"./tools/base\";\nimport Pencil from \"./tools/Pencil\";\nimport * as actions from \"./actions\";\nimport bindEvents from \"./bindEvents\";\nimport * as canvasRenderer from \"./canvasRenderer\";\nimport defaultOptions from \"./defaultOptions\";\nimport lineEndCapShapes from \"./lineEndCapShapes\";\nimport LiterallyCanvas from \"./LiterallyCanvas\";\nimport * as localization from \"./localization\";\nimport math from \"./math\";\nimport renderSnapshotToImage from \"./renderSnapshotToImage\";\nimport renderSnapshotToSVG from \"./renderSnapshotToSVG\";\nimport * as shapes from \"./shapes\";\nimport * as svgRenderer from \"./svgRenderer\";\nimport TextRenderer from \"./TextRenderer\";\nimport * as util from \"./util\";\n\nexport {\n actions,\n bindEvents,\n canvasRenderer,\n defaultOptions,\n lineEndCapShapes,\n LiterallyCanvas,\n localization,\n math,\n renderSnapshotToImage,\n renderSnapshotToSVG,\n shapes,\n svgRenderer,\n TextRenderer,\n util,\n toolsBase,\n Pencil,\n};\n\nif (window) {\n window.LC = {\n actions,\n bindEvents,\n canvasRenderer,\n defaultOptions,\n lineEndCapShapes,\n LiterallyCanvas,\n localization,\n math,\n renderSnapshotToImage,\n renderSnapshotToSVG,\n shapes,\n svgRenderer,\n TextRenderer,\n util,\n toolsBase,\n Pencil,\n };\n}\n\nexport default LiterallyCanvas;\n","import React from 'react';\n\nexport default class LCCanvasContainer extends React.Component {\n shouldComponentUpdate() {\n return false;\n }\n\n render() {\n return (\n
\n
\n
\n );\n }\n}","import React from 'react';\n\nimport IconBrush from './img/brush@2x.png';\nimport IconImage from './img/image@2x.png';\nimport IconPen from './img/pen@2x.png';\nimport IconErase from './img/eraser@2x.png';\nimport IconRedo from './img/redo@2x.png';\nimport IconShape from './img/shape@2x.png';\nimport IconText from './img/text@2x.png';\nimport IconUndo from './img/undo@2x.png';\n\nexport default class PrimaryToolBar extends React.Component {\n handleFileUploadRef = (r) => {\n // omer file upload absolute?\n this.fileUpload = r;\n }\n\n handleFileUpload = () => {\n this.fileUpload.click();\n }\n\n renderLine1() {\n return (\n
\n
\n \n\n \n\n \n \n \"Shape\"\n \n \n \"Text\"\n \n \n \"Pen\"\n \n {!this.props.hidePhoto &&\n <>\n \n \n \n }\n
\n
\n )\n }\n\n renderLine2() {\n return (\n
\n
\n \n \n \n \"Erase\"\n \n
\n
\n )\n }\n \n render() {\n return (\n
\n {this.renderLine1()}\n {this.renderLine2()}\n
\n );\n }\n}","export const strokeOptions = [\n {\n name: 'thin',\n value: 2,\n cssBorderWidth: 1\n },\n {\n name: 'medium',\n value: 5,\n cssBorderWidth: 2\n },\n {\n name: 'thick',\n value: 10,\n cssBorderWidth: 4\n },\n {\n name: 'extra thick',\n value: 20,\n cssBorderWidth: 7\n },\n];\n// export const strokeOptions = [...strokeOpts, ...strokeOpts.map(a => Object.assign({}, a, { name: a.name + '-dashed', isDashed: true }))];\n ","import React from 'react';\nimport { GithubPicker } from 'react-color'\nimport { strokeOptions } from './constants';\n\nimport IconArrow from './img/arrow@2x.png';\nimport IconLine from './img/line@2x.png';\nimport IconRect from './img/rectangle@2x.png';\nimport IconEllipse from './img/ellipse@2x.png';\n\nexport default class SecondaryToolBar extends React.Component {\n\n colors = ['#000', '#B80000', '#DB3E00', '#FCCB00', '#008B02', '#006B76', '#1273DE', '#004DCF', '#5300EB',\n '#EB9694', '#FAD0C3', '#FEF3BD', '#C1E1C5', '#BEDADC', '#C4DEF6', '#BED3F3', '#D4C4FB'];\n\n renderColorSelection = () => {\n const additionalColors = this.props.colorType === 'secondary' ? ['transparent'] : [];\n return {\n this.props.onItemSelect({ type: 'set-color', value: color.hex });\n }} />\n }\n\n renderBrushSelection = () => {\n const content = strokeOptions.map(opt => (\n
\n
{opt.name}
\n {\n this.props.onItemSelect({\n type: 'set-brush',\n value: opt.value,\n isDashed: false\n })\n }}\n >\n \n \n {\n this.props.onItemSelect({\n type: 'set-brush',\n value: opt.value,\n isDashed: true\n })\n }}\n >\n \n \n
\n ));\n return (\n
{content}
\n );\n }\n\n renderShapeSelection = () => {\n return (\n
\n {\n this.props.onItemSelect({\n type: 'set-shape',\n value: 'Arrow',\n })\n }}\n >\n \"Arrow\"\n \n {\n this.props.onItemSelect({\n type: 'set-shape',\n value: 'Line',\n })\n }}\n >\n \"Line\"\n \n {\n this.props.onItemSelect({\n type: 'set-shape',\n value: 'Rectangle',\n })\n }}\n >\n \"Rectangle\"\n \n {\n this.props.onItemSelect({\n type: 'set-shape',\n value: 'Ellipse',\n })\n }}\n >\n \"Ellipse\"\n \n
\n )\n }\n\n // TODO: refactor.\n render() {\n const { selected } = this.props;\n if (!selected) {\n return null;\n } else if (selected === 'color-picker') {\n return this.renderColorSelection();\n } else if (selected === 'brush-picker') {\n return this.renderBrushSelection();\n } else if (selected === 'shape-picker') {\n return this.renderShapeSelection();\n }\n return (
\n\n
);\n }\n}\n","\nexport default class JPencil extends window.LC.toolsBase.ToolWithStroke {\n begin(x, y, lc) {\n this.color = lc.getColor(\"primary\");\n this.currentShape = this.makeShape();\n this.currentShape.addPoint(this.makePoint(x, y, lc));\n this.lastEventTime = Date.now();\n }\n\n continue(x, y, lc) {\n const timeDiff = Date.now() - this.lastEventTime;\n\n if (timeDiff > this.eventTimeThreshold) {\n this.lastEventTime += timeDiff;\n this.currentShape.addPoint(this.makePoint(x, y, lc));\n lc.drawShapeInProgress(this.currentShape);\n }\n }\n\n end(x, y, lc) {\n lc.saveShape(this.currentShape);\n this.currentShape = undefined;\n }\n\n makePoint(x, y, lc) {\n return window.LC.shapes.createShape(\"Point\", {\n x,\n y,\n size: lc.getStrokeWidth(),\n color: this.color,\n });\n }\n\n makeShape() {\n return window.LC.shapes.createShape(\"LinePath\");\n }\n didBecomeActive() {\n\n }\n unsubscribe() {\n \n }\n}\n\nJPencil.prototype.name = \"JPencil\";\nJPencil.prototype.iconName = \"pencil\";\nJPencil.prototype.eventTimeThreshold = 10;\n\n","import Pencil from \"./Pencil\";\nimport {createShape} from \"../literally_canvas/shapes\";\n\nclass Eraser extends Pencil {\n makePoint(x, y, lc) {\n return createShape(\"Point\", {\n x,\n y,\n size: this.strokeWidth,\n color: this.color,\n });\n }\n makeShape() {\n return createShape(\"ErasedLinePath\");\n }\n}\n\nEraser.prototype.name = \"JEraser\";\nEraser.prototype.iconName = \"eraser\";\nEraser.prototype.eventTimeThreshold = 10;\n\nexport default Eraser;\n","// just for adding dash feature.\nexport default () => {\n const { defineShape, createShape } = window.LC.shapes;\n defineShape(\"Rectangle\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.width = args.width || 0;\n this.height = args.height || 0;\n this.strokeWidth = args.strokeWidth || 1;\n this.strokeColor = args.strokeColor || \"black\";\n this.dash = args.dash;\n this.fillColor = args.fillColor || \"transparent\";\n },\n\n getBoundingRect() {\n return {\n x: this.x - this.strokeWidth / 2,\n y: this.y - this.strokeWidth / 2,\n width: this.width + this.strokeWidth,\n height: this.height + this.strokeWidth,\n };\n },\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n strokeColor: this.strokeColor,\n fillColor: this.fillColor,\n };\n },\n fromJSON(data) {\n return createShape(\"Rectangle\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n });\n\n // this is pretty similar to the Rectangle shape. maybe consolidate somehow.\n defineShape(\"Ellipse\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x = args.x || 0;\n this.y = args.y || 0;\n this.width = args.width || 0;\n this.height = args.height || 0;\n this.strokeWidth = args.strokeWidth || 1;\n this.strokeColor = args.strokeColor || \"black\";\n this.dash = args.dash;\n this.fillColor = args.fillColor || \"transparent\";\n },\n\n getBoundingRect() {\n return {\n x: this.x - this.strokeWidth / 2,\n y: this.y - this.strokeWidth / 2,\n width: this.width + this.strokeWidth,\n height: this.height + this.strokeWidth,\n };\n },\n toJSON() {\n return {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n strokeWidth: this.strokeWidth,\n strokeColor: this.strokeColor,\n fillColor: this.fillColor,\n };\n },\n fromJSON(data) {\n return createShape(\"Ellipse\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x = this.x - moveInfo.xDiff;\n this.y = this.y - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n this.x = upperLeft.x;\n this.y = upperLeft.y;\n },\n });\n\n defineShape(\"Line\", {\n constructor(args) {\n if (args == null) {\n args = {};\n }\n this.x1 = args.x1 || 0;\n this.y1 = args.y1 || 0;\n this.x2 = args.x2 || 0;\n this.y2 = args.y2 || 0;\n this.strokeWidth = args.strokeWidth || 1;\n this.color = args.color || \"black\";\n this.capStyle = args.capStyle || \"round\";\n this.endCapShapes = args.endCapShapes || [null, null];\n this.dash = args.dash || null;\n },\n\n getBoundingRect() {\n return {\n x: Math.min(this.x1, this.x2) - this.strokeWidth / 2,\n y: Math.min(this.y1, this.y2) - this.strokeWidth / 2,\n width: Math.abs(this.x2 - this.x1) + this.strokeWidth / 2,\n height: Math.abs(this.y2 - this.y1) + this.strokeWidth / 2,\n };\n },\n toJSON() {\n return {\n x1: this.x1,\n y1: this.y1,\n x2: this.x2,\n y2: this.y2,\n strokeWidth: this.strokeWidth,\n color: this.color,\n capStyle: this.capStyle,\n dash: this.dash,\n endCapShapes: this.endCapShapes,\n };\n },\n fromJSON(data) {\n return createShape(\"Line\", data);\n },\n move(moveInfo) {\n if (moveInfo == null) {\n moveInfo = {};\n }\n this.x1 = this.x1 - moveInfo.xDiff;\n this.y1 = this.y1 - moveInfo.yDiff;\n this.x2 = this.x2 - moveInfo.xDiff;\n this.y2 = this.y2 - moveInfo.yDiff;\n },\n setUpperLeft(upperLeft) {\n if (upperLeft == null) {\n upperLeft = {};\n }\n const br = this.getBoundingRect();\n const xDiff = br.x - upperLeft.x;\n const yDiff = br.y - upperLeft.y;\n this.move({xDiff, yDiff});\n },\n });\n\n const defineCanvasRenderer = window.LC.canvasRenderer.defineCanvasRenderer;\n defineCanvasRenderer(\"Rectangle\", function(ctx, shape) {\n let {x} = shape;\n let {y} = shape;\n if (shape.strokeWidth % 2 !== 0) {\n x += 0.5;\n y += 0.5;\n }\n \n ctx.fillStyle = shape.fillColor;\n ctx.fillRect(x, y, shape.width, shape.height);\n ctx.lineWidth = shape.strokeWidth;\n ctx.strokeStyle = shape.strokeColor;\n if (shape.dash) {\n ctx.setLineDash(shape.dash);\n }\n ctx.strokeRect(x, y, shape.width, shape.height);\n });\n \n defineCanvasRenderer(\"Ellipse\", function(ctx, shape) {\n ctx.save();\n const halfWidth = Math.floor(shape.width / 2);\n const halfHeight = Math.floor(shape.height / 2);\n const centerX = shape.x + halfWidth;\n const centerY = shape.y + halfHeight;\n \n ctx.translate(centerX, centerY);\n ctx.scale(1, Math.abs(shape.height / shape.width));\n ctx.beginPath();\n ctx.arc(0, 0, Math.abs(halfWidth), 0, Math.PI * 2);\n ctx.closePath();\n ctx.restore();\n \n ctx.fillStyle = shape.fillColor;\n if (shape.dash) {\n ctx.setLineDash(shape.dash);\n }\n ctx.fill();\n ctx.lineWidth = shape.strokeWidth;\n ctx.strokeStyle = shape.strokeColor;\n ctx.stroke();\n });\n\n \n\n}\n","\nexport default class JRectangle extends window.LC.toolsBase.ToolWithStroke {\n begin(x, y, lc) {\n return this.currentShape = window.LC.shapes.createShape('Rectangle', {\n x, y,\n strokeWidth: lc.getStrokeWidth(),\n dash: (function() {\n if( lc.isDashed())\n {\n return [lc.getStrokeWidth() * 2, lc.getStrokeWidth() * 4];\n }\n return null;\n }\n ).call(this),\n strokeColor: lc.getColor('primary'),\n fillColor: lc.getColor('secondary')});\n }\n \n continue(x, y, lc) {\n this.currentShape.width = x - this.currentShape.x;\n this.currentShape.height = y - this.currentShape.y;\n return lc.drawShapeInProgress(this.currentShape);\n }\n \n end(x, y, lc) {\n // If there is no height or width, dont save\n if ((this.currentShape.height === 0) || (this.currentShape.width === 0)) {\n return;\n }\n return lc.saveShape(this.currentShape);\n }\n didBecomeActive() {\n\n }\n unsubscribe() {\n \n }\n}\n\nJRectangle.prototype.name = \"JRectangle\";\nJRectangle.prototype.iconName = \"rectangle\";\nJRectangle.prototype.eventTimeThreshold = 10;\n\n","\nexport default class JEllipse extends window.LC.toolsBase.ToolWithStroke {\n begin(x, y, lc) {\n return this.currentShape = window.LC.shapes.createShape('Ellipse', {\n x: x,\n y: y,\n dash: (function() {\n switch (false) {\n case !lc.isDashed():\n return [lc.getStrokeWidth() * 2, lc.getStrokeWidth() * 4];\n default:\n return null;\n }\n }).call(this),\n strokeWidth: lc.getStrokeWidth(),\n strokeColor: lc.getColor('primary'),\n fillColor: lc.getColor('secondary')\n });\n }\n \n continue(x, y, lc) {\n this.currentShape.width = x - this.currentShape.x;\n this.currentShape.height = y - this.currentShape.y;\n return lc.drawShapeInProgress(this.currentShape);\n }\n \n end(x, y, lc) {\n return lc.saveShape(this.currentShape);\n }\n didBecomeActive() {\n\n }\n unsubscribe() {\n \n }\n}\n\nJEllipse.prototype.name = \"JEllipse\";\nJEllipse.prototype.iconName = \"ellipse\";\nJEllipse.prototype.eventTimeThreshold = 10;\n\n","\nexport default class JArrow extends window.LC.toolsBase.ToolWithStroke {\n begin(x, y, lc) {\n return this.currentShape = window.LC.shapes.createShape('Line', {\n x1: x,\n y1: y,\n x2: x,\n y2: y,\n strokeWidth: lc.getStrokeWidth(),\n dash: (function() {\n switch (false) {\n case !lc.isDashed():\n return [lc.getStrokeWidth() * 2, lc.getStrokeWidth() * 4];\n default:\n return null;\n }\n }).call(this),\n endCapShapes: [null, 'arrow'],\n color: lc.getColor('primary')\n });\n }\n\n continue(x, y, lc) {\n this.currentShape.x2 = x;\n this.currentShape.y2 = y;\n return lc.drawShapeInProgress(this.currentShape);\n }\n\n end(x, y, lc) {\n lc.saveShape(this.currentShape);\n this.currentShape = undefined;\n }\n\n didBecomeActive() {\n\n }\n unsubscribe() {\n \n }\n}\n\nJArrow.prototype.name = \"JArrow\";\nJArrow.prototype.iconName = \"arrow\";\nJArrow.prototype.eventTimeThreshold = 10;\n\n","\nexport default class JLine extends window.LC.toolsBase.ToolWithStroke {\n begin(x, y, lc) {\n return this.currentShape = window.LC.shapes.createShape('Line', {\n x1: x,\n y1: y,\n x2: x,\n y2: y,\n strokeWidth: lc.getStrokeWidth(),\n dash: (function() {\n switch (false) {\n case !lc.isDashed():\n return [lc.getStrokeWidth() * 2, lc.getStrokeWidth() * 4];\n default:\n return null;\n }\n }).call(this),\n endCapShapes: this.hasEndArrow ? [null, 'arrow'] : null,\n color: lc.getColor('primary')\n });\n }\n\n continue(x, y, lc) {\n this.currentShape.x2 = x;\n this.currentShape.y2 = y;\n return lc.drawShapeInProgress(this.currentShape);\n }\n\n end(x, y, lc) {\n lc.saveShape(this.currentShape);\n this.currentShape = undefined;\n }\n\n didBecomeActive() {\n\n }\n unsubscribe() {\n \n }\n}\n\nJLine.prototype.name = \"JLine\";\nJLine.prototype.iconName = \"line\";\nJLine.prototype.eventTimeThreshold = 10;\n\n","/*\n * decaffeinate suggestions:\n * DS001: Remove Babel/TypeScript constructor workaround\n * DS102: Remove unnecessary code created because of implicit returns\n * DS206: Consider reworking classes to avoid initClass\n * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md\n */\nlet Text;\n\nconst getIsPointInBox = function(point, box) {\n if (point.x < box.x) { return false; }\n if (point.y < box.y) { return false; }\n if (point.x > (box.x + box.width)) { return false; }\n if (point.y > (box.y + box.height)) { return false; }\n return true;\n};\n\n\nexport default (Text = (function() {\n Text = class Text extends window.LC.toolsBase.Tool { \n static initClass() {\n \n this.prototype.name = 'Text';\n this.prototype.iconName = 'text';\n \n this.prototype.optionsStyle = 'font';\n }\n\n constructor(props) {\n super(props);\n this.text = '';\n this.font = 'bold 18px sans-serif';\n this.currentShape = null;\n this.currentShapeState = null;\n this.initialShapeBoundingRect = null;\n this.dragAction = null;\n this.didDrag = false;\n }\n\n didBecomeActive(lc) {\n const unsubscribeFuncs = [];\n this.unsubscribe = () => {\n return unsubscribeFuncs.map((func) =>\n func());\n };\n\n const switchAway = () => {\n this._ensureNotEditing(lc);\n this._clearCurrentShape(lc);\n return lc.repaintLayer('main');\n };\n\n const updateInputEl = () => this._updateInputEl(lc);\n\n unsubscribeFuncs.push(lc.on('drawingChange', switchAway));\n unsubscribeFuncs.push(lc.on('zoom', updateInputEl));\n unsubscribeFuncs.push(lc.on('imageSizeChange', updateInputEl));\n unsubscribeFuncs.push(lc.on('snapshotLoad', () => {\n this._clearCurrentShape(lc);\n return lc.repaintLayer('main');\n })\n );\n\n unsubscribeFuncs.push(lc.on('primaryColorChange', newColor => {\n if (!this.currentShape) { return; }\n this.currentShape.color = newColor;\n this._updateInputEl(lc);\n return lc.repaintLayer('main');\n })\n );\n\n return unsubscribeFuncs.push(lc.on('setFont', font => {\n if (!this.currentShape) { return; }\n this.font = font;\n this.currentShape.setFont(font);\n this._setShapesInProgress(lc);\n this._updateInputEl(lc);\n return lc.repaintLayer('main');\n })\n );\n }\n\n willBecomeInactive(lc) {\n if (this.currentShape) {\n this._ensureNotEditing(lc);\n this.commit(lc);\n }\n return this.unsubscribe();\n }\n\n setText(text) {\n return this.text = text;\n }\n\n _ensureNotEditing(lc) {\n if (this.currentShapeState === 'editing') {\n return this._exitEditingState(lc);\n }\n }\n\n _clearCurrentShape(lc) {\n this.currentShape = null;\n this.initialShapeBoundingRect = null;\n this.currentShapeState = null;\n return lc.setShapesInProgress([]);\n }\n\n commit(lc) {\n if (this.currentShape.text) { lc.saveShape(this.currentShape); }\n this._clearCurrentShape(lc);\n return lc.repaintLayer('main');\n }\n\n _getSelectionShape(ctx, backgroundColor=null) {\n return window.LC.shapes.createShape('SelectionBox', {shape: this.currentShape, ctx, backgroundColor});\n }\n\n _setShapesInProgress(lc) {\n switch (this.currentShapeState) {\n case 'selected':\n return lc.setShapesInProgress([this._getSelectionShape(lc.ctx), this.currentShape]);\n case 'editing':\n return lc.setShapesInProgress([this._getSelectionShape(lc.ctx, '#fff')]);\n default:\n return lc.setShapesInProgress([this.currentShape]);\n }\n }\n\n begin(x, y, lc) {\n this.dragAction = 'none';\n this.didDrag = false;\n\n if ((this.currentShapeState === 'selected') || (this.currentShapeState === 'editing')) {\n const br = this.currentShape.getBoundingRect(lc.ctx);\n const selectionShape = this._getSelectionShape(lc.ctx);\n const selectionBox = selectionShape.getBoundingRect();\n const point = {x, y};\n if (getIsPointInBox(point, br)) {\n this.dragAction = 'move';\n }\n if (getIsPointInBox(point, selectionShape.getBottomRightHandleRect())) {\n this.dragAction = 'resizeBottomRight';\n }\n if (getIsPointInBox(point, selectionShape.getTopLeftHandleRect())) {\n this.dragAction = 'resizeTopLeft';\n }\n if (getIsPointInBox(point, selectionShape.getBottomLeftHandleRect())) {\n this.dragAction = 'resizeBottomLeft';\n }\n if (getIsPointInBox(point, selectionShape.getTopRightHandleRect())) {\n this.dragAction = 'resizeTopRight';\n }\n\n if ((this.dragAction === 'none') && (this.currentShapeState === 'editing')) {\n this.dragAction = 'stop-editing';\n this._exitEditingState(lc);\n this.commit(lc);\n }\n } else {\n this.color = lc.getColor('primary');\n this.currentShape = window.LC.shapes.createShape('Text', {x, y, text: this.text, color: this.color, font: this.font, v: 1});\n this.dragAction = 'place';\n this.currentShapeState = 'selected';\n }\n\n if (this.dragAction === 'none') {\n this.commit(lc);\n return;\n }\n\n this.initialShapeBoundingRect = this.currentShape.getBoundingRect(lc.ctx);\n this.dragOffset = {\n x: x - this.initialShapeBoundingRect.x,\n y: y - this.initialShapeBoundingRect.y\n };\n\n this._setShapesInProgress(lc);\n return lc.repaintLayer('main');\n }\n\n continue(x, y, lc) {\n if (this.dragAction === 'none') {\n return;\n }\n\n const br = this.initialShapeBoundingRect;\n const brRight = br.x + br.width;\n const brBottom = br.y + br.height;\n switch (this.dragAction) {\n case 'place':\n this.currentShape.x = x;\n this.currentShape.y = y;\n this.didDrag = true;\n break;\n case 'move':\n this.currentShape.x = x - this.dragOffset.x;\n this.currentShape.y = y - this.dragOffset.y;\n this.didDrag = true;\n break;\n case 'resizeBottomRight':\n this.currentShape.setSize(\n x - (this.dragOffset.x - this.initialShapeBoundingRect.width) - br.x,\n y - (this.dragOffset.y - this.initialShapeBoundingRect.height) - br.y);\n break;\n case 'resizeTopLeft':\n this.currentShape.setSize(\n (brRight - x) + this.dragOffset.x,\n (brBottom - y) + this.dragOffset.y);\n this.currentShape.setPosition(x - this.dragOffset.x, y - this.dragOffset.y);\n break;\n case 'resizeBottomLeft':\n this.currentShape.setSize(\n (brRight - x) + this.dragOffset.x,\n y - (this.dragOffset.y - this.initialShapeBoundingRect.height) - br.y);\n this.currentShape.setPosition(x - this.dragOffset.x, this.currentShape.y);\n break;\n case 'resizeTopRight':\n this.currentShape.setSize(\n x - (this.dragOffset.x - this.initialShapeBoundingRect.width) - br.x,\n (brBottom - y) + this.dragOffset.y);\n this.currentShape.setPosition(this.currentShape.x, y - this.dragOffset.y);\n break;\n }\n\n this._setShapesInProgress(lc);\n lc.repaintLayer('main');\n\n return this._updateInputEl(lc);\n }\n\n end(x, y, lc) {\n if (!this.currentShape) { return; } // we may have committed at start time\n\n // use auto height once user lets go of selection corner\n this.currentShape.setSize(this.currentShape.forcedWidth, 0);\n\n if (this.currentShapeState === 'selected') {\n if ((this.dragAction === 'place') || ((this.dragAction === 'move') && !this.didDrag)) {\n this._enterEditingState(lc);\n }\n }\n\n this._setShapesInProgress(lc);\n lc.repaintLayer('main');\n return this._updateInputEl(lc);\n }\n\n _enterEditingState(lc) {\n this.currentShapeState = 'editing';\n\n if (this.inputEl) { throw \"State error\"; }\n\n this.inputEl = document.createElement('textarea');\n this.inputEl.className = 'text-tool-input';\n this.inputEl.style.position = 'absolute';\n this.inputEl.style.transformOrigin = '0px 0px';\n this.inputEl.style.backgroundColor = 'transparent';\n this.inputEl.style.border = 'none';\n this.inputEl.style.outline = 'none';\n this.inputEl.style.margin = '0';\n this.inputEl.style.padding = '4px';\n this.inputEl.style.zIndex = '1000';\n this.inputEl.style.overflow = 'hidden';\n this.inputEl.style.resize = 'none';\n\n this.inputEl.value = this.currentShape.text;\n\n this.inputEl.addEventListener('mousedown', e => e.stopPropagation());\n this.inputEl.addEventListener('touchstart', e => e.stopPropagation());\n\n const onChange = e => {\n this.currentShape.setText(e.target.value);\n this.currentShape.enforceMaxBoundingRect(lc);\n this._setShapesInProgress(lc);\n lc.repaintLayer('main');\n this._updateInputEl(lc);\n return e.stopPropagation();\n };\n\n this.inputEl.addEventListener('keydown', () => this._updateInputEl(lc, true));\n this.inputEl.addEventListener('keyup', onChange);\n this.inputEl.addEventListener('change', onChange);\n\n this._updateInputEl(lc);\n\n lc.containerEl.appendChild(this.inputEl);\n this.inputEl.focus();\n\n return this._setShapesInProgress(lc);\n }\n\n _exitEditingState(lc) {\n this.currentShapeState = 'selected';\n lc.containerEl.removeChild(this.inputEl);\n this.inputEl = null;\n\n this._setShapesInProgress(lc);\n return lc.repaintLayer('main');\n }\n\n _updateInputEl(lc, withMargin=false) {\n if (!this.inputEl) { return; }\n const br = this.currentShape.getBoundingRect(lc.ctx, true);\n this.inputEl.style.font = this.currentShape.font;\n this.inputEl.style.color = this.currentShape.color;\n this.inputEl.style.left =\n `${((lc.position.x / lc.backingScale) + (br.x * lc.scale)) - 4}px`;\n this.inputEl.style.top =\n `${((lc.position.y / lc.backingScale) + (br.y * lc.scale)) - 4}px`;\n\n if (withMargin && !this.currentShape.forcedWidth) {\n this.inputEl.style.width =\n `${br.width + 10 + this.currentShape.renderer.emDashWidth}px`;\n } else {\n this.inputEl.style.width = `${br.width + 12}px`;\n }\n\n if (withMargin) {\n this.inputEl.style.height =\n `${br.height + 10 + this.currentShape.renderer.metrics.leading}px`;\n } else {\n this.inputEl.style.height = `${br.height + 10}px`;\n }\n\n const transformString = `scale(${lc.scale})`;\n this.inputEl.style.transform = transformString;\n this.inputEl.style.webkitTransform= transformString;\n this.inputEl.style.MozTransform= transformString;\n this.inputEl.style.msTransform= transformString;\n return this.inputEl.style.OTransform= transformString;\n }\n };\n Text.initClass();\n return Text;\n})());\n","import React from 'react';\nimport loadImage from 'blueimp-load-image';\nimport './literally_canvas'\nimport CanvasContainer from './CanvasContainer';\nimport './App.css';\nimport PrimaryToolBar from './PrimaryToolBar';\nimport SecondaryToolBar from './SecondaryToolBar';\nimport JPencil from './CanvasTools/Pencil';\nimport JEraser from './CanvasTools/Eraser';\nimport initializeCanvasRenderers from './initializeCanvasRenderers';\nimport JRectangle from './CanvasTools/Rectangle';\nimport JEllipse from './CanvasTools/Ellipse';\nimport JArrow from './CanvasTools/Arrow';\nimport JLine from './CanvasTools/Line';\nimport Text from './CanvasTools/Text';\n\nclass App extends React.Component {\n state = {\n selected: false,\n penColor: '#000',\n fillColor: 'transparent',\n brushSize: 5,\n selectedShape: 'Pencil',\n hideUpload: false,\n newUpload: false,\n formData: {},\n valid: false\n };\n\n availableShapes = [\n { name: 'Pencil', fn: JPencil },\n { name: 'Eraser', fn: JEraser },\n { name: 'Ellipse', fn: JEllipse },\n { name: 'Rectangle', fn: JRectangle },\n { name: 'Arrow', fn: JArrow },\n { name: 'Line', fn: JLine },\n { name: 'Text', fn: Text },\n ];\n\n componentDidMount() {\n this.LC = new window.LC.LiterallyCanvas(\n this.canvasFrameDOM,\n {\n ...window.LC.LiterallyCanvas.defaultOptions,\n tools: this.availableShapes.map(a => a.fn),\n unsubscribe: () => {}\n }\n );\n window.ourLC = this.LC;\n\n // Inject dash logic.\n this.LC.isDashed = () => {\n return this.state.isDashed;\n }\n this.LC.getStrokeWidth = () => this.state.brushSize;\n initializeCanvasRenderers();\n this.LC.setColor('secondary', 'transparent');\n this.subscribeToWidget();\n window.addEventListener('resize', this.onDocumentResize);\n }\n\n backgroundSizes = {\n width: 300,\n height: 300\n };\n\n buttonsAndMargins = 151;\n\n onDocumentResize = () => {\n // TODO: // do it.\n const width = window.getComputedStyle(document.body).width;\n const widthNumber = parseInt(width.replace('px', ''));\n const minHeight = 300;\n const minWidth = 300;\n const ratio = this.backgroundSizes.width / this.backgroundSizes.height;\n\n }\n\n setInitialSizes = () => {\n const { width, height } = window.document.body.getBoundingClientRect();\n const expectedHeight = height - this.buttonsAndMargins;\n this.canvasContainerDOM.style.height = `${expectedHeight }px`;\n this.canvasContainerDOM.style.width = `${width}px`;\n this.canvasFrameDOM.style.height = `${expectedHeight}px`;\n this.canvasFrameDOM.style.width = `${width}px`;\n\n this.LC.setImageSize(width, expectedHeight);\n this.LC.repaintLayer('background');\n this.LC.respondToSizeChange();\n }\n\n addListenerMulti = (element, eventNames, listener) => {\n var events = eventNames.split(' ');\n for (var i = 0, iLen = events.length; i < iLen; i++) {\n element.addEventListener(events[i], listener, false);\n }\n }\n\n subscribeToWidget = () => {\n const JFCustomWidget = window.JFCustomWidget;\n JFCustomWidget.subscribe('ready', (formData) => {\n this.setState({ formData });\n const { onlyBlankCanvas, uploadImage } = JFCustomWidget.getWidgetSettings();\n let imageSrc = '';\n this.setInitialSizes();\n const exportScale = this.canvasScale >= 1 ? this.canvasScale : 1 / this.canvasScale;\n\n // on canvas change send data to JotForm\n let canvasFrame = document.getElementById('canvas_frame');\n this.addListenerMulti(canvasFrame, 'mouseup touchend keyup', () => {\n setTimeout(() => {\n JFCustomWidget.sendData({\n valid: true,\n value: window.ourLC.getImage({ scale: exportScale }).toDataURL()\n });\n // update the state if not valid\n if (!this.state.valid) {\n JFCustomWidget.hideWidgetError();\n this.setState({\n valid: true\n });\n } \n }, 10);\n });\n\n // trigger mouseup on mouseleave #4888506\n canvasFrame.addEventListener('mouseleave', () => {\n const mouseUpEvent = document.createEvent('MouseEvent');\n mouseUpEvent.initMouseEvent('mouseup', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n canvasFrame.dispatchEvent(mouseUpEvent);\n });\n\n // set initial sizes again on cards if there is an issue with the load\n JFCustomWidget.subscribe('show', () => {\n if (parseInt(this.canvasContainerDOM.style.width) < 25) {\n this.setInitialSizes();\n }\n });\n\n // edit mode\n if (formData && formData.value) {\n JFCustomWidget.sendDisableOrEnableButtons({\n type: 'disableButtons'\n });\n imageSrc = window.JFCustomWidgetUtils.getFormDomain() + formData.value + '?' + new Date().getTime();\n\n if (onlyBlankCanvas == 'true') {\n this.setState({\n hideUpload: true\n });\n }\n // check enterprise\n if (formData.enterprise) {\n imageSrc = 'https://' + formData.enterprise + '/' + formData.value;\n }\n // check src for save and continue mode\n if(/^(?:data:image)/.test(formData.value)) {\n imageSrc = formData.value;\n }\n this.setLCBackgroundFromURL(imageSrc);\n } else {\n if (onlyBlankCanvas == 'true') {\n this.setState({\n hideUpload: true\n });\n } else if (uploadImage && uploadImage.base) {\n JFCustomWidget.sendDisableOrEnableButtons({\n type: 'disableButtons'\n });\n imageSrc = `https://${uploadImage.url}/uploads/${uploadImage.owner}/form_files/${uploadImage.base}`;\n if (uploadImage.url === 'www.jotform.com') {\n imageSrc = `https://files.jotform.com/jufs/${uploadImage.owner}/form_files/${uploadImage.base}`;\n }\n if(window.location.href.indexOf('offline_forms=true') !== -1) {\n try {\n const src = window.location.href; // Offline file path\n const arr = src.split('/'); // For remove last path item like .../index.html\n const split =`/${arr[arr.length-1]}`;\n imageSrc = `${src.replace(split, '')}/${uploadImage.url === 'www.jotform.com' ? 'jufs' : 'uploads'}/${uploadImage.owner}/form_files/${uploadImage.base}`;\n }catch (e){\n console.log(\"Offline Path Error\")\n }\n }\n this.setLCBackgroundFromURL(imageSrc);\n }\n }\n\n // resize frame\n JFCustomWidget.requestFrameResize({\n height: document.body.offsetHeight + 10\n });\n\n JFCustomWidget.subscribe('submit', () => {\n var valid = this.state.valid;\n if (formData && formData.value) {\n valid = true;\n }\n\n this.LC.tools.forEach(tool => {\n if(tool?.currentShapeState === 'editing'){\n //before submit commit waiting changes (for Text)\n tool.commit(this.LC);\n }\n });\n \n // send value to JotForm\n JFCustomWidget.sendSubmit({\n valid: valid,\n value: valid ? this.LC.getImage({ scale: exportScale }).toDataURL() : ''\n });\n });\n });\n }\n\n showPenColorPicker = () => {\n this.setState({ selected: 'color-picker', colorType: 'primary' });\n }\n\n showfillColorPicker = () => {\n this.setState({ selected: 'color-picker', colorType: 'secondary' });\n }\n\n showBrushPicker = () => {\n this.setState({ selected: 'brush-picker' });\n }\n\n showShapePicker = () => {\n this.setState({ selected: 'shape-picker' });\n }\n\n get canvasContainerDOM() {\n return document.getElementById('canvas_container');\n }\n\n get canvasFrameDOM () {\n return document.getElementById('canvas_frame');\n }\n\n get documentWidth() {\n const width = window.getComputedStyle(document.body).width;\n const widthNumber = parseInt(width.replace('px', ''));\n return widthNumber;\n }\n\n canvasScale = 1;\n\n setLCBackgroundFromImage = (img) => {\n // watermark\n // this.LC.setWatermarkImage(img);\n // or bg\n // img.width = expectedWidth;\n const optWidth = (this.state.formData.viewWidth && this.state.formData.width > this.state.formData.viewWidth) ? this.state.formData.viewWidth : this.state.formData.width;\n const expectedWidth = optWidth > img.width ? img.width > 255 ? img.width : 255 : optWidth;\n const canvasScale = 1 / (img.width / expectedWidth);\n const expectedHeight = img.height * canvasScale;\n this.canvasScale = canvasScale;\n // const expectedHeight = expectedWidth === img.width ? img.height : (this.documentWidth * img.height) / img.width;\n\n this.canvasContainerDOM.style.height = `${expectedHeight}px`;\n this.canvasContainerDOM.style.width = `${expectedWidth}px`;\n this.canvasFrameDOM.style.height = expectedHeight - 2 + 'px';\n this.canvasFrameDOM.style.width = expectedWidth - 2 + 'px';\n window.JFCustomWidget.requestFrameResize({ width: expectedWidth, height: expectedHeight + this.buttonsAndMargins + 25 });\n const backgroundShape = window.LC.shapes.createShape(\n 'Image', { x: 0, y: 0, image: img, scale: canvasScale });\n this.LC.setImageSize(expectedWidth, expectedHeight);\n this.LC.backgroundShapes = [backgroundShape];\n this.LC.repaintLayer('background');\n this.LC.respondToSizeChange();\n window.JFCustomWidget.sendDisableOrEnableButtons({\n type: 'enableButtons'\n });\n }\n\n\n setLCBackgroundFromURL = (imgSrc, addCors = true) => {\n const img = document.createElement('img');\n if (addCors) {\n img.crossOrigin = 'crossorigin';\n } else {\n img.crossOrigin = 'use-credentials';\n }\n img.addEventListener('load', () => {\n this.setLCBackgroundFromImage(img);\n });\n img.addEventListener('error', () => {\n if (addCors) { // Second try for enterprise servers\n this.setLCBackgroundFromURL(imgSrc, false);\n } else {\n window.JFCustomWidget.sendDisableOrEnableButtons({\n type: 'enableButtons'\n });\n }\n });\n img.src = imgSrc;\n }\n\n handlePhoto = (event) => {\n const hasFile = event.target.files.length > 0;\n if (hasFile) {\n const firstFile = event.target.files[0];\n const exportScale = this.canvasScale >= 1 ? this.canvasScale : 1 / this.canvasScale;\n if (!firstFile.type.indexOf('image') === -1) {\n alert('Only images');\n return;\n }\n // set bg\n const image = loadImage(firstFile, (img, details) => {\n this.setLCBackgroundFromImage(img);\n }, {\n orientation: false,\n canvas: false\n });\n this.setState({\n newUpload: true,\n valid: true\n });\n window.JFCustomWidget.sendData({\n valid: true,\n value: window.ourLC.getImage({ scale: exportScale }).toDataURL()\n });\n window.JFCustomWidget.hideWidgetError();\n }\n }\n\n handleClear = () => {\n this.LC.clear();\n // also reset widget data if no newUpload\n if (!this.state.newUpload) {\n window.JFCustomWidget.sendData({\n value: ''\n });\n this.setState({\n valid: false\n }); \n }\n }\n\n handleUndo = () => {\n this.LC.undo();\n }\n\n handleRedo = () => {\n this.LC.redo();\n }\n\n handleSecondaryToolbarSelect = (opts) => {\n const { type, value } = opts;\n if (type === 'set-color') {\n const key = this.state.colorType === 'primary' ? 'penColor' : 'fillColor'\n this.setState({\n [key]: value\n });\n this.LC.setColor(this.state.colorType, value);\n } else if (type === 'set-brush') {\n this.setState({\n isDashed: opts.isDashed,\n brushSize: value\n });\n } else if (type === 'set-shape') {\n this.setState({\n selectedShape: value\n });\n const toolIndex = this.availableShapes.findIndex(t => t.name === value);\n this.LC.setTool(new this.LC.opts.tools[toolIndex](this.LC));\n }\n this.setState({ selected: null });\n }\n\n handlePenSelection = () => {\n this.handleSecondaryToolbarSelect({ type: 'set-shape', value: 'Pencil' });\n }\n\n handleEraseSelection = () => {\n this.handleSecondaryToolbarSelect({ type: 'set-shape', value: 'Eraser' });\n }\n\n handleTextSelection = () => {\n this.handleSecondaryToolbarSelect({ type: 'set-shape', value: 'Text' });\n }\n\n render() {\n return (\n
\n
\n \n \n
\n \n
\n \n
\n
\n )\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAkCAYAAADy19hsAAAAAXNSR0IArs4c6QAAAO5JREFUWAnt1iELwlAQwPF3563IGNhtwqLN4AfZR5B9AuMUV3SgWdTPYDctm40rgm1NMSjIdr7ZJhiFG9za2yu/9+fBO2Ma9kGS7LrPR3GW7gaEaDIJF/R6tcCYgqSDrQ8rI/m+m2fZbSgd7Dh4kW5UnxbQAlpACwgsALPZJrBv81ygrUayxlU0DdeEBr2Si15tV+ICoVOxPgOFRN8vU+PAxMAnYLP8dSIp/wHwKMWiDi2gBbSAFmhQAYjj7YCZA+lmRDxE0SglYOgzl2PpYGu8WmPauOFHwf++WlpYC38VINej/f3O4qf5dpvzyv4G/2Y1YKiGryMAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAkCAYAAAD7PHgWAAAAAXNSR0IArs4c6QAABLVJREFUWAnNWE9sFFUYf9/b/qEpJitpY6MY0WhBE4gnoxezcDBq6MHGGhO8LLRuD1o1gRIp+2c6dImNKZGLbCkSDeEAaoqo8YSNXrBRUrh5ISFp0nJqkxZot7vz/H2z+zbTZXZ2Z7ZaJ+m+975/7zff+/68KYmAj2FkUkKpZE3qREYyGUvVJFsmFCpb17T0Ba5gMbJ3bxdNTf04VdMGDiHfAAOA09sFAukLYB3gAoOsGeAGgAsEkrQWAPSQEu8pofaBtlXT/+NxmQRdUyQuIKku894hpZQM0eMXhFDDWO/EXxMzNunhvRlDz75IV+e1X69OhhrkE73w2rFNAuS17e7ffr8xKy1l9XpJbSpPiV4pBHVuKgiPzZUSOwFQhT1kqrKI6I4kGiRJe9ratz3SvIXCJBtfJCnizKtqwFNAhRs8+VWYyLjR8KNPJgYG3lwtE72J9c1MJjM2Py/SQomPyvg1LwMDJCmPJBLvf+61UywWuw/+xyhhy+jbQ16ylXiBABKJK9XA8YamefZ5y7KOoth2q0oIqtCDAZSNR73scm01jcxnyrI+gedCQcHxHgEA0o14/NDflQAi7hpNY/wbgHoX4IpiNCNJfGsJOU1kzUspW+HZZ4Ql3hAk3sILtVay5xsgjuvPSsbGxi613J1b+B6F//WCDM3KkPgwHo9NuuhcB+3iyMjZx/JrVho6B11k/HtQES24GWLa0tLCCMqWDQ4l5q8tLU37Bwej81oeMRmB5yK81hfYoaG+u1geQkhMw99fwpul+wHLoQ76fdQONw14Yg+OtFhOaLYcHOvY4PgW7nITjydjGUEqUW7bN0C83gvlRnidy1mHMdj2+FidnnOTd6MhFHACNOPk+QaII9h94sTES04jp0//3ExCvV2g0UyFmHOquM4RFrhaCcPJ9A2Qla1c3nQaWVycfRkJ28I0zlYnz+98+/amXwD0ntbzncWsiIx7zTDOpJPJ/uI1TT2nDXIp4bkzITQP4RHRhce+oWtGceTEiUajK8NG5hZIrzA5EEDbnhKfDqcyrc0tDcezK/l2gLbJXOd4UkoIm1r40eDslUuigJ4q8MScPeIn0BFrZYAaWHmQu42xS9O4COt5HWPpkwMepMX6rlyqDfHXpsHYHUKI68U6l9J0Hp0fXslU/7p655RDuXmaDwSxuISrnKjYttYp1brg9lXHc/LkxLN4YR3T00g6OleHvYdV0Vu5fT3MqI2Szeb7S5JEE/J4ou8cQF4sEeuccOPn3hrETDo93ol6+kFBl+tp3yUcMVmJVOwADvwdAP0BzOUgxp06SJqD6K0xJ63a/NSp8+G1rLqC421mWXwLH2FslQO1mkUXPncYK5+b4qIN44p7K7cve+4ir0nsOQaHZN3FNMh/l0jG7M60oQDZuGme6bbygv8rUCxhuAuifXGH4CLMMvrhhOCY42PVngO4q/jO6dHfORsOkDc3zfH9ylJfIR7bNRhszO3rFsoHF+GtXEoc2VoQI7rc0SEO4FtmraSnJxs9jo6e71i5v/oFylk3bHt2LICfw7keQ1J8jfm6hvOveND5sgx09cFaFN58FTvvwP5PIcqy8B5AiT8g+xO8Nun0mlP/fz//B2mVzqFyR5mxAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAiCAYAAAAzrKu4AAAAAXNSR0IArs4c6QAAAvlJREFUWAm12E1oE0EUB/B5m178oBisqGj9ACniUZS2hwpNi1SIBRFyFAQhaj1oLxa0KWk86MEiCJIUL4IKCqJoTyLGNlaLSu+CaL0ofpSCFKzaZvy/xI3ZdLM7sx8Ly85m37z97ezszG5IhLhk0rlkUYrzZIjLqVTyis6pIjrBOrHDw7lTUsprqNMopOjp6owv5J+NTarmCAVWQhXlVUYQ0QdsolKIbh2coXoFqnEWlKDbHftaWkjQda6P23oxk86eVckVaIvVonbuih6Jx+NLT/OPxibGpzcBtFu15UhFrxJjh0okEktmXfQ3yqRHR6WQx/g3g8TA4NDxS+bx2m0gMDeUeVIdnG+YKkoX5wumi9LBeYZ5RaniPMH8olRw2rCgUG44LVjQqHo4MuiM8sgfFopxmLbk+o3iJIozvI+59bQSLEwUO/L5fMOXz/ImitsYScLIuN7KahSu7XvTuuj2vr7EPCcMYmFUYfztLUxViTJKnBgcSuYcW8yKYoZsmv02d39k5O6KMFGcuy6sGkVkTAoSLxG/iLmue/7H3EO/uHotZV6wLWwZSsg2dMh2VHoTBM4NxbhlfcwOhcm3+vVoCvX2YG3Ae9aT1Y3R3v7+xE9OprKooDiPBaaAMs/tCaeKssA0UJ5wOqgKzANKC6eLKsHKn1gyW9rhpw8dvaZPmYh6W8fb6gXFJzLwgZDiAga3j/hcaNVEcdU2rLZPq1cUJ43EYr2GkHI/ymvAew7gFpQtDwUHuiybcfwV1g1Yd/z5tdDac+DQg/fvvt6oHdFd8lQOlwC4neeKUl4o/0oTRKKD388rUeqF/7eVxKyUYm31NKOeBi3GwfhCLnR1HsSoLmLY3YoGK3htOYNoCnmakWelVxSbKgNnEDi09CJa6RPyNvtBWWC84wf3D/Uaadr9othi248sfY7oBU70m4MdFylXoV/uLcfQNP7hueMY73AwEqHHtjCuY8E5JAnp0ExdWBmXPSoFHUbZ9i0kFBSaXRjGvVByB5H0L3iDUykVsTc9AAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAgCAYAAABpRpp6AAAAAXNSR0IArs4c6QAAA8hJREFUWAnNmEtsDHEcx/+/mUFLVFcQFxqh0nUQDm5SKQdJE8LBihCUdLdJ6UE0RTuz3Ucf8bh4JJ1W0sTjoBLCweOinsHRsZHiIppwoURtZ+bv+9+atfbVGWt3zWH///9vfo/P//X7TZaxIj69vfrSSKi/MZ+QUj7Gbm0NQybOuB4J9R12a2vrFxVYBOWck8XZ2UhIb7Uh3LRFB7bhLM5PAlq1x07bkgELQECHw516l1NYoVdUYEUxeSoczvSJcGf/mVR5tnFRgbNBcGYdCYX08+J8Z9Ox5UUFnpyUZDtwWst5czisDwA6J9O0M0pzPI1gcHCw7P17czU3zbUWY8uRFyqRyzyMUSUjXsU5q87lghhdqVnl2e/z+cxMenkDDw0NySMjnzdwk+/A1q4nIi9WKftKZqJIlRFdX7yY7Q4EApNpr1IFTseRyMAyblpHcGl8sFnk1M6pHhG7VeOdj4X2xZJtXK9wJDJYbVmxdlSA3XCkJDv7130cj3tLqmZub2homLB9OwYeHh5WnjwZOcY4adjyGbaDQrcAfFA+Z/bW1ta930QsR8Dd3XqNMckuAXRdoQEz+6enZeVKfVvbwfGcKUQYR6N9tYB9UTpYQcHXT0wYbaKXEzgU6ttiGnQfsPOEcskeZI3a2pWdIn5WYGSBesbZDcyurGSgIjDRZa/Xs6uurs6IDzPBANZrmeYLvKvI9L5YMmSJi2rQH0BuRw2aetJWuKfnqscyrdt4XVJYrOwFwPqTYQVyGnAs9hVfTnzF1HxK9Et0JhgMHAJs2tfdH2lNZATLpIe4ZH/I3WNTDLHG8d0wjqBTLWNfEH02FqM2pz+iLsB2ZNNJgInC8PjRyCsorsqmnCwHyEdUu5ec6JXE+CjJbJSx8tGKioWfWlrqfyTr2v1o9GKVaRjv7HFqSxJTNa0pmipPHidK67PHr3fiRVZY1PbvuLJ3JEY35ZnK8+PHD7xJdpRvnySpVdP8p6fzkwA2OT+ariy2lt0H5DXPgspbzc2+r+k6+Uni55RYC2DPO/EUB0aB2ITtXWMbAPIHZ1K/ovCe9vbAB1tegNZC6mpSNf+AU9+/Vpj24TLEbTDjR9ieBk1tfOvUyd/oIY7JSDqgao2X3Ngruq7PGPvAtoitwQ1s68A5im+TGy8OdWVZJlw6oW3gou7p0BqvOTRNqEljY7QRR2AuZrtfDQZOFQo2EZFRTJJpR0ewyTWs8IEjwTdjZQ+73ZrfAM57kmTFUMG2qar/rnOrFE38kdGTf6FIcVrAoTSrXDlX+GNQwBn8765/Ak9fQ0omqpMTAAAAAElFTkSuQmCC\"","module.exports = \"data:image/png;base64,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\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAiCAYAAAA3WXuFAAAAAXNSR0IArs4c6QAAArhJREFUWAntWM1rU0EQ33nvtajxgxT1IuohYPUf0JPgB4go2FPixaM0gUD15Cl9aWwpQk/ejIqgaJWcvSmIH6eeBAV7tCoo0oJYW0ubfetvN9lQ2t330pfQiHEg7O7MzsxvZ2aT2RADlUrle8TYCUwdud5MEiD4nvJHchelX8wBaKT8mzGxRc47Rbv39O3I5zO/6hERXqeAaL/LywsKw6anSAOwjX8doNBUEdEMTvJeMPaJBOP1Ux1A5Z1HLbq2U4IfEKOnqNbPcg8JkYDOPkwPC8H2S56NjICI2BwMXB0eHpwEqGCt8vVS+Tl4p9fy9Ro6r/1idkCv9VipVNzp6R9pEQQ3wdur+XJcWupVF8yUsqpglPb93EMTGKmMiH2Ro5UE+2qSZTIZ7vuDT1yPpSGvmvasB0T0uFjMvjBtbhevUMi9Qgbum+wpQIgEDl0jxxGTeh53RO2o8Ifr0yOTXAFCgc7Vhd/6+/uemTa2m4fUvUS511NPi6lUz0/pQwFyPW+AHCdPDp2ReY5yjlvTRATCrcj6JIedg88r8H1W+1W3rFC4PAV1+WmKhEwx7m+r5PvZd7AhPw1aX9QNUWcmsQC1I2W248YCZDPWDn53AGolpd0RoVZq6X+EoqIXK0L4pm75p8MGLBYgm7F28LsDUCsp/TcihOZjV1i9oOK3hcnDZBuO0Pj47UNohk6FGUWrdHJs7O7RsD02WeT1HR29c0Tw4EbNgNiJbvkYHG61GdT8Wp8u3qBN/Y5WbjaZTFwbGrqk2lS9xzSqjtEk0Dw0h8mAiQt6Ld9AzVDtTw12XD2aoDA/v3gLw9so3Q2nLMqgTc45hb10G2qRgFw38QHhX2hoxJrQrOf1fmxGNbKGpJGJiQeJlZXqwdUGOecqea4bqJFzr76u8TnvUWvPEzyV2j6jXxWrbZjmfwBFX7nA7R6xQAAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAgCAYAAABpRpp6AAAAAXNSR0IArs4c6QAABBdJREFUWAnNWF1oVEcUnrm7m92ErPUXNVSxaDBabEH7oNAWAqEPLQVFsloK/lW8CXmopkglZO+GTQzahzwEbdjUuviLLvpg8QfrT+JP2zdBBbMafBAf1Jhk1URMNntn+s1tbnKT7K737u5Nc2GZuWe+c843Z86cO7MOksHDOaeSVBRsbz/floF6ViqSVe1IJOIIBlvDlJAdVnVzgbdEuK2tzRl9EDtOON+MKPNcELBqw2lWAZHNu3Xz4SmwXGdWxw6cKcLhcNgT7YidQUy/sYOEFZvvJRwKhQqePomf44SXWTFsFzZtDh88GCl8/oxcSkaWUjq1cnjfvtAHPd2xS4TwNcmihT3nSCa3W4bqNPFpajo0s79P/ROkVk0cNUroHQT6JeE0Rgh9hcn1SpRGGSV3SkqmR30+n2pE56I/gXBj4+E5Q/Ghq3D+STYOKCXvsEnvU0KvEskZUZQf7mZjT9cdQ3jv3tB8NUGuIbLLdECuWkygk1By1Ot1H9i1aytWI7NnhHBDw+EFTI2DLCnOzJRprTeI+gFnnqeppmZzj2mtYaBGuL7+t4+Yql6HbJFVA5niEfEelKiq2kDFaSs2aH19uBiRBVn+oRXFXGERsUjhNGdldfX2XjM2Jc7iLf8XWUEQxdzX35f4G2V0oSnCTpfrO5Ske2bAdmGwb5YODpC/kJrv3exaDou62/dGvYz5fmYXKXN2abfkIKv9fvlxKrz2aRb54/aQMnxu/0kFnBw5n81U/sf+/b97U/kbOUvs2SO/njV7xlcgfSMVeJLkywcHEifwLdBWf7zPEcJioKrK1z93HvkaJefKeOBkvoPstw3B1qQ3mqSzaG6+6H4Ve3oWiunOvwyrcQF578GmEUs4DRP1IjDe/9rsDkewEcsvKCjZvXtTlzFYSQkLgLhhRDt6T4FMqhvG80BdxXyjMWNfnKO7uogYX0wYWYyJLCGErUQZExu70IhN2af0WCAgbzKOpyQsQOIOd+vGo2M4D280Kg330xJOgtdE4hLb2fn6Y1XlnxPGyjGBLzEwJjUNukxyuEv8/q2duiztjaO0tDSBtPget+RBcfHUlbJph4+cou6L36/agUsl5ZyRDUiDNeM2m8RY/CfgKnSfaSOsg4QRkG4BaVmXIX9fKAF5nv6eizYYDK1A+gSxomtH7dEBV55rYU3NtpdClmopRvHogRxXlB2VOGU1jxnI8YuiyPeVOnmdw0m/gM/hjwf3JBKJct2VKcICrJGuk38E6V90Zbva2lr5dn5B/qdY/qOaD8bW675ME9YVEIGfYSiov9vVopy99QfkLWJVxcZsbDwyS/iyTFgoKXUVAdweakXfzmd0VclJNvRO+5shI8KCJPLtkJ1kjbZdbu9ORHmRUTbl+zgQFU15kskI/gs+gmh5hbYcfQAAAABJRU5ErkJggg==\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAoCAYAAAC4h3lxAAAAAXNSR0IArs4c6QAABTpJREFUWAnVWW9oW1UUv+e9pE2KxeGftVs/TNqBKG7gOsqoRFSEIY6hVPth4GAi1K5LygYub+mmV9Ym7xWsNJ0tRZ0yh2K1OtfKUIdWhCnTKfMPKG7KBsNlo+qcNmnz3rueG3qbmzRt0zZJ0/eh59zz7rvn9zvv3HPPS4Esw2tgYEA9ezZyt9N5wzlYDvi7ugbcV69errNt4kHAHsRcTxgZ3bCxssZRjAQofW1FNHr9HmDEw4B4rkT+2MgYKeFY2SRgBcjzjY2NVlEQCAT6VxEr5rEBPIjQE4v+sw6lkgCLfwRoEWwAGGPgeJWPl4SApr20lhDrXg4WI+uxzFhNAhwOsroYO6IbO//ic/NOgFKmTEz0rrcsE/MXEoCZbVZmBTTjJGAOoobFrbxs4kDg0AbbtDYznhKJDcduFA4XKzF9PtYN32axTn7egMVuZQQOEsZU4ShXEhSlW15LkQe50oOG9yMCbHeu1pPW+TUYbDkhjUleCHAHhtHaQwD6ZGeL1XEPhTGFUnZ63ghwsG73Oh86PLlY4InnAa65ytTX09fKKwFK7zdd7vLH0ekv6Y7nOwbCDlPa8m/6c3klwJ1RuuNvUBxbUP0z3Xm2YwBiE3AeyjQ/7wS4U11vOYfVo4EQiGcCMbcNhnR952+Z5hWEAHes694RTIPnMoGYy6aoLKV0yvPzcpDJDoTetje8yQJ2DLuFCmHLSgL8YBi+9TPNLcgb8Pt7tpmEjMwbPKJWGMwYfU4q5yelHCnGGEzEbj6IkoOQTn34DM8IXlFmfRtYgkddZeU7RkY+QP6Zr7ylEP8IiUQuH8F24rEU1wAvV1eXtly8GF9txu3T2CyvTLkvDRSAYMjwtUmmaaoUlWn3FmygtGc1foQcx3a5VizCSyFG6xkE1DVpu9Dm737UZPApkigV84TE+abicPaK8Uwy53uAd6KxqH0a830KPDq/js3d1pDRKsAn8HQYracwlZ7KCI7BYEdH86WM9yRjTgloWk+DbdlfIPgq4QP7lwuqo6QeK8mHwiZLw/AexTOiQ7ZxHdTUrjP9vhjnjIDfHw4wm72DG7ZMLI7RPeUqc9YFg80/TtkyKKHQrgOYMoPiFupfo+1LMZ5NLppAOBwu1fzdb+BmxSjiJ/jkhSCOVlWRByhtviJsM0neYbrcru34zJnEHJi9dMrrTDmUjdnqlPatjEbj7yP4+uQzgCzYAb2zdVpaJOdk1tra+qrMePxYdU1pfVNTU1Ztx4IJBAJ9d9lmfJgRtkbAwUiOYbf+RKjT956wzVfiTyoubABj2T63IAKY7w9j1N9CJ+XCEb7+S4qqbg0Gd30rbIWQ894DWGl2Y4ocl8FjzfjG5VZwsxYWPA9Q1m+gv7/f+fv58V5MmdS6DfBuRUXl9j17GqOFiHi6j6wIUPrKTbHo2CCWyPvkBfCobw/q3md5FZHthdTnJLB/f+/tZtwcRvBrk8BgHGv8k3gIvZm0LY02KwFNCz/IDyeEtkLAw80aURk80tHp+0rYllLOuImx0jRjpTmRAp6Q7xlx1RULeB64ad0o/+fBd2ciL9rM9sqJjXk+5HKr2yht4n180VwpKeT39+NvmONvY+SnfnvkSLEhe8FV5t1LKdhFg3wSyBQBTeutJswcws16ZxIkxEEhT+u673DSVlxagsC+fWGPbTF+/N8i4GHKjCL4hlDI97mwFaMETeu7jbD4T3IbjOB/djjJlvZ23/liBC1jUhRm3iGDx4T/hJHSTcsBPCeirKkuOYl5NIz6f3yz1tauesgwmq7JLItZ/x+crrodPc6MSgAAAABJRU5ErkJggg==\""],"sourceRoot":""}