h*v      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxy z { | } ~                                                                                                           1.13.3, Safe-Inferred'()* !"#+,-$%& '()* !"#+,-$%&  Safe-Inferred .brillo%Mix two colors with the given ratios./brilloAdd RGB components of a color component-wise, then normalise them to the highest resulting one. The alpha components are averaged.0brillo8Make a dimmer version of a color, scaling towards black.1brillo:Make a brighter version of a color, scaling towards white.2brilloLighten a color, adding white.3brilloDarken a color, adding black.4brilloSet the red value of a  .5brilloSet the green value of a  .6brilloSet the blue value of a  .7brilloSet the alpha value of a  .8brilloA greyness of a given order.!Range is 0 = black, to 1 = white.brillo?@ABCDEF ./0123456789:;<=>?@ABCDEF Safe-Inferred Gbrillo/Describes how Brillo should display its output.Hbrillo;Display in a window with the given name, size and position.IbrilloDisplay full screen.GHIGHI Safe-Inferred Mbrillo,Add two vectors, or add a vector to a point.Nbrillo8Subtract two vectors, or subtract a vector from a point.ObrilloNegate a vector.PbrilloMultiply a scalar by a vector.MNPOMNPOM6N6P7 Safe-Inferred QbrilloConvert degrees to radiansRbrilloConvert radians to degreesSbrillo3Normalize an angle to be between 0 and 2*pi radiansQRSQRS Safe-InferredTbrillo$A blank picture, with nothing in it.Ubrillo+A convex polygon filled with a solid color.VbrilloA line along an arbitrary path.WbrilloA circle with the given radius.XbrilloA circle with the given thickness and radius. If the thickness is 0 then this is equivalent to .YbrilloA circular arc drawn counter-clockwise between two angles (in degrees) at the given radius.ZbrilloA circular arc drawn counter-clockwise between two angles (in degrees), with the given radius and thickness. If the thickness is 0 then this is equivalent to  .[brillo%Some text to draw with a vector font.\brilloA bitmap image]brilloa subsection of a bitmap image first argument selects a sub section in the bitmap second argument determines the bitmap data^brillo A picture drawn with this color._brillo6A picture translated by the given x and y coordinates.`brillo 0 half of the x-y plane.jbrilloA path representing a rectangle in the y > 0 half of the x-y plane.kbrillo,A solid rectangle centered about the origin.lbrillo5A solid rectangle in the y > 0 half of the x-y plane.gbrillowidth of rectanglebrilloheight of rectangle,   TUVWXYZ[\]^_`abcdefghkjil,   TUVWXYZ[\]^_`abcdefghkjil Safe-Inferred6 mbrilloThe m represents the global transformation applied to the displayed picture. When the user pans, zooms, or rotates the display then this changes the m.obrilloGlobal translation.pbrilloGlobal rotation (in degrees).qbrillo-Global scaling (of both x and y coordinates).rbrillo"The initial state of the viewport.sbrillo:Translates, rotates, and scales an image according to the m.tbrillo5Takes a point using screen coordinates, and uses the m to convert it to Picture coordinates. This is the inverse of s for points.brilloConvert degrees to radiansbrilloMultiply a vector by a scalar.brilloRotate a vector by an angle (in radians). +ve angle is counter-clockwise.mnopqrstmnopqrst Safe-InferredGubrillo&Functions to asynchronously control a Brillo display.wbrillo0Indicate that we want the picture to be redrawn.xbrilloModify the current viewport, also indicating that it should be redrawn.uvwxuvwx  Safe-Inferred ybrilloThe magnitude of a vector.zbrillo5The angle of this vector, relative to the +ve x-axis.{brilloThe dot product of two vectors.|brilloThe determinant of two vectors.}brilloMultiply a vector by a scalar.~brilloRotate a vector by an angle (in radians). +ve angle is counter-clockwise.brillo9Compute the inner angle (in radians) between two vectors.brillo/Normalise a vector, so it has a magnitude of 1.brilloProduce a unit vector at a given angle relative to the +ve x-axis. The provided angle is in radians. yz{|}~ yz{|}~  Safe-Inferred brilloTest whether a point lies within a rectangular box that is oriented on the x-y plane. The points P1-P2 are opposing points of the box, but need not be in a particular order.  P2 +-------+ | | | + P0 | | | +-------+ P1     Safe-Inferred( brilloCheck if line segment (P1-P2) clears a box (P3-P4) by being well outside it.brillo(Given an infinite line which intersects P1 and P18, return the point on that line that is closest to P3brilloGiven an infinite line which intersects P1 and P2, let P4 be the point on the line that is closest to P3.Return an indication of where on the line P4 is relative to P1 and P2.  if P4 == P1 then 0 if P4 == P2 then 1 if P4 is halfway between P1 and P2 then 0.5  | P1 | P4 +---- P3 | P2 | brilloGiven four points specifying two lines, get the point where the two lines cross, if any. Note that the lines extend off to infinity, so the intersection point might not line between either of the two pairs of points.  \ / P1 P4 \ / + / \ P3 P2 / \ brilloGet the point where a segment P1-P2 crosses an infinite line P3-P4 , if any.brilloGet the point where a segment crosses a horizontal line, if any.  + P1 / -------+--------- / y0 P2 + brillo>Get the point where a segment crosses a vertical line, if any.  | | + P1 | / + / | P2 + | | x0 brilloGet the point where a segment P1-P2 crosses another segement P3-P4 , if any.brillo>Check if an arbitrary segment intersects a horizontal segment.  + P2 / (xa, y3) +---+----+ (xb, y3) / P1 + brillo9brilloHandles animation timing details. Call this function at the start of each frame.brilloHandles animation timing details. Call this function at the end of each frame.  Safe-Inferred>brillo&Get the size of the screen, in pixels.This will be the size of the rendered brillo image when fullscreen mode is enabled. Safe-Inferred?  Safe-Inferred?[  Safe-Inferred?brillo-Dump internal state of the OpenGL framebufferbrillo-Dump internal state of the fragment renderer.! Safe-Inferred@KbrilloPossible input events. Safe-InferredGKbrilloState for controlling the viewport. These are used by the viewport control component.brilloThe command list for the viewport controller. These can be safely overwridden at any time by deleting or adding entries to the list. Entries at the front of the list take precedence.brilloHow much to scale the world by for each step of the mouse wheel.brilloHow many degrees to rotate the world by for each pixel of x motion.brillo7Ratio to scale the world by for each pixel of y motion.brilloDuring viewport translation, where the mouse was clicked on the window to start the translate.brilloDuring viewport rotation, where the mouse was clicked on the window to starte the rotate.brilloDuring viewport scale, where the mouse was clicked on the window to start the scale.brilloThe current viewport.brillo-The commands suported by the view controller.brilloThe default commands. Left click pans, wheel zooms, right click rotates, "r" key resets.brilloCheck if the provided key combination is some brillo viewport command.brilloCheck if the provided key combination is some brillo viewport command.brilloThe initial view state.brillo-Initial view state, with user defined config.brilloApply an event to a .brilloLike , but returns  if no update was needed.brillo Zoom in a  by the scale step.brillo Zoom out a  by the scale step.brilloOffset a viewport.brilloApply a translation to the .brilloApply a rotation to the .brilloApply a scale to the ." Safe-InferredHbrilloSimulation statebrillo!The iteration number we're up to.brillo>How many simulation setps to take for each second of real timebrillo6How many seconds worth of simulation we've done so farbrilloInitial control state# Safe-InferredKbrilloThe graphics library calls back on this function when it's finished drawing and it's time to do some computation.brillothe simulation statebrillothe animation stateabrilloaction to get the m. We don't use an 0 directly because sometimes we hold a ref to a m% (in Game) and sometimes a ref to a  ViewState.brillothe current worldbrillofn to advance the worldbrillo;how much time to advance world by in single step mode$ Safe-InferredKbrilloCallback to handle keyboard and mouse button events for controlling the .% Safe-InferredL9brilloCallback to handle keyboard and mouse button events for controlling the viewport.& Safe-InferredLbrilloCallback to handle keyboard and mouse button events for controlling the viewport.' Safe-InferredMbrilloOpen a window and use the supplied callbacks to handle window events.brilloColor to use when clearing.brilloCallbacks to use.brilloGive the backend back to the caller before entering the main loop.( Safe-InferredObrilloInitial state of the backendbrillo Display mode.brilloBackground color.brilloNumber of simulation steps to take for each second of real time.brilloThe initial model.brillo-A function to convert the model to a picture.brilloA function to step the model one iteration. It is passed the current viewport and the amount of time for this simulation step (in seconds). Safe-InferredRbrilloRun a finite-time-step simulation in a window. You decide how the model is represented, how to convert the model to a picture, and how to advance the model for each unit of time. This function does the rest.>Once the window is open you can use the same commands as with display.brillo Display mode.brilloBackground color.brilloNumber of simulation steps to take for each second of real time.brilloThe initial model.brillo-A function to convert the model to a picture.brilloA function to step the model one iteration. It is passed the current viewport and the amount of time for this simulation step (in seconds).GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEFmnopqmnopq Safe-InferredTbrillo Display mode.brilloBackground color.brilloNumber of simulation steps to take for each second of real time.brilloThe initial model.brillo-A function to convert the model to a picture.brilloA function to step the model one iteration. It is passed the current viewport and the amount of time for this simulation step (in seconds).GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEFmnopqmnopq) Safe-InferredWIbrilloCallback for KeyMouse events.brilloCallback for Motion events.brillo"Callback for Handle reshape event.brilloInitial state of the backend.brilloDisplay config.brilloBackground color.brilloThe initial world.brillo*A function to produce the current picture.brillo"A function to handle input events.brilloEat the controllerbrilloref to world statebrillofn to handle input eventsbrilloref to world statebrillofn to handle input events  Safe-InferredYbrilloOpen a new window and interact with an infrequently updated picture. Similar to  displayIO), except that you manage your own events.brillo Display mode.brilloBackground color.brilloInitial world state.brillo*A function to produce the current picture.brillo"A function to handle input events.brillo(Callback to take the display controller.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEFuvwxuvwx* Safe-Inferred]brilloCallback for KeyMouse events.brilloCallback for Motion events.brillo"Callback for Handle reshape event. brilloInitial state of the backendbrillo Display mode.brilloBackground color.brilloNumber of simulation steps to take for each second of real time.brilloThe initial world.brillo-A function to convert the world to a picture.brillo"A function to handle input events.brilloA function to step the world one iteration. It is passed the period of time (in seconds) needing to be advanced.brillo(Whether to use the callback_exit or not.brilloref to world statebrillofn to handle input eventsbrilloref to world statebrillofn to handle input events Safe-Inferred`brilloPlay a game in a window. Like simulate', but you manage your own input events.brillo Display mode.brilloBackground color.brilloNumber of simulation steps to take for each second of real time.brilloThe initial world.brillo*A function to convert the world a picture.brillo"A function to handle input events.brilloA function to step the world one iteration. It is passed the period of time (in seconds) needing to be advanced.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEF Safe-InferredcbrilloPlay a game in a window, using IO actions to build the pictures.brillo Display mode.brilloBackground color.brilloNumber of simulation steps to take for each second of real time.brilloThe initial world.brillo)An action to convert the world a picture.brillo"A function to handle input events.brilloA function to step the world one iteration. It is passed the period of time (in seconds) needing to be advanced.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEF+ Safe-Inferredf[brilloInitial state of the backend.brilloDisplay config.brilloBackground color.brilloMake the picture to draw.brilloEat the controller Safe-Inferredgbrillo0Open a new window and display the given picture.brillo Display mode.brilloBackground color.brilloThe picture to draw.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEF Safe-Inferredobrillo>Open a new window and display an infrequently updated picture.>Once the window is open you can use the same commands as with display.This wrapper is intended for mostly static pictures that do not need to be updated more than once per second. For example, the picture could show network activity over the last minute, a daily stock price, or a weather forecast. If you want to show a real-time animation where the frames are redrawn more frequently then use the animate wrapper instead.The provided picture generating action will be invoked, and the display redrawn in two situation: 1) We receive a display event, like someone clicks on the window. 2) When w has been set, some indeterminate time between the last redraw, and one second from that.Note that calling w indicates that the picture should be redrawn, but does not cause this to happen immediately, due to limitations in the GLFW window manager. The display runs on a one second timer interrupt, and if there have been no display events we need to wait for the next timer interrupt before redrawing. Having the timer interrupt period at 1 second keeps the CPU usage due to the context switches at under 1%.Also note that the picture generating action is called for every display event, so if the user pans the display then it will be invoked at 10hz or more during the pan. If you are generating the picture by reading some on-disk files then you should track when the files were last updated and cache the picture between updates. Caching the picture avoids repeatedly reading and re-parsing your files during a pan. Consider storing your current picture in an IORef, passing an action that just reads this IORef, and forking a new thread that watches your files for updates.brillo Display mode.brilloBackground color.brillo&Action to produce the current picture.brillo(Callback to take the display controller.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEFuvwxuvwx, Safe-InferredqWbrilloInitial State of the backendbrillo/Whether to allow the image to be panned around.brillo Display mode.brilloBackground color.brilloFunction to produce the next frame of animation. It is passed the time in seconds since the program started.brilloEat the controller. Safe-Inferredrbrillo2Open a new window and display the given animation.>Once the window is open you can use the same commands as with display.brillo Display mode.brilloBackground color.brilloFunction to produce the next frame of animation. It is passed the time in seconds since the program started.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEF- Safe-InferredsC   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEF$%&'()* !"#+,- GHIGHI Safe-Inferredvbrillo2Open a new window and display the given animation.>Once the window is open you can use the same commands as with display.brilloLike 1 but don't allow the display to be panned around.brillo Display mode.brilloBackground color.brilloFunction to produce the next frame of animation. It is passed the time in seconds since the program started.brillo(Callback to take the display controller.brillo Display mode.brilloBackground color.brilloFunction to produce the next frame of animation. It is passed the time in seconds since the program started.brillo(Callback to take the display controller.GHI   [^`_a\TUVWXYZ]bcdefghkjil 2./013456789:;<=>?@ABCDEFuvwxuvwx./0./1./2.34.35.36.37.38.39.3:./;.3<.3=.3>.3?.3@.3A.3B.3;.3C.3D.3E.3F.3G.3H.3I.3J.3K.3L.3M.NO.NP.NQ.NQ.NR.NS.NT.NU.NV.NW.NW.NX.NY.NZ.N[.N\]^_`abcdefghijklmnopqrstuvwxyz{|}~                     !!!! v  !!""""""#$%&&'())))****+,$brillo-1.13.3-AbfslkyB58V74HTq1MpakTBrillo.Data.ColorBrillo.Data.BitmapBrillo.Data.PictureBrillo.Data.Point.ArithmeticBrillo.Data.DisplayBrillo.Geometry.AngleBrillo.Data.ViewPortBrillo.Data.ControllerBrillo.Data.VectorBrillo.Data.PointBrillo.Geometry.LineBrillo.Interface.IO.InteractBrillo.Interface.EnvironmentBrillo.Data.ViewStateBrillo.Interface.Pure.SimulateBrillo.Interface.IO.SimulateBrillo.Interface.Pure.GameBrillo.Interface.IO.GameBrillo.Interface.Pure.DisplayBrillo.Interface.IO.DisplayBrillo.Interface.Pure.AnimateBrillo.Interface.IO.AnimatebrilloBrillo.Internals.Color(Brillo.Internals.Interface.Animate.State(Brillo.Internals.Interface.Backend.Types'Brillo.Internals.Interface.Backend.GLFW"Brillo.Internals.Interface.Backend)Brillo.Internals.Interface.Animate.Timing#Brillo.Internals.Interface.Callback&Brillo.Internals.Interface.Common.Exit Brillo.Internals.Interface.Debug Brillo.Internals.Interface.Event)Brillo.Internals.Interface.Simulate.State(Brillo.Internals.Interface.Simulate.Idle-Brillo.Internals.Interface.ViewState.KeyMouse+Brillo.Internals.Interface.ViewState.Motion,Brillo.Internals.Interface.ViewState.Reshape!Brillo.Internals.Interface.Window#Brillo.Internals.Interface.Simulate#Brillo.Internals.Interface.InteractBrillo.Internals.Interface.Game"Brillo.Internals.Interface.Display"Brillo.Internals.Interface.AnimateBrillo.brillo-rendering-1.13.3-6wvMHusfTxMBtPSFhpnNHwBrillo.Internals.Data.Color makeColor makeColorI rgbaOfColorBrillo.Internals.Data.PicturebitmapDataOfBMPbitmapDataOfByteStringbitmapDataOfForeignPtr bitmapOfBMPbitmapOfByteStringbitmapOfForeignPtrloadBMPColorPathPictureArcBitmap BitmapSectionBlankCircleLinePicturesPolygonRotateScaleTextThickArc ThickCircle TranslatePointVector!Brillo.Internals.Rendering.Bitmap BitmapData bitmapSize BitmapFormat pixelFormatrowOrder PixelFormatPxABGRPxRGBA RectanglerectPosrectSizeRowOrder BottomToTop TopToBottom mixColors addColorsdimbrightlightdarkwithRed withGreenwithBlue withAlphagreyNblackwhiteredgreenblueyellowcyanmagentarosevioletazure aquamarine chartreuseorangeDisplayInWindow FullScreen $fEqDisplay $fReadDisplay $fShowDisplay+-negate*degToRadradToDegnormalizeAngleblankpolygonlinecircle thickCirclearcthickArctextbitmap bitmapSectioncolor translaterotatescalepictureslineLoop circleSolidarcSolid sectorWire rectanglePath rectangleWirerectangleUpperWirerectangleUpperPathrectangleSolidrectangleUpperSolidViewPortviewPortTranslateviewPortRotate viewPortScale viewPortInitapplyViewPortToPictureinvertViewPort ControllercontrollerSetRedrawcontrollerModifyViewPortmagVargVdotVdetVmulSVrotateVangleVV normalizeVunitVectorAtAngle pointInBox segClearsBoxclosestPointOnLineclosestPointOnLineParamintersectLineLineintersectSegLineintersectSegHorzLineintersectSegVertLineintersectSegSegintersectSegHorzSegintersectSegVertSeg Modifiersshiftctrlalt SpecialKey KeyUnknownKeySpaceKeyEscKeyF1KeyF2KeyF3KeyF4KeyF5KeyF6KeyF7KeyF8KeyF9KeyF10KeyF11KeyF12KeyF13KeyF14KeyF15KeyF16KeyF17KeyF18KeyF19KeyF20KeyF21KeyF22KeyF23KeyF24KeyF25KeyUpKeyDownKeyLeftKeyRightKeyTabKeyEnter KeyBackspace KeyInsert KeyNumLockKeyBegin KeyDelete KeyPageUp KeyPageDownKeyHomeKeyEnd KeyShiftL KeyShiftRKeyCtrlLKeyCtrlRKeyAltLKeyAltRKeyPad0KeyPad1KeyPad2KeyPad3KeyPad4KeyPad5KeyPad6KeyPad7KeyPad8KeyPad9 KeyPadDivideKeyPadMultiplyKeyPadSubtract KeyPadAdd KeyPadDecimal KeyPadEqual KeyPadEnterKeyStateDownUp MouseButton LeftButton MiddleButton RightButtonWheelUp WheelDownAdditionalButtonKeyChar getScreenSizeEventEventKey EventMotion EventResize ViewStateviewStateCommandsviewStateScaleStepviewStateRotateFactorviewStateScaleFactorviewStateTranslateMarkviewStateRotateMarkviewStateScaleMarkviewStateViewPort CommandConfigCommandCRestore CTranslateCRotateCScale CBumpZoomOut CBumpZoomIn CBumpLeft CBumpRightCBumpUp CBumpDownCBumpClockwiseCBumpCClockwisedefaultCommandConfig viewStateInitviewStateInitWithConfigupdateViewStateWithEventupdateViewStateWithEventMaybe $fShowCommand $fEqCommand $fOrdCommandsimulate simulateIO interactIOplayplayIOdisplay displayIOanimate animateIOanimateFixedIOnormalizeColorglColor4OfColorState stateAnimatestateAnimateCountstateAnimateStartstateAnimateTimestateDisplayTimestateDisplayTimeClampstateGateTimeStartstateGateTimeEndstateGateTimeElapsedstateDisplayTimeLast stateInitReshapeCallback IdleCallbackMotionCallbackKeyboardMouseCallbackDisplayCallbackBackendinitBackendStateinitializeBackend exitBackend openWindowdumpBackendStateinstallDisplayCallbackinstallWindowCloseCallbackinstallReshapeCallbackinstallKeyMouseCallbackinstallMotionCallbackinstallIdleCallback runMainLoop postRedisplaygetWindowDimensions elapsedTimesleepisIdleCallbackIdleCallbackKeyMouseMotionReshape GLFWState modifiers mousePosition mouseWheelPos dirtyScreenidle optWinHdl glfwStateInitwinHdlinitializeGLFWexitGLFWopenWindowGLFW dumpStateGLFWinstallDisplayCallbackGLFWinstallWindowCloseCallbackGLFWinstallReshapeCallbackGLFWinstallKeyMouseCallbackGLFWinstallMotionCallbackGLFWinstallIdleCallbackGLFW charToSpecialdefaultBackendState animateBegin animateEnd callback_exitdumpFramebufferStatedumpFragmentState keyMouseEvent motionEvent isCommand isCommand2base GHC.MaybeNothing controlZoomIncontrolZoomOut motionBumpmotionTranslate motionRotate motionScalestateIterationstateResolution stateSimTimecallback_simulate_idle GHC.IORefIORefcallback_viewState_keyMousecallback_viewState_motioncallback_viewState_reshapeviewState_reshape createWindowsimulateWithBackendIOcallback_keyMousecallback_motioncallback_reshapeinteractWithBackendplayWithBackendIOdisplayWithBackendanimateWithBackendIO